├── .gitignore ├── LICENSE-MIT ├── Makefile ├── README.md ├── data ├── example_001.json ├── test_001.json ├── test_001.png ├── test_002.json ├── test_002.png ├── test_003.json ├── test_003.png ├── test_004.json ├── test_004.png ├── test_005.json ├── test_005.png ├── test_006.json ├── test_006.png ├── test_007.json ├── test_007.png ├── test_008.json ├── test_008.png ├── test_009.json ├── test_009.png ├── test_010.json ├── test_010.png ├── test_011.json ├── test_012.json ├── test_012.png ├── test_013.json ├── test_013.png ├── test_014.json ├── test_015.json ├── test_015.png ├── test_016.json ├── test_016.png ├── test_017.json ├── test_017.png ├── test_018.json ├── test_018.png ├── test_019.json ├── test_020.json ├── test_020.png ├── test_021.json ├── test_021.png ├── test_022.json ├── test_022.png ├── test_023.json ├── test_023.png ├── test_024.json ├── test_024.png ├── test_025.json ├── test_025.png ├── test_026.json ├── test_026.png ├── test_027.json ├── test_027.png ├── test_028.json ├── test_028.png ├── test_029.json ├── test_029.png ├── test_030.json ├── test_030.png ├── test_031.json ├── test_031.png ├── test_032.json ├── test_032.png ├── test_033.json ├── test_033.png ├── test_034.json ├── test_034.png ├── test_035.json ├── test_035.png ├── test_036.json ├── test_037.json ├── test_037.png ├── test_038.json ├── test_038.png ├── test_039.json ├── test_039.png ├── test_040.json ├── test_040.png ├── test_041.json ├── test_041.png └── test_19.png ├── git2graph ├── git2graph.go └── git2graph_test.go ├── go.mod ├── go.sum ├── img ├── img1.png ├── img2.png ├── img3.png ├── img4.png ├── img5.png └── logo.png ├── main.go └── tools ├── branch_colors_script └── branch_colors.sh ├── renderer ├── index-rows.html ├── index.html └── vendors │ ├── bootstrap │ ├── css │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ └── bootstrap.min.js │ ├── d3.min.js │ ├── jquery.min.js │ └── underscore.min.js ├── tools ├── index.html └── js │ ├── controllers │ ├── HomeController.js │ └── LoadModalController.js │ └── directives │ └── directives.js └── vendors ├── angular-local-storage.min.js ├── angular-sanitize.min.js ├── angular.min.js ├── bootstrap ├── css │ └── bootstrap.min.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 └── js │ └── bootstrap.min.js ├── clipboard.min.js ├── d3.min.js ├── font-awesome-4.4.0 ├── HELP-US-OUT.txt ├── css │ ├── font-awesome.css │ └── font-awesome.min.css ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── less │ ├── animated.less │ ├── bordered-pulled.less │ ├── core.less │ ├── fixed-width.less │ ├── font-awesome.less │ ├── icons.less │ ├── larger.less │ ├── list.less │ ├── mixins.less │ ├── path.less │ ├── rotated-flipped.less │ ├── stacked.less │ └── variables.less └── scss │ ├── _animated.scss │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _path.scss │ ├── _rotated-flipped.scss │ ├── _stacked.scss │ ├── _variables.scss │ └── font-awesome.scss ├── jquery.min.js ├── lodash.min.js ├── ui-bootstrap-tpls-1.2.4.min.js └── underscore.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.out 3 | tools/renderer/examples.js 4 | vendor 5 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright 2011,2012 Alain Gilbert 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to 5 | deal in the Software without restriction, including without limitation the 6 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | sell copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | EXAMPLES_FILE=tools/renderer/examples.js 2 | GITHUB_PAGES_FOLDER=tools/renderer 3 | GITHUB_PAGES_BRANCH=gh-pages 4 | 5 | deploy: 6 | @echo "// This file is autogenerated, do not modify it directly." > $(EXAMPLES_FILE); \ 7 | echo "var examples = {}" >> $(EXAMPLES_FILE); \ 8 | for f in data/*.json; do \ 9 | c=`go run main.go -f $$f`; \ 10 | echo "examples['$$f'] = '$$c';" >> $(EXAMPLES_FILE); \ 11 | done; \ 12 | echo "var examples_rows = {}" >> $(EXAMPLES_FILE); \ 13 | for f in data/*.json; do \ 14 | c=`go run main.go -f $$f --rows`; \ 15 | echo "examples_rows['$$f'] = '$$c';" >> $(EXAMPLES_FILE); \ 16 | done 17 | 18 | github: deploy 19 | ghp-import -b $(GITHUB_PAGES_BRANCH) -p $(GITHUB_PAGES_FOLDER) 20 | 21 | test: 22 | go test ./... 23 | 24 | cover: 25 | go test -coverprofile cover.out ./git2graph/ 26 | go tool cover -html=cover.out 27 | 28 | .PHONY: deploy github test 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo](img/logo.png) 2 | 3 | Open source implementation of the [sourcetree](https://www.sourcetreeapp.com/) graph algorithm. 4 | 5 | Given a list of commits and their parents, return a structure that tells you exactly how to draw the git graph. 6 | 7 | It takes a json: 8 | 9 | ```json 10 | [ 11 | {"id": "1", "parents": ["3"], "non_related_attr": "non_related_value"}, 12 | {"id": "2", "parents": ["3"]}, 13 | {"id": "3", "parents": []} 14 | ] 15 | ``` 16 | 17 | and returns a structure that represent a git graph: 18 | 19 | ```json 20 | [ 21 | {"id": "1", "parents": ["3"], "non_related_attr": "non_related_value", 22 | "g": [0,0,"#5aa1be",[["#5aa1be",[[0,0,0],[0,2,0]]]]]}, 23 | {"id": "2", "parents": ["3"], 24 | "g": [1,1,"#c065b8",[["#c065b8",[[1,1,0],[1,2,1],[0,2,0]]]]]}, 25 | {"id": "3", "parents": [], 26 | "g": [2,0,"#5aa1be",[]]} 27 | ] 28 | ``` 29 | 30 | This structure can be directly rendered with D3.js, [you can try it out here.](http://alaingilbert.github.io/git2graph/) 31 | 32 | ![Logo](img/img1.png) 33 | 34 | ### Other examples 35 | 36 | ![Logo](img/img2.png) 37 | ![Logo](img/img5.png) 38 | ![Logo](img/img3.png) 39 | ![Logo](img/img4.png) 40 | 41 | ## How to use 42 | 43 | ### Inline 44 | 45 | `git2graph -j '[{"id": 1, "parents": ["2"]}, ...]'` 46 | 47 | ### File 48 | 49 | `git2graph -f path/to/file.json` 50 | 51 | ### Repository 52 | 53 | `git2graph -r` (You must be in the repository directory) 54 | 55 | ### In code 56 | 57 | ```go 58 | package main 59 | 60 | import ( 61 | "fmt" 62 | "git2graph" 63 | ) 64 | 65 | func main() { 66 | in := []map[string]any{ 67 | {"id": "1", "parents": []string{"3"}}, 68 | {"id": "2", "parents": []string{"3"}}, 69 | {"id": "3", "parents": []string{}}, 70 | } 71 | 72 | // Use this to render a whole graph in a single SVG 73 | out, err := git2graph.Get(in) 74 | fmt.Println(out, err) 75 | 76 | // Use this if you want to render each rows individually (for html table) 77 | out, err = git2graph.GetRows(in) 78 | fmt.Println(out, err) 79 | } 80 | ``` 81 | 82 | ## See it in action 83 | 84 | ``` 85 | renderer/index.html 86 | ``` 87 | 88 | Use D3.js to render the graph represented by the output of Git2Graph. 89 | 90 | ## How to run 91 | 92 | ``` 93 | go run main.go -j '...' 94 | ``` 95 | 96 | Or 97 | 98 | ``` 99 | go install 100 | git2graph -j '...' 101 | ``` 102 | 103 | ## How to test 104 | ``` 105 | go test ./... 106 | ``` 107 | 108 | ## How to contribute 109 | 110 | - Fork the repo 111 | - Create a new branch 112 | - Make your changes 113 | - Create new tests 114 | - Append your name/email in main.go (contributors list) 115 | - Make a pull request :) 116 | -------------------------------------------------------------------------------- /data/test_001.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["2"]}, 3 | {"id": "2", "parents": ["3"]}, 4 | {"id": "3", "parents": []} 5 | ] 6 | -------------------------------------------------------------------------------- /data/test_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_001.png -------------------------------------------------------------------------------- /data/test_002.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3"]}, 3 | {"id": "2", "parents": ["3"]}, 4 | {"id": "3", "parents": []} 5 | ] 6 | -------------------------------------------------------------------------------- /data/test_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_002.png -------------------------------------------------------------------------------- /data/test_003.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["3"]}, 4 | {"id": "3", "parents": []} 5 | ] 6 | -------------------------------------------------------------------------------- /data/test_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_003.png -------------------------------------------------------------------------------- /data/test_004.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["5"]}, 4 | {"id": "3", "parents": ["5", "4"]}, 5 | {"id": "4", "parents": ["5"]}, 6 | {"id": "5", "parents": []} 7 | ] 8 | -------------------------------------------------------------------------------- /data/test_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_004.png -------------------------------------------------------------------------------- /data/test_005.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["4"]}, 3 | {"id": "2", "parents": ["4"]}, 4 | {"id": "3", "parents": ["4"]}, 5 | {"id": "4", "parents": ["6"]}, 6 | {"id": "5", "parents": ["6"]}, 7 | {"id": "6", "parents": []} 8 | ] 9 | -------------------------------------------------------------------------------- /data/test_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_005.png -------------------------------------------------------------------------------- /data/test_006.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["3", "4"]}, 4 | {"id": "3", "parents": ["5"]}, 5 | {"id": "4", "parents": ["5"]}, 6 | {"id": "5", "parents": []} 7 | ] 8 | -------------------------------------------------------------------------------- /data/test_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_006.png -------------------------------------------------------------------------------- /data/test_007.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["4", "5"]}, 4 | {"id": "3", "parents": ["5"]}, 5 | {"id": "4", "parents": ["6"]}, 6 | {"id": "5", "parents": ["6"]}, 7 | {"id": "6", "parents": []} 8 | ] 9 | -------------------------------------------------------------------------------- /data/test_007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_007.png -------------------------------------------------------------------------------- /data/test_008.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["4"]}, 4 | {"id": "3", "parents": ["4", "5"]}, 5 | {"id": "4", "parents": ["6"]}, 6 | {"id": "5", "parents": ["6"]}, 7 | {"id": "6", "parents": []} 8 | ] 9 | -------------------------------------------------------------------------------- /data/test_008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_008.png -------------------------------------------------------------------------------- /data/test_009.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3", "2"]}, 3 | {"id": "2", "parents": ["5"]}, 4 | {"id": "3", "parents": ["4", "7"]}, 5 | {"id": "4", "parents": ["5", "6"]}, 6 | {"id": "5", "parents": ["8"]}, 7 | {"id": "6", "parents": ["8"]}, 8 | {"id": "7", "parents": ["8"]}, 9 | {"id": "8", "parents": []} 10 | ] 11 | -------------------------------------------------------------------------------- /data/test_009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_009.png -------------------------------------------------------------------------------- /data/test_010.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["4", "2"]}, 3 | {"id": "2", "parents": ["5", "3"]}, 4 | {"id": "3", "parents": ["5"]}, 5 | {"id": "4", "parents": ["8", "6"]}, 6 | {"id": "5", "parents": ["7", "6"]}, 7 | {"id": "6", "parents": ["7"]}, 8 | {"id": "7", "parents": ["8"]}, 9 | {"id": "8", "parents": []} 10 | ] 11 | -------------------------------------------------------------------------------- /data/test_010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_010.png -------------------------------------------------------------------------------- /data/test_011.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3"]}, 3 | {"id": "2", "parents": ["3", "4"]}, 4 | {"id": "3", "parents": ["5"]}, 5 | {"id": "4", "parents": ["5", "6"]}, 6 | {"id": "5", "parents": ["6"]}, 7 | {"id": "6", "parents": []} 8 | ] 9 | -------------------------------------------------------------------------------- /data/test_012.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3"]}, 3 | {"id": "2", "parents": ["3", "6"]}, 4 | {"id": "3", "parents": ["5", "4"]}, 5 | {"id": "4", "parents": ["5"]}, 6 | {"id": "5", "parents": ["7"]}, 7 | {"id": "6", "parents": ["7"]}, 8 | {"id": "7", "parents": []} 9 | ] 10 | -------------------------------------------------------------------------------- /data/test_012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_012.png -------------------------------------------------------------------------------- /data/test_013.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["4", "2"]}, 3 | {"id": "2", "parents": ["3"]}, 4 | {"id": "3", "parents": ["5", "9"]}, 5 | {"id": "4", "parents": ["7", "5"]}, 6 | {"id": "5", "parents": ["6", "8"]}, 7 | {"id": "6", "parents": ["10"]}, 8 | {"id": "7", "parents": ["8"]}, 9 | {"id": "8", "parents": ["10"]}, 10 | {"id": "9", "parents": ["10"]}, 11 | {"id": "10", "parents": []} 12 | ] 13 | -------------------------------------------------------------------------------- /data/test_013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_013.png -------------------------------------------------------------------------------- /data/test_014.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3"]}, 3 | {"id": "2", "parents": ["5", "4"]}, 4 | {"id": "3", "parents": ["6", "4"]}, 5 | {"id": "4", "parents": ["5"]}, 6 | {"id": "5", "parents": ["8", "7"]}, 7 | {"id": "6", "parents": ["8", "7"]}, 8 | {"id": "7", "parents": ["8"]}, 9 | {"id": "8", "parents": []} 10 | ] 11 | -------------------------------------------------------------------------------- /data/test_015.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["3"]}, 3 | {"id": "2", "parents": ["6", "4"]}, 4 | {"id": "3", "parents": ["5", "4"]}, 5 | {"id": "4", "parents": ["6"]}, 6 | {"id": "5", "parents": ["8", "7"]}, 7 | {"id": "6", "parents": ["8", "7"]}, 8 | {"id": "7", "parents": ["8"]}, 9 | {"id": "8", "parents": []} 10 | ] 11 | -------------------------------------------------------------------------------- /data/test_015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_015.png -------------------------------------------------------------------------------- /data/test_016.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "1", "parents": ["5"]}, 3 | {"id": "2", "parents": ["6"]}, 4 | {"id": "3", "parents": ["5"]}, 5 | {"id": "4", "parents": ["6"]}, 6 | {"id": "5", "parents": ["7"]}, 7 | {"id": "6", "parents": ["7"]}, 8 | {"id": "7", "parents": []} 9 | ] 10 | -------------------------------------------------------------------------------- /data/test_016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_016.png -------------------------------------------------------------------------------- /data/test_017.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"id": "0", "parents": ["4"]}, 3 | {"id": "1", "parents": ["4"]}, 4 | {"id": "2", "parents": ["4"]}, 5 | {"id": "3", "parents": ["6"]}, 6 | {"id": "4", "parents": ["5"]}, 7 | {"id": "5", "parents": ["6"]}, 8 | {"id": "6", "parents": []} 9 | ] 10 | -------------------------------------------------------------------------------- /data/test_017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_017.png -------------------------------------------------------------------------------- /data/test_018.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "5" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "5" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "6" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [ 35 | "6" 36 | ] 37 | }, 38 | { 39 | "id": "6", 40 | "parents": [] 41 | } 42 | ] 43 | -------------------------------------------------------------------------------- /data/test_018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_018.png -------------------------------------------------------------------------------- /data/test_019.json: -------------------------------------------------------------------------------- 1 | [{"id":"0","parents":["5"]}, 2 | {"id":"1","parents":["4"]}, 3 | {"id":"2","parents":["9"]}, 4 | {"id":"3","parents":["7"]}, 5 | {"id":"4","parents":["11","6"]}, 6 | {"id":"5","parents":["8","6"]}, 7 | {"id":"6","parents":["11"]}, 8 | {"id":"7","parents":["8"]}, 9 | {"id":"8","parents":["10"]}, 10 | {"id":"9","parents":["10"]}, 11 | {"id":"10","parents":["12"]}, 12 | {"id":"11","parents":["12"]}, 13 | {"id":"12","parents":[]}] 14 | -------------------------------------------------------------------------------- /data/test_020.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "5" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "4" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "5" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [] 35 | } 36 | ] 37 | -------------------------------------------------------------------------------- /data/test_020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_020.png -------------------------------------------------------------------------------- /data/test_021.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "3" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "5" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "6", 24 | "5" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "5" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "7" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [ 42 | "7" 43 | ] 44 | }, 45 | { 46 | "id": "7", 47 | "parents": [] 48 | } 49 | ] 50 | -------------------------------------------------------------------------------- /data/test_021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_021.png -------------------------------------------------------------------------------- /data/test_022.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "5" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "6" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "7" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "7", 30 | "6" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [ 42 | "8" 43 | ] 44 | }, 45 | { 46 | "id": "7", 47 | "parents": [ 48 | "8" 49 | ] 50 | }, 51 | { 52 | "id": "8", 53 | "parents": [] 54 | } 55 | ] 56 | -------------------------------------------------------------------------------- /data/test_022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_022.png -------------------------------------------------------------------------------- /data/test_023.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "4" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "7" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "6", 30 | "5" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [ 42 | "8" 43 | ] 44 | }, 45 | { 46 | "id": "7", 47 | "parents": [ 48 | "8" 49 | ] 50 | }, 51 | { 52 | "id": "8", 53 | "parents": [] 54 | } 55 | ] 56 | -------------------------------------------------------------------------------- /data/test_023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_023.png -------------------------------------------------------------------------------- /data/test_024.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "3" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "5" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "9" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "7", 24 | "6" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "6" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [ 42 | "10", 43 | "8" 44 | ] 45 | }, 46 | { 47 | "id": "7", 48 | "parents": [ 49 | "11", 50 | "8" 51 | ] 52 | }, 53 | { 54 | "id": "8", 55 | "parents": [ 56 | "9" 57 | ] 58 | }, 59 | { 60 | "id": "9", 61 | "parents": [ 62 | "10" 63 | ] 64 | }, 65 | { 66 | "id": "10", 67 | "parents": [ 68 | "11" 69 | ] 70 | }, 71 | { 72 | "id": "11", 73 | "parents": [] 74 | } 75 | ] 76 | -------------------------------------------------------------------------------- /data/test_024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_024.png -------------------------------------------------------------------------------- /data/test_025.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "5" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "3" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "4" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "9", 24 | "7" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "6" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "8", 37 | "7" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "9", 44 | "7" 45 | ] 46 | }, 47 | { 48 | "id": "7", 49 | "parents": [ 50 | "8" 51 | ] 52 | }, 53 | { 54 | "id": "8", 55 | "parents": [ 56 | "12", 57 | "9" 58 | ] 59 | }, 60 | { 61 | "id": "9", 62 | "parents": [ 63 | "11", 64 | "10" 65 | ] 66 | }, 67 | { 68 | "id": "10", 69 | "parents": [ 70 | "11" 71 | ] 72 | }, 73 | { 74 | "id": "11", 75 | "parents": [ 76 | "12" 77 | ] 78 | }, 79 | { 80 | "id": "12", 81 | "parents": [] 82 | } 83 | ] 84 | -------------------------------------------------------------------------------- /data/test_025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_025.png -------------------------------------------------------------------------------- /data/test_026.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "3" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "5" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "8", 24 | "5" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "5" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "7", 37 | "6" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "7" 44 | ] 45 | }, 46 | { 47 | "id": "7", 48 | "parents": [ 49 | "8" 50 | ] 51 | }, 52 | { 53 | "id": "8", 54 | "parents": [] 55 | } 56 | ] 57 | -------------------------------------------------------------------------------- /data/test_026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_026.png -------------------------------------------------------------------------------- /data/test_027.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "5" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "7" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "11" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "15", 30 | "6" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "8", 37 | "6" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "15" 44 | ] 45 | }, 46 | { 47 | "id": "7", 48 | "parents": [ 49 | "12" 50 | ] 51 | }, 52 | { 53 | "id": "8", 54 | "parents": [ 55 | "9", 56 | "13" 57 | ] 58 | }, 59 | { 60 | "id": "9", 61 | "parents": [ 62 | "14", 63 | "10" 64 | ] 65 | }, 66 | { 67 | "id": "10", 68 | "parents": [ 69 | "14" 70 | ] 71 | }, 72 | { 73 | "id": "11", 74 | "parents": [ 75 | "14" 76 | ] 77 | }, 78 | { 79 | "id": "12", 80 | "parents": [ 81 | "14" 82 | ] 83 | }, 84 | { 85 | "id": "13", 86 | "parents": [ 87 | "14" 88 | ] 89 | }, 90 | { 91 | "id": "14", 92 | "parents": [ 93 | "16" 94 | ] 95 | }, 96 | { 97 | "id": "15", 98 | "parents": [ 99 | "17" 100 | ] 101 | }, 102 | { 103 | "id": "16", 104 | "parents": [ 105 | "17" 106 | ] 107 | }, 108 | { 109 | "id": "17", 110 | "parents": [] 111 | } 112 | ] 113 | -------------------------------------------------------------------------------- /data/test_027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_027.png -------------------------------------------------------------------------------- /data/test_028.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "2", 6 | "1" 7 | ] 8 | }, 9 | { 10 | "id": "1", 11 | "parents": [ 12 | "2" 13 | ] 14 | }, 15 | { 16 | "id": "2", 17 | "parents": [ 18 | "3" 19 | ] 20 | }, 21 | { 22 | "id": "3", 23 | "parents": [ 24 | "4" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "6", 31 | "5" 32 | ] 33 | }, 34 | { 35 | "id": "5", 36 | "parents": [ 37 | "6" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [] 43 | } 44 | ] 45 | -------------------------------------------------------------------------------- /data/test_028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_028.png -------------------------------------------------------------------------------- /data/test_029.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "7" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "15" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "17" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "8" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "18" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [ 35 | "12" 36 | ] 37 | }, 38 | { 39 | "id": "6", 40 | "parents": [ 41 | "20" 42 | ] 43 | }, 44 | { 45 | "id": "7", 46 | "parents": [ 47 | "9", 48 | "10" 49 | ] 50 | }, 51 | { 52 | "id": "8", 53 | "parents": [ 54 | "9", 55 | "11" 56 | ] 57 | }, 58 | { 59 | "id": "9", 60 | "parents": [ 61 | "13", 62 | "14" 63 | ] 64 | }, 65 | { 66 | "id": "10", 67 | "parents": [ 68 | "21" 69 | ] 70 | }, 71 | { 72 | "id": "11", 73 | "parents": [ 74 | "13" 75 | ] 76 | }, 77 | { 78 | "id": "12", 79 | "parents": [ 80 | "14" 81 | ] 82 | }, 83 | { 84 | "id": "13", 85 | "parents": [ 86 | "16", 87 | "15" 88 | ] 89 | }, 90 | { 91 | "id": "14", 92 | "parents": [ 93 | "19" 94 | ] 95 | }, 96 | { 97 | "id": "15", 98 | "parents": [ 99 | "26" 100 | ] 101 | }, 102 | { 103 | "id": "16", 104 | "parents": [ 105 | "27" 106 | ] 107 | }, 108 | { 109 | "id": "17", 110 | "parents": [ 111 | "25" 112 | ] 113 | }, 114 | { 115 | "id": "18", 116 | "parents": [ 117 | "24" 118 | ] 119 | }, 120 | { 121 | "id": "19", 122 | "parents": [ 123 | "23" 124 | ] 125 | }, 126 | { 127 | "id": "20", 128 | "parents": [ 129 | "22" 130 | ] 131 | }, 132 | { 133 | "id": "21", 134 | "parents": [ 135 | "22" 136 | ] 137 | }, 138 | { 139 | "id": "22", 140 | "parents": [ 141 | "23" 142 | ] 143 | }, 144 | { 145 | "id": "23", 146 | "parents": [ 147 | "24" 148 | ] 149 | }, 150 | { 151 | "id": "24", 152 | "parents": [ 153 | "25" 154 | ] 155 | }, 156 | { 157 | "id": "25", 158 | "parents": [ 159 | "26" 160 | ] 161 | }, 162 | { 163 | "id": "26", 164 | "parents": [ 165 | "27" 166 | ] 167 | }, 168 | { 169 | "id": "27", 170 | "parents": [] 171 | } 172 | ] 173 | -------------------------------------------------------------------------------- /data/test_029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_029.png -------------------------------------------------------------------------------- /data/test_030.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "15" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "14" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "22" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "5", 30 | "10" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6", 37 | "7" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "16", 44 | "8" 45 | ] 46 | }, 47 | { 48 | "id": "7", 49 | "parents": [ 50 | "9" 51 | ] 52 | }, 53 | { 54 | "id": "8", 55 | "parents": [ 56 | "11" 57 | ] 58 | }, 59 | { 60 | "id": "9", 61 | "parents": [ 62 | "16" 63 | ] 64 | }, 65 | { 66 | "id": "10", 67 | "parents": [ 68 | "18" 69 | ] 70 | }, 71 | { 72 | "id": "11", 73 | "parents": [ 74 | "12" 75 | ] 76 | }, 77 | { 78 | "id": "12", 79 | "parents": [ 80 | "13", 81 | "16" 82 | ] 83 | }, 84 | { 85 | "id": "13", 86 | "parents": [ 87 | "21" 88 | ] 89 | }, 90 | { 91 | "id": "14", 92 | "parents": [ 93 | "18" 94 | ] 95 | }, 96 | { 97 | "id": "15", 98 | "parents": [ 99 | "23" 100 | ] 101 | }, 102 | { 103 | "id": "16", 104 | "parents": [ 105 | "18", 106 | "17" 107 | ] 108 | }, 109 | { 110 | "id": "17", 111 | "parents": [ 112 | "18" 113 | ] 114 | }, 115 | { 116 | "id": "18", 117 | "parents": [ 118 | "20", 119 | "19" 120 | ] 121 | }, 122 | { 123 | "id": "19", 124 | "parents": [ 125 | "20" 126 | ] 127 | }, 128 | { 129 | "id": "20", 130 | "parents": [ 131 | "24" 132 | ] 133 | }, 134 | { 135 | "id": "21", 136 | "parents": [ 137 | "22" 138 | ] 139 | }, 140 | { 141 | "id": "22", 142 | "parents": [ 143 | "23" 144 | ] 145 | }, 146 | { 147 | "id": "23", 148 | "parents": [ 149 | "24" 150 | ] 151 | }, 152 | { 153 | "id": "24", 154 | "parents": [] 155 | } 156 | ] 157 | -------------------------------------------------------------------------------- /data/test_030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_030.png -------------------------------------------------------------------------------- /data/test_031.json: -------------------------------------------------------------------------------- 1 | [{"id":"0","parents":["3"]}, 2 | {"id":"1","parents":["4"]}, 3 | {"id":"2","parents":["5","4"]}, 4 | {"id":"3","parents":["4"]}, 5 | {"id":"4","parents":["6"]}, 6 | {"id":"5","parents":["6"]}, 7 | {"id":"6","parents":[]}] 8 | -------------------------------------------------------------------------------- /data/test_031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_031.png -------------------------------------------------------------------------------- /data/test_032.json: -------------------------------------------------------------------------------- 1 | [{"id":"0","parents":["2"]}, 2 | {"id":"1","parents":["5","3"]}, 3 | {"id":"2","parents":["3","4"]}, 4 | {"id":"3","parents":["6"]}, 5 | {"id":"4","parents":["5"]}, 6 | {"id":"5","parents":["6"]}, 7 | {"id":"6","parents":[]}] 8 | -------------------------------------------------------------------------------- /data/test_032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_032.png -------------------------------------------------------------------------------- /data/test_033.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "3" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "5" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "7" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "9", 24 | "4" 25 | ] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "9" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "8", 37 | "6" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "10" 44 | ] 45 | }, 46 | { 47 | "id": "7", 48 | "parents": [ 49 | "10" 50 | ] 51 | }, 52 | { 53 | "id": "8", 54 | "parents": [ 55 | "10" 56 | ] 57 | }, 58 | { 59 | "id": "9", 60 | "parents": [ 61 | "11" 62 | ] 63 | }, 64 | { 65 | "id": "10", 66 | "parents": [ 67 | "11" 68 | ] 69 | }, 70 | { 71 | "id": "11", 72 | "parents": [] 73 | } 74 | ] 75 | -------------------------------------------------------------------------------- /data/test_033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_033.png -------------------------------------------------------------------------------- /data/test_034.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "5" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4", 12 | "2" 13 | ] 14 | }, 15 | { 16 | "id": "2", 17 | "parents": [ 18 | "3" 19 | ] 20 | }, 21 | { 22 | "id": "3", 23 | "parents": [ 24 | "4", 25 | "5" 26 | ] 27 | }, 28 | { 29 | "id": "4", 30 | "parents": [ 31 | "6" 32 | ] 33 | }, 34 | { 35 | "id": "5", 36 | "parents": [ 37 | "7" 38 | ] 39 | }, 40 | { 41 | "id": "6", 42 | "parents": [ 43 | "7" 44 | ] 45 | }, 46 | { 47 | "id": "7", 48 | "parents": [] 49 | } 50 | ] 51 | -------------------------------------------------------------------------------- /data/test_034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_034.png -------------------------------------------------------------------------------- /data/test_035.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4", 6 | "1" 7 | ] 8 | }, 9 | { 10 | "id": "1", 11 | "parents": [ 12 | "2", 13 | "3" 14 | ] 15 | }, 16 | { 17 | "id": "2", 18 | "parents": [] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "4" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [] 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /data/test_035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_035.png -------------------------------------------------------------------------------- /data/test_036.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "4", 6 | "1" 7 | ] 8 | }, 9 | { 10 | "id": "1", 11 | "parents": [ 12 | "4", 13 | "2" 14 | ] 15 | }, 16 | { 17 | "id": "2", 18 | "parents": [ 19 | "3", 20 | "5" 21 | ] 22 | }, 23 | { 24 | "id": "3", 25 | "parents": [] 26 | }, 27 | { 28 | "id": "4", 29 | "parents": [ 30 | "6" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [] 42 | } 43 | ] 44 | -------------------------------------------------------------------------------- /data/test_037.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "5" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "6" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "5" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "4" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "7", 30 | "8" 31 | ] 32 | }, 33 | { 34 | "id": "5", 35 | "parents": [ 36 | "6" 37 | ] 38 | }, 39 | { 40 | "id": "6", 41 | "parents": [ 42 | "7" 43 | ] 44 | }, 45 | { 46 | "id": "7", 47 | "parents": [ 48 | "8" 49 | ] 50 | }, 51 | { 52 | "id": "8", 53 | "parents": [] 54 | } 55 | ] -------------------------------------------------------------------------------- /data/test_037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_037.png -------------------------------------------------------------------------------- /data/test_038.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "5" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "2" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "6" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "6" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "7" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [ 35 | ] 36 | }, 37 | { 38 | "id": "6", 39 | "parents": [ 40 | "7" 41 | ] 42 | }, 43 | { 44 | "id": "7", 45 | "parents": [ 46 | ] 47 | } 48 | ] -------------------------------------------------------------------------------- /data/test_038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_038.png -------------------------------------------------------------------------------- /data/test_039.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "6" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "5" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "6" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "7" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "8" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [ 35 | ] 36 | }, 37 | { 38 | "id": "6", 39 | "parents": [ 40 | "7" 41 | ] 42 | }, 43 | { 44 | "id": "7", 45 | "parents": [ 46 | "8" 47 | ] 48 | }, 49 | { 50 | "id": "8", 51 | "parents": [ 52 | ] 53 | } 54 | ] -------------------------------------------------------------------------------- /data/test_039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_039.png -------------------------------------------------------------------------------- /data/test_040.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "7" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "5" 12 | ] 13 | }, 14 | { 15 | "id": "2", 16 | "parents": [ 17 | "6" 18 | ] 19 | }, 20 | { 21 | "id": "3", 22 | "parents": [ 23 | "8" 24 | ] 25 | }, 26 | { 27 | "id": "4", 28 | "parents": [ 29 | "9" 30 | ] 31 | }, 32 | { 33 | "id": "5", 34 | "parents": [ 35 | ] 36 | }, 37 | { 38 | "id": "6", 39 | "parents": [ 40 | "7" 41 | ] 42 | }, 43 | { 44 | "id": "7", 45 | "parents": [ 46 | "8" 47 | ] 48 | }, 49 | { 50 | "id": "8", 51 | "parents": [ 52 | "9" 53 | ] 54 | }, 55 | { 56 | "id": "9", 57 | "parents": [ 58 | ] 59 | } 60 | ] -------------------------------------------------------------------------------- /data/test_040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_040.png -------------------------------------------------------------------------------- /data/test_041.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "0", 4 | "parents": [ 5 | "2" 6 | ] 7 | }, 8 | { 9 | "id": "1", 10 | "parents": [ 11 | "4", 12 | "3" 13 | ] 14 | }, 15 | { 16 | "id": "2", 17 | "parents": [ 18 | "3", 19 | "1" 20 | ] 21 | }, 22 | { 23 | "id": "3", 24 | "parents": [ 25 | "4" 26 | ] 27 | }, 28 | { 29 | "id": "4", 30 | "parents": [ 31 | "5" 32 | ] 33 | }, 34 | { 35 | "id": "5", 36 | "parents": [ 37 | ] 38 | } 39 | ] -------------------------------------------------------------------------------- /data/test_041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_041.png -------------------------------------------------------------------------------- /data/test_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/data/test_19.png -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/alaingilbert/git2graph 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/sirupsen/logrus v1.9.3 7 | github.com/urfave/cli v1.22.14 8 | ) 9 | 10 | require ( 11 | github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect 12 | github.com/russross/blackfriday/v2 v2.1.0 // indirect 13 | golang.org/x/sys v0.18.0 // indirect 14 | ) 15 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= 2 | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 3 | github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= 4 | github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 9 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 10 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 11 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 12 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 13 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 14 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 15 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 16 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 17 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 18 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 19 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 20 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 21 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 22 | github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= 23 | github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= 24 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 25 | golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= 26 | golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 27 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 28 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 29 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 30 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 31 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 32 | -------------------------------------------------------------------------------- /img/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/img1.png -------------------------------------------------------------------------------- /img/img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/img2.png -------------------------------------------------------------------------------- /img/img3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/img3.png -------------------------------------------------------------------------------- /img/img4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/img4.png -------------------------------------------------------------------------------- /img/img5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/img5.png -------------------------------------------------------------------------------- /img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/img/logo.png -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/alaingilbert/git2graph/git2graph" 5 | "os" 6 | 7 | log "github.com/sirupsen/logrus" 8 | "github.com/urfave/cli" 9 | ) 10 | 11 | func startAction(c *cli.Context) error { 12 | var nodes []*git2graph.Node 13 | var err error 14 | fromFlag := c.String("from") 15 | limitFlag := c.Int("limit") 16 | //contextFlag := c.Bool("context") 17 | jsonFlag := c.String("json") 18 | fileFlag := c.String("file") 19 | repoFlag := c.Bool("repo") 20 | topoOrderFlag := c.Bool("topo-order") 21 | dateOrderFlag := c.Bool("date-order") 22 | git2graph.NoOutput = c.Bool("no-output") 23 | repoLinearFlag := c.Bool("repo-linear") 24 | seqIds := c.Bool("seq-ids") 25 | rowsFlag := c.Bool("rows") 26 | logLevel := c.String("log") 27 | setLogLevel(logLevel) 28 | 29 | if repoFlag || repoLinearFlag { 30 | order := git2graph.DefaultOrder 31 | if topoOrderFlag { 32 | order = git2graph.TopoOrder 33 | } else if dateOrderFlag { 34 | order = git2graph.DateOrder 35 | } 36 | if seqIds { 37 | nodes, err = git2graph.GetInputNodesFromRepoSeq("", order, limitFlag) 38 | } else { 39 | nodes, err = git2graph.GetInputNodesFromRepo("", order, limitFlag) 40 | } 41 | if repoLinearFlag { 42 | git2graph.SerializeOutput(&git2graph.Out{Nodes: nodes}) 43 | return err 44 | } 45 | } else if jsonFlag != "" { 46 | nodes, err = git2graph.GetInputNodesFromJSON([]byte(jsonFlag)) 47 | } else if fileFlag != "" { 48 | nodes, err = git2graph.GetInputNodesFromFile(fileFlag) 49 | } else { 50 | return cli.ShowAppHelp(c) 51 | } 52 | if err != nil { 53 | log.Error(err) 54 | return err 55 | } 56 | 57 | var out *git2graph.Out 58 | if rowsFlag { 59 | out, err = git2graph.GetPaginatedRows(nodes, fromFlag, limitFlag) 60 | } else { 61 | out, err = git2graph.GetPaginated(nodes, fromFlag, limitFlag) 62 | } 63 | if err != nil { 64 | log.Error(err) 65 | return err 66 | } 67 | 68 | git2graph.SerializeOutput(out) 69 | 70 | return err 71 | } 72 | 73 | func setLogLevel(logLevel string) { 74 | switch logLevel { 75 | case "debug": 76 | log.SetLevel(log.DebugLevel) 77 | case "info": 78 | log.SetLevel(log.InfoLevel) 79 | case "warn": 80 | log.SetLevel(log.WarnLevel) 81 | case "error": 82 | log.SetLevel(log.ErrorLevel) 83 | case "fatal": 84 | log.SetLevel(log.FatalLevel) 85 | case "panic": 86 | log.SetLevel(log.PanicLevel) 87 | default: 88 | log.SetLevel(log.WarnLevel) 89 | } 90 | } 91 | 92 | func init() { 93 | log.SetLevel(log.WarnLevel) 94 | } 95 | 96 | func main() { 97 | var authors []cli.Author 98 | // Collaborators, add your name here :) 99 | authors = append(authors, cli.Author{Name: "Alain Gilbert", Email: "alain.gilbert.15@gmail.com"}) 100 | 101 | app := cli.NewApp() 102 | app.Authors = authors 103 | app.Version = "0.0.0" 104 | app.Name = "git2graph" 105 | app.Usage = "Take a git tree, make a graph structure" 106 | app.Flags = []cli.Flag{ 107 | cli.StringFlag{Name: "f, file", Usage: "File"}, 108 | cli.StringFlag{Name: "j, json", Usage: "Json input"}, 109 | cli.StringFlag{Name: "L, log", Usage: "Log level"}, 110 | cli.BoolFlag{Name: "r, repo", Usage: "Repository"}, 111 | cli.BoolFlag{Name: "topo-order", Usage: "Topological order"}, 112 | cli.BoolFlag{Name: "l, repo-linear", Usage: "Repository linear history"}, 113 | cli.BoolFlag{Name: "s, seq-ids", Usage: "Use sequential ids instead of sha for linear history"}, 114 | cli.BoolFlag{Name: "n, no-output", Usage: "No output"}, 115 | cli.BoolFlag{Name: "rows", Usage: "Rows graph"}, 116 | cli.StringFlag{Name: "from", Usage: "From"}, 117 | cli.IntFlag{Name: "limit", Usage: "Limit", Value: -1}, 118 | cli.BoolFlag{Name: "context", Usage: "Include context"}, 119 | } 120 | app.Action = startAction 121 | if err := app.Run(os.Args); err != nil { 122 | log.Fatal(err) 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /tools/branch_colors_script/branch_colors.sh: -------------------------------------------------------------------------------- 1 | # Script to generate a bunch of branches to see what colors are used by other git gui tools 2 | 3 | rm -fr .git 4 | git init 5 | 6 | for i in $(seq 80 0); 7 | do 8 | git checkout -b "_$i" 9 | git commit --allow-empty -m "$i" 10 | done 11 | 12 | for i in $(seq 0 80); 13 | do 14 | git checkout "_$i" 15 | git commit --allow-empty -m "$i" 16 | done 17 | -------------------------------------------------------------------------------- /tools/renderer/index-rows.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git2Graph Renderer Rows 5 | 6 | 7 | 8 | 9 | 10 | 11 | 20 | 21 | 22 |
23 |

Tree renderer rows

24 | 25 |
26 | 30 |
31 | 32 |
33 | 34 | 37 |
38 |
39 | 40 |
41 |
42 | 43 |
44 |
45 | 46 |
47 |
48 |
49 | 162 | 163 | 164 | -------------------------------------------------------------------------------- /tools/renderer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git2Graph Renderer 5 | 6 | 7 | 8 | 9 | 10 | 11 | 20 | 21 | 22 |
23 |

Tree renderer

24 |
25 | 29 |
30 |
31 | 32 | 35 |
36 |
37 | 38 |
39 |
40 | 41 |
42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/renderer/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /tools/renderer/vendors/underscore.min.js: -------------------------------------------------------------------------------- 1 | // Underscore.js 1.8.3 2 | // http://underscorejs.org 3 | // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 | // Underscore may be freely distributed under the MIT license. 5 | (function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); 6 | //# sourceMappingURL=underscore-min.map 7 | -------------------------------------------------------------------------------- /tools/tools/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 34 | 35 | 36 |
37 |

38 | 39 |
40 |
41 | 42 |
43 |
44 | 45 |
46 | 47 |
48 | 49 |
50 | 51 | 52 |
53 | 54 |
55 | 56 |
57 |
58 |

Node infos:

59 |
60 | 61 |
62 | 63 | 64 | 65 | 66 |
67 |

Path to {{key}}:

68 |
69 | 70 |
71 | 72 | 73 | 74 |
75 | 76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 |
86 | 87 |
88 |
89 | 90 | 91 | 92 |
93 |
94 |
95 |
96 |
97 | 98 |
99 | 100 |
101 |
102 |
103 | 104 | 105 | 106 |
107 |
108 |
109 |
110 | 111 | 112 | 113 |
114 |
115 |
116 |
117 | 118 | 119 | 120 |
121 |
122 |
123 |
124 | 125 | 126 | 127 |
128 |
129 | 130 |
131 | 132 |
133 | 134 |
135 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /tools/tools/js/controllers/HomeController.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('app', ['ngSanitize', 'ui.bootstrap', 'LocalStorageModule',]); 2 | 3 | app.controller('HomeController', 4 | function($scope, $uibModal, localStorageService) 5 | { 6 | 7 | var recreateIds = function() { 8 | _.map($scope.tree, function(node, idx) { 9 | node.id = idx.toString(); 10 | }); 11 | }; 12 | 13 | var removeFromChildrenParents = function(parentId) { 14 | _.each($scope.tree, function(node) { 15 | delete node.parentsPaths[parentId]; 16 | }); 17 | var nbNodes = $scope.tree.length; 18 | _.each($scope.tree, function(node) { 19 | _.each(node.parentsPaths, function(path, key) { 20 | if (key > parentId) { 21 | node.parentsPaths[key-1] = path; 22 | } 23 | }); 24 | delete node.parentsPaths[nbNodes-1]; 25 | }); 26 | }; 27 | 28 | $scope.btnDeleteNodeClicked = function() { 29 | var idToRemove = $scope.selectedNode.id; 30 | $scope.tree.splice(idToRemove, 1); 31 | recreateIds(); 32 | removeFromChildrenParents(idToRemove); 33 | _.each($scope.tree, function(node) { 34 | _.each(node.parents, function(nodeParent, idx) { 35 | if (nodeParent == idToRemove) { 36 | node.parents.splice(idx, 1); 37 | } else if (nodeParent > idToRemove) { 38 | node.parents[idx]--; 39 | } 40 | }); 41 | _.each(node.parentsPaths, function(path, parentId) { 42 | _.each(path.path, function(point, idx) { 43 | if (point[1] > idToRemove) { 44 | node.parentsPaths[parentId].path[idx][1]--; 45 | } 46 | }); 47 | }); 48 | }); 49 | $scope.selectedNode = null; 50 | }; 51 | 52 | $scope.btnDeletePathClicked = function(key) { 53 | delete $scope.selectedNode.parentsPaths[key]; 54 | }; 55 | 56 | $scope.btnMoveDownClicked = function(path, $index) { 57 | var point = path.splice($index, 1)[0]; 58 | path.splice($index + 1, 0, point); 59 | }; 60 | 61 | 62 | $scope.btnMoveUpClicked = function(path, $index) { 63 | var point = path.splice($index, 1)[0]; 64 | path.splice($index - 1, 0, point); 65 | }; 66 | 67 | 68 | $scope.btnRemovePointClicked = function(path, $index) { 69 | path.splice($index, 1); 70 | }; 71 | 72 | 73 | $scope.btnAddPointClicked = function(path) { 74 | var point = [0, 0, 0]; 75 | path.push(point); 76 | }; 77 | 78 | 79 | $scope.btnSaveClicked = function() { 80 | var modalInstance = $uibModal.open({ 81 | animation: true, 82 | template: 83 | '', 96 | controller: function($scope, tree, $uibModalInstance, projectName) { 97 | $scope.input = {}; 98 | $scope.input.name = projectName; 99 | $scope.btnSaveClicked = function() { 100 | if (_.isEmpty($scope.input.name)) { 101 | return; 102 | } 103 | var names = localStorageService.get('names') || {}; 104 | names[$scope.input.name] = tree; 105 | localStorageService.set('names', names); 106 | $uibModalInstance.close(); 107 | }; 108 | $scope.cancel = function() { 109 | $uibModalInstance.dismiss('cancel'); 110 | }; 111 | }, 112 | size: 'sm', 113 | resolve: { 114 | projectName: function() { return $scope.input.projectName; }, 115 | tree: function() { return $scope.tree; } 116 | }, 117 | }); 118 | }; 119 | 120 | $scope.btnLoadClicked = function() { 121 | var modalInstance = $uibModal.open({ 122 | animation: true, 123 | template: 124 | '', 137 | controller: 'LoadModalController', 138 | size: 'sm', 139 | }).result.then(function(res) { 140 | if (res) { 141 | $scope.input.projectName = res.projectName; 142 | $scope.tree = res.data; 143 | } 144 | }); 145 | }; 146 | 147 | 148 | $scope.toJson = function(tree) { 149 | return angular.toJson(tree, true); 150 | }; 151 | 152 | 153 | $scope.formatColor = function(color) { 154 | return 'color' + (_.indexOf($scope.colors, color) + 1) + ' - ' + color; 155 | }; 156 | 157 | 158 | (function constructor() { 159 | $scope.selectedNode = null; 160 | $scope.inputFile = ''; 161 | $scope.testFile = ''; 162 | $scope.shellFile = ''; 163 | $scope.tree = []; 164 | $scope.input = {}; 165 | 166 | $scope.colors = [ 167 | '#5aa1be', 168 | '#c065b8', 169 | '#c0ab5f', 170 | '#59bc95', 171 | '#7a63be', 172 | '#c0615b', 173 | '#73bb5e', 174 | '#6ee585', 175 | '#7088e8', 176 | '#eb77a3', 177 | '#c2e675', 178 | ]; 179 | 180 | })(); 181 | 182 | } 183 | ); 184 | -------------------------------------------------------------------------------- /tools/tools/js/controllers/LoadModalController.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('app'); 2 | 3 | app.controller('LoadModalController', 4 | function($scope, $uibModalInstance, localStorageService) 5 | { 6 | 7 | $scope.cancel = function() { 8 | $uibModalInstance.dismiss('cancel'); 9 | }; 10 | 11 | 12 | $scope.btnLoadClicked = function() { 13 | var result = {}; 14 | result.projectName = $scope.input.name; 15 | result.data = $scope.projects[$scope.input.name]; 16 | $uibModalInstance.close(result); 17 | }; 18 | 19 | 20 | (function constructor() { 21 | $scope.projects = localStorageService.get('names') || {}; 22 | $scope.names = _.chain($scope.projects).keys().sortBy().value(); 23 | $scope.input = {}; 24 | $scope.input.name = $scope.names[0]; 25 | })(); 26 | 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /tools/tools/js/directives/directives.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('app'); 2 | 3 | app.directive('project', function() { 4 | return { 5 | restrict: 'E', 6 | //scope: true, 7 | scope: { 8 | createDependency: '=', 9 | inputFile: '=', 10 | testFile: '=', 11 | shellFile: '=', 12 | tree: '=', 13 | selectedNode: '=', 14 | colors: '=', 15 | dependency: '=', 16 | show: '=' 17 | }, 18 | template: '
' + 19 | ' ' + 20 | ' ' + 21 | ' ' + 22 | '
', 23 | link: function(scope, element, attrs) { 24 | var $scope = scope; 25 | 26 | var firstCommit = null; 27 | var selectedPath = null; 28 | $scope.selectedNode = null; 29 | 30 | var lineFunction = d3.svg.line() 31 | .x(function(d) { return d.x; }) 32 | .y(function(d) { return d.y; }) 33 | .interpolate("linear"); 34 | 35 | $scope.btnRedrawClicked = function() { 36 | $scope.drawTree(); 37 | }; 38 | 39 | $scope.btnAddRowClicked = function() { 40 | $scope.tree.push({id: $scope.tree.length.toString(), parents: [], column: 0, parentsPaths: {}, color: '#5aa1be'}); 41 | $scope.drawTree(); 42 | }; 43 | 44 | $scope.drawTree = function() { 45 | if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') { 46 | $scope.$apply(); 47 | } 48 | var xGap = 30; 49 | var yGap = 30; 50 | var cols = 10; 51 | var radius = 8; 52 | 53 | var svg = d3.select(element.find('svg')[0]) 54 | .style('border', '1px solid gray') 55 | .attr('width', '100%') 56 | .style('height', ($scope.tree.length + 1) * yGap + radius); 57 | svg.selectAll('*').remove(); 58 | 59 | var linesGroup = svg.append('g'); 60 | var lineGroup = linesGroup.selectAll('lines') 61 | .data($scope.tree) 62 | .enter() 63 | .append('g'); 64 | 65 | lineGroup 66 | .append('path') 67 | .attr('d', function(path, idx) { 68 | var d = []; 69 | d.push({x: xGap, y: idx * yGap + yGap}); 70 | d.push({x: $(svg[0][0]).width(), y: idx * yGap + yGap}); 71 | return lineFunction(d) 72 | }) 73 | .attr('stroke-width', 1) 74 | .attr('fill', 'none') 75 | .attr('stroke', '#aaa'); 76 | 77 | lineGroup 78 | .append('text') 79 | .attr('x', 3) 80 | .attr('y', function(path, idx) { 81 | return yGap * idx + yGap; 82 | }) 83 | .attr('alignment-baseline', 'middle') 84 | .attr('text-anchor', 'left') 85 | .text(function(path, idx) { return $scope.tree[idx].id; }) 86 | .on('click', function(a, row, c) { 87 | _.each($scope.tree, function(node, idx) { 88 | if (idx > row) { 89 | $scope.tree[idx].id = (parseInt($scope.tree[idx].id) - 1).toString(); 90 | _.each(node.parentsPaths, function(pp, k) { 91 | _.each(pp.path, function(pt, idx3) { 92 | $scope.tree[idx].parentsPaths[k].path[idx3][1] -= 1; 93 | }); 94 | }); 95 | } 96 | }); 97 | $scope.tree.splice(row, 1); 98 | $scope.drawTree(); 99 | }); 100 | 101 | lineGroup.selectAll('dummyCircle') 102 | .data(function(d, i) { return _.range(cols); }) 103 | .enter() 104 | .append('circle') 105 | .attr('r', 5) 106 | .attr('stroke', '#ddd') 107 | .attr('fill', '#ddd') 108 | .attr('cx', function(c) { return c * xGap + xGap; }) 109 | .attr('cy', function(c, i, a) { return a * yGap + yGap }) 110 | .on('mouseenter', function() { d3.select(this).attr('fill', '#aaa'); }) 111 | .on('mouseleave', function() { d3.select(this).attr('fill', '#ddd'); }) 112 | .on('mousedown', function() {}) 113 | .on('mouseup', function(item, columnIndex, rowIndex) { 114 | if (selectedPath) { 115 | addPathNode(selectedPath[1], columnIndex, rowIndex); 116 | selectedPath = null; 117 | $scope.drawTree(); 118 | } 119 | }) 120 | .on('click', function(a,b,c) { 121 | $scope.tree[c].column = a; 122 | $scope.drawTree(); 123 | }); 124 | 125 | var addPathNode = function(path, x, y) { 126 | if (y == path.path[0][1] && x > path.path[0][0]) { 127 | path.path.splice(1, 0, [x, y, 2]); 128 | return; 129 | } 130 | for (var i = 0; i < path.path.length; i++) { 131 | var pathItem = path.path[i]; 132 | if (y > pathItem[1]) { 133 | continue; 134 | } 135 | if (y == pathItem[1] && x < pathItem[0]) { 136 | path.path.splice(i+1, 0, [x, y, 0]); 137 | } else { 138 | path.path.splice(i, 0, [x, y, 1]); 139 | } 140 | break; 141 | } 142 | }; 143 | 144 | var nodesGroup = svg.append('g').attr('class', 'nodes'); 145 | var nodeGroup = nodesGroup.selectAll('nodes') 146 | .data($scope.tree) 147 | .enter() 148 | .append('g') 149 | .attr('class', 'node'); 150 | 151 | // Each paths 152 | var pathsGroup = nodeGroup 153 | .append('g') 154 | .attr('class', 'paths'); 155 | pathsGroup 156 | .selectAll('g') 157 | .data(function(node) { 158 | return _.map(node.parentsPaths, function(pathItem, parentId) { return [node, pathItem, parentId]; }); 159 | }) 160 | .enter() 161 | .append('path') 162 | .attr('d', function(item) { 163 | var node = item[0]; 164 | var path = item[1]; 165 | var parentId = item[2]; 166 | var p = $scope.tree[parentId]; 167 | var result = []; 168 | _.each(path.path, function(item) { 169 | var point = { 170 | x: item[0] * xGap + xGap, 171 | y: item[1] * yGap + yGap 172 | }; 173 | if (item[2] == 3) { 174 | point.y += 6; 175 | } 176 | if (item[2] == 2) { 177 | point.y += 6; 178 | } 179 | if (item[2] == 1) { 180 | point.y -= 6; 181 | } 182 | result.push(point); 183 | }); 184 | return lineFunction(result) 185 | }) 186 | .attr('stroke-width', 3) 187 | .attr('fill', 'none') 188 | .on('mouseenter', function() { 189 | d3.select(this).attr('opacity', 0.4); 190 | }) 191 | .on('mouseleave', function(node) { 192 | d3.select(this).attr('opacity', 1); 193 | }) 194 | .attr('stroke', function(item) { 195 | return item[1].color; 196 | }) 197 | .on('mousedown', function(item) { 198 | selectedPath = item; 199 | }) 200 | .on('click', function(item) { 201 | var node = item[0]; 202 | var idx = _.indexOf(node.parents, item[1]); 203 | $scope.tree[node.id].parents.splice(idx, 1); 204 | $scope.drawTree(); 205 | }); 206 | 207 | var addPath = function(rowIndex) { 208 | var firstNode = $scope.tree[firstCommit]; 209 | var lastNode = $scope.tree[rowIndex]; 210 | $scope.tree[firstCommit].parents.push(rowIndex.toString()); 211 | $scope.tree[firstCommit].parents = _.sortBy($scope.tree[firstCommit].parents); 212 | $scope.tree[firstCommit].parentsPaths[rowIndex.toString()] = { 213 | path: [ 214 | [firstNode.column, parseInt(firstNode.id), 0], 215 | [lastNode.column, parseInt(lastNode.id), 0]], 216 | color: firstNode.color}; 217 | firstCommit = null; 218 | $scope.drawTree(); 219 | }; 220 | 221 | // Each nodes 222 | nodeGroup.append('circle') 223 | .attr('r', radius) 224 | .attr('fill', function(node) { return node.color; }) 225 | .attr('opacity', function(node) { 226 | if ($scope.selectedNode && $scope.selectedNode.id == node.id) { 227 | return 0.4; 228 | } else { 229 | return 1; 230 | } 231 | }) 232 | .attr('stroke', '#000') 233 | .attr('cx', function(node) { 234 | return node.column * xGap + xGap; 235 | }) 236 | .attr('cy', function(node, idx) { return idx * yGap + yGap }) 237 | .on('mouseenter', function() { 238 | d3.select(this).attr('opacity', 0.4); 239 | }) 240 | .on('mouseleave', function(node) { 241 | if ($scope.selectedNode && $scope.selectedNode.id == node.id) { 242 | d3.select(this).attr('opacity', 0.4); 243 | } else { 244 | d3.select(this).attr('opacity', 1); 245 | } 246 | }) 247 | .on('mousedown', function(node, rowIndex) { 248 | firstCommit = rowIndex; 249 | }) 250 | .on('mouseup', function(node, rowIndex) { 251 | if (firstCommit == rowIndex) { 252 | return; 253 | } 254 | if (firstCommit > rowIndex) { 255 | firstCommit = [rowIndex, rowIndex = firstCommit][0]; // swap vars 256 | } 257 | if (!_.includes($scope.tree[firstCommit].parents, rowIndex)) { 258 | addPath(rowIndex); 259 | } 260 | }) 261 | .on('click', function(node) { 262 | if ($scope.selectedNode && $scope.selectedNode.id == node.id) { 263 | $scope.selectedNode = null; 264 | } else { 265 | $scope.selectedNode = node; 266 | } 267 | $scope.drawTree(); 268 | }); 269 | 270 | generateInputFile(); 271 | generateTestsFile(); 272 | generateShellScript(); 273 | }; 274 | 275 | 276 | var generateInputFile = function() { 277 | var output = _.map($scope.tree, function(el) { return _.pick(el, ['id', 'parents']); }); 278 | $scope.inputFile = JSON.stringify(output, null, 2); 279 | }; 280 | 281 | 282 | var generateTestsFile = function() { 283 | var testName = 'Test1'; 284 | var out = ''; 285 | out += 'func ' + testName + '(t *testing.T) {\n'; 286 | 287 | out += ' // Initial input\n'; 288 | out += ' inputNodes := []*Node{\n'; 289 | _.each($scope.tree, function(node) { 290 | var p = _.map(node.parents, function(el) { return '"' + el + '"'; }).join(', '); 291 | out += ' {"id": "' + node.id + '", "parents": []string{' + p + '}},\n'; 292 | }); 293 | out += ' }\n'; 294 | 295 | out += '\n out, _ := buildTreeTest(inputNodes, customColors, "", -1)\n\n'; 296 | 297 | out += ' // Expected output\n'; 298 | var expectedColumns = _.map($scope.tree, 'column').join(', '); 299 | out += ' expectedColumns := []int{' + expectedColumns + '}\n\n'; 300 | 301 | out += ' expectedPaths := []map[string]PathTest{\n'; 302 | _.each($scope.tree, function(node) { 303 | node.parents = _.keys(node.parentsPaths); 304 | node.parents = _.sortBy(node.parents, function(item) { return $scope.tree[item].column; }); 305 | var maxParentLength = 0; 306 | _.each(node.parents, function(parentId) { 307 | if (parentId.length > maxParentLength) { 308 | maxParentLength = parentId.length; 309 | } 310 | }); 311 | if (!node.parents.length) { 312 | return; 313 | } 314 | out += ' {\n'; 315 | _.each(node.parents, function(parentId) { 316 | var prefix = ""; 317 | _.each(_.range(maxParentLength - parentId.length), function() { prefix += " "; }); 318 | var color = _.indexOf($scope.colors, node.parentsPaths[parentId].color); 319 | out += ' "' + parentId + '":' + prefix + ' {[]*PointTest{'; 320 | var points = []; 321 | _.each(node.parentsPaths[parentId].path, function(point) { 322 | points.push('{' + point[0] + ', ' + point[1] + ', ' + point[2] + '}'); 323 | }); 324 | out += points.join(', '); 325 | out += '}, ' + color + '},\n'; 326 | }); 327 | out += ' },\n'; 328 | }); 329 | out += ' }\n\n'; 330 | 331 | out += ' // Validation\n'; 332 | out += ' validateColumns(t, expectedColumns, out)\n'; 333 | out += ' validatePaths(t, expectedPaths, out)\n'; 334 | out += ' validateColors(t, expectedPaths, out)\n'; 335 | out += '}'; 336 | 337 | $scope.testFile = out; 338 | }; 339 | 340 | 341 | var generateShellScript = function() { 342 | 343 | var reversedNodes = _.cloneDeep($scope.tree); 344 | _.reverse(reversedNodes); 345 | var out = ""; 346 | _.each(reversedNodes, function(item, idx) { 347 | item.parents = _.keys(item.parentsPaths); 348 | item.parents = _.sortBy(item.parents, function(item) { return $scope.tree[item].column; }); 349 | if (item.parents.length === 0) { 350 | out += 'git checkout -b ' + item.id + '\n'; 351 | out += 'git commit --allow-empty -m ' + item.id + '\n'; 352 | } else if (item.parents.length === 1) { 353 | if ($scope.tree[item.parents[0]].column <= item.column) { 354 | out += 'git checkout ' + item.parents[0] + '\n'; 355 | out += 'git checkout -b ' + item.id + '\n'; 356 | out += 'git commit --allow-empty -m ' + item.id + '\n'; 357 | } 358 | } else if (item.parents.length === 2) { 359 | if ($scope.tree[item.parents[0]].column < item.column) { 360 | out += 'git checkout ' + item.parents[1] + '\n'; 361 | out += 'git checkout -b ' + item.id + '\n'; 362 | out += 'git merge -m ' + item.parents[0] + ' --no-ff ' + item.parents[0] + '\n'; 363 | } else if ($scope.tree[item.parents[1]].column > item.column) { 364 | out += 'git checkout ' + item.parents[0] + '\n'; 365 | out += 'git checkout -b ' + item.id + '\n'; 366 | out += 'git merge -m ' + item.parents[1] + ' --no-ff ' + item.parents[1] + '\n'; 367 | } 368 | } 369 | }); 370 | 371 | $scope.shellFile = out; 372 | }; 373 | 374 | 375 | $scope.$watch('tree', function(newValue, oldValue) { 376 | $scope.drawTree(); 377 | }, true); 378 | 379 | } 380 | } 381 | }); 382 | 383 | 384 | app.directive('focusMe', function($timeout) { 385 | return { 386 | scope: { trigger: '@focusMe' }, 387 | link: function(scope, element, attr) { 388 | var predicate = attr.focusMe || true; 389 | switch (predicate) { 390 | case "true": case "yes": case "1": 391 | predicate = true; 392 | break; 393 | case "false": case "no": case "0": case null: 394 | predicate = false; 395 | break; 396 | default: 397 | predicate = Boolean(predicate); 398 | break; 399 | } 400 | if (!predicate) { 401 | return; 402 | } 403 | scope.$watch('trigger', function(value) { 404 | $timeout(function() { 405 | element[0].focus(); 406 | }); 407 | }); 408 | } 409 | }; 410 | }); 411 | 412 | 413 | app.directive('ngEnter', function() { 414 | return function(scope, element, attrs) { 415 | element.bind("keydown keypress", function(event) { 416 | if(event.which === 13) { 417 | scope.$apply(function(){ 418 | scope.$eval(attrs.ngEnter, {'event': event}); 419 | }); 420 | event.preventDefault(); 421 | } 422 | }); 423 | }; 424 | }); 425 | -------------------------------------------------------------------------------- /tools/vendors/angular-local-storage.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * An Angular module that gives you access to the browsers local storage 3 | * @version v0.1.4 - 2014-10-30 4 | * @link https://github.com/grevory/angular-local-storage 5 | * @author grevory 6 | * @license MIT License, http://www.opensource.org/licenses/MIT 7 | */!function(a,b){"use strict";function c(a){return/^-?\d+\.?\d*$/.test(a.replace(/["']/g,""))}var d=b.isDefined,e=b.isUndefined,f=b.isNumber,g=b.isObject,h=b.isArray,i=b.extend,j=b.toJson,k=b.fromJson,l=b.module("LocalStorageModule",[]);l.provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){this.prefix=a},this.setStorageType=function(a){this.storageType=a},this.setStorageCookie=function(a,b){this.cookie={expiry:a,path:b}},this.setStorageCookieDomain=function(a){this.cookie.domain=a},this.setNotify=function(a,b){this.notify={setItem:a,removeItem:b}},this.$get=["$rootScope","$window","$document","$parse",function(a,b,l,m){var n,o=this,p=o.prefix,q=o.cookie,r=o.notify,s=o.storageType;l?l[0]&&(l=l[0]):l=document,"."!==p.substr(-1)&&(p=p?p+".":"");var t=function(a){return p+a},u=function(){try{var c=s in b&&null!==b[s],d=t("__"+Math.round(1e7*Math.random()));return c&&(n=b[s],n.setItem(d,""),n.removeItem(d)),c}catch(e){return s="cookie",a.$broadcast("LocalStorageModule.notification.error",e.message),!1}}(),v=function(b,c){if(e(c)?c=null:(g(c)||h(c)||f(+c||c))&&(c=j(c)),!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),r.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:"cookie"}),B(b,c);try{(g(c)||h(c))&&(c=j(c)),n&&n.setItem(t(b),c),r.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:o.storageType})}catch(d){return a.$broadcast("LocalStorageModule.notification.error",d.message),B(b,c)}return!0},w=function(b){if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),C(b);var d=n?n.getItem(t(b)):null;return d&&"null"!==d?"{"===d.charAt(0)||"["===d.charAt(0)||c(d)?k(d):d:null},x=function(b){if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),r.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:"cookie"}),D(b);try{n.removeItem(t(b)),r.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:o.storageType})}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),D(b)}return!0},y=function(){if(!u)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),!1;var b=p.length,c=[];for(var d in n)if(d.substr(0,b)===p)try{c.push(d.substr(b))}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.Description),[]}return c},z=function(b){b=b||"";var c=p.slice(0,-1),d=new RegExp(c+"."+b);if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),E();var e=p.length;for(var f in n)if(d.test(f))try{x(f.substr(e))}catch(g){return a.$broadcast("LocalStorageModule.notification.error",g.message),E()}return!0},A=function(){try{return b.navigator.cookieEnabled||"cookie"in l&&(l.cookie.length>0||(l.cookie="test").indexOf.call(l.cookie,"test")>-1)}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),!1}}(),B=function(b,c){if(e(c))return!1;if((h(c)||g(c))&&(c=j(c)),!A)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var d="",f=new Date,i="";if(null===c?(f.setTime(f.getTime()+-864e5),d="; expires="+f.toGMTString(),c=""):0!==q.expiry&&(f.setTime(f.getTime()+24*q.expiry*60*60*1e3),d="; expires="+f.toGMTString()),b){var k="; path="+q.path;q.domain&&(i="; domain="+q.domain),l.cookie=t(b)+"="+encodeURIComponent(c)+d+k+i}}catch(m){return a.$broadcast("LocalStorageModule.notification.error",m.message),!1}return!0},C=function(b){if(!A)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=l.cookie&&l.cookie.split(";")||[],d=0;d=c;d--)e.end&&e.end(f[d]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,f=[],m=a,l;for(f.last=function(){return f[f.length-1]};a;){l="";k=!0;if(f.last()&&w[f.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(q(b));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&& 8 | e.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML=a.replace(//g,">")}function r(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,f){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,f){var k=h.lowercase(f),g="img"===a&&"src"===k||"background"=== 10 | k;!0!==O[k]||!0===D[k]&&!e(d,g)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, 11 | I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function f(a,c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(e);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),f(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); 16 | //# sourceMappingURL=angular-sanitize.min.js.map 17 | -------------------------------------------------------------------------------- /tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaingilbert/git2graph/208395f28f8d1b74dc35bf8ffc4598cf93e9a962/tools/vendors/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /tools/vendors/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v1.5.9 3 | * https://zenorocha.github.io/clipboard.js 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function r(c,s){if(!n[c]){if(!e[c]){var a="function"==typeof require&&require;if(!s&&a)return a(c,!0);if(i)return i(c,!0);var l=new Error("Cannot find module '"+c+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return r(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var i="function"==typeof require&&require,c=0;co;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,c=o.length;c>i;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(r,i){if("function"==typeof t&&t.amd)t(["module","select"],i);else if("undefined"!=typeof o)i(n,e("select"));else{var c={exports:{}};i(c,r.select),r.clipboardAction=c.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=n(e),i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},c=function(){function t(t,e){for(var n=0;n li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @fa-font-path: "../fonts"; 5 | @fa-font-size-base: 14px; 6 | @fa-line-height-base: 1; 7 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts"; // for referencing Bootstrap CDN font files directly 8 | @fa-css-prefix: fa; 9 | @fa-version: "4.4.0"; 10 | @fa-border-color: #eee; 11 | @fa-inverse: #fff; 12 | @fa-li-width: (30em / 14); 13 | 14 | @fa-var-500px: "\f26e"; 15 | @fa-var-adjust: "\f042"; 16 | @fa-var-adn: "\f170"; 17 | @fa-var-align-center: "\f037"; 18 | @fa-var-align-justify: "\f039"; 19 | @fa-var-align-left: "\f036"; 20 | @fa-var-align-right: "\f038"; 21 | @fa-var-amazon: "\f270"; 22 | @fa-var-ambulance: "\f0f9"; 23 | @fa-var-anchor: "\f13d"; 24 | @fa-var-android: "\f17b"; 25 | @fa-var-angellist: "\f209"; 26 | @fa-var-angle-double-down: "\f103"; 27 | @fa-var-angle-double-left: "\f100"; 28 | @fa-var-angle-double-right: "\f101"; 29 | @fa-var-angle-double-up: "\f102"; 30 | @fa-var-angle-down: "\f107"; 31 | @fa-var-angle-left: "\f104"; 32 | @fa-var-angle-right: "\f105"; 33 | @fa-var-angle-up: "\f106"; 34 | @fa-var-apple: "\f179"; 35 | @fa-var-archive: "\f187"; 36 | @fa-var-area-chart: "\f1fe"; 37 | @fa-var-arrow-circle-down: "\f0ab"; 38 | @fa-var-arrow-circle-left: "\f0a8"; 39 | @fa-var-arrow-circle-o-down: "\f01a"; 40 | @fa-var-arrow-circle-o-left: "\f190"; 41 | @fa-var-arrow-circle-o-right: "\f18e"; 42 | @fa-var-arrow-circle-o-up: "\f01b"; 43 | @fa-var-arrow-circle-right: "\f0a9"; 44 | @fa-var-arrow-circle-up: "\f0aa"; 45 | @fa-var-arrow-down: "\f063"; 46 | @fa-var-arrow-left: "\f060"; 47 | @fa-var-arrow-right: "\f061"; 48 | @fa-var-arrow-up: "\f062"; 49 | @fa-var-arrows: "\f047"; 50 | @fa-var-arrows-alt: "\f0b2"; 51 | @fa-var-arrows-h: "\f07e"; 52 | @fa-var-arrows-v: "\f07d"; 53 | @fa-var-asterisk: "\f069"; 54 | @fa-var-at: "\f1fa"; 55 | @fa-var-automobile: "\f1b9"; 56 | @fa-var-backward: "\f04a"; 57 | @fa-var-balance-scale: "\f24e"; 58 | @fa-var-ban: "\f05e"; 59 | @fa-var-bank: "\f19c"; 60 | @fa-var-bar-chart: "\f080"; 61 | @fa-var-bar-chart-o: "\f080"; 62 | @fa-var-barcode: "\f02a"; 63 | @fa-var-bars: "\f0c9"; 64 | @fa-var-battery-0: "\f244"; 65 | @fa-var-battery-1: "\f243"; 66 | @fa-var-battery-2: "\f242"; 67 | @fa-var-battery-3: "\f241"; 68 | @fa-var-battery-4: "\f240"; 69 | @fa-var-battery-empty: "\f244"; 70 | @fa-var-battery-full: "\f240"; 71 | @fa-var-battery-half: "\f242"; 72 | @fa-var-battery-quarter: "\f243"; 73 | @fa-var-battery-three-quarters: "\f241"; 74 | @fa-var-bed: "\f236"; 75 | @fa-var-beer: "\f0fc"; 76 | @fa-var-behance: "\f1b4"; 77 | @fa-var-behance-square: "\f1b5"; 78 | @fa-var-bell: "\f0f3"; 79 | @fa-var-bell-o: "\f0a2"; 80 | @fa-var-bell-slash: "\f1f6"; 81 | @fa-var-bell-slash-o: "\f1f7"; 82 | @fa-var-bicycle: "\f206"; 83 | @fa-var-binoculars: "\f1e5"; 84 | @fa-var-birthday-cake: "\f1fd"; 85 | @fa-var-bitbucket: "\f171"; 86 | @fa-var-bitbucket-square: "\f172"; 87 | @fa-var-bitcoin: "\f15a"; 88 | @fa-var-black-tie: "\f27e"; 89 | @fa-var-bold: "\f032"; 90 | @fa-var-bolt: "\f0e7"; 91 | @fa-var-bomb: "\f1e2"; 92 | @fa-var-book: "\f02d"; 93 | @fa-var-bookmark: "\f02e"; 94 | @fa-var-bookmark-o: "\f097"; 95 | @fa-var-briefcase: "\f0b1"; 96 | @fa-var-btc: "\f15a"; 97 | @fa-var-bug: "\f188"; 98 | @fa-var-building: "\f1ad"; 99 | @fa-var-building-o: "\f0f7"; 100 | @fa-var-bullhorn: "\f0a1"; 101 | @fa-var-bullseye: "\f140"; 102 | @fa-var-bus: "\f207"; 103 | @fa-var-buysellads: "\f20d"; 104 | @fa-var-cab: "\f1ba"; 105 | @fa-var-calculator: "\f1ec"; 106 | @fa-var-calendar: "\f073"; 107 | @fa-var-calendar-check-o: "\f274"; 108 | @fa-var-calendar-minus-o: "\f272"; 109 | @fa-var-calendar-o: "\f133"; 110 | @fa-var-calendar-plus-o: "\f271"; 111 | @fa-var-calendar-times-o: "\f273"; 112 | @fa-var-camera: "\f030"; 113 | @fa-var-camera-retro: "\f083"; 114 | @fa-var-car: "\f1b9"; 115 | @fa-var-caret-down: "\f0d7"; 116 | @fa-var-caret-left: "\f0d9"; 117 | @fa-var-caret-right: "\f0da"; 118 | @fa-var-caret-square-o-down: "\f150"; 119 | @fa-var-caret-square-o-left: "\f191"; 120 | @fa-var-caret-square-o-right: "\f152"; 121 | @fa-var-caret-square-o-up: "\f151"; 122 | @fa-var-caret-up: "\f0d8"; 123 | @fa-var-cart-arrow-down: "\f218"; 124 | @fa-var-cart-plus: "\f217"; 125 | @fa-var-cc: "\f20a"; 126 | @fa-var-cc-amex: "\f1f3"; 127 | @fa-var-cc-diners-club: "\f24c"; 128 | @fa-var-cc-discover: "\f1f2"; 129 | @fa-var-cc-jcb: "\f24b"; 130 | @fa-var-cc-mastercard: "\f1f1"; 131 | @fa-var-cc-paypal: "\f1f4"; 132 | @fa-var-cc-stripe: "\f1f5"; 133 | @fa-var-cc-visa: "\f1f0"; 134 | @fa-var-certificate: "\f0a3"; 135 | @fa-var-chain: "\f0c1"; 136 | @fa-var-chain-broken: "\f127"; 137 | @fa-var-check: "\f00c"; 138 | @fa-var-check-circle: "\f058"; 139 | @fa-var-check-circle-o: "\f05d"; 140 | @fa-var-check-square: "\f14a"; 141 | @fa-var-check-square-o: "\f046"; 142 | @fa-var-chevron-circle-down: "\f13a"; 143 | @fa-var-chevron-circle-left: "\f137"; 144 | @fa-var-chevron-circle-right: "\f138"; 145 | @fa-var-chevron-circle-up: "\f139"; 146 | @fa-var-chevron-down: "\f078"; 147 | @fa-var-chevron-left: "\f053"; 148 | @fa-var-chevron-right: "\f054"; 149 | @fa-var-chevron-up: "\f077"; 150 | @fa-var-child: "\f1ae"; 151 | @fa-var-chrome: "\f268"; 152 | @fa-var-circle: "\f111"; 153 | @fa-var-circle-o: "\f10c"; 154 | @fa-var-circle-o-notch: "\f1ce"; 155 | @fa-var-circle-thin: "\f1db"; 156 | @fa-var-clipboard: "\f0ea"; 157 | @fa-var-clock-o: "\f017"; 158 | @fa-var-clone: "\f24d"; 159 | @fa-var-close: "\f00d"; 160 | @fa-var-cloud: "\f0c2"; 161 | @fa-var-cloud-download: "\f0ed"; 162 | @fa-var-cloud-upload: "\f0ee"; 163 | @fa-var-cny: "\f157"; 164 | @fa-var-code: "\f121"; 165 | @fa-var-code-fork: "\f126"; 166 | @fa-var-codepen: "\f1cb"; 167 | @fa-var-coffee: "\f0f4"; 168 | @fa-var-cog: "\f013"; 169 | @fa-var-cogs: "\f085"; 170 | @fa-var-columns: "\f0db"; 171 | @fa-var-comment: "\f075"; 172 | @fa-var-comment-o: "\f0e5"; 173 | @fa-var-commenting: "\f27a"; 174 | @fa-var-commenting-o: "\f27b"; 175 | @fa-var-comments: "\f086"; 176 | @fa-var-comments-o: "\f0e6"; 177 | @fa-var-compass: "\f14e"; 178 | @fa-var-compress: "\f066"; 179 | @fa-var-connectdevelop: "\f20e"; 180 | @fa-var-contao: "\f26d"; 181 | @fa-var-copy: "\f0c5"; 182 | @fa-var-copyright: "\f1f9"; 183 | @fa-var-creative-commons: "\f25e"; 184 | @fa-var-credit-card: "\f09d"; 185 | @fa-var-crop: "\f125"; 186 | @fa-var-crosshairs: "\f05b"; 187 | @fa-var-css3: "\f13c"; 188 | @fa-var-cube: "\f1b2"; 189 | @fa-var-cubes: "\f1b3"; 190 | @fa-var-cut: "\f0c4"; 191 | @fa-var-cutlery: "\f0f5"; 192 | @fa-var-dashboard: "\f0e4"; 193 | @fa-var-dashcube: "\f210"; 194 | @fa-var-database: "\f1c0"; 195 | @fa-var-dedent: "\f03b"; 196 | @fa-var-delicious: "\f1a5"; 197 | @fa-var-desktop: "\f108"; 198 | @fa-var-deviantart: "\f1bd"; 199 | @fa-var-diamond: "\f219"; 200 | @fa-var-digg: "\f1a6"; 201 | @fa-var-dollar: "\f155"; 202 | @fa-var-dot-circle-o: "\f192"; 203 | @fa-var-download: "\f019"; 204 | @fa-var-dribbble: "\f17d"; 205 | @fa-var-dropbox: "\f16b"; 206 | @fa-var-drupal: "\f1a9"; 207 | @fa-var-edit: "\f044"; 208 | @fa-var-eject: "\f052"; 209 | @fa-var-ellipsis-h: "\f141"; 210 | @fa-var-ellipsis-v: "\f142"; 211 | @fa-var-empire: "\f1d1"; 212 | @fa-var-envelope: "\f0e0"; 213 | @fa-var-envelope-o: "\f003"; 214 | @fa-var-envelope-square: "\f199"; 215 | @fa-var-eraser: "\f12d"; 216 | @fa-var-eur: "\f153"; 217 | @fa-var-euro: "\f153"; 218 | @fa-var-exchange: "\f0ec"; 219 | @fa-var-exclamation: "\f12a"; 220 | @fa-var-exclamation-circle: "\f06a"; 221 | @fa-var-exclamation-triangle: "\f071"; 222 | @fa-var-expand: "\f065"; 223 | @fa-var-expeditedssl: "\f23e"; 224 | @fa-var-external-link: "\f08e"; 225 | @fa-var-external-link-square: "\f14c"; 226 | @fa-var-eye: "\f06e"; 227 | @fa-var-eye-slash: "\f070"; 228 | @fa-var-eyedropper: "\f1fb"; 229 | @fa-var-facebook: "\f09a"; 230 | @fa-var-facebook-f: "\f09a"; 231 | @fa-var-facebook-official: "\f230"; 232 | @fa-var-facebook-square: "\f082"; 233 | @fa-var-fast-backward: "\f049"; 234 | @fa-var-fast-forward: "\f050"; 235 | @fa-var-fax: "\f1ac"; 236 | @fa-var-feed: "\f09e"; 237 | @fa-var-female: "\f182"; 238 | @fa-var-fighter-jet: "\f0fb"; 239 | @fa-var-file: "\f15b"; 240 | @fa-var-file-archive-o: "\f1c6"; 241 | @fa-var-file-audio-o: "\f1c7"; 242 | @fa-var-file-code-o: "\f1c9"; 243 | @fa-var-file-excel-o: "\f1c3"; 244 | @fa-var-file-image-o: "\f1c5"; 245 | @fa-var-file-movie-o: "\f1c8"; 246 | @fa-var-file-o: "\f016"; 247 | @fa-var-file-pdf-o: "\f1c1"; 248 | @fa-var-file-photo-o: "\f1c5"; 249 | @fa-var-file-picture-o: "\f1c5"; 250 | @fa-var-file-powerpoint-o: "\f1c4"; 251 | @fa-var-file-sound-o: "\f1c7"; 252 | @fa-var-file-text: "\f15c"; 253 | @fa-var-file-text-o: "\f0f6"; 254 | @fa-var-file-video-o: "\f1c8"; 255 | @fa-var-file-word-o: "\f1c2"; 256 | @fa-var-file-zip-o: "\f1c6"; 257 | @fa-var-files-o: "\f0c5"; 258 | @fa-var-film: "\f008"; 259 | @fa-var-filter: "\f0b0"; 260 | @fa-var-fire: "\f06d"; 261 | @fa-var-fire-extinguisher: "\f134"; 262 | @fa-var-firefox: "\f269"; 263 | @fa-var-flag: "\f024"; 264 | @fa-var-flag-checkered: "\f11e"; 265 | @fa-var-flag-o: "\f11d"; 266 | @fa-var-flash: "\f0e7"; 267 | @fa-var-flask: "\f0c3"; 268 | @fa-var-flickr: "\f16e"; 269 | @fa-var-floppy-o: "\f0c7"; 270 | @fa-var-folder: "\f07b"; 271 | @fa-var-folder-o: "\f114"; 272 | @fa-var-folder-open: "\f07c"; 273 | @fa-var-folder-open-o: "\f115"; 274 | @fa-var-font: "\f031"; 275 | @fa-var-fonticons: "\f280"; 276 | @fa-var-forumbee: "\f211"; 277 | @fa-var-forward: "\f04e"; 278 | @fa-var-foursquare: "\f180"; 279 | @fa-var-frown-o: "\f119"; 280 | @fa-var-futbol-o: "\f1e3"; 281 | @fa-var-gamepad: "\f11b"; 282 | @fa-var-gavel: "\f0e3"; 283 | @fa-var-gbp: "\f154"; 284 | @fa-var-ge: "\f1d1"; 285 | @fa-var-gear: "\f013"; 286 | @fa-var-gears: "\f085"; 287 | @fa-var-genderless: "\f22d"; 288 | @fa-var-get-pocket: "\f265"; 289 | @fa-var-gg: "\f260"; 290 | @fa-var-gg-circle: "\f261"; 291 | @fa-var-gift: "\f06b"; 292 | @fa-var-git: "\f1d3"; 293 | @fa-var-git-square: "\f1d2"; 294 | @fa-var-github: "\f09b"; 295 | @fa-var-github-alt: "\f113"; 296 | @fa-var-github-square: "\f092"; 297 | @fa-var-gittip: "\f184"; 298 | @fa-var-glass: "\f000"; 299 | @fa-var-globe: "\f0ac"; 300 | @fa-var-google: "\f1a0"; 301 | @fa-var-google-plus: "\f0d5"; 302 | @fa-var-google-plus-square: "\f0d4"; 303 | @fa-var-google-wallet: "\f1ee"; 304 | @fa-var-graduation-cap: "\f19d"; 305 | @fa-var-gratipay: "\f184"; 306 | @fa-var-group: "\f0c0"; 307 | @fa-var-h-square: "\f0fd"; 308 | @fa-var-hacker-news: "\f1d4"; 309 | @fa-var-hand-grab-o: "\f255"; 310 | @fa-var-hand-lizard-o: "\f258"; 311 | @fa-var-hand-o-down: "\f0a7"; 312 | @fa-var-hand-o-left: "\f0a5"; 313 | @fa-var-hand-o-right: "\f0a4"; 314 | @fa-var-hand-o-up: "\f0a6"; 315 | @fa-var-hand-paper-o: "\f256"; 316 | @fa-var-hand-peace-o: "\f25b"; 317 | @fa-var-hand-pointer-o: "\f25a"; 318 | @fa-var-hand-rock-o: "\f255"; 319 | @fa-var-hand-scissors-o: "\f257"; 320 | @fa-var-hand-spock-o: "\f259"; 321 | @fa-var-hand-stop-o: "\f256"; 322 | @fa-var-hdd-o: "\f0a0"; 323 | @fa-var-header: "\f1dc"; 324 | @fa-var-headphones: "\f025"; 325 | @fa-var-heart: "\f004"; 326 | @fa-var-heart-o: "\f08a"; 327 | @fa-var-heartbeat: "\f21e"; 328 | @fa-var-history: "\f1da"; 329 | @fa-var-home: "\f015"; 330 | @fa-var-hospital-o: "\f0f8"; 331 | @fa-var-hotel: "\f236"; 332 | @fa-var-hourglass: "\f254"; 333 | @fa-var-hourglass-1: "\f251"; 334 | @fa-var-hourglass-2: "\f252"; 335 | @fa-var-hourglass-3: "\f253"; 336 | @fa-var-hourglass-end: "\f253"; 337 | @fa-var-hourglass-half: "\f252"; 338 | @fa-var-hourglass-o: "\f250"; 339 | @fa-var-hourglass-start: "\f251"; 340 | @fa-var-houzz: "\f27c"; 341 | @fa-var-html5: "\f13b"; 342 | @fa-var-i-cursor: "\f246"; 343 | @fa-var-ils: "\f20b"; 344 | @fa-var-image: "\f03e"; 345 | @fa-var-inbox: "\f01c"; 346 | @fa-var-indent: "\f03c"; 347 | @fa-var-industry: "\f275"; 348 | @fa-var-info: "\f129"; 349 | @fa-var-info-circle: "\f05a"; 350 | @fa-var-inr: "\f156"; 351 | @fa-var-instagram: "\f16d"; 352 | @fa-var-institution: "\f19c"; 353 | @fa-var-internet-explorer: "\f26b"; 354 | @fa-var-intersex: "\f224"; 355 | @fa-var-ioxhost: "\f208"; 356 | @fa-var-italic: "\f033"; 357 | @fa-var-joomla: "\f1aa"; 358 | @fa-var-jpy: "\f157"; 359 | @fa-var-jsfiddle: "\f1cc"; 360 | @fa-var-key: "\f084"; 361 | @fa-var-keyboard-o: "\f11c"; 362 | @fa-var-krw: "\f159"; 363 | @fa-var-language: "\f1ab"; 364 | @fa-var-laptop: "\f109"; 365 | @fa-var-lastfm: "\f202"; 366 | @fa-var-lastfm-square: "\f203"; 367 | @fa-var-leaf: "\f06c"; 368 | @fa-var-leanpub: "\f212"; 369 | @fa-var-legal: "\f0e3"; 370 | @fa-var-lemon-o: "\f094"; 371 | @fa-var-level-down: "\f149"; 372 | @fa-var-level-up: "\f148"; 373 | @fa-var-life-bouy: "\f1cd"; 374 | @fa-var-life-buoy: "\f1cd"; 375 | @fa-var-life-ring: "\f1cd"; 376 | @fa-var-life-saver: "\f1cd"; 377 | @fa-var-lightbulb-o: "\f0eb"; 378 | @fa-var-line-chart: "\f201"; 379 | @fa-var-link: "\f0c1"; 380 | @fa-var-linkedin: "\f0e1"; 381 | @fa-var-linkedin-square: "\f08c"; 382 | @fa-var-linux: "\f17c"; 383 | @fa-var-list: "\f03a"; 384 | @fa-var-list-alt: "\f022"; 385 | @fa-var-list-ol: "\f0cb"; 386 | @fa-var-list-ul: "\f0ca"; 387 | @fa-var-location-arrow: "\f124"; 388 | @fa-var-lock: "\f023"; 389 | @fa-var-long-arrow-down: "\f175"; 390 | @fa-var-long-arrow-left: "\f177"; 391 | @fa-var-long-arrow-right: "\f178"; 392 | @fa-var-long-arrow-up: "\f176"; 393 | @fa-var-magic: "\f0d0"; 394 | @fa-var-magnet: "\f076"; 395 | @fa-var-mail-forward: "\f064"; 396 | @fa-var-mail-reply: "\f112"; 397 | @fa-var-mail-reply-all: "\f122"; 398 | @fa-var-male: "\f183"; 399 | @fa-var-map: "\f279"; 400 | @fa-var-map-marker: "\f041"; 401 | @fa-var-map-o: "\f278"; 402 | @fa-var-map-pin: "\f276"; 403 | @fa-var-map-signs: "\f277"; 404 | @fa-var-mars: "\f222"; 405 | @fa-var-mars-double: "\f227"; 406 | @fa-var-mars-stroke: "\f229"; 407 | @fa-var-mars-stroke-h: "\f22b"; 408 | @fa-var-mars-stroke-v: "\f22a"; 409 | @fa-var-maxcdn: "\f136"; 410 | @fa-var-meanpath: "\f20c"; 411 | @fa-var-medium: "\f23a"; 412 | @fa-var-medkit: "\f0fa"; 413 | @fa-var-meh-o: "\f11a"; 414 | @fa-var-mercury: "\f223"; 415 | @fa-var-microphone: "\f130"; 416 | @fa-var-microphone-slash: "\f131"; 417 | @fa-var-minus: "\f068"; 418 | @fa-var-minus-circle: "\f056"; 419 | @fa-var-minus-square: "\f146"; 420 | @fa-var-minus-square-o: "\f147"; 421 | @fa-var-mobile: "\f10b"; 422 | @fa-var-mobile-phone: "\f10b"; 423 | @fa-var-money: "\f0d6"; 424 | @fa-var-moon-o: "\f186"; 425 | @fa-var-mortar-board: "\f19d"; 426 | @fa-var-motorcycle: "\f21c"; 427 | @fa-var-mouse-pointer: "\f245"; 428 | @fa-var-music: "\f001"; 429 | @fa-var-navicon: "\f0c9"; 430 | @fa-var-neuter: "\f22c"; 431 | @fa-var-newspaper-o: "\f1ea"; 432 | @fa-var-object-group: "\f247"; 433 | @fa-var-object-ungroup: "\f248"; 434 | @fa-var-odnoklassniki: "\f263"; 435 | @fa-var-odnoklassniki-square: "\f264"; 436 | @fa-var-opencart: "\f23d"; 437 | @fa-var-openid: "\f19b"; 438 | @fa-var-opera: "\f26a"; 439 | @fa-var-optin-monster: "\f23c"; 440 | @fa-var-outdent: "\f03b"; 441 | @fa-var-pagelines: "\f18c"; 442 | @fa-var-paint-brush: "\f1fc"; 443 | @fa-var-paper-plane: "\f1d8"; 444 | @fa-var-paper-plane-o: "\f1d9"; 445 | @fa-var-paperclip: "\f0c6"; 446 | @fa-var-paragraph: "\f1dd"; 447 | @fa-var-paste: "\f0ea"; 448 | @fa-var-pause: "\f04c"; 449 | @fa-var-paw: "\f1b0"; 450 | @fa-var-paypal: "\f1ed"; 451 | @fa-var-pencil: "\f040"; 452 | @fa-var-pencil-square: "\f14b"; 453 | @fa-var-pencil-square-o: "\f044"; 454 | @fa-var-phone: "\f095"; 455 | @fa-var-phone-square: "\f098"; 456 | @fa-var-photo: "\f03e"; 457 | @fa-var-picture-o: "\f03e"; 458 | @fa-var-pie-chart: "\f200"; 459 | @fa-var-pied-piper: "\f1a7"; 460 | @fa-var-pied-piper-alt: "\f1a8"; 461 | @fa-var-pinterest: "\f0d2"; 462 | @fa-var-pinterest-p: "\f231"; 463 | @fa-var-pinterest-square: "\f0d3"; 464 | @fa-var-plane: "\f072"; 465 | @fa-var-play: "\f04b"; 466 | @fa-var-play-circle: "\f144"; 467 | @fa-var-play-circle-o: "\f01d"; 468 | @fa-var-plug: "\f1e6"; 469 | @fa-var-plus: "\f067"; 470 | @fa-var-plus-circle: "\f055"; 471 | @fa-var-plus-square: "\f0fe"; 472 | @fa-var-plus-square-o: "\f196"; 473 | @fa-var-power-off: "\f011"; 474 | @fa-var-print: "\f02f"; 475 | @fa-var-puzzle-piece: "\f12e"; 476 | @fa-var-qq: "\f1d6"; 477 | @fa-var-qrcode: "\f029"; 478 | @fa-var-question: "\f128"; 479 | @fa-var-question-circle: "\f059"; 480 | @fa-var-quote-left: "\f10d"; 481 | @fa-var-quote-right: "\f10e"; 482 | @fa-var-ra: "\f1d0"; 483 | @fa-var-random: "\f074"; 484 | @fa-var-rebel: "\f1d0"; 485 | @fa-var-recycle: "\f1b8"; 486 | @fa-var-reddit: "\f1a1"; 487 | @fa-var-reddit-square: "\f1a2"; 488 | @fa-var-refresh: "\f021"; 489 | @fa-var-registered: "\f25d"; 490 | @fa-var-remove: "\f00d"; 491 | @fa-var-renren: "\f18b"; 492 | @fa-var-reorder: "\f0c9"; 493 | @fa-var-repeat: "\f01e"; 494 | @fa-var-reply: "\f112"; 495 | @fa-var-reply-all: "\f122"; 496 | @fa-var-retweet: "\f079"; 497 | @fa-var-rmb: "\f157"; 498 | @fa-var-road: "\f018"; 499 | @fa-var-rocket: "\f135"; 500 | @fa-var-rotate-left: "\f0e2"; 501 | @fa-var-rotate-right: "\f01e"; 502 | @fa-var-rouble: "\f158"; 503 | @fa-var-rss: "\f09e"; 504 | @fa-var-rss-square: "\f143"; 505 | @fa-var-rub: "\f158"; 506 | @fa-var-ruble: "\f158"; 507 | @fa-var-rupee: "\f156"; 508 | @fa-var-safari: "\f267"; 509 | @fa-var-save: "\f0c7"; 510 | @fa-var-scissors: "\f0c4"; 511 | @fa-var-search: "\f002"; 512 | @fa-var-search-minus: "\f010"; 513 | @fa-var-search-plus: "\f00e"; 514 | @fa-var-sellsy: "\f213"; 515 | @fa-var-send: "\f1d8"; 516 | @fa-var-send-o: "\f1d9"; 517 | @fa-var-server: "\f233"; 518 | @fa-var-share: "\f064"; 519 | @fa-var-share-alt: "\f1e0"; 520 | @fa-var-share-alt-square: "\f1e1"; 521 | @fa-var-share-square: "\f14d"; 522 | @fa-var-share-square-o: "\f045"; 523 | @fa-var-shekel: "\f20b"; 524 | @fa-var-sheqel: "\f20b"; 525 | @fa-var-shield: "\f132"; 526 | @fa-var-ship: "\f21a"; 527 | @fa-var-shirtsinbulk: "\f214"; 528 | @fa-var-shopping-cart: "\f07a"; 529 | @fa-var-sign-in: "\f090"; 530 | @fa-var-sign-out: "\f08b"; 531 | @fa-var-signal: "\f012"; 532 | @fa-var-simplybuilt: "\f215"; 533 | @fa-var-sitemap: "\f0e8"; 534 | @fa-var-skyatlas: "\f216"; 535 | @fa-var-skype: "\f17e"; 536 | @fa-var-slack: "\f198"; 537 | @fa-var-sliders: "\f1de"; 538 | @fa-var-slideshare: "\f1e7"; 539 | @fa-var-smile-o: "\f118"; 540 | @fa-var-soccer-ball-o: "\f1e3"; 541 | @fa-var-sort: "\f0dc"; 542 | @fa-var-sort-alpha-asc: "\f15d"; 543 | @fa-var-sort-alpha-desc: "\f15e"; 544 | @fa-var-sort-amount-asc: "\f160"; 545 | @fa-var-sort-amount-desc: "\f161"; 546 | @fa-var-sort-asc: "\f0de"; 547 | @fa-var-sort-desc: "\f0dd"; 548 | @fa-var-sort-down: "\f0dd"; 549 | @fa-var-sort-numeric-asc: "\f162"; 550 | @fa-var-sort-numeric-desc: "\f163"; 551 | @fa-var-sort-up: "\f0de"; 552 | @fa-var-soundcloud: "\f1be"; 553 | @fa-var-space-shuttle: "\f197"; 554 | @fa-var-spinner: "\f110"; 555 | @fa-var-spoon: "\f1b1"; 556 | @fa-var-spotify: "\f1bc"; 557 | @fa-var-square: "\f0c8"; 558 | @fa-var-square-o: "\f096"; 559 | @fa-var-stack-exchange: "\f18d"; 560 | @fa-var-stack-overflow: "\f16c"; 561 | @fa-var-star: "\f005"; 562 | @fa-var-star-half: "\f089"; 563 | @fa-var-star-half-empty: "\f123"; 564 | @fa-var-star-half-full: "\f123"; 565 | @fa-var-star-half-o: "\f123"; 566 | @fa-var-star-o: "\f006"; 567 | @fa-var-steam: "\f1b6"; 568 | @fa-var-steam-square: "\f1b7"; 569 | @fa-var-step-backward: "\f048"; 570 | @fa-var-step-forward: "\f051"; 571 | @fa-var-stethoscope: "\f0f1"; 572 | @fa-var-sticky-note: "\f249"; 573 | @fa-var-sticky-note-o: "\f24a"; 574 | @fa-var-stop: "\f04d"; 575 | @fa-var-street-view: "\f21d"; 576 | @fa-var-strikethrough: "\f0cc"; 577 | @fa-var-stumbleupon: "\f1a4"; 578 | @fa-var-stumbleupon-circle: "\f1a3"; 579 | @fa-var-subscript: "\f12c"; 580 | @fa-var-subway: "\f239"; 581 | @fa-var-suitcase: "\f0f2"; 582 | @fa-var-sun-o: "\f185"; 583 | @fa-var-superscript: "\f12b"; 584 | @fa-var-support: "\f1cd"; 585 | @fa-var-table: "\f0ce"; 586 | @fa-var-tablet: "\f10a"; 587 | @fa-var-tachometer: "\f0e4"; 588 | @fa-var-tag: "\f02b"; 589 | @fa-var-tags: "\f02c"; 590 | @fa-var-tasks: "\f0ae"; 591 | @fa-var-taxi: "\f1ba"; 592 | @fa-var-television: "\f26c"; 593 | @fa-var-tencent-weibo: "\f1d5"; 594 | @fa-var-terminal: "\f120"; 595 | @fa-var-text-height: "\f034"; 596 | @fa-var-text-width: "\f035"; 597 | @fa-var-th: "\f00a"; 598 | @fa-var-th-large: "\f009"; 599 | @fa-var-th-list: "\f00b"; 600 | @fa-var-thumb-tack: "\f08d"; 601 | @fa-var-thumbs-down: "\f165"; 602 | @fa-var-thumbs-o-down: "\f088"; 603 | @fa-var-thumbs-o-up: "\f087"; 604 | @fa-var-thumbs-up: "\f164"; 605 | @fa-var-ticket: "\f145"; 606 | @fa-var-times: "\f00d"; 607 | @fa-var-times-circle: "\f057"; 608 | @fa-var-times-circle-o: "\f05c"; 609 | @fa-var-tint: "\f043"; 610 | @fa-var-toggle-down: "\f150"; 611 | @fa-var-toggle-left: "\f191"; 612 | @fa-var-toggle-off: "\f204"; 613 | @fa-var-toggle-on: "\f205"; 614 | @fa-var-toggle-right: "\f152"; 615 | @fa-var-toggle-up: "\f151"; 616 | @fa-var-trademark: "\f25c"; 617 | @fa-var-train: "\f238"; 618 | @fa-var-transgender: "\f224"; 619 | @fa-var-transgender-alt: "\f225"; 620 | @fa-var-trash: "\f1f8"; 621 | @fa-var-trash-o: "\f014"; 622 | @fa-var-tree: "\f1bb"; 623 | @fa-var-trello: "\f181"; 624 | @fa-var-tripadvisor: "\f262"; 625 | @fa-var-trophy: "\f091"; 626 | @fa-var-truck: "\f0d1"; 627 | @fa-var-try: "\f195"; 628 | @fa-var-tty: "\f1e4"; 629 | @fa-var-tumblr: "\f173"; 630 | @fa-var-tumblr-square: "\f174"; 631 | @fa-var-turkish-lira: "\f195"; 632 | @fa-var-tv: "\f26c"; 633 | @fa-var-twitch: "\f1e8"; 634 | @fa-var-twitter: "\f099"; 635 | @fa-var-twitter-square: "\f081"; 636 | @fa-var-umbrella: "\f0e9"; 637 | @fa-var-underline: "\f0cd"; 638 | @fa-var-undo: "\f0e2"; 639 | @fa-var-university: "\f19c"; 640 | @fa-var-unlink: "\f127"; 641 | @fa-var-unlock: "\f09c"; 642 | @fa-var-unlock-alt: "\f13e"; 643 | @fa-var-unsorted: "\f0dc"; 644 | @fa-var-upload: "\f093"; 645 | @fa-var-usd: "\f155"; 646 | @fa-var-user: "\f007"; 647 | @fa-var-user-md: "\f0f0"; 648 | @fa-var-user-plus: "\f234"; 649 | @fa-var-user-secret: "\f21b"; 650 | @fa-var-user-times: "\f235"; 651 | @fa-var-users: "\f0c0"; 652 | @fa-var-venus: "\f221"; 653 | @fa-var-venus-double: "\f226"; 654 | @fa-var-venus-mars: "\f228"; 655 | @fa-var-viacoin: "\f237"; 656 | @fa-var-video-camera: "\f03d"; 657 | @fa-var-vimeo: "\f27d"; 658 | @fa-var-vimeo-square: "\f194"; 659 | @fa-var-vine: "\f1ca"; 660 | @fa-var-vk: "\f189"; 661 | @fa-var-volume-down: "\f027"; 662 | @fa-var-volume-off: "\f026"; 663 | @fa-var-volume-up: "\f028"; 664 | @fa-var-warning: "\f071"; 665 | @fa-var-wechat: "\f1d7"; 666 | @fa-var-weibo: "\f18a"; 667 | @fa-var-weixin: "\f1d7"; 668 | @fa-var-whatsapp: "\f232"; 669 | @fa-var-wheelchair: "\f193"; 670 | @fa-var-wifi: "\f1eb"; 671 | @fa-var-wikipedia-w: "\f266"; 672 | @fa-var-windows: "\f17a"; 673 | @fa-var-won: "\f159"; 674 | @fa-var-wordpress: "\f19a"; 675 | @fa-var-wrench: "\f0ad"; 676 | @fa-var-xing: "\f168"; 677 | @fa-var-xing-square: "\f169"; 678 | @fa-var-y-combinator: "\f23b"; 679 | @fa-var-y-combinator-square: "\f1d4"; 680 | @fa-var-yahoo: "\f19e"; 681 | @fa-var-yc: "\f23b"; 682 | @fa-var-yc-square: "\f1d4"; 683 | @fa-var-yelp: "\f1e9"; 684 | @fa-var-yen: "\f157"; 685 | @fa-var-youtube: "\f167"; 686 | @fa-var-youtube-play: "\f16a"; 687 | @fa-var-youtube-square: "\f166"; 688 | 689 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $fa-font-path: "../fonts" !default; 5 | $fa-font-size-base: 14px !default; 6 | $fa-line-height-base: 1 !default; 7 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts" !default; // for referencing Bootstrap CDN font files directly 8 | $fa-css-prefix: fa !default; 9 | $fa-version: "4.4.0" !default; 10 | $fa-border-color: #eee !default; 11 | $fa-inverse: #fff !default; 12 | $fa-li-width: (30em / 14) !default; 13 | 14 | $fa-var-500px: "\f26e"; 15 | $fa-var-adjust: "\f042"; 16 | $fa-var-adn: "\f170"; 17 | $fa-var-align-center: "\f037"; 18 | $fa-var-align-justify: "\f039"; 19 | $fa-var-align-left: "\f036"; 20 | $fa-var-align-right: "\f038"; 21 | $fa-var-amazon: "\f270"; 22 | $fa-var-ambulance: "\f0f9"; 23 | $fa-var-anchor: "\f13d"; 24 | $fa-var-android: "\f17b"; 25 | $fa-var-angellist: "\f209"; 26 | $fa-var-angle-double-down: "\f103"; 27 | $fa-var-angle-double-left: "\f100"; 28 | $fa-var-angle-double-right: "\f101"; 29 | $fa-var-angle-double-up: "\f102"; 30 | $fa-var-angle-down: "\f107"; 31 | $fa-var-angle-left: "\f104"; 32 | $fa-var-angle-right: "\f105"; 33 | $fa-var-angle-up: "\f106"; 34 | $fa-var-apple: "\f179"; 35 | $fa-var-archive: "\f187"; 36 | $fa-var-area-chart: "\f1fe"; 37 | $fa-var-arrow-circle-down: "\f0ab"; 38 | $fa-var-arrow-circle-left: "\f0a8"; 39 | $fa-var-arrow-circle-o-down: "\f01a"; 40 | $fa-var-arrow-circle-o-left: "\f190"; 41 | $fa-var-arrow-circle-o-right: "\f18e"; 42 | $fa-var-arrow-circle-o-up: "\f01b"; 43 | $fa-var-arrow-circle-right: "\f0a9"; 44 | $fa-var-arrow-circle-up: "\f0aa"; 45 | $fa-var-arrow-down: "\f063"; 46 | $fa-var-arrow-left: "\f060"; 47 | $fa-var-arrow-right: "\f061"; 48 | $fa-var-arrow-up: "\f062"; 49 | $fa-var-arrows: "\f047"; 50 | $fa-var-arrows-alt: "\f0b2"; 51 | $fa-var-arrows-h: "\f07e"; 52 | $fa-var-arrows-v: "\f07d"; 53 | $fa-var-asterisk: "\f069"; 54 | $fa-var-at: "\f1fa"; 55 | $fa-var-automobile: "\f1b9"; 56 | $fa-var-backward: "\f04a"; 57 | $fa-var-balance-scale: "\f24e"; 58 | $fa-var-ban: "\f05e"; 59 | $fa-var-bank: "\f19c"; 60 | $fa-var-bar-chart: "\f080"; 61 | $fa-var-bar-chart-o: "\f080"; 62 | $fa-var-barcode: "\f02a"; 63 | $fa-var-bars: "\f0c9"; 64 | $fa-var-battery-0: "\f244"; 65 | $fa-var-battery-1: "\f243"; 66 | $fa-var-battery-2: "\f242"; 67 | $fa-var-battery-3: "\f241"; 68 | $fa-var-battery-4: "\f240"; 69 | $fa-var-battery-empty: "\f244"; 70 | $fa-var-battery-full: "\f240"; 71 | $fa-var-battery-half: "\f242"; 72 | $fa-var-battery-quarter: "\f243"; 73 | $fa-var-battery-three-quarters: "\f241"; 74 | $fa-var-bed: "\f236"; 75 | $fa-var-beer: "\f0fc"; 76 | $fa-var-behance: "\f1b4"; 77 | $fa-var-behance-square: "\f1b5"; 78 | $fa-var-bell: "\f0f3"; 79 | $fa-var-bell-o: "\f0a2"; 80 | $fa-var-bell-slash: "\f1f6"; 81 | $fa-var-bell-slash-o: "\f1f7"; 82 | $fa-var-bicycle: "\f206"; 83 | $fa-var-binoculars: "\f1e5"; 84 | $fa-var-birthday-cake: "\f1fd"; 85 | $fa-var-bitbucket: "\f171"; 86 | $fa-var-bitbucket-square: "\f172"; 87 | $fa-var-bitcoin: "\f15a"; 88 | $fa-var-black-tie: "\f27e"; 89 | $fa-var-bold: "\f032"; 90 | $fa-var-bolt: "\f0e7"; 91 | $fa-var-bomb: "\f1e2"; 92 | $fa-var-book: "\f02d"; 93 | $fa-var-bookmark: "\f02e"; 94 | $fa-var-bookmark-o: "\f097"; 95 | $fa-var-briefcase: "\f0b1"; 96 | $fa-var-btc: "\f15a"; 97 | $fa-var-bug: "\f188"; 98 | $fa-var-building: "\f1ad"; 99 | $fa-var-building-o: "\f0f7"; 100 | $fa-var-bullhorn: "\f0a1"; 101 | $fa-var-bullseye: "\f140"; 102 | $fa-var-bus: "\f207"; 103 | $fa-var-buysellads: "\f20d"; 104 | $fa-var-cab: "\f1ba"; 105 | $fa-var-calculator: "\f1ec"; 106 | $fa-var-calendar: "\f073"; 107 | $fa-var-calendar-check-o: "\f274"; 108 | $fa-var-calendar-minus-o: "\f272"; 109 | $fa-var-calendar-o: "\f133"; 110 | $fa-var-calendar-plus-o: "\f271"; 111 | $fa-var-calendar-times-o: "\f273"; 112 | $fa-var-camera: "\f030"; 113 | $fa-var-camera-retro: "\f083"; 114 | $fa-var-car: "\f1b9"; 115 | $fa-var-caret-down: "\f0d7"; 116 | $fa-var-caret-left: "\f0d9"; 117 | $fa-var-caret-right: "\f0da"; 118 | $fa-var-caret-square-o-down: "\f150"; 119 | $fa-var-caret-square-o-left: "\f191"; 120 | $fa-var-caret-square-o-right: "\f152"; 121 | $fa-var-caret-square-o-up: "\f151"; 122 | $fa-var-caret-up: "\f0d8"; 123 | $fa-var-cart-arrow-down: "\f218"; 124 | $fa-var-cart-plus: "\f217"; 125 | $fa-var-cc: "\f20a"; 126 | $fa-var-cc-amex: "\f1f3"; 127 | $fa-var-cc-diners-club: "\f24c"; 128 | $fa-var-cc-discover: "\f1f2"; 129 | $fa-var-cc-jcb: "\f24b"; 130 | $fa-var-cc-mastercard: "\f1f1"; 131 | $fa-var-cc-paypal: "\f1f4"; 132 | $fa-var-cc-stripe: "\f1f5"; 133 | $fa-var-cc-visa: "\f1f0"; 134 | $fa-var-certificate: "\f0a3"; 135 | $fa-var-chain: "\f0c1"; 136 | $fa-var-chain-broken: "\f127"; 137 | $fa-var-check: "\f00c"; 138 | $fa-var-check-circle: "\f058"; 139 | $fa-var-check-circle-o: "\f05d"; 140 | $fa-var-check-square: "\f14a"; 141 | $fa-var-check-square-o: "\f046"; 142 | $fa-var-chevron-circle-down: "\f13a"; 143 | $fa-var-chevron-circle-left: "\f137"; 144 | $fa-var-chevron-circle-right: "\f138"; 145 | $fa-var-chevron-circle-up: "\f139"; 146 | $fa-var-chevron-down: "\f078"; 147 | $fa-var-chevron-left: "\f053"; 148 | $fa-var-chevron-right: "\f054"; 149 | $fa-var-chevron-up: "\f077"; 150 | $fa-var-child: "\f1ae"; 151 | $fa-var-chrome: "\f268"; 152 | $fa-var-circle: "\f111"; 153 | $fa-var-circle-o: "\f10c"; 154 | $fa-var-circle-o-notch: "\f1ce"; 155 | $fa-var-circle-thin: "\f1db"; 156 | $fa-var-clipboard: "\f0ea"; 157 | $fa-var-clock-o: "\f017"; 158 | $fa-var-clone: "\f24d"; 159 | $fa-var-close: "\f00d"; 160 | $fa-var-cloud: "\f0c2"; 161 | $fa-var-cloud-download: "\f0ed"; 162 | $fa-var-cloud-upload: "\f0ee"; 163 | $fa-var-cny: "\f157"; 164 | $fa-var-code: "\f121"; 165 | $fa-var-code-fork: "\f126"; 166 | $fa-var-codepen: "\f1cb"; 167 | $fa-var-coffee: "\f0f4"; 168 | $fa-var-cog: "\f013"; 169 | $fa-var-cogs: "\f085"; 170 | $fa-var-columns: "\f0db"; 171 | $fa-var-comment: "\f075"; 172 | $fa-var-comment-o: "\f0e5"; 173 | $fa-var-commenting: "\f27a"; 174 | $fa-var-commenting-o: "\f27b"; 175 | $fa-var-comments: "\f086"; 176 | $fa-var-comments-o: "\f0e6"; 177 | $fa-var-compass: "\f14e"; 178 | $fa-var-compress: "\f066"; 179 | $fa-var-connectdevelop: "\f20e"; 180 | $fa-var-contao: "\f26d"; 181 | $fa-var-copy: "\f0c5"; 182 | $fa-var-copyright: "\f1f9"; 183 | $fa-var-creative-commons: "\f25e"; 184 | $fa-var-credit-card: "\f09d"; 185 | $fa-var-crop: "\f125"; 186 | $fa-var-crosshairs: "\f05b"; 187 | $fa-var-css3: "\f13c"; 188 | $fa-var-cube: "\f1b2"; 189 | $fa-var-cubes: "\f1b3"; 190 | $fa-var-cut: "\f0c4"; 191 | $fa-var-cutlery: "\f0f5"; 192 | $fa-var-dashboard: "\f0e4"; 193 | $fa-var-dashcube: "\f210"; 194 | $fa-var-database: "\f1c0"; 195 | $fa-var-dedent: "\f03b"; 196 | $fa-var-delicious: "\f1a5"; 197 | $fa-var-desktop: "\f108"; 198 | $fa-var-deviantart: "\f1bd"; 199 | $fa-var-diamond: "\f219"; 200 | $fa-var-digg: "\f1a6"; 201 | $fa-var-dollar: "\f155"; 202 | $fa-var-dot-circle-o: "\f192"; 203 | $fa-var-download: "\f019"; 204 | $fa-var-dribbble: "\f17d"; 205 | $fa-var-dropbox: "\f16b"; 206 | $fa-var-drupal: "\f1a9"; 207 | $fa-var-edit: "\f044"; 208 | $fa-var-eject: "\f052"; 209 | $fa-var-ellipsis-h: "\f141"; 210 | $fa-var-ellipsis-v: "\f142"; 211 | $fa-var-empire: "\f1d1"; 212 | $fa-var-envelope: "\f0e0"; 213 | $fa-var-envelope-o: "\f003"; 214 | $fa-var-envelope-square: "\f199"; 215 | $fa-var-eraser: "\f12d"; 216 | $fa-var-eur: "\f153"; 217 | $fa-var-euro: "\f153"; 218 | $fa-var-exchange: "\f0ec"; 219 | $fa-var-exclamation: "\f12a"; 220 | $fa-var-exclamation-circle: "\f06a"; 221 | $fa-var-exclamation-triangle: "\f071"; 222 | $fa-var-expand: "\f065"; 223 | $fa-var-expeditedssl: "\f23e"; 224 | $fa-var-external-link: "\f08e"; 225 | $fa-var-external-link-square: "\f14c"; 226 | $fa-var-eye: "\f06e"; 227 | $fa-var-eye-slash: "\f070"; 228 | $fa-var-eyedropper: "\f1fb"; 229 | $fa-var-facebook: "\f09a"; 230 | $fa-var-facebook-f: "\f09a"; 231 | $fa-var-facebook-official: "\f230"; 232 | $fa-var-facebook-square: "\f082"; 233 | $fa-var-fast-backward: "\f049"; 234 | $fa-var-fast-forward: "\f050"; 235 | $fa-var-fax: "\f1ac"; 236 | $fa-var-feed: "\f09e"; 237 | $fa-var-female: "\f182"; 238 | $fa-var-fighter-jet: "\f0fb"; 239 | $fa-var-file: "\f15b"; 240 | $fa-var-file-archive-o: "\f1c6"; 241 | $fa-var-file-audio-o: "\f1c7"; 242 | $fa-var-file-code-o: "\f1c9"; 243 | $fa-var-file-excel-o: "\f1c3"; 244 | $fa-var-file-image-o: "\f1c5"; 245 | $fa-var-file-movie-o: "\f1c8"; 246 | $fa-var-file-o: "\f016"; 247 | $fa-var-file-pdf-o: "\f1c1"; 248 | $fa-var-file-photo-o: "\f1c5"; 249 | $fa-var-file-picture-o: "\f1c5"; 250 | $fa-var-file-powerpoint-o: "\f1c4"; 251 | $fa-var-file-sound-o: "\f1c7"; 252 | $fa-var-file-text: "\f15c"; 253 | $fa-var-file-text-o: "\f0f6"; 254 | $fa-var-file-video-o: "\f1c8"; 255 | $fa-var-file-word-o: "\f1c2"; 256 | $fa-var-file-zip-o: "\f1c6"; 257 | $fa-var-files-o: "\f0c5"; 258 | $fa-var-film: "\f008"; 259 | $fa-var-filter: "\f0b0"; 260 | $fa-var-fire: "\f06d"; 261 | $fa-var-fire-extinguisher: "\f134"; 262 | $fa-var-firefox: "\f269"; 263 | $fa-var-flag: "\f024"; 264 | $fa-var-flag-checkered: "\f11e"; 265 | $fa-var-flag-o: "\f11d"; 266 | $fa-var-flash: "\f0e7"; 267 | $fa-var-flask: "\f0c3"; 268 | $fa-var-flickr: "\f16e"; 269 | $fa-var-floppy-o: "\f0c7"; 270 | $fa-var-folder: "\f07b"; 271 | $fa-var-folder-o: "\f114"; 272 | $fa-var-folder-open: "\f07c"; 273 | $fa-var-folder-open-o: "\f115"; 274 | $fa-var-font: "\f031"; 275 | $fa-var-fonticons: "\f280"; 276 | $fa-var-forumbee: "\f211"; 277 | $fa-var-forward: "\f04e"; 278 | $fa-var-foursquare: "\f180"; 279 | $fa-var-frown-o: "\f119"; 280 | $fa-var-futbol-o: "\f1e3"; 281 | $fa-var-gamepad: "\f11b"; 282 | $fa-var-gavel: "\f0e3"; 283 | $fa-var-gbp: "\f154"; 284 | $fa-var-ge: "\f1d1"; 285 | $fa-var-gear: "\f013"; 286 | $fa-var-gears: "\f085"; 287 | $fa-var-genderless: "\f22d"; 288 | $fa-var-get-pocket: "\f265"; 289 | $fa-var-gg: "\f260"; 290 | $fa-var-gg-circle: "\f261"; 291 | $fa-var-gift: "\f06b"; 292 | $fa-var-git: "\f1d3"; 293 | $fa-var-git-square: "\f1d2"; 294 | $fa-var-github: "\f09b"; 295 | $fa-var-github-alt: "\f113"; 296 | $fa-var-github-square: "\f092"; 297 | $fa-var-gittip: "\f184"; 298 | $fa-var-glass: "\f000"; 299 | $fa-var-globe: "\f0ac"; 300 | $fa-var-google: "\f1a0"; 301 | $fa-var-google-plus: "\f0d5"; 302 | $fa-var-google-plus-square: "\f0d4"; 303 | $fa-var-google-wallet: "\f1ee"; 304 | $fa-var-graduation-cap: "\f19d"; 305 | $fa-var-gratipay: "\f184"; 306 | $fa-var-group: "\f0c0"; 307 | $fa-var-h-square: "\f0fd"; 308 | $fa-var-hacker-news: "\f1d4"; 309 | $fa-var-hand-grab-o: "\f255"; 310 | $fa-var-hand-lizard-o: "\f258"; 311 | $fa-var-hand-o-down: "\f0a7"; 312 | $fa-var-hand-o-left: "\f0a5"; 313 | $fa-var-hand-o-right: "\f0a4"; 314 | $fa-var-hand-o-up: "\f0a6"; 315 | $fa-var-hand-paper-o: "\f256"; 316 | $fa-var-hand-peace-o: "\f25b"; 317 | $fa-var-hand-pointer-o: "\f25a"; 318 | $fa-var-hand-rock-o: "\f255"; 319 | $fa-var-hand-scissors-o: "\f257"; 320 | $fa-var-hand-spock-o: "\f259"; 321 | $fa-var-hand-stop-o: "\f256"; 322 | $fa-var-hdd-o: "\f0a0"; 323 | $fa-var-header: "\f1dc"; 324 | $fa-var-headphones: "\f025"; 325 | $fa-var-heart: "\f004"; 326 | $fa-var-heart-o: "\f08a"; 327 | $fa-var-heartbeat: "\f21e"; 328 | $fa-var-history: "\f1da"; 329 | $fa-var-home: "\f015"; 330 | $fa-var-hospital-o: "\f0f8"; 331 | $fa-var-hotel: "\f236"; 332 | $fa-var-hourglass: "\f254"; 333 | $fa-var-hourglass-1: "\f251"; 334 | $fa-var-hourglass-2: "\f252"; 335 | $fa-var-hourglass-3: "\f253"; 336 | $fa-var-hourglass-end: "\f253"; 337 | $fa-var-hourglass-half: "\f252"; 338 | $fa-var-hourglass-o: "\f250"; 339 | $fa-var-hourglass-start: "\f251"; 340 | $fa-var-houzz: "\f27c"; 341 | $fa-var-html5: "\f13b"; 342 | $fa-var-i-cursor: "\f246"; 343 | $fa-var-ils: "\f20b"; 344 | $fa-var-image: "\f03e"; 345 | $fa-var-inbox: "\f01c"; 346 | $fa-var-indent: "\f03c"; 347 | $fa-var-industry: "\f275"; 348 | $fa-var-info: "\f129"; 349 | $fa-var-info-circle: "\f05a"; 350 | $fa-var-inr: "\f156"; 351 | $fa-var-instagram: "\f16d"; 352 | $fa-var-institution: "\f19c"; 353 | $fa-var-internet-explorer: "\f26b"; 354 | $fa-var-intersex: "\f224"; 355 | $fa-var-ioxhost: "\f208"; 356 | $fa-var-italic: "\f033"; 357 | $fa-var-joomla: "\f1aa"; 358 | $fa-var-jpy: "\f157"; 359 | $fa-var-jsfiddle: "\f1cc"; 360 | $fa-var-key: "\f084"; 361 | $fa-var-keyboard-o: "\f11c"; 362 | $fa-var-krw: "\f159"; 363 | $fa-var-language: "\f1ab"; 364 | $fa-var-laptop: "\f109"; 365 | $fa-var-lastfm: "\f202"; 366 | $fa-var-lastfm-square: "\f203"; 367 | $fa-var-leaf: "\f06c"; 368 | $fa-var-leanpub: "\f212"; 369 | $fa-var-legal: "\f0e3"; 370 | $fa-var-lemon-o: "\f094"; 371 | $fa-var-level-down: "\f149"; 372 | $fa-var-level-up: "\f148"; 373 | $fa-var-life-bouy: "\f1cd"; 374 | $fa-var-life-buoy: "\f1cd"; 375 | $fa-var-life-ring: "\f1cd"; 376 | $fa-var-life-saver: "\f1cd"; 377 | $fa-var-lightbulb-o: "\f0eb"; 378 | $fa-var-line-chart: "\f201"; 379 | $fa-var-link: "\f0c1"; 380 | $fa-var-linkedin: "\f0e1"; 381 | $fa-var-linkedin-square: "\f08c"; 382 | $fa-var-linux: "\f17c"; 383 | $fa-var-list: "\f03a"; 384 | $fa-var-list-alt: "\f022"; 385 | $fa-var-list-ol: "\f0cb"; 386 | $fa-var-list-ul: "\f0ca"; 387 | $fa-var-location-arrow: "\f124"; 388 | $fa-var-lock: "\f023"; 389 | $fa-var-long-arrow-down: "\f175"; 390 | $fa-var-long-arrow-left: "\f177"; 391 | $fa-var-long-arrow-right: "\f178"; 392 | $fa-var-long-arrow-up: "\f176"; 393 | $fa-var-magic: "\f0d0"; 394 | $fa-var-magnet: "\f076"; 395 | $fa-var-mail-forward: "\f064"; 396 | $fa-var-mail-reply: "\f112"; 397 | $fa-var-mail-reply-all: "\f122"; 398 | $fa-var-male: "\f183"; 399 | $fa-var-map: "\f279"; 400 | $fa-var-map-marker: "\f041"; 401 | $fa-var-map-o: "\f278"; 402 | $fa-var-map-pin: "\f276"; 403 | $fa-var-map-signs: "\f277"; 404 | $fa-var-mars: "\f222"; 405 | $fa-var-mars-double: "\f227"; 406 | $fa-var-mars-stroke: "\f229"; 407 | $fa-var-mars-stroke-h: "\f22b"; 408 | $fa-var-mars-stroke-v: "\f22a"; 409 | $fa-var-maxcdn: "\f136"; 410 | $fa-var-meanpath: "\f20c"; 411 | $fa-var-medium: "\f23a"; 412 | $fa-var-medkit: "\f0fa"; 413 | $fa-var-meh-o: "\f11a"; 414 | $fa-var-mercury: "\f223"; 415 | $fa-var-microphone: "\f130"; 416 | $fa-var-microphone-slash: "\f131"; 417 | $fa-var-minus: "\f068"; 418 | $fa-var-minus-circle: "\f056"; 419 | $fa-var-minus-square: "\f146"; 420 | $fa-var-minus-square-o: "\f147"; 421 | $fa-var-mobile: "\f10b"; 422 | $fa-var-mobile-phone: "\f10b"; 423 | $fa-var-money: "\f0d6"; 424 | $fa-var-moon-o: "\f186"; 425 | $fa-var-mortar-board: "\f19d"; 426 | $fa-var-motorcycle: "\f21c"; 427 | $fa-var-mouse-pointer: "\f245"; 428 | $fa-var-music: "\f001"; 429 | $fa-var-navicon: "\f0c9"; 430 | $fa-var-neuter: "\f22c"; 431 | $fa-var-newspaper-o: "\f1ea"; 432 | $fa-var-object-group: "\f247"; 433 | $fa-var-object-ungroup: "\f248"; 434 | $fa-var-odnoklassniki: "\f263"; 435 | $fa-var-odnoklassniki-square: "\f264"; 436 | $fa-var-opencart: "\f23d"; 437 | $fa-var-openid: "\f19b"; 438 | $fa-var-opera: "\f26a"; 439 | $fa-var-optin-monster: "\f23c"; 440 | $fa-var-outdent: "\f03b"; 441 | $fa-var-pagelines: "\f18c"; 442 | $fa-var-paint-brush: "\f1fc"; 443 | $fa-var-paper-plane: "\f1d8"; 444 | $fa-var-paper-plane-o: "\f1d9"; 445 | $fa-var-paperclip: "\f0c6"; 446 | $fa-var-paragraph: "\f1dd"; 447 | $fa-var-paste: "\f0ea"; 448 | $fa-var-pause: "\f04c"; 449 | $fa-var-paw: "\f1b0"; 450 | $fa-var-paypal: "\f1ed"; 451 | $fa-var-pencil: "\f040"; 452 | $fa-var-pencil-square: "\f14b"; 453 | $fa-var-pencil-square-o: "\f044"; 454 | $fa-var-phone: "\f095"; 455 | $fa-var-phone-square: "\f098"; 456 | $fa-var-photo: "\f03e"; 457 | $fa-var-picture-o: "\f03e"; 458 | $fa-var-pie-chart: "\f200"; 459 | $fa-var-pied-piper: "\f1a7"; 460 | $fa-var-pied-piper-alt: "\f1a8"; 461 | $fa-var-pinterest: "\f0d2"; 462 | $fa-var-pinterest-p: "\f231"; 463 | $fa-var-pinterest-square: "\f0d3"; 464 | $fa-var-plane: "\f072"; 465 | $fa-var-play: "\f04b"; 466 | $fa-var-play-circle: "\f144"; 467 | $fa-var-play-circle-o: "\f01d"; 468 | $fa-var-plug: "\f1e6"; 469 | $fa-var-plus: "\f067"; 470 | $fa-var-plus-circle: "\f055"; 471 | $fa-var-plus-square: "\f0fe"; 472 | $fa-var-plus-square-o: "\f196"; 473 | $fa-var-power-off: "\f011"; 474 | $fa-var-print: "\f02f"; 475 | $fa-var-puzzle-piece: "\f12e"; 476 | $fa-var-qq: "\f1d6"; 477 | $fa-var-qrcode: "\f029"; 478 | $fa-var-question: "\f128"; 479 | $fa-var-question-circle: "\f059"; 480 | $fa-var-quote-left: "\f10d"; 481 | $fa-var-quote-right: "\f10e"; 482 | $fa-var-ra: "\f1d0"; 483 | $fa-var-random: "\f074"; 484 | $fa-var-rebel: "\f1d0"; 485 | $fa-var-recycle: "\f1b8"; 486 | $fa-var-reddit: "\f1a1"; 487 | $fa-var-reddit-square: "\f1a2"; 488 | $fa-var-refresh: "\f021"; 489 | $fa-var-registered: "\f25d"; 490 | $fa-var-remove: "\f00d"; 491 | $fa-var-renren: "\f18b"; 492 | $fa-var-reorder: "\f0c9"; 493 | $fa-var-repeat: "\f01e"; 494 | $fa-var-reply: "\f112"; 495 | $fa-var-reply-all: "\f122"; 496 | $fa-var-retweet: "\f079"; 497 | $fa-var-rmb: "\f157"; 498 | $fa-var-road: "\f018"; 499 | $fa-var-rocket: "\f135"; 500 | $fa-var-rotate-left: "\f0e2"; 501 | $fa-var-rotate-right: "\f01e"; 502 | $fa-var-rouble: "\f158"; 503 | $fa-var-rss: "\f09e"; 504 | $fa-var-rss-square: "\f143"; 505 | $fa-var-rub: "\f158"; 506 | $fa-var-ruble: "\f158"; 507 | $fa-var-rupee: "\f156"; 508 | $fa-var-safari: "\f267"; 509 | $fa-var-save: "\f0c7"; 510 | $fa-var-scissors: "\f0c4"; 511 | $fa-var-search: "\f002"; 512 | $fa-var-search-minus: "\f010"; 513 | $fa-var-search-plus: "\f00e"; 514 | $fa-var-sellsy: "\f213"; 515 | $fa-var-send: "\f1d8"; 516 | $fa-var-send-o: "\f1d9"; 517 | $fa-var-server: "\f233"; 518 | $fa-var-share: "\f064"; 519 | $fa-var-share-alt: "\f1e0"; 520 | $fa-var-share-alt-square: "\f1e1"; 521 | $fa-var-share-square: "\f14d"; 522 | $fa-var-share-square-o: "\f045"; 523 | $fa-var-shekel: "\f20b"; 524 | $fa-var-sheqel: "\f20b"; 525 | $fa-var-shield: "\f132"; 526 | $fa-var-ship: "\f21a"; 527 | $fa-var-shirtsinbulk: "\f214"; 528 | $fa-var-shopping-cart: "\f07a"; 529 | $fa-var-sign-in: "\f090"; 530 | $fa-var-sign-out: "\f08b"; 531 | $fa-var-signal: "\f012"; 532 | $fa-var-simplybuilt: "\f215"; 533 | $fa-var-sitemap: "\f0e8"; 534 | $fa-var-skyatlas: "\f216"; 535 | $fa-var-skype: "\f17e"; 536 | $fa-var-slack: "\f198"; 537 | $fa-var-sliders: "\f1de"; 538 | $fa-var-slideshare: "\f1e7"; 539 | $fa-var-smile-o: "\f118"; 540 | $fa-var-soccer-ball-o: "\f1e3"; 541 | $fa-var-sort: "\f0dc"; 542 | $fa-var-sort-alpha-asc: "\f15d"; 543 | $fa-var-sort-alpha-desc: "\f15e"; 544 | $fa-var-sort-amount-asc: "\f160"; 545 | $fa-var-sort-amount-desc: "\f161"; 546 | $fa-var-sort-asc: "\f0de"; 547 | $fa-var-sort-desc: "\f0dd"; 548 | $fa-var-sort-down: "\f0dd"; 549 | $fa-var-sort-numeric-asc: "\f162"; 550 | $fa-var-sort-numeric-desc: "\f163"; 551 | $fa-var-sort-up: "\f0de"; 552 | $fa-var-soundcloud: "\f1be"; 553 | $fa-var-space-shuttle: "\f197"; 554 | $fa-var-spinner: "\f110"; 555 | $fa-var-spoon: "\f1b1"; 556 | $fa-var-spotify: "\f1bc"; 557 | $fa-var-square: "\f0c8"; 558 | $fa-var-square-o: "\f096"; 559 | $fa-var-stack-exchange: "\f18d"; 560 | $fa-var-stack-overflow: "\f16c"; 561 | $fa-var-star: "\f005"; 562 | $fa-var-star-half: "\f089"; 563 | $fa-var-star-half-empty: "\f123"; 564 | $fa-var-star-half-full: "\f123"; 565 | $fa-var-star-half-o: "\f123"; 566 | $fa-var-star-o: "\f006"; 567 | $fa-var-steam: "\f1b6"; 568 | $fa-var-steam-square: "\f1b7"; 569 | $fa-var-step-backward: "\f048"; 570 | $fa-var-step-forward: "\f051"; 571 | $fa-var-stethoscope: "\f0f1"; 572 | $fa-var-sticky-note: "\f249"; 573 | $fa-var-sticky-note-o: "\f24a"; 574 | $fa-var-stop: "\f04d"; 575 | $fa-var-street-view: "\f21d"; 576 | $fa-var-strikethrough: "\f0cc"; 577 | $fa-var-stumbleupon: "\f1a4"; 578 | $fa-var-stumbleupon-circle: "\f1a3"; 579 | $fa-var-subscript: "\f12c"; 580 | $fa-var-subway: "\f239"; 581 | $fa-var-suitcase: "\f0f2"; 582 | $fa-var-sun-o: "\f185"; 583 | $fa-var-superscript: "\f12b"; 584 | $fa-var-support: "\f1cd"; 585 | $fa-var-table: "\f0ce"; 586 | $fa-var-tablet: "\f10a"; 587 | $fa-var-tachometer: "\f0e4"; 588 | $fa-var-tag: "\f02b"; 589 | $fa-var-tags: "\f02c"; 590 | $fa-var-tasks: "\f0ae"; 591 | $fa-var-taxi: "\f1ba"; 592 | $fa-var-television: "\f26c"; 593 | $fa-var-tencent-weibo: "\f1d5"; 594 | $fa-var-terminal: "\f120"; 595 | $fa-var-text-height: "\f034"; 596 | $fa-var-text-width: "\f035"; 597 | $fa-var-th: "\f00a"; 598 | $fa-var-th-large: "\f009"; 599 | $fa-var-th-list: "\f00b"; 600 | $fa-var-thumb-tack: "\f08d"; 601 | $fa-var-thumbs-down: "\f165"; 602 | $fa-var-thumbs-o-down: "\f088"; 603 | $fa-var-thumbs-o-up: "\f087"; 604 | $fa-var-thumbs-up: "\f164"; 605 | $fa-var-ticket: "\f145"; 606 | $fa-var-times: "\f00d"; 607 | $fa-var-times-circle: "\f057"; 608 | $fa-var-times-circle-o: "\f05c"; 609 | $fa-var-tint: "\f043"; 610 | $fa-var-toggle-down: "\f150"; 611 | $fa-var-toggle-left: "\f191"; 612 | $fa-var-toggle-off: "\f204"; 613 | $fa-var-toggle-on: "\f205"; 614 | $fa-var-toggle-right: "\f152"; 615 | $fa-var-toggle-up: "\f151"; 616 | $fa-var-trademark: "\f25c"; 617 | $fa-var-train: "\f238"; 618 | $fa-var-transgender: "\f224"; 619 | $fa-var-transgender-alt: "\f225"; 620 | $fa-var-trash: "\f1f8"; 621 | $fa-var-trash-o: "\f014"; 622 | $fa-var-tree: "\f1bb"; 623 | $fa-var-trello: "\f181"; 624 | $fa-var-tripadvisor: "\f262"; 625 | $fa-var-trophy: "\f091"; 626 | $fa-var-truck: "\f0d1"; 627 | $fa-var-try: "\f195"; 628 | $fa-var-tty: "\f1e4"; 629 | $fa-var-tumblr: "\f173"; 630 | $fa-var-tumblr-square: "\f174"; 631 | $fa-var-turkish-lira: "\f195"; 632 | $fa-var-tv: "\f26c"; 633 | $fa-var-twitch: "\f1e8"; 634 | $fa-var-twitter: "\f099"; 635 | $fa-var-twitter-square: "\f081"; 636 | $fa-var-umbrella: "\f0e9"; 637 | $fa-var-underline: "\f0cd"; 638 | $fa-var-undo: "\f0e2"; 639 | $fa-var-university: "\f19c"; 640 | $fa-var-unlink: "\f127"; 641 | $fa-var-unlock: "\f09c"; 642 | $fa-var-unlock-alt: "\f13e"; 643 | $fa-var-unsorted: "\f0dc"; 644 | $fa-var-upload: "\f093"; 645 | $fa-var-usd: "\f155"; 646 | $fa-var-user: "\f007"; 647 | $fa-var-user-md: "\f0f0"; 648 | $fa-var-user-plus: "\f234"; 649 | $fa-var-user-secret: "\f21b"; 650 | $fa-var-user-times: "\f235"; 651 | $fa-var-users: "\f0c0"; 652 | $fa-var-venus: "\f221"; 653 | $fa-var-venus-double: "\f226"; 654 | $fa-var-venus-mars: "\f228"; 655 | $fa-var-viacoin: "\f237"; 656 | $fa-var-video-camera: "\f03d"; 657 | $fa-var-vimeo: "\f27d"; 658 | $fa-var-vimeo-square: "\f194"; 659 | $fa-var-vine: "\f1ca"; 660 | $fa-var-vk: "\f189"; 661 | $fa-var-volume-down: "\f027"; 662 | $fa-var-volume-off: "\f026"; 663 | $fa-var-volume-up: "\f028"; 664 | $fa-var-warning: "\f071"; 665 | $fa-var-wechat: "\f1d7"; 666 | $fa-var-weibo: "\f18a"; 667 | $fa-var-weixin: "\f1d7"; 668 | $fa-var-whatsapp: "\f232"; 669 | $fa-var-wheelchair: "\f193"; 670 | $fa-var-wifi: "\f1eb"; 671 | $fa-var-wikipedia-w: "\f266"; 672 | $fa-var-windows: "\f17a"; 673 | $fa-var-won: "\f159"; 674 | $fa-var-wordpress: "\f19a"; 675 | $fa-var-wrench: "\f0ad"; 676 | $fa-var-xing: "\f168"; 677 | $fa-var-xing-square: "\f169"; 678 | $fa-var-y-combinator: "\f23b"; 679 | $fa-var-y-combinator-square: "\f1d4"; 680 | $fa-var-yahoo: "\f19e"; 681 | $fa-var-yc: "\f23b"; 682 | $fa-var-yc-square: "\f1d4"; 683 | $fa-var-yelp: "\f1e9"; 684 | $fa-var-yen: "\f157"; 685 | $fa-var-youtube: "\f167"; 686 | $fa-var-youtube-play: "\f16a"; 687 | $fa-var-youtube-square: "\f166"; 688 | 689 | -------------------------------------------------------------------------------- /tools/vendors/font-awesome-4.4.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /tools/vendors/underscore.min.js: -------------------------------------------------------------------------------- 1 | // Underscore.js 1.8.3 2 | // http://underscorejs.org 3 | // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 | // Underscore may be freely distributed under the MIT license. 5 | (function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); 6 | //# sourceMappingURL=underscore-min.map 7 | --------------------------------------------------------------------------------