├── 1970 ├── ├── ├── README.md ├── a.md └── breadcrumb-glitches.png ├── " ├── ";alert("xss");" ├── # ├── ' ├── ';alert("xss");' ├── - ├── -- ├── -start-with-slash ├── .* ├── ... ├── .bzrignore ├── .drone.yml ├── .github ├── ISSUE_TEMPLATE │ ├── template0.md │ └── template1.md └── workflows │ └── issue.yml ├── .gitignore ├── : ├── ; ├── ;alert("xss"); ├── ;alert('xss'); ├── 306 | 307 | `
a
`: 308 | 309 |
a
310 | 311 | ``: 312 | 313 | 314 | 315 | ### Entities 316 | 317 | `#`: # 318 | 319 | `Ӓ`: Ӓ 320 | 321 | `Ϡ`: Ϡ 322 | 323 | `�`: � 324 | 325 | ## XSS 326 | 327 | err 328 | 329 | For compilers that treat `h1` magically (e.g. add to a TOC): 330 | 331 | # 332 | 333 | ## LaTeX 334 | 335 | https://docs.gitlab.com/ee/user/markdown.html#math 336 | 337 | This math is inline $`a^2+b^2=c^2`$. 338 | 339 | This is on a separate line: 340 | 341 | ```math 342 | a^2+b^2=c^2 343 | ``` 344 | -------------------------------------------------------------------------------- /mirrors.md: -------------------------------------------------------------------------------- 1 | # Mirrors 2 | 3 | This repository is mirrored at: 4 | 5 | - . Runs on [Girocco](http://repo.or.cz/w/girocco.git). TODO get working. 6 | - 7 | - Company called Wildbit. builtwith.com and job offerings say Rails. 8 | - . By Microsoft. Rejects this repo because of the future-max commit, so I made placeholder to squat the project name. 9 | - . Unable to use it for now: 10 | - 11 | - 12 | - 13 | - (500 initially ) 14 | - 15 | - 16 | 17 | Mirrors without public view: 18 | 19 | - 20 | - 21 | 22 | Mirrors without repository browsing: 23 | 24 | - 25 | 26 | Mirrors for which I can't create projects: 27 | 28 | - 29 | 30 | Discontinued: 31 | 32 | - (to be closed) 33 | - , bough by GitLab. Will remain read only. 34 | 35 | Web interfaces without public hosting service that I know of. Huge list: Some interesting ones: 36 | 37 | - Gitweb. Distributed with Git. The Perl one. 38 | - cgit. Official self-host: , GitHub mirror: . Used by GNU Savannah. Written in C. 39 | - Gerrit. The Java one. , 40 | - GitList. The PHP one. 41 | - WebGitNet. The .Net one. 42 | - Gogs. The Go one. Modified version at: 43 | 44 | The SSH of those repos can be found at: [remotes.sh](remotes.sh), including other repos which don't have public view like Atlas. 45 | -------------------------------------------------------------------------------- /new-name-same-email: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/new-name-same-email -------------------------------------------------------------------------------- /no-preview: -------------------------------------------------------------------------------- 1 | ab -------------------------------------------------------------------------------- /noext: -------------------------------------------------------------------------------- 1 | def a 2 | return 1 + 1 3 | end 4 | -------------------------------------------------------------------------------- /objects/17/3a852893f2dac5b79dd5862e5a032777477567: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/17/3a852893f2dac5b79dd5862e5a032777477567 -------------------------------------------------------------------------------- /objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba -------------------------------------------------------------------------------- /objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 -------------------------------------------------------------------------------- /ordered-list-with-list-bug.md: -------------------------------------------------------------------------------- 1 | 1. 1 2 | 3 | - inner par list 4 | 5 | 2. 2 6 | 7 | nested list without paragraphs: 8 | 9 | 1. 1 10 | - list without par 11 | 2. 2 12 | 13 | nested paragraph: 14 | 15 | 1. 1 16 | 17 | par 18 | 19 | 2. 2 20 | 21 | nested code block: 22 | 23 | 1. 1 24 | 25 | code block 26 | 27 | 2. 2 28 | 29 | nested ordered list: 30 | 31 | 1. 1 32 | 33 | 1. 1 34 | 35 | 2. 2 36 | 37 | -------------------------------------------------------------------------------- /other-cms.md: -------------------------------------------------------------------------------- 1 | # Other CMS 2 | 3 | - `bzr`: cannot handle the path with a single backslash \. 4 | -------------------------------------------------------------------------------- /other-test-repos/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | /tmp/ 3 | /*.tmp/ 4 | __pycache__/ 5 | -------------------------------------------------------------------------------- /other-test-repos/README.md: -------------------------------------------------------------------------------- 1 | # Other test repositories 2 | 3 | Scripts in this directory can be used to generate the more complex test repositories. 4 | 5 | Tests that are very large will not be included here to keep this repository small: 6 | 7 | - 8 | - 9 | - 10 | - 11 | - [many-commits.py](many-commits-fast-import.py) superior 12 | - [many-commits.py](many-commits.py) inferior 13 | - 14 | - 15 | - 16 | 17 | There are also some tests that could not be included here conveniently: 18 | 19 | - ANSI art in the author field, too disruptive to the `git log`, even for this repo! 20 | - 21 | - 22 | - 23 | - 24 | - : [partial-clone.sh](partial-clone.sh) | https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934 25 | - : [filter-repo.sh](filter-repo.sh) 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - , , [streak.py](streak.py), 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - (fails on GitHub) 40 | - 41 | - 42 | 43 | Other similar repos from other people: 44 | 45 | - 46 | 47 | Other useful things: 48 | 49 | - . May contain some extra semi-internal information. 50 | 51 | - 52 | - GitHub is hosted on Carpathia 53 | - GitHub uses Mac? 54 | -------------------------------------------------------------------------------- /other-test-repos/commit-meta.bashrc: -------------------------------------------------------------------------------- 1 | # Fixed commit metadata. 2 | date='2000-01-01T00:00:00+0000' 3 | email='a@a.com' 4 | name='a' 5 | export GIT_AUTHOR_DATE="$date" 6 | export GIT_AUTHOR_EMAIL="$email" 7 | export GIT_AUTHOR_NAME="$name" 8 | export GIT_COMMITTER_DATE="$date" 9 | export GIT_COMMITTER_EMAIL="$email" 10 | export GIT_COMMITTER_NAME="$name" 11 | -------------------------------------------------------------------------------- /other-test-repos/duplicate-parent-lowlevel.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Git does not let a commit have twice the same parent, but GitHub does, and normally shows it. 5 | But as of 2016-05-17 they didn't page this edge case, and it 502's the commit for large numbers of links. 6 | 7 | If you increase the value a lot, when you clone and cd into the repo. your computer may bog down 8 | if you show a git status on the bash, because Git memory explodes trying to parse that. 9 | Actual compressed size is very small though, since gzip compresses all that repeated data very efficiently. 10 | 11 | push would require an obscene ammount of memory (malloc fails on `ulimit -Sv`), so I couldn't test it. 12 | """ 13 | 14 | import itertools 15 | 16 | import util 17 | 18 | util.init() 19 | 20 | tree = util.create_tree_with_one_file() 21 | commit, _, _ = util.save_commit_object(tree, author_name=b'a') 22 | commit, _, _ = util.save_commit_object(tree, itertools.repeat(commit, 10000000), author_name=b'b') 23 | 24 | # Finish. 25 | util.create_master(commit) 26 | util.clone() 27 | -------------------------------------------------------------------------------- /other-test-repos/duplicate-parent.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | # Try to create a commit with two times it's parent with git-commit-tree 6 | # Outcome on Git 2.7: commit fails. Will try again with raw object creation from Python later on. 7 | 8 | . commit-meta.bashrc 9 | . init.bashrc 10 | 11 | # Directory parameters. 12 | blob_content='' 13 | blob_name='a' 14 | blob_mode='100644' 15 | dir_name='directory' 16 | 17 | # Blob. 18 | blob_sha="$(printf "$blob_content" | git hash-object --stdin -w)" 19 | 20 | # Tree. 21 | tree_sha="$(printf "\ 22 | $blob_mode blob $blob_sha\t$blob_name 23 | " | git mktree)" 24 | 25 | # Commit 1. 26 | commit_sha="$( \ 27 | git commit-tree -m 0 "$tree_sha")" 28 | git branch master "$commit_sha" 29 | 30 | # Commit 2 that has the duplicate parent. 31 | commit_sha="$(git commit-tree -m 1 -p "$commit_sha" -p "$commit_sha" "$tree_sha")" 32 | git update-ref master "$commit_sha" 33 | -------------------------------------------------------------------------------- /other-test-repos/filter-repo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # https://stackoverflow.com/questions/64160917/how-to-use-git-filter-repo-as-a-library-with-the-python-module-interface/64160918#64160918 4 | 5 | import git_filter_repo 6 | 7 | def blob_callback(blob, callback_metadata): 8 | blob.data = blob.data.replace(b'd1', b'asdf') 9 | 10 | # Args deduced from: 11 | # print(git_filter_repo.FilteringOptions.parse_args(['--refs', 'HEAD', '--force'], error_on_empty=False)) 12 | args = git_filter_repo.FilteringOptions.default_options() 13 | args.force = True 14 | args.partial = True 15 | args.refs = ['HEAD~..HEAD'] 16 | args.repack=False 17 | args.replace_refs='update-no-add' 18 | 19 | git_filter_repo.RepoFilter( 20 | args, 21 | blob_callback=blob_callback 22 | ).run() 23 | -------------------------------------------------------------------------------- /other-test-repos/filter-repo.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eu 3 | 4 | # Reproducibility. 5 | export GIT_COMMITTER_NAME='a' 6 | export GIT_COMMITTER_EMAIL='a' 7 | export GIT_AUTHOR_NAME='a' 8 | export GIT_AUTHOR_EMAIL='a' 9 | export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' 10 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000' 11 | 12 | # https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934 13 | rm -rf filter-repo.tmp 14 | mkdir -p filter-repo.tmp 15 | cd filter-repo.tmp 16 | git init 17 | 18 | # Create repo. 19 | git init --quiet 20 | 21 | # First commit. 22 | # Directories present in all branches. 23 | mkdir d1 d2 24 | printf 'd1/a' > ./d1/a 25 | printf 'd1/b' > ./d1/b 26 | printf 'd2/a' > ./d2/a 27 | printf 'd2/b' > ./d2/b 28 | # Present only in root. 29 | mkdir 'root' 30 | printf 'root' > ./root/root 31 | git add . 32 | git commit -m 'root' --quiet 33 | root_commmit_sha="$(git log -1 --format="%H")" 34 | 35 | # Second commit only on master. 36 | git rm --quiet -r ./root 37 | mkdir 'master' 38 | printf 'master' > ./master/master 39 | printf 'd1/a' > ./d1/a2 40 | git add . 41 | git commit -m 'master commit' --quiet 42 | 43 | # Third commit only on master. 44 | printf 'd1/b' > ./d1/b2 45 | git add . 46 | git commit -m 'master commit' --quiet 47 | 48 | # Second commit only on mybranch. 49 | git checkout -b mybranch --quiet "$root_commmit_sha" 50 | git rm --quiet -r ./root 51 | mkdir 'mybranch' 52 | printf 'mybranch' > ./mybranch/mybranch 53 | git add . 54 | git commit -m 'mybranch commit' --quiet 55 | 56 | # Restore master. 57 | git checkout --quiet master 58 | 59 | # To easily compare with the original repo. 60 | git remote add origin https://github.com/cirosantilli/test-git-filter-repository 61 | git fetch 62 | -------------------------------------------------------------------------------- /other-test-repos/finish-bare.bashrc: -------------------------------------------------------------------------------- 1 | git clone -q repo.tmp clone.tmp 2 | -------------------------------------------------------------------------------- /other-test-repos/imagine-all-the-people.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | TODO: remove invalid emails, at the very least those that contain newlines or <>, 5 | which make fsck fail. Those must have been pushed on a previous version of GitHub. 6 | 7 | A repository with one commit per commit email: 8 | https://github.com/cirosantilli/all-github-commit-emails 9 | 10 | As of 2015-12-31 , the generated repo is just under 1Gb, 11 | so under GitHub's soft max repo size limit. 12 | 13 | remote='git@github.com:cirosantilli/imagine-all-the-people.git' 14 | for i in `seq 10 10 100`; do 15 | git --git-dir=repo.tmp/.git push -f "$remote" "$i:master" 16 | done 17 | # TODO for some reason I needed this afterwards. 18 | git --git-dir=tmp/repo.tmp/.git push "$remote" 'master' 19 | """ 20 | 21 | import datetime 22 | import subprocess 23 | import time 24 | import os 25 | 26 | import util 27 | 28 | # data_dir_path = '/path/to/all-github-commit-emails/emails' 29 | data_dir_path = '/home/ciro/bak/git/all-github-commit-emails/emails' 30 | 31 | name = b'a' 32 | 33 | util.init() 34 | 35 | tree = util.create_tree_with_one_file() 36 | commit = None 37 | n = 1000000 38 | percent = (n / 100) 39 | p = 0 40 | i = 0 41 | 42 | data_paths = sorted(os.listdir(data_dir_path)) 43 | for data_path in data_paths: 44 | data_path = os.path.join(data_dir_path, data_path) 45 | with open(data_path, 'rb') as f: 46 | for line in f: 47 | email = line.rstrip()[:255] 48 | commit, _, _ = util.save_commit_object( 49 | tree, 50 | (commit,), 51 | author_email=email, 52 | committer_email=email, 53 | ) 54 | if i % percent == 0: 55 | print(p) 56 | print(email) 57 | print(datetime.datetime.now()) 58 | p += 1 59 | 60 | # Lose objects are too large and blow up the tmpfs. 61 | 62 | # Does clean packets, but the calculation takes more and more memory, 63 | # and slows down and blows up at the end. TODO which subcommand blows up eactly?. 64 | #subprocess.check_output(['git', 'gc']) 65 | 66 | subprocess.check_output(['git', 'repack']) 67 | subprocess.check_output(['git', 'prune-packed']) 68 | 69 | subprocess.check_output(['git', 'tag', str(p), commit]) 70 | i += 1 71 | if i == 100000: 72 | util.create_master(commit) 73 | -------------------------------------------------------------------------------- /other-test-repos/init.bashrc: -------------------------------------------------------------------------------- 1 | rm -rf repo.tmp clone.tmp 2 | mkdir -p repo.tmp 3 | cd repo.tmp 4 | git init -q 5 | -------------------------------------------------------------------------------- /other-test-repos/manual-sha-calculation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Create objects very manually to try and be faster than Git to generate large repos. 5 | """ 6 | 7 | import util 8 | 9 | util.init() 10 | 11 | # Directory parameters. 12 | blob_content = b'a' 13 | blob_basename = b'a' 14 | blob_mode = b'100644' 15 | 16 | # Commit parameters. 17 | name = b'a' 18 | email = b'a@a.com' 19 | # 2000-01-01T00:00:00+0000 20 | date = b'946684800 +0000' 21 | author_date = date 22 | author_email = email 23 | author_name = name 24 | committer_date = date 25 | committer_email = email 26 | committer_name = name 27 | message = b'a' 28 | # ASCII hex of parents. 29 | parents = () 30 | 31 | # Blob. 32 | blob_sha_ascii, blob_sha = util.save_object(b'blob', blob_content) 33 | # Check sha matches Git. 34 | blob_sha_git = util.get_git_hash_object(b'blob', blob_content) 35 | assert blob_sha_ascii == blob_sha_git 36 | 37 | # Tree. 38 | tree_sha_ascii, tree_sha, tree_content = util.save_tree_object(blob_mode, blob_basename, blob_sha) 39 | # Check sha matches Git. 40 | tree_sha_git = util.get_git_hash_object(b'tree', tree_content) 41 | assert tree_sha_ascii == tree_sha_git 42 | 43 | # Commit. 44 | commit_sha_ascii, commit_sha, commit_content = util.save_commit_object( 45 | tree_sha_ascii, parents, 46 | author_name, author_email, author_date, 47 | committer_name, committer_email, committer_date, 48 | message) 49 | commit_sha_git = util.get_git_hash_object(b'commit', commit_content) 50 | assert commit_sha_ascii == commit_sha_git 51 | 52 | # Finish. 53 | util.create_master(commit_sha_ascii) 54 | util.clone() 55 | -------------------------------------------------------------------------------- /other-test-repos/manual-sha-calculation.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | # This was an attempt to calculate SHAs manually. 6 | # It stopped halfway because Bash cannot store NUL characters in variables, 7 | # so we had to move to Python. 8 | 9 | . commit-meta.bashrc 10 | . init.bashrc 11 | 12 | # Directory parameters. 13 | blob_content='blob content' 14 | blob_name='file' 15 | blob_mode='100644' 16 | dir_name='directory' 17 | 18 | strlen() { 19 | printf "$1" | wc -c 20 | } 21 | 22 | sha_calc() { 23 | type="$1" 24 | content="$2" 25 | printf "${type} $(strlen "$content")\0${content}" | sha1sum 26 | } 27 | 28 | # Blob. 29 | blob_sha="$(printf "$blob_content" | git hash-object --stdin -w)" 30 | echo "$blob_sha" 31 | echo "$(sha_calc "blob" "$blob_content")" 32 | echo 33 | 34 | # Tree 1. 35 | sub_tree_sha="$(printf "\ 36 | $blob_mode blob $blob_sha\t$blob_name 37 | " | git mktree)" 38 | echo "$sub_tree_sha" 39 | # TODO the problem here is the null character 40 | # which is impossible for bash to put into a variable. 41 | echo "$(sha_calc "tree" "${blob_mode} ${blob_name}\0${blob_sha}")" 42 | echo 43 | 44 | # Tree 2. 45 | root_tree="$(printf "\ 46 | 040000 tree $sub_tree_sha\t$dir_name 47 | 100644 blob $blob_sha\t$blob_name 48 | " | git mktree)" 49 | 50 | commit="$(git commit-tree -m 0 "$root_tree")" 51 | git branch master "$commit" 52 | 53 | # Modify the master branch 54 | root_tree="$(( 55 | git ls-tree HEAD:./ 56 | printf "\ 57 | 100644 blob $blob_sha\tb 58 | ") | git mktree)" 59 | 60 | commit="$(git commit-tree -m 1 -p "$(git rev-parse HEAD)" "$root_tree")" 61 | # Bare 62 | git update-ref master "$commit" 63 | -------------------------------------------------------------------------------- /other-test-repos/many-commits-fast-import.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | This is a superior and simpler alternative to many-commits.py. 5 | 6 | Usage: 7 | 8 | rm -rf many-commits.tmp 9 | mkdir -p many-commits.tmp 10 | cd many-commits.tmp 11 | git init 12 | ../many-commits-fast-import.py [ncommits=10] | git fast-import 13 | 14 | Lenovo ThinkPad P51 SSD generation time for 2M commits: 33s. Disk usage: 270.2 MiB. Push size is smaller for some reason. 15 | ''' 16 | 17 | import sys 18 | 19 | print('''blob 20 | mark :1 21 | data 1 22 | a 23 | reset refs/heads/master 24 | commit refs/heads/master 25 | mark :2 26 | author <> 0 +0000 27 | committer <> 0 +0000 28 | data 1 29 | 30 | M 100644 :1 a 31 | ''') 32 | 33 | if len(sys.argv) > 1: 34 | n = int(sys.argv[1]) 35 | else: 36 | n = 10 37 | for i in range(2, n + 1): 38 | print('''commit refs/heads/master 39 | mark :{} 40 | author <> 0 +0000 41 | committer <> 0 +0000 42 | data 1 43 | 44 | from :{} 45 | '''.format(i + 1, i)) 46 | -------------------------------------------------------------------------------- /other-test-repos/many-commits-octopus-fast-import.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ''' 4 | This is a superior and simpler alternative to many-commits.py. 5 | 6 | Usage: 7 | 8 | rm -rf many-commits.tmp 9 | mkdir -p many-commits.tmp 10 | cd many-commits.tmp 11 | git init 12 | ../many-commits-fast-import.py [ncommits=10] | git fast-import 13 | 14 | Lenovo ThinkPad P51 SSD generation time for 2M commits: 33s. Disk usage: 270.2 MiB. Push size is smaller for some reason. 15 | ''' 16 | 17 | import sys 18 | 19 | print('''blob 20 | mark :1 21 | data 1 22 | a 23 | reset refs/heads/master 24 | commit refs/heads/master 25 | mark :2 26 | author <> 0 +0000 27 | committer <> 0 +0000 28 | data 1 29 | 30 | M 100644 :1 a 31 | ''') 32 | 33 | if len(sys.argv) > 1: 34 | n = int(sys.argv[1]) 35 | else: 36 | n = 10 37 | for i in range(2, n + 2): 38 | print('''commit refs/heads/master 39 | mark :{} 40 | author <> {} +0000 41 | committer <> 0 +0000 42 | data 1 43 | 44 | from :2 45 | '''.format(i + 1, i - 2)) 46 | print('''commit refs/heads/master 47 | mark :{} 48 | author <> 0 +0000 49 | committer <> 0 +0000 50 | data 1 51 | 52 | from :3'''.format(n + 3) 53 | ) 54 | for i in range(4, n + 3): 55 | print('merge :{}'.format(i)) 56 | -------------------------------------------------------------------------------- /other-test-repos/many-commits-octopus.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | 100k: 5 | 6 | - generates in seconds 7 | - size after script: 4Gb 8 | - git gc time: 1h30 min on https://github.com/cirosantilli/linux-kernel-module-cheat/tree/83b36867cf06ffdca3ce04296a8568d4f37ea13b#p51 9 | - size afte git gc: 78Mb 10 | """ 11 | 12 | import datetime 13 | import subprocess 14 | import time 15 | import sys 16 | 17 | import util 18 | 19 | email = b'a@a.com' 20 | name = b'' 21 | 22 | util.init() 23 | 24 | tree = util.create_tree_with_one_file() 25 | commit = None 26 | if len(sys.argv) > 1: 27 | n = int(sys.argv[1]) 28 | else: 29 | n = 1000 30 | base_commit, _, _ = util.save_commit_object( 31 | tree, 32 | (commit,), 33 | author_date_s=0, 34 | author_email=email, 35 | author_name=name, 36 | committer_date_s=0, 37 | committer_email=email, 38 | committer_name=name, 39 | message=b'', 40 | ) 41 | parents = [] 42 | for i in range(n): 43 | now = int(time.time()) 44 | commit, _, _ = util.save_commit_object( 45 | tree, 46 | (base_commit,), 47 | author_date_s=i, 48 | author_email=email, 49 | author_name=name, 50 | committer_date_s=0, 51 | committer_email=email, 52 | committer_name=name, 53 | message=b'', 54 | ) 55 | parents.append(commit) 56 | if i % 100000 == 0: 57 | print(i) 58 | print(datetime.datetime.now()) 59 | subprocess.check_output(['git', 'repack']) 60 | subprocess.check_output(['git', 'prune-packed']) 61 | subprocess.check_output(['git', 'tag', str(i), commit]) 62 | final_commit, _, _ = util.save_commit_object( 63 | tree, 64 | parents, 65 | author_date_s=0, 66 | author_email=email, 67 | author_name=name, 68 | committer_date_s=0, 69 | committer_email=email, 70 | committer_name=name, 71 | message=b'', 72 | ) 73 | util.create_master(final_commit) 74 | -------------------------------------------------------------------------------- /other-test-repos/many-commits.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | many-commits-fast-import.py, is a simpler and better alternative to this, just use that!!! 5 | 6 | Packing is important, or else deleting and pushing the generated repository could take a **huge** ammount of time. 7 | 8 | This method gets slower as it goes. 1M are fast to generate, but 10M require running for 24h nonstop. 9 | 10 | For extra safety, use a tmpfs or ramfs: 11 | 12 | ``` 13 | ulimit -Sv 500000 14 | mkdir -p tmp 15 | sudo umount tmp 16 | sudo mount -t tmpfs -o size=3g tmpfs tmp 17 | sudo chown $USER:$USER tmp 18 | cd tmp 19 | ../many-commits.py 20 | ``` 21 | 22 | The tags can be used to push by parts to GitHub, which does not accept 1M at once: 23 | 24 | ``` 25 | remote='git@github.com:cirosantilli/test-many-commits-1m.git' 26 | for i in `seq 10 10 100`; do 27 | git --git-dir=tmp/repo.tmp/.git push -f "$remote" "$i:master" 28 | done 29 | # TODO for some reason I needed this afterwards. 30 | git --git-dir=tmp/repo.tmp/.git push "$remote" 'master' 31 | ``` 32 | """ 33 | 34 | import datetime 35 | import subprocess 36 | import time 37 | import sys 38 | 39 | import util 40 | 41 | email = b'' 42 | name = b'' 43 | 44 | util.init() 45 | 46 | # https://stackoverflow.com/questions/9905257/git-push-fatal-unable-to-create-thread-resource-temporarily-unavailable 47 | subprocess.run(['git', 'config', '--local', 'pack.windowMemory', '50m']) 48 | subprocess.run(['git', 'config', '--local', 'pack.packSizeLimit', '50m']) 49 | subprocess.run(['git', 'config', '--local', 'pack.threads', '1']) 50 | 51 | tree = util.create_tree_with_one_file() 52 | commit = None 53 | if len(sys.argv) > 1: 54 | n = int(sys.argv[1]) 55 | else: 56 | n = 1000 57 | for i in range(n): 58 | now = int(time.time()) 59 | commit, _, _ = util.save_commit_object( 60 | tree, 61 | (commit,), 62 | author_date_s=0, 63 | author_email=email, 64 | author_name=name, 65 | committer_date_s=0, 66 | committer_email=email, 67 | committer_name=name, 68 | message=b'', 69 | ) 70 | if i % 100000 == 0: 71 | print(i) 72 | print(datetime.datetime.now()) 73 | # Lose objects are too large and blow up the tmpfs. 74 | # Does clean packets, but the calculation takes more and more memory, 75 | # and slows down and blows up at the end. TODO which subcommand blows up exactly?. 76 | #subprocess.check_output(['git', 'gc']) 77 | subprocess.check_output(['git', 'repack']) 78 | subprocess.check_output(['git', 'prune-packed']) 79 | subprocess.check_output(['git', 'tag', str(i), commit]) 80 | util.create_master(commit) 81 | -------------------------------------------------------------------------------- /other-test-repos/partial-clone.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eu 3 | 4 | # https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934 5 | rm -rf partial-clone.tmp 6 | mkdir -p partial-clone.tmp 7 | cd partial-clone.tmp 8 | 9 | list-objects() ( 10 | git rev-list --all --objects 11 | echo "master commit SHA: $(git log -1 --format="%H")" 12 | echo "mybranch commit SHA: $(git log -1 --format="%H")" 13 | git ls-tree master 14 | git ls-tree mybranch | grep mybranch 15 | git ls-tree master~ | grep root 16 | ) 17 | 18 | # Reproducibility. 19 | export GIT_COMMITTER_NAME='a' 20 | export GIT_COMMITTER_EMAIL='a' 21 | export GIT_AUTHOR_NAME='a' 22 | export GIT_AUTHOR_EMAIL='a' 23 | export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' 24 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000' 25 | 26 | rm -rf server_repo local_repo 27 | mkdir server_repo 28 | cd server_repo 29 | 30 | # Create repo. 31 | git init --quiet 32 | git config --local uploadpack.allowfilter 1 33 | git config --local uploadpack.allowanysha1inwant 1 34 | 35 | # First commit. 36 | # Directories present in all branches. 37 | mkdir asdf d2 38 | printf 'asdf/a' > ./asdf/a 39 | printf 'asdf/b' > ./asdf/b 40 | printf 'd2/a' > ./d2/a 41 | printf 'd2/b' > ./d2/b 42 | # Present only in root. 43 | mkdir 'root' 44 | printf 'root' > ./root/root 45 | git add . 46 | git commit -m 'root' --quiet 47 | 48 | # Second commit only on master. 49 | git rm --quiet -r ./root 50 | mkdir 'master' 51 | printf 'master' > ./master/master 52 | git add . 53 | git commit -m 'master commit' --quiet 54 | 55 | # Second commit only on mybranch. 56 | git checkout -b mybranch --quiet master~ 57 | git rm --quiet -r ./root 58 | mkdir 'mybranch' 59 | printf 'mybranch' > ./mybranch/mybranch 60 | git add . 61 | git commit -m 'mybranch commit' --quiet 62 | 63 | echo "# List and identify all objects" 64 | list-objects 65 | echo 66 | 67 | # Restore master. 68 | git checkout --quiet master 69 | cd .. 70 | 71 | # Clone. Don't checkout for now, only .git/ dir. 72 | # file:// shenanigans: 73 | # https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path 74 | git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo 75 | cd local_repo 76 | 77 | # List missing objects from master. 78 | echo "# Missing objects after --no-checkout" 79 | git rev-list --all --quiet --objects --missing=print 80 | echo 81 | 82 | echo "# Git checkout fails without internet" 83 | mv ../server_repo ../server_repo.off 84 | ! git checkout master 85 | echo 86 | 87 | echo "# Git checkout fetches the missing directory from internet" 88 | mv ../server_repo.off ../server_repo 89 | git checkout master -- asdf/ 90 | echo 91 | 92 | echo "# Missing objects after checking out asdf" 93 | git rev-list --all --quiet --objects --missing=print 94 | -------------------------------------------------------------------------------- /other-test-repos/streak.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import datetime 4 | import os 5 | import shutil 6 | import subprocess 7 | 8 | import util 9 | 10 | util.init() 11 | 12 | name = 'a' 13 | email = 'a@a.com' 14 | os.environ['GIT_AUTHOR_EMAIL'] = email 15 | os.environ['GIT_AUTHOR_NAME'] = name 16 | os.environ['GIT_COMMITTER_EMAIL'] = email 17 | os.environ['GIT_COMMITTER_NAME'] = name 18 | 19 | date0 = datetime.date(2000, 1, 1) 20 | datef = datetime.date(2100, 1, 1) 21 | date = date0 22 | while date < datef: 23 | s = date.strftime('%Y-%m-%dT01:00:00') 24 | print(s) 25 | os.environ['GIT_AUTHOR_DATE'] = s 26 | os.environ['GIT_COMMITTER_DATE'] = s 27 | cmd = ['git', 'commit', '-q', '--allow-empty', '--allow-empty-message', '-m', ''] 28 | subprocess.check_output(cmd) 29 | date += datetime.timedelta(days=1) 30 | -------------------------------------------------------------------------------- /other-test-repos/tag-test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | https://stackoverflow.com/questions/10986615/what-is-the-format-of-a-git-tag-object-and-how-to-calculate-its-sha/52193441#52193441 5 | """ 6 | 7 | import datetime 8 | import subprocess 9 | import time 10 | import sys 11 | 12 | import util 13 | 14 | email = b'a@a.com' 15 | name = b'' 16 | 17 | util.init() 18 | tree = util.create_tree_with_one_file() 19 | commit, _, _ = util.save_commit_object( 20 | tree, 21 | (None,), 22 | author_date_s=0, 23 | author_email=email, 24 | author_name=name, 25 | committer_date_s=0, 26 | committer_email=email, 27 | committer_name=name, 28 | message=b'', 29 | ) 30 | tag_sha, _, _ = util.save_tag_object( 31 | commit, 32 | b'mytag', 33 | object_type=b'commit', 34 | user_name=name, 35 | user_email=email, 36 | date_s=0, 37 | message=b'abc' 38 | ) 39 | util.create_master(commit) 40 | -------------------------------------------------------------------------------- /other-test-repos/util.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | TODO packfile operations instead of just object. Could be more efficient. 5 | But also harder to implement that format. 6 | """ 7 | 8 | import hashlib 9 | import os 10 | import shutil 11 | import subprocess 12 | import zlib 13 | 14 | repo_dir = 'repo.tmp' 15 | git_dir = b'.git' 16 | objects_dir = os.path.join(git_dir, b'objects') 17 | refs_dir = os.path.join(git_dir, b'refs') 18 | tags_dir = os.path.join(refs_dir, b'tags') 19 | 20 | # Tree parameters. 21 | default_blob_basename = b'a' 22 | default_blob_content = b'a' 23 | default_blob_mode = b'100644' 24 | 25 | # Commit parameters. 26 | default_name = b'a' 27 | default_email = b'a@a.com' 28 | # 2000-01-01T00:00:00+0000 29 | default_date_s = 946684800 30 | default_tz = b'+0000' 31 | default_author_date_s = default_date_s 32 | default_author_date_tz = default_tz 33 | default_author_email = default_email 34 | default_author_name = default_name 35 | default_committer_date_s = default_date_s 36 | default_committer_date_tz = default_tz 37 | default_committer_email = default_email 38 | default_committer_name = default_name 39 | default_message = b'a' 40 | # ASCII hex of parents. 41 | default_parents = () 42 | 43 | def init(): 44 | for d in (repo_dir, 'clone.tmp'): 45 | shutil.rmtree(d, ignore_errors=True) 46 | os.mkdir(repo_dir) 47 | os.chdir(repo_dir) 48 | subprocess.check_output(['git', 'init', '-q']) 49 | 50 | def get_object_and_sha(obj_type, content): 51 | obj = b'%s %s\0%s' % (obj_type, str(len(content)).encode('ascii'), content) 52 | hash = hashlib.sha1(obj) 53 | return (obj, hash.hexdigest().encode('ascii'), hash.digest()) 54 | 55 | def save_object(obj_type, content): 56 | obj, sha_ascii, sha = get_object_and_sha(obj_type, content) 57 | obj_dir = os.path.join(objects_dir, sha_ascii[:2]) 58 | obj_path = os.path.join(obj_dir, sha_ascii[2:]) 59 | os.makedirs(obj_dir, exist_ok=True) 60 | with open(obj_path, 'wb') as f: 61 | f.write(zlib.compress(obj)) 62 | return sha_ascii, sha 63 | 64 | # TODO multiple children object. 65 | def save_tree_object(mode, basename, sha): 66 | tree_content = b'%s %s\0%s' % (mode, basename, sha) 67 | return save_object(b'tree', tree_content) + (tree_content,) 68 | 69 | def save_commit_object( 70 | tree_sha_ascii, 71 | parents=default_parents, 72 | author_name=default_author_name, 73 | author_email=default_author_email, 74 | author_date_s=default_author_date_s, 75 | author_date_tz=default_author_date_tz, 76 | committer_name=default_committer_name, 77 | committer_email=default_committer_email, 78 | committer_date_s=default_committer_date_s, 79 | committer_date_tz=default_committer_date_tz, 80 | message=default_message): 81 | if parents and parents[0]: 82 | parents_bytes = b'' 83 | sep = b'\nparent ' 84 | parents_bytes = sep + sep.join(parents) + b'\n' 85 | else: 86 | parents_bytes = b'\n' 87 | commit_content = b'tree %s%sauthor %s <%s> %s %s\ncommitter %s <%s> %s %s\n\n%s\n' % ( 88 | tree_sha_ascii, parents_bytes, 89 | author_name, author_email, str(author_date_s).encode('ascii'), author_date_tz, 90 | committer_name, committer_email, str(committer_date_s).encode('ascii'), committer_date_tz, 91 | message) 92 | return save_object(b'commit', commit_content) + (commit_content,) 93 | 94 | def save_tag_object( 95 | object_sha_ascii, 96 | tag_name, 97 | object_type='commit', 98 | user_name=default_author_name, 99 | user_email=default_author_email, 100 | date_s=default_author_date_s, 101 | date_tz=default_author_date_tz, 102 | message=default_message): 103 | content = b'object %s\ntype %s\ntag %s\ntagger %s <%s> %s %s\n\n%s' % \ 104 | (object_sha_ascii, object_type, tag_name, user_name, user_email, str(date_s).encode('ascii'), date_tz, message) 105 | tag_sha_ascii, tag_sha = save_object(b'tag', content) 106 | os.makedirs(tags_dir, exist_ok=True) 107 | with open(os.path.join(tags_dir, tag_name), 'w') as tag_file: 108 | tag_file.write(tag_sha_ascii.decode('ascii') + '\n') 109 | return tag_sha_ascii, tag_sha, content 110 | 111 | def get_git_hash_object(obj_type, input): 112 | cmd = [b'git', b'hash-object', b'--stdin', b'-t', obj_type] 113 | return subprocess.check_output(cmd, input=input).rstrip() 114 | 115 | def create_master(commit_sha_ascii): 116 | subprocess.check_output(['git', 'branch', 'master', commit_sha_ascii]) 117 | 118 | def clone(): 119 | subprocess.check_output(['git', 'clone', '-q', '.', '../clone.tmp']) 120 | 121 | def create_tree_with_one_file( 122 | blob_mode=default_blob_mode, 123 | blob_basename=default_blob_basename, 124 | blob_content=default_blob_content, 125 | ): 126 | blob_sha_ascii, blob_sha = save_object(b'blob', blob_content) 127 | tree_sha_ascii, tree_sha, tree_content = save_tree_object(blob_mode, blob_basename, blob_sha) 128 | return tree_sha_ascii 129 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "bin": { 3 | "china-dictatorship": "china-dictatorship" 4 | }, 5 | "dependencies": {}, 6 | "description": "2018新疆改造中心,1989六四事件,1999法轮功 ,2019 996.ICU, 2018包子露宪,2015 710律师劫,2015巴拿马文件 邓家贵,2017低端人口,2008西藏骚乱", 7 | "devDependencies": { 8 | "@actions/core": "^1.2.7", 9 | "@actions/github": "^4.0.0" 10 | }, 11 | "files": [ 12 | "index.js", 13 | "china-dictatorship", 14 | "README.md", 15 | "README.adoc", 16 | "README.html" 17 | ], 18 | "keywords": [ 19 | "china", 20 | "dictatorship" 21 | ], 22 | "license": "CC-BY-SA-4.0", 23 | "name": "china-dictatorship", 24 | "repository": "cirosantilli/china-dictatorship", 25 | "scripts": { 26 | "prepublishOnly": "cp README.adoc README.md;make" 27 | }, 28 | "version": "0.0.74" 29 | } 30 | -------------------------------------------------------------------------------- /patch.patch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/patch.patch -------------------------------------------------------------------------------- /pdf.pdf: -------------------------------------------------------------------------------- 1 | %PDF-1.7 2 | 3 | 1 0 obj % entry point 4 | << 5 | /Type /Catalog 6 | /Pages 2 0 R 7 | >> 8 | endobj 9 | 10 | 2 0 obj 11 | << 12 | /Type /Pages 13 | /MediaBox [ 0 0 200 200 ] 14 | /Count 1 15 | /Kids [ 3 0 R ] 16 | >> 17 | endobj 18 | 19 | 3 0 obj 20 | << 21 | /Type /Page 22 | /Parent 2 0 R 23 | /Resources << 24 | /Font << 25 | /F1 4 0 R 26 | >> 27 | >> 28 | /Contents 5 0 R 29 | >> 30 | endobj 31 | 32 | 4 0 obj 33 | << 34 | /Type /Font 35 | /Subtype /Type1 36 | /BaseFont /Times-Roman 37 | >> 38 | endobj 39 | 40 | 5 0 obj % page content 41 | << 42 | /Length 44 43 | >> 44 | stream 45 | BT 46 | 70 50 TD 47 | /F1 12 Tf 48 | (Hello, world!) Tj 49 | ET 50 | endstream 51 | endobj 52 | 53 | xref 54 | 0 6 55 | 0000000000 65535 f 56 | 0000000010 00000 n 57 | 0000000079 00000 n 58 | 0000000173 00000 n 59 | 0000000301 00000 n 60 | 0000000380 00000 n 61 | trailer 62 | << 63 | /Size 6 64 | /Root 1 0 R 65 | >> 66 | startxref 67 | 492 68 | %%EOF -------------------------------------------------------------------------------- /png-noext: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/png-noext -------------------------------------------------------------------------------- /png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/png.png -------------------------------------------------------------------------------- /rb.rb: -------------------------------------------------------------------------------- 1 | def f(x) 2 | x + 1 3 | end 4 | 5 | def g(x) 6 | x + 1 7 | end 8 | 9 | def h(x) 10 | x + 1 11 | end 12 | 13 | def a 14 | 1 15 | end 16 | 17 | def b 18 | 1 19 | end 20 | 21 | def c 22 | 1 23 | end 24 | 25 | Chaining style: 26 | 27 | a. 28 | b. 29 | c 30 | 31 | a.b. 32 | c 33 | -------------------------------------------------------------------------------- /rdoc.rdoc: -------------------------------------------------------------------------------- 1 | = h1 2 | 3 | == h2 4 | -------------------------------------------------------------------------------- /refs.md: -------------------------------------------------------------------------------- 1 | # Refs 2 | 3 | Interesting branches and tags: 4 | 5 | - [`hasslash/a`](../hasslash/a): branch inside sub-directory 6 | 7 | - [`-r`](../-r): branch with forbidden name, and in particular one that may be used for shell injection. 8 | 9 | Create manually with `cp master -- -r` and push with `git push --all`. 10 | 11 | - `` and `a`: XSS attempts 12 | 13 | - `tag-empty-blob`: a tag that points to a blob 14 | 15 | - [`a;{echo,INJECTION};{echo,RULZ};`](a;{echo,INJECTION};{echo,RULZ};): GitHub proposes a shell injection to users on a pull request under "You can also merge branches on the command line". 16 | 17 | - [1970](1970): earliest possible commit with `git commit --date '@0 +0000'` 18 | 19 | - [future](future): commit in the far far future, on some date that does not show as 1970 on `git log`? See also: 20 | 21 | - [future-max](future-max): commit at the latest possible pushable date of `2^63 - 1`. Larger dates up to `2^64 - 2` can be committed, but not pushed. 22 | 23 | As of 2015-04-02, that commits will show as the fist one on the UI commit list no matter its order on the commit tree, making it a good way to drive other people mad and then later make them scold you when they understand. 24 | 25 | - emoji: e.g. [🚿](🚿). 26 | -------------------------------------------------------------------------------- /refs/heads/master: -------------------------------------------------------------------------------- 1 | 173a852893f2dac5b79dd5862e5a032777477567 2 | -------------------------------------------------------------------------------- /remotes.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ $# -gt 0 ]; then 4 | REPO="$1" 5 | shift 6 | else 7 | REPO=test 8 | fi 9 | 10 | git remote add at git@atlas-tmp:tmp/${REPO}.git 11 | git remote add as git@git.assembla.com:cirosantilli-${REPO}.git 12 | git remote add bb git@bitbucket.org:cirosantilli/${REPO}.git 13 | git remote add bs https://cirosantilli.git.beanstalkapp.com/test.git 14 | git remote add cp git@codeplane.com:cirosantilli/${REPO}.git 15 | git remote add cx https://git01.codeplex.com/cirosantillitest 16 | git remote add gc https://code.google.com/p/cirosantilli-${REPO} 17 | git remote add go git@gitorious.org:cirosantilli-${REPO}/cirosantilli-${REPO}.git 18 | #git remote add gr ssh://repo.or.cz/cirosantilli-${REPO}.git 19 | git remote add gh git@github.com:cirosantilli/${REPO}.git 20 | git remote add gl git@gitlab.com:cirosantilli/${REPO}.git 21 | # GitLab Local 22 | git remote add gll http://root:5iveL!fe@localhost:3000/gitlab-org/gitlab-${REPO}.git 23 | git remote add ja https://hub.jazz.net/git/cirosantilli/test 24 | git remote add ki ssh://cirosantilli@cirosantilli.kilnhg.com/Repositories/Group/test 25 | git remote add lp git+ssh://git.launchpad.net/cirosantilli-test-git 26 | git remote add nb https://notabug.org/cirosantilli/test-git-web-interface.git 27 | git remote add origin git@github.com:cirosantilli/${REPO}.git 28 | git remote add pf git@www.penflip.com:cirosantilli/${REPO}.git 29 | git remote add sf ssh://cirosantilli@git.code.sf.net/p/cirosantilli-${REPO}/code 30 | # username: email 31 | git remote add vs https://cirosantilli.visualstudio.com/DefaultCollection/_git/test 32 | -------------------------------------------------------------------------------- /rst.rst: -------------------------------------------------------------------------------- 1 | reStructuredText 2 | ================ 3 | 4 | .. contents:: 5 | 6 | Headers 7 | ------- 8 | 9 | Header 3 1 10 | ---------- 11 | 12 | asdf 13 | 14 | Header 3 2 15 | ---------- 16 | 17 | qwer 18 | 19 | .. _custom-id: 20 | 21 | Header Custon Id 22 | ---------------- 23 | 24 | qwer 25 | 26 | Hyperlink 27 | ......... 28 | 29 | `example link `_ 30 | 31 | Hyperlink_ 32 | 33 | `Header 3 1`_ 34 | 35 | `custom-id`_ 36 | 37 | `Custom id <#custom-id>`_ 38 | 39 | Bibliography 40 | ------------ 41 | 42 | - http://docutils.sourceforge.net/docs/user/rst/quickref.html 43 | -------------------------------------------------------------------------------- /shallow-submodule.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # New better tests: 4 | # https://github.com/cirosantilli/test-shallow-submodule-mod 5 | # https://github.com/cirosantilli/test-shallow-submodule-top-branch-shallow 6 | # https://github.com/cirosantilli/test-shallow-submodule-top-sha 7 | 8 | # Older tests: 9 | # https://github.com/cirosantilli/test-submodule-mod 10 | # https://github.com/cirosantilli/test-submodule-top 11 | # https://github.com/cirosantilli/test-submodule-top-shallow 12 | # https://github.com/cirosantilli/test-submodule-mod-branch 13 | # https://github.com/cirosantilli/test-submodule-top-branch 14 | 15 | set -ex 16 | 17 | rm -rf tmp 18 | mkdir tmp 19 | cd tmp 20 | rm -rf * 21 | 22 | export GIT_AUTHOR_NAME="Ciro Santilli" 23 | export GIT_AUTHOR_EMAIL="ciro.santilli@gmail.com" 24 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000' 25 | export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME" 26 | export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" 27 | export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" 28 | 29 | mkdir mod 30 | cd mod 31 | git init 32 | touch base 33 | git add base 34 | git commit -m base 35 | touch master-1 36 | git add master-1 37 | git commit -m master-1 38 | touch master-2 39 | git add master-2 40 | git commit -m master-2 41 | git tag tag-master 42 | touch master-3 43 | git add master-3 44 | git commit -m master-3 45 | git checkout -b mybranch HEAD~3 46 | touch mybranch-1 47 | git add mybranch-1 48 | git commit -m mybranch-1 49 | touch mybranch-2 50 | git add mybranch-2 51 | git commit -m mybranch-2 52 | git tag tag-mybranch 53 | touch mybranch-3 54 | git add mybranch-3 55 | git commit -m mybranch-3 56 | git checkout master 57 | cd .. 58 | 59 | mkdir top 60 | cd top 61 | git init 62 | touch a 63 | git add a 64 | git commit -m 1 65 | touch b 66 | git add b 67 | git commit -m 2 68 | git submodule add ../mod/ mod 69 | git add .gitmodules 70 | git commit -m '.gitmodules' 71 | cd .. 72 | 73 | cp -rv top top-shallow 74 | cd top-shallow 75 | printf '\tshallow = true\n' >> .gitmodules 76 | git add .gitmodules 77 | git commit -m 'shallow' 78 | cd .. 79 | 80 | mkdir top-branch 81 | cd top-branch 82 | git init 83 | touch a 84 | git add a 85 | git commit -m 1 86 | touch b 87 | git add b 88 | git commit -m 2 89 | git submodule add -b mybranch ../mod/ mod 90 | git add .gitmodules 91 | git commit -m '.gitmodules' 92 | cd .. 93 | 94 | cp -rv top-branch top-branch-shallow 95 | cd top-branch-shallow 96 | printf '\tshallow = true\n' >> .gitmodules 97 | git add .gitmodules 98 | git commit -m 'shallow' 99 | cd .. 100 | 101 | mkdir top-tag 102 | cd top-tag 103 | git init 104 | touch a 105 | git add a 106 | git commit -m 1 107 | touch b 108 | git add b 109 | git commit -m 2 110 | git submodule add ../mod/ mod 111 | cd mod 112 | git checkout tag-mybranch 113 | cd .. 114 | git add . 115 | git commit -m '.gitmodules' 116 | cd .. 117 | 118 | mkdir top-sha 119 | cd top-sha 120 | git init 121 | touch a 122 | git add a 123 | git commit -m 1 124 | touch b 125 | git add b 126 | git commit -m 2 127 | git submodule add ../mod/ mod 128 | cd mod 129 | git checkout tag-mybranch~ 130 | cd .. 131 | git add . 132 | git commit -m '.gitmodules' 133 | cd .. 134 | 135 | rm -f results 136 | 137 | git clone --depth 1 "file://$(pwd)/mod" mod-clone 138 | git --git-dir mod-clone/.git log --oneline | wc -l >>results 139 | # 1 140 | 141 | git clone --depth 1 "file://$(pwd)/mod" mod-branch-clone 142 | git --git-dir mod-branch-clone/.git log --oneline | wc -l >>results 143 | # 1 144 | 145 | ## gitmodule 146 | 147 | echo 'gitmodule' >>results 148 | 149 | git clone --recurse-submodules "file://$(pwd)/top" top-clone 150 | git --git-dir top-clone/.git/modules/mod log --oneline | wc -l >>results 151 | # many 152 | 153 | git clone --recurse-submodules "file://$(pwd)/top-shallow" top-shallow-clone 154 | git --git-dir top-shallow-clone/.git/modules/mod log --oneline | wc -l >>results 155 | # 1 156 | 157 | git clone --recurse-submodules "file://$(pwd)/top-branch" top-branch-clone 158 | git --git-dir top-branch-clone/.git/modules/mod log --oneline | wc -l >>results 159 | # many 160 | 161 | git clone --recurse-submodules "file://$(pwd)/top-branch-shallow" top-branch-shallow-clone 162 | git --git-dir top-branch-shallow-clone/.git/modules/mod log --oneline | wc -l >>results 163 | # many 164 | 165 | git clone --recurse-submodules "file://$(pwd)/top-tag" top-tag-clone 166 | git --git-dir top-tag-clone/.git/modules/mod log --oneline | wc -l >>results 167 | # many 168 | 169 | git clone --recurse-submodules "file://$(pwd)/top-sha" top-sha-clone 170 | git --git-dir top-sha-clone/.git/modules/mod log --oneline | wc -l >>results 171 | # many 172 | 173 | ## SS 174 | 175 | echo 'ss' >>results 176 | 177 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top" top-clone-ss 178 | git --git-dir top-clone-ss/.git/modules/mod log --oneline | wc -l >>results 179 | # 1 180 | 181 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-shallow" top-shallow-clone-ss 182 | git --git-dir top-shallow-clone-ss/.git/modules/mod log --oneline | wc -l >>results 183 | # 1 184 | 185 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-branch" top-branch-clone-ss 186 | git --git-dir top-branch-clone-ss/.git/modules/mod log --oneline | wc -l >>results 187 | # 1 188 | 189 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-branch-shallow" top-branch-shallow-clone-ss 190 | git --git-dir top-branch-shallow-clone-ss/.git/modules/mod log --oneline | wc -l >>results 191 | # 1 192 | 193 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-tag" top-tag-clone-ss 194 | git --git-dir top-tag-clone-ss/.git/modules/mod log --oneline | wc -l >>results 195 | # 1 196 | 197 | #git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-sha" top-sha-clone-ss 198 | # error: Server does not allow request for unadvertised object 199 | #git --git-dir top-sha-clone-ss/.git/modules/mod log --oneline | wc -l >>results 200 | 201 | cat results 202 | -------------------------------------------------------------------------------- /svg-foreignObject.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 84 |
85 |

Made with HTML & CSS
not an animated GIF

86 |

Click to see the source

87 | 88 |
89 |
90 |
91 |
92 | -------------------------------------------------------------------------------- /svg.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /sym-abs-fstab: -------------------------------------------------------------------------------- 1 | /etc/fstab -------------------------------------------------------------------------------- /sym-abs-fstab.md: -------------------------------------------------------------------------------- 1 | /etc/fstab -------------------------------------------------------------------------------- /sym-dot: -------------------------------------------------------------------------------- 1 | . -------------------------------------------------------------------------------- /sym-git-config: -------------------------------------------------------------------------------- 1 | .git/config -------------------------------------------------------------------------------- /sym-readme: -------------------------------------------------------------------------------- 1 | README.md -------------------------------------------------------------------------------- /sym-up: -------------------------------------------------------------------------------- 1 | .. -------------------------------------------------------------------------------- /sym-xss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /txt.txt: -------------------------------------------------------------------------------- 1 | mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 2 | 3 | http://example.com 4 | 5 | email@host.com 6 | -------------------------------------------------------------------------------- /utf8-中文: -------------------------------------------------------------------------------- 1 | asdfsadf 2 | -------------------------------------------------------------------------------- /xref-header-infinite-loop.adoc: -------------------------------------------------------------------------------- 1 | = asdf 2 | 3 | [[h2]] 4 | == h2 xref:h3[] 5 | 6 | [[h3]] 7 | === h3 xref:h2[] 8 | -------------------------------------------------------------------------------- /ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็: -------------------------------------------------------------------------------- 1 | ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ -------------------------------------------------------------------------------- /﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽: -------------------------------------------------------------------------------- 1 | ﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽ --------------------------------------------------------------------------------