Browse code
setup virtualenv
fiddlerwoaroof authored on 08/08/2014 02:37:59
Showing 148 changed files
Showing 148 changed files
- COPYING
- README.md
- TODO.md
- bin/activate
- bin/activate.csh
- bin/activate.fish
- bin/activate_this.py
- bin/easy_install
- bin/easy_install-2.7
- bin/pip
- bin/pip-2.7
- bin/python
- bin/python2
- bin/python2.7
- include/python2.7
- lib/python2.7/UserDict.py
- lib/python2.7/UserDict.pyc
- lib/python2.7/_abcoll.py
- lib/python2.7/_abcoll.pyc
- lib/python2.7/_weakrefset.py
- lib/python2.7/_weakrefset.pyc
- lib/python2.7/abc.py
- lib/python2.7/abc.pyc
- lib/python2.7/codecs.py
- lib/python2.7/codecs.pyc
- lib/python2.7/copy_reg.py
- lib/python2.7/copy_reg.pyc
- lib/python2.7/distutils/__init__.py
- lib/python2.7/distutils/__init__.pyc
- lib/python2.7/distutils/distutils.cfg
- lib/python2.7/encodings
- lib/python2.7/fnmatch.py
- lib/python2.7/fnmatch.pyc
- lib/python2.7/genericpath.py
- lib/python2.7/genericpath.pyc
- lib/python2.7/lib-dynload
- lib/python2.7/linecache.py
- lib/python2.7/linecache.pyc
- lib/python2.7/locale.py
- lib/python2.7/no-global-site-packages.txt
- lib/python2.7/ntpath.py
- lib/python2.7/orig-prefix.txt
- lib/python2.7/os.py
- lib/python2.7/os.pyc
- lib/python2.7/posixpath.py
- lib/python2.7/posixpath.pyc
- lib/python2.7/re.py
- lib/python2.7/re.pyc
- lib/python2.7/site-packages/easy-install.pth
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/PKG-INFO
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/SOURCES.txt
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/dependency_links.txt
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/entry_points.txt
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/not-zip-safe
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/requires.txt
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/EGG-INFO/top_level.txt
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/__init__.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/__init__.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/__main__.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/__main__.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/__init__.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/__init__.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/socket_create_connection.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/socket_create_connection.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/ssl_match_hostname.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/backwardcompat/ssl_match_hostname.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/basecommand.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/basecommand.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/baseparser.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/baseparser.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/cacert.pem
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/cmdoptions.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/cmdoptions.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/__init__.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/__init__.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/bundle.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/bundle.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/completion.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/completion.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/freeze.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/freeze.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/help.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/help.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/install.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/install.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/list.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/list.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/search.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/search.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/show.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/show.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/uninstall.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/uninstall.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/unzip.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/unzip.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/zip.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/commands/zip.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/download.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/download.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/exceptions.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/exceptions.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/index.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/index.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/locations.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/locations.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/log.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/log.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/req.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/req.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/runner.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/runner.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/status_codes.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/status_codes.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/util.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/util.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/__init__.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/__init__.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/bazaar.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/bazaar.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/git.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/git.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/mercurial.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/mercurial.pyc
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/subversion.py
- lib/python2.7/site-packages/pip-1.3.1-py2.7.egg/pip/vcs/subversion.pyc
- lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
- lib/python2.7/site-packages/setuptools.pth
- lib/python2.7/site.py
- lib/python2.7/site.pyc
- lib/python2.7/sre.py
- lib/python2.7/sre_compile.py
- lib/python2.7/sre_compile.pyc
- lib/python2.7/sre_constants.py
- lib/python2.7/sre_constants.pyc
- lib/python2.7/sre_parse.py
- lib/python2.7/sre_parse.pyc
- lib/python2.7/stat.py
- lib/python2.7/stat.pyc
- lib/python2.7/types.py
- lib/python2.7/types.pyc
- lib/python2.7/warnings.py
- lib/python2.7/warnings.pyc
- local/COPYING
- local/README.md
- local/TODO.md
- local/bin
- local/include
- local/lib
1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,29 @@ |
1 |
+Copyright (c) 2011 Edward Langley |
|
2 |
+All rights reserved. |
|
3 |
+ |
|
4 |
+Redistribution and use in source and binary forms, with or without |
|
5 |
+modification, are permitted provided that the following conditions |
|
6 |
+are met: |
|
7 |
+ |
|
8 |
+Redistributions of source code must retain the above copyright notice, |
|
9 |
+this list of conditions and the following disclaimer. |
|
10 |
+ |
|
11 |
+Redistributions in binary form must reproduce the above copyright |
|
12 |
+notice, this list of conditions and the following disclaimer in the |
|
13 |
+documentation and/or other materials provided with the distribution. |
|
14 |
+ |
|
15 |
+Neither the name of the project's author nor the names of its |
|
16 |
+contributors may be used to endorse or promote products derived from |
|
17 |
+this software without specific prior written permission. |
|
18 |
+ |
|
19 |
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
20 |
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
21 |
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
22 |
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
23 |
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
24 |
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
|
25 |
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
26 |
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
27 |
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
28 |
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
29 |
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
2 | 32 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,80 @@ |
1 |
+# This file must be used with "source bin/activate" *from bash* |
|
2 |
+# you cannot run it directly |
|
3 |
+ |
|
4 |
+deactivate () { |
|
5 |
+ unset pydoc |
|
6 |
+ |
|
7 |
+ # reset old environment variables |
|
8 |
+ if [ -n "$_OLD_VIRTUAL_PATH" ] ; then |
|
9 |
+ PATH="$_OLD_VIRTUAL_PATH" |
|
10 |
+ export PATH |
|
11 |
+ unset _OLD_VIRTUAL_PATH |
|
12 |
+ fi |
|
13 |
+ if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then |
|
14 |
+ PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" |
|
15 |
+ export PYTHONHOME |
|
16 |
+ unset _OLD_VIRTUAL_PYTHONHOME |
|
17 |
+ fi |
|
18 |
+ |
|
19 |
+ # This should detect bash and zsh, which have a hash command that must |
|
20 |
+ # be called to get it to forget past commands. Without forgetting |
|
21 |
+ # past commands the $PATH changes we made may not be respected |
|
22 |
+ if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then |
|
23 |
+ hash -r 2>/dev/null |
|
24 |
+ fi |
|
25 |
+ |
|
26 |
+ if [ -n "$_OLD_VIRTUAL_PS1" ] ; then |
|
27 |
+ PS1="$_OLD_VIRTUAL_PS1" |
|
28 |
+ export PS1 |
|
29 |
+ unset _OLD_VIRTUAL_PS1 |
|
30 |
+ fi |
|
31 |
+ |
|
32 |
+ unset VIRTUAL_ENV |
|
33 |
+ if [ ! "$1" = "nondestructive" ] ; then |
|
34 |
+ # Self destruct! |
|
35 |
+ unset -f deactivate |
|
36 |
+ fi |
|
37 |
+} |
|
38 |
+ |
|
39 |
+# unset irrelevant variables |
|
40 |
+deactivate nondestructive |
|
41 |
+ |
|
42 |
+VIRTUAL_ENV="/home/edwlan/github_repos/pybrowse" |
|
43 |
+export VIRTUAL_ENV |
|
44 |
+ |
|
45 |
+_OLD_VIRTUAL_PATH="$PATH" |
|
46 |
+PATH="$VIRTUAL_ENV/bin:$PATH" |
|
47 |
+export PATH |
|
48 |
+ |
|
49 |
+# unset PYTHONHOME if set |
|
50 |
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) |
|
51 |
+# could use `if (set -u; : $PYTHONHOME) ;` in bash |
|
52 |
+if [ -n "$PYTHONHOME" ] ; then |
|
53 |
+ _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" |
|
54 |
+ unset PYTHONHOME |
|
55 |
+fi |
|
56 |
+ |
|
57 |
+if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then |
|
58 |
+ _OLD_VIRTUAL_PS1="$PS1" |
|
59 |
+ if [ "x" != x ] ; then |
|
60 |
+ PS1="$PS1" |
|
61 |
+ else |
|
62 |
+ if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then |
|
63 |
+ # special case for Aspen magic directories |
|
64 |
+ # see http://www.zetadev.com/software/aspen/ |
|
65 |
+ PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" |
|
66 |
+ else |
|
67 |
+ PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" |
|
68 |
+ fi |
|
69 |
+ fi |
|
70 |
+ export PS1 |
|
71 |
+fi |
|
72 |
+ |
|
73 |
+alias pydoc="python -m pydoc" |
|
74 |
+ |
|
75 |
+# This should detect bash and zsh, which have a hash command that must |
|
76 |
+# be called to get it to forget past commands. Without forgetting |
|
77 |
+# past commands the $PATH changes we made may not be respected |
|
78 |
+if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then |
|
79 |
+ hash -r 2>/dev/null |
|
80 |
+fi |
0 | 81 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,42 @@ |
1 |
+# This file must be used with "source bin/activate.csh" *from csh*. |
|
2 |
+# You cannot run it directly. |
|
3 |
+# Created by Davide Di Blasi <davidedb@gmail.com>. |
|
4 |
+ |
|
5 |
+alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' |
|
6 |
+ |
|
7 |
+# Unset irrelevant variables. |
|
8 |
+deactivate nondestructive |
|
9 |
+ |
|
10 |
+setenv VIRTUAL_ENV "/home/edwlan/github_repos/pybrowse" |
|
11 |
+ |
|
12 |
+set _OLD_VIRTUAL_PATH="$PATH" |
|
13 |
+setenv PATH "$VIRTUAL_ENV/bin:$PATH" |
|
14 |
+ |
|
15 |
+ |
|
16 |
+ |
|
17 |
+if ("" != "") then |
|
18 |
+ set env_name = "" |
|
19 |
+else |
|
20 |
+ if (`basename "$VIRTUAL_ENV"` == "__") then |
|
21 |
+ # special case for Aspen magic directories |
|
22 |
+ # see http://www.zetadev.com/software/aspen/ |
|
23 |
+ set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` |
|
24 |
+ else |
|
25 |
+ set env_name = `basename "$VIRTUAL_ENV"` |
|
26 |
+ endif |
|
27 |
+endif |
|
28 |
+ |
|
29 |
+# Could be in a non-interactive environment, |
|
30 |
+# in which case, $prompt is undefined and we wouldn't |
|
31 |
+# care about the prompt anyway. |
|
32 |
+if ( $?prompt ) then |
|
33 |
+ set _OLD_VIRTUAL_PROMPT="$prompt" |
|
34 |
+ set prompt = "[$env_name] $prompt" |
|
35 |
+endif |
|
36 |
+ |
|
37 |
+unset env_name |
|
38 |
+ |
|
39 |
+alias pydoc python -m pydoc |
|
40 |
+ |
|
41 |
+rehash |
|
42 |
+ |
0 | 43 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,74 @@ |
1 |
+# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) |
|
2 |
+# you cannot run it directly |
|
3 |
+ |
|
4 |
+function deactivate -d "Exit virtualenv and return to normal shell environment" |
|
5 |
+ # reset old environment variables |
|
6 |
+ if test -n "$_OLD_VIRTUAL_PATH" |
|
7 |
+ set -gx PATH $_OLD_VIRTUAL_PATH |
|
8 |
+ set -e _OLD_VIRTUAL_PATH |
|
9 |
+ end |
|
10 |
+ if test -n "$_OLD_VIRTUAL_PYTHONHOME" |
|
11 |
+ set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME |
|
12 |
+ set -e _OLD_VIRTUAL_PYTHONHOME |
|
13 |
+ end |
|
14 |
+ |
|
15 |
+ if test -n "$_OLD_FISH_PROMPT_OVERRIDE" |
|
16 |
+ functions -e fish_prompt |
|
17 |
+ set -e _OLD_FISH_PROMPT_OVERRIDE |
|
18 |
+ . ( begin |
|
19 |
+ printf "function fish_prompt\n\t#" |
|
20 |
+ functions _old_fish_prompt |
|
21 |
+ end | psub ) |
|
22 |
+ functions -e _old_fish_prompt |
|
23 |
+ end |
|
24 |
+ |
|
25 |
+ set -e VIRTUAL_ENV |
|
26 |
+ if test "$argv[1]" != "nondestructive" |
|
27 |
+ # Self destruct! |
|
28 |
+ functions -e deactivate |
|
29 |
+ end |
|
30 |
+end |
|
31 |
+ |
|
32 |
+# unset irrelevant variables |
|
33 |
+deactivate nondestructive |
|
34 |
+ |
|
35 |
+set -gx VIRTUAL_ENV "/home/edwlan/github_repos/pybrowse" |
|
36 |
+ |
|
37 |
+set -gx _OLD_VIRTUAL_PATH $PATH |
|
38 |
+set -gx PATH "$VIRTUAL_ENV/bin" $PATH |
|
39 |
+ |
|
40 |
+# unset PYTHONHOME if set |
|
41 |
+if set -q PYTHONHOME |
|
42 |
+ set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME |
|
43 |
+ set -e PYTHONHOME |
|
44 |
+end |
|
45 |
+ |
|
46 |
+if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" |
|
47 |
+ # fish uses a function instead of an env var to generate the prompt. |
|
48 |
+ |
|
49 |
+ # save the current fish_prompt function as the function _old_fish_prompt |
|
50 |
+ . ( begin |
|
51 |
+ printf "function _old_fish_prompt\n\t#" |
|
52 |
+ functions fish_prompt |
|
53 |
+ end | psub ) |
|
54 |
+ |
|
55 |
+ # with the original prompt function renamed, we can override with our own. |
|
56 |
+ function fish_prompt |
|
57 |
+ # Prompt override? |
|
58 |
+ if test -n "" |
|
59 |
+ printf "%s%s%s" "" (set_color normal) (_old_fish_prompt) |
|
60 |
+ return |
|
61 |
+ end |
|
62 |
+ # ...Otherwise, prepend env |
|
63 |
+ set -l _checkbase (basename "$VIRTUAL_ENV") |
|
64 |
+ if test $_checkbase = "__" |
|
65 |
+ # special case for Aspen magic directories |
|
66 |
+ # see http://www.zetadev.com/software/aspen/ |
|
67 |
+ printf "%s[%s]%s %s" (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) (_old_fish_prompt) |
|
68 |
+ else |
|
69 |
+ printf "%s(%s)%s%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) (_old_fish_prompt) |
|
70 |
+ end |
|
71 |
+ end |
|
72 |
+ |
|
73 |
+ set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" |
|
74 |
+end |
0 | 75 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,34 @@ |
1 |
+"""By using execfile(this_file, dict(__file__=this_file)) you will |
|
2 |
+activate this virtualenv environment. |
|
3 |
+ |
|
4 |
+This can be used when you must use an existing Python interpreter, not |
|
5 |
+the virtualenv bin/python |
|
6 |
+""" |
|
7 |
+ |
|
8 |
+try: |
|
9 |
+ __file__ |
|
10 |
+except NameError: |
|
11 |
+ raise AssertionError( |
|
12 |
+ "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") |
|
13 |
+import sys |
|
14 |
+import os |
|
15 |
+ |
|
16 |
+old_os_path = os.environ['PATH'] |
|
17 |
+os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path |
|
18 |
+base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
|
19 |
+if sys.platform == 'win32': |
|
20 |
+ site_packages = os.path.join(base, 'Lib', 'site-packages') |
|
21 |
+else: |
|
22 |
+ site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') |
|
23 |
+prev_sys_path = list(sys.path) |
|
24 |
+import site |
|
25 |
+site.addsitedir(site_packages) |
|
26 |
+sys.real_prefix = sys.prefix |
|
27 |
+sys.prefix = base |
|
28 |
+# Move the added items to the front of the path: |
|
29 |
+new_sys_path = [] |
|
30 |
+for item in list(sys.path): |
|
31 |
+ if item not in prev_sys_path: |
|
32 |
+ new_sys_path.append(item) |
|
33 |
+ sys.path.remove(item) |
|
34 |
+sys.path[:0] = new_sys_path |
0 | 35 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,9 @@ |
1 |
+#!/home/edwlan/github_repos/pybrowse/bin/python2.7 |
|
2 |
+# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.6c11','console_scripts','easy_install' |
|
3 |
+__requires__ = 'setuptools==0.6c11' |
|
4 |
+import sys |
|
5 |
+from pkg_resources import load_entry_point |
|
6 |
+ |
|
7 |
+sys.exit( |
|
8 |
+ load_entry_point('setuptools==0.6c11', 'console_scripts', 'easy_install')() |
|
9 |
+) |
0 | 10 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,9 @@ |
1 |
+#!/home/edwlan/github_repos/pybrowse/bin/python2.7 |
|
2 |
+# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.6c11','console_scripts','easy_install-2.7' |
|
3 |
+__requires__ = 'setuptools==0.6c11' |
|
4 |
+import sys |
|
5 |
+from pkg_resources import load_entry_point |
|
6 |
+ |
|
7 |
+sys.exit( |
|
8 |
+ load_entry_point('setuptools==0.6c11', 'console_scripts', 'easy_install-2.7')() |
|
9 |
+) |
0 | 10 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,9 @@ |
1 |
+#!/home/edwlan/github_repos/pybrowse/bin/python2.7 |
|
2 |
+# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.3.1','console_scripts','pip' |
|
3 |
+__requires__ = 'pip==1.3.1' |
|
4 |
+import sys |
|
5 |
+from pkg_resources import load_entry_point |
|
6 |
+ |
|
7 |
+sys.exit( |
|
8 |
+ load_entry_point('pip==1.3.1', 'console_scripts', 'pip')() |
|
9 |
+) |
0 | 10 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,9 @@ |
1 |
+#!/home/edwlan/github_repos/pybrowse/bin/python2.7 |
|
2 |
+# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.3.1','console_scripts','pip-2.7' |
|
3 |
+__requires__ = 'pip==1.3.1' |
|
4 |
+import sys |
|
5 |
+from pkg_resources import load_entry_point |
|
6 |
+ |
|
7 |
+sys.exit( |
|
8 |
+ load_entry_point('pip==1.3.1', 'console_scripts', 'pip-2.7')() |
|
9 |
+) |
3 | 5 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,101 @@ |
1 |
+import os |
|
2 |
+import sys |
|
3 |
+import warnings |
|
4 |
+import imp |
|
5 |
+import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib |
|
6 |
+ # Important! To work on pypy, this must be a module that resides in the |
|
7 |
+ # lib-python/modified-x.y.z directory |
|
8 |
+ |
|
9 |
+dirname = os.path.dirname |
|
10 |
+ |
|
11 |
+distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils') |
|
12 |
+if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): |
|
13 |
+ warnings.warn( |
|
14 |
+ "The virtualenv distutils package at %s appears to be in the same location as the system distutils?") |
|
15 |
+else: |
|
16 |
+ __path__.insert(0, distutils_path) |
|
17 |
+ real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY)) |
|
18 |
+ # Copy the relevant attributes |
|
19 |
+ try: |
|
20 |
+ __revision__ = real_distutils.__revision__ |
|
21 |
+ except AttributeError: |
|
22 |
+ pass |
|
23 |
+ __version__ = real_distutils.__version__ |
|
24 |
+ |
|
25 |
+from distutils import dist, sysconfig |
|
26 |
+ |
|
27 |
+try: |
|
28 |
+ basestring |
|
29 |
+except NameError: |
|
30 |
+ basestring = str |
|
31 |
+ |
|
32 |
+## patch build_ext (distutils doesn't know how to get the libs directory |
|
33 |
+## path on windows - it hardcodes the paths around the patched sys.prefix) |
|
34 |
+ |
|
35 |
+if sys.platform == 'win32': |
|
36 |
+ from distutils.command.build_ext import build_ext as old_build_ext |
|
37 |
+ class build_ext(old_build_ext): |
|
38 |
+ def finalize_options (self): |
|
39 |
+ if self.library_dirs is None: |
|
40 |
+ self.library_dirs = [] |
|
41 |
+ elif isinstance(self.library_dirs, basestring): |
|
42 |
+ self.library_dirs = self.library_dirs.split(os.pathsep) |
|
43 |
+ |
|
44 |
+ self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) |
|
45 |
+ old_build_ext.finalize_options(self) |
|
46 |
+ |
|
47 |
+ from distutils.command import build_ext as build_ext_module |
|
48 |
+ build_ext_module.build_ext = build_ext |
|
49 |
+ |
|
50 |
+## distutils.dist patches: |
|
51 |
+ |
|
52 |
+old_find_config_files = dist.Distribution.find_config_files |
|
53 |
+def find_config_files(self): |
|
54 |
+ found = old_find_config_files(self) |
|
55 |
+ system_distutils = os.path.join(distutils_path, 'distutils.cfg') |
|
56 |
+ #if os.path.exists(system_distutils): |
|
57 |
+ # found.insert(0, system_distutils) |
|
58 |
+ # What to call the per-user config file |
|
59 |
+ if os.name == 'posix': |
|
60 |
+ user_filename = ".pydistutils.cfg" |
|
61 |
+ else: |
|
62 |
+ user_filename = "pydistutils.cfg" |
|
63 |
+ user_filename = os.path.join(sys.prefix, user_filename) |
|
64 |
+ if os.path.isfile(user_filename): |
|
65 |
+ for item in list(found): |
|
66 |
+ if item.endswith('pydistutils.cfg'): |
|
67 |
+ found.remove(item) |
|
68 |
+ found.append(user_filename) |
|
69 |
+ return found |
|
70 |
+dist.Distribution.find_config_files = find_config_files |
|
71 |
+ |
|
72 |
+## distutils.sysconfig patches: |
|
73 |
+ |
|
74 |
+old_get_python_inc = sysconfig.get_python_inc |
|
75 |
+def sysconfig_get_python_inc(plat_specific=0, prefix=None): |
|
76 |
+ if prefix is None: |
|
77 |
+ prefix = sys.real_prefix |
|
78 |
+ return old_get_python_inc(plat_specific, prefix) |
|
79 |
+sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ |
|
80 |
+sysconfig.get_python_inc = sysconfig_get_python_inc |
|
81 |
+ |
|
82 |
+old_get_python_lib = sysconfig.get_python_lib |
|
83 |
+def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): |
|
84 |
+ if standard_lib and prefix is None: |
|
85 |
+ prefix = sys.real_prefix |
|
86 |
+ return old_get_python_lib(plat_specific, standard_lib, prefix) |
|
87 |
+sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ |
|
88 |
+sysconfig.get_python_lib = sysconfig_get_python_lib |
|
89 |
+ |
|
90 |
+old_get_config_vars = sysconfig.get_config_vars |
|
91 |
+def sysconfig_get_config_vars(*args): |
|
92 |
+ real_vars = old_get_config_vars(*args) |
|
93 |
+ if sys.platform == 'win32': |
|
94 |
+ lib_dir = os.path.join(sys.real_prefix, "libs") |
|
95 |
+ if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars: |
|
96 |
+ real_vars['LIBDIR'] = lib_dir # asked for all |
|
97 |
+ elif isinstance(real_vars, list) and 'LIBDIR' in args: |
|
98 |
+ real_vars = real_vars + [lib_dir] # asked for list |
|
99 |
+ return real_vars |
|
100 |
+sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ |
|
101 |
+sysconfig.get_config_vars = sysconfig_get_config_vars |
0 | 5 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,776 @@ |
1 |
+Metadata-Version: 1.1 |
|
2 |
+Name: pip |
|
3 |
+Version: 1.3.1 |
|
4 |
+Summary: A tool for installing and managing Python packages. |
|
5 |
+Home-page: http://www.pip-installer.org |
|
6 |
+Author: The pip developers |
|
7 |
+Author-email: python-virtualenv@groups.google.com |
|
8 |
+License: MIT |
|
9 |
+Description: |
|
10 |
+ Project Info |
|
11 |
+ ============ |
|
12 |
+ |
|
13 |
+ * Project Page: https://github.com/pypa/pip |
|
14 |
+ * Bug Tracking: https://github.com/pypa/pip/issues |
|
15 |
+ * Mailing list: http://groups.google.com/group/python-virtualenv |
|
16 |
+ * Docs: http://www.pip-installer.org |
|
17 |
+ * IRC: #pip. |
|
18 |
+ |
|
19 |
+ |
|
20 |
+ Quickstart |
|
21 |
+ ========== |
|
22 |
+ |
|
23 |
+ Install a package: |
|
24 |
+ |
|
25 |
+ :: |
|
26 |
+ |
|
27 |
+ $ pip install SomePackage==1.0 |
|
28 |
+ [...] |
|
29 |
+ Successfully installed SomePackage |
|
30 |
+ |
|
31 |
+ Show what files were installed: |
|
32 |
+ |
|
33 |
+ :: |
|
34 |
+ |
|
35 |
+ $ pip show --files SomePackage |
|
36 |
+ Name: SomePackage |
|
37 |
+ Version: 1.0 |
|
38 |
+ Location: /my/env/lib/pythonx.x/site-packages |
|
39 |
+ Files: |
|
40 |
+ ../somepackage/__init__.py |
|
41 |
+ [...] |
|
42 |
+ |
|
43 |
+ List what packages are outdated: |
|
44 |
+ |
|
45 |
+ :: |
|
46 |
+ |
|
47 |
+ $ pip list --outdated |
|
48 |
+ SomePackage (Current: 1.0 Latest: 2.0) |
|
49 |
+ |
|
50 |
+ Upgrade a package: |
|
51 |
+ |
|
52 |
+ :: |
|
53 |
+ |
|
54 |
+ $ pip install --upgrade SomePackage |
|
55 |
+ [...] |
|
56 |
+ Found existing installation: SomePackage 1.0 |
|
57 |
+ Uninstalling SomePackage: |
|
58 |
+ Successfully uninstalled SomePackage |
|
59 |
+ Running setup.py install for SomePackage |
|
60 |
+ Successfully installed SomePackage |
|
61 |
+ |
|
62 |
+ Uninstall a package: |
|
63 |
+ |
|
64 |
+ :: |
|
65 |
+ |
|
66 |
+ $ pip uninstall SomePackage |
|
67 |
+ Uninstalling SomePackage: |
|
68 |
+ /my/env/lib/pythonx.x/site-packages/somepackage |
|
69 |
+ Proceed (y/n)? y |
|
70 |
+ Successfully uninstalled SomePackage |
|
71 |
+ |
|
72 |
+ |
|
73 |
+ Changelog |
|
74 |
+ ========= |
|
75 |
+ |
|
76 |
+ 1.3.1 (2013-03-08) |
|
77 |
+ ------------------ |
|
78 |
+ |
|
79 |
+ * Fixed a major backward incompatible change of parsing URLs to externally |
|
80 |
+ hosted packages that got accidentily included in 1.3. |
|
81 |
+ |
|
82 |
+ 1.3 (2013-03-07) |
|
83 |
+ ---------------- |
|
84 |
+ |
|
85 |
+ * SSL Cert Verification; Make https the default for PyPI access. |
|
86 |
+ Thanks James Cleveland, Giovanni Bajo, Marcus Smith and many others (Pull #789). |
|
87 |
+ |
|
88 |
+ * Added "pip list" for listing installed packages and the latest version |
|
89 |
+ available. Thanks Rafael Caricio, Miguel Araujo, Dmitry Gladkov (Pull #752) |
|
90 |
+ |
|
91 |
+ * Fixed security issues with pip's use of temp build directories. |
|
92 |
+ Thanks David (d1b) and Thomas Guttler. (Pull #780) |
|
93 |
+ |
|
94 |
+ * Improvements to sphinx docs and cli help. (Pull #773) |
|
95 |
+ |
|
96 |
+ * Fixed issue #707, dealing with OS X temp dir handling, which was causing |
|
97 |
+ global NumPy installs to fail. (Pull #768) |
|
98 |
+ |
|
99 |
+ * Split help output into general vs command-specific option groups. |
|
100 |
+ Thanks Georgi Valkov. (Pull #744; Pull #721 contains preceding refactor) |
|
101 |
+ |
|
102 |
+ * Fixed dependency resolution when installing from archives with uppercase |
|
103 |
+ project names. (Pull #724) |
|
104 |
+ |
|
105 |
+ * Fixed problem where re-installs always occurred when using file:// find-links. |
|
106 |
+ (Pulls #683/#702) |
|
107 |
+ |
|
108 |
+ * "pip install -v" now shows the full download url, not just the archive name. |
|
109 |
+ Thanks Marc Abramowitz (Pull #687) |
|
110 |
+ |
|
111 |
+ * Fix to prevent unnecessary PyPI redirects. Thanks Alex Gronholm (Pull #695) |
|
112 |
+ |
|
113 |
+ * Fixed issue #670 - install failure under Python 3 when the same version |
|
114 |
+ of a package is found under 2 different URLs. Thanks Paul Moore (Pull #671) |
|
115 |
+ |
|
116 |
+ * Fix git submodule recursive updates. Thanks Roey Berman. (Pulls #674) |
|
117 |
+ |
|
118 |
+ * Explicitly ignore rel='download' links while looking for html pages. |
|
119 |
+ Thanks Maxime R. (Pull #677) |
|
120 |
+ |
|
121 |
+ * --user/--upgrade install options now work together. Thanks 'eevee' for |
|
122 |
+ discovering the problem. (Pull #705) |
|
123 |
+ |
|
124 |
+ * Added check in ``install --download`` to prevent re-downloading if the target |
|
125 |
+ file already exists. Thanks Andrey Bulgakov. (Pull #669) |
|
126 |
+ |
|
127 |
+ * Added support for bare paths (including relative paths) as argument to |
|
128 |
+ `--find-links`. Thanks Paul Moore for draft patch. |
|
129 |
+ |
|
130 |
+ * Added support for --no-index in requirements files. |
|
131 |
+ |
|
132 |
+ * Added "pip show" command to get information about an installed package. |
|
133 |
+ Fixes #131. Thanks Kelsey Hightower and Rafael Caricio. |
|
134 |
+ |
|
135 |
+ * Added `--root` option for "pip install" to specify root directory. Behaves |
|
136 |
+ like the same option in distutils but also plays nice with pip's egg-info. |
|
137 |
+ Thanks Przemek Wrzos. (Issue #253 / Pull #693) |
|
138 |
+ |
|
139 |
+ 1.2.1 (2012-09-06) |
|
140 |
+ ------------------ |
|
141 |
+ |
|
142 |
+ * Fixed a regression introduced in 1.2 about raising an exception when |
|
143 |
+ not finding any files to uninstall in the current environment. Thanks for |
|
144 |
+ the fix, Marcus Smith. |
|
145 |
+ |
|
146 |
+ 1.2 (2012-09-01) |
|
147 |
+ ---------------- |
|
148 |
+ |
|
149 |
+ * **Dropped support for Python 2.4** The minimum supported Python version is |
|
150 |
+ now Python 2.5. |
|
151 |
+ |
|
152 |
+ * Fixed issue #605 - pypi mirror support broken on some DNS responses. Thanks |
|
153 |
+ philwhin. |
|
154 |
+ |
|
155 |
+ * Fixed issue #355 - pip uninstall removes files it didn't install. Thanks |
|
156 |
+ pjdelport. |
|
157 |
+ |
|
158 |
+ * Fixed issues #493, #494, #440, and #573 related to improving support for the |
|
159 |
+ user installation scheme. Thanks Marcus Smith. |
|
160 |
+ |
|
161 |
+ * Write failure log to temp file if default location is not writable. Thanks |
|
162 |
+ andreigc. |
|
163 |
+ |
|
164 |
+ * Pull in submodules for git editable checkouts. Fixes #289 and #421. Thanks |
|
165 |
+ Hsiaoming Yang and Markus Hametner. |
|
166 |
+ |
|
167 |
+ * Use a temporary directory as the default build location outside of a |
|
168 |
+ virtualenv. Fixes issues #339 and #381. Thanks Ben Rosser. |
|
169 |
+ |
|
170 |
+ * Added support for specifying extras with local editables. Thanks Nick |
|
171 |
+ Stenning. |
|
172 |
+ |
|
173 |
+ * Added ``--egg`` flag to request egg-style rather than flat installation. Refs |
|
174 |
+ issue #3. Thanks Kamal Bin Mustafa. |
|
175 |
+ |
|
176 |
+ * Fixed issue #510 - prevent e.g. ``gmpy2-2.0.tar.gz`` from matching a request |
|
177 |
+ to ``pip install gmpy``; sdist filename must begin with full project name |
|
178 |
+ followed by a dash. Thanks casevh for the report. |
|
179 |
+ |
|
180 |
+ * Fixed issue #504 - allow package URLS to have querystrings. Thanks W. |
|
181 |
+ Trevor King. |
|
182 |
+ |
|
183 |
+ * Fixed issue #58 - pip freeze now falls back to non-editable format rather |
|
184 |
+ than blowing up if it can't determine the origin repository of an editable. |
|
185 |
+ Thanks Rory McCann. |
|
186 |
+ |
|
187 |
+ * Added a `__main__.py` file to enable `python -m pip` on Python versions |
|
188 |
+ that support it. Thanks Alexey Luchko. |
|
189 |
+ |
|
190 |
+ * Fixed issue #487 - upgrade from VCS url of project that does exist on |
|
191 |
+ index. Thanks Andrew Knapp for the report. |
|
192 |
+ |
|
193 |
+ * Fixed issue #486 - fix upgrade from VCS url of project with no distribution |
|
194 |
+ on index. Thanks Andrew Knapp for the report. |
|
195 |
+ |
|
196 |
+ * Fixed issue #427 - clearer error message on a malformed VCS url. Thanks |
|
197 |
+ Thomas Fenzl. |
|
198 |
+ |
|
199 |
+ * Added support for using any of the built in guaranteed algorithms in |
|
200 |
+ ``hashlib`` as a checksum hash. |
|
201 |
+ |
|
202 |
+ * Fixed issue #321 - Raise an exception if current working directory can't be |
|
203 |
+ found or accessed. |
|
204 |
+ |
|
205 |
+ * Fixed issue #82 - Removed special casing of the user directory and use the |
|
206 |
+ Python default instead. |
|
207 |
+ |
|
208 |
+ * Fixed #436 - Only warn about version conflicts if there is actually one. |
|
209 |
+ This re-enables using ``==dev`` in requirements files. |
|
210 |
+ |
|
211 |
+ * Moved tests to be run on Travis CI: http://travis-ci.org/pypa/pip |
|
212 |
+ |
|
213 |
+ * Added a better help formatter. |
|
214 |
+ |
|
215 |
+ 1.1 (2012-02-16) |
|
216 |
+ ---------------- |
|
217 |
+ |
|
218 |
+ * Fixed issue #326 - don't crash when a package's setup.py emits UTF-8 and |
|
219 |
+ then fails. Thanks Marc Abramowitz. |
|
220 |
+ |
|
221 |
+ * Added ``--target`` option for installing directly to arbitrary directory. |
|
222 |
+ Thanks Stavros Korokithakis. |
|
223 |
+ |
|
224 |
+ * Added support for authentication with Subversion repositories. Thanks |
|
225 |
+ Qiangning Hong. |
|
226 |
+ |
|
227 |
+ * Fixed issue #315 - ``--download`` now downloads dependencies as well. |
|
228 |
+ Thanks Qiangning Hong. |
|
229 |
+ |
|
230 |
+ * Errors from subprocesses will display the current working directory. |
|
231 |
+ Thanks Antti Kaihola. |
|
232 |
+ |
|
233 |
+ * Fixed issue #369 - compatibility with Subversion 1.7. Thanks Qiangning |
|
234 |
+ Hong. Note that setuptools remains incompatible with Subversion 1.7; to |
|
235 |
+ get the benefits of pip's support you must use Distribute rather than |
|
236 |
+ setuptools. |
|
237 |
+ |
|
238 |
+ * Fixed issue #57 - ignore py2app-generated OS X mpkg zip files in finder. |
|
239 |
+ Thanks Rene Dudfield. |
|
240 |
+ |
|
241 |
+ * Fixed issue #182 - log to ~/Library/Logs/ by default on OS X framework |
|
242 |
+ installs. Thanks Dan Callahan for report and patch. |
|
243 |
+ |
|
244 |
+ * Fixed issue #310 - understand version tags without minor version ("py3") |
|
245 |
+ in sdist filenames. Thanks Stuart Andrews for report and Olivier Girardot for |
|
246 |
+ patch. |
|
247 |
+ |
|
248 |
+ * Fixed issue #7 - Pip now supports optionally installing setuptools |
|
249 |
+ "extras" dependencies; e.g. "pip install Paste[openid]". Thanks Matt Maker |
|
250 |
+ and Olivier Girardot. |
|
251 |
+ |
|
252 |
+ * Fixed issue #391 - freeze no longer borks on requirements files with |
|
253 |
+ --index-url or --find-links. Thanks Herbert Pfennig. |
|
254 |
+ |
|
255 |
+ * Fixed issue #288 - handle symlinks properly. Thanks lebedov for the patch. |
|
256 |
+ |
|
257 |
+ * Fixed issue #49 - pip install -U no longer reinstalls the same versions of |
|
258 |
+ packages. Thanks iguananaut for the pull request. |
|
259 |
+ |
|
260 |
+ * Removed ``-E``/``--environment`` option and ``PIP_RESPECT_VIRTUALENV``; |
|
261 |
+ both use a restart-in-venv mechanism that's broken, and neither one is |
|
262 |
+ useful since every virtualenv now has pip inside it. Replace ``pip -E |
|
263 |
+ path/to/venv install Foo`` with ``virtualenv path/to/venv && |
|
264 |
+ path/to/venv/pip install Foo``. |
|
265 |
+ |
|
266 |
+ * Fixed issue #366 - pip throws IndexError when it calls `scraped_rel_links` |
|
267 |
+ |
|
268 |
+ * Fixed issue #22 - pip search should set and return a userful shell status code |
|
269 |
+ |
|
270 |
+ * Fixed issue #351 and #365 - added global ``--exists-action`` command line |
|
271 |
+ option to easier script file exists conflicts, e.g. from editable |
|
272 |
+ requirements from VCS that have a changed repo URL. |
|
273 |
+ |
|
274 |
+ |
|
275 |
+ 1.0.2 (2011-07-16) |
|
276 |
+ ------------------ |
|
277 |
+ |
|
278 |
+ * Fixed docs issues. |
|
279 |
+ * Fixed issue #295 - Reinstall a package when using the ``install -I`` option |
|
280 |
+ * Fixed issue #283 - Finds a Git tag pointing to same commit as origin/master |
|
281 |
+ * Fixed issue #279 - Use absolute path for path to docs in setup.py |
|
282 |
+ * Fixed issue #314 - Correctly handle exceptions on Python3. |
|
283 |
+ * Fixed issue #320 - Correctly parse ``--editable`` lines in requirements files |
|
284 |
+ |
|
285 |
+ 1.0.1 (2011-04-30) |
|
286 |
+ ------------------ |
|
287 |
+ |
|
288 |
+ * Start to use git-flow. |
|
289 |
+ * Fixed issue #274 - `find_command` should not raise AttributeError |
|
290 |
+ * Fixed issue #273 - respect Content-Disposition header. Thanks Bradley Ayers. |
|
291 |
+ * Fixed issue #233 - pathext handling on Windows. |
|
292 |
+ * Fixed issue #252 - svn+svn protocol. |
|
293 |
+ * Fixed issue #44 - multiple CLI searches. |
|
294 |
+ * Fixed issue #266 - current working directory when running setup.py clean. |
|
295 |
+ |
|
296 |
+ 1.0 (2011-04-04) |
|
297 |
+ ---------------- |
|
298 |
+ |
|
299 |
+ * Added Python 3 support! Huge thanks to Vinay Sajip, Vitaly Babiy, Kelsey |
|
300 |
+ Hightower, and Alex Gronholm, among others. |
|
301 |
+ |
|
302 |
+ * Download progress only shown on a real TTY. Thanks Alex Morega. |
|
303 |
+ |
|
304 |
+ * Fixed finding of VCS binaries to not be fooled by same-named directories. |
|
305 |
+ Thanks Alex Morega. |
|
306 |
+ |
|
307 |
+ * Fixed uninstall of packages from system Python for users of Debian/Ubuntu |
|
308 |
+ python-setuptools package (workaround until fixed in Debian and Ubuntu). |
|
309 |
+ |
|
310 |
+ * Added `get-pip.py <https://raw.github.com/pypa/pip/master/contrib/get-pip.py>`_ |
|
311 |
+ installer. Simply download and execute it, using the Python interpreter of |
|
312 |
+ your choice:: |
|
313 |
+ |
|
314 |
+ $ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py |
|
315 |
+ $ python get-pip.py |
|
316 |
+ |
|
317 |
+ This may have to be run as root. |
|
318 |
+ |
|
319 |
+ .. note:: |
|
320 |
+ |
|
321 |
+ Make sure you have `distribute <http://pypi.python.org/pypi/distribute>`_ |
|
322 |
+ installed before using the installer! |
|
323 |
+ |
|
324 |
+ 0.8.3 |
|
325 |
+ ----- |
|
326 |
+ |
|
327 |
+ * Moved main repository to Github: https://github.com/pypa/pip |
|
328 |
+ |
|
329 |
+ * Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer, Brian Rosner |
|
330 |
+ |
|
331 |
+ * Fixed issue #14 - No uninstall-on-upgrade with URL package. Thanks Oliver Tonnhofer |
|
332 |
+ |
|
333 |
+ * Fixed issue #163 - Egg name not properly resolved. Thanks Igor Sobreira |
|
334 |
+ |
|
335 |
+ * Fixed issue #178 - Non-alphabetical installation of requirements. Thanks Igor Sobreira |
|
336 |
+ |
|
337 |
+ * Fixed issue #199 - Documentation mentions --index instead of --index-url. Thanks Kelsey Hightower |
|
338 |
+ |
|
339 |
+ * Fixed issue #204 - rmtree undefined in mercurial.py. Thanks Kelsey Hightower |
|
340 |
+ |
|
341 |
+ * Fixed bug in Git vcs backend that would break during reinstallation. |
|
342 |
+ |
|
343 |
+ * Fixed bug in Mercurial vcs backend related to pip freeze and branch/tag resolution. |
|
344 |
+ |
|
345 |
+ * Fixed bug in version string parsing related to the suffix "-dev". |
|
346 |
+ |
|
347 |
+ 0.8.2 |
|
348 |
+ ----- |
|
349 |
+ |
|
350 |
+ * Avoid redundant unpacking of bundles (from pwaller) |
|
351 |
+ |
|
352 |
+ * Fixed issue #32, #150, #161 - Fixed checking out the correct |
|
353 |
+ tag/branch/commit when updating an editable Git requirement. |
|
354 |
+ |
|
355 |
+ * Fixed issue #49 - Added ability to install version control requirements |
|
356 |
+ without making them editable, e.g.:: |
|
357 |
+ |
|
358 |
+ pip install git+https://github.com/pypa/pip/ |
|
359 |
+ |
|
360 |
+ * Fixed issue #175 - Correctly locate build and source directory on Mac OS X. |
|
361 |
+ |
|
362 |
+ * Added ``git+https://`` scheme to Git VCS backend. |
|
363 |
+ |
|
364 |
+ 0.8.1 |
|
365 |
+ ----- |
|
366 |
+ |
|
367 |
+ * Added global --user flag as shortcut for --install-option="--user". From |
|
368 |
+ Ronny Pfannschmidt. |
|
369 |
+ |
|
370 |
+ * Added support for `PyPI mirrors <http://pypi.python.org/mirrors>`_ as |
|
371 |
+ defined in `PEP 381 <http://www.python.org/dev/peps/pep-0381/>`_, from |
|
372 |
+ Jannis Leidel. |
|
373 |
+ |
|
374 |
+ * Fixed issue #138 - Git revisions ignored. Thanks John-Scott Atlakson. |
|
375 |
+ |
|
376 |
+ * Fixed issue #95 - Initial editable install of github package from a tag fails. Thanks John-Scott Atlakson. |
|
377 |
+ |
|
378 |
+ * Fixed issue #107 - Can't install if a directory in cwd has the same name as the package you're installing. |
|
379 |
+ |
|
380 |
+ * Fixed issue #39 - --install-option="--prefix=~/.local" ignored with -e. |
|
381 |
+ Thanks Ronny Pfannschmidt and Wil Tan. |
|
382 |
+ |
|
383 |
+ |
|
384 |
+ |
|
385 |
+ 0.8 |
|
386 |
+ --- |
|
387 |
+ |
|
388 |
+ * Track which ``build/`` directories pip creates, never remove directories |
|
389 |
+ it doesn't create. From Hugo Lopes Tavares. |
|
390 |
+ |
|
391 |
+ * Pip now accepts file:// index URLs. Thanks Dave Abrahams. |
|
392 |
+ |
|
393 |
+ * Various cleanup to make test-running more consistent and less fragile. |
|
394 |
+ Thanks Dave Abrahams. |
|
395 |
+ |
|
396 |
+ * Real Windows support (with passing tests). Thanks Dave Abrahams. |
|
397 |
+ |
|
398 |
+ * ``pip-2.7`` etc. scripts are created (Python-version specific scripts) |
|
399 |
+ |
|
400 |
+ * ``contrib/build-standalone`` script creates a runnable ``.zip`` form of |
|
401 |
+ pip, from Jannis Leidel |
|
402 |
+ |
|
403 |
+ * Editable git repos are updated when reinstalled |
|
404 |
+ |
|
405 |
+ * Fix problem with ``--editable`` when multiple ``.egg-info/`` directories |
|
406 |
+ are found. |
|
407 |
+ |
|
408 |
+ * A number of VCS-related fixes for ``pip freeze``, from Hugo Lopes Tavares. |
|
409 |
+ |
|
410 |
+ * Significant test framework changes, from Hugo Lopes Tavares. |
|
411 |
+ |
|
412 |
+ 0.7.2 |
|
413 |
+ ----- |
|
414 |
+ |
|
415 |
+ * Set zip_safe=False to avoid problems some people are encountering where |
|
416 |
+ pip is installed as a zip file. |
|
417 |
+ |
|
418 |
+ 0.7.1 |
|
419 |
+ ----- |
|
420 |
+ |
|
421 |
+ * Fixed opening of logfile with no directory name. Thanks Alexandre Conrad. |
|
422 |
+ |
|
423 |
+ * Temporary files are consistently cleaned up, especially after |
|
424 |
+ installing bundles, also from Alex Conrad. |
|
425 |
+ |
|
426 |
+ * Tests now require at least ScriptTest 1.0.3. |
|
427 |
+ |
|
428 |
+ 0.7 |
|
429 |
+ --- |
|
430 |
+ |
|
431 |
+ * Fixed uninstallation on Windows |
|
432 |
+ * Added ``pip search`` command. |
|
433 |
+ * Tab-complete names of installed distributions for ``pip uninstall``. |
|
434 |
+ * Support tab-completion when there is a global-option before the |
|
435 |
+ subcommand. |
|
436 |
+ * Install header files in standard (scheme-default) location when installing |
|
437 |
+ outside a virtualenv. Install them to a slightly more consistent |
|
438 |
+ non-standard location inside a virtualenv (since the standard location is |
|
439 |
+ a non-writable symlink to the global location). |
|
440 |
+ * pip now logs to a central location by default (instead of creating |
|
441 |
+ ``pip-log.txt`` all over the place) and constantly overwrites the |
|
442 |
+ file in question. On Unix and Mac OS X this is ``'$HOME/.pip/pip.log'`` |
|
443 |
+ and on Windows it's ``'%HOME%\\pip\\pip.log'``. You are still able to |
|
444 |
+ override this location with the ``$PIP_LOG_FILE`` environment variable. |
|
445 |
+ For a complete (appended) logfile use the separate ``'--log'`` command line |
|
446 |
+ option. |
|
447 |
+ * Fixed an issue with Git that left an editable packge as a checkout of a |
|
448 |
+ remote branch, even if the default behaviour would have been fine, too. |
|
449 |
+ * Fixed installing from a Git tag with older versions of Git. |
|
450 |
+ * Expand "~" in logfile and download cache paths. |
|
451 |
+ * Speed up installing from Mercurial repositories by cloning without |
|
452 |
+ updating the working copy multiple times. |
|
453 |
+ * Fixed installing directly from directories (e.g. |
|
454 |
+ ``pip install path/to/dir/``). |
|
455 |
+ * Fixed installing editable packages with ``svn+ssh`` URLs. |
|
456 |
+ * Don't print unwanted debug information when running the freeze command. |
|
457 |
+ * Create log file directory automatically. Thanks Alexandre Conrad. |
|
458 |
+ * Make test suite easier to run successfully. Thanks Dave Abrahams. |
|
459 |
+ * Fixed "pip install ." and "pip install .."; better error for directory |
|
460 |
+ without setup.py. Thanks Alexandre Conrad. |
|
461 |
+ * Support Debian/Ubuntu "dist-packages" in zip command. Thanks duckx. |
|
462 |
+ * Fix relative --src folder. Thanks Simon Cross. |
|
463 |
+ * Handle missing VCS with an error message. Thanks Alexandre Conrad. |
|
464 |
+ * Added --no-download option to install; pairs with --no-install to separate |
|
465 |
+ download and installation into two steps. Thanks Simon Cross. |
|
466 |
+ * Fix uninstalling from requirements file containing -f, -i, or |
|
467 |
+ --extra-index-url. |
|
468 |
+ * Leftover build directories are now removed. Thanks Alexandre Conrad. |
|
469 |
+ |
|
470 |
+ 0.6.3 |
|
471 |
+ ----- |
|
472 |
+ |
|
473 |
+ * Fixed import error on Windows with regard to the backwards compatibility |
|
474 |
+ package |
|
475 |
+ |
|
476 |
+ 0.6.2 |
|
477 |
+ ----- |
|
478 |
+ |
|
479 |
+ * Fixed uninstall when /tmp is on a different filesystem. |
|
480 |
+ |
|
481 |
+ * Fixed uninstallation of distributions with namespace packages. |
|
482 |
+ |
|
483 |
+ 0.6.1 |
|
484 |
+ ----- |
|
485 |
+ |
|
486 |
+ * Added support for the ``https`` and ``http-static`` schemes to the |
|
487 |
+ Mercurial and ``ftp`` scheme to the Bazaar backend. |
|
488 |
+ |
|
489 |
+ * Fixed uninstallation of scripts installed with easy_install. |
|
490 |
+ |
|
491 |
+ * Fixed an issue in the package finder that could result in an |
|
492 |
+ infinite loop while looking for links. |
|
493 |
+ |
|
494 |
+ * Fixed issue with ``pip bundle`` and local files (which weren't being |
|
495 |
+ copied into the bundle), from Whit Morriss. |
|
496 |
+ |
|
497 |
+ 0.6 |
|
498 |
+ --- |
|
499 |
+ |
|
500 |
+ * Add ``pip uninstall`` and uninstall-before upgrade (from Carl |
|
501 |
+ Meyer). |
|
502 |
+ |
|
503 |
+ * Extended configurability with config files and environment variables. |
|
504 |
+ |
|
505 |
+ * Allow packages to be upgraded, e.g., ``pip install Package==0.1`` |
|
506 |
+ then ``pip install Package==0.2``. |
|
507 |
+ |
|
508 |
+ * Allow installing/upgrading to Package==dev (fix "Source version does not |
|
509 |
+ match target version" errors). |
|
510 |
+ |
|
511 |
+ * Added command and option completion for bash and zsh. |
|
512 |
+ |
|
513 |
+ * Extended integration with virtualenv by providing an option to |
|
514 |
+ automatically use an active virtualenv and an option to warn if no active |
|
515 |
+ virtualenv is found. |
|
516 |
+ |
|
517 |
+ * Fixed a bug with pip install --download and editable packages, where |
|
518 |
+ directories were being set with 0000 permissions, now defaults to 755. |
|
519 |
+ |
|
520 |
+ * Fixed uninstallation of easy_installed console_scripts. |
|
521 |
+ |
|
522 |
+ * Fixed uninstallation on Mac OS X Framework layout installs |
|
523 |
+ |
|
524 |
+ * Fixed bug preventing uninstall of editables with source outside venv. |
|
525 |
+ |
|
526 |
+ * Creates download cache directory if not existing. |
|
527 |
+ |
|
528 |
+ 0.5.1 |
|
529 |
+ ----- |
|
530 |
+ |
|
531 |
+ * Fixed a couple little bugs, with git and with extensions. |
|
532 |
+ |
|
533 |
+ 0.5 |
|
534 |
+ --- |
|
535 |
+ |
|
536 |
+ * Added ability to override the default log file name (``pip-log.txt``) |
|
537 |
+ with the environmental variable ``$PIP_LOG_FILE``. |
|
538 |
+ |
|
539 |
+ * Made the freeze command print installed packages to stdout instead of |
|
540 |
+ writing them to a file. Use simple redirection (e.g. |
|
541 |
+ ``pip freeze > stable-req.txt``) to get a file with requirements. |
|
542 |
+ |
|
543 |
+ * Fixed problem with freezing editable packages from a Git repository. |
|
544 |
+ |
|
545 |
+ * Added support for base URLs using ``<base href='...'>`` when parsing |
|
546 |
+ HTML pages. |
|
547 |
+ |
|
548 |
+ * Fixed installing of non-editable packages from version control systems. |
|
549 |
+ |
|
550 |
+ * Fixed issue with Bazaar's bzr+ssh scheme. |
|
551 |
+ |
|
552 |
+ * Added --download-dir option to the install command to retrieve package |
|
553 |
+ archives. If given an editable package it will create an archive of it. |
|
554 |
+ |
|
555 |
+ * Added ability to pass local file and directory paths to ``--find-links``, |
|
556 |
+ e.g. ``--find-links=file:///path/to/my/private/archive`` |
|
557 |
+ |
|
558 |
+ * Reduced the amount of console log messages when fetching a page to find a |
|
559 |
+ distribution was problematic. The full messages can be found in pip-log.txt. |
|
560 |
+ |
|
561 |
+ * Added ``--no-deps`` option to install ignore package dependencies |
|
562 |
+ |
|
563 |
+ * Added ``--no-index`` option to ignore the package index (PyPI) temporarily |
|
564 |
+ |
|
565 |
+ * Fixed installing editable packages from Git branches. |
|
566 |
+ |
|
567 |
+ * Fixes freezing of editable packages from Mercurial repositories. |
|
568 |
+ |
|
569 |
+ * Fixed handling read-only attributes of build files, e.g. of Subversion and |
|
570 |
+ Bazaar on Windows. |
|
571 |
+ |
|
572 |
+ * When downloading a file from a redirect, use the redirected |
|
573 |
+ location's extension to guess the compression (happens specifically |
|
574 |
+ when redirecting to a bitbucket.org tip.gz file). |
|
575 |
+ |
|
576 |
+ * Editable freeze URLs now always use revision hash/id rather than tip or |
|
577 |
+ branch names which could move. |
|
578 |
+ |
|
579 |
+ * Fixed comparison of repo URLs so incidental differences such as |
|
580 |
+ presence/absence of final slashes or quoted/unquoted special |
|
581 |
+ characters don't trigger "ignore/switch/wipe/backup" choice. |
|
582 |
+ |
|
583 |
+ * Fixed handling of attempt to checkout editable install to a |
|
584 |
+ non-empty, non-repo directory. |
|
585 |
+ |
|
586 |
+ 0.4 |
|
587 |
+ --- |
|
588 |
+ |
|
589 |
+ * Make ``-e`` work better with local hg repositories |
|
590 |
+ |
|
591 |
+ * Construct PyPI URLs the exact way easy_install constructs URLs (you |
|
592 |
+ might notice this if you use a custom index that is |
|
593 |
+ slash-sensitive). |
|
594 |
+ |
|
595 |
+ * Improvements on Windows (from `Ionel Maries Cristian |
|
596 |
+ <http://ionelmc.wordpress.com/>`_). |
|
597 |
+ |
|
598 |
+ * Fixed problem with not being able to install private git repositories. |
|
599 |
+ |
|
600 |
+ * Make ``pip zip`` zip all its arguments, not just the first. |
|
601 |
+ |
|
602 |
+ * Fix some filename issues on Windows. |
|
603 |
+ |
|
604 |
+ * Allow the ``-i`` and ``--extra-index-url`` options in requirements |
|
605 |
+ files. |
|
606 |
+ |
|
607 |
+ * Fix the way bundle components are unpacked and moved around, to make |
|
608 |
+ bundles work. |
|
609 |
+ |
|
610 |
+ * Adds ``-s`` option to allow the access to the global site-packages if a |
|
611 |
+ virtualenv is to be created. |
|
612 |
+ |
|
613 |
+ * Fixed support for Subversion 1.6. |
|
614 |
+ |
|
615 |
+ 0.3.1 |
|
616 |
+ ----- |
|
617 |
+ |
|
618 |
+ * Improved virtualenv restart and various path/cleanup problems on win32. |
|
619 |
+ |
|
620 |
+ * Fixed a regression with installing from svn repositories (when not |
|
621 |
+ using ``-e``). |
|
622 |
+ |
|
623 |
+ * Fixes when installing editable packages that put their source in a |
|
624 |
+ subdirectory (like ``src/``). |
|
625 |
+ |
|
626 |
+ * Improve ``pip -h`` |
|
627 |
+ |
|
628 |
+ 0.3 |
|
629 |
+ --- |
|
630 |
+ |
|
631 |
+ * Added support for editable packages created from Git, Mercurial and Bazaar |
|
632 |
+ repositories and ability to freeze them. Refactored support for version |
|
633 |
+ control systems. |
|
634 |
+ |
|
635 |
+ * Do not use ``sys.exit()`` from inside the code, instead use a |
|
636 |
+ return. This will make it easier to invoke programmatically. |
|
637 |
+ |
|
638 |
+ * Put the install record in ``Package.egg-info/installed-files.txt`` |
|
639 |
+ (previously they went in |
|
640 |
+ ``site-packages/install-record-Package.txt``). |
|
641 |
+ |
|
642 |
+ * Fix a problem with ``pip freeze`` not including ``-e svn+`` when an |
|
643 |
+ svn structure is peculiar. |
|
644 |
+ |
|
645 |
+ * Allow ``pip -E`` to work with a virtualenv that uses a different |
|
646 |
+ version of Python than the parent environment. |
|
647 |
+ |
|
648 |
+ * Fixed Win32 virtualenv (``-E``) option. |
|
649 |
+ |
|
650 |
+ * Search the links passed in with ``-f`` for packages. |
|
651 |
+ |
|
652 |
+ * Detect zip files, even when the file doesn't have a ``.zip`` |
|
653 |
+ extension and it is served with the wrong Content-Type. |
|
654 |
+ |
|
655 |
+ * Installing editable from existing source now works, like ``pip |
|
656 |
+ install -e some/path/`` will install the package in ``some/path/``. |
|
657 |
+ Most importantly, anything that package requires will also be |
|
658 |
+ installed by pip. |
|
659 |
+ |
|
660 |
+ * Add a ``--path`` option to ``pip un/zip``, so you can avoid zipping |
|
661 |
+ files that are outside of where you expect. |
|
662 |
+ |
|
663 |
+ * Add ``--simulate`` option to ``pip zip``. |
|
664 |
+ |
|
665 |
+ 0.2.1 |
|
666 |
+ ----- |
|
667 |
+ |
|
668 |
+ * Fixed small problem that prevented using ``pip.py`` without actually |
|
669 |
+ installing pip. |
|
670 |
+ |
|
671 |
+ * Fixed ``--upgrade``, which would download and appear to install |
|
672 |
+ upgraded packages, but actually just reinstall the existing package. |
|
673 |
+ |
|
674 |
+ * Fixed Windows problem with putting the install record in the right |
|
675 |
+ place, and generating the ``pip`` script with Setuptools. |
|
676 |
+ |
|
677 |
+ * Download links that include embedded spaces or other unsafe |
|
678 |
+ characters (those characters get %-encoded). |
|
679 |
+ |
|
680 |
+ * Fixed use of URLs in requirement files, and problems with some blank |
|
681 |
+ lines. |
|
682 |
+ |
|
683 |
+ * Turn some tar file errors into warnings. |
|
684 |
+ |
|
685 |
+ 0.2 |
|
686 |
+ --- |
|
687 |
+ |
|
688 |
+ * Renamed to ``pip``, and to install you now do ``pip install |
|
689 |
+ PACKAGE`` |
|
690 |
+ |
|
691 |
+ * Added command ``pip zip PACKAGE`` and ``pip unzip PACKAGE``. This |
|
692 |
+ is particularly intended for Google App Engine to manage libraries |
|
693 |
+ to stay under the 1000-file limit. |
|
694 |
+ |
|
695 |
+ * Some fixes to bundles, especially editable packages and when |
|
696 |
+ creating a bundle using unnamed packages (like just an svn |
|
697 |
+ repository without ``#egg=Package``). |
|
698 |
+ |
|
699 |
+ 0.1.4 |
|
700 |
+ ----- |
|
701 |
+ |
|
702 |
+ * Added an option ``--install-option`` to pass options to pass |
|
703 |
+ arguments to ``setup.py install`` |
|
704 |
+ |
|
705 |
+ * ``.svn/`` directories are no longer included in bundles, as these |
|
706 |
+ directories are specific to a version of svn -- if you build a |
|
707 |
+ bundle on a system with svn 1.5, you can't use the checkout on a |
|
708 |
+ system with svn 1.4. Instead a file ``svn-checkout.txt`` is |
|
709 |
+ included that notes the original location and revision, and the |
|
710 |
+ command you can use to turn it back into an svn checkout. (Probably |
|
711 |
+ unpacking the bundle should, maybe optionally, recreate this |
|
712 |
+ information -- but that is not currently implemented, and it would |
|
713 |
+ require network access.) |
|
714 |
+ |
|
715 |
+ * Avoid ambiguities over project name case, where for instance |
|
716 |
+ MyPackage and mypackage would be considered different packages. |
|
717 |
+ This in particular caused problems on Macs, where ``MyPackage/`` and |
|
718 |
+ ``mypackage/`` are the same directory. |
|
719 |
+ |
|
720 |
+ * Added support for an environmental variable |
|
721 |
+ ``$PIP_DOWNLOAD_CACHE`` which will cache package downloads, so |
|
722 |
+ future installations won't require large downloads. Network access |
|
723 |
+ is still required, but just some downloads will be avoided when |
|
724 |
+ using this. |
|
725 |
+ |
|
726 |
+ 0.1.3 |
|
727 |
+ ----- |
|
728 |
+ |
|
729 |
+ * Always use ``svn checkout`` (not ``export``) so that |
|
730 |
+ ``tag_svn_revision`` settings give the revision of the package. |
|
731 |
+ |
|
732 |
+ * Don't update checkouts that came from ``.pybundle`` files. |
|
733 |
+ |
|
734 |
+ 0.1.2 |
|
735 |
+ ----- |
|
736 |
+ |
|
737 |
+ * Improve error text when there are errors fetching HTML pages when |
|
738 |
+ seeking packages. |
|
739 |
+ |
|
740 |
+ * Improve bundles: include empty directories, make them work with |
|
741 |
+ editable packages. |
|
742 |
+ |
|
743 |
+ * If you use ``-E env`` and the environment ``env/`` doesn't exist, a |
|
744 |
+ new virtual environment will be created. |
|
745 |
+ |
|
746 |
+ * Fix ``dependency_links`` for finding packages. |
|
747 |
+ |
|
748 |
+ 0.1.1 |
|
749 |
+ ----- |
|
750 |
+ |
|
751 |
+ * Fixed a NameError exception when running pip outside of a |
|
752 |
+ virtualenv environment. |
|
753 |
+ |
|
754 |
+ * Added HTTP proxy support (from Prabhu Ramachandran) |
|
755 |
+ |
|
756 |
+ * Fixed use of ``hashlib.md5`` on python2.5+ (also from Prabhu |
|
757 |
+ Ramachandran) |
|
758 |
+ |
|
759 |
+ 0.1 |
|
760 |
+ --- |
|
761 |
+ |
|
762 |
+ * Initial release |
|
763 |
+ |
|
764 |
+Keywords: easy_install distutils setuptools egg virtualenv |
|
765 |
+Platform: UNKNOWN |
|
766 |
+Classifier: Development Status :: 5 - Production/Stable |
|
767 |
+Classifier: Intended Audience :: Developers |
|
768 |
+Classifier: License :: OSI Approved :: MIT License |
|
769 |
+Classifier: Topic :: Software Development :: Build Tools |
|
770 |
+Classifier: Programming Language :: Python :: 2 |
|
771 |
+Classifier: Programming Language :: Python :: 2.5 |
|
772 |
+Classifier: Programming Language :: Python :: 2.6 |
|
773 |
+Classifier: Programming Language :: Python :: 2.7 |
|
774 |
+Classifier: Programming Language :: Python :: 3 |
|
775 |
+Classifier: Programming Language :: Python :: 3.1 |
|
776 |
+Classifier: Programming Language :: Python :: 3.2 |
0 | 777 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,60 @@ |
1 |
+AUTHORS.txt |
|
2 |
+CHANGES.txt |
|
3 |
+LICENSE.txt |
|
4 |
+MANIFEST.in |
|
5 |
+PROJECT.txt |
|
6 |
+README.rst |
|
7 |
+setup.cfg |
|
8 |
+setup.py |
|
9 |
+docs/configuration.txt |
|
10 |
+docs/cookbook.txt |
|
11 |
+docs/development.txt |
|
12 |
+docs/index.txt |
|
13 |
+docs/installing.txt |
|
14 |
+docs/logic.txt |
|
15 |
+docs/news.txt |
|
16 |
+docs/other-tools.txt |
|
17 |
+docs/quickstart.txt |
|
18 |
+docs/usage.txt |
|
19 |
+pip/__init__.py |
|
20 |
+pip/__main__.py |
|
21 |
+pip/basecommand.py |
|
22 |
+pip/baseparser.py |
|
23 |
+pip/cacert.pem |
|
24 |
+pip/cmdoptions.py |
|
25 |
+pip/download.py |
|
26 |
+pip/exceptions.py |
|
27 |
+pip/index.py |
|
28 |
+pip/locations.py |
|
29 |
+pip/log.py |
|
30 |
+pip/req.py |
|
31 |
+pip/runner.py |
|
32 |
+pip/status_codes.py |
|
33 |
+pip/util.py |
|
34 |
+pip.egg-info/PKG-INFO |
|
35 |
+pip.egg-info/SOURCES.txt |
|
36 |
+pip.egg-info/dependency_links.txt |
|
37 |
+pip.egg-info/entry_points.txt |
|
38 |
+pip.egg-info/not-zip-safe |
|
39 |
+pip.egg-info/requires.txt |
|
40 |
+pip.egg-info/top_level.txt |
|
41 |
+pip/backwardcompat/__init__.py |
|
42 |
+pip/backwardcompat/socket_create_connection.py |
|
43 |
+pip/backwardcompat/ssl_match_hostname.py |
|
44 |
+pip/commands/__init__.py |
|
45 |
+pip/commands/bundle.py |
|
46 |
+pip/commands/completion.py |
|
47 |
+pip/commands/freeze.py |
|
48 |
+pip/commands/help.py |
|
49 |
+pip/commands/install.py |
|
50 |
+pip/commands/list.py |
|
51 |
+pip/commands/search.py |
|
52 |
+pip/commands/show.py |
|
53 |
+pip/commands/uninstall.py |
|
54 |
+pip/commands/unzip.py |
|
55 |
+pip/commands/zip.py |
|
56 |
+pip/vcs/__init__.py |
|
57 |
+pip/vcs/bazaar.py |
|
58 |
+pip/vcs/git.py |
|
59 |
+pip/vcs/mercurial.py |
|
60 |
+pip/vcs/subversion.py |
|
0 | 61 |
\ No newline at end of file |
0 | 2 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,236 @@ |
1 |
+#!/usr/bin/env python |
|
2 |
+import os |
|
3 |
+import optparse |
|
4 |
+ |
|
5 |
+import sys |
|
6 |
+import re |
|
7 |
+ |
|
8 |
+from pip.exceptions import InstallationError, CommandError, PipError |
|
9 |
+from pip.log import logger |
|
10 |
+from pip.util import get_installed_distributions, get_prog |
|
11 |
+from pip.vcs import git, mercurial, subversion, bazaar # noqa |
|
12 |
+from pip.baseparser import create_main_parser |
|
13 |
+from pip.commands import commands, get_similar_commands, get_summaries |
|
14 |
+ |
|
15 |
+ |
|
16 |
+# The version as used in the setup.py and the docs conf.py |
|
17 |
+__version__ = "1.3.1" |
|
18 |
+ |
|
19 |
+ |
|
20 |
+def autocomplete(): |
|
21 |
+ """Command and option completion for the main option parser (and options) |
|
22 |
+ and its subcommands (and options). |
|
23 |
+ |
|
24 |
+ Enable by sourcing one of the completion shell scripts (bash or zsh). |
|
25 |
+ """ |
|
26 |
+ # Don't complete if user hasn't sourced bash_completion file. |
|
27 |
+ if 'PIP_AUTO_COMPLETE' not in os.environ: |
|
28 |
+ return |
|
29 |
+ cwords = os.environ['COMP_WORDS'].split()[1:] |
|
30 |
+ cword = int(os.environ['COMP_CWORD']) |
|
31 |
+ try: |
|
32 |
+ current = cwords[cword - 1] |
|
33 |
+ except IndexError: |
|
34 |
+ current = '' |
|
35 |
+ |
|
36 |
+ subcommands = [cmd for cmd, summary in get_summaries()] |
|
37 |
+ options = [] |
|
38 |
+ # subcommand |
|
39 |
+ try: |
|
40 |
+ subcommand_name = [w for w in cwords if w in subcommands][0] |
|
41 |
+ except IndexError: |
|
42 |
+ subcommand_name = None |
|
43 |
+ |
|
44 |
+ parser = create_main_parser() |
|
45 |
+ # subcommand options |
|
46 |
+ if subcommand_name: |
|
47 |
+ # special case: 'help' subcommand has no options |
|
48 |
+ if subcommand_name == 'help': |
|
49 |
+ sys.exit(1) |
|
50 |
+ # special case: list locally installed dists for uninstall command |
|
51 |
+ if subcommand_name == 'uninstall' and not current.startswith('-'): |
|
52 |
+ installed = [] |
|
53 |
+ lc = current.lower() |
|
54 |
+ for dist in get_installed_distributions(local_only=True): |
|
55 |
+ if dist.key.startswith(lc) and dist.key not in cwords[1:]: |
|
56 |
+ installed.append(dist.key) |
|
57 |
+ # if there are no dists installed, fall back to option completion |
|
58 |
+ if installed: |
|
59 |
+ for dist in installed: |
|
60 |
+ print(dist) |
|
61 |
+ sys.exit(1) |
|
62 |
+ |
|
63 |
+ subcommand = commands[subcommand_name](parser) |
|
64 |
+ options += [(opt.get_opt_string(), opt.nargs) |
|
65 |
+ for opt in subcommand.parser.option_list_all |
|
66 |
+ if opt.help != optparse.SUPPRESS_HELP] |
|
67 |
+ |
|
68 |
+ # filter out previously specified options from available options |
|
69 |
+ prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] |
|
70 |
+ options = [(x, v) for (x, v) in options if x not in prev_opts] |
|
71 |
+ # filter options by current input |
|
72 |
+ options = [(k, v) for k, v in options if k.startswith(current)] |
|
73 |
+ for option in options: |
|
74 |
+ opt_label = option[0] |
|
75 |
+ # append '=' to options which require args |
|
76 |
+ if option[1]: |
|
77 |
+ opt_label += '=' |
|
78 |
+ print(opt_label) |
|
79 |
+ else: |
|
80 |
+ # show main parser options only when necessary |
|
81 |
+ if current.startswith('-') or current.startswith('--'): |
|
82 |
+ opts = [i.option_list for i in parser.option_groups] |
|
83 |
+ opts.append(parser.option_list) |
|
84 |
+ opts = (o for it in opts for o in it) |
|
85 |
+ |
|
86 |
+ subcommands += [i.get_opt_string() for i in opts |
|
87 |
+ if i.help != optparse.SUPPRESS_HELP] |
|
88 |
+ |
|
89 |
+ print(' '.join([x for x in subcommands if x.startswith(current)])) |
|
90 |
+ sys.exit(1) |
|
91 |
+ |
|
92 |
+ |
|
93 |
+def parseopts(args): |
|
94 |
+ parser = create_main_parser() |
|
95 |
+ parser.main = True # so the help formatter knows |
|
96 |
+ |
|
97 |
+ # create command listing |
|
98 |
+ command_summaries = get_summaries() |
|
99 |
+ |
|
100 |
+ description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] |
|
101 |
+ parser.description = '\n'.join(description) |
|
102 |
+ |
|
103 |
+ options, args = parser.parse_args(args) |
|
104 |
+ |
|
105 |
+ if options.version: |
|
106 |
+ sys.stdout.write(parser.version) |
|
107 |
+ sys.stdout.write(os.linesep) |
|
108 |
+ sys.exit() |
|
109 |
+ |
|
110 |
+ # pip || pip help || pip --help -> print_help() |
|
111 |
+ if not args or (args[0] == 'help' and len(args) == 1): |
|
112 |
+ parser.print_help() |
|
113 |
+ sys.exit() |
|
114 |
+ |
|
115 |
+ if not args: |
|
116 |
+ msg = ('You must give a command ' |
|
117 |
+ '(use "pip --help" to see a list of commands)') |
|
118 |
+ raise CommandError(msg) |
|
119 |
+ |
|
120 |
+ command = args[0].lower() |
|
121 |
+ |
|
122 |
+ if command not in commands: |
|
123 |
+ guess = get_similar_commands(command) |
|
124 |
+ |
|
125 |
+ msg = ['unknown command "%s"' % command] |
|
126 |
+ if guess: |
|
127 |
+ msg.append('maybe you meant "%s"' % guess) |
|
128 |
+ |
|
129 |
+ raise CommandError(' - '.join(msg)) |
|
130 |
+ |
|
131 |
+ return command, options, args, parser |
|
132 |
+ |
|
133 |
+ |
|
134 |
+def main(initial_args=None): |
|
135 |
+ if initial_args is None: |
|
136 |
+ initial_args = sys.argv[1:] |
|
137 |
+ |
|
138 |
+ autocomplete() |
|
139 |
+ |
|
140 |
+ try: |
|
141 |
+ cmd_name, options, args, parser = parseopts(initial_args) |
|
142 |
+ except PipError: |
|
143 |
+ e = sys.exc_info()[1] |
|
144 |
+ sys.stderr.write("ERROR: %s" % e) |
|
145 |
+ sys.stderr.write(os.linesep) |
|
146 |
+ sys.exit(1) |
|
147 |
+ |
|
148 |
+ command = commands[cmd_name](parser) # see baseparser.Command |
|
149 |
+ return command.main(args[1:], options) |
|
150 |
+ |
|
151 |
+ |
|
152 |
+def bootstrap(): |
|
153 |
+ """ |
|
154 |
+ Bootstrapping function to be called from install-pip.py script. |
|
155 |
+ """ |
|
156 |
+ return main(['install', '--upgrade', 'pip']) |
|
157 |
+ |
|
158 |
+############################################################ |
|
159 |
+## Writing freeze files |
|
160 |
+ |
|
161 |
+ |
|
162 |
+class FrozenRequirement(object): |
|
163 |
+ |
|
164 |
+ def __init__(self, name, req, editable, comments=()): |
|
165 |
+ self.name = name |
|
166 |
+ self.req = req |
|
167 |
+ self.editable = editable |
|
168 |
+ self.comments = comments |
|
169 |
+ |
|
170 |
+ _rev_re = re.compile(r'-r(\d+)$') |
|
171 |
+ _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') |
|
172 |
+ |
|
173 |
+ @classmethod |
|
174 |
+ def from_dist(cls, dist, dependency_links, find_tags=False): |
|
175 |
+ location = os.path.normcase(os.path.abspath(dist.location)) |
|
176 |
+ comments = [] |
|
177 |
+ from pip.vcs import vcs, get_src_requirement |
|
178 |
+ if vcs.get_backend_name(location): |
|
179 |
+ editable = True |
|
180 |
+ try: |
|
181 |
+ req = get_src_requirement(dist, location, find_tags) |
|
182 |
+ except InstallationError: |
|
183 |
+ ex = sys.exc_info()[1] |
|
184 |
+ logger.warn("Error when trying to get requirement for VCS system %s, falling back to uneditable format" % ex) |
|
185 |
+ req = None |
|
186 |
+ if req is None: |
|
187 |
+ logger.warn('Could not determine repository location of %s' % location) |
|
188 |
+ comments.append('## !! Could not determine repository location') |
|
189 |
+ req = dist.as_requirement() |
|
190 |
+ editable = False |
|
191 |
+ else: |
|
192 |
+ editable = False |
|
193 |
+ req = dist.as_requirement() |
|
194 |
+ specs = req.specs |
|
195 |
+ assert len(specs) == 1 and specs[0][0] == '==' |
|
196 |
+ version = specs[0][1] |
|
197 |
+ ver_match = cls._rev_re.search(version) |
|
198 |
+ date_match = cls._date_re.search(version) |
|
199 |
+ if ver_match or date_match: |
|
200 |
+ svn_backend = vcs.get_backend('svn') |
|
201 |
+ if svn_backend: |
|
202 |
+ svn_location = svn_backend( |
|
203 |
+ ).get_location(dist, dependency_links) |
|
204 |
+ if not svn_location: |
|
205 |
+ logger.warn( |
|
206 |
+ 'Warning: cannot find svn location for %s' % req) |
|
207 |
+ comments.append('## FIXME: could not find svn URL in dependency_links for this package:') |
|
208 |
+ else: |
|
209 |
+ comments.append('# Installing as editable to satisfy requirement %s:' % req) |
|
210 |
+ if ver_match: |
|
211 |
+ rev = ver_match.group(1) |
|
212 |
+ else: |
|
213 |
+ rev = '{%s}' % date_match.group(1) |
|
214 |
+ editable = True |
|
215 |
+ req = '%s@%s#egg=%s' % (svn_location, rev, cls.egg_name(dist)) |
|
216 |
+ return cls(dist.project_name, req, editable, comments) |
|
217 |
+ |
|
218 |
+ @staticmethod |
|
219 |
+ def egg_name(dist): |
|
220 |
+ name = dist.egg_name() |
|
221 |
+ match = re.search(r'-py\d\.\d$', name) |
|
222 |
+ if match: |
|
223 |
+ name = name[:match.start()] |
|
224 |
+ return name |
|
225 |
+ |
|
226 |
+ def __str__(self): |
|
227 |
+ req = self.req |
|
228 |
+ if self.editable: |
|
229 |
+ req = '-e %s' % req |
|
230 |
+ return '\n'.join(list(self.comments) + [str(req)]) + '\n' |
|
231 |
+ |
|
232 |
+ |
|
233 |
+if __name__ == '__main__': |
|
234 |
+ exit = main() |
|
235 |
+ if exit: |
|
236 |
+ sys.exit(exit) |
2 | 10 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,142 @@ |
1 |
+"""Stuff that differs in different Python versions""" |
|
2 |
+ |
|
3 |
+import os |
|
4 |
+import imp |
|
5 |
+import sys |
|
6 |
+import site |
|
7 |
+ |
|
8 |
+__all__ = ['WindowsError'] |
|
9 |
+ |
|
10 |
+uses_pycache = hasattr(imp, 'cache_from_source') |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class NeverUsedException(Exception): |
|
14 |
+ """this exception should never be raised""" |
|
15 |
+ |
|
16 |
+try: |
|
17 |
+ WindowsError = WindowsError |
|
18 |
+except NameError: |
|
19 |
+ WindowsError = NeverUsedException |
|
20 |
+ |
|
21 |
+try: |
|
22 |
+ #new in Python 3.3 |
|
23 |
+ PermissionError = PermissionError |
|
24 |
+except NameError: |
|
25 |
+ PermissionError = NeverUsedException |
|
26 |
+ |
|
27 |
+console_encoding = sys.__stdout__.encoding |
|
28 |
+ |
|
29 |
+if sys.version_info >= (3,): |
|
30 |
+ from io import StringIO, BytesIO |
|
31 |
+ from functools import reduce |
|
32 |
+ from urllib.error import URLError, HTTPError |
|
33 |
+ from queue import Queue, Empty |
|
34 |
+ from urllib.request import url2pathname |
|
35 |
+ from urllib.request import urlretrieve |
|
36 |
+ from email import message as emailmessage |
|
37 |
+ import urllib.parse as urllib |
|
38 |
+ import urllib.request as urllib2 |
|
39 |
+ import configparser as ConfigParser |
|
40 |
+ import xmlrpc.client as xmlrpclib |
|
41 |
+ import urllib.parse as urlparse |
|
42 |
+ import http.client as httplib |
|
43 |
+ |
|
44 |
+ def cmp(a, b): |
|
45 |
+ return (a > b) - (a < b) |
|
46 |
+ |
|
47 |
+ def b(s): |
|
48 |
+ return s.encode('utf-8') |
|
49 |
+ |
|
50 |
+ def u(s): |
|
51 |
+ return s.decode('utf-8') |
|
52 |
+ |
|
53 |
+ def console_to_str(s): |
|
54 |
+ try: |
|
55 |
+ return s.decode(console_encoding) |
|
56 |
+ except UnicodeDecodeError: |
|
57 |
+ return s.decode('utf_8') |
|
58 |
+ |
|
59 |
+ def fwrite(f, s): |
|
60 |
+ f.buffer.write(b(s)) |
|
61 |
+ |
|
62 |
+ bytes = bytes |
|
63 |
+ string_types = (str,) |
|
64 |
+ raw_input = input |
|
65 |
+else: |
|
66 |
+ from cStringIO import StringIO |
|
67 |
+ from urllib2 import URLError, HTTPError |
|
68 |
+ from Queue import Queue, Empty |
|
69 |
+ from urllib import url2pathname, urlretrieve |
|
70 |
+ from email import Message as emailmessage |
|
71 |
+ import urllib |
|
72 |
+ import urllib2 |
|
73 |
+ import urlparse |
|
74 |
+ import ConfigParser |
|
75 |
+ import xmlrpclib |
|
76 |
+ import httplib |
|
77 |
+ |
|
78 |
+ def b(s): |
|
79 |
+ return s |
|
80 |
+ |
|
81 |
+ def u(s): |
|
82 |
+ return s |
|
83 |
+ |
|
84 |
+ def console_to_str(s): |
|
85 |
+ return s |
|
86 |
+ |
|
87 |
+ def fwrite(f, s): |
|
88 |
+ f.write(s) |
|
89 |
+ |
|
90 |
+ bytes = str |
|
91 |
+ string_types = (basestring,) |
|
92 |
+ reduce = reduce |
|
93 |
+ cmp = cmp |
|
94 |
+ raw_input = raw_input |
|
95 |
+ BytesIO = StringIO |
|
96 |
+ |
|
97 |
+ |
|
98 |
+from distutils.sysconfig import get_python_lib, get_python_version |
|
99 |
+ |
|
100 |
+#site.USER_SITE was created in py2.6 |
|
101 |
+user_site = getattr(site, 'USER_SITE', None) |
|
102 |
+ |
|
103 |
+ |
|
104 |
+def product(*args, **kwds): |
|
105 |
+ # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy |
|
106 |
+ # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 |
|
107 |
+ pools = list(map(tuple, args)) * kwds.get('repeat', 1) |
|
108 |
+ result = [[]] |
|
109 |
+ for pool in pools: |
|
110 |
+ result = [x + [y] for x in result for y in pool] |
|
111 |
+ for prod in result: |
|
112 |
+ yield tuple(prod) |
|
113 |
+ |
|
114 |
+ |
|
115 |
+def home_lib(home): |
|
116 |
+ """Return the lib dir under the 'home' installation scheme""" |
|
117 |
+ if hasattr(sys, 'pypy_version_info'): |
|
118 |
+ lib = 'site-packages' |
|
119 |
+ else: |
|
120 |
+ lib = os.path.join('lib', 'python') |
|
121 |
+ return os.path.join(home, lib) |
|
122 |
+ |
|
123 |
+ |
|
124 |
+## py25 has no builtin ssl module |
|
125 |
+## only >=py32 has ssl.match_hostname and ssl.CertificateError |
|
126 |
+try: |
|
127 |
+ import ssl |
|
128 |
+ try: |
|
129 |
+ from ssl import match_hostname, CertificateError |
|
130 |
+ except ImportError: |
|
131 |
+ from pip.backwardcompat.ssl_match_hostname import match_hostname, CertificateError |
|
132 |
+except ImportError: |
|
133 |
+ ssl = None |
|
134 |
+ |
|
135 |
+ |
|
136 |
+# patch for py25 socket to work with http://pypi.python.org/pypi/ssl/ |
|
137 |
+import socket |
|
138 |
+if not hasattr(socket, 'create_connection'): # for Python 2.5 |
|
139 |
+ # monkey-patch socket module |
|
140 |
+ from pip.backwardcompat.socket_create_connection import create_connection |
|
141 |
+ socket.create_connection = create_connection |
|
142 |
+ |
2 | 145 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,44 @@ |
1 |
+""" |
|
2 |
+patch for py25 socket to work with http://pypi.python.org/pypi/ssl/ |
|
3 |
+copy-paste from py2.6 stdlib socket.py |
|
4 |
+https://gist.github.com/zed/1347055 |
|
5 |
+""" |
|
6 |
+import socket |
|
7 |
+import sys |
|
8 |
+ |
|
9 |
+_GLOBAL_DEFAULT_TIMEOUT = getattr(socket, '_GLOBAL_DEFAULT_TIMEOUT', object()) |
|
10 |
+def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, |
|
11 |
+ source_address=None): |
|
12 |
+ """Connect to *address* and return the socket object. |
|
13 |
+ |
|
14 |
+ Convenience function. Connect to *address* (a 2-tuple ``(host, |
|
15 |
+ port)``) and return the socket object. Passing the optional |
|
16 |
+ *timeout* parameter will set the timeout on the socket instance |
|
17 |
+ before attempting to connect. If no *timeout* is supplied, the |
|
18 |
+ global default timeout setting returned by :func:`getdefaulttimeout` |
|
19 |
+ is used. |
|
20 |
+ """ |
|
21 |
+ |
|
22 |
+ host, port = address |
|
23 |
+ err = None |
|
24 |
+ for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): |
|
25 |
+ af, socktype, proto, canonname, sa = res |
|
26 |
+ sock = None |
|
27 |
+ try: |
|
28 |
+ sock = socket.socket(af, socktype, proto) |
|
29 |
+ if timeout is not _GLOBAL_DEFAULT_TIMEOUT: |
|
30 |
+ sock.settimeout(timeout) |
|
31 |
+ if source_address: |
|
32 |
+ sock.bind(source_address) |
|
33 |
+ sock.connect(sa) |
|
34 |
+ return sock |
|
35 |
+ |
|
36 |
+ except socket.error: |
|
37 |
+ err = sys.exc_info()[1] |
|
38 |
+ if sock is not None: |
|
39 |
+ sock.close() |
|
40 |
+ |
|
41 |
+ if err is not None: |
|
42 |
+ raise err |
|
43 |
+ else: |
|
44 |
+ raise socket.error("getaddrinfo returns an empty list") |
2 | 47 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,60 @@ |
1 |
+"""The match_hostname() function from Python 3.2, essential when using SSL.""" |
|
2 |
+ |
|
3 |
+import re |
|
4 |
+ |
|
5 |
+__version__ = '3.2a3' |
|
6 |
+ |
|
7 |
+class CertificateError(ValueError): |
|
8 |
+ pass |
|
9 |
+ |
|
10 |
+def _dnsname_to_pat(dn): |
|
11 |
+ pats = [] |
|
12 |
+ for frag in dn.split(r'.'): |
|
13 |
+ if frag == '*': |
|
14 |
+ # When '*' is a fragment by itself, it matches a non-empty dotless |
|
15 |
+ # fragment. |
|
16 |
+ pats.append('[^.]+') |
|
17 |
+ else: |
|
18 |
+ # Otherwise, '*' matches any dotless fragment. |
|
19 |
+ frag = re.escape(frag) |
|
20 |
+ pats.append(frag.replace(r'\*', '[^.]*')) |
|
21 |
+ return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) |
|
22 |
+ |
|
23 |
+def match_hostname(cert, hostname): |
|
24 |
+ """Verify that *cert* (in decoded format as returned by |
|
25 |
+ SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules |
|
26 |
+ are mostly followed, but IP addresses are not accepted for *hostname*. |
|
27 |
+ |
|
28 |
+ CertificateError is raised on failure. On success, the function |
|
29 |
+ returns nothing. |
|
30 |
+ """ |
|
31 |
+ if not cert: |
|
32 |
+ raise ValueError("empty or no certificate") |
|
33 |
+ dnsnames = [] |
|
34 |
+ san = cert.get('subjectAltName', ()) |
|
35 |
+ for key, value in san: |
|
36 |
+ if key == 'DNS': |
|
37 |
+ if _dnsname_to_pat(value).match(hostname): |
|
38 |
+ return |
|
39 |
+ dnsnames.append(value) |
|
40 |
+ if not san: |
|
41 |
+ # The subject is only checked when subjectAltName is empty |
|
42 |
+ for sub in cert.get('subject', ()): |
|
43 |
+ for key, value in sub: |
|
44 |
+ # XXX according to RFC 2818, the most specific Common Name |
|
45 |
+ # must be used. |
|
46 |
+ if key == 'commonName': |
|
47 |
+ if _dnsname_to_pat(value).match(hostname): |
|
48 |
+ return |
|
49 |
+ dnsnames.append(value) |
|
50 |
+ if len(dnsnames) > 1: |
|
51 |
+ raise CertificateError("hostname %r " |
|
52 |
+ "doesn't match either of %s" |
|
53 |
+ % (hostname, ', '.join(map(repr, dnsnames)))) |
|
54 |
+ elif len(dnsnames) == 1: |
|
55 |
+ raise CertificateError("hostname %r " |
|
56 |
+ "doesn't match %r" |
|
57 |
+ % (hostname, dnsnames[0])) |
|
58 |
+ else: |
|
59 |
+ raise CertificateError("no appropriate commonName or " |
|
60 |
+ "subjectAltName fields were found") |
2 | 63 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,212 @@ |
1 |
+"""Base Command class, and related routines""" |
|
2 |
+ |
|
3 |
+import os |
|
4 |
+import socket |
|
5 |
+import sys |
|
6 |
+import tempfile |
|
7 |
+import traceback |
|
8 |
+import time |
|
9 |
+import optparse |
|
10 |
+ |
|
11 |
+from pip.log import logger |
|
12 |
+from pip.download import urlopen |
|
13 |
+from pip.exceptions import (BadCommand, InstallationError, UninstallationError, |
|
14 |
+ CommandError) |
|
15 |
+from pip.backwardcompat import StringIO, ssl |
|
16 |
+from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter |
|
17 |
+from pip.status_codes import SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND |
|
18 |
+from pip.util import get_prog |
|
19 |
+ |
|
20 |
+ |
|
21 |
+__all__ = ['Command'] |
|
22 |
+ |
|
23 |
+ |
|
24 |
+# for backwards compatibiliy |
|
25 |
+get_proxy = urlopen.get_proxy |
|
26 |
+ |
|
27 |
+ |
|
28 |
+class Command(object): |
|
29 |
+ name = None |
|
30 |
+ usage = None |
|
31 |
+ hidden = False |
|
32 |
+ |
|
33 |
+ def __init__(self, main_parser): |
|
34 |
+ parser_kw = { |
|
35 |
+ 'usage': self.usage, |
|
36 |
+ 'prog': '%s %s' % (get_prog(), self.name), |
|
37 |
+ 'formatter': UpdatingDefaultsHelpFormatter(), |
|
38 |
+ 'add_help_option': False, |
|
39 |
+ 'name': self.name, |
|
40 |
+ 'description': self.__doc__, |
|
41 |
+ } |
|
42 |
+ self.main_parser = main_parser |
|
43 |
+ self.parser = ConfigOptionParser(**parser_kw) |
|
44 |
+ |
|
45 |
+ # Commands should add options to this option group |
|
46 |
+ optgroup_name = '%s Options' % self.name.capitalize() |
|
47 |
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) |
|
48 |
+ |
|
49 |
+ # Re-add all options and option groups. |
|
50 |
+ for group in main_parser.option_groups: |
|
51 |
+ self._copy_option_group(self.parser, group) |
|
52 |
+ |
|
53 |
+ # Copies all general options from the main parser. |
|
54 |
+ self._copy_options(self.parser, main_parser.option_list) |
|
55 |
+ |
|
56 |
+ def _copy_options(self, parser, options): |
|
57 |
+ """Populate an option parser or group with options.""" |
|
58 |
+ for option in options: |
|
59 |
+ if not option.dest: |
|
60 |
+ continue |
|
61 |
+ parser.add_option(option) |
|
62 |
+ |
|
63 |
+ def _copy_option_group(self, parser, group): |
|
64 |
+ """Copy option group (including options) to another parser.""" |
|
65 |
+ new_group = optparse.OptionGroup(parser, group.title) |
|
66 |
+ self._copy_options(new_group, group.option_list) |
|
67 |
+ |
|
68 |
+ parser.add_option_group(new_group) |
|
69 |
+ |
|
70 |
+ def merge_options(self, initial_options, options): |
|
71 |
+ # Make sure we have all global options carried over |
|
72 |
+ attrs = ['log', 'proxy', 'require_venv', |
|
73 |
+ 'log_explicit_levels', 'log_file', |
|
74 |
+ 'timeout', 'default_vcs', |
|
75 |
+ 'skip_requirements_regex', |
|
76 |
+ 'no_input', 'exists_action', |
|
77 |
+ 'cert'] |
|
78 |
+ if not ssl: |
|
79 |
+ attrs.append('insecure') |
|
80 |
+ for attr in attrs: |
|
81 |
+ setattr(options, attr, getattr(initial_options, attr) or getattr(options, attr)) |
|
82 |
+ options.quiet += initial_options.quiet |
|
83 |
+ options.verbose += initial_options.verbose |
|
84 |
+ |
|
85 |
+ def setup_logging(self): |
|
86 |
+ pass |
|
87 |
+ |
|
88 |
+ def main(self, args, initial_options): |
|
89 |
+ options, args = self.parser.parse_args(args) |
|
90 |
+ self.merge_options(initial_options, options) |
|
91 |
+ |
|
92 |
+ level = 1 # Notify |
|
93 |
+ level += options.verbose |
|
94 |
+ level -= options.quiet |
|
95 |
+ level = logger.level_for_integer(4 - level) |
|
96 |
+ complete_log = [] |
|
97 |
+ logger.consumers.extend( |
|
98 |
+ [(level, sys.stdout), |
|
99 |
+ (logger.DEBUG, complete_log.append)]) |
|
100 |
+ if options.log_explicit_levels: |
|
101 |
+ logger.explicit_levels = True |
|
102 |
+ |
|
103 |
+ self.setup_logging() |
|
104 |
+ |
|
105 |
+ #TODO: try to get these passing down from the command? |
|
106 |
+ # without resorting to os.environ to hold these. |
|
107 |
+ |
|
108 |
+ if options.no_input: |
|
109 |
+ os.environ['PIP_NO_INPUT'] = '1' |
|
110 |
+ |
|
111 |
+ if options.exists_action: |
|
112 |
+ os.environ['PIP_EXISTS_ACTION'] = ''.join(options.exists_action) |
|
113 |
+ |
|
114 |
+ if not ssl and options.insecure: |
|
115 |
+ os.environ['PIP_INSECURE'] = '1' |
|
116 |
+ |
|
117 |
+ if options.cert: |
|
118 |
+ os.environ['PIP_CERT'] = options.cert |
|
119 |
+ |
|
120 |
+ if options.require_venv: |
|
121 |
+ # If a venv is required check if it can really be found |
|
122 |
+ if not os.environ.get('VIRTUAL_ENV'): |
|
123 |
+ logger.fatal('Could not find an activated virtualenv (required).') |
|
124 |
+ sys.exit(VIRTUALENV_NOT_FOUND) |
|
125 |
+ |
|
126 |
+ if options.log: |
|
127 |
+ log_fp = open_logfile(options.log, 'a') |
|
128 |
+ logger.consumers.append((logger.DEBUG, log_fp)) |
|
129 |
+ else: |
|
130 |
+ log_fp = None |
|
131 |
+ |
|
132 |
+ socket.setdefaulttimeout(options.timeout or None) |
|
133 |
+ |
|
134 |
+ urlopen.setup(proxystr=options.proxy, prompting=not options.no_input) |
|
135 |
+ |
|
136 |
+ exit = SUCCESS |
|
137 |
+ store_log = False |
|
138 |
+ try: |
|
139 |
+ status = self.run(options, args) |
|
140 |
+ # FIXME: all commands should return an exit status |
|
141 |
+ # and when it is done, isinstance is not needed anymore |
|
142 |
+ if isinstance(status, int): |
|
143 |
+ exit = status |
|
144 |
+ except (InstallationError, UninstallationError): |
|
145 |
+ e = sys.exc_info()[1] |
|
146 |
+ logger.fatal(str(e)) |
|
147 |
+ logger.info('Exception information:\n%s' % format_exc()) |
|
148 |
+ store_log = True |
|
149 |
+ exit = ERROR |
|
150 |
+ except BadCommand: |
|
151 |
+ e = sys.exc_info()[1] |
|
152 |
+ logger.fatal(str(e)) |
|
153 |
+ logger.info('Exception information:\n%s' % format_exc()) |
|
154 |
+ store_log = True |
|
155 |
+ exit = ERROR |
|
156 |
+ except CommandError: |
|
157 |
+ e = sys.exc_info()[1] |
|
158 |
+ logger.fatal('ERROR: %s' % e) |
|
159 |
+ logger.info('Exception information:\n%s' % format_exc()) |
|
160 |
+ exit = ERROR |
|
161 |
+ except KeyboardInterrupt: |
|
162 |
+ logger.fatal('Operation cancelled by user') |
|
163 |
+ logger.info('Exception information:\n%s' % format_exc()) |
|
164 |
+ store_log = True |
|
165 |
+ exit = ERROR |
|
166 |
+ except: |
|
167 |
+ logger.fatal('Exception:\n%s' % format_exc()) |
|
168 |
+ store_log = True |
|
169 |
+ exit = UNKNOWN_ERROR |
|
170 |
+ if log_fp is not None: |
|
171 |
+ log_fp.close() |
|
172 |
+ if store_log: |
|
173 |
+ log_fn = options.log_file |
|
174 |
+ text = '\n'.join(complete_log) |
|
175 |
+ try: |
|
176 |
+ log_fp = open_logfile(log_fn, 'w') |
|
177 |
+ except IOError: |
|
178 |
+ temp = tempfile.NamedTemporaryFile(delete=False) |
|
179 |
+ log_fn = temp.name |
|
180 |
+ log_fp = open_logfile(log_fn, 'w') |
|
181 |
+ logger.fatal('Storing complete log in %s' % log_fn) |
|
182 |
+ log_fp.write(text) |
|
183 |
+ log_fp.close() |
|
184 |
+ return exit |
|
185 |
+ |
|
186 |
+ |
|
187 |
+def format_exc(exc_info=None): |
|
188 |
+ if exc_info is None: |
|
189 |
+ exc_info = sys.exc_info() |
|
190 |
+ out = StringIO() |
|
191 |
+ traceback.print_exception(*exc_info, **dict(file=out)) |
|
192 |
+ return out.getvalue() |
|
193 |
+ |
|
194 |
+ |
|
195 |
+def open_logfile(filename, mode='a'): |
|
196 |
+ """Open the named log file in append mode. |
|
197 |
+ |
|
198 |
+ If the file already exists, a separator will also be printed to |
|
199 |
+ the file to separate past activity from current activity. |
|
200 |
+ """ |
|
201 |
+ filename = os.path.expanduser(filename) |
|
202 |
+ filename = os.path.abspath(filename) |
|
203 |
+ dirname = os.path.dirname(filename) |
|
204 |
+ if not os.path.exists(dirname): |
|
205 |
+ os.makedirs(dirname) |
|
206 |
+ exists = os.path.exists(filename) |
|
207 |
+ |
|
208 |
+ log_fp = open(filename, mode) |
|
209 |
+ if exists: |
|
210 |
+ log_fp.write('%s\n' % ('-' * 60)) |
|
211 |
+ log_fp.write('%s run on %s\n' % (sys.argv[0], time.strftime('%c'))) |
|
212 |
+ return log_fp |
2 | 215 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,376 @@ |
1 |
+"""Base option parser setup""" |
|
2 |
+ |
|
3 |
+import sys |
|
4 |
+import optparse |
|
5 |
+import pkg_resources |
|
6 |
+import os |
|
7 |
+import textwrap |
|
8 |
+from distutils.util import strtobool |
|
9 |
+from pip.backwardcompat import ConfigParser, string_types, ssl |
|
10 |
+from pip.locations import default_config_file, default_log_file |
|
11 |
+from pip.util import get_terminal_size, get_prog |
|
12 |
+ |
|
13 |
+ |
|
14 |
+class PrettyHelpFormatter(optparse.IndentedHelpFormatter): |
|
15 |
+ """A prettier/less verbose help formatter for optparse.""" |
|
16 |
+ |
|
17 |
+ def __init__(self, *args, **kwargs): |
|
18 |
+ # help position must be aligned with __init__.parseopts.description |
|
19 |
+ kwargs['max_help_position'] = 30 |
|
20 |
+ kwargs['indent_increment'] = 1 |
|
21 |
+ kwargs['width'] = get_terminal_size()[0] - 2 |
|
22 |
+ optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) |
|
23 |
+ |
|
24 |
+ def format_option_strings(self, option): |
|
25 |
+ return self._format_option_strings(option, ' <%s>', ', ') |
|
26 |
+ |
|
27 |
+ def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): |
|
28 |
+ """ |
|
29 |
+ Return a comma-separated list of option strings and metavars. |
|
30 |
+ |
|
31 |
+ :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') |
|
32 |
+ :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar |
|
33 |
+ :param optsep: separator |
|
34 |
+ """ |
|
35 |
+ opts = [] |
|
36 |
+ |
|
37 |
+ if option._short_opts: |
|
38 |
+ opts.append(option._short_opts[0]) |
|
39 |
+ if option._long_opts: |
|
40 |
+ opts.append(option._long_opts[0]) |
|
41 |
+ if len(opts) > 1: |
|
42 |
+ opts.insert(1, optsep) |
|
43 |
+ |
|
44 |
+ if option.takes_value(): |
|
45 |
+ metavar = option.metavar or option.dest.lower() |
|
46 |
+ opts.append(mvarfmt % metavar.lower()) |
|
47 |
+ |
|
48 |
+ return ''.join(opts) |
|
49 |
+ |
|
50 |
+ def format_heading(self, heading): |
|
51 |
+ if heading == 'Options': |
|
52 |
+ return '' |
|
53 |
+ return heading + ':\n' |
|
54 |
+ |
|
55 |
+ def format_usage(self, usage): |
|
56 |
+ """ |
|
57 |
+ Ensure there is only one newline between usage and the first heading |
|
58 |
+ if there is no description. |
|
59 |
+ """ |
|
60 |
+ msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") |
|
61 |
+ return msg |
|
62 |
+ |
|
63 |
+ def format_description(self, description): |
|
64 |
+ # leave full control over description to us |
|
65 |
+ if description: |
|
66 |
+ if hasattr(self.parser, 'main'): |
|
67 |
+ label = 'Commands' |
|
68 |
+ else: |
|
69 |
+ label = 'Description' |
|
70 |
+ #some doc strings have inital newlines, some don't |
|
71 |
+ description = description.lstrip('\n') |
|
72 |
+ #some doc strings have final newlines and spaces, some don't |
|
73 |
+ description = description.rstrip() |
|
74 |
+ #dedent, then reindent |
|
75 |
+ description = self.indent_lines(textwrap.dedent(description), " ") |
|
76 |
+ description = '%s:\n%s\n' % (label, description) |
|
77 |
+ return description |
|
78 |
+ else: |
|
79 |
+ return '' |
|
80 |
+ |
|
81 |
+ def format_epilog(self, epilog): |
|
82 |
+ # leave full control over epilog to us |
|
83 |
+ if epilog: |
|
84 |
+ return epilog |
|
85 |
+ else: |
|
86 |
+ return '' |
|
87 |
+ |
|
88 |
+ def indent_lines(self, text, indent): |
|
89 |
+ new_lines = [indent + line for line in text.split('\n')] |
|
90 |
+ return "\n".join(new_lines) |
|
91 |
+ |
|
92 |
+ |
|
93 |
+class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): |
|
94 |
+ """Custom help formatter for use in ConfigOptionParser that updates |
|
95 |
+ the defaults before expanding them, allowing them to show up correctly |
|
96 |
+ in the help listing""" |
|
97 |
+ |
|
98 |
+ def expand_default(self, option): |
|
99 |
+ if self.parser is not None: |
|
100 |
+ self.parser.update_defaults(self.parser.defaults) |
|
101 |
+ return optparse.IndentedHelpFormatter.expand_default(self, option) |
|
102 |
+ |
|
103 |
+ |
|
104 |
+class CustomOptionParser(optparse.OptionParser): |
|
105 |
+ def insert_option_group(self, idx, *args, **kwargs): |
|
106 |
+ """Insert an OptionGroup at a given position.""" |
|
107 |
+ group = self.add_option_group(*args, **kwargs) |
|
108 |
+ |
|
109 |
+ self.option_groups.pop() |
|
110 |
+ self.option_groups.insert(idx, group) |
|
111 |
+ |
|
112 |
+ return group |
|
113 |
+ |
|
114 |
+ @property |
|
115 |
+ def option_list_all(self): |
|
116 |
+ """Get a list of all options, including those in option groups.""" |
|
117 |
+ res = self.option_list[:] |
|
118 |
+ for i in self.option_groups: |
|
119 |
+ res.extend(i.option_list) |
|
120 |
+ |
|
121 |
+ return res |
|
122 |
+ |
|
123 |
+ |
|
124 |
+class ConfigOptionParser(CustomOptionParser): |
|
125 |
+ """Custom option parser which updates its defaults by by checking the |
|
126 |
+ configuration files and environmental variables""" |
|
127 |
+ |
|
128 |
+ def __init__(self, *args, **kwargs): |
|
129 |
+ self.config = ConfigParser.RawConfigParser() |
|
130 |
+ self.name = kwargs.pop('name') |
|
131 |
+ self.files = self.get_config_files() |
|
132 |
+ self.config.read(self.files) |
|
133 |
+ assert self.name |
|
134 |
+ optparse.OptionParser.__init__(self, *args, **kwargs) |
|
135 |
+ |
|
136 |
+ def get_config_files(self): |
|
137 |
+ config_file = os.environ.get('PIP_CONFIG_FILE', False) |
|
138 |
+ if config_file and os.path.exists(config_file): |
|
139 |
+ return [config_file] |
|
140 |
+ return [default_config_file] |
|
141 |
+ |
|
142 |
+ def update_defaults(self, defaults): |
|
143 |
+ """Updates the given defaults with values from the config files and |
|
144 |
+ the environ. Does a little special handling for certain types of |
|
145 |
+ options (lists).""" |
|
146 |
+ # Then go and look for the other sources of configuration: |
|
147 |
+ config = {} |
|
148 |
+ # 1. config files |
|
149 |
+ for section in ('global', self.name): |
|
150 |
+ config.update(self.normalize_keys(self.get_config_section(section))) |
|
151 |
+ # 2. environmental variables |
|
152 |
+ config.update(self.normalize_keys(self.get_environ_vars())) |
|
153 |
+ # Then set the options with those values |
|
154 |
+ for key, val in config.items(): |
|
155 |
+ option = self.get_option(key) |
|
156 |
+ if option is not None: |
|
157 |
+ # ignore empty values |
|
158 |
+ if not val: |
|
159 |
+ continue |
|
160 |
+ # handle multiline configs |
|
161 |
+ if option.action == 'append': |
|
162 |
+ val = val.split() |
|
163 |
+ else: |
|
164 |
+ option.nargs = 1 |
|
165 |
+ if option.action in ('store_true', 'store_false', 'count'): |
|
166 |
+ val = strtobool(val) |
|
167 |
+ try: |
|
168 |
+ val = option.convert_value(key, val) |
|
169 |
+ except optparse.OptionValueError: |
|
170 |
+ e = sys.exc_info()[1] |
|
171 |
+ print("An error occurred during configuration: %s" % e) |
|
172 |
+ sys.exit(3) |
|
173 |
+ defaults[option.dest] = val |
|
174 |
+ return defaults |
|
175 |
+ |
|
176 |
+ def normalize_keys(self, items): |
|
177 |
+ """Return a config dictionary with normalized keys regardless of |
|
178 |
+ whether the keys were specified in environment variables or in config |
|
179 |
+ files""" |
|
180 |
+ normalized = {} |
|
181 |
+ for key, val in items: |
|
182 |
+ key = key.replace('_', '-') |
|
183 |
+ if not key.startswith('--'): |
|
184 |
+ key = '--%s' % key # only prefer long opts |
|
185 |
+ normalized[key] = val |
|
186 |
+ return normalized |
|
187 |
+ |
|
188 |
+ def get_config_section(self, name): |
|
189 |
+ """Get a section of a configuration""" |
|
190 |
+ if self.config.has_section(name): |
|
191 |
+ return self.config.items(name) |
|
192 |
+ return [] |
|
193 |
+ |
|
194 |
+ def get_environ_vars(self, prefix='PIP_'): |
|
195 |
+ """Returns a generator with all environmental vars with prefix PIP_""" |
|
196 |
+ for key, val in os.environ.items(): |
|
197 |
+ if key.startswith(prefix): |
|
198 |
+ yield (key.replace(prefix, '').lower(), val) |
|
199 |
+ |
|
200 |
+ def get_default_values(self): |
|
201 |
+ """Overridding to make updating the defaults after instantiation of |
|
202 |
+ the option parser possible, update_defaults() does the dirty work.""" |
|
203 |
+ if not self.process_default_values: |
|
204 |
+ # Old, pre-Optik 1.5 behaviour. |
|
205 |
+ return optparse.Values(self.defaults) |
|
206 |
+ |
|
207 |
+ defaults = self.update_defaults(self.defaults.copy()) # ours |
|
208 |
+ for option in self._get_all_options(): |
|
209 |
+ default = defaults.get(option.dest) |
|
210 |
+ if isinstance(default, string_types): |
|
211 |
+ opt_str = option.get_opt_string() |
|
212 |
+ defaults[option.dest] = option.check_value(opt_str, default) |
|
213 |
+ return optparse.Values(defaults) |
|
214 |
+ |
|
215 |
+ def error(self, msg): |
|
216 |
+ self.print_usage(sys.stderr) |
|
217 |
+ self.exit(2, "%s\n" % msg) |
|
218 |
+ |
|
219 |
+ |
|
220 |
+try: |
|
221 |
+ pip_dist = pkg_resources.get_distribution('pip') |
|
222 |
+ version = '%s from %s (python %s)' % ( |
|
223 |
+ pip_dist, pip_dist.location, sys.version[:3]) |
|
224 |
+except pkg_resources.DistributionNotFound: |
|
225 |
+ # when running pip.py without installing |
|
226 |
+ version = None |
|
227 |
+ |
|
228 |
+ |
|
229 |
+def create_main_parser(): |
|
230 |
+ parser_kw = { |
|
231 |
+ 'usage': '\n%prog <command> [options]', |
|
232 |
+ 'add_help_option': False, |
|
233 |
+ 'formatter': UpdatingDefaultsHelpFormatter(), |
|
234 |
+ 'name': 'global', |
|
235 |
+ 'prog': get_prog(), |
|
236 |
+ } |
|
237 |
+ |
|
238 |
+ parser = ConfigOptionParser(**parser_kw) |
|
239 |
+ genopt = optparse.OptionGroup(parser, 'General Options') |
|
240 |
+ parser.disable_interspersed_args() |
|
241 |
+ |
|
242 |
+ # having a default version action just causes trouble |
|
243 |
+ parser.version = version |
|
244 |
+ |
|
245 |
+ for opt in standard_options: |
|
246 |
+ genopt.add_option(opt) |
|
247 |
+ parser.add_option_group(genopt) |
|
248 |
+ |
|
249 |
+ return parser |
|
250 |
+ |
|
251 |
+ |
|
252 |
+standard_options = [ |
|
253 |
+ optparse.make_option( |
|
254 |
+ '-h', '--help', |
|
255 |
+ dest='help', |
|
256 |
+ action='help', |
|
257 |
+ help='Show help.'), |
|
258 |
+ |
|
259 |
+ optparse.make_option( |
|
260 |
+ # Run only if inside a virtualenv, bail if not. |
|
261 |
+ '--require-virtualenv', '--require-venv', |
|
262 |
+ dest='require_venv', |
|
263 |
+ action='store_true', |
|
264 |
+ default=False, |
|
265 |
+ help=optparse.SUPPRESS_HELP), |
|
266 |
+ |
|
267 |
+ optparse.make_option( |
|
268 |
+ '-v', '--verbose', |
|
269 |
+ dest='verbose', |
|
270 |
+ action='count', |
|
271 |
+ default=0, |
|
272 |
+ help='Give more output. Option is additive, and can be used up to 3 times.'), |
|
273 |
+ |
|
274 |
+ optparse.make_option( |
|
275 |
+ '-V', '--version', |
|
276 |
+ dest='version', |
|
277 |
+ action='store_true', |
|
278 |
+ help='Show version and exit.'), |
|
279 |
+ |
|
280 |
+ optparse.make_option( |
|
281 |
+ '-q', '--quiet', |
|
282 |
+ dest='quiet', |
|
283 |
+ action='count', |
|
284 |
+ default=0, |
|
285 |
+ help='Give less output.'), |
|
286 |
+ |
|
287 |
+ optparse.make_option( |
|
288 |
+ '--log', |
|
289 |
+ dest='log', |
|
290 |
+ metavar='file', |
|
291 |
+ help='Log file where a complete (maximum verbosity) record will be kept.'), |
|
292 |
+ |
|
293 |
+ optparse.make_option( |
|
294 |
+ # Writes the log levels explicitely to the log' |
|
295 |
+ '--log-explicit-levels', |
|
296 |
+ dest='log_explicit_levels', |
|
297 |
+ action='store_true', |
|
298 |
+ default=False, |
|
299 |
+ help=optparse.SUPPRESS_HELP), |
|
300 |
+ |
|
301 |
+ optparse.make_option( |
|
302 |
+ # The default log file |
|
303 |
+ '--local-log', '--log-file', |
|
304 |
+ dest='log_file', |
|
305 |
+ metavar='file', |
|
306 |
+ default=default_log_file, |
|
307 |
+ help=optparse.SUPPRESS_HELP), |
|
308 |
+ |
|
309 |
+ optparse.make_option( |
|
310 |
+ # Don't ask for input |
|
311 |
+ '--no-input', |
|
312 |
+ dest='no_input', |
|
313 |
+ action='store_true', |
|
314 |
+ default=False, |
|
315 |
+ help=optparse.SUPPRESS_HELP), |
|
316 |
+ |
|
317 |
+ optparse.make_option( |
|
318 |
+ '--proxy', |
|
319 |
+ dest='proxy', |
|
320 |
+ type='str', |
|
321 |
+ default='', |
|
322 |
+ help="Specify a proxy in the form [user:passwd@]proxy.server:port."), |
|
323 |
+ |
|
324 |
+ optparse.make_option( |
|
325 |
+ '--timeout', '--default-timeout', |
|
326 |
+ metavar='sec', |
|
327 |
+ dest='timeout', |
|
328 |
+ type='float', |
|
329 |
+ default=15, |
|
330 |
+ help='Set the socket timeout (default %default seconds).'), |
|
331 |
+ |
|
332 |
+ optparse.make_option( |
|
333 |
+ # The default version control system for editables, e.g. 'svn' |
|
334 |
+ '--default-vcs', |
|
335 |
+ dest='default_vcs', |
|
336 |
+ type='str', |
|
337 |
+ default='', |
|
338 |
+ help=optparse.SUPPRESS_HELP), |
|
339 |
+ |
|
340 |
+ optparse.make_option( |
|
341 |
+ # A regex to be used to skip requirements |
|
342 |
+ '--skip-requirements-regex', |
|
343 |
+ dest='skip_requirements_regex', |
|
344 |
+ type='str', |
|
345 |
+ default='', |
|
346 |
+ help=optparse.SUPPRESS_HELP), |
|
347 |
+ |
|
348 |
+ optparse.make_option( |
|
349 |
+ # Option when path already exist |
|
350 |
+ '--exists-action', |
|
351 |
+ dest='exists_action', |
|
352 |
+ type='choice', |
|
353 |
+ choices=['s', 'i', 'w', 'b'], |
|
354 |
+ default=[], |
|
355 |
+ action='append', |
|
356 |
+ metavar='action', |
|
357 |
+ help="Default action when a path already exists: " |
|
358 |
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup."), |
|
359 |
+ |
|
360 |
+ optparse.make_option( |
|
361 |
+ '--cert', |
|
362 |
+ dest='cert', |
|
363 |
+ type='str', |
|
364 |
+ default='', |
|
365 |
+ metavar='path', |
|
366 |
+ help = "Path to alternate CA bundle."), |
|
367 |
+ |
|
368 |
+ ] |
|
369 |
+ |
|
370 |
+if not ssl: |
|
371 |
+ standard_options.append(optparse.make_option( |
|
372 |
+ '--insecure', |
|
373 |
+ dest='insecure', |
|
374 |
+ action='store_true', |
|
375 |
+ default=False, |
|
376 |
+ help = "Allow lack of certificate checking when ssl is not installed.")) |
2 | 379 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,3895 @@ |
1 |
+## |
|
2 |
+## ca-bundle.crt -- Bundle of CA Root Certificates |
|
3 |
+## |
|
4 |
+## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 |
|
5 |
+## |
|
6 |
+## This is a bundle of X.509 certificates of public Certificate Authorities |
|
7 |
+## (CA). These were automatically extracted from Mozilla's root certificates |
|
8 |
+## file (certdata.txt). This file can be found in the mozilla source tree: |
|
9 |
+## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 |
|
10 |
+## |
|
11 |
+## It contains the certificates in PEM format and therefore |
|
12 |
+## can be directly used with curl / libcurl / php_curl, or with |
|
13 |
+## an Apache+mod_ssl webserver for SSL client authentication. |
|
14 |
+## Just configure this file as the SSLCACertificateFile. |
|
15 |
+## |
|
16 |
+ |
|
17 |
+# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ |
|
18 |
+ |
|
19 |
+GTE CyberTrust Global Root |
|
20 |
+========================== |
|
21 |
+-----BEGIN CERTIFICATE----- |
|
22 |
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg |
|
23 |
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG |
|
24 |
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz |
|
25 |
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL |
|
26 |
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 |
|
27 |
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u |
|
28 |
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql |
|
29 |
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID |
|
30 |
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW |
|
31 |
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF |
|
32 |
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ |
|
33 |
+-----END CERTIFICATE----- |
|
34 |
+ |
|
35 |
+Thawte Server CA |
|
36 |
+================ |
|
37 |
+-----BEGIN CERTIFICATE----- |
|
38 |
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT |
|
39 |
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs |
|
40 |
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE |
|
41 |
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j |
|
42 |
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV |
|
43 |
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u |
|
44 |
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG |
|
45 |
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 |
|
46 |
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl |
|
47 |
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 |
|
48 |
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR |
|
49 |
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J |
|
50 |
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ |
|
51 |
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= |
|
52 |
+-----END CERTIFICATE----- |
|
53 |
+ |
|
54 |
+Thawte Premium Server CA |
|
55 |
+======================== |
|
56 |
+-----BEGIN CERTIFICATE----- |
|
57 |
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT |
|
58 |
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs |
|
59 |
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE |
|
60 |
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl |
|
61 |
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT |
|
62 |
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU |
|
63 |
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 |
|
64 |
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ |
|
65 |
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 |
|
66 |
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh |
|
67 |
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ |
|
68 |
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm |
|
69 |
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf |
|
70 |
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t |
|
71 |
+UCemDaYj+bvLpgcUQg== |
|
72 |
+-----END CERTIFICATE----- |
|
73 |
+ |
|
74 |
+Equifax Secure CA |
|
75 |
+================= |
|
76 |
+-----BEGIN CERTIFICATE----- |
|
77 |
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE |
|
78 |
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 |
|
79 |
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT |
|
80 |
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB |
|
81 |
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR |
|
82 |
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW |
|
83 |
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG |
|
84 |
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE |
|
85 |
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG |
|
86 |
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS |
|
87 |
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB |
|
88 |
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 |
|
89 |
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB |
|
90 |
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 |
|
91 |
+70+sB3c4 |
|
92 |
+-----END CERTIFICATE----- |
|
93 |
+ |
|
94 |
+Digital Signature Trust Co. Global CA 1 |
|
95 |
+======================================= |
|
96 |
+-----BEGIN CERTIFICATE----- |
|
97 |
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE |
|
98 |
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy |
|
99 |
+MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs |
|
100 |
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA |
|
101 |
+A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE |
|
102 |
+NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i |
|
103 |
+o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo |
|
104 |
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 |
|
105 |
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw |
|
106 |
+IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY |
|
107 |
+MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM |
|
108 |
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB |
|
109 |
+ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq |
|
110 |
+kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 |
|
111 |
+RbyhkwS7hp86W0N6w4pl |
|
112 |
+-----END CERTIFICATE----- |
|
113 |
+ |
|
114 |
+Digital Signature Trust Co. Global CA 3 |
|
115 |
+======================================= |
|
116 |
+-----BEGIN CERTIFICATE----- |
|
117 |
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE |
|
118 |
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy |
|
119 |
+MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs |
|
120 |
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA |
|
121 |
+A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD |
|
122 |
+VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS |
|
123 |
+xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo |
|
124 |
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 |
|
125 |
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw |
|
126 |
+IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY |
|
127 |
+MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM |
|
128 |
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB |
|
129 |
+AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi |
|
130 |
+up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 |
|
131 |
+mPnHfxsb1gYgAlihw6ID |
|
132 |
+-----END CERTIFICATE----- |
|
133 |
+ |
|
134 |
+Verisign Class 3 Public Primary Certification Authority |
|
135 |
+======================================================= |
|
136 |
+-----BEGIN CERTIFICATE----- |
|
137 |
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx |
|
138 |
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 |
|
139 |
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow |
|
140 |
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz |
|
141 |
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA |
|
142 |
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 |
|
143 |
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol |
|
144 |
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA |
|
145 |
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah |
|
146 |
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf |
|
147 |
+Tqj/ZA1k |
|
148 |
+-----END CERTIFICATE----- |
|
149 |
+ |
|
150 |
+Verisign Class 1 Public Primary Certification Authority - G2 |
|
151 |
+============================================================ |
|
152 |
+-----BEGIN CERTIFICATE----- |
|
153 |
+MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT |
|
154 |
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy |
|
155 |
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln |
|
156 |
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz |
|
157 |
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT |
|
158 |
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy |
|
159 |
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln |
|
160 |
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz |
|
161 |
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd |
|
162 |
+k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq |
|
163 |
+WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB |
|
164 |
+MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM |
|
165 |
+XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC |
|
166 |
+lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ |
|
167 |
+-----END CERTIFICATE----- |
|
168 |
+ |
|
169 |
+Verisign Class 2 Public Primary Certification Authority - G2 |
|
170 |
+============================================================ |
|
171 |
+-----BEGIN CERTIFICATE----- |
|
172 |
+MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV |
|
173 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h |
|
174 |
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp |
|
175 |
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 |
|
176 |
+c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV |
|
177 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h |
|
178 |
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp |
|
179 |
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 |
|
180 |
+c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx |
|
181 |
+nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC |
|
182 |
+wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA |
|
183 |
+ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK |
|
184 |
+1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk |
|
185 |
+LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== |
|
186 |
+-----END CERTIFICATE----- |
|
187 |
+ |
|
188 |
+Verisign Class 3 Public Primary Certification Authority - G2 |
|
189 |
+============================================================ |
|
190 |
+-----BEGIN CERTIFICATE----- |
|
191 |
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT |
|
192 |
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy |
|
193 |
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln |
|
194 |
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz |
|
195 |
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT |
|
196 |
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy |
|
197 |
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln |
|
198 |
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz |
|
199 |
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO |
|
200 |
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 |
|
201 |
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB |
|
202 |
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT |
|
203 |
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD |
|
204 |
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 |
|
205 |
+-----END CERTIFICATE----- |
|
206 |
+ |
|
207 |
+GlobalSign Root CA |
|
208 |
+================== |
|
209 |
+-----BEGIN CERTIFICATE----- |
|
210 |
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx |
|
211 |
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds |
|
212 |
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV |
|
213 |
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD |
|
214 |
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa |
|
215 |
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc |
|
216 |
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb |
|
217 |
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP |
|
218 |
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX |
|
219 |
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV |
|
220 |
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF |
|
221 |
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj |
|
222 |
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG |
|
223 |
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH |
|
224 |
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC |
|
225 |
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== |
|
226 |
+-----END CERTIFICATE----- |
|
227 |
+ |
|
228 |
+GlobalSign Root CA - R2 |
|
229 |
+======================= |
|
230 |
+-----BEGIN CERTIFICATE----- |
|
231 |
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv |
|
232 |
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh |
|
233 |
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT |
|
234 |
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln |
|
235 |
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 |
|
236 |
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp |
|
237 |
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN |
|
238 |
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL |
|
239 |
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C |
|
240 |
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E |
|
241 |
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i |
|
242 |
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN |
|
243 |
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp |
|
244 |
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu |
|
245 |
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 |
|
246 |
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 |
|
247 |
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== |
|
248 |
+-----END CERTIFICATE----- |
|
249 |
+ |
|
250 |
+ValiCert Class 1 VA |
|
251 |
+=================== |
|
252 |
+-----BEGIN CERTIFICATE----- |
|
253 |
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp |
|
254 |
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs |
|
255 |
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh |
|
256 |
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy |
|
257 |
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 |
|
258 |
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg |
|
259 |
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 |
|
260 |
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA |
|
261 |
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi |
|
262 |
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm |
|
263 |
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG |
|
264 |
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX |
|
265 |
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP |
|
266 |
+Orf1LXLI |
|
267 |
+-----END CERTIFICATE----- |
|
268 |
+ |
|
269 |
+ValiCert Class 2 VA |
|
270 |
+=================== |
|
271 |
+-----BEGIN CERTIFICATE----- |
|
272 |
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp |
|
273 |
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs |
|
274 |
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh |
|
275 |
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw |
|
276 |
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 |
|
277 |
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg |
|
278 |
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 |
|
279 |
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA |
|
280 |
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC |
|
281 |
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf |
|
282 |
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ |
|
283 |
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV |
|
284 |
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 |
|
285 |
+W9ViH0Pd |
|
286 |
+-----END CERTIFICATE----- |
|
287 |
+ |
|
288 |
+RSA Root Certificate 1 |
|
289 |
+====================== |
|
290 |
+-----BEGIN CERTIFICATE----- |
|
291 |
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp |
|
292 |
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs |
|
293 |
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh |
|
294 |
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw |
|
295 |
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 |
|
296 |
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg |
|
297 |
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 |
|
298 |
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA |
|
299 |
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td |
|
300 |
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H |
|
301 |
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs |
|
302 |
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF |
|
303 |
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r |
|
304 |
+on+jjBXu |
|
305 |
+-----END CERTIFICATE----- |
|
306 |
+ |
|
307 |
+Verisign Class 1 Public Primary Certification Authority - G3 |
|
308 |
+============================================================ |
|
309 |
+-----BEGIN CERTIFICATE----- |
|
310 |
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV |
|
311 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv |
|
312 |
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl |
|
313 |
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh |
|
314 |
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw |
|
315 |
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy |
|
316 |
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv |
|
317 |
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg |
|
318 |
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
|
319 |
+ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E |
|
320 |
+bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ |
|
321 |
+rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ |
|
322 |
+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB |
|
323 |
+FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA |
|
324 |
+q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N |
|
325 |
+y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 |
|
326 |
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h |
|
327 |
+a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc |
|
328 |
+D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== |
|
329 |
+-----END CERTIFICATE----- |
|
330 |
+ |
|
331 |
+Verisign Class 2 Public Primary Certification Authority - G3 |
|
332 |
+============================================================ |
|
333 |
+-----BEGIN CERTIFICATE----- |
|
334 |
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT |
|
335 |
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y |
|
336 |
+azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug |
|
337 |
+b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 |
|
338 |
+aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ |
|
339 |
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 |
|
340 |
+c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y |
|
341 |
+aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD |
|
342 |
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC |
|
343 |
+AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 |
|
344 |
+tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 |
|
345 |
+C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS |
|
346 |
+0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs |
|
347 |
+Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 |
|
348 |
+JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf |
|
349 |
+0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU |
|
350 |
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx |
|
351 |
+JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j |
|
352 |
+GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q |
|
353 |
+-----END CERTIFICATE----- |
|
354 |
+ |
|
355 |
+Verisign Class 3 Public Primary Certification Authority - G3 |
|
356 |
+============================================================ |
|
357 |
+-----BEGIN CERTIFICATE----- |
|
358 |
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV |
|
359 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv |
|
360 |
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl |
|
361 |
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh |
|
362 |
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw |
|
363 |
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy |
|
364 |
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv |
|
365 |
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg |
|
366 |
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
|
367 |
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 |
|
368 |
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc |
|
369 |
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw |
|
370 |
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj |
|
371 |
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA |
|
372 |
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f |
|
373 |
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC |
|
374 |
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 |
|
375 |
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa |
|
376 |
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== |
|
377 |
+-----END CERTIFICATE----- |
|
378 |
+ |
|
379 |
+Verisign Class 4 Public Primary Certification Authority - G3 |
|
380 |
+============================================================ |
|
381 |
+-----BEGIN CERTIFICATE----- |
|
382 |
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV |
|
383 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv |
|
384 |
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl |
|
385 |
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh |
|
386 |
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw |
|
387 |
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy |
|
388 |
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv |
|
389 |
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg |
|
390 |
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
|
391 |
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS |
|
392 |
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM |
|
393 |
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW |
|
394 |
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX |
|
395 |
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA |
|
396 |
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt |
|
397 |
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm |
|
398 |
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd |
|
399 |
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG |
|
400 |
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== |
|
401 |
+-----END CERTIFICATE----- |
|
402 |
+ |
|
403 |
+Entrust.net Secure Server CA |
|
404 |
+============================ |
|
405 |
+-----BEGIN CERTIFICATE----- |
|
406 |
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV |
|
407 |
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg |
|
408 |
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl |
|
409 |
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv |
|
410 |
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG |
|
411 |
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi |
|
412 |
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p |
|
413 |
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 |
|
414 |
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ |
|
415 |
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 |
|
416 |
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw |
|
417 |
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw |
|
418 |
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l |
|
419 |
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF |
|
420 |
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl |
|
421 |
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu |
|
422 |
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw |
|
423 |
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow |
|
424 |
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA |
|
425 |
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN |
|
426 |
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 |
|
427 |
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= |
|
428 |
+-----END CERTIFICATE----- |
|
429 |
+ |
|
430 |
+Entrust.net Premium 2048 Secure Server CA |
|
431 |
+========================================= |
|
432 |
+-----BEGIN CERTIFICATE----- |
|
433 |
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u |
|
434 |
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp |
|
435 |
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV |
|
436 |
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx |
|
437 |
+NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 |
|
438 |
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl |
|
439 |
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u |
|
440 |
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A |
|
441 |
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL |
|
442 |
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr |
|
443 |
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW |
|
444 |
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi |
|
445 |
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC |
|
446 |
+AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER |
|
447 |
+gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B |
|
448 |
+AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo |
|
449 |
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS |
|
450 |
+o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z |
|
451 |
+2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX |
|
452 |
+OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== |
|
453 |
+-----END CERTIFICATE----- |
|
454 |
+ |
|
455 |
+Baltimore CyberTrust Root |
|
456 |
+========================= |
|
457 |
+-----BEGIN CERTIFICATE----- |
|
458 |
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE |
|
459 |
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li |
|
460 |
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC |
|
461 |
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs |
|
462 |
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME |
|
463 |
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB |
|
464 |
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C |
|
465 |
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 |
|
466 |
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr |
|
467 |
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI |
|
468 |
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB |
|
469 |
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh |
|
470 |
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 |
|
471 |
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa |
|
472 |
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H |
|
473 |
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp |
|
474 |
+-----END CERTIFICATE----- |
|
475 |
+ |
|
476 |
+Equifax Secure Global eBusiness CA |
|
477 |
+================================== |
|
478 |
+-----BEGIN CERTIFICATE----- |
|
479 |
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT |
|
480 |
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp |
|
481 |
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx |
|
482 |
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds |
|
483 |
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV |
|
484 |
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN |
|
485 |
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn |
|
486 |
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j |
|
487 |
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs |
|
488 |
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN |
|
489 |
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY |
|
490 |
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV |
|
491 |
+-----END CERTIFICATE----- |
|
492 |
+ |
|
493 |
+Equifax Secure eBusiness CA 1 |
|
494 |
+============================= |
|
495 |
+-----BEGIN CERTIFICATE----- |
|
496 |
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT |
|
497 |
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB |
|
498 |
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE |
|
499 |
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz |
|
500 |
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ |
|
501 |
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a |
|
502 |
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk |
|
503 |
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW |
|
504 |
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF |
|
505 |
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 |
|
506 |
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ |
|
507 |
+KpYrtWKmpj29f5JZzVoqgrI3eQ== |
|
508 |
+-----END CERTIFICATE----- |
|
509 |
+ |
|
510 |
+Equifax Secure eBusiness CA 2 |
|
511 |
+============================= |
|
512 |
+-----BEGIN CERTIFICATE----- |
|
513 |
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE |
|
514 |
+ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y |
|
515 |
+MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT |
|
516 |
+DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB |
|
517 |
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn |
|
518 |
+2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 |
|
519 |
+BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG |
|
520 |
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx |
|
521 |
+JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG |
|
522 |
+A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e |
|
523 |
+uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB |
|
524 |
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 |
|
525 |
+jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia |
|
526 |
+78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm |
|
527 |
+V+GRMOrN |
|
528 |
+-----END CERTIFICATE----- |
|
529 |
+ |
|
530 |
+AddTrust Low-Value Services Root |
|
531 |
+================================ |
|
532 |
+-----BEGIN CERTIFICATE----- |
|
533 |
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML |
|
534 |
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU |
|
535 |
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw |
|
536 |
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO |
|
537 |
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB |
|
538 |
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 |
|
539 |
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr |
|
540 |
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 |
|
541 |
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui |
|
542 |
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w |
|
543 |
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD |
|
544 |
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT |
|
545 |
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw |
|
546 |
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt |
|
547 |
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph |
|
548 |
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY |
|
549 |
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr |
|
550 |
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj |
|
551 |
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= |
|
552 |
+-----END CERTIFICATE----- |
|
553 |
+ |
|
554 |
+AddTrust External Root |
|
555 |
+====================== |
|
556 |
+-----BEGIN CERTIFICATE----- |
|
557 |
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML |
|
558 |
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD |
|
559 |
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw |
|
560 |
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU |
|
561 |
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg |
|
562 |
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 |
|
563 |
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw |
|
564 |
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo |
|
565 |
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy |
|
566 |
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 |
|
567 |
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P |
|
568 |
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL |
|
569 |
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk |
|
570 |
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB |
|
571 |
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl |
|
572 |
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 |
|
573 |
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 |
|
574 |
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u |
|
575 |
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= |
|
576 |
+-----END CERTIFICATE----- |
|
577 |
+ |
|
578 |
+AddTrust Public Services Root |
|
579 |
+============================= |
|
580 |
+-----BEGIN CERTIFICATE----- |
|
581 |
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML |
|
582 |
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU |
|
583 |
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ |
|
584 |
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l |
|
585 |
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF |
|
586 |
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu |
|
587 |
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i |
|
588 |
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG |
|
589 |
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw |
|
590 |
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G |
|
591 |
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB |
|
592 |
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux |
|
593 |
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G |
|
594 |
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 |
|
595 |
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL |
|
596 |
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao |
|
597 |
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 |
|
598 |
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H |
|
599 |
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= |
|
600 |
+-----END CERTIFICATE----- |
|
601 |
+ |
|
602 |
+AddTrust Qualified Certificates Root |
|
603 |
+==================================== |
|
604 |
+-----BEGIN CERTIFICATE----- |
|
605 |
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML |
|
606 |
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU |
|
607 |
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx |
|
608 |
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ |
|
609 |
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG |
|
610 |
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx |
|
611 |
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 |
|
612 |
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o |
|
613 |
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR |
|
614 |
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU |
|
615 |
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ |
|
616 |
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE |
|
617 |
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y |
|
618 |
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD |
|
619 |
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG |
|
620 |
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X |
|
621 |
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze |
|
622 |
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB |
|
623 |
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= |
|
624 |
+-----END CERTIFICATE----- |
|
625 |
+ |
|
626 |
+Entrust Root Certification Authority |
|
627 |
+==================================== |
|
628 |
+-----BEGIN CERTIFICATE----- |
|
629 |
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV |
|
630 |
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw |
|
631 |
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG |
|
632 |
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 |
|
633 |
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu |
|
634 |
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu |
|
635 |
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v |
|
636 |
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB |
|
637 |
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz |
|
638 |
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww |
|
639 |
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 |
|
640 |
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN |
|
641 |
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw |
|
642 |
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 |
|
643 |
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH |
|
644 |
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA |
|
645 |
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM |
|
646 |
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa |
|
647 |
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS |
|
648 |
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 |
|
649 |
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 |
|
650 |
+-----END CERTIFICATE----- |
|
651 |
+ |
|
652 |
+RSA Security 2048 v3 |
|
653 |
+==================== |
|
654 |
+-----BEGIN CERTIFICATE----- |
|
655 |
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK |
|
656 |
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy |
|
657 |
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb |
|
658 |
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC |
|
659 |
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 |
|
660 |
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb |
|
661 |
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH |
|
662 |
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP |
|
663 |
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ |
|
664 |
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E |
|
665 |
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY |
|
666 |
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj |
|
667 |
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj |
|
668 |
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 |
|
669 |
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA |
|
670 |
+pKnXwiJPZ9d37CAFYd4= |
|
671 |
+-----END CERTIFICATE----- |
|
672 |
+ |
|
673 |
+GeoTrust Global CA |
|
674 |
+================== |
|
675 |
+-----BEGIN CERTIFICATE----- |
|
676 |
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK |
|
677 |
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw |
|
678 |
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j |
|
679 |
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB |
|
680 |
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo |
|
681 |
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet |
|
682 |
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc |
|
683 |
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU |
|
684 |
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD |
|
685 |
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk |
|
686 |
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q |
|
687 |
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 |
|
688 |
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 |
|
689 |
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p |
|
690 |
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm |
|
691 |
+Mw== |
|
692 |
+-----END CERTIFICATE----- |
|
693 |
+ |
|
694 |
+GeoTrust Global CA 2 |
|
695 |
+==================== |
|
696 |
+-----BEGIN CERTIFICATE----- |
|
697 |
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN |
|
698 |
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw |
|
699 |
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j |
|
700 |
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|
701 |
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ |
|
702 |
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k |
|
703 |
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA |
|
704 |
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b |
|
705 |
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF |
|
706 |
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH |
|
707 |
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 |
|
708 |
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh |
|
709 |
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL |
|
710 |
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC |
|
711 |
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF |
|
712 |
+H4z1Ir+rzoPz4iIprn2DQKi6bA== |
|
713 |
+-----END CERTIFICATE----- |
|
714 |
+ |
|
715 |
+GeoTrust Universal CA |
|
716 |
+===================== |
|
717 |
+-----BEGIN CERTIFICATE----- |
|
718 |
+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 |
|
742 |
+P/rmMuGNG2+k5o7Y+SlIis5z/iw= |
|
743 |
+-----END CERTIFICATE----- |
|
744 |
+ |
|
745 |
+GeoTrust Universal CA 2 |
|
746 |
+======================= |
|
747 |
+-----BEGIN CERTIFICATE----- |
|
748 |
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN |
|
749 |
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 |
|
750 |
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg |
|
751 |
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA |
|
752 |
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 |
|
753 |
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 |
|
754 |
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q |
|
755 |
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a |
|
756 |
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 |
|
757 |
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP |
|
758 |
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn |
|
759 |
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC |
|
760 |
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG |
|
761 |
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 |
|
762 |
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E |
|
763 |
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z |
|
764 |
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ |
|
765 |
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ |
|
766 |
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq |
|
767 |
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg |
|
768 |
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP |
|
769 |
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d |
|
770 |
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp |
|
771 |
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm |
|
772 |
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS |
|
773 |
+-----END CERTIFICATE----- |
|
774 |
+ |
|
775 |
+UTN-USER First-Network Applications |
|
776 |
+=================================== |
|
777 |
+-----BEGIN CERTIFICATE----- |
|
778 |
+MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE |
|
779 |
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl |
|
780 |
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp |
|
781 |
+BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 |
|
782 |
+WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T |
|
783 |
+YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho |
|
784 |
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB |
|
785 |
+cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug |
|
786 |
+mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj |
|
787 |
+DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu |
|
788 |
+Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi |
|
789 |
+P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE |
|
790 |
+j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w |
|
791 |
+HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j |
|
792 |
+cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G |
|
793 |
+CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y |
|
794 |
+IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK |
|
795 |
+RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp |
|
796 |
+xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq |
|
797 |
+DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE |
|
798 |
+-----END CERTIFICATE----- |
|
799 |
+ |
|
800 |
+America Online Root Certification Authority 1 |
|
801 |
+============================================= |
|
802 |
+-----BEGIN CERTIFICATE----- |
|
803 |
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT |
|
804 |
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp |
|
805 |
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG |
|
806 |
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg |
|
807 |
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD |
|
808 |
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG |
|
809 |
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z |
|
810 |
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh |
|
811 |
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP |
|
812 |
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T |
|
813 |
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z |
|
814 |
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf |
|
815 |
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF |
|
816 |
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft |
|
817 |
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g |
|
818 |
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds |
|
819 |
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 |
|
820 |
+-----END CERTIFICATE----- |
|
821 |
+ |
|
822 |
+America Online Root Certification Authority 2 |
|
823 |
+============================================= |
|
824 |
+-----BEGIN CERTIFICATE----- |
|
825 |
+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 |
|
850 |
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= |
|
851 |
+-----END CERTIFICATE----- |
|
852 |
+ |
|
853 |
+Visa eCommerce Root |
|
854 |
+=================== |
|
855 |
+-----BEGIN CERTIFICATE----- |
|
856 |
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG |
|
857 |
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug |
|
858 |
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 |
|
859 |
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm |
|
860 |
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv |
|
861 |
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL |
|
862 |
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b |
|
863 |
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 |
|
864 |
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI |
|
865 |
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs |
|
866 |
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG |
|
867 |
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc |
|
868 |
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW |
|
869 |
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz |
|
870 |
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu |
|
871 |
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt |
|
872 |
+398znM/jra6O1I7mT1GvFpLgXPYHDw== |
|
873 |
+-----END CERTIFICATE----- |
|
874 |
+ |
|
875 |
+Certum Root CA |
|
876 |
+============== |
|
877 |
+-----BEGIN CERTIFICATE----- |
|
878 |
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK |
|
879 |
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla |
|
880 |
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u |
|
881 |
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x |
|
882 |
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL |
|
883 |
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ |
|
884 |
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K |
|
885 |
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P |
|
886 |
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq |
|
887 |
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ |
|
888 |
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg |
|
889 |
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ |
|
890 |
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS |
|
891 |
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== |
|
892 |
+-----END CERTIFICATE----- |
|
893 |
+ |
|
894 |
+Comodo AAA Services root |
|
895 |
+======================== |
|
896 |
+-----BEGIN CERTIFICATE----- |
|
897 |
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS |
|
898 |
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg |
|
899 |
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw |
|
900 |
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl |
|
901 |
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV |
|
902 |
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
|
903 |
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG |
|
904 |
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs |
|
905 |
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW |
|
906 |
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH |
|
907 |
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK |
|
908 |
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f |
|
909 |
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl |
|
910 |
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz |
|
911 |
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm |
|
912 |
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz |
|
913 |
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z |
|
914 |
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C |
|
915 |
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== |
|
916 |
+-----END CERTIFICATE----- |
|
917 |
+ |
|
918 |
+Comodo Secure Services root |
|
919 |
+=========================== |
|
920 |
+-----BEGIN CERTIFICATE----- |
|
921 |
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS |
|
922 |
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg |
|
923 |
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw |
|
924 |
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu |
|
925 |
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi |
|
926 |
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP |
|
927 |
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP |
|
928 |
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc |
|
929 |
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC |
|
930 |
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V |
|
931 |
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E |
|
932 |
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w |
|
933 |
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj |
|
934 |
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm |
|
935 |
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm |
|
936 |
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj |
|
937 |
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL |
|
938 |
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw |
|
939 |
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H |
|
940 |
+RR3B7Hzs/Sk= |
|
941 |
+-----END CERTIFICATE----- |
|
942 |
+ |
|
943 |
+Comodo Trusted Services root |
|
944 |
+============================ |
|
945 |
+-----BEGIN CERTIFICATE----- |
|
946 |
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS |
|
947 |
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg |
|
948 |
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw |
|
949 |
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h |
|
950 |
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw |
|
951 |
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC |
|
952 |
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 |
|
953 |
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y |
|
954 |
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 |
|
955 |
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS |
|
956 |
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud |
|
957 |
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB |
|
958 |
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp |
|
959 |
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl |
|
960 |
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw |
|
961 |
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 |
|
962 |
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA |
|
963 |
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l |
|
964 |
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O |
|
965 |
+9y5Xt5hwXsjEeLBi |
|
966 |
+-----END CERTIFICATE----- |
|
967 |
+ |
|
968 |
+QuoVadis Root CA |
|
969 |
+================ |
|
970 |
+-----BEGIN CERTIFICATE----- |
|
971 |
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE |
|
972 |
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 |
|
973 |
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz |
|
974 |
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp |
|
975 |
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD |
|
976 |
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF |
|
977 |
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk |
|
978 |
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL |
|
979 |
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL |
|
980 |
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen |
|
981 |
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w |
|
982 |
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y |
|
983 |
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 |
|
984 |
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj |
|
985 |
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs |
|
986 |
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh |
|
987 |
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW |
|
988 |
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu |
|
989 |
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw |
|
990 |
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 |
|
991 |
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 |
|
992 |
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo |
|
993 |
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul |
|
994 |
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x |
|
995 |
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi |
|
996 |
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi |
|
997 |
+5nrQNiOKSnQ2+Q== |
|
998 |
+-----END CERTIFICATE----- |
|
999 |
+ |
|
1000 |
+QuoVadis Root CA 2 |
|
1001 |
+================== |
|
1002 |
+-----BEGIN CERTIFICATE----- |
|
1003 |
+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 |
|
1029 |
+-----END CERTIFICATE----- |
|
1030 |
+ |
|
1031 |
+QuoVadis Root CA 3 |
|
1032 |
+================== |
|
1033 |
+-----BEGIN CERTIFICATE----- |
|
1034 |
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT |
|
1035 |
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx |
|
1036 |
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM |
|
1037 |
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC |
|
1038 |
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg |
|
1039 |
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij |
|
1040 |
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K |
|
1041 |
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv |
|
1042 |
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp |
|
1043 |
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 |
|
1044 |
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX |
|
1045 |
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM |
|
1046 |
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz |
|
1047 |
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT |
|
1048 |
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj |
|
1049 |
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 |
|
1050 |
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB |
|
1051 |
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD |
|
1052 |
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 |
|
1053 |
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE |
|
1054 |
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV |
|
1055 |
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s |
|
1056 |
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z |
|
1057 |
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 |
|
1058 |
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp |
|
1059 |
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC |
|
1060 |
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu |
|
1061 |
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p |
|
1062 |
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr |
|
1063 |
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= |
|
1064 |
+-----END CERTIFICATE----- |
|
1065 |
+ |
|
1066 |
+Security Communication Root CA |
|
1067 |
+============================== |
|
1068 |
+-----BEGIN CERTIFICATE----- |
|
1069 |
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP |
|
1070 |
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw |
|
1071 |
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP |
|
1072 |
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw |
|
1073 |
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw |
|
1074 |
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM |
|
1075 |
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX |
|
1076 |
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd |
|
1077 |
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 |
|
1078 |
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw |
|
1079 |
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g |
|
1080 |
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a |
|
1081 |
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ |
|
1082 |
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ |
|
1083 |
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi |
|
1084 |
+FL39vmwLAw== |
|
1085 |
+-----END CERTIFICATE----- |
|
1086 |
+ |
|
1087 |
+Sonera Class 1 Root CA |
|
1088 |
+====================== |
|
1089 |
+-----BEGIN CERTIFICATE----- |
|
1090 |
+MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG |
|
1091 |
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw |
|
1092 |
+NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh |
|
1093 |
+IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 |
|
1094 |
+7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 |
|
1095 |
+EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl |
|
1096 |
+0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 |
|
1097 |
+2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa |
|
1098 |
+HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT |
|
1099 |
+iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 |
|
1100 |
+28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV |
|
1101 |
+yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR |
|
1102 |
+vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P |
|
1103 |
+qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z |
|
1104 |
+IRlXvVWa |
|
1105 |
+-----END CERTIFICATE----- |
|
1106 |
+ |
|
1107 |
+Sonera Class 2 Root CA |
|
1108 |
+====================== |
|
1109 |
+-----BEGIN CERTIFICATE----- |
|
1110 |
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG |
|
1111 |
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw |
|
1112 |
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh |
|
1113 |
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 |
|
1114 |
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT |
|
1115 |
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG |
|
1116 |
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P |
|
1117 |
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH |
|
1118 |
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT |
|
1119 |
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt |
|
1120 |
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI |
|
1121 |
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph |
|
1122 |
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx |
|
1123 |
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH |
|
1124 |
+llpwrN9M |
|
1125 |
+-----END CERTIFICATE----- |
|
1126 |
+ |
|
1127 |
+Staat der Nederlanden Root CA |
|
1128 |
+============================= |
|
1129 |
+-----BEGIN CERTIFICATE----- |
|
1130 |
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE |
|
1131 |
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g |
|
1132 |
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w |
|
1133 |
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh |
|
1134 |
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt |
|
1135 |
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P |
|
1136 |
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca |
|
1137 |
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth |
|
1138 |
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 |
|
1139 |
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV |
|
1140 |
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v |
|
1141 |
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN |
|
1142 |
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR |
|
1143 |
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw |
|
1144 |
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y |
|
1145 |
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR |
|
1146 |
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== |
|
1147 |
+-----END CERTIFICATE----- |
|
1148 |
+ |
|
1149 |
+TDC Internet Root CA |
|
1150 |
+==================== |
|
1151 |
+-----BEGIN CERTIFICATE----- |
|
1152 |
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE |
|
1153 |
+ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx |
|
1154 |
+NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu |
|
1155 |
+ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A |
|
1156 |
+MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j |
|
1157 |
+xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL |
|
1158 |
+znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc |
|
1159 |
+5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 |
|
1160 |
+otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI |
|
1161 |
+AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM |
|
1162 |
+VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM |
|
1163 |
+MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC |
|
1164 |
+AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe |
|
1165 |
+UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G |
|
1166 |
+CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m |
|
1167 |
+gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ |
|
1168 |
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb |
|
1169 |
+O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU |
|
1170 |
+Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l |
|
1171 |
+-----END CERTIFICATE----- |
|
1172 |
+ |
|
1173 |
+TDC OCES Root CA |
|
1174 |
+================ |
|
1175 |
+-----BEGIN CERTIFICATE----- |
|
1176 |
+MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE |
|
1177 |
+ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 |
|
1178 |
+MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB |
|
1179 |
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH |
|
1180 |
+nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 |
|
1181 |
+zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV |
|
1182 |
+iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde |
|
1183 |
+dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO |
|
1184 |
+3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB |
|
1185 |
+5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k |
|
1186 |
+ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm |
|
1187 |
+cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp |
|
1188 |
+Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x |
|
1189 |
+LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM |
|
1190 |
+MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm |
|
1191 |
+aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy |
|
1192 |
+MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 |
|
1193 |
++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 |
|
1194 |
+NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 |
|
1195 |
+A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc |
|
1196 |
+A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 |
|
1197 |
+AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 |
|
1198 |
+AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== |
|
1199 |
+-----END CERTIFICATE----- |
|
1200 |
+ |
|
1201 |
+UTN DATACorp SGC Root CA |
|
1202 |
+======================== |
|
1203 |
+-----BEGIN CERTIFICATE----- |
|
1204 |
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE |
|
1205 |
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl |
|
1206 |
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ |
|
1207 |
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa |
|
1208 |
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w |
|
1209 |
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy |
|
1210 |
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC |
|
1211 |
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys |
|
1212 |
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo |
|
1213 |
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA |
|
1214 |
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv |
|
1215 |
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud |
|
1216 |
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 |
|
1217 |
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD |
|
1218 |
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 |
|
1219 |
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft |
|
1220 |
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 |
|
1221 |
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx |
|
1222 |
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP |
|
1223 |
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI |
|
1224 |
+-----END CERTIFICATE----- |
|
1225 |
+ |
|
1226 |
+UTN USERFirst Email Root CA |
|
1227 |
+=========================== |
|
1228 |
+-----BEGIN CERTIFICATE----- |
|
1229 |
+MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE |
|
1230 |
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl |
|
1231 |
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 |
|
1232 |
+BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 |
|
1233 |
+OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx |
|
1234 |
+FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx |
|
1235 |
+ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz |
|
1236 |
+dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A |
|
1237 |
+MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx |
|
1238 |
+B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 |
|
1239 |
+om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG |
|
1240 |
+TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl |
|
1241 |
+yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE |
|
1242 |
+AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV |
|
1243 |
+HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll |
|
1244 |
+bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH |
|
1245 |
+AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne |
|
1246 |
+xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ |
|
1247 |
+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV |
|
1248 |
+NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ |
|
1249 |
+w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= |
|
1250 |
+-----END CERTIFICATE----- |
|
1251 |
+ |
|
1252 |
+UTN USERFirst Hardware Root CA |
|
1253 |
+============================== |
|
1254 |
+-----BEGIN CERTIFICATE----- |
|
1255 |
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE |
|
1256 |
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl |
|
1257 |
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd |
|
1258 |
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx |
|
1259 |
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 |
|
1260 |
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz |
|
1261 |
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 |
|
1262 |
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI |
|
1263 |
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd |
|
1264 |
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 |
|
1265 |
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf |
|
1266 |
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw |
|
1267 |
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF |
|
1268 |
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF |
|
1269 |
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF |
|
1270 |
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM |
|
1271 |
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW |
|
1272 |
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 |
|
1273 |
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn |
|
1274 |
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 |
|
1275 |
+nfhmqA== |
|
1276 |
+-----END CERTIFICATE----- |
|
1277 |
+ |
|
1278 |
+UTN USERFirst Object Root CA |
|
1279 |
+============================ |
|
1280 |
+-----BEGIN CERTIFICATE----- |
|
1281 |
+MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE |
|
1282 |
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl |
|
1283 |
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb |
|
1284 |
+BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz |
|
1285 |
+NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx |
|
1286 |
+HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy |
|
1287 |
+dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB |
|
1288 |
+BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR |
|
1289 |
+loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ |
|
1290 |
+w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu |
|
1291 |
+lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 |
|
1292 |
+RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL |
|
1293 |
+BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 |
|
1294 |
+ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly |
|
1295 |
+c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw |
|
1296 |
+DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw |
|
1297 |
+NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO |
|
1298 |
+PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE |
|
1299 |
+qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG |
|
1300 |
+hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= |
|
1301 |
+-----END CERTIFICATE----- |
|
1302 |
+ |
|
1303 |
+Camerfirma Chambers of Commerce Root |
|
1304 |
+==================================== |
|
1305 |
+-----BEGIN CERTIFICATE----- |
|
1306 |
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe |
|
1307 |
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i |
|
1308 |
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx |
|
1309 |
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp |
|
1310 |
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn |
|
1311 |
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC |
|
1312 |
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU |
|
1313 |
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH |
|
1314 |
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW |
|
1315 |
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV |
|
1316 |
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud |
|
1317 |
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v |
|
1318 |
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P |
|
1319 |
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh |
|
1320 |
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD |
|
1321 |
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz |
|
1322 |
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi |
|
1323 |
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD |
|
1324 |
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN |
|
1325 |
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n |
|
1326 |
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 |
|
1327 |
+erfutGWaIZDgqtCYvDi1czyL+Nw= |
|
1328 |
+-----END CERTIFICATE----- |
|
1329 |
+ |
|
1330 |
+Camerfirma Global Chambersign Root |
|
1331 |
+================================== |
|
1332 |
+-----BEGIN CERTIFICATE----- |
|
1333 |
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe |
|
1334 |
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i |
|
1335 |
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx |
|
1336 |
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt |
|
1337 |
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg |
|
1338 |
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw |
|
1339 |
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J |
|
1340 |
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O |
|
1341 |
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl |
|
1342 |
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c |
|
1343 |
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ |
|
1344 |
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j |
|
1345 |
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B |
|
1346 |
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj |
|
1347 |
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y |
|
1348 |
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh |
|
1349 |
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA |
|
1350 |
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y |
|
1351 |
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ |
|
1352 |
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 |
|
1353 |
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes |
|
1354 |
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== |
|
1355 |
+-----END CERTIFICATE----- |
|
1356 |
+ |
|
1357 |
+NetLock Qualified (Class QA) Root |
|
1358 |
+================================= |
|
1359 |
+-----BEGIN CERTIFICATE----- |
|
1360 |
+MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT |
|
1361 |
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV |
|
1362 |
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn |
|
1363 |
+eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 |
|
1364 |
+bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER |
|
1365 |
+MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 |
|
1366 |
+LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 |
|
1367 |
+dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP |
|
1368 |
+aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV |
|
1369 |
+CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e |
|
1370 |
+8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb |
|
1371 |
+m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ |
|
1372 |
+0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM |
|
1373 |
+0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV |
|
1374 |
+HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 |
|
1375 |
+YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh |
|
1376 |
+biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p |
|
1377 |
+a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz |
|
1378 |
+YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg |
|
1379 |
+YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg |
|
1380 |
+ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov |
|
1381 |
+L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr |
|
1382 |
+Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 |
|
1383 |
+aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg |
|
1384 |
+YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 |
|
1385 |
+IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 |
|
1386 |
+DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN |
|
1387 |
+wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg |
|
1388 |
+W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc |
|
1389 |
+R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR |
|
1390 |
+5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko |
|
1391 |
+-----END CERTIFICATE----- |
|
1392 |
+ |
|
1393 |
+NetLock Notary (Class A) Root |
|
1394 |
+============================= |
|
1395 |
+-----BEGIN CERTIFICATE----- |
|
1396 |
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI |
|
1397 |
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 |
|
1398 |
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j |
|
1399 |
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX |
|
1400 |
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH |
|
1401 |
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD |
|
1402 |
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz |
|
1403 |
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM |
|
1404 |
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ |
|
1405 |
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC |
|
1406 |
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 |
|
1407 |
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 |
|
1408 |
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG |
|
1409 |
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC |
|
1410 |
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv |
|
1411 |
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu |
|
1412 |
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn |
|
1413 |
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 |
|
1414 |
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz |
|
1415 |
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh |
|
1416 |
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu |
|
1417 |
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh |
|
1418 |
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg |
|
1419 |
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp |
|
1420 |
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 |
|
1421 |
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP |
|
1422 |
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB |
|
1423 |
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr |
|
1424 |
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM |
|
1425 |
+8CgHrTwXZoi1/baI |
|
1426 |
+-----END CERTIFICATE----- |
|
1427 |
+ |
|
1428 |
+NetLock Business (Class B) Root |
|
1429 |
+=============================== |
|
1430 |
+-----BEGIN CERTIFICATE----- |
|
1431 |
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT |
|
1432 |
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV |
|
1433 |
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg |
|
1434 |
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD |
|
1435 |
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv |
|
1436 |
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg |
|
1437 |
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB |
|
1438 |
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S |
|
1439 |
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr |
|
1440 |
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV |
|
1441 |
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ |
|
1442 |
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh |
|
1443 |
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 |
|
1444 |
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv |
|
1445 |
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg |
|
1446 |
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh |
|
1447 |
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz |
|
1448 |
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA |
|
1449 |
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl |
|
1450 |
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 |
|
1451 |
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj |
|
1452 |
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM |
|
1453 |
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR |
|
1454 |
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI |
|
1455 |
+-----END CERTIFICATE----- |
|
1456 |
+ |
|
1457 |
+NetLock Express (Class C) Root |
|
1458 |
+============================== |
|
1459 |
+-----BEGIN CERTIFICATE----- |
|
1460 |
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT |
|
1461 |
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV |
|
1462 |
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD |
|
1463 |
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ |
|
1464 |
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 |
|
1465 |
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j |
|
1466 |
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB |
|
1467 |
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z |
|
1468 |
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 |
|
1469 |
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw |
|
1470 |
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN |
|
1471 |
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn |
|
1472 |
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB |
|
1473 |
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i |
|
1474 |
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 |
|
1475 |
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs |
|
1476 |
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo |
|
1477 |
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y |
|
1478 |
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k |
|
1479 |
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ |
|
1480 |
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg |
|
1481 |
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 |
|
1482 |
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW |
|
1483 |
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== |
|
1484 |
+-----END CERTIFICATE----- |
|
1485 |
+ |
|
1486 |
+XRamp Global CA Root |
|
1487 |
+==================== |
|
1488 |
+-----BEGIN CERTIFICATE----- |
|
1489 |
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE |
|
1490 |
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj |
|
1491 |
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB |
|
1492 |
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx |
|
1493 |
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg |
|
1494 |
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp |
|
1495 |
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu |
|
1496 |
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx |
|
1497 |
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE |
|
1498 |
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs |
|
1499 |
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry |
|
1500 |
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud |
|
1501 |
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap |
|
1502 |
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC |
|
1503 |
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc |
|
1504 |
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt |
|
1505 |
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n |
|
1506 |
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz |
|
1507 |
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= |
|
1508 |
+-----END CERTIFICATE----- |
|
1509 |
+ |
|
1510 |
+Go Daddy Class 2 CA |
|
1511 |
+=================== |
|
1512 |
+-----BEGIN CERTIFICATE----- |
|
1513 |
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY |
|
1514 |
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp |
|
1515 |
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG |
|
1516 |
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g |
|
1517 |
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD |
|
1518 |
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv |
|
1519 |
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 |
|
1520 |
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j |
|
1521 |
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY |
|
1522 |
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O |
|
1523 |
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o |
|
1524 |
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu |
|
1525 |
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG |
|
1526 |
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim |
|
1527 |
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt |
|
1528 |
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ |
|
1529 |
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI |
|
1530 |
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b |
|
1531 |
+vZ8= |
|
1532 |
+-----END CERTIFICATE----- |
|
1533 |
+ |
|
1534 |
+Starfield Class 2 CA |
|
1535 |
+==================== |
|
1536 |
+-----BEGIN CERTIFICATE----- |
|
1537 |
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc |
|
1538 |
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg |
|
1539 |
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo |
|
1540 |
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG |
|
1541 |
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG |
|
1542 |
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY |
|
1543 |
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ |
|
1544 |
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm |
|
1545 |
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN |
|
1546 |
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF |
|
1547 |
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f |
|
1548 |
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo |
|
1549 |
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g |
|
1550 |
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs |
|
1551 |
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM |
|
1552 |
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl |
|
1553 |
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD |
|
1554 |
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 |
|
1555 |
+QBFGmh95DmK/D5fs4C8fF5Q= |
|
1556 |
+-----END CERTIFICATE----- |
|
1557 |
+ |
|
1558 |
+StartCom Certification Authority |
|
1559 |
+================================ |
|
1560 |
+-----BEGIN CERTIFICATE----- |
|
1561 |
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN |
|
1562 |
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu |
|
1563 |
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 |
|
1564 |
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk |
|
1565 |
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg |
|
1566 |
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw |
|
1567 |
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y |
|
1568 |
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ |
|
1569 |
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d |
|
1570 |
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt |
|
1571 |
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z |
|
1572 |
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ |
|
1573 |
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ |
|
1574 |
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc |
|
1575 |
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT |
|
1576 |
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE |
|
1577 |
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 |
|
1578 |
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj |
|
1579 |
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH |
|
1580 |
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw |
|
1581 |
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg |
|
1582 |
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 |
|
1583 |
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl |
|
1584 |
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh |
|
1585 |
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT |
|
1586 |
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC |
|
1587 |
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh |
|
1588 |
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm |
|
1589 |
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk |
|
1590 |
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 |
|
1591 |
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ |
|
1592 |
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq |
|
1593 |
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl |
|
1594 |
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ |
|
1595 |
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro |
|
1596 |
+g14= |
|
1597 |
+-----END CERTIFICATE----- |
|
1598 |
+ |
|
1599 |
+Taiwan GRCA |
|
1600 |
+=========== |
|
1601 |
+-----BEGIN CERTIFICATE----- |
|
1602 |
+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 |
|
1627 |
+-----END CERTIFICATE----- |
|
1628 |
+ |
|
1629 |
+Firmaprofesional Root CA |
|
1630 |
+======================== |
|
1631 |
+-----BEGIN CERTIFICATE----- |
|
1632 |
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT |
|
1633 |
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp |
|
1634 |
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA |
|
1635 |
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL |
|
1636 |
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT |
|
1637 |
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 |
|
1638 |
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB |
|
1639 |
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V |
|
1640 |
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH |
|
1641 |
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf |
|
1642 |
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 |
|
1643 |
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww |
|
1644 |
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG |
|
1645 |
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud |
|
1646 |
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD |
|
1647 |
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq |
|
1648 |
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf |
|
1649 |
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm |
|
1650 |
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG |
|
1651 |
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= |
|
1652 |
+-----END CERTIFICATE----- |
|
1653 |
+ |
|
1654 |
+Wells Fargo Root CA |
|
1655 |
+=================== |
|
1656 |
+-----BEGIN CERTIFICATE----- |
|
1657 |
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV |
|
1658 |
+BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv |
|
1659 |
+cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN |
|
1660 |
+MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl |
|
1661 |
+bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv |
|
1662 |
+MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG |
|
1663 |
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX |
|
1664 |
+x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 |
|
1665 |
+E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 |
|
1666 |
+OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j |
|
1667 |
+sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj |
|
1668 |
+YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF |
|
1669 |
+BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD |
|
1670 |
+ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv |
|
1671 |
+m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R |
|
1672 |
+OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx |
|
1673 |
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 |
|
1674 |
+tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= |
|
1675 |
+-----END CERTIFICATE----- |
|
1676 |
+ |
|
1677 |
+Swisscom Root CA 1 |
|
1678 |
+================== |
|
1679 |
+-----BEGIN CERTIFICATE----- |
|
1680 |
+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 |
|
1706 |
+NY6E0F/6MBr1mmz0DlP5OlvRHA== |
|
1707 |
+-----END CERTIFICATE----- |
|
1708 |
+ |
|
1709 |
+DigiCert Assured ID Root CA |
|
1710 |
+=========================== |
|
1711 |
+-----BEGIN CERTIFICATE----- |
|
1712 |
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG |
|
1713 |
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw |
|
1714 |
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx |
|
1715 |
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL |
|
1716 |
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew |
|
1717 |
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO |
|
1718 |
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy |
|
1719 |
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW |
|
1720 |
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy |
|
1721 |
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf |
|
1722 |
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF |
|
1723 |
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq |
|
1724 |
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc |
|
1725 |
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn |
|
1726 |
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i |
|
1727 |
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe |
|
1728 |
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== |
|
1729 |
+-----END CERTIFICATE----- |
|
1730 |
+ |
|
1731 |
+DigiCert Global Root CA |
|
1732 |
+======================= |
|
1733 |
+-----BEGIN CERTIFICATE----- |
|
1734 |
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG |
|
1735 |
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw |
|
1736 |
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw |
|
1737 |
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 |
|
1738 |
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq |
|
1739 |
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn |
|
1740 |
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 |
|
1741 |
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H |
|
1742 |
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y |
|
1743 |
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB |
|
1744 |
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm |
|
1745 |
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF |
|
1746 |
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr |
|
1747 |
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt |
|
1748 |
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 |
|
1749 |
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk |
|
1750 |
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= |
|
1751 |
+-----END CERTIFICATE----- |
|
1752 |
+ |
|
1753 |
+DigiCert High Assurance EV Root CA |
|
1754 |
+================================== |
|
1755 |
+-----BEGIN CERTIFICATE----- |
|
1756 |
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG |
|
1757 |
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw |
|
1758 |
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw |
|
1759 |
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ |
|
1760 |
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu |
|
1761 |
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t |
|
1762 |
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS |
|
1763 |
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 |
|
1764 |
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ |
|
1765 |
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe |
|
1766 |
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB |
|
1767 |
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY |
|
1768 |
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ |
|
1769 |
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp |
|
1770 |
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK |
|
1771 |
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe |
|
1772 |
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K |
|
1773 |
+-----END CERTIFICATE----- |
|
1774 |
+ |
|
1775 |
+Certplus Class 2 Primary CA |
|
1776 |
+=========================== |
|
1777 |
+-----BEGIN CERTIFICATE----- |
|
1778 |
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE |
|
1779 |
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN |
|
1780 |
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy |
|
1781 |
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP |
|
1782 |
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR |
|
1783 |
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ |
|
1784 |
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO |
|
1785 |
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e |
|
1786 |
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME |
|
1787 |
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ |
|
1788 |
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t |
|
1789 |
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD |
|
1790 |
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R |
|
1791 |
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ |
|
1792 |
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW |
|
1793 |
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 |
|
1794 |
+l7+ijrRU |
|
1795 |
+-----END CERTIFICATE----- |
|
1796 |
+ |
|
1797 |
+DST Root CA X3 |
|
1798 |
+============== |
|
1799 |
+-----BEGIN CERTIFICATE----- |
|
1800 |
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK |
|
1801 |
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X |
|
1802 |
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 |
|
1803 |
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD |
|
1804 |
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT |
|
1805 |
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 |
|
1806 |
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy |
|
1807 |
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d |
|
1808 |
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T |
|
1809 |
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ |
|
1810 |
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug |
|
1811 |
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE |
|
1812 |
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw |
|
1813 |
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS |
|
1814 |
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ |
|
1815 |
+-----END CERTIFICATE----- |
|
1816 |
+ |
|
1817 |
+DST ACES CA X6 |
|
1818 |
+============== |
|
1819 |
+-----BEGIN CERTIFICATE----- |
|
1820 |
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG |
|
1821 |
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT |
|
1822 |
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha |
|
1823 |
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE |
|
1824 |
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC |
|
1825 |
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI |
|
1826 |
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa |
|
1827 |
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow |
|
1828 |
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy |
|
1829 |
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud |
|
1830 |
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu |
|
1831 |
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy |
|
1832 |
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU |
|
1833 |
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 |
|
1834 |
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t |
|
1835 |
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq |
|
1836 |
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs |
|
1837 |
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 |
|
1838 |
+oKfN5XozNmr6mis= |
|
1839 |
+-----END CERTIFICATE----- |
|
1840 |
+ |
|
1841 |
+TURKTRUST Certificate Services Provider Root 1 |
|
1842 |
+============================================== |
|
1843 |
+-----BEGIN CERTIFICATE----- |
|
1844 |
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF |
|
1845 |
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP |
|
1846 |
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 |
|
1847 |
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx |
|
1848 |
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg |
|
1849 |
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB |
|
1850 |
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC |
|
1851 |
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC |
|
1852 |
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX |
|
1853 |
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i |
|
1854 |
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ |
|
1855 |
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 |
|
1856 |
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME |
|
1857 |
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 |
|
1858 |
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE |
|
1859 |
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy |
|
1860 |
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY |
|
1861 |
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H |
|
1862 |
+-----END CERTIFICATE----- |
|
1863 |
+ |
|
1864 |
+TURKTRUST Certificate Services Provider Root 2 |
|
1865 |
+============================================== |
|
1866 |
+-----BEGIN CERTIFICATE----- |
|
1867 |
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF |
|
1868 |
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP |
|
1869 |
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg |
|
1870 |
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN |
|
1871 |
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr |
|
1872 |
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G |
|
1873 |
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls |
|
1874 |
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G |
|
1875 |
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe |
|
1876 |
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI |
|
1877 |
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g |
|
1878 |
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr |
|
1879 |
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB |
|
1880 |
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G |
|
1881 |
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt |
|
1882 |
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 |
|
1883 |
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ |
|
1884 |
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P |
|
1885 |
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 |
|
1886 |
+UrbnBEI= |
|
1887 |
+-----END CERTIFICATE----- |
|
1888 |
+ |
|
1889 |
+SwissSign Platinum CA - G2 |
|
1890 |
+========================== |
|
1891 |
+-----BEGIN CERTIFICATE----- |
|
1892 |
+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 |
|
1918 |
+-----END CERTIFICATE----- |
|
1919 |
+ |
|
1920 |
+SwissSign Gold CA - G2 |
|
1921 |
+====================== |
|
1922 |
+-----BEGIN CERTIFICATE----- |
|
1923 |
+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 |
|
1949 |
+-----END CERTIFICATE----- |
|
1950 |
+ |
|
1951 |
+SwissSign Silver CA - G2 |
|
1952 |
+======================== |
|
1953 |
+-----BEGIN CERTIFICATE----- |
|
1954 |
+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 |
|
1980 |
+-----END CERTIFICATE----- |
|
1981 |
+ |
|
1982 |
+GeoTrust Primary Certification Authority |
|
1983 |
+======================================== |
|
1984 |
+-----BEGIN CERTIFICATE----- |
|
1985 |
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG |
|
1986 |
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD |
|
1987 |
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx |
|
1988 |
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ |
|
1989 |
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB |
|
1990 |
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN |
|
1991 |
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 |
|
1992 |
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge |
|
1993 |
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt |
|
1994 |
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD |
|
1995 |
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI |
|
1996 |
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K |
|
1997 |
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN |
|
1998 |
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa |
|
1999 |
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG |
|
2000 |
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= |
|
2001 |
+-----END CERTIFICATE----- |
|
2002 |
+ |
|
2003 |
+thawte Primary Root CA |
|
2004 |
+====================== |
|
2005 |
+-----BEGIN CERTIFICATE----- |
|
2006 |
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE |
|
2007 |
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 |
|
2008 |
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv |
|
2009 |
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 |
|
2010 |
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg |
|
2011 |
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv |
|
2012 |
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT |
|
2013 |
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs |
|
2014 |
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ |
|
2015 |
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc |
|
2016 |
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K |
|
2017 |
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p |
|
2018 |
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD |
|
2019 |
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF |
|
2020 |
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE |
|
2021 |
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX |
|
2022 |
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 |
|
2023 |
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH |
|
2024 |
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== |
|
2025 |
+-----END CERTIFICATE----- |
|
2026 |
+ |
|
2027 |
+VeriSign Class 3 Public Primary Certification Authority - G5 |
|
2028 |
+============================================================ |
|
2029 |
+-----BEGIN CERTIFICATE----- |
|
2030 |
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE |
|
2031 |
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO |
|
2032 |
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk |
|
2033 |
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp |
|
2034 |
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB |
|
2035 |
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln |
|
2036 |
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh |
|
2037 |
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt |
|
2038 |
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|
2039 |
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz |
|
2040 |
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD |
|
2041 |
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ |
|
2042 |
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r |
|
2043 |
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ |
|
2044 |
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv |
|
2045 |
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy |
|
2046 |
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG |
|
2047 |
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ |
|
2048 |
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE |
|
2049 |
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC |
|
2050 |
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE |
|
2051 |
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq |
|
2052 |
+-----END CERTIFICATE----- |
|
2053 |
+ |
|
2054 |
+SecureTrust CA |
|
2055 |
+============== |
|
2056 |
+-----BEGIN CERTIFICATE----- |
|
2057 |
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG |
|
2058 |
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy |
|
2059 |
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe |
|
2060 |
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC |
|
2061 |
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX |
|
2062 |
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t |
|
2063 |
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH |
|
2064 |
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b |
|
2065 |
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH |
|
2066 |
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ |
|
2067 |
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj |
|
2068 |
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ |
|
2069 |
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu |
|
2070 |
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf |
|
2071 |
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ |
|
2072 |
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR |
|
2073 |
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= |
|
2074 |
+-----END CERTIFICATE----- |
|
2075 |
+ |
|
2076 |
+Secure Global CA |
|
2077 |
+================ |
|
2078 |
+-----BEGIN CERTIFICATE----- |
|
2079 |
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG |
|
2080 |
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH |
|
2081 |
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg |
|
2082 |
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg |
|
2083 |
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx |
|
2084 |
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ |
|
2085 |
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g |
|
2086 |
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV |
|
2087 |
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi |
|
2088 |
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud |
|
2089 |
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn |
|
2090 |
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA |
|
2091 |
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ |
|
2092 |
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn |
|
2093 |
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 |
|
2094 |
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc |
|
2095 |
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW |
|
2096 |
+-----END CERTIFICATE----- |
|
2097 |
+ |
|
2098 |
+COMODO Certification Authority |
|
2099 |
+============================== |
|
2100 |
+-----BEGIN CERTIFICATE----- |
|
2101 |
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE |
|
2102 |
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG |
|
2103 |
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 |
|
2104 |
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb |
|
2105 |
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD |
|
2106 |
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 |
|
2107 |
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH |
|
2108 |
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww |
|
2109 |
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV |
|
2110 |
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA |
|
2111 |
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI |
|
2112 |
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E |
|
2113 |
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k |
|
2114 |
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC |
|
2115 |
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP |
|
2116 |
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ |
|
2117 |
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc |
|
2118 |
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN |
|
2119 |
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== |
|
2120 |
+-----END CERTIFICATE----- |
|
2121 |
+ |
|
2122 |
+Network Solutions Certificate Authority |
|
2123 |
+======================================= |
|
2124 |
+-----BEGIN CERTIFICATE----- |
|
2125 |
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG |
|
2126 |
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr |
|
2127 |
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx |
|
2128 |
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu |
|
2129 |
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G |
|
2130 |
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx |
|
2131 |
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT |
|
2132 |
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT |
|
2133 |
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc |
|
2134 |
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB |
|
2135 |
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP |
|
2136 |
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv |
|
2137 |
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA |
|
2138 |
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q |
|
2139 |
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ |
|
2140 |
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv |
|
2141 |
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD |
|
2142 |
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey |
|
2143 |
+-----END CERTIFICATE----- |
|
2144 |
+ |
|
2145 |
+WellsSecure Public Root Certificate Authority |
|
2146 |
+============================================= |
|
2147 |
+-----BEGIN CERTIFICATE----- |
|
2148 |
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM |
|
2149 |
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw |
|
2150 |
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN |
|
2151 |
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl |
|
2152 |
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD |
|
2153 |
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G |
|
2154 |
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 |
|
2155 |
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 |
|
2156 |
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 |
|
2157 |
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB |
|
2158 |
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB |
|
2159 |
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu |
|
2160 |
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm |
|
2161 |
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB |
|
2162 |
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww |
|
2163 |
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg |
|
2164 |
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI |
|
2165 |
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 |
|
2166 |
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj |
|
2167 |
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es |
|
2168 |
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ |
|
2169 |
+tylv2G0xffX8oRAHh84vWdw+WNs= |
|
2170 |
+-----END CERTIFICATE----- |
|
2171 |
+ |
|
2172 |
+COMODO ECC Certification Authority |
|
2173 |
+================================== |
|
2174 |
+-----BEGIN CERTIFICATE----- |
|
2175 |
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC |
|
2176 |
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE |
|
2177 |
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB |
|
2178 |
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix |
|
2179 |
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR |
|
2180 |
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo |
|
2181 |
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X |
|
2182 |
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni |
|
2183 |
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E |
|
2184 |
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG |
|
2185 |
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA |
|
2186 |
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= |
|
2187 |
+-----END CERTIFICATE----- |
|
2188 |
+ |
|
2189 |
+IGC/A |
|
2190 |
+===== |
|
2191 |
+-----BEGIN CERTIFICATE----- |
|
2192 |
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD |
|
2193 |
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE |
|
2194 |
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy |
|
2195 |
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI |
|
2196 |
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT |
|
2197 |
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB |
|
2198 |
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 |
|
2199 |
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW |
|
2200 |
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy |
|
2201 |
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd |
|
2202 |
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ |
|
2203 |
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB |
|
2204 |
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC |
|
2205 |
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK |
|
2206 |
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q |
|
2207 |
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg |
|
2208 |
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI |
|
2209 |
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF |
|
2210 |
+0mBWWg== |
|
2211 |
+-----END CERTIFICATE----- |
|
2212 |
+ |
|
2213 |
+Security Communication EV RootCA1 |
|
2214 |
+================================= |
|
2215 |
+-----BEGIN CERTIFICATE----- |
|
2216 |
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc |
|
2217 |
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh |
|
2218 |
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE |
|
2219 |
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl |
|
2220 |
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC |
|
2221 |
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO |
|
2222 |
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX |
|
2223 |
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z |
|
2224 |
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 |
|
2225 |
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK |
|
2226 |
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG |
|
2227 |
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm |
|
2228 |
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG |
|
2229 |
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW |
|
2230 |
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW |
|
2231 |
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 |
|
2232 |
+-----END CERTIFICATE----- |
|
2233 |
+ |
|
2234 |
+OISTE WISeKey Global Root GA CA |
|
2235 |
+=============================== |
|
2236 |
+-----BEGIN CERTIFICATE----- |
|
2237 |
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE |
|
2238 |
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG |
|
2239 |
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH |
|
2240 |
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD |
|
2241 |
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw |
|
2242 |
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 |
|
2243 |
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 |
|
2244 |
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg |
|
2245 |
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD |
|
2246 |
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ |
|
2247 |
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R |
|
2248 |
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw |
|
2249 |
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ |
|
2250 |
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm |
|
2251 |
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 |
|
2252 |
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa |
|
2253 |
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY |
|
2254 |
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= |
|
2255 |
+-----END CERTIFICATE----- |
|
2256 |
+ |
|
2257 |
+S-TRUST Authentication and Encryption Root CA 2005 PN |
|
2258 |
+===================================================== |
|
2259 |
+-----BEGIN CERTIFICATE----- |
|
2260 |
+MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE |
|
2261 |
+BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh |
|
2262 |
+cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT |
|
2263 |
+LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w |
|
2264 |
+NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk |
|
2265 |
+ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj |
|
2266 |
+aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp |
|
2267 |
+b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A |
|
2268 |
+MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob |
|
2269 |
+4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL |
|
2270 |
+g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf |
|
2271 |
+eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 |
|
2272 |
+KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB |
|
2273 |
+/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv |
|
2274 |
+bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU |
|
2275 |
+D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD |
|
2276 |
+pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 |
|
2277 |
+P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA |
|
2278 |
+nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit |
|
2279 |
+F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b |
|
2280 |
+Hz2eBIPdltkdOpQ= |
|
2281 |
+-----END CERTIFICATE----- |
|
2282 |
+ |
|
2283 |
+Microsec e-Szigno Root CA |
|
2284 |
+========================= |
|
2285 |
+-----BEGIN CERTIFICATE----- |
|
2286 |
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE |
|
2287 |
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL |
|
2288 |
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 |
|
2289 |
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz |
|
2290 |
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT |
|
2291 |
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB |
|
2292 |
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG |
|
2293 |
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N |
|
2294 |
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc |
|
2295 |
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ |
|
2296 |
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb |
|
2297 |
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG |
|
2298 |
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD |
|
2299 |
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 |
|
2300 |
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A |
|
2301 |
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn |
|
2302 |
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA |
|
2303 |
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg |
|
2304 |
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA |
|
2305 |
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 |
|
2306 |
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO |
|
2307 |
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv |
|
2308 |
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h |
|
2309 |
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw |
|
2310 |
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT |
|
2311 |
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV |
|
2312 |
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER |
|
2313 |
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp |
|
2314 |
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal |
|
2315 |
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT |
|
2316 |
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE |
|
2317 |
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a |
|
2318 |
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK |
|
2319 |
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB |
|
2320 |
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= |
|
2321 |
+-----END CERTIFICATE----- |
|
2322 |
+ |
|
2323 |
+Certigna |
|
2324 |
+======== |
|
2325 |
+-----BEGIN CERTIFICATE----- |
|
2326 |
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw |
|
2327 |
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 |
|
2328 |
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI |
|
2329 |
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q |
|
2330 |
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH |
|
2331 |
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p |
|
2332 |
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg |
|
2333 |
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf |
|
2334 |
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ |
|
2335 |
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ |
|
2336 |
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J |
|
2337 |
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA |
|
2338 |
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ |
|
2339 |
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu |
|
2340 |
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY |
|
2341 |
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw |
|
2342 |
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== |
|
2343 |
+-----END CERTIFICATE----- |
|
2344 |
+ |
|
2345 |
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. |
|
2346 |
+====================================== |
|
2347 |
+-----BEGIN CERTIFICATE----- |
|
2348 |
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT |
|
2349 |
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg |
|
2350 |
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w |
|
2351 |
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ |
|
2352 |
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh |
|
2353 |
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B |
|
2354 |
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN |
|
2355 |
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU |
|
2356 |
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 |
|
2357 |
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP |
|
2358 |
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm |
|
2359 |
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf |
|
2360 |
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa |
|
2361 |
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK |
|
2362 |
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b |
|
2363 |
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE |
|
2364 |
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g |
|
2365 |
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF |
|
2366 |
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug |
|
2367 |
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf |
|
2368 |
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX |
|
2369 |
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v |
|
2370 |
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 |
|
2371 |
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 |
|
2372 |
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk |
|
2373 |
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f |
|
2374 |
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h |
|
2375 |
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU |
|
2376 |
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== |
|
2377 |
+-----END CERTIFICATE----- |
|
2378 |
+ |
|
2379 |
+TC TrustCenter Class 2 CA II |
|
2380 |
+============================ |
|
2381 |
+-----BEGIN CERTIFICATE----- |
|
2382 |
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC |
|
2383 |
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy |
|
2384 |
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw |
|
2385 |
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 |
|
2386 |
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE |
|
2387 |
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC |
|
2388 |
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw |
|
2389 |
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 |
|
2390 |
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ |
|
2391 |
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u |
|
2392 |
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB |
|
2393 |
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB |
|
2394 |
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 |
|
2395 |
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU |
|
2396 |
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i |
|
2397 |
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u |
|
2398 |
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G |
|
2399 |
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ |
|
2400 |
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj |
|
2401 |
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP |
|
2402 |
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk |
|
2403 |
+vQ== |
|
2404 |
+-----END CERTIFICATE----- |
|
2405 |
+ |
|
2406 |
+TC TrustCenter Class 3 CA II |
|
2407 |
+============================ |
|
2408 |
+-----BEGIN CERTIFICATE----- |
|
2409 |
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC |
|
2410 |
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy |
|
2411 |
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw |
|
2412 |
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 |
|
2413 |
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE |
|
2414 |
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC |
|
2415 |
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W |
|
2416 |
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo |
|
2417 |
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ |
|
2418 |
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk |
|
2419 |
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB |
|
2420 |
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB |
|
2421 |
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 |
|
2422 |
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU |
|
2423 |
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i |
|
2424 |
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u |
|
2425 |
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE |
|
2426 |
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 |
|
2427 |
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 |
|
2428 |
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal |
|
2429 |
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc |
|
2430 |
+5A== |
|
2431 |
+-----END CERTIFICATE----- |
|
2432 |
+ |
|
2433 |
+TC TrustCenter Universal CA I |
|
2434 |
+============================= |
|
2435 |
+-----BEGIN CERTIFICATE----- |
|
2436 |
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC |
|
2437 |
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy |
|
2438 |
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN |
|
2439 |
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg |
|
2440 |
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw |
|
2441 |
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD |
|
2442 |
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC |
|
2443 |
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv |
|
2444 |
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw |
|
2445 |
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O |
|
2446 |
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j |
|
2447 |
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC |
|
2448 |
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG |
|
2449 |
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy |
|
2450 |
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 |
|
2451 |
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT |
|
2452 |
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a |
|
2453 |
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY |
|
2454 |
+-----END CERTIFICATE----- |
|
2455 |
+ |
|
2456 |
+Deutsche Telekom Root CA 2 |
|
2457 |
+========================== |
|
2458 |
+-----BEGIN CERTIFICATE----- |
|
2459 |
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT |
|
2460 |
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG |
|
2461 |
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 |
|
2462 |
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G |
|
2463 |
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS |
|
2464 |
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 |
|
2465 |
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI |
|
2466 |
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY |
|
2467 |
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK |
|
2468 |
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV |
|
2469 |
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV |
|
2470 |
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr |
|
2471 |
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy |
|
2472 |
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 |
|
2473 |
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G |
|
2474 |
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU |
|
2475 |
+Cm26OWMohpLzGITY+9HPBVZkVw== |
|
2476 |
+-----END CERTIFICATE----- |
|
2477 |
+ |
|
2478 |
+ComSign CA |
|
2479 |
+========== |
|
2480 |
+-----BEGIN CERTIFICATE----- |
|
2481 |
+MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD |
|
2482 |
+EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy |
|
2483 |
+MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp |
|
2484 |
+Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q |
|
2485 |
+ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy |
|
2486 |
+P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN |
|
2487 |
+GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk |
|
2488 |
+YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM |
|
2489 |
+rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy |
|
2490 |
+oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P |
|
2491 |
+AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ |
|
2492 |
+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 |
|
2493 |
+QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI |
|
2494 |
+mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb |
|
2495 |
+/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG |
|
2496 |
+zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U |
|
2497 |
+AGegcQCCSA== |
|
2498 |
+-----END CERTIFICATE----- |
|
2499 |
+ |
|
2500 |
+ComSign Secured CA |
|
2501 |
+================== |
|
2502 |
+-----BEGIN CERTIFICATE----- |
|
2503 |
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE |
|
2504 |
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w |
|
2505 |
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD |
|
2506 |
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|
2507 |
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs |
|
2508 |
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH |
|
2509 |
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB |
|
2510 |
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 |
|
2511 |
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw |
|
2512 |
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t |
|
2513 |
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA |
|
2514 |
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC |
|
2515 |
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a |
|
2516 |
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp |
|
2517 |
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP |
|
2518 |
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz |
|
2519 |
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== |
|
2520 |
+-----END CERTIFICATE----- |
|
2521 |
+ |
|
2522 |
+Cybertrust Global Root |
|
2523 |
+====================== |
|
2524 |
+-----BEGIN CERTIFICATE----- |
|
2525 |
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li |
|
2526 |
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 |
|
2527 |
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD |
|
2528 |
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA |
|
2529 |
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW |
|
2530 |
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL |
|
2531 |
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin |
|
2532 |
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT |
|
2533 |
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP |
|
2534 |
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 |
|
2535 |
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G |
|
2536 |
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO |
|
2537 |
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi |
|
2538 |
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 |
|
2539 |
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T |
|
2540 |
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW |
|
2541 |
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V |
|
2542 |
+-----END CERTIFICATE----- |
|
2543 |
+ |
|
2544 |
+ePKI Root Certification Authority |
|
2545 |
+================================= |
|
2546 |
+-----BEGIN CERTIFICATE----- |
|
2547 |
+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 |
|
2573 |
+-----END CERTIFICATE----- |
|
2574 |
+ |
|
2575 |
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 |
|
2576 |
+============================================================================================================================= |
|
2577 |
+-----BEGIN CERTIFICATE----- |
|
2578 |
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH |
|
2579 |
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q |
|
2580 |
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry |
|
2581 |
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV |
|
2582 |
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg |
|
2583 |
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 |
|
2584 |
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl |
|
2585 |
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF |
|
2586 |
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl |
|
2587 |
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft |
|
2588 |
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl |
|
2589 |
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B |
|
2590 |
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO |
|
2591 |
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 |
|
2592 |
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR |
|
2593 |
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL |
|
2594 |
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd |
|
2595 |
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF |
|
2596 |
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 |
|
2597 |
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT |
|
2598 |
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh |
|
2599 |
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M |
|
2600 |
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= |
|
2601 |
+-----END CERTIFICATE----- |
|
2602 |
+ |
|
2603 |
+Buypass Class 2 CA 1 |
|
2604 |
+==================== |
|
2605 |
+-----BEGIN CERTIFICATE----- |
|
2606 |
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU |
|
2607 |
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 |
|
2608 |
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh |
|
2609 |
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI |
|
2610 |
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M |
|
2611 |
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 |
|
2612 |
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 |
|
2613 |
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R |
|
2614 |
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC |
|
2615 |
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P |
|
2616 |
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV |
|
2617 |
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt |
|
2618 |
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 |
|
2619 |
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w |
|
2620 |
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho |
|
2621 |
+-----END CERTIFICATE----- |
|
2622 |
+ |
|
2623 |
+Buypass Class 3 CA 1 |
|
2624 |
+==================== |
|
2625 |
+-----BEGIN CERTIFICATE----- |
|
2626 |
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU |
|
2627 |
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 |
|
2628 |
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh |
|
2629 |
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI |
|
2630 |
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx |
|
2631 |
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 |
|
2632 |
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia |
|
2633 |
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c |
|
2634 |
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC |
|
2635 |
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P |
|
2636 |
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 |
|
2637 |
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA |
|
2638 |
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 |
|
2639 |
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj |
|
2640 |
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 |
|
2641 |
+-----END CERTIFICATE----- |
|
2642 |
+ |
|
2643 |
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 |
|
2644 |
+========================================================================== |
|
2645 |
+-----BEGIN CERTIFICATE----- |
|
2646 |
+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 |
|
2673 |
+-----END CERTIFICATE----- |
|
2674 |
+ |
|
2675 |
+certSIGN ROOT CA |
|
2676 |
+================ |
|
2677 |
+-----BEGIN CERTIFICATE----- |
|
2678 |
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD |
|
2679 |
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa |
|
2680 |
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE |
|
2681 |
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I |
|
2682 |
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH |
|
2683 |
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 |
|
2684 |
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD |
|
2685 |
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 |
|
2686 |
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B |
|
2687 |
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB |
|
2688 |
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 |
|
2689 |
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 |
|
2690 |
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt |
|
2691 |
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz |
|
2692 |
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD |
|
2693 |
+-----END CERTIFICATE----- |
|
2694 |
+ |
|
2695 |
+CNNIC ROOT |
|
2696 |
+========== |
|
2697 |
+-----BEGIN CERTIFICATE----- |
|
2698 |
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE |
|
2699 |
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw |
|
2700 |
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw |
|
2701 |
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD |
|
2702 |
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz |
|
2703 |
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT |
|
2704 |
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or |
|
2705 |
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK |
|
2706 |
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC |
|
2707 |
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S |
|
2708 |
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 |
|
2709 |
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM |
|
2710 |
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 |
|
2711 |
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 |
|
2712 |
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m |
|
2713 |
+mxE= |
|
2714 |
+-----END CERTIFICATE----- |
|
2715 |
+ |
|
2716 |
+ApplicationCA - Japanese Government |
|
2717 |
+=================================== |
|
2718 |
+-----BEGIN CERTIFICATE----- |
|
2719 |
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT |
|
2720 |
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw |
|
2721 |
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl |
|
2722 |
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB |
|
2723 |
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 |
|
2724 |
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN |
|
2725 |
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE |
|
2726 |
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu |
|
2727 |
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU |
|
2728 |
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV |
|
2729 |
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD |
|
2730 |
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs |
|
2731 |
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g |
|
2732 |
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD |
|
2733 |
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW |
|
2734 |
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL |
|
2735 |
+rosot4LKGAfmt1t06SAZf7IbiVQ= |
|
2736 |
+-----END CERTIFICATE----- |
|
2737 |
+ |
|
2738 |
+GeoTrust Primary Certification Authority - G3 |
|
2739 |
+============================================= |
|
2740 |
+-----BEGIN CERTIFICATE----- |
|
2741 |
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE |
|
2742 |
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 |
|
2743 |
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy |
|
2744 |
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz |
|
2745 |
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo |
|
2746 |
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT |
|
2747 |
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI |
|
2748 |
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j |
|
2749 |
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE |
|
2750 |
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C |
|
2751 |
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu |
|
2752 |
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC |
|
2753 |
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr |
|
2754 |
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 |
|
2755 |
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE |
|
2756 |
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD |
|
2757 |
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s |
|
2758 |
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt |
|
2759 |
+-----END CERTIFICATE----- |
|
2760 |
+ |
|
2761 |
+thawte Primary Root CA - G2 |
|
2762 |
+=========================== |
|
2763 |
+-----BEGIN CERTIFICATE----- |
|
2764 |
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC |
|
2765 |
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu |
|
2766 |
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg |
|
2767 |
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV |
|
2768 |
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG |
|
2769 |
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt |
|
2770 |
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS |
|
2771 |
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 |
|
2772 |
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU |
|
2773 |
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN |
|
2774 |
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K |
|
2775 |
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== |
|
2776 |
+-----END CERTIFICATE----- |
|
2777 |
+ |
|
2778 |
+thawte Primary Root CA - G3 |
|
2779 |
+=========================== |
|
2780 |
+-----BEGIN CERTIFICATE----- |
|
2781 |
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE |
|
2782 |
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 |
|
2783 |
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv |
|
2784 |
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w |
|
2785 |
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh |
|
2786 |
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD |
|
2787 |
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG |
|
2788 |
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A |
|
2789 |
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At |
|
2790 |
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC |
|
2791 |
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY |
|
2792 |
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW |
|
2793 |
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E |
|
2794 |
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ |
|
2795 |
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK |
|
2796 |
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu |
|
2797 |
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC |
|
2798 |
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm |
|
2799 |
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= |
|
2800 |
+-----END CERTIFICATE----- |
|
2801 |
+ |
|
2802 |
+GeoTrust Primary Certification Authority - G2 |
|
2803 |
+============================================= |
|
2804 |
+-----BEGIN CERTIFICATE----- |
|
2805 |
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC |
|
2806 |
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu |
|
2807 |
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD |
|
2808 |
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 |
|
2809 |
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg |
|
2810 |
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl |
|
2811 |
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG |
|
2812 |
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc |
|
2813 |
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD |
|
2814 |
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ |
|
2815 |
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m |
|
2816 |
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 |
|
2817 |
+npaqBA+K |
|
2818 |
+-----END CERTIFICATE----- |
|
2819 |
+ |
|
2820 |
+VeriSign Universal Root Certification Authority |
|
2821 |
+=============================================== |
|
2822 |
+-----BEGIN CERTIFICATE----- |
|
2823 |
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE |
|
2824 |
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO |
|
2825 |
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk |
|
2826 |
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u |
|
2827 |
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV |
|
2828 |
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv |
|
2829 |
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl |
|
2830 |
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 |
|
2831 |
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj |
|
2832 |
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP |
|
2833 |
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 |
|
2834 |
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I |
|
2835 |
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR |
|
2836 |
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G |
|
2837 |
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O |
|
2838 |
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud |
|
2839 |
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 |
|
2840 |
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx |
|
2841 |
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx |
|
2842 |
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P |
|
2843 |
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 |
|
2844 |
+mJO37M2CYfE45k+XmCpajQ== |
|
2845 |
+-----END CERTIFICATE----- |
|
2846 |
+ |
|
2847 |
+VeriSign Class 3 Public Primary Certification Authority - G4 |
|
2848 |
+============================================================ |
|
2849 |
+-----BEGIN CERTIFICATE----- |
|
2850 |
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC |
|
2851 |
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 |
|
2852 |
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz |
|
2853 |
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj |
|
2854 |
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL |
|
2855 |
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU |
|
2856 |
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo |
|
2857 |
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 |
|
2858 |
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 |
|
2859 |
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz |
|
2860 |
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB |
|
2861 |
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw |
|
2862 |
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u |
|
2863 |
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD |
|
2864 |
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx |
|
2865 |
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== |
|
2866 |
+-----END CERTIFICATE----- |
|
2867 |
+ |
|
2868 |
+NetLock Arany (Class Gold) FÅ‘tanúsÃtvány |
|
2869 |
+============================================ |
|
2870 |
+-----BEGIN CERTIFICATE----- |
|
2871 |
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G |
|
2872 |
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 |
|
2873 |
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB |
|
2874 |
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx |
|
2875 |
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO |
|
2876 |
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv |
|
2877 |
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 |
|
2878 |
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu |
|
2879 |
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw |
|
2880 |
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk |
|
2881 |
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw |
|
2882 |
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 |
|
2883 |
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB |
|
2884 |
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW |
|
2885 |
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta |
|
2886 |
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC |
|
2887 |
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna |
|
2888 |
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu |
|
2889 |
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= |
|
2890 |
+-----END CERTIFICATE----- |
|
2891 |
+ |
|
2892 |
+Staat der Nederlanden Root CA - G2 |
|
2893 |
+================================== |
|
2894 |
+-----BEGIN CERTIFICATE----- |
|
2895 |
+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 |
|
2921 |
+66+KAQ== |
|
2922 |
+-----END CERTIFICATE----- |
|
2923 |
+ |
|
2924 |
+CA Disig |
|
2925 |
+======== |
|
2926 |
+-----BEGIN CERTIFICATE----- |
|
2927 |
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK |
|
2928 |
+QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw |
|
2929 |
+MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz |
|
2930 |
+bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 |
|
2931 |
+DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm |
|
2932 |
+GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD |
|
2933 |
+Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo |
|
2934 |
+hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt |
|
2935 |
+ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w |
|
2936 |
+gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P |
|
2937 |
+AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz |
|
2938 |
+aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff |
|
2939 |
+ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa |
|
2940 |
+BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t |
|
2941 |
+WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 |
|
2942 |
+mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ |
|
2943 |
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K |
|
2944 |
+ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA |
|
2945 |
+4Z7CRneC9VkGjCFMhwnN5ag= |
|
2946 |
+-----END CERTIFICATE----- |
|
2947 |
+ |
|
2948 |
+Juur-SK |
|
2949 |
+======= |
|
2950 |
+-----BEGIN CERTIFICATE----- |
|
2951 |
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA |
|
2952 |
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw |
|
2953 |
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG |
|
2954 |
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy |
|
2955 |
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
|
2956 |
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf |
|
2957 |
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC |
|
2958 |
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw |
|
2959 |
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa |
|
2960 |
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF |
|
2961 |
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD |
|
2962 |
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh |
|
2963 |
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA |
|
2964 |
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr |
|
2965 |
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw |
|
2966 |
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE |
|
2967 |
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G |
|
2968 |
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo |
|
2969 |
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL |
|
2970 |
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 |
|
2971 |
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh |
|
2972 |
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 |
|
2973 |
+yyqcjg== |
|
2974 |
+-----END CERTIFICATE----- |
|
2975 |
+ |
|
2976 |
+Hongkong Post Root CA 1 |
|
2977 |
+======================= |
|
2978 |
+-----BEGIN CERTIFICATE----- |
|
2979 |
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT |
|
2980 |
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx |
|
2981 |
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n |
|
2982 |
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF |
|
2983 |
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 |
|
2984 |
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr |
|
2985 |
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh |
|
2986 |
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY |
|
2987 |
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV |
|
2988 |
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i |
|
2989 |
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio |
|
2990 |
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei |
|
2991 |
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps |
|
2992 |
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT |
|
2993 |
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== |
|
2994 |
+-----END CERTIFICATE----- |
|
2995 |
+ |
|
2996 |
+SecureSign RootCA11 |
|
2997 |
+=================== |
|
2998 |
+-----BEGIN CERTIFICATE----- |
|
2999 |
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi |
|
3000 |
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS |
|
3001 |
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw |
|
3002 |
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 |
|
3003 |
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL |
|
3004 |
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO |
|
3005 |
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq |
|
3006 |
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP |
|
3007 |
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA |
|
3008 |
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX |
|
3009 |
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh |
|
3010 |
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r |
|
3011 |
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ |
|
3012 |
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 |
|
3013 |
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 |
|
3014 |
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= |
|
3015 |
+-----END CERTIFICATE----- |
|
3016 |
+ |
|
3017 |
+ACEDICOM Root |
|
3018 |
+============= |
|
3019 |
+-----BEGIN CERTIFICATE----- |
|
3020 |
+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 |
|
3046 |
+-----END CERTIFICATE----- |
|
3047 |
+ |
|
3048 |
+Verisign Class 1 Public Primary Certification Authority |
|
3049 |
+======================================================= |
|
3050 |
+-----BEGIN CERTIFICATE----- |
|
3051 |
+MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx |
|
3052 |
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 |
|
3053 |
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow |
|
3054 |
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx |
|
3055 |
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA |
|
3056 |
+A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ |
|
3057 |
+VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 |
|
3058 |
+yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa |
|
3059 |
+XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n |
|
3060 |
+0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ |
|
3061 |
+RjXZ+Hxb |
|
3062 |
+-----END CERTIFICATE----- |
|
3063 |
+ |
|
3064 |
+Verisign Class 3 Public Primary Certification Authority |
|
3065 |
+======================================================= |
|
3066 |
+-----BEGIN CERTIFICATE----- |
|
3067 |
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx |
|
3068 |
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 |
|
3069 |
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow |
|
3070 |
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz |
|
3071 |
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA |
|
3072 |
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 |
|
3073 |
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol |
|
3074 |
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky |
|
3075 |
+CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX |
|
3076 |
+bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ |
|
3077 |
+D/xwzoiQ |
|
3078 |
+-----END CERTIFICATE----- |
|
3079 |
+ |
|
3080 |
+Microsec e-Szigno Root CA 2009 |
|
3081 |
+============================== |
|
3082 |
+-----BEGIN CERTIFICATE----- |
|
3083 |
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER |
|
3084 |
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv |
|
3085 |
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o |
|
3086 |
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE |
|
3087 |
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt |
|
3088 |
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw |
|
3089 |
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA |
|
3090 |
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG |
|
3091 |
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA |
|
3092 |
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm |
|
3093 |
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC |
|
3094 |
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf |
|
3095 |
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE |
|
3096 |
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o |
|
3097 |
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX |
|
3098 |
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 |
|
3099 |
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 |
|
3100 |
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi |
|
3101 |
+LXpUq3DDfSJlgnCW |
|
3102 |
+-----END CERTIFICATE----- |
|
3103 |
+ |
|
3104 |
+E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi |
|
3105 |
+=================================================== |
|
3106 |
+-----BEGIN CERTIFICATE----- |
|
3107 |
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG |
|
3108 |
+EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz |
|
3109 |
+ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 |
|
3110 |
+MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 |
|
3111 |
+cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u |
|
3112 |
+aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC |
|
3113 |
+AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY |
|
3114 |
+8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y |
|
3115 |
+jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI |
|
3116 |
+JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk |
|
3117 |
+9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD |
|
3118 |
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG |
|
3119 |
+SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d |
|
3120 |
+F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq |
|
3121 |
+D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 |
|
3122 |
+Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq |
|
3123 |
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX |
|
3124 |
+-----END CERTIFICATE----- |
|
3125 |
+ |
|
3126 |
+GlobalSign Root CA - R3 |
|
3127 |
+======================= |
|
3128 |
+-----BEGIN CERTIFICATE----- |
|
3129 |
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv |
|
3130 |
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh |
|
3131 |
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT |
|
3132 |
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln |
|
3133 |
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt |
|
3134 |
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ |
|
3135 |
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 |
|
3136 |
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl |
|
3137 |
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 |
|
3138 |
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE |
|
3139 |
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 |
|
3140 |
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 |
|
3141 |
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E |
|
3142 |
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 |
|
3143 |
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r |
|
3144 |
+kpeDMdmztcpHWD9f |
|
3145 |
+-----END CERTIFICATE----- |
|
3146 |
+ |
|
3147 |
+TC TrustCenter Universal CA III |
|
3148 |
+=============================== |
|
3149 |
+-----BEGIN CERTIFICATE----- |
|
3150 |
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC |
|
3151 |
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy |
|
3152 |
+IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe |
|
3153 |
+Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU |
|
3154 |
+QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex |
|
3155 |
+KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB |
|
3156 |
+AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt |
|
3157 |
+QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO |
|
3158 |
+juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut |
|
3159 |
+CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 |
|
3160 |
+M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G |
|
3161 |
+A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ |
|
3162 |
+BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA |
|
3163 |
+g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ |
|
3164 |
+KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK |
|
3165 |
+BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV |
|
3166 |
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq |
|
3167 |
+woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== |
|
3168 |
+-----END CERTIFICATE----- |
|
3169 |
+ |
|
3170 |
+Autoridad de Certificacion Firmaprofesional CIF A62634068 |
|
3171 |
+========================================================= |
|
3172 |
+-----BEGIN CERTIFICATE----- |
|
3173 |
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA |
|
3174 |
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 |
|
3175 |
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw |
|
3176 |
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB |
|
3177 |
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD |
|
3178 |
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P |
|
3179 |
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY |
|
3180 |
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH |
|
3181 |
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI |
|
3182 |
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX |
|
3183 |
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX |
|
3184 |
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK |
|
3185 |
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU |
|
3186 |
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud |
|
3187 |
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH |
|
3188 |
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp |
|
3189 |
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA |
|
3190 |
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx |
|
3191 |
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx |
|
3192 |
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk |
|
3193 |
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP |
|
3194 |
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f |
|
3195 |
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl |
|
3196 |
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR |
|
3197 |
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR |
|
3198 |
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD |
|
3199 |
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi |
|
3200 |
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V |
|
3201 |
+-----END CERTIFICATE----- |
|
3202 |
+ |
|
3203 |
+Izenpe.com |
|
3204 |
+========== |
|
3205 |
+-----BEGIN CERTIFICATE----- |
|
3206 |
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG |
|
3207 |
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz |
|
3208 |
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu |
|
3209 |
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ |
|
3210 |
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK |
|
3211 |
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU |
|
3212 |
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC |
|
3213 |
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT |
|
3214 |
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK |
|
3215 |
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK |
|
3216 |
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ |
|
3217 |
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB |
|
3218 |
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID |
|
3219 |
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ |
|
3220 |
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG |
|
3221 |
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx |
|
3222 |
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O |
|
3223 |
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l |
|
3224 |
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga |
|
3225 |
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q |
|
3226 |
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs |
|
3227 |
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 |
|
3228 |
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 |
|
3229 |
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC |
|
3230 |
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo |
|
3231 |
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z |
|
3232 |
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== |
|
3233 |
+-----END CERTIFICATE----- |
|
3234 |
+ |
|
3235 |
+Chambers of Commerce Root - 2008 |
|
3236 |
+================================ |
|
3237 |
+-----BEGIN CERTIFICATE----- |
|
3238 |
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD |
|
3239 |
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv |
|
3240 |
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu |
|
3241 |
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy |
|
3242 |
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl |
|
3243 |
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF |
|
3244 |
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl |
|
3245 |
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC |
|
3246 |
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA |
|
3247 |
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj |
|
3248 |
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ |
|
3249 |
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk |
|
3250 |
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g |
|
3251 |
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 |
|
3252 |
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ |
|
3253 |
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj |
|
3254 |
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 |
|
3255 |
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI |
|
3256 |
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ |
|
3257 |
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh |
|
3258 |
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh |
|
3259 |
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC |
|
3260 |
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH |
|
3261 |
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 |
|
3262 |
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH |
|
3263 |
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU |
|
3264 |
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 |
|
3265 |
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 |
|
3266 |
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF |
|
3267 |
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK |
|
3268 |
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG |
|
3269 |
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg |
|
3270 |
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ |
|
3271 |
+-----END CERTIFICATE----- |
|
3272 |
+ |
|
3273 |
+Global Chambersign Root - 2008 |
|
3274 |
+============================== |
|
3275 |
+-----BEGIN CERTIFICATE----- |
|
3276 |
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD |
|
3277 |
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv |
|
3278 |
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu |
|
3279 |
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx |
|
3280 |
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg |
|
3281 |
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ |
|
3282 |
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD |
|
3283 |
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf |
|
3284 |
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf |
|
3285 |
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 |
|
3286 |
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB |
|
3287 |
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA |
|
3288 |
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M |
|
3289 |
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe |
|
3290 |
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF |
|
3291 |
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh |
|
3292 |
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB |
|
3293 |
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT |
|
3294 |
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE |
|
3295 |
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm |
|
3296 |
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm |
|
3297 |
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp |
|
3298 |
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 |
|
3299 |
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG |
|
3300 |
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 |
|
3301 |
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s |
|
3302 |
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg |
|
3303 |
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH |
|
3304 |
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du |
|
3305 |
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr |
|
3306 |
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq |
|
3307 |
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z |
|
3308 |
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B |
|
3309 |
+-----END CERTIFICATE----- |
|
3310 |
+ |
|
3311 |
+Go Daddy Root Certificate Authority - G2 |
|
3312 |
+======================================== |
|
3313 |
+-----BEGIN CERTIFICATE----- |
|
3314 |
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT |
|
3315 |
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu |
|
3316 |
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 |
|
3317 |
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 |
|
3318 |
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G |
|
3319 |
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI |
|
3320 |
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq |
|
3321 |
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD |
|
3322 |
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd |
|
3323 |
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl |
|
3324 |
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC |
|
3325 |
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 |
|
3326 |
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac |
|
3327 |
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r |
|
3328 |
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV |
|
3329 |
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO |
|
3330 |
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 |
|
3331 |
+-----END CERTIFICATE----- |
|
3332 |
+ |
|
3333 |
+Starfield Root Certificate Authority - G2 |
|
3334 |
+========================================= |
|
3335 |
+-----BEGIN CERTIFICATE----- |
|
3336 |
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT |
|
3337 |
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s |
|
3338 |
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 |
|
3339 |
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw |
|
3340 |
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg |
|
3341 |
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB |
|
3342 |
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv |
|
3343 |
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs |
|
3344 |
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk |
|
3345 |
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf |
|
3346 |
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU |
|
3347 |
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC |
|
3348 |
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol |
|
3349 |
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx |
|
3350 |
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw |
|
3351 |
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K |
|
3352 |
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ |
|
3353 |
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 |
|
3354 |
+-----END CERTIFICATE----- |
|
3355 |
+ |
|
3356 |
+Starfield Services Root Certificate Authority - G2 |
|
3357 |
+================================================== |
|
3358 |
+-----BEGIN CERTIFICATE----- |
|
3359 |
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT |
|
3360 |
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s |
|
3361 |
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl |
|
3362 |
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV |
|
3363 |
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT |
|
3364 |
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg |
|
3365 |
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC |
|
3366 |
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 |
|
3367 |
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa |
|
3368 |
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP |
|
3369 |
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB |
|
3370 |
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw |
|
3371 |
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG |
|
3372 |
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP |
|
3373 |
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy |
|
3374 |
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd |
|
3375 |
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza |
|
3376 |
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 |
|
3377 |
+-----END CERTIFICATE----- |
|
3378 |
+ |
|
3379 |
+AffirmTrust Commercial |
|
3380 |
+====================== |
|
3381 |
+-----BEGIN CERTIFICATE----- |
|
3382 |
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS |
|
3383 |
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw |
|
3384 |
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly |
|
3385 |
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF |
|
3386 |
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb |
|
3387 |
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV |
|
3388 |
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 |
|
3389 |
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww |
|
3390 |
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV |
|
3391 |
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC |
|
3392 |
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG |
|
3393 |
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi |
|
3394 |
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv |
|
3395 |
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh |
|
3396 |
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= |
|
3397 |
+-----END CERTIFICATE----- |
|
3398 |
+ |
|
3399 |
+AffirmTrust Networking |
|
3400 |
+====================== |
|
3401 |
+-----BEGIN CERTIFICATE----- |
|
3402 |
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS |
|
3403 |
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw |
|
3404 |
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly |
|
3405 |
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF |
|
3406 |
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE |
|
3407 |
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI |
|
3408 |
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 |
|
3409 |
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb |
|
3410 |
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV |
|
3411 |
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC |
|
3412 |
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu |
|
3413 |
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 |
|
3414 |
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 |
|
3415 |
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 |
|
3416 |
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= |
|
3417 |
+-----END CERTIFICATE----- |
|
3418 |
+ |
|
3419 |
+AffirmTrust Premium |
|
3420 |
+=================== |
|
3421 |
+-----BEGIN CERTIFICATE----- |
|
3422 |
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS |
|
3423 |
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy |
|
3424 |
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy |
|
3425 |
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A |
|
3426 |
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn |
|
3427 |
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV |
|
3428 |
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs |
|
3429 |
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd |
|
3430 |
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R |
|
3431 |
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI |
|
3432 |
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 |
|
3433 |
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 |
|
3434 |
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo |
|
3435 |
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB |
|
3436 |
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv |
|
3437 |
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg |
|
3438 |
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC |
|
3439 |
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S |
|
3440 |
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK |
|
3441 |
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV |
|
3442 |
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg |
|
3443 |
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 |
|
3444 |
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb |
|
3445 |
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== |
|
3446 |
+-----END CERTIFICATE----- |
|
3447 |
+ |
|
3448 |
+AffirmTrust Premium ECC |
|
3449 |
+======================= |
|
3450 |
+-----BEGIN CERTIFICATE----- |
|
3451 |
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV |
|
3452 |
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx |
|
3453 |
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U |
|
3454 |
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA |
|
3455 |
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ |
|
3456 |
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW |
|
3457 |
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK |
|
3458 |
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X |
|
3459 |
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM |
|
3460 |
+eQ== |
|
3461 |
+-----END CERTIFICATE----- |
|
3462 |
+ |
|
3463 |
+Certum Trusted Network CA |
|
3464 |
+========================= |
|
3465 |
+-----BEGIN CERTIFICATE----- |
|
3466 |
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK |
|
3467 |
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv |
|
3468 |
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy |
|
3469 |
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU |
|
3470 |
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 |
|
3471 |
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC |
|
3472 |
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC |
|
3473 |
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J |
|
3474 |
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 |
|
3475 |
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 |
|
3476 |
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB |
|
3477 |
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw |
|
3478 |
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj |
|
3479 |
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 |
|
3480 |
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj |
|
3481 |
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI |
|
3482 |
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= |
|
3483 |
+-----END CERTIFICATE----- |
|
3484 |
+ |
|
3485 |
+Certinomis - Autorité Racine |
|
3486 |
+============================= |
|
3487 |
+-----BEGIN CERTIFICATE----- |
|
3488 |
+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 |
|
3513 |
+vgt2Fl43N+bYdJeimUV5 |
|
3514 |
+-----END CERTIFICATE----- |
|
3515 |
+ |
|
3516 |
+Root CA Generalitat Valenciana |
|
3517 |
+============================== |
|
3518 |
+-----BEGIN CERTIFICATE----- |
|
3519 |
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE |
|
3520 |
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 |
|
3521 |
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 |
|
3522 |
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE |
|
3523 |
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G |
|
3524 |
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 |
|
3525 |
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B |
|
3526 |
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ |
|
3527 |
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte |
|
3528 |
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB |
|
3529 |
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n |
|
3530 |
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB |
|
3531 |
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl |
|
3532 |
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA |
|
3533 |
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy |
|
3534 |
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA |
|
3535 |
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt |
|
3536 |
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA |
|
3537 |
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu |
|
3538 |
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA |
|
3539 |
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 |
|
3540 |
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV |
|
3541 |
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G |
|
3542 |
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S |
|
3543 |
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh |
|
3544 |
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz |
|
3545 |
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 |
|
3546 |
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH |
|
3547 |
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt |
|
3548 |
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= |
|
3549 |
+-----END CERTIFICATE----- |
|
3550 |
+ |
|
3551 |
+A-Trust-nQual-03 |
|
3552 |
+================ |
|
3553 |
+-----BEGIN CERTIFICATE----- |
|
3554 |
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE |
|
3555 |
+Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy |
|
3556 |
+a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R |
|
3557 |
+dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw |
|
3558 |
+RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 |
|
3559 |
+ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 |
|
3560 |
+c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA |
|
3561 |
+zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n |
|
3562 |
+yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE |
|
3563 |
+SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 |
|
3564 |
+iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V |
|
3565 |
+cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV |
|
3566 |
+eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 |
|
3567 |
+ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr |
|
3568 |
+sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd |
|
3569 |
+JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS |
|
3570 |
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 |
|
3571 |
+ahq97BvIxYSazQ== |
|
3572 |
+-----END CERTIFICATE----- |
|
3573 |
+ |
|
3574 |
+TWCA Root Certification Authority |
|
3575 |
+================================= |
|
3576 |
+-----BEGIN CERTIFICATE----- |
|
3577 |
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ |
|
3578 |
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh |
|
3579 |
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG |
|
3580 |
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB |
|
3581 |
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK |
|
3582 |
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx |
|
3583 |
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC |
|
3584 |
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP |
|
3585 |
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r |
|
3586 |
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB |
|
3587 |
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG |
|
3588 |
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC |
|
3589 |
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW |
|
3590 |
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY |
|
3591 |
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny |
|
3592 |
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== |
|
3593 |
+-----END CERTIFICATE----- |
|
3594 |
+ |
|
3595 |
+Security Communication RootCA2 |
|
3596 |
+============================== |
|
3597 |
+-----BEGIN CERTIFICATE----- |
|
3598 |
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc |
|
3599 |
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh |
|
3600 |
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC |
|
3601 |
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy |
|
3602 |
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB |
|
3603 |
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ |
|
3604 |
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R |
|
3605 |
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV |
|
3606 |
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K |
|
3607 |
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 |
|
3608 |
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB |
|
3609 |
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj |
|
3610 |
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk |
|
3611 |
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q |
|
3612 |
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 |
|
3613 |
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 |
|
3614 |
+-----END CERTIFICATE----- |
|
3615 |
+ |
|
3616 |
+EC-ACC |
|
3617 |
+====== |
|
3618 |
+-----BEGIN CERTIFICATE----- |
|
3619 |
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE |
|
3620 |
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w |
|
3621 |
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD |
|
3622 |
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE |
|
3623 |
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT |
|
3624 |
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 |
|
3625 |
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt |
|
3626 |
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl |
|
3627 |
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh |
|
3628 |
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND |
|
3629 |
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK |
|
3630 |
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT |
|
3631 |
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 |
|
3632 |
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a |
|
3633 |
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw |
|
3634 |
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E |
|
3635 |
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD |
|
3636 |
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 |
|
3637 |
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l |
|
3638 |
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ |
|
3639 |
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa |
|
3640 |
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe |
|
3641 |
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 |
|
3642 |
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D |
|
3643 |
+5EI= |
|
3644 |
+-----END CERTIFICATE----- |
|
3645 |
+ |
|
3646 |
+Hellenic Academic and Research Institutions RootCA 2011 |
|
3647 |
+======================================================= |
|
3648 |
+-----BEGIN CERTIFICATE----- |
|
3649 |
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT |
|
3650 |
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y |
|
3651 |
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z |
|
3652 |
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT |
|
3653 |
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z |
|
3654 |
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo |
|
3655 |
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB |
|
3656 |
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI |
|
3657 |
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa |
|
3658 |
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u |
|
3659 |
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH |
|
3660 |
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ |
|
3661 |
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 |
|
3662 |
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu |
|
3663 |
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt |
|
3664 |
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 |
|
3665 |
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD |
|
3666 |
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N |
|
3667 |
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 |
|
3668 |
+-----END CERTIFICATE----- |
|
3669 |
+ |
|
3670 |
+Actalis Authentication Root CA |
|
3671 |
+============================== |
|
3672 |
+-----BEGIN CERTIFICATE----- |
|
3673 |
+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 |
|
3699 |
+-----END CERTIFICATE----- |
|
3700 |
+ |
|
3701 |
+Trustis FPS Root CA |
|
3702 |
+=================== |
|
3703 |
+-----BEGIN CERTIFICATE----- |
|
3704 |
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG |
|
3705 |
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 |
|
3706 |
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV |
|
3707 |
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ |
|
3708 |
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ |
|
3709 |
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk |
|
3710 |
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa |
|
3711 |
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt |
|
3712 |
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA |
|
3713 |
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd |
|
3714 |
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c |
|
3715 |
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC |
|
3716 |
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P |
|
3717 |
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV |
|
3718 |
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl |
|
3719 |
+iB6XzCGcKQENZetX2fNXlrtIzYE= |
|
3720 |
+-----END CERTIFICATE----- |
|
3721 |
+ |
|
3722 |
+StartCom Certification Authority |
|
3723 |
+================================ |
|
3724 |
+-----BEGIN CERTIFICATE----- |
|
3725 |
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN |
|
3726 |
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu |
|
3727 |
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 |
|
3728 |
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk |
|
3729 |
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg |
|
3730 |
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw |
|
3731 |
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y |
|
3732 |
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ |
|
3733 |
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d |
|
3734 |
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt |
|
3735 |
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z |
|
3736 |
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ |
|
3737 |
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ |
|
3738 |
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc |
|
3739 |
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT |
|
3740 |
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD |
|
3741 |
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ |
|
3742 |
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 |
|
3743 |
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu |
|
3744 |
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv |
|
3745 |
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 |
|
3746 |
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 |
|
3747 |
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t |
|
3748 |
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG |
|
3749 |
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 |
|
3750 |
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm |
|
3751 |
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN |
|
3752 |
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T |
|
3753 |
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX |
|
3754 |
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA |
|
3755 |
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs |
|
3756 |
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE |
|
3757 |
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib |
|
3758 |
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= |
|
3759 |
+-----END CERTIFICATE----- |
|
3760 |
+ |
|
3761 |
+StartCom Certification Authority G2 |
|
3762 |
+=================================== |
|
3763 |
+-----BEGIN CERTIFICATE----- |
|
3764 |
+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 |
|
3788 |
+obp573PYtlNXLfbQ4ddI |
|
3789 |
+-----END CERTIFICATE----- |
|
3790 |
+ |
|
3791 |
+Buypass Class 2 Root CA |
|
3792 |
+======================= |
|
3793 |
+-----BEGIN CERTIFICATE----- |
|
3794 |
+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 |
|
3818 |
+rJgWVqA= |
|
3819 |
+-----END CERTIFICATE----- |
|
3820 |
+ |
|
3821 |
+Buypass Class 3 Root CA |
|
3822 |
+======================= |
|
3823 |
+-----BEGIN CERTIFICATE----- |
|
3824 |
+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 |
|
3848 |
+Cp/HuZc= |
|
3849 |
+-----END CERTIFICATE----- |
|
3850 |
+ |
|
3851 |
+T-TeleSec GlobalRoot Class 3 |
|
3852 |
+============================ |
|
3853 |
+-----BEGIN CERTIFICATE----- |
|
3854 |
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM |
|
3855 |
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU |
|
3856 |
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx |
|
3857 |
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz |
|
3858 |
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD |
|
3859 |
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 |
|
3860 |
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK |
|
3861 |
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU |
|
3862 |
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF |
|
3863 |
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W |
|
3864 |
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA |
|
3865 |
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr |
|
3866 |
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb |
|
3867 |
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT |
|
3868 |
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h |
|
3869 |
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml |
|
3870 |
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== |
|
3871 |
+-----END CERTIFICATE----- |
|
3872 |
+ |
|
3873 |
+EE Certification Centre Root CA |
|
3874 |
+=============================== |
|
3875 |
+-----BEGIN CERTIFICATE----- |
|
3876 |
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG |
|
3877 |
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy |
|
3878 |
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw |
|
3879 |
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB |
|
3880 |
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy |
|
3881 |
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB |
|
3882 |
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM |
|
3883 |
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 |
|
3884 |
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw |
|
3885 |
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN |
|
3886 |
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T |
|
3887 |
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ |
|
3888 |
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF |
|
3889 |
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj |
|
3890 |
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM |
|
3891 |
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u |
|
3892 |
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU |
|
3893 |
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM |
|
3894 |
+dcGWxZ0= |
|
3895 |
+-----END CERTIFICATE----- |
0 | 3896 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,80 @@ |
1 |
+"""shared options and groups""" |
|
2 |
+from optparse import make_option, OptionGroup |
|
3 |
+ |
|
4 |
+ |
|
5 |
+def make_option_group(group, parser): |
|
6 |
+ """ |
|
7 |
+ Return an OptionGroup object |
|
8 |
+ group -- assumed to be dict with 'name' and 'options' keys |
|
9 |
+ parser -- an optparse Parser |
|
10 |
+ """ |
|
11 |
+ option_group = OptionGroup(parser, group['name']) |
|
12 |
+ for option in group['options']: |
|
13 |
+ option_group.add_option(option) |
|
14 |
+ return option_group |
|
15 |
+ |
|
16 |
+########### |
|
17 |
+# options # |
|
18 |
+########### |
|
19 |
+ |
|
20 |
+index_url = make_option( |
|
21 |
+ '-i', '--index-url', '--pypi-url', |
|
22 |
+ dest='index_url', |
|
23 |
+ metavar='URL', |
|
24 |
+ default='https://pypi.python.org/simple/', |
|
25 |
+ help='Base URL of Python Package Index (default %default).') |
|
26 |
+ |
|
27 |
+extra_index_url = make_option( |
|
28 |
+ '--extra-index-url', |
|
29 |
+ dest='extra_index_urls', |
|
30 |
+ metavar='URL', |
|
31 |
+ action='append', |
|
32 |
+ default=[], |
|
33 |
+ help='Extra URLs of package indexes to use in addition to --index-url.') |
|
34 |
+ |
|
35 |
+no_index = make_option( |
|
36 |
+ '--no-index', |
|
37 |
+ dest='no_index', |
|
38 |
+ action='store_true', |
|
39 |
+ default=False, |
|
40 |
+ help='Ignore package index (only looking at --find-links URLs instead).') |
|
41 |
+ |
|
42 |
+find_links = make_option( |
|
43 |
+ '-f', '--find-links', |
|
44 |
+ dest='find_links', |
|
45 |
+ action='append', |
|
46 |
+ default=[], |
|
47 |
+ metavar='url', |
|
48 |
+ help="If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.") |
|
49 |
+ |
|
50 |
+use_mirrors = make_option( |
|
51 |
+ '-M', '--use-mirrors', |
|
52 |
+ dest='use_mirrors', |
|
53 |
+ action='store_true', |
|
54 |
+ default=False, |
|
55 |
+ help='Use the PyPI mirrors as a fallback in case the main index is down.') |
|
56 |
+ |
|
57 |
+mirrors = make_option( |
|
58 |
+ '--mirrors', |
|
59 |
+ dest='mirrors', |
|
60 |
+ metavar='URL', |
|
61 |
+ action='append', |
|
62 |
+ default=[], |
|
63 |
+ help='Specific mirror URLs to query when --use-mirrors is used.') |
|
64 |
+ |
|
65 |
+ |
|
66 |
+########## |
|
67 |
+# groups # |
|
68 |
+########## |
|
69 |
+ |
|
70 |
+index_group = { |
|
71 |
+ 'name': 'Package Index Options', |
|
72 |
+ 'options': [ |
|
73 |
+ index_url, |
|
74 |
+ extra_index_url, |
|
75 |
+ no_index, |
|
76 |
+ find_links, |
|
77 |
+ use_mirrors, |
|
78 |
+ mirrors |
|
79 |
+ ] |
|
80 |
+ } |
2 | 83 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,85 @@ |
1 |
+""" |
|
2 |
+Package containing all pip commands |
|
3 |
+""" |
|
4 |
+ |
|
5 |
+ |
|
6 |
+from pip.commands.bundle import BundleCommand |
|
7 |
+from pip.commands.completion import CompletionCommand |
|
8 |
+from pip.commands.freeze import FreezeCommand |
|
9 |
+from pip.commands.help import HelpCommand |
|
10 |
+from pip.commands.list import ListCommand |
|
11 |
+from pip.commands.search import SearchCommand |
|
12 |
+from pip.commands.show import ShowCommand |
|
13 |
+from pip.commands.install import InstallCommand |
|
14 |
+from pip.commands.uninstall import UninstallCommand |
|
15 |
+from pip.commands.unzip import UnzipCommand |
|
16 |
+from pip.commands.zip import ZipCommand |
|
17 |
+ |
|
18 |
+ |
|
19 |
+commands = { |
|
20 |
+ BundleCommand.name: BundleCommand, |
|
21 |
+ CompletionCommand.name: CompletionCommand, |
|
22 |
+ FreezeCommand.name: FreezeCommand, |
|
23 |
+ HelpCommand.name: HelpCommand, |
|
24 |
+ SearchCommand.name: SearchCommand, |
|
25 |
+ ShowCommand.name: ShowCommand, |
|
26 |
+ InstallCommand.name: InstallCommand, |
|
27 |
+ UninstallCommand.name: UninstallCommand, |
|
28 |
+ UnzipCommand.name: UnzipCommand, |
|
29 |
+ ZipCommand.name: ZipCommand, |
|
30 |
+ ListCommand.name: ListCommand, |
|
31 |
+} |
|
32 |
+ |
|
33 |
+ |
|
34 |
+commands_order = [ |
|
35 |
+ InstallCommand, |
|
36 |
+ UninstallCommand, |
|
37 |
+ FreezeCommand, |
|
38 |
+ ListCommand, |
|
39 |
+ ShowCommand, |
|
40 |
+ SearchCommand, |
|
41 |
+ ZipCommand, |
|
42 |
+ UnzipCommand, |
|
43 |
+ BundleCommand, |
|
44 |
+ HelpCommand, |
|
45 |
+] |
|
46 |
+ |
|
47 |
+ |
|
48 |
+def get_summaries(ignore_hidden=True, ordered=True): |
|
49 |
+ """Yields sorted (command name, command summary) tuples.""" |
|
50 |
+ |
|
51 |
+ if ordered: |
|
52 |
+ cmditems = _sort_commands(commands, commands_order) |
|
53 |
+ else: |
|
54 |
+ cmditems = commands.items() |
|
55 |
+ |
|
56 |
+ for name, command_class in cmditems: |
|
57 |
+ if ignore_hidden and command_class.hidden: |
|
58 |
+ continue |
|
59 |
+ |
|
60 |
+ yield (name, command_class.summary) |
|
61 |
+ |
|
62 |
+ |
|
63 |
+def get_similar_commands(name): |
|
64 |
+ """Command name auto-correct.""" |
|
65 |
+ from difflib import get_close_matches |
|
66 |
+ |
|
67 |
+ close_commands = get_close_matches(name, commands.keys()) |
|
68 |
+ |
|
69 |
+ if close_commands: |
|
70 |
+ guess = close_commands[0] |
|
71 |
+ else: |
|
72 |
+ guess = False |
|
73 |
+ |
|
74 |
+ return guess |
|
75 |
+ |
|
76 |
+ |
|
77 |
+def _sort_commands(cmddict, order): |
|
78 |
+ def keyfn(key): |
|
79 |
+ try: |
|
80 |
+ return order.index(key[1]) |
|
81 |
+ except ValueError: |
|
82 |
+ # unordered items should come last |
|
83 |
+ return 0xff |
|
84 |
+ |
|
85 |
+ return sorted(cmddict.items(), key=keyfn) |
2 | 88 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,37 @@ |
1 |
+from pip.locations import build_prefix, src_prefix |
|
2 |
+from pip.util import display_path, backup_dir |
|
3 |
+from pip.log import logger |
|
4 |
+from pip.exceptions import InstallationError |
|
5 |
+from pip.commands.install import InstallCommand |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class BundleCommand(InstallCommand): |
|
9 |
+ """Create pybundles (archives containing multiple packages).""" |
|
10 |
+ name = 'bundle' |
|
11 |
+ usage = """ |
|
12 |
+ %prog [options] <bundle name>.pybundle <package>...""" |
|
13 |
+ summary = 'Create pybundles.' |
|
14 |
+ bundle = True |
|
15 |
+ |
|
16 |
+ def __init__(self, *args, **kw): |
|
17 |
+ super(BundleCommand, self).__init__(*args, **kw) |
|
18 |
+ # bundle uses different default source and build dirs |
|
19 |
+ build_opt = self.parser.get_option("--build") |
|
20 |
+ build_opt.default = backup_dir(build_prefix, '-bundle') |
|
21 |
+ src_opt = self.parser.get_option("--src") |
|
22 |
+ src_opt.default = backup_dir(src_prefix, '-bundle') |
|
23 |
+ self.parser.set_defaults(**{ |
|
24 |
+ src_opt.dest: src_opt.default, |
|
25 |
+ build_opt.dest: build_opt.default, |
|
26 |
+ }) |
|
27 |
+ |
|
28 |
+ def run(self, options, args): |
|
29 |
+ if not args: |
|
30 |
+ raise InstallationError('You must give a bundle filename') |
|
31 |
+ # We have to get everything when creating a bundle: |
|
32 |
+ options.ignore_installed = True |
|
33 |
+ logger.notify('Putting temporary build files in %s and source/develop files in %s' |
|
34 |
+ % (display_path(options.build_dir), display_path(options.src_dir))) |
|
35 |
+ self.bundle_filename = args.pop(0) |
|
36 |
+ requirement_set = super(BundleCommand, self).run(options, args) |
|
37 |
+ return requirement_set |
2 | 40 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,59 @@ |
1 |
+import sys |
|
2 |
+from pip.basecommand import Command |
|
3 |
+ |
|
4 |
+BASE_COMPLETION = """ |
|
5 |
+# pip %(shell)s completion start%(script)s# pip %(shell)s completion end |
|
6 |
+""" |
|
7 |
+ |
|
8 |
+COMPLETION_SCRIPTS = { |
|
9 |
+ 'bash': """ |
|
10 |
+_pip_completion() |
|
11 |
+{ |
|
12 |
+ COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ |
|
13 |
+ COMP_CWORD=$COMP_CWORD \\ |
|
14 |
+ PIP_AUTO_COMPLETE=1 $1 ) ) |
|
15 |
+} |
|
16 |
+complete -o default -F _pip_completion pip |
|
17 |
+""", 'zsh': """ |
|
18 |
+function _pip_completion { |
|
19 |
+ local words cword |
|
20 |
+ read -Ac words |
|
21 |
+ read -cn cword |
|
22 |
+ reply=( $( COMP_WORDS="$words[*]" \\ |
|
23 |
+ COMP_CWORD=$(( cword-1 )) \\ |
|
24 |
+ PIP_AUTO_COMPLETE=1 $words[1] ) ) |
|
25 |
+} |
|
26 |
+compctl -K _pip_completion pip |
|
27 |
+"""} |
|
28 |
+ |
|
29 |
+ |
|
30 |
+class CompletionCommand(Command): |
|
31 |
+ """A helper command to be used for command completion.""" |
|
32 |
+ name = 'completion' |
|
33 |
+ summary = 'A helper command to be used for command completion' |
|
34 |
+ hidden = True |
|
35 |
+ |
|
36 |
+ def __init__(self, *args, **kw): |
|
37 |
+ super(CompletionCommand, self).__init__(*args, **kw) |
|
38 |
+ self.parser.add_option( |
|
39 |
+ '--bash', '-b', |
|
40 |
+ action='store_const', |
|
41 |
+ const='bash', |
|
42 |
+ dest='shell', |
|
43 |
+ help='Emit completion code for bash') |
|
44 |
+ self.parser.add_option( |
|
45 |
+ '--zsh', '-z', |
|
46 |
+ action='store_const', |
|
47 |
+ const='zsh', |
|
48 |
+ dest='shell', |
|
49 |
+ help='Emit completion code for zsh') |
|
50 |
+ |
|
51 |
+ def run(self, options, args): |
|
52 |
+ """Prints the completion code of the given shell""" |
|
53 |
+ shells = COMPLETION_SCRIPTS.keys() |
|
54 |
+ shell_options = ['--' + shell for shell in sorted(shells)] |
|
55 |
+ if options.shell in shells: |
|
56 |
+ script = COMPLETION_SCRIPTS.get(options.shell, '') |
|
57 |
+ print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) |
|
58 |
+ else: |
|
59 |
+ sys.stderr.write('ERROR: You must pass %s\n' % ' or '.join(shell_options)) |
2 | 62 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,113 @@ |
1 |
+import re |
|
2 |
+import sys |
|
3 |
+import pkg_resources |
|
4 |
+import pip |
|
5 |
+from pip.req import InstallRequirement |
|
6 |
+from pip.log import logger |
|
7 |
+from pip.basecommand import Command |
|
8 |
+from pip.util import get_installed_distributions |
|
9 |
+ |
|
10 |
+ |
|
11 |
+class FreezeCommand(Command): |
|
12 |
+ """Output installed packages in requirements format.""" |
|
13 |
+ name = 'freeze' |
|
14 |
+ usage = """ |
|
15 |
+ %prog [options]""" |
|
16 |
+ summary = 'Output installed packages in requirements format.' |
|
17 |
+ |
|
18 |
+ def __init__(self, *args, **kw): |
|
19 |
+ super(FreezeCommand, self).__init__(*args, **kw) |
|
20 |
+ |
|
21 |
+ self.cmd_opts.add_option( |
|
22 |
+ '-r', '--requirement', |
|
23 |
+ dest='requirement', |
|
24 |
+ action='store', |
|
25 |
+ default=None, |
|
26 |
+ metavar='file', |
|
27 |
+ help="Use the order in the given requirements file and it's comments when generating output.") |
|
28 |
+ self.cmd_opts.add_option( |
|
29 |
+ '-f', '--find-links', |
|
30 |
+ dest='find_links', |
|
31 |
+ action='append', |
|
32 |
+ default=[], |
|
33 |
+ metavar='URL', |
|
34 |
+ help='URL for finding packages, which will be added to the output.') |
|
35 |
+ self.cmd_opts.add_option( |
|
36 |
+ '-l', '--local', |
|
37 |
+ dest='local', |
|
38 |
+ action='store_true', |
|
39 |
+ default=False, |
|
40 |
+ help='If in a virtualenv that has global access, do not output globally-installed packages.') |
|
41 |
+ |
|
42 |
+ self.parser.insert_option_group(0, self.cmd_opts) |
|
43 |
+ |
|
44 |
+ def setup_logging(self): |
|
45 |
+ logger.move_stdout_to_stderr() |
|
46 |
+ |
|
47 |
+ def run(self, options, args): |
|
48 |
+ requirement = options.requirement |
|
49 |
+ find_links = options.find_links or [] |
|
50 |
+ local_only = options.local |
|
51 |
+ ## FIXME: Obviously this should be settable: |
|
52 |
+ find_tags = False |
|
53 |
+ skip_match = None |
|
54 |
+ |
|
55 |
+ skip_regex = options.skip_requirements_regex |
|
56 |
+ if skip_regex: |
|
57 |
+ skip_match = re.compile(skip_regex) |
|
58 |
+ |
|
59 |
+ dependency_links = [] |
|
60 |
+ |
|
61 |
+ f = sys.stdout |
|
62 |
+ |
|
63 |
+ for dist in pkg_resources.working_set: |
|
64 |
+ if dist.has_metadata('dependency_links.txt'): |
|
65 |
+ dependency_links.extend(dist.get_metadata_lines('dependency_links.txt')) |
|
66 |
+ for link in find_links: |
|
67 |
+ if '#egg=' in link: |
|
68 |
+ dependency_links.append(link) |
|
69 |
+ for link in find_links: |
|
70 |
+ f.write('-f %s\n' % link) |
|
71 |
+ installations = {} |
|
72 |
+ for dist in get_installed_distributions(local_only=local_only): |
|
73 |
+ req = pip.FrozenRequirement.from_dist(dist, dependency_links, find_tags=find_tags) |
|
74 |
+ installations[req.name] = req |
|
75 |
+ if requirement: |
|
76 |
+ req_f = open(requirement) |
|
77 |
+ for line in req_f: |
|
78 |
+ if not line.strip() or line.strip().startswith('#'): |
|
79 |
+ f.write(line) |
|
80 |
+ continue |
|
81 |
+ if skip_match and skip_match.search(line): |
|
82 |
+ f.write(line) |
|
83 |
+ continue |
|
84 |
+ elif line.startswith('-e') or line.startswith('--editable'): |
|
85 |
+ if line.startswith('-e'): |
|
86 |
+ line = line[2:].strip() |
|
87 |
+ else: |
|
88 |
+ line = line[len('--editable'):].strip().lstrip('=') |
|
89 |
+ line_req = InstallRequirement.from_editable(line, default_vcs=options.default_vcs) |
|
90 |
+ elif (line.startswith('-r') or line.startswith('--requirement') |
|
91 |
+ or line.startswith('-Z') or line.startswith('--always-unzip') |
|
92 |
+ or line.startswith('-f') or line.startswith('-i') |
|
93 |
+ or line.startswith('--extra-index-url') |
|
94 |
+ or line.startswith('--find-links') |
|
95 |
+ or line.startswith('--index-url')): |
|
96 |
+ f.write(line) |
|
97 |
+ continue |
|
98 |
+ else: |
|
99 |
+ line_req = InstallRequirement.from_line(line) |
|
100 |
+ if not line_req.name: |
|
101 |
+ logger.notify("Skipping line because it's not clear what it would install: %s" |
|
102 |
+ % line.strip()) |
|
103 |
+ logger.notify(" (add #egg=PackageName to the URL to avoid this warning)") |
|
104 |
+ continue |
|
105 |
+ if line_req.name not in installations: |
|
106 |
+ logger.warn("Requirement file contains %s, but that package is not installed" |
|
107 |
+ % line.strip()) |
|
108 |
+ continue |
|
109 |
+ f.write(str(installations[line_req.name])) |
|
110 |
+ del installations[line_req.name] |
|
111 |
+ f.write('## The following requirements were added by pip --freeze:\n') |
|
112 |
+ for installation in sorted(installations.values(), key=lambda x: x.name): |
|
113 |
+ f.write(str(installation)) |
2 | 116 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,33 @@ |
1 |
+from pip.basecommand import Command, SUCCESS |
|
2 |
+from pip.exceptions import CommandError |
|
3 |
+ |
|
4 |
+ |
|
5 |
+class HelpCommand(Command): |
|
6 |
+ """Show help for commands""" |
|
7 |
+ name = 'help' |
|
8 |
+ usage = """ |
|
9 |
+ %prog <command>""" |
|
10 |
+ summary = 'Show help for commands.' |
|
11 |
+ |
|
12 |
+ def run(self, options, args): |
|
13 |
+ from pip.commands import commands, get_similar_commands |
|
14 |
+ |
|
15 |
+ try: |
|
16 |
+ # 'pip help' with no args is handled by pip.__init__.parseopt() |
|
17 |
+ cmd_name = args[0] # the command we need help for |
|
18 |
+ except IndexError: |
|
19 |
+ return SUCCESS |
|
20 |
+ |
|
21 |
+ if cmd_name not in commands: |
|
22 |
+ guess = get_similar_commands(cmd_name) |
|
23 |
+ |
|
24 |
+ msg = ['unknown command "%s"' % cmd_name] |
|
25 |
+ if guess: |
|
26 |
+ msg.append('maybe you meant "%s"' % guess) |
|
27 |
+ |
|
28 |
+ raise CommandError(' - '.join(msg)) |
|
29 |
+ |
|
30 |
+ command = commands[cmd_name](self.main_parser) # instantiate |
|
31 |
+ command.parser.print_help() |
|
32 |
+ |
|
33 |
+ return SUCCESS |
2 | 36 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,297 @@ |
1 |
+import os |
|
2 |
+import sys |
|
3 |
+import tempfile |
|
4 |
+import shutil |
|
5 |
+from pip.req import InstallRequirement, RequirementSet, parse_requirements |
|
6 |
+from pip.log import logger |
|
7 |
+from pip.locations import build_prefix, src_prefix, virtualenv_no_global |
|
8 |
+from pip.basecommand import Command |
|
9 |
+from pip.index import PackageFinder |
|
10 |
+from pip.exceptions import InstallationError, CommandError |
|
11 |
+from pip.backwardcompat import home_lib |
|
12 |
+from pip.cmdoptions import make_option_group, index_group |
|
13 |
+ |
|
14 |
+ |
|
15 |
+class InstallCommand(Command): |
|
16 |
+ """ |
|
17 |
+ Install packages from: |
|
18 |
+ |
|
19 |
+ - PyPI (and other indexes) using requirement specifiers. |
|
20 |
+ - VCS project urls. |
|
21 |
+ - Local project directories. |
|
22 |
+ - Local or remote source archives. |
|
23 |
+ |
|
24 |
+ pip also supports installing from "requirements files", which provide |
|
25 |
+ an easy way to specify a whole environment to be installed. |
|
26 |
+ |
|
27 |
+ See http://www.pip-installer.org for details on VCS url formats and |
|
28 |
+ requirements files. |
|
29 |
+ """ |
|
30 |
+ name = 'install' |
|
31 |
+ |
|
32 |
+ usage = """ |
|
33 |
+ %prog [options] <requirement specifier> ... |
|
34 |
+ %prog [options] -r <requirements file> ... |
|
35 |
+ %prog [options] [-e] <vcs project url> ... |
|
36 |
+ %prog [options] [-e] <local project path> ... |
|
37 |
+ %prog [options] <archive url/path> ...""" |
|
38 |
+ |
|
39 |
+ summary = 'Install packages.' |
|
40 |
+ bundle = False |
|
41 |
+ |
|
42 |
+ def __init__(self, *args, **kw): |
|
43 |
+ super(InstallCommand, self).__init__(*args, **kw) |
|
44 |
+ |
|
45 |
+ cmd_opts = self.cmd_opts |
|
46 |
+ |
|
47 |
+ cmd_opts.add_option( |
|
48 |
+ '-e', '--editable', |
|
49 |
+ dest='editables', |
|
50 |
+ action='append', |
|
51 |
+ default=[], |
|
52 |
+ metavar='path/url', |
|
53 |
+ help='Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.') |
|
54 |
+ |
|
55 |
+ cmd_opts.add_option( |
|
56 |
+ '-r', '--requirement', |
|
57 |
+ dest='requirements', |
|
58 |
+ action='append', |
|
59 |
+ default=[], |
|
60 |
+ metavar='file', |
|
61 |
+ help='Install from the given requirements file. ' |
|
62 |
+ 'This option can be used multiple times.') |
|
63 |
+ |
|
64 |
+ cmd_opts.add_option( |
|
65 |
+ '-b', '--build', '--build-dir', '--build-directory', |
|
66 |
+ dest='build_dir', |
|
67 |
+ metavar='dir', |
|
68 |
+ default=build_prefix, |
|
69 |
+ help='Directory to unpack packages into and build in. ' |
|
70 |
+ 'The default in a virtualenv is "<venv path>/build". ' |
|
71 |
+ 'The default for global installs is "<OS temp dir>/pip-build-<username>".') |
|
72 |
+ |
|
73 |
+ cmd_opts.add_option( |
|
74 |
+ '-t', '--target', |
|
75 |
+ dest='target_dir', |
|
76 |
+ metavar='dir', |
|
77 |
+ default=None, |
|
78 |
+ help='Install packages into <dir>.') |
|
79 |
+ |
|
80 |
+ cmd_opts.add_option( |
|
81 |
+ '-d', '--download', '--download-dir', '--download-directory', |
|
82 |
+ dest='download_dir', |
|
83 |
+ metavar='dir', |
|
84 |
+ default=None, |
|
85 |
+ help="Download packages into <dir> instead of installing them, irregardless of what's already installed.") |
|
86 |
+ |
|
87 |
+ cmd_opts.add_option( |
|
88 |
+ '--download-cache', |
|
89 |
+ dest='download_cache', |
|
90 |
+ metavar='dir', |
|
91 |
+ default=None, |
|
92 |
+ help='Cache downloaded packages in <dir>.') |
|
93 |
+ |
|
94 |
+ cmd_opts.add_option( |
|
95 |
+ '--src', '--source', '--source-dir', '--source-directory', |
|
96 |
+ dest='src_dir', |
|
97 |
+ metavar='dir', |
|
98 |
+ default=src_prefix, |
|
99 |
+ help='Directory to check out editable projects into. ' |
|
100 |
+ 'The default in a virtualenv is "<venv path>/src". ' |
|
101 |
+ 'The default for global installs is "<current dir>/src".') |
|
102 |
+ |
|
103 |
+ cmd_opts.add_option( |
|
104 |
+ '-U', '--upgrade', |
|
105 |
+ dest='upgrade', |
|
106 |
+ action='store_true', |
|
107 |
+ help='Upgrade all packages to the newest available version. ' |
|
108 |
+ 'This process is recursive irregardless of whether a dependency is already satisfied.') |
|
109 |
+ |
|
110 |
+ cmd_opts.add_option( |
|
111 |
+ '--force-reinstall', |
|
112 |
+ dest='force_reinstall', |
|
113 |
+ action='store_true', |
|
114 |
+ help='When upgrading, reinstall all packages even if they are ' |
|
115 |
+ 'already up-to-date.') |
|
116 |
+ |
|
117 |
+ cmd_opts.add_option( |
|
118 |
+ '-I', '--ignore-installed', |
|
119 |
+ dest='ignore_installed', |
|
120 |
+ action='store_true', |
|
121 |
+ help='Ignore the installed packages (reinstalling instead).') |
|
122 |
+ |
|
123 |
+ cmd_opts.add_option( |
|
124 |
+ '--no-deps', '--no-dependencies', |
|
125 |
+ dest='ignore_dependencies', |
|
126 |
+ action='store_true', |
|
127 |
+ default=False, |
|
128 |
+ help="Don't install package dependencies.") |
|
129 |
+ |
|
130 |
+ cmd_opts.add_option( |
|
131 |
+ '--no-install', |
|
132 |
+ dest='no_install', |
|
133 |
+ action='store_true', |
|
134 |
+ help="Download and unpack all packages, but don't actually install them.") |
|
135 |
+ |
|
136 |
+ cmd_opts.add_option( |
|
137 |
+ '--no-download', |
|
138 |
+ dest='no_download', |
|
139 |
+ action="store_true", |
|
140 |
+ help="Don't download any packages, just install the ones already downloaded " |
|
141 |
+ "(completes an install run with --no-install).") |
|
142 |
+ |
|
143 |
+ cmd_opts.add_option( |
|
144 |
+ '--install-option', |
|
145 |
+ dest='install_options', |
|
146 |
+ action='append', |
|
147 |
+ metavar='options', |
|
148 |
+ help="Extra arguments to be supplied to the setup.py install " |
|
149 |
+ "command (use like --install-option=\"--install-scripts=/usr/local/bin\"). " |
|
150 |
+ "Use multiple --install-option options to pass multiple options to setup.py install. " |
|
151 |
+ "If you are using an option with a directory path, be sure to use absolute path.") |
|
152 |
+ |
|
153 |
+ cmd_opts.add_option( |
|
154 |
+ '--global-option', |
|
155 |
+ dest='global_options', |
|
156 |
+ action='append', |
|
157 |
+ metavar='options', |
|
158 |
+ help="Extra global options to be supplied to the setup.py " |
|
159 |
+ "call before the install command.") |
|
160 |
+ |
|
161 |
+ cmd_opts.add_option( |
|
162 |
+ '--user', |
|
163 |
+ dest='use_user_site', |
|
164 |
+ action='store_true', |
|
165 |
+ help='Install using the user scheme.') |
|
166 |
+ |
|
167 |
+ cmd_opts.add_option( |
|
168 |
+ '--egg', |
|
169 |
+ dest='as_egg', |
|
170 |
+ action='store_true', |
|
171 |
+ help="Install as self contained egg file, like easy_install does.") |
|
172 |
+ |
|
173 |
+ cmd_opts.add_option( |
|
174 |
+ '--root', |
|
175 |
+ dest='root_path', |
|
176 |
+ metavar='dir', |
|
177 |
+ default=None, |
|
178 |
+ help="Install everything relative to this alternate root directory.") |
|
179 |
+ |
|
180 |
+ index_opts = make_option_group(index_group, self.parser) |
|
181 |
+ |
|
182 |
+ self.parser.insert_option_group(0, index_opts) |
|
183 |
+ self.parser.insert_option_group(0, cmd_opts) |
|
184 |
+ |
|
185 |
+ def _build_package_finder(self, options, index_urls): |
|
186 |
+ """ |
|
187 |
+ Create a package finder appropriate to this install command. |
|
188 |
+ This method is meant to be overridden by subclasses, not |
|
189 |
+ called directly. |
|
190 |
+ """ |
|
191 |
+ return PackageFinder(find_links=options.find_links, |
|
192 |
+ index_urls=index_urls, |
|
193 |
+ use_mirrors=options.use_mirrors, |
|
194 |
+ mirrors=options.mirrors) |
|
195 |
+ |
|
196 |
+ def run(self, options, args): |
|
197 |
+ if options.download_dir: |
|
198 |
+ options.no_install = True |
|
199 |
+ options.ignore_installed = True |
|
200 |
+ options.build_dir = os.path.abspath(options.build_dir) |
|
201 |
+ options.src_dir = os.path.abspath(options.src_dir) |
|
202 |
+ install_options = options.install_options or [] |
|
203 |
+ if options.use_user_site: |
|
204 |
+ if virtualenv_no_global(): |
|
205 |
+ raise InstallationError("Can not perform a '--user' install. User site-packages are not visible in this virtualenv.") |
|
206 |
+ install_options.append('--user') |
|
207 |
+ if options.target_dir: |
|
208 |
+ options.ignore_installed = True |
|
209 |
+ temp_target_dir = tempfile.mkdtemp() |
|
210 |
+ options.target_dir = os.path.abspath(options.target_dir) |
|
211 |
+ if os.path.exists(options.target_dir) and not os.path.isdir(options.target_dir): |
|
212 |
+ raise CommandError("Target path exists but is not a directory, will not continue.") |
|
213 |
+ install_options.append('--home=' + temp_target_dir) |
|
214 |
+ global_options = options.global_options or [] |
|
215 |
+ index_urls = [options.index_url] + options.extra_index_urls |
|
216 |
+ if options.no_index: |
|
217 |
+ logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) |
|
218 |
+ index_urls = [] |
|
219 |
+ |
|
220 |
+ finder = self._build_package_finder(options, index_urls) |
|
221 |
+ |
|
222 |
+ requirement_set = RequirementSet( |
|
223 |
+ build_dir=options.build_dir, |
|
224 |
+ src_dir=options.src_dir, |
|
225 |
+ download_dir=options.download_dir, |
|
226 |
+ download_cache=options.download_cache, |
|
227 |
+ upgrade=options.upgrade, |
|
228 |
+ as_egg=options.as_egg, |
|
229 |
+ ignore_installed=options.ignore_installed, |
|
230 |
+ ignore_dependencies=options.ignore_dependencies, |
|
231 |
+ force_reinstall=options.force_reinstall, |
|
232 |
+ use_user_site=options.use_user_site) |
|
233 |
+ for name in args: |
|
234 |
+ requirement_set.add_requirement( |
|
235 |
+ InstallRequirement.from_line(name, None)) |
|
236 |
+ for name in options.editables: |
|
237 |
+ requirement_set.add_requirement( |
|
238 |
+ InstallRequirement.from_editable(name, default_vcs=options.default_vcs)) |
|
239 |
+ for filename in options.requirements: |
|
240 |
+ for req in parse_requirements(filename, finder=finder, options=options): |
|
241 |
+ requirement_set.add_requirement(req) |
|
242 |
+ if not requirement_set.has_requirements: |
|
243 |
+ opts = {'name': self.name} |
|
244 |
+ if options.find_links: |
|
245 |
+ msg = ('You must give at least one requirement to %(name)s ' |
|
246 |
+ '(maybe you meant "pip %(name)s %(links)s"?)' % |
|
247 |
+ dict(opts, links=' '.join(options.find_links))) |
|
248 |
+ else: |
|
249 |
+ msg = ('You must give at least one requirement ' |
|
250 |
+ 'to %(name)s (see "pip help %(name)s")' % opts) |
|
251 |
+ logger.warn(msg) |
|
252 |
+ return |
|
253 |
+ |
|
254 |
+ if (options.use_user_site and |
|
255 |
+ sys.version_info < (2, 6)): |
|
256 |
+ raise InstallationError('--user is only supported in Python version 2.6 and newer') |
|
257 |
+ |
|
258 |
+ import setuptools |
|
259 |
+ if (options.use_user_site and |
|
260 |
+ requirement_set.has_editables and |
|
261 |
+ not getattr(setuptools, '_distribute', False)): |
|
262 |
+ |
|
263 |
+ raise InstallationError('--user --editable not supported with setuptools, use distribute') |
|
264 |
+ |
|
265 |
+ if not options.no_download: |
|
266 |
+ requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) |
|
267 |
+ else: |
|
268 |
+ requirement_set.locate_files() |
|
269 |
+ |
|
270 |
+ if not options.no_install and not self.bundle: |
|
271 |
+ requirement_set.install(install_options, global_options, root=options.root_path) |
|
272 |
+ installed = ' '.join([req.name for req in |
|
273 |
+ requirement_set.successfully_installed]) |
|
274 |
+ if installed: |
|
275 |
+ logger.notify('Successfully installed %s' % installed) |
|
276 |
+ elif not self.bundle: |
|
277 |
+ downloaded = ' '.join([req.name for req in |
|
278 |
+ requirement_set.successfully_downloaded]) |
|
279 |
+ if downloaded: |
|
280 |
+ logger.notify('Successfully downloaded %s' % downloaded) |
|
281 |
+ elif self.bundle: |
|
282 |
+ requirement_set.create_bundle(self.bundle_filename) |
|
283 |
+ logger.notify('Created bundle in %s' % self.bundle_filename) |
|
284 |
+ # Clean up |
|
285 |
+ if not options.no_install or options.download_dir: |
|
286 |
+ requirement_set.cleanup_files(bundle=self.bundle) |
|
287 |
+ if options.target_dir: |
|
288 |
+ if not os.path.exists(options.target_dir): |
|
289 |
+ os.makedirs(options.target_dir) |
|
290 |
+ lib_dir = home_lib(temp_target_dir) |
|
291 |
+ for item in os.listdir(lib_dir): |
|
292 |
+ shutil.move( |
|
293 |
+ os.path.join(lib_dir, item), |
|
294 |
+ os.path.join(options.target_dir, item) |
|
295 |
+ ) |
|
296 |
+ shutil.rmtree(temp_target_dir) |
|
297 |
+ return requirement_set |
2 | 300 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,132 @@ |
1 |
+from pip.basecommand import Command |
|
2 |
+from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled |
|
3 |
+from pip.index import PackageFinder |
|
4 |
+from pip.log import logger |
|
5 |
+from pip.req import InstallRequirement |
|
6 |
+from pip.util import get_installed_distributions, dist_is_editable |
|
7 |
+from pip.cmdoptions import make_option_group, index_group |
|
8 |
+ |
|
9 |
+ |
|
10 |
+class ListCommand(Command): |
|
11 |
+ """List installed packages, including editables.""" |
|
12 |
+ name = 'list' |
|
13 |
+ usage = """ |
|
14 |
+ %prog [options]""" |
|
15 |
+ summary = 'List installed packages.' |
|
16 |
+ |
|
17 |
+ def __init__(self, *args, **kw): |
|
18 |
+ super(ListCommand, self).__init__(*args, **kw) |
|
19 |
+ |
|
20 |
+ cmd_opts = self.cmd_opts |
|
21 |
+ |
|
22 |
+ cmd_opts.add_option( |
|
23 |
+ '-o', '--outdated', |
|
24 |
+ action='store_true', |
|
25 |
+ default=False, |
|
26 |
+ help='List outdated packages (excluding editables)') |
|
27 |
+ cmd_opts.add_option( |
|
28 |
+ '-u', '--uptodate', |
|
29 |
+ action='store_true', |
|
30 |
+ default=False, |
|
31 |
+ help='List uptodate packages (excluding editables)') |
|
32 |
+ cmd_opts.add_option( |
|
33 |
+ '-e', '--editable', |
|
34 |
+ action='store_true', |
|
35 |
+ default=False, |
|
36 |
+ help='List editable projects.') |
|
37 |
+ cmd_opts.add_option( |
|
38 |
+ '-l', '--local', |
|
39 |
+ action='store_true', |
|
40 |
+ default=False, |
|
41 |
+ help='If in a virtualenv that has global access, do not list globally-installed packages.') |
|
42 |
+ |
|
43 |
+ index_opts = make_option_group(index_group, self.parser) |
|
44 |
+ |
|
45 |
+ self.parser.insert_option_group(0, index_opts) |
|
46 |
+ self.parser.insert_option_group(0, cmd_opts) |
|
47 |
+ |
|
48 |
+ def _build_package_finder(self, options, index_urls): |
|
49 |
+ """ |
|
50 |
+ Create a package finder appropriate to this list command. |
|
51 |
+ """ |
|
52 |
+ return PackageFinder(find_links=options.find_links, |
|
53 |
+ index_urls=index_urls, |
|
54 |
+ use_mirrors=options.use_mirrors, |
|
55 |
+ mirrors=options.mirrors) |
|
56 |
+ |
|
57 |
+ def run(self, options, args): |
|
58 |
+ if options.outdated: |
|
59 |
+ self.run_outdated(options) |
|
60 |
+ elif options.uptodate: |
|
61 |
+ self.run_uptodate(options) |
|
62 |
+ elif options.editable: |
|
63 |
+ self.run_editables(options) |
|
64 |
+ else: |
|
65 |
+ self.run_listing(options) |
|
66 |
+ |
|
67 |
+ def run_outdated(self, options): |
|
68 |
+ for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): |
|
69 |
+ if remote_version_parsed > dist.parsed_version: |
|
70 |
+ logger.notify('%s (Current: %s Latest: %s)' % (dist.project_name, |
|
71 |
+ dist.version, remote_version_raw)) |
|
72 |
+ |
|
73 |
+ def find_packages_latests_versions(self, options): |
|
74 |
+ index_urls = [options.index_url] + options.extra_index_urls |
|
75 |
+ if options.no_index: |
|
76 |
+ logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) |
|
77 |
+ index_urls = [] |
|
78 |
+ |
|
79 |
+ dependency_links = [] |
|
80 |
+ for dist in get_installed_distributions(local_only=options.local): |
|
81 |
+ if dist.has_metadata('dependency_links.txt'): |
|
82 |
+ dependency_links.extend( |
|
83 |
+ dist.get_metadata_lines('dependency_links.txt'), |
|
84 |
+ ) |
|
85 |
+ |
|
86 |
+ finder = self._build_package_finder(options, index_urls) |
|
87 |
+ finder.add_dependency_links(dependency_links) |
|
88 |
+ |
|
89 |
+ installed_packages = get_installed_distributions(local_only=options.local, include_editables=False) |
|
90 |
+ for dist in installed_packages: |
|
91 |
+ req = InstallRequirement.from_line(dist.key, None) |
|
92 |
+ try: |
|
93 |
+ link = finder.find_requirement(req, True) |
|
94 |
+ |
|
95 |
+ # If link is None, means installed version is most up-to-date |
|
96 |
+ if link is None: |
|
97 |
+ continue |
|
98 |
+ except DistributionNotFound: |
|
99 |
+ continue |
|
100 |
+ except BestVersionAlreadyInstalled: |
|
101 |
+ remote_version = req.installed_version |
|
102 |
+ else: |
|
103 |
+ # It might be a good idea that link or finder had a public method |
|
104 |
+ # that returned version |
|
105 |
+ remote_version = finder._link_package_versions(link, req.name)[0] |
|
106 |
+ remote_version_raw = remote_version[2] |
|
107 |
+ remote_version_parsed = remote_version[0] |
|
108 |
+ yield dist, remote_version_raw, remote_version_parsed |
|
109 |
+ |
|
110 |
+ def run_listing(self, options): |
|
111 |
+ installed_packages = get_installed_distributions(local_only=options.local) |
|
112 |
+ self.output_package_listing(installed_packages) |
|
113 |
+ |
|
114 |
+ def run_editables(self, options): |
|
115 |
+ installed_packages = get_installed_distributions(local_only=options.local, editables_only=True) |
|
116 |
+ self.output_package_listing(installed_packages) |
|
117 |
+ |
|
118 |
+ def output_package_listing(self, installed_packages): |
|
119 |
+ installed_packages = sorted(installed_packages, key=lambda dist: dist.project_name.lower()) |
|
120 |
+ for dist in installed_packages: |
|
121 |
+ if dist_is_editable(dist): |
|
122 |
+ line = '%s (%s, %s)' % (dist.project_name, dist.version, dist.location) |
|
123 |
+ else: |
|
124 |
+ line = '%s (%s)' % (dist.project_name, dist.version) |
|
125 |
+ logger.notify(line) |
|
126 |
+ |
|
127 |
+ def run_uptodate(self, options): |
|
128 |
+ uptodate = [] |
|
129 |
+ for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): |
|
130 |
+ if dist.parsed_version == remote_version_parsed: |
|
131 |
+ uptodate.append(dist) |
|
132 |
+ self.output_package_listing(uptodate) |
2 | 135 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,130 @@ |
1 |
+import sys |
|
2 |
+import textwrap |
|
3 |
+import pkg_resources |
|
4 |
+import pip.download |
|
5 |
+from pip.basecommand import Command, SUCCESS |
|
6 |
+from pip.util import get_terminal_size |
|
7 |
+from pip.log import logger |
|
8 |
+from pip.backwardcompat import xmlrpclib, reduce, cmp |
|
9 |
+from pip.exceptions import CommandError |
|
10 |
+from pip.status_codes import NO_MATCHES_FOUND |
|
11 |
+from distutils.version import StrictVersion, LooseVersion |
|
12 |
+ |
|
13 |
+ |
|
14 |
+class SearchCommand(Command): |
|
15 |
+ """Search for PyPI packages whose name or summary contains <query>.""" |
|
16 |
+ name = 'search' |
|
17 |
+ usage = """ |
|
18 |
+ %prog [options] <query>""" |
|
19 |
+ summary = 'Search PyPI for packages.' |
|
20 |
+ |
|
21 |
+ def __init__(self, *args, **kw): |
|
22 |
+ super(SearchCommand, self).__init__(*args, **kw) |
|
23 |
+ self.cmd_opts.add_option( |
|
24 |
+ '--index', |
|
25 |
+ dest='index', |
|
26 |
+ metavar='URL', |
|
27 |
+ default='https://pypi.python.org/pypi', |
|
28 |
+ help='Base URL of Python Package Index (default %default)') |
|
29 |
+ |
|
30 |
+ self.parser.insert_option_group(0, self.cmd_opts) |
|
31 |
+ |
|
32 |
+ def run(self, options, args): |
|
33 |
+ if not args: |
|
34 |
+ raise CommandError('Missing required argument (search query).') |
|
35 |
+ query = args |
|
36 |
+ index_url = options.index |
|
37 |
+ |
|
38 |
+ pypi_hits = self.search(query, index_url) |
|
39 |
+ hits = transform_hits(pypi_hits) |
|
40 |
+ |
|
41 |
+ terminal_width = None |
|
42 |
+ if sys.stdout.isatty(): |
|
43 |
+ terminal_width = get_terminal_size()[0] |
|
44 |
+ |
|
45 |
+ print_results(hits, terminal_width=terminal_width) |
|
46 |
+ if pypi_hits: |
|
47 |
+ return SUCCESS |
|
48 |
+ return NO_MATCHES_FOUND |
|
49 |
+ |
|
50 |
+ def search(self, query, index_url): |
|
51 |
+ pypi = xmlrpclib.ServerProxy(index_url, pip.download.xmlrpclib_transport) |
|
52 |
+ hits = pypi.search({'name': query, 'summary': query}, 'or') |
|
53 |
+ return hits |
|
54 |
+ |
|
55 |
+ |
|
56 |
+def transform_hits(hits): |
|
57 |
+ """ |
|
58 |
+ The list from pypi is really a list of versions. We want a list of |
|
59 |
+ packages with the list of versions stored inline. This converts the |
|
60 |
+ list from pypi into one we can use. |
|
61 |
+ """ |
|
62 |
+ packages = {} |
|
63 |
+ for hit in hits: |
|
64 |
+ name = hit['name'] |
|
65 |
+ summary = hit['summary'] |
|
66 |
+ version = hit['version'] |
|
67 |
+ score = hit['_pypi_ordering'] |
|
68 |
+ if score is None: |
|
69 |
+ score = 0 |
|
70 |
+ |
|
71 |
+ if name not in packages.keys(): |
|
72 |
+ packages[name] = {'name': name, 'summary': summary, 'versions': [version], 'score': score} |
|
73 |
+ else: |
|
74 |
+ packages[name]['versions'].append(version) |
|
75 |
+ |
|
76 |
+ # if this is the highest version, replace summary and score |
|
77 |
+ if version == highest_version(packages[name]['versions']): |
|
78 |
+ packages[name]['summary'] = summary |
|
79 |
+ packages[name]['score'] = score |
|
80 |
+ |
|
81 |
+ # each record has a unique name now, so we will convert the dict into a list sorted by score |
|
82 |
+ package_list = sorted(packages.values(), key=lambda x: x['score'], reverse=True) |
|
83 |
+ return package_list |
|
84 |
+ |
|
85 |
+ |
|
86 |
+def print_results(hits, name_column_width=25, terminal_width=None): |
|
87 |
+ installed_packages = [p.project_name for p in pkg_resources.working_set] |
|
88 |
+ for hit in hits: |
|
89 |
+ name = hit['name'] |
|
90 |
+ summary = hit['summary'] or '' |
|
91 |
+ if terminal_width is not None: |
|
92 |
+ # wrap and indent summary to fit terminal |
|
93 |
+ summary = textwrap.wrap(summary, terminal_width - name_column_width - 5) |
|
94 |
+ summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) |
|
95 |
+ line = '%s - %s' % (name.ljust(name_column_width), summary) |
|
96 |
+ try: |
|
97 |
+ logger.notify(line) |
|
98 |
+ if name in installed_packages: |
|
99 |
+ dist = pkg_resources.get_distribution(name) |
|
100 |
+ logger.indent += 2 |
|
101 |
+ try: |
|
102 |
+ latest = highest_version(hit['versions']) |
|
103 |
+ if dist.version == latest: |
|
104 |
+ logger.notify('INSTALLED: %s (latest)' % dist.version) |
|
105 |
+ else: |
|
106 |
+ logger.notify('INSTALLED: %s' % dist.version) |
|
107 |
+ logger.notify('LATEST: %s' % latest) |
|
108 |
+ finally: |
|
109 |
+ logger.indent -= 2 |
|
110 |
+ except UnicodeEncodeError: |
|
111 |
+ pass |
|
112 |
+ |
|
113 |
+ |
|
114 |
+def compare_versions(version1, version2): |
|
115 |
+ try: |
|
116 |
+ return cmp(StrictVersion(version1), StrictVersion(version2)) |
|
117 |
+ # in case of abnormal version number, fall back to LooseVersion |
|
118 |
+ except ValueError: |
|
119 |
+ pass |
|
120 |
+ try: |
|
121 |
+ return cmp(LooseVersion(version1), LooseVersion(version2)) |
|
122 |
+ except TypeError: |
|
123 |
+ # certain LooseVersion comparions raise due to unorderable types, |
|
124 |
+ # fallback to string comparison |
|
125 |
+ return cmp([str(v) for v in LooseVersion(version1).version], |
|
126 |
+ [str(v) for v in LooseVersion(version2).version]) |
|
127 |
+ |
|
128 |
+ |
|
129 |
+def highest_version(versions): |
|
130 |
+ return reduce((lambda v1, v2: compare_versions(v1, v2) == 1 and v1 or v2), versions) |
2 | 133 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,79 @@ |
1 |
+import os |
|
2 |
+import pkg_resources |
|
3 |
+from pip.basecommand import Command |
|
4 |
+from pip.log import logger |
|
5 |
+ |
|
6 |
+ |
|
7 |
+class ShowCommand(Command): |
|
8 |
+ """Show information about one or more installed packages.""" |
|
9 |
+ name = 'show' |
|
10 |
+ usage = """ |
|
11 |
+ %prog [options] <package> ...""" |
|
12 |
+ summary = 'Show information about installed packages.' |
|
13 |
+ |
|
14 |
+ def __init__(self, *args, **kw): |
|
15 |
+ super(ShowCommand, self).__init__(*args, **kw) |
|
16 |
+ self.cmd_opts.add_option( |
|
17 |
+ '-f', '--files', |
|
18 |
+ dest='files', |
|
19 |
+ action='store_true', |
|
20 |
+ default=False, |
|
21 |
+ help='Show the full list of installed files for each package.') |
|
22 |
+ |
|
23 |
+ self.parser.insert_option_group(0, self.cmd_opts) |
|
24 |
+ |
|
25 |
+ def run(self, options, args): |
|
26 |
+ if not args: |
|
27 |
+ logger.warn('ERROR: Please provide a package name or names.') |
|
28 |
+ return |
|
29 |
+ query = args |
|
30 |
+ |
|
31 |
+ results = search_packages_info(query) |
|
32 |
+ print_results(results, options.files) |
|
33 |
+ |
|
34 |
+ |
|
35 |
+def search_packages_info(query): |
|
36 |
+ """ |
|
37 |
+ Gather details from installed distributions. Print distribution name, |
|
38 |
+ version, location, and installed files. Installed files requires a |
|
39 |
+ pip generated 'installed-files.txt' in the distributions '.egg-info' |
|
40 |
+ directory. |
|
41 |
+ """ |
|
42 |
+ installed_packages = dict( |
|
43 |
+ [(p.project_name.lower(), p) for p in pkg_resources.working_set]) |
|
44 |
+ for name in query: |
|
45 |
+ normalized_name = name.lower() |
|
46 |
+ if normalized_name in installed_packages: |
|
47 |
+ dist = installed_packages[normalized_name] |
|
48 |
+ package = { |
|
49 |
+ 'name': dist.project_name, |
|
50 |
+ 'version': dist.version, |
|
51 |
+ 'location': dist.location, |
|
52 |
+ 'requires': [dep.project_name for dep in dist.requires()], |
|
53 |
+ } |
|
54 |
+ filelist = os.path.join( |
|
55 |
+ dist.location, |
|
56 |
+ dist.egg_name() + '.egg-info', |
|
57 |
+ 'installed-files.txt') |
|
58 |
+ if os.path.isfile(filelist): |
|
59 |
+ package['files'] = filelist |
|
60 |
+ yield package |
|
61 |
+ |
|
62 |
+ |
|
63 |
+def print_results(distributions, list_all_files): |
|
64 |
+ """ |
|
65 |
+ Print the informations from installed distributions found. |
|
66 |
+ """ |
|
67 |
+ for dist in distributions: |
|
68 |
+ logger.notify("---") |
|
69 |
+ logger.notify("Name: %s" % dist['name']) |
|
70 |
+ logger.notify("Version: %s" % dist['version']) |
|
71 |
+ logger.notify("Location: %s" % dist['location']) |
|
72 |
+ logger.notify("Requires: %s" % ', '.join(dist['requires'])) |
|
73 |
+ if list_all_files: |
|
74 |
+ logger.notify("Files:") |
|
75 |
+ if 'files' in dist: |
|
76 |
+ for line in open(dist['files']): |
|
77 |
+ logger.notify(" %s" % line.strip()) |
|
78 |
+ else: |
|
79 |
+ logger.notify("Cannot locate installed-files.txt") |
2 | 82 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,54 @@ |
1 |
+from pip.req import InstallRequirement, RequirementSet, parse_requirements |
|
2 |
+from pip.basecommand import Command |
|
3 |
+from pip.exceptions import InstallationError |
|
4 |
+ |
|
5 |
+ |
|
6 |
+class UninstallCommand(Command): |
|
7 |
+ """ |
|
8 |
+ Uninstall packages. |
|
9 |
+ |
|
10 |
+ pip is able to uninstall most installed packages. Known exceptions are: |
|
11 |
+ |
|
12 |
+ - Pure distutils packages installed with ``python setup.py install``, which |
|
13 |
+ leave behind no metadata to determine what files were installed. |
|
14 |
+ - Script wrappers installed by ``python setup.py develop``. |
|
15 |
+ """ |
|
16 |
+ name = 'uninstall' |
|
17 |
+ usage = """ |
|
18 |
+ %prog [options] <package> ... |
|
19 |
+ %prog [options] -r <requirements file> ...""" |
|
20 |
+ summary = 'Uninstall packages.' |
|
21 |
+ |
|
22 |
+ def __init__(self, *args, **kw): |
|
23 |
+ super(UninstallCommand, self).__init__(*args, **kw) |
|
24 |
+ self.cmd_opts.add_option( |
|
25 |
+ '-r', '--requirement', |
|
26 |
+ dest='requirements', |
|
27 |
+ action='append', |
|
28 |
+ default=[], |
|
29 |
+ metavar='file', |
|
30 |
+ help='Uninstall all the packages listed in the given requirements file. ' |
|
31 |
+ 'This option can be used multiple times.') |
|
32 |
+ self.cmd_opts.add_option( |
|
33 |
+ '-y', '--yes', |
|
34 |
+ dest='yes', |
|
35 |
+ action='store_true', |
|
36 |
+ help="Don't ask for confirmation of uninstall deletions.") |
|
37 |
+ |
|
38 |
+ self.parser.insert_option_group(0, self.cmd_opts) |
|
39 |
+ |
|
40 |
+ def run(self, options, args): |
|
41 |
+ requirement_set = RequirementSet( |
|
42 |
+ build_dir=None, |
|
43 |
+ src_dir=None, |
|
44 |
+ download_dir=None) |
|
45 |
+ for name in args: |
|
46 |
+ requirement_set.add_requirement( |
|
47 |
+ InstallRequirement.from_line(name)) |
|
48 |
+ for filename in options.requirements: |
|
49 |
+ for req in parse_requirements(filename, options=options): |
|
50 |
+ requirement_set.add_requirement(req) |
|
51 |
+ if not requirement_set.has_requirements: |
|
52 |
+ raise InstallationError('You must give at least one requirement ' |
|
53 |
+ 'to %(name)s (see "pip help %(name)s")' % dict(name=self.name)) |
|
54 |
+ requirement_set.uninstall(auto_confirm=options.yes) |
2 | 10 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,347 @@ |
1 |
+import sys |
|
2 |
+import re |
|
3 |
+import fnmatch |
|
4 |
+import os |
|
5 |
+import shutil |
|
6 |
+import zipfile |
|
7 |
+from pip.util import display_path, backup_dir, rmtree |
|
8 |
+from pip.log import logger |
|
9 |
+from pip.exceptions import InstallationError |
|
10 |
+from pip.basecommand import Command |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class ZipCommand(Command): |
|
14 |
+ """Zip individual packages.""" |
|
15 |
+ name = 'zip' |
|
16 |
+ usage = """ |
|
17 |
+ %prog [options] <package> ...""" |
|
18 |
+ summary = 'Zip individual packages.' |
|
19 |
+ |
|
20 |
+ def __init__(self, *args, **kw): |
|
21 |
+ super(ZipCommand, self).__init__(*args, **kw) |
|
22 |
+ if self.name == 'zip': |
|
23 |
+ self.cmd_opts.add_option( |
|
24 |
+ '--unzip', |
|
25 |
+ action='store_true', |
|
26 |
+ dest='unzip', |
|
27 |
+ help='Unzip (rather than zip) a package.') |
|
28 |
+ else: |
|
29 |
+ self.cmd_opts.add_option( |
|
30 |
+ '--zip', |
|
31 |
+ action='store_false', |
|
32 |
+ dest='unzip', |
|
33 |
+ default=True, |
|
34 |
+ help='Zip (rather than unzip) a package.') |
|
35 |
+ self.cmd_opts.add_option( |
|
36 |
+ '--no-pyc', |
|
37 |
+ action='store_true', |
|
38 |
+ dest='no_pyc', |
|
39 |
+ help='Do not include .pyc files in zip files (useful on Google App Engine).') |
|
40 |
+ self.cmd_opts.add_option( |
|
41 |
+ '-l', '--list', |
|
42 |
+ action='store_true', |
|
43 |
+ dest='list', |
|
44 |
+ help='List the packages available, and their zip status.') |
|
45 |
+ self.cmd_opts.add_option( |
|
46 |
+ '--sort-files', |
|
47 |
+ action='store_true', |
|
48 |
+ dest='sort_files', |
|
49 |
+ help='With --list, sort packages according to how many files they contain.') |
|
50 |
+ self.cmd_opts.add_option( |
|
51 |
+ '--path', |
|
52 |
+ action='append', |
|
53 |
+ dest='paths', |
|
54 |
+ help='Restrict operations to the given paths (may include wildcards).') |
|
55 |
+ self.cmd_opts.add_option( |
|
56 |
+ '-n', '--simulate', |
|
57 |
+ action='store_true', |
|
58 |
+ help='Do not actually perform the zip/unzip operation.') |
|
59 |
+ |
|
60 |
+ self.parser.insert_option_group(0, self.cmd_opts) |
|
61 |
+ |
|
62 |
+ def paths(self): |
|
63 |
+ """All the entries of sys.path, possibly restricted by --path""" |
|
64 |
+ if not self.select_paths: |
|
65 |
+ return sys.path |
|
66 |
+ result = [] |
|
67 |
+ match_any = set() |
|
68 |
+ for path in sys.path: |
|
69 |
+ path = os.path.normcase(os.path.abspath(path)) |
|
70 |
+ for match in self.select_paths: |
|
71 |
+ match = os.path.normcase(os.path.abspath(match)) |
|
72 |
+ if '*' in match: |
|
73 |
+ if re.search(fnmatch.translate(match + '*'), path): |
|
74 |
+ result.append(path) |
|
75 |
+ match_any.add(match) |
|
76 |
+ break |
|
77 |
+ else: |
|
78 |
+ if path.startswith(match): |
|
79 |
+ result.append(path) |
|
80 |
+ match_any.add(match) |
|
81 |
+ break |
|
82 |
+ else: |
|
83 |
+ logger.debug("Skipping path %s because it doesn't match %s" |
|
84 |
+ % (path, ', '.join(self.select_paths))) |
|
85 |
+ for match in self.select_paths: |
|
86 |
+ if match not in match_any and '*' not in match: |
|
87 |
+ result.append(match) |
|
88 |
+ logger.debug("Adding path %s because it doesn't match " |
|
89 |
+ "anything already on sys.path" % match) |
|
90 |
+ return result |
|
91 |
+ |
|
92 |
+ def run(self, options, args): |
|
93 |
+ self.select_paths = options.paths |
|
94 |
+ self.simulate = options.simulate |
|
95 |
+ if options.list: |
|
96 |
+ return self.list(options, args) |
|
97 |
+ if not args: |
|
98 |
+ raise InstallationError( |
|
99 |
+ 'You must give at least one package to zip or unzip') |
|
100 |
+ packages = [] |
|
101 |
+ for arg in args: |
|
102 |
+ module_name, filename = self.find_package(arg) |
|
103 |
+ if options.unzip and os.path.isdir(filename): |
|
104 |
+ raise InstallationError( |
|
105 |
+ 'The module %s (in %s) is not a zip file; cannot be unzipped' |
|
106 |
+ % (module_name, filename)) |
|
107 |
+ elif not options.unzip and not os.path.isdir(filename): |
|
108 |
+ raise InstallationError( |
|
109 |
+ 'The module %s (in %s) is not a directory; cannot be zipped' |
|
110 |
+ % (module_name, filename)) |
|
111 |
+ packages.append((module_name, filename)) |
|
112 |
+ last_status = None |
|
113 |
+ for module_name, filename in packages: |
|
114 |
+ if options.unzip: |
|
115 |
+ last_status = self.unzip_package(module_name, filename) |
|
116 |
+ else: |
|
117 |
+ last_status = self.zip_package(module_name, filename, options.no_pyc) |
|
118 |
+ return last_status |
|
119 |
+ |
|
120 |
+ def unzip_package(self, module_name, filename): |
|
121 |
+ zip_filename = os.path.dirname(filename) |
|
122 |
+ if not os.path.isfile(zip_filename) and zipfile.is_zipfile(zip_filename): |
|
123 |
+ raise InstallationError( |
|
124 |
+ 'Module %s (in %s) isn\'t located in a zip file in %s' |
|
125 |
+ % (module_name, filename, zip_filename)) |
|
126 |
+ package_path = os.path.dirname(zip_filename) |
|
127 |
+ if not package_path in self.paths(): |
|
128 |
+ logger.warn( |
|
129 |
+ 'Unpacking %s into %s, but %s is not on sys.path' |
|
130 |
+ % (display_path(zip_filename), display_path(package_path), |
|
131 |
+ display_path(package_path))) |
|
132 |
+ logger.notify('Unzipping %s (in %s)' % (module_name, display_path(zip_filename))) |
|
133 |
+ if self.simulate: |
|
134 |
+ logger.notify('Skipping remaining operations because of --simulate') |
|
135 |
+ return |
|
136 |
+ logger.indent += 2 |
|
137 |
+ try: |
|
138 |
+ ## FIXME: this should be undoable: |
|
139 |
+ zip = zipfile.ZipFile(zip_filename) |
|
140 |
+ to_save = [] |
|
141 |
+ for name in zip.namelist(): |
|
142 |
+ if name.startswith(module_name + os.path.sep): |
|
143 |
+ content = zip.read(name) |
|
144 |
+ dest = os.path.join(package_path, name) |
|
145 |
+ if not os.path.exists(os.path.dirname(dest)): |
|
146 |
+ os.makedirs(os.path.dirname(dest)) |
|
147 |
+ if not content and dest.endswith(os.path.sep): |
|
148 |
+ if not os.path.exists(dest): |
|
149 |
+ os.makedirs(dest) |
|
150 |
+ else: |
|
151 |
+ f = open(dest, 'wb') |
|
152 |
+ f.write(content) |
|
153 |
+ f.close() |
|
154 |
+ else: |
|
155 |
+ to_save.append((name, zip.read(name))) |
|
156 |
+ zip.close() |
|
157 |
+ if not to_save: |
|
158 |
+ logger.info('Removing now-empty zip file %s' % display_path(zip_filename)) |
|
159 |
+ os.unlink(zip_filename) |
|
160 |
+ self.remove_filename_from_pth(zip_filename) |
|
161 |
+ else: |
|
162 |
+ logger.info('Removing entries in %s/ from zip file %s' % (module_name, display_path(zip_filename))) |
|
163 |
+ zip = zipfile.ZipFile(zip_filename, 'w') |
|
164 |
+ for name, content in to_save: |
|
165 |
+ zip.writestr(name, content) |
|
166 |
+ zip.close() |
|
167 |
+ finally: |
|
168 |
+ logger.indent -= 2 |
|
169 |
+ |
|
170 |
+ def zip_package(self, module_name, filename, no_pyc): |
|
171 |
+ orig_filename = filename |
|
172 |
+ logger.notify('Zip %s (in %s)' % (module_name, display_path(filename))) |
|
173 |
+ logger.indent += 2 |
|
174 |
+ if filename.endswith('.egg'): |
|
175 |
+ dest_filename = filename |
|
176 |
+ else: |
|
177 |
+ dest_filename = filename + '.zip' |
|
178 |
+ try: |
|
179 |
+ ## FIXME: I think this needs to be undoable: |
|
180 |
+ if filename == dest_filename: |
|
181 |
+ filename = backup_dir(orig_filename) |
|
182 |
+ logger.notify('Moving %s aside to %s' % (orig_filename, filename)) |
|
183 |
+ if not self.simulate: |
|
184 |
+ shutil.move(orig_filename, filename) |
|
185 |
+ try: |
|
186 |
+ logger.info('Creating zip file in %s' % display_path(dest_filename)) |
|
187 |
+ if not self.simulate: |
|
188 |
+ zip = zipfile.ZipFile(dest_filename, 'w') |
|
189 |
+ zip.writestr(module_name + '/', '') |
|
190 |
+ for dirpath, dirnames, filenames in os.walk(filename): |
|
191 |
+ if no_pyc: |
|
192 |
+ filenames = [f for f in filenames |
|
193 |
+ if not f.lower().endswith('.pyc')] |
|
194 |
+ for fns, is_dir in [(dirnames, True), (filenames, False)]: |
|
195 |
+ for fn in fns: |
|
196 |
+ full = os.path.join(dirpath, fn) |
|
197 |
+ dest = os.path.join(module_name, dirpath[len(filename):].lstrip(os.path.sep), fn) |
|
198 |
+ if is_dir: |
|
199 |
+ zip.writestr(dest + '/', '') |
|
200 |
+ else: |
|
201 |
+ zip.write(full, dest) |
|
202 |
+ zip.close() |
|
203 |
+ logger.info('Removing old directory %s' % display_path(filename)) |
|
204 |
+ if not self.simulate: |
|
205 |
+ rmtree(filename) |
|
206 |
+ except: |
|
207 |
+ ## FIXME: need to do an undo here |
|
208 |
+ raise |
|
209 |
+ ## FIXME: should also be undone: |
|
210 |
+ self.add_filename_to_pth(dest_filename) |
|
211 |
+ finally: |
|
212 |
+ logger.indent -= 2 |
|
213 |
+ |
|
214 |
+ def remove_filename_from_pth(self, filename): |
|
215 |
+ for pth in self.pth_files(): |
|
216 |
+ f = open(pth, 'r') |
|
217 |
+ lines = f.readlines() |
|
218 |
+ f.close() |
|
219 |
+ new_lines = [ |
|
220 |
+ l for l in lines if l.strip() != filename] |
|
221 |
+ if lines != new_lines: |
|
222 |
+ logger.info('Removing reference to %s from .pth file %s' |
|
223 |
+ % (display_path(filename), display_path(pth))) |
|
224 |
+ if not [line for line in new_lines if line]: |
|
225 |
+ logger.info('%s file would be empty: deleting' % display_path(pth)) |
|
226 |
+ if not self.simulate: |
|
227 |
+ os.unlink(pth) |
|
228 |
+ else: |
|
229 |
+ if not self.simulate: |
|
230 |
+ f = open(pth, 'wb') |
|
231 |
+ f.writelines(new_lines) |
|
232 |
+ f.close() |
|
233 |
+ return |
|
234 |
+ logger.warn('Cannot find a reference to %s in any .pth file' % display_path(filename)) |
|
235 |
+ |
|
236 |
+ def add_filename_to_pth(self, filename): |
|
237 |
+ path = os.path.dirname(filename) |
|
238 |
+ dest = filename + '.pth' |
|
239 |
+ if path not in self.paths(): |
|
240 |
+ logger.warn('Adding .pth file %s, but it is not on sys.path' % display_path(dest)) |
|
241 |
+ if not self.simulate: |
|
242 |
+ if os.path.exists(dest): |
|
243 |
+ f = open(dest) |
|
244 |
+ lines = f.readlines() |
|
245 |
+ f.close() |
|
246 |
+ if lines and not lines[-1].endswith('\n'): |
|
247 |
+ lines[-1] += '\n' |
|
248 |
+ lines.append(filename + '\n') |
|
249 |
+ else: |
|
250 |
+ lines = [filename + '\n'] |
|
251 |
+ f = open(dest, 'wb') |
|
252 |
+ f.writelines(lines) |
|
253 |
+ f.close() |
|
254 |
+ |
|
255 |
+ def pth_files(self): |
|
256 |
+ for path in self.paths(): |
|
257 |
+ if not os.path.exists(path) or not os.path.isdir(path): |
|
258 |
+ continue |
|
259 |
+ for filename in os.listdir(path): |
|
260 |
+ if filename.endswith('.pth'): |
|
261 |
+ yield os.path.join(path, filename) |
|
262 |
+ |
|
263 |
+ def find_package(self, package): |
|
264 |
+ for path in self.paths(): |
|
265 |
+ full = os.path.join(path, package) |
|
266 |
+ if os.path.exists(full): |
|
267 |
+ return package, full |
|
268 |
+ if not os.path.isdir(path) and zipfile.is_zipfile(path): |
|
269 |
+ zip = zipfile.ZipFile(path, 'r') |
|
270 |
+ try: |
|
271 |
+ zip.read(os.path.join(package, '__init__.py')) |
|
272 |
+ except KeyError: |
|
273 |
+ pass |
|
274 |
+ else: |
|
275 |
+ zip.close() |
|
276 |
+ return package, full |
|
277 |
+ zip.close() |
|
278 |
+ ## FIXME: need special error for package.py case: |
|
279 |
+ raise InstallationError( |
|
280 |
+ 'No package with the name %s found' % package) |
|
281 |
+ |
|
282 |
+ def list(self, options, args): |
|
283 |
+ if args: |
|
284 |
+ raise InstallationError( |
|
285 |
+ 'You cannot give an argument with --list') |
|
286 |
+ for path in sorted(self.paths()): |
|
287 |
+ if not os.path.exists(path): |
|
288 |
+ continue |
|
289 |
+ basename = os.path.basename(path.rstrip(os.path.sep)) |
|
290 |
+ if os.path.isfile(path) and zipfile.is_zipfile(path): |
|
291 |
+ if os.path.dirname(path) not in self.paths(): |
|
292 |
+ logger.notify('Zipped egg: %s' % display_path(path)) |
|
293 |
+ continue |
|
294 |
+ if (basename != 'site-packages' and basename != 'dist-packages' |
|
295 |
+ and not path.replace('\\', '/').endswith('lib/python')): |
|
296 |
+ continue |
|
297 |
+ logger.notify('In %s:' % display_path(path)) |
|
298 |
+ logger.indent += 2 |
|
299 |
+ zipped = [] |
|
300 |
+ unzipped = [] |
|
301 |
+ try: |
|
302 |
+ for filename in sorted(os.listdir(path)): |
|
303 |
+ ext = os.path.splitext(filename)[1].lower() |
|
304 |
+ if ext in ('.pth', '.egg-info', '.egg-link'): |
|
305 |
+ continue |
|
306 |
+ if ext == '.py': |
|
307 |
+ logger.info('Not displaying %s: not a package' % display_path(filename)) |
|
308 |
+ continue |
|
309 |
+ full = os.path.join(path, filename) |
|
310 |
+ if os.path.isdir(full): |
|
311 |
+ unzipped.append((filename, self.count_package(full))) |
|
312 |
+ elif zipfile.is_zipfile(full): |
|
313 |
+ zipped.append(filename) |
|
314 |
+ else: |
|
315 |
+ logger.info('Unknown file: %s' % display_path(filename)) |
|
316 |
+ if zipped: |
|
317 |
+ logger.notify('Zipped packages:') |
|
318 |
+ logger.indent += 2 |
|
319 |
+ try: |
|
320 |
+ for filename in zipped: |
|
321 |
+ logger.notify(filename) |
|
322 |
+ finally: |
|
323 |
+ logger.indent -= 2 |
|
324 |
+ else: |
|
325 |
+ logger.notify('No zipped packages.') |
|
326 |
+ if unzipped: |
|
327 |
+ if options.sort_files: |
|
328 |
+ unzipped.sort(key=lambda x: -x[1]) |
|
329 |
+ logger.notify('Unzipped packages:') |
|
330 |
+ logger.indent += 2 |
|
331 |
+ try: |
|
332 |
+ for filename, count in unzipped: |
|
333 |
+ logger.notify('%s (%i files)' % (filename, count)) |
|
334 |
+ finally: |
|
335 |
+ logger.indent -= 2 |
|
336 |
+ else: |
|
337 |
+ logger.notify('No unzipped packages.') |
|
338 |
+ finally: |
|
339 |
+ logger.indent -= 2 |
|
340 |
+ |
|
341 |
+ def count_package(self, path): |
|
342 |
+ total = 0 |
|
343 |
+ for dirpath, dirnames, filenames in os.walk(path): |
|
344 |
+ filenames = [f for f in filenames |
|
345 |
+ if not f.lower().endswith('.pyc')] |
|
346 |
+ total += len(filenames) |
|
347 |
+ return total |
2 | 350 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,584 @@ |
1 |
+import cgi |
|
2 |
+import getpass |
|
3 |
+import hashlib |
|
4 |
+import mimetypes |
|
5 |
+import os |
|
6 |
+import re |
|
7 |
+import shutil |
|
8 |
+import socket |
|
9 |
+import sys |
|
10 |
+import tempfile |
|
11 |
+ |
|
12 |
+from pip.backwardcompat import (xmlrpclib, urllib, urllib2, httplib, |
|
13 |
+ urlparse, string_types, ssl) |
|
14 |
+if ssl: |
|
15 |
+ from pip.backwardcompat import match_hostname, CertificateError |
|
16 |
+from pip.exceptions import InstallationError, PipError, NoSSLError |
|
17 |
+from pip.util import (splitext, rmtree, format_size, display_path, |
|
18 |
+ backup_dir, ask_path_exists, unpack_file, |
|
19 |
+ create_download_cache_folder, cache_download) |
|
20 |
+from pip.vcs import vcs |
|
21 |
+from pip.log import logger |
|
22 |
+from pip.locations import default_cert_path |
|
23 |
+ |
|
24 |
+__all__ = ['xmlrpclib_transport', 'get_file_content', 'urlopen', |
|
25 |
+ 'is_url', 'url_to_path', 'path_to_url', 'path_to_url2', |
|
26 |
+ 'geturl', 'is_archive_file', 'unpack_vcs_link', |
|
27 |
+ 'unpack_file_url', 'is_vcs_url', 'is_file_url', 'unpack_http_url'] |
|
28 |
+ |
|
29 |
+ |
|
30 |
+xmlrpclib_transport = xmlrpclib.Transport() |
|
31 |
+ |
|
32 |
+ |
|
33 |
+def get_file_content(url, comes_from=None): |
|
34 |
+ """Gets the content of a file; it may be a filename, file: URL, or |
|
35 |
+ http: URL. Returns (location, content)""" |
|
36 |
+ match = _scheme_re.search(url) |
|
37 |
+ if match: |
|
38 |
+ scheme = match.group(1).lower() |
|
39 |
+ if (scheme == 'file' and comes_from |
|
40 |
+ and comes_from.startswith('http')): |
|
41 |
+ raise InstallationError( |
|
42 |
+ 'Requirements file %s references URL %s, which is local' |
|
43 |
+ % (comes_from, url)) |
|
44 |
+ if scheme == 'file': |
|
45 |
+ path = url.split(':', 1)[1] |
|
46 |
+ path = path.replace('\\', '/') |
|
47 |
+ match = _url_slash_drive_re.match(path) |
|
48 |
+ if match: |
|
49 |
+ path = match.group(1) + ':' + path.split('|', 1)[1] |
|
50 |
+ path = urllib.unquote(path) |
|
51 |
+ if path.startswith('/'): |
|
52 |
+ path = '/' + path.lstrip('/') |
|
53 |
+ url = path |
|
54 |
+ else: |
|
55 |
+ ## FIXME: catch some errors |
|
56 |
+ resp = urlopen(url) |
|
57 |
+ return geturl(resp), resp.read() |
|
58 |
+ try: |
|
59 |
+ f = open(url) |
|
60 |
+ content = f.read() |
|
61 |
+ except IOError: |
|
62 |
+ e = sys.exc_info()[1] |
|
63 |
+ raise InstallationError('Could not open requirements file: %s' % str(e)) |
|
64 |
+ else: |
|
65 |
+ f.close() |
|
66 |
+ return url, content |
|
67 |
+ |
|
68 |
+ |
|
69 |
+_scheme_re = re.compile(r'^(http|https|file):', re.I) |
|
70 |
+_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) |
|
71 |
+ |
|
72 |
+class VerifiedHTTPSConnection(httplib.HTTPSConnection): |
|
73 |
+ """ |
|
74 |
+ A connection that wraps connections with ssl certificate verification. |
|
75 |
+ """ |
|
76 |
+ def connect(self): |
|
77 |
+ |
|
78 |
+ self.connection_kwargs = {} |
|
79 |
+ |
|
80 |
+ #TODO: refactor compatibility logic into backwardcompat? |
|
81 |
+ |
|
82 |
+ # for > py2.5 |
|
83 |
+ if hasattr(self, 'timeout'): |
|
84 |
+ self.connection_kwargs.update(timeout = self.timeout) |
|
85 |
+ |
|
86 |
+ # for >= py2.7 |
|
87 |
+ if hasattr(self, 'source_address'): |
|
88 |
+ self.connection_kwargs.update(source_address = self.source_address) |
|
89 |
+ |
|
90 |
+ sock = socket.create_connection((self.host, self.port), **self.connection_kwargs) |
|
91 |
+ |
|
92 |
+ # for >= py2.7 |
|
93 |
+ if getattr(self, '_tunnel_host', None): |
|
94 |
+ self.sock = sock |
|
95 |
+ self._tunnel() |
|
96 |
+ |
|
97 |
+ # get alternate bundle or use our included bundle |
|
98 |
+ cert_path = os.environ.get('PIP_CERT', '') or default_cert_path |
|
99 |
+ |
|
100 |
+ self.sock = ssl.wrap_socket(sock, |
|
101 |
+ self.key_file, |
|
102 |
+ self.cert_file, |
|
103 |
+ cert_reqs=ssl.CERT_REQUIRED, |
|
104 |
+ ca_certs=cert_path) |
|
105 |
+ |
|
106 |
+ try: |
|
107 |
+ match_hostname(self.sock.getpeercert(), self.host) |
|
108 |
+ except CertificateError: |
|
109 |
+ self.sock.shutdown(socket.SHUT_RDWR) |
|
110 |
+ self.sock.close() |
|
111 |
+ raise |
|
112 |
+ |
|
113 |
+ |
|
114 |
+ |
|
115 |
+class VerifiedHTTPSHandler(urllib2.HTTPSHandler): |
|
116 |
+ """ |
|
117 |
+ A HTTPSHandler that uses our own VerifiedHTTPSConnection. |
|
118 |
+ """ |
|
119 |
+ def __init__(self, connection_class = VerifiedHTTPSConnection): |
|
120 |
+ self.specialized_conn_class = connection_class |
|
121 |
+ urllib2.HTTPSHandler.__init__(self) |
|
122 |
+ def https_open(self, req): |
|
123 |
+ return self.do_open(self.specialized_conn_class, req) |
|
124 |
+ |
|
125 |
+ |
|
126 |
+class URLOpener(object): |
|
127 |
+ """ |
|
128 |
+ pip's own URL helper that adds HTTP auth and proxy support |
|
129 |
+ """ |
|
130 |
+ def __init__(self): |
|
131 |
+ self.passman = urllib2.HTTPPasswordMgrWithDefaultRealm() |
|
132 |
+ |
|
133 |
+ def __call__(self, url): |
|
134 |
+ """ |
|
135 |
+ If the given url contains auth info or if a normal request gets a 401 |
|
136 |
+ response, an attempt is made to fetch the resource using basic HTTP |
|
137 |
+ auth. |
|
138 |
+ |
|
139 |
+ """ |
|
140 |
+ url, username, password, scheme = self.extract_credentials(url) |
|
141 |
+ if username is None: |
|
142 |
+ try: |
|
143 |
+ response = self.get_opener(scheme=scheme).open(url) |
|
144 |
+ except urllib2.HTTPError: |
|
145 |
+ e = sys.exc_info()[1] |
|
146 |
+ if e.code != 401: |
|
147 |
+ raise |
|
148 |
+ response = self.get_response(url) |
|
149 |
+ else: |
|
150 |
+ response = self.get_response(url, username, password) |
|
151 |
+ return response |
|
152 |
+ |
|
153 |
+ def get_request(self, url): |
|
154 |
+ """ |
|
155 |
+ Wraps the URL to retrieve to protects against "creative" |
|
156 |
+ interpretation of the RFC: http://bugs.python.org/issue8732 |
|
157 |
+ """ |
|
158 |
+ if isinstance(url, string_types): |
|
159 |
+ url = urllib2.Request(url, headers={'Accept-encoding': 'identity'}) |
|
160 |
+ return url |
|
161 |
+ |
|
162 |
+ def get_response(self, url, username=None, password=None): |
|
163 |
+ """ |
|
164 |
+ does the dirty work of actually getting the rsponse object using urllib2 |
|
165 |
+ and its HTTP auth builtins. |
|
166 |
+ """ |
|
167 |
+ scheme, netloc, path, query, frag = urlparse.urlsplit(url) |
|
168 |
+ req = self.get_request(url) |
|
169 |
+ |
|
170 |
+ stored_username, stored_password = self.passman.find_user_password(None, netloc) |
|
171 |
+ # see if we have a password stored |
|
172 |
+ if stored_username is None: |
|
173 |
+ if username is None and self.prompting: |
|
174 |
+ username = urllib.quote(raw_input('User for %s: ' % netloc)) |
|
175 |
+ password = urllib.quote(getpass.getpass('Password: ')) |
|
176 |
+ if username and password: |
|
177 |
+ self.passman.add_password(None, netloc, username, password) |
|
178 |
+ stored_username, stored_password = self.passman.find_user_password(None, netloc) |
|
179 |
+ authhandler = urllib2.HTTPBasicAuthHandler(self.passman) |
|
180 |
+ opener = self.get_opener(authhandler, scheme=scheme) |
|
181 |
+ # FIXME: should catch a 401 and offer to let the user reenter credentials |
|
182 |
+ return opener.open(req) |
|
183 |
+ |
|
184 |
+ def get_opener(self, *args, **kwargs): |
|
185 |
+ """ |
|
186 |
+ Build an OpenerDirector instance based on the scheme, whether ssl is |
|
187 |
+ importable and the --insecure parameter. |
|
188 |
+ """ |
|
189 |
+ if kwargs.get('scheme') == 'https': |
|
190 |
+ if ssl: |
|
191 |
+ https_handler = VerifiedHTTPSHandler() |
|
192 |
+ director = urllib2.build_opener(https_handler, *args) |
|
193 |
+ #strip out HTTPHandler to prevent MITM spoof |
|
194 |
+ for handler in director.handlers: |
|
195 |
+ if isinstance(handler, urllib2.HTTPHandler): |
|
196 |
+ director.handlers.remove(handler) |
|
197 |
+ return director |
|
198 |
+ elif os.environ.get('PIP_INSECURE', '') == '1': |
|
199 |
+ return urllib2.build_opener(*args) |
|
200 |
+ else: |
|
201 |
+ raise NoSSLError() |
|
202 |
+ else: |
|
203 |
+ return urllib2.build_opener(*args) |
|
204 |
+ |
|
205 |
+ def setup(self, proxystr='', prompting=True): |
|
206 |
+ """ |
|
207 |
+ Sets the proxy handler given the option passed on the command |
|
208 |
+ line. If an empty string is passed it looks at the HTTP_PROXY |
|
209 |
+ environment variable. |
|
210 |
+ """ |
|
211 |
+ self.prompting = prompting |
|
212 |
+ proxy = self.get_proxy(proxystr) |
|
213 |
+ if proxy: |
|
214 |
+ proxy_support = urllib2.ProxyHandler({"http": proxy, "ftp": proxy, "https": proxy}) |
|
215 |
+ opener = urllib2.build_opener(proxy_support, urllib2.CacheFTPHandler) |
|
216 |
+ urllib2.install_opener(opener) |
|
217 |
+ |
|
218 |
+ def parse_credentials(self, netloc): |
|
219 |
+ if "@" in netloc: |
|
220 |
+ userinfo = netloc.rsplit("@", 1)[0] |
|
221 |
+ if ":" in userinfo: |
|
222 |
+ return userinfo.split(":", 1) |
|
223 |
+ return userinfo, None |
|
224 |
+ return None, None |
|
225 |
+ |
|
226 |
+ def extract_credentials(self, url): |
|
227 |
+ """ |
|
228 |
+ Extracts user/password from a url. |
|
229 |
+ |
|
230 |
+ Returns a tuple: |
|
231 |
+ (url-without-auth, username, password) |
|
232 |
+ """ |
|
233 |
+ if isinstance(url, urllib2.Request): |
|
234 |
+ result = urlparse.urlsplit(url.get_full_url()) |
|
235 |
+ else: |
|
236 |
+ result = urlparse.urlsplit(url) |
|
237 |
+ scheme, netloc, path, query, frag = result |
|
238 |
+ |
|
239 |
+ username, password = self.parse_credentials(netloc) |
|
240 |
+ if username is None: |
|
241 |
+ return url, None, None, scheme |
|
242 |
+ elif password is None and self.prompting: |
|
243 |
+ # remove the auth credentials from the url part |
|
244 |
+ netloc = netloc.replace('%s@' % username, '', 1) |
|
245 |
+ # prompt for the password |
|
246 |
+ prompt = 'Password for %s@%s: ' % (username, netloc) |
|
247 |
+ password = urllib.quote(getpass.getpass(prompt)) |
|
248 |
+ else: |
|
249 |
+ # remove the auth credentials from the url part |
|
250 |
+ netloc = netloc.replace('%s:%s@' % (username, password), '', 1) |
|
251 |
+ |
|
252 |
+ target_url = urlparse.urlunsplit((scheme, netloc, path, query, frag)) |
|
253 |
+ return target_url, username, password, scheme |
|
254 |
+ |
|
255 |
+ def get_proxy(self, proxystr=''): |
|
256 |
+ """ |
|
257 |
+ Get the proxy given the option passed on the command line. |
|
258 |
+ If an empty string is passed it looks at the HTTP_PROXY |
|
259 |
+ environment variable. |
|
260 |
+ """ |
|
261 |
+ if not proxystr: |
|
262 |
+ proxystr = os.environ.get('HTTP_PROXY', '') |
|
263 |
+ if proxystr: |
|
264 |
+ if '@' in proxystr: |
|
265 |
+ user_password, server_port = proxystr.split('@', 1) |
|
266 |
+ if ':' in user_password: |
|
267 |
+ user, password = user_password.split(':', 1) |
|
268 |
+ else: |
|
269 |
+ user = user_password |
|
270 |
+ prompt = 'Password for %s@%s: ' % (user, server_port) |
|
271 |
+ password = urllib.quote(getpass.getpass(prompt)) |
|
272 |
+ return '%s:%s@%s' % (user, password, server_port) |
|
273 |
+ else: |
|
274 |
+ return proxystr |
|
275 |
+ else: |
|
276 |
+ return None |
|
277 |
+ |
|
278 |
+urlopen = URLOpener() |
|
279 |
+ |
|
280 |
+ |
|
281 |
+def is_url(name): |
|
282 |
+ """Returns true if the name looks like a URL""" |
|
283 |
+ if ':' not in name: |
|
284 |
+ return False |
|
285 |
+ scheme = name.split(':', 1)[0].lower() |
|
286 |
+ return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes |
|
287 |
+ |
|
288 |
+ |
|
289 |
+def url_to_path(url): |
|
290 |
+ """ |
|
291 |
+ Convert a file: URL to a path. |
|
292 |
+ """ |
|
293 |
+ assert url.startswith('file:'), ( |
|
294 |
+ "You can only turn file: urls into filenames (not %r)" % url) |
|
295 |
+ path = url[len('file:'):].lstrip('/') |
|
296 |
+ path = urllib.unquote(path) |
|
297 |
+ if _url_drive_re.match(path): |
|
298 |
+ path = path[0] + ':' + path[2:] |
|
299 |
+ else: |
|
300 |
+ path = '/' + path |
|
301 |
+ return path |
|
302 |
+ |
|
303 |
+ |
|
304 |
+_drive_re = re.compile('^([a-z]):', re.I) |
|
305 |
+_url_drive_re = re.compile('^([a-z])[:|]', re.I) |
|
306 |
+ |
|
307 |
+ |
|
308 |
+def path_to_url(path): |
|
309 |
+ """ |
|
310 |
+ Convert a path to a file: URL. The path will be made absolute. |
|
311 |
+ """ |
|
312 |
+ path = os.path.normcase(os.path.abspath(path)) |
|
313 |
+ if _drive_re.match(path): |
|
314 |
+ path = path[0] + '|' + path[2:] |
|
315 |
+ url = urllib.quote(path) |
|
316 |
+ url = url.replace(os.path.sep, '/') |
|
317 |
+ url = url.lstrip('/') |
|
318 |
+ return 'file:///' + url |
|
319 |
+ |
|
320 |
+ |
|
321 |
+def path_to_url2(path): |
|
322 |
+ """ |
|
323 |
+ Convert a path to a file: URL. The path will be made absolute and have |
|
324 |
+ quoted path parts. |
|
325 |
+ """ |
|
326 |
+ path = os.path.normpath(os.path.abspath(path)) |
|
327 |
+ drive, path = os.path.splitdrive(path) |
|
328 |
+ filepath = path.split(os.path.sep) |
|
329 |
+ url = '/'.join([urllib.quote(part) for part in filepath]) |
|
330 |
+ if not drive: |
|
331 |
+ url = url.lstrip('/') |
|
332 |
+ return 'file:///' + drive + url |
|
333 |
+ |
|
334 |
+ |
|
335 |
+def geturl(urllib2_resp): |
|
336 |
+ """ |
|
337 |
+ Use instead of urllib.addinfourl.geturl(), which appears to have |
|
338 |
+ some issues with dropping the double slash for certain schemes |
|
339 |
+ (e.g. file://). This implementation is probably over-eager, as it |
|
340 |
+ always restores '://' if it is missing, and it appears some url |
|
341 |
+ schemata aren't always followed by '//' after the colon, but as |
|
342 |
+ far as I know pip doesn't need any of those. |
|
343 |
+ The URI RFC can be found at: http://tools.ietf.org/html/rfc1630 |
|
344 |
+ |
|
345 |
+ This function assumes that |
|
346 |
+ scheme:/foo/bar |
|
347 |
+ is the same as |
|
348 |
+ scheme:///foo/bar |
|
349 |
+ """ |
|
350 |
+ url = urllib2_resp.geturl() |
|
351 |
+ scheme, rest = url.split(':', 1) |
|
352 |
+ if rest.startswith('//'): |
|
353 |
+ return url |
|
354 |
+ else: |
|
355 |
+ # FIXME: write a good test to cover it |
|
356 |
+ return '%s://%s' % (scheme, rest) |
|
357 |
+ |
|
358 |
+ |
|
359 |
+def is_archive_file(name): |
|
360 |
+ """Return True if `name` is a considered as an archive file.""" |
|
361 |
+ archives = ('.zip', '.tar.gz', '.tar.bz2', '.tgz', '.tar', '.pybundle') |
|
362 |
+ ext = splitext(name)[1].lower() |
|
363 |
+ if ext in archives: |
|
364 |
+ return True |
|
365 |
+ return False |
|
366 |
+ |
|
367 |
+ |
|
368 |
+def unpack_vcs_link(link, location, only_download=False): |
|
369 |
+ vcs_backend = _get_used_vcs_backend(link) |
|
370 |
+ if only_download: |
|
371 |
+ vcs_backend.export(location) |
|
372 |
+ else: |
|
373 |
+ vcs_backend.unpack(location) |
|
374 |
+ |
|
375 |
+ |
|
376 |
+def unpack_file_url(link, location): |
|
377 |
+ source = url_to_path(link.url) |
|
378 |
+ content_type = mimetypes.guess_type(source)[0] |
|
379 |
+ if os.path.isdir(source): |
|
380 |
+ # delete the location since shutil will create it again :( |
|
381 |
+ if os.path.isdir(location): |
|
382 |
+ rmtree(location) |
|
383 |
+ shutil.copytree(source, location) |
|
384 |
+ else: |
|
385 |
+ unpack_file(source, location, content_type, link) |
|
386 |
+ |
|
387 |
+ |
|
388 |
+def _get_used_vcs_backend(link): |
|
389 |
+ for backend in vcs.backends: |
|
390 |
+ if link.scheme in backend.schemes: |
|
391 |
+ vcs_backend = backend(link.url) |
|
392 |
+ return vcs_backend |
|
393 |
+ |
|
394 |
+ |
|
395 |
+def is_vcs_url(link): |
|
396 |
+ return bool(_get_used_vcs_backend(link)) |
|
397 |
+ |
|
398 |
+ |
|
399 |
+def is_file_url(link): |
|
400 |
+ return link.url.lower().startswith('file:') |
|
401 |
+ |
|
402 |
+ |
|
403 |
+def _check_hash(download_hash, link): |
|
404 |
+ if download_hash.digest_size != hashlib.new(link.hash_name).digest_size: |
|
405 |
+ logger.fatal("Hash digest size of the package %d (%s) doesn't match the expected hash name %s!" |
|
406 |
+ % (download_hash.digest_size, link, link.hash_name)) |
|
407 |
+ raise InstallationError('Hash name mismatch for package %s' % link) |
|
408 |
+ if download_hash.hexdigest() != link.hash: |
|
409 |
+ logger.fatal("Hash of the package %s (%s) doesn't match the expected hash %s!" |
|
410 |
+ % (link, download_hash, link.hash)) |
|
411 |
+ raise InstallationError('Bad %s hash for package %s' % (link.hash_name, link)) |
|
412 |
+ |
|
413 |
+ |
|
414 |
+def _get_hash_from_file(target_file, link): |
|
415 |
+ try: |
|
416 |
+ download_hash = hashlib.new(link.hash_name) |
|
417 |
+ except (ValueError, TypeError): |
|
418 |
+ logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) |
|
419 |
+ return None |
|
420 |
+ |
|
421 |
+ fp = open(target_file, 'rb') |
|
422 |
+ while True: |
|
423 |
+ chunk = fp.read(4096) |
|
424 |
+ if not chunk: |
|
425 |
+ break |
|
426 |
+ download_hash.update(chunk) |
|
427 |
+ fp.close() |
|
428 |
+ return download_hash |
|
429 |
+ |
|
430 |
+ |
|
431 |
+def _download_url(resp, link, temp_location): |
|
432 |
+ fp = open(temp_location, 'wb') |
|
433 |
+ download_hash = None |
|
434 |
+ if link.hash and link.hash_name: |
|
435 |
+ try: |
|
436 |
+ download_hash = hashlib.new(link.hash_name) |
|
437 |
+ except ValueError: |
|
438 |
+ logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) |
|
439 |
+ try: |
|
440 |
+ total_length = int(resp.info()['content-length']) |
|
441 |
+ except (ValueError, KeyError, TypeError): |
|
442 |
+ total_length = 0 |
|
443 |
+ downloaded = 0 |
|
444 |
+ show_progress = total_length > 40 * 1000 or not total_length |
|
445 |
+ show_url = link.show_url |
|
446 |
+ try: |
|
447 |
+ if show_progress: |
|
448 |
+ ## FIXME: the URL can get really long in this message: |
|
449 |
+ if total_length: |
|
450 |
+ logger.start_progress('Downloading %s (%s): ' % (show_url, format_size(total_length))) |
|
451 |
+ else: |
|
452 |
+ logger.start_progress('Downloading %s (unknown size): ' % show_url) |
|
453 |
+ else: |
|
454 |
+ logger.notify('Downloading %s' % show_url) |
|
455 |
+ logger.info('Downloading from URL %s' % link) |
|
456 |
+ |
|
457 |
+ while True: |
|
458 |
+ chunk = resp.read(4096) |
|
459 |
+ if not chunk: |
|
460 |
+ break |
|
461 |
+ downloaded += len(chunk) |
|
462 |
+ if show_progress: |
|
463 |
+ if not total_length: |
|
464 |
+ logger.show_progress('%s' % format_size(downloaded)) |
|
465 |
+ else: |
|
466 |
+ logger.show_progress('%3i%% %s' % (100 * downloaded / total_length, format_size(downloaded))) |
|
467 |
+ if download_hash is not None: |
|
468 |
+ download_hash.update(chunk) |
|
469 |
+ fp.write(chunk) |
|
470 |
+ fp.close() |
|
471 |
+ finally: |
|
472 |
+ if show_progress: |
|
473 |
+ logger.end_progress('%s downloaded' % format_size(downloaded)) |
|
474 |
+ return download_hash |
|
475 |
+ |
|
476 |
+ |
|
477 |
+def _copy_file(filename, location, content_type, link): |
|
478 |
+ copy = True |
|
479 |
+ download_location = os.path.join(location, link.filename) |
|
480 |
+ if os.path.exists(download_location): |
|
481 |
+ response = ask_path_exists( |
|
482 |
+ 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % |
|
483 |
+ display_path(download_location), ('i', 'w', 'b')) |
|
484 |
+ if response == 'i': |
|
485 |
+ copy = False |
|
486 |
+ elif response == 'w': |
|
487 |
+ logger.warn('Deleting %s' % display_path(download_location)) |
|
488 |
+ os.remove(download_location) |
|
489 |
+ elif response == 'b': |
|
490 |
+ dest_file = backup_dir(download_location) |
|
491 |
+ logger.warn('Backing up %s to %s' |
|
492 |
+ % (display_path(download_location), display_path(dest_file))) |
|
493 |
+ shutil.move(download_location, dest_file) |
|
494 |
+ if copy: |
|
495 |
+ shutil.copy(filename, download_location) |
|
496 |
+ logger.indent -= 2 |
|
497 |
+ logger.notify('Saved %s' % display_path(download_location)) |
|
498 |
+ |
|
499 |
+ |
|
500 |
+def unpack_http_url(link, location, download_cache, download_dir=None): |
|
501 |
+ temp_dir = tempfile.mkdtemp('-unpack', 'pip-') |
|
502 |
+ target_url = link.url.split('#', 1)[0] |
|
503 |
+ target_file = None |
|
504 |
+ download_hash = None |
|
505 |
+ if download_cache: |
|
506 |
+ target_file = os.path.join(download_cache, |
|
507 |
+ urllib.quote(target_url, '')) |
|
508 |
+ if not os.path.isdir(download_cache): |
|
509 |
+ create_download_cache_folder(download_cache) |
|
510 |
+ |
|
511 |
+ already_downloaded = None |
|
512 |
+ if download_dir: |
|
513 |
+ already_downloaded = os.path.join(download_dir, link.filename) |
|
514 |
+ if not os.path.exists(already_downloaded): |
|
515 |
+ already_downloaded = None |
|
516 |
+ |
|
517 |
+ if (target_file |
|
518 |
+ and os.path.exists(target_file) |
|
519 |
+ and os.path.exists(target_file + '.content-type')): |
|
520 |
+ fp = open(target_file+'.content-type') |
|
521 |
+ content_type = fp.read().strip() |
|
522 |
+ fp.close() |
|
523 |
+ if link.hash and link.hash_name: |
|
524 |
+ download_hash = _get_hash_from_file(target_file, link) |
|
525 |
+ temp_location = target_file |
|
526 |
+ logger.notify('Using download cache from %s' % target_file) |
|
527 |
+ elif already_downloaded: |
|
528 |
+ temp_location = already_downloaded |
|
529 |
+ content_type = mimetypes.guess_type(already_downloaded) |
|
530 |
+ if link.hash: |
|
531 |
+ download_hash = _get_hash_from_file(temp_location, link) |
|
532 |
+ logger.notify('File was already downloaded %s' % already_downloaded) |
|
533 |
+ else: |
|
534 |
+ resp = _get_response_from_url(target_url, link) |
|
535 |
+ content_type = resp.info()['content-type'] |
|
536 |
+ filename = link.filename # fallback |
|
537 |
+ # Have a look at the Content-Disposition header for a better guess |
|
538 |
+ content_disposition = resp.info().get('content-disposition') |
|
539 |
+ if content_disposition: |
|
540 |
+ type, params = cgi.parse_header(content_disposition) |
|
541 |
+ # We use ``or`` here because we don't want to use an "empty" value |
|
542 |
+ # from the filename param. |
|
543 |
+ filename = params.get('filename') or filename |
|
544 |
+ ext = splitext(filename)[1] |
|
545 |
+ if not ext: |
|
546 |
+ ext = mimetypes.guess_extension(content_type) |
|
547 |
+ if ext: |
|
548 |
+ filename += ext |
|
549 |
+ if not ext and link.url != geturl(resp): |
|
550 |
+ ext = os.path.splitext(geturl(resp))[1] |
|
551 |
+ if ext: |
|
552 |
+ filename += ext |
|
553 |
+ temp_location = os.path.join(temp_dir, filename) |
|
554 |
+ download_hash = _download_url(resp, link, temp_location) |
|
555 |
+ if link.hash and link.hash_name: |
|
556 |
+ _check_hash(download_hash, link) |
|
557 |
+ if download_dir and not already_downloaded: |
|
558 |
+ _copy_file(temp_location, download_dir, content_type, link) |
|
559 |
+ unpack_file(temp_location, location, content_type, link) |
|
560 |
+ if target_file and target_file != temp_location: |
|
561 |
+ cache_download(target_file, temp_location, content_type) |
|
562 |
+ if target_file is None and not already_downloaded: |
|
563 |
+ os.unlink(temp_location) |
|
564 |
+ os.rmdir(temp_dir) |
|
565 |
+ |
|
566 |
+ |
|
567 |
+def _get_response_from_url(target_url, link): |
|
568 |
+ try: |
|
569 |
+ resp = urlopen(target_url) |
|
570 |
+ except urllib2.HTTPError: |
|
571 |
+ e = sys.exc_info()[1] |
|
572 |
+ logger.fatal("HTTP error %s while getting %s" % (e.code, link)) |
|
573 |
+ raise |
|
574 |
+ except IOError: |
|
575 |
+ e = sys.exc_info()[1] |
|
576 |
+ # Typically an FTP error |
|
577 |
+ logger.fatal("Error %s while getting %s" % (e, link)) |
|
578 |
+ raise |
|
579 |
+ return resp |
|
580 |
+ |
|
581 |
+ |
|
582 |
+class Urllib2HeadRequest(urllib2.Request): |
|
583 |
+ def get_method(self): |
|
584 |
+ return "HEAD" |
2 | 587 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,56 @@ |
1 |
+"""Exceptions used throughout package""" |
|
2 |
+ |
|
3 |
+import textwrap |
|
4 |
+ |
|
5 |
+class PipError(Exception): |
|
6 |
+ """Base pip exception""" |
|
7 |
+ |
|
8 |
+ |
|
9 |
+class InstallationError(PipError): |
|
10 |
+ """General exception during installation""" |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class UninstallationError(PipError): |
|
14 |
+ """General exception during uninstallation""" |
|
15 |
+ |
|
16 |
+ |
|
17 |
+class DistributionNotFound(InstallationError): |
|
18 |
+ """Raised when a distribution cannot be found to satisfy a requirement""" |
|
19 |
+ |
|
20 |
+ |
|
21 |
+class BestVersionAlreadyInstalled(PipError): |
|
22 |
+ """Raised when the most up-to-date version of a package is already |
|
23 |
+ installed. """ |
|
24 |
+ |
|
25 |
+ |
|
26 |
+class BadCommand(PipError): |
|
27 |
+ """Raised when virtualenv or a command is not found""" |
|
28 |
+ |
|
29 |
+ |
|
30 |
+class CommandError(PipError): |
|
31 |
+ """Raised when there is an error in command-line arguments""" |
|
32 |
+ |
|
33 |
+ |
|
34 |
+class NoSSLError(PipError): |
|
35 |
+ """Raised when there's no ssl and not using '--insecure'""" |
|
36 |
+ |
|
37 |
+ def __str__(self): |
|
38 |
+ return textwrap.dedent(""" |
|
39 |
+ ################################################################### |
|
40 |
+ ## You don't have an importable ssl module. You are most ## |
|
41 |
+ ## likely using Python 2.5, which did not include ssl ## |
|
42 |
+ ## support by default. In this state, we can not provide ## |
|
43 |
+ ## ssl certified downloads from PyPI. ## |
|
44 |
+ ## ## |
|
45 |
+ ## You can do one of 2 things: ## |
|
46 |
+ ## 1) Install this: https://pypi.python.org/pypi/ssl/ ## |
|
47 |
+ ## (It provides ssl support for older Pythons ) ## |
|
48 |
+ ## 2) Use the --insecure option to allow this insecurity ## |
|
49 |
+ ## ## |
|
50 |
+ ## For more details, go to the "SSL Certificate Verification" ## |
|
51 |
+ ## section located here: ## |
|
52 |
+ ## http://www.pip-installer.org/en/latest/logic.html ## |
|
53 |
+ ## ## |
|
54 |
+ ################################################################### |
|
55 |
+ """) |
|
56 |
+ |
2 | 59 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,757 @@ |
1 |
+"""Routines related to PyPI, indexes""" |
|
2 |
+ |
|
3 |
+import sys |
|
4 |
+import os |
|
5 |
+import re |
|
6 |
+import gzip |
|
7 |
+import mimetypes |
|
8 |
+import posixpath |
|
9 |
+import pkg_resources |
|
10 |
+import random |
|
11 |
+import socket |
|
12 |
+import string |
|
13 |
+import zlib |
|
14 |
+ |
|
15 |
+try: |
|
16 |
+ import threading |
|
17 |
+except ImportError: |
|
18 |
+ import dummy_threading as threading |
|
19 |
+ |
|
20 |
+from pip.log import logger |
|
21 |
+from pip.util import Inf, normalize_name, splitext |
|
22 |
+from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled |
|
23 |
+from pip.backwardcompat import (WindowsError, BytesIO, |
|
24 |
+ Queue, urlparse, |
|
25 |
+ URLError, HTTPError, u, |
|
26 |
+ product, url2pathname, ssl, |
|
27 |
+ Empty as QueueEmpty) |
|
28 |
+if ssl: |
|
29 |
+ from pip.backwardcompat import CertificateError |
|
30 |
+from pip.download import urlopen, path_to_url2, url_to_path, geturl, Urllib2HeadRequest |
|
31 |
+ |
|
32 |
+__all__ = ['PackageFinder'] |
|
33 |
+ |
|
34 |
+ |
|
35 |
+DEFAULT_MIRROR_HOSTNAME = "last.pypi.python.org" |
|
36 |
+ |
|
37 |
+ |
|
38 |
+class PackageFinder(object): |
|
39 |
+ """This finds packages. |
|
40 |
+ |
|
41 |
+ This is meant to match easy_install's technique for looking for |
|
42 |
+ packages, by reading pages and looking for appropriate links |
|
43 |
+ """ |
|
44 |
+ |
|
45 |
+ def __init__(self, find_links, index_urls, |
|
46 |
+ use_mirrors=False, mirrors=None, main_mirror_url=None): |
|
47 |
+ self.find_links = find_links |
|
48 |
+ self.index_urls = index_urls |
|
49 |
+ self.dependency_links = [] |
|
50 |
+ self.cache = PageCache() |
|
51 |
+ # These are boring links that have already been logged somehow: |
|
52 |
+ self.logged_links = set() |
|
53 |
+ if use_mirrors: |
|
54 |
+ self.mirror_urls = self._get_mirror_urls(mirrors, main_mirror_url) |
|
55 |
+ logger.info('Using PyPI mirrors: %s' % ', '.join(self.mirror_urls)) |
|
56 |
+ else: |
|
57 |
+ self.mirror_urls = [] |
|
58 |
+ |
|
59 |
+ def add_dependency_links(self, links): |
|
60 |
+ ## FIXME: this shouldn't be global list this, it should only |
|
61 |
+ ## apply to requirements of the package that specifies the |
|
62 |
+ ## dependency_links value |
|
63 |
+ ## FIXME: also, we should track comes_from (i.e., use Link) |
|
64 |
+ self.dependency_links.extend(links) |
|
65 |
+ |
|
66 |
+ def _sort_locations(self, locations): |
|
67 |
+ """ |
|
68 |
+ Sort locations into "files" (archives) and "urls", and return |
|
69 |
+ a pair of lists (files,urls) |
|
70 |
+ """ |
|
71 |
+ files = [] |
|
72 |
+ urls = [] |
|
73 |
+ |
|
74 |
+ # puts the url for the given file path into the appropriate list |
|
75 |
+ def sort_path(path): |
|
76 |
+ url = path_to_url2(path) |
|
77 |
+ if mimetypes.guess_type(url, strict=False)[0] == 'text/html': |
|
78 |
+ urls.append(url) |
|
79 |
+ else: |
|
80 |
+ files.append(url) |
|
81 |
+ |
|
82 |
+ for url in locations: |
|
83 |
+ |
|
84 |
+ is_local_path = os.path.exists(url) |
|
85 |
+ is_file_url = url.startswith('file:') |
|
86 |
+ is_find_link = url in self.find_links |
|
87 |
+ |
|
88 |
+ if is_local_path or is_file_url: |
|
89 |
+ if is_local_path: |
|
90 |
+ path = url |
|
91 |
+ else: |
|
92 |
+ path = url_to_path(url) |
|
93 |
+ if is_find_link and os.path.isdir(path): |
|
94 |
+ path = os.path.realpath(path) |
|
95 |
+ for item in os.listdir(path): |
|
96 |
+ sort_path(os.path.join(path, item)) |
|
97 |
+ elif is_file_url and os.path.isdir(path): |
|
98 |
+ urls.append(url) |
|
99 |
+ elif os.path.isfile(path): |
|
100 |
+ sort_path(path) |
|
101 |
+ else: |
|
102 |
+ urls.append(url) |
|
103 |
+ |
|
104 |
+ return files, urls |
|
105 |
+ |
|
106 |
+ def find_requirement(self, req, upgrade): |
|
107 |
+ |
|
108 |
+ def mkurl_pypi_url(url): |
|
109 |
+ loc = posixpath.join(url, url_name) |
|
110 |
+ # For maximum compatibility with easy_install, ensure the path |
|
111 |
+ # ends in a trailing slash. Although this isn't in the spec |
|
112 |
+ # (and PyPI can handle it without the slash) some other index |
|
113 |
+ # implementations might break if they relied on easy_install's behavior. |
|
114 |
+ if not loc.endswith('/'): |
|
115 |
+ loc = loc + '/' |
|
116 |
+ return loc |
|
117 |
+ |
|
118 |
+ url_name = req.url_name |
|
119 |
+ # Only check main index if index URL is given: |
|
120 |
+ main_index_url = None |
|
121 |
+ if self.index_urls: |
|
122 |
+ # Check that we have the url_name correctly spelled: |
|
123 |
+ main_index_url = Link(mkurl_pypi_url(self.index_urls[0])) |
|
124 |
+ # This will also cache the page, so it's okay that we get it again later: |
|
125 |
+ page = self._get_page(main_index_url, req) |
|
126 |
+ if page is None: |
|
127 |
+ url_name = self._find_url_name(Link(self.index_urls[0]), url_name, req) or req.url_name |
|
128 |
+ |
|
129 |
+ # Combine index URLs with mirror URLs here to allow |
|
130 |
+ # adding more index URLs from requirements files |
|
131 |
+ all_index_urls = self.index_urls + self.mirror_urls |
|
132 |
+ |
|
133 |
+ if url_name is not None: |
|
134 |
+ locations = [ |
|
135 |
+ mkurl_pypi_url(url) |
|
136 |
+ for url in all_index_urls] + self.find_links |
|
137 |
+ else: |
|
138 |
+ locations = list(self.find_links) |
|
139 |
+ locations.extend(self.dependency_links) |
|
140 |
+ for version in req.absolute_versions: |
|
141 |
+ if url_name is not None and main_index_url is not None: |
|
142 |
+ locations = [ |
|
143 |
+ posixpath.join(main_index_url.url, version)] + locations |
|
144 |
+ |
|
145 |
+ file_locations, url_locations = self._sort_locations(locations) |
|
146 |
+ |
|
147 |
+ locations = [Link(url) for url in url_locations] |
|
148 |
+ logger.debug('URLs to search for versions for %s:' % req) |
|
149 |
+ for location in locations: |
|
150 |
+ logger.debug('* %s' % location) |
|
151 |
+ found_versions = [] |
|
152 |
+ found_versions.extend( |
|
153 |
+ self._package_versions( |
|
154 |
+ [Link(url, '-f') for url in self.find_links], req.name.lower())) |
|
155 |
+ page_versions = [] |
|
156 |
+ for page in self._get_pages(locations, req): |
|
157 |
+ logger.debug('Analyzing links from page %s' % page.url) |
|
158 |
+ logger.indent += 2 |
|
159 |
+ try: |
|
160 |
+ page_versions.extend(self._package_versions(page.links, req.name.lower())) |
|
161 |
+ finally: |
|
162 |
+ logger.indent -= 2 |
|
163 |
+ dependency_versions = list(self._package_versions( |
|
164 |
+ [Link(url) for url in self.dependency_links], req.name.lower())) |
|
165 |
+ if dependency_versions: |
|
166 |
+ logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions])) |
|
167 |
+ file_versions = list(self._package_versions( |
|
168 |
+ [Link(url) for url in file_locations], req.name.lower())) |
|
169 |
+ if not found_versions and not page_versions and not dependency_versions and not file_versions: |
|
170 |
+ logger.fatal('Could not find any downloads that satisfy the requirement %s' % req) |
|
171 |
+ raise DistributionNotFound('No distributions at all found for %s' % req) |
|
172 |
+ installed_version = [] |
|
173 |
+ if req.satisfied_by is not None: |
|
174 |
+ installed_version = [(req.satisfied_by.parsed_version, InfLink, req.satisfied_by.version)] |
|
175 |
+ if file_versions: |
|
176 |
+ file_versions.sort(reverse=True) |
|
177 |
+ logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions])) |
|
178 |
+ #this is an intentional priority ordering |
|
179 |
+ all_versions = installed_version + file_versions + found_versions + page_versions + dependency_versions |
|
180 |
+ applicable_versions = [] |
|
181 |
+ for (parsed_version, link, version) in all_versions: |
|
182 |
+ if version not in req.req: |
|
183 |
+ logger.info("Ignoring link %s, version %s doesn't match %s" |
|
184 |
+ % (link, version, ','.join([''.join(s) for s in req.req.specs]))) |
|
185 |
+ continue |
|
186 |
+ applicable_versions.append((parsed_version, link, version)) |
|
187 |
+ #bring the latest version to the front, but maintains the priority ordering as secondary |
|
188 |
+ applicable_versions = sorted(applicable_versions, key=lambda v: v[0], reverse=True) |
|
189 |
+ existing_applicable = bool([link for parsed_version, link, version in applicable_versions if link is InfLink]) |
|
190 |
+ if not upgrade and existing_applicable: |
|
191 |
+ if applicable_versions[0][1] is InfLink: |
|
192 |
+ logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement' |
|
193 |
+ % req.satisfied_by.version) |
|
194 |
+ else: |
|
195 |
+ logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)' |
|
196 |
+ % (req.satisfied_by.version, applicable_versions[0][2])) |
|
197 |
+ return None |
|
198 |
+ if not applicable_versions: |
|
199 |
+ logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)' |
|
200 |
+ % (req, ', '.join([version for parsed_version, link, version in all_versions]))) |
|
201 |
+ raise DistributionNotFound('No distributions matching the version for %s' % req) |
|
202 |
+ if applicable_versions[0][1] is InfLink: |
|
203 |
+ # We have an existing version, and its the best version |
|
204 |
+ logger.info('Installed version (%s) is most up-to-date (past versions: %s)' |
|
205 |
+ % (req.satisfied_by.version, ', '.join([version for parsed_version, link, version in applicable_versions[1:]]) or 'none')) |
|
206 |
+ raise BestVersionAlreadyInstalled |
|
207 |
+ if len(applicable_versions) > 1: |
|
208 |
+ logger.info('Using version %s (newest of versions: %s)' % |
|
209 |
+ (applicable_versions[0][2], ', '.join([version for parsed_version, link, version in applicable_versions]))) |
|
210 |
+ return applicable_versions[0][1] |
|
211 |
+ |
|
212 |
+ |
|
213 |
+ def _find_url_name(self, index_url, url_name, req): |
|
214 |
+ """Finds the true URL name of a package, when the given name isn't quite correct. |
|
215 |
+ This is usually used to implement case-insensitivity.""" |
|
216 |
+ if not index_url.url.endswith('/'): |
|
217 |
+ # Vaguely part of the PyPI API... weird but true. |
|
218 |
+ ## FIXME: bad to modify this? |
|
219 |
+ index_url.url += '/' |
|
220 |
+ page = self._get_page(index_url, req) |
|
221 |
+ if page is None: |
|
222 |
+ logger.fatal('Cannot fetch index base URL %s' % index_url) |
|
223 |
+ return |
|
224 |
+ norm_name = normalize_name(req.url_name) |
|
225 |
+ for link in page.links: |
|
226 |
+ base = posixpath.basename(link.path.rstrip('/')) |
|
227 |
+ if norm_name == normalize_name(base): |
|
228 |
+ logger.notify('Real name of requirement %s is %s' % (url_name, base)) |
|
229 |
+ return base |
|
230 |
+ return None |
|
231 |
+ |
|
232 |
+ def _get_pages(self, locations, req): |
|
233 |
+ """Yields (page, page_url) from the given locations, skipping |
|
234 |
+ locations that have errors, and adding download/homepage links""" |
|
235 |
+ pending_queue = Queue() |
|
236 |
+ for location in locations: |
|
237 |
+ pending_queue.put(location) |
|
238 |
+ done = [] |
|
239 |
+ seen = set() |
|
240 |
+ threads = [] |
|
241 |
+ for i in range(min(10, len(locations))): |
|
242 |
+ t = threading.Thread(target=self._get_queued_page, args=(req, pending_queue, done, seen)) |
|
243 |
+ t.setDaemon(True) |
|
244 |
+ threads.append(t) |
|
245 |
+ t.start() |
|
246 |
+ for t in threads: |
|
247 |
+ t.join() |
|
248 |
+ return done |
|
249 |
+ |
|
250 |
+ _log_lock = threading.Lock() |
|
251 |
+ |
|
252 |
+ def _get_queued_page(self, req, pending_queue, done, seen): |
|
253 |
+ while 1: |
|
254 |
+ try: |
|
255 |
+ location = pending_queue.get(False) |
|
256 |
+ except QueueEmpty: |
|
257 |
+ return |
|
258 |
+ if location in seen: |
|
259 |
+ continue |
|
260 |
+ seen.add(location) |
|
261 |
+ page = self._get_page(location, req) |
|
262 |
+ if page is None: |
|
263 |
+ continue |
|
264 |
+ done.append(page) |
|
265 |
+ for link in page.rel_links(): |
|
266 |
+ pending_queue.put(link) |
|
267 |
+ |
|
268 |
+ _egg_fragment_re = re.compile(r'#egg=([^&]*)') |
|
269 |
+ _egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.-]+)', re.I) |
|
270 |
+ _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') |
|
271 |
+ |
|
272 |
+ def _sort_links(self, links): |
|
273 |
+ "Returns elements of links in order, non-egg links first, egg links second, while eliminating duplicates" |
|
274 |
+ eggs, no_eggs = [], [] |
|
275 |
+ seen = set() |
|
276 |
+ for link in links: |
|
277 |
+ if link not in seen: |
|
278 |
+ seen.add(link) |
|
279 |
+ if link.egg_fragment: |
|
280 |
+ eggs.append(link) |
|
281 |
+ else: |
|
282 |
+ no_eggs.append(link) |
|
283 |
+ return no_eggs + eggs |
|
284 |
+ |
|
285 |
+ def _package_versions(self, links, search_name): |
|
286 |
+ for link in self._sort_links(links): |
|
287 |
+ for v in self._link_package_versions(link, search_name): |
|
288 |
+ yield v |
|
289 |
+ |
|
290 |
+ def _link_package_versions(self, link, search_name): |
|
291 |
+ """ |
|
292 |
+ Return an iterable of triples (pkg_resources_version_key, |
|
293 |
+ link, python_version) that can be extracted from the given |
|
294 |
+ link. |
|
295 |
+ |
|
296 |
+ Meant to be overridden by subclasses, not called by clients. |
|
297 |
+ """ |
|
298 |
+ if link.egg_fragment: |
|
299 |
+ egg_info = link.egg_fragment |
|
300 |
+ else: |
|
301 |
+ egg_info, ext = link.splitext() |
|
302 |
+ if not ext: |
|
303 |
+ if link not in self.logged_links: |
|
304 |
+ logger.debug('Skipping link %s; not a file' % link) |
|
305 |
+ self.logged_links.add(link) |
|
306 |
+ return [] |
|
307 |
+ if egg_info.endswith('.tar'): |
|
308 |
+ # Special double-extension case: |
|
309 |
+ egg_info = egg_info[:-4] |
|
310 |
+ ext = '.tar' + ext |
|
311 |
+ if ext not in ('.tar.gz', '.tar.bz2', '.tar', '.tgz', '.zip'): |
|
312 |
+ if link not in self.logged_links: |
|
313 |
+ logger.debug('Skipping link %s; unknown archive format: %s' % (link, ext)) |
|
314 |
+ self.logged_links.add(link) |
|
315 |
+ return [] |
|
316 |
+ if "macosx10" in link.path and ext == '.zip': |
|
317 |
+ if link not in self.logged_links: |
|
318 |
+ logger.debug('Skipping link %s; macosx10 one' % (link)) |
|
319 |
+ self.logged_links.add(link) |
|
320 |
+ return [] |
|
321 |
+ version = self._egg_info_matches(egg_info, search_name, link) |
|
322 |
+ if version is None: |
|
323 |
+ logger.debug('Skipping link %s; wrong project name (not %s)' % (link, search_name)) |
|
324 |
+ return [] |
|
325 |
+ match = self._py_version_re.search(version) |
|
326 |
+ if match: |
|
327 |
+ version = version[:match.start()] |
|
328 |
+ py_version = match.group(1) |
|
329 |
+ if py_version != sys.version[:3]: |
|
330 |
+ logger.debug('Skipping %s because Python version is incorrect' % link) |
|
331 |
+ return [] |
|
332 |
+ logger.debug('Found link %s, version: %s' % (link, version)) |
|
333 |
+ return [(pkg_resources.parse_version(version), |
|
334 |
+ link, |
|
335 |
+ version)] |
|
336 |
+ |
|
337 |
+ def _egg_info_matches(self, egg_info, search_name, link): |
|
338 |
+ match = self._egg_info_re.search(egg_info) |
|
339 |
+ if not match: |
|
340 |
+ logger.debug('Could not parse version from link: %s' % link) |
|
341 |
+ return None |
|
342 |
+ name = match.group(0).lower() |
|
343 |
+ # To match the "safe" name that pkg_resources creates: |
|
344 |
+ name = name.replace('_', '-') |
|
345 |
+ # project name and version must be separated by a dash |
|
346 |
+ look_for = search_name.lower() + "-" |
|
347 |
+ if name.startswith(look_for): |
|
348 |
+ return match.group(0)[len(look_for):] |
|
349 |
+ else: |
|
350 |
+ return None |
|
351 |
+ |
|
352 |
+ def _get_page(self, link, req): |
|
353 |
+ return HTMLPage.get_page(link, req, cache=self.cache) |
|
354 |
+ |
|
355 |
+ def _get_mirror_urls(self, mirrors=None, main_mirror_url=None): |
|
356 |
+ """Retrieves a list of URLs from the main mirror DNS entry |
|
357 |
+ unless a list of mirror URLs are passed. |
|
358 |
+ """ |
|
359 |
+ if not mirrors: |
|
360 |
+ mirrors = get_mirrors(main_mirror_url) |
|
361 |
+ # Should this be made "less random"? E.g. netselect like? |
|
362 |
+ random.shuffle(mirrors) |
|
363 |
+ |
|
364 |
+ mirror_urls = set() |
|
365 |
+ for mirror_url in mirrors: |
|
366 |
+ mirror_url = mirror_url.rstrip('/') |
|
367 |
+ # Make sure we have a valid URL |
|
368 |
+ if not any([mirror_url.startswith(scheme) for scheme in ["http://", "https://", "file://"]]): |
|
369 |
+ mirror_url = "http://%s" % mirror_url |
|
370 |
+ if not mirror_url.endswith("/simple"): |
|
371 |
+ mirror_url = "%s/simple" % mirror_url |
|
372 |
+ mirror_urls.add(mirror_url + '/') |
|
373 |
+ |
|
374 |
+ return list(mirror_urls) |
|
375 |
+ |
|
376 |
+ |
|
377 |
+class PageCache(object): |
|
378 |
+ """Cache of HTML pages""" |
|
379 |
+ |
|
380 |
+ failure_limit = 3 |
|
381 |
+ |
|
382 |
+ def __init__(self): |
|
383 |
+ self._failures = {} |
|
384 |
+ self._pages = {} |
|
385 |
+ self._archives = {} |
|
386 |
+ |
|
387 |
+ def too_many_failures(self, url): |
|
388 |
+ return self._failures.get(url, 0) >= self.failure_limit |
|
389 |
+ |
|
390 |
+ def get_page(self, url): |
|
391 |
+ return self._pages.get(url) |
|
392 |
+ |
|
393 |
+ def is_archive(self, url): |
|
394 |
+ return self._archives.get(url, False) |
|
395 |
+ |
|
396 |
+ def set_is_archive(self, url, value=True): |
|
397 |
+ self._archives[url] = value |
|
398 |
+ |
|
399 |
+ def add_page_failure(self, url, level): |
|
400 |
+ self._failures[url] = self._failures.get(url, 0)+level |
|
401 |
+ |
|
402 |
+ def add_page(self, urls, page): |
|
403 |
+ for url in urls: |
|
404 |
+ self._pages[url] = page |
|
405 |
+ |
|
406 |
+ |
|
407 |
+class HTMLPage(object): |
|
408 |
+ """Represents one page, along with its URL""" |
|
409 |
+ |
|
410 |
+ ## FIXME: these regexes are horrible hacks: |
|
411 |
+ _homepage_re = re.compile(r'<th>\s*home\s*page', re.I) |
|
412 |
+ _download_re = re.compile(r'<th>\s*download\s+url', re.I) |
|
413 |
+ ## These aren't so aweful: |
|
414 |
+ _rel_re = re.compile("""<[^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*>""", re.I) |
|
415 |
+ _href_re = re.compile('href=(?:"([^"]*)"|\'([^\']*)\'|([^>\\s\\n]*))', re.I|re.S) |
|
416 |
+ _base_re = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I) |
|
417 |
+ |
|
418 |
+ def __init__(self, content, url, headers=None): |
|
419 |
+ self.content = content |
|
420 |
+ self.url = url |
|
421 |
+ self.headers = headers |
|
422 |
+ |
|
423 |
+ def __str__(self): |
|
424 |
+ return self.url |
|
425 |
+ |
|
426 |
+ @classmethod |
|
427 |
+ def get_page(cls, link, req, cache=None, skip_archives=True): |
|
428 |
+ url = link.url |
|
429 |
+ url = url.split('#', 1)[0] |
|
430 |
+ if cache.too_many_failures(url): |
|
431 |
+ return None |
|
432 |
+ |
|
433 |
+ # Check for VCS schemes that do not support lookup as web pages. |
|
434 |
+ from pip.vcs import VcsSupport |
|
435 |
+ for scheme in VcsSupport.schemes: |
|
436 |
+ if url.lower().startswith(scheme) and url[len(scheme)] in '+:': |
|
437 |
+ logger.debug('Cannot look at %(scheme)s URL %(link)s' % locals()) |
|
438 |
+ return None |
|
439 |
+ |
|
440 |
+ if cache is not None: |
|
441 |
+ inst = cache.get_page(url) |
|
442 |
+ if inst is not None: |
|
443 |
+ return inst |
|
444 |
+ try: |
|
445 |
+ if skip_archives: |
|
446 |
+ if cache is not None: |
|
447 |
+ if cache.is_archive(url): |
|
448 |
+ return None |
|
449 |
+ filename = link.filename |
|
450 |
+ for bad_ext in ['.tar', '.tar.gz', '.tar.bz2', '.tgz', '.zip']: |
|
451 |
+ if filename.endswith(bad_ext): |
|
452 |
+ content_type = cls._get_content_type(url) |
|
453 |
+ if content_type.lower().startswith('text/html'): |
|
454 |
+ break |
|
455 |
+ else: |
|
456 |
+ logger.debug('Skipping page %s because of Content-Type: %s' % (link, content_type)) |
|
457 |
+ if cache is not None: |
|
458 |
+ cache.set_is_archive(url) |
|
459 |
+ return None |
|
460 |
+ logger.debug('Getting page %s' % url) |
|
461 |
+ |
|
462 |
+ # Tack index.html onto file:// URLs that point to directories |
|
463 |
+ (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url) |
|
464 |
+ if scheme == 'file' and os.path.isdir(url2pathname(path)): |
|
465 |
+ # add trailing slash if not present so urljoin doesn't trim final segment |
|
466 |
+ if not url.endswith('/'): |
|
467 |
+ url += '/' |
|
468 |
+ url = urlparse.urljoin(url, 'index.html') |
|
469 |
+ logger.debug(' file: URL is directory, getting %s' % url) |
|
470 |
+ |
|
471 |
+ resp = urlopen(url) |
|
472 |
+ |
|
473 |
+ real_url = geturl(resp) |
|
474 |
+ headers = resp.info() |
|
475 |
+ contents = resp.read() |
|
476 |
+ encoding = headers.get('Content-Encoding', None) |
|
477 |
+ #XXX need to handle exceptions and add testing for this |
|
478 |
+ if encoding is not None: |
|
479 |
+ if encoding == 'gzip': |
|
480 |
+ contents = gzip.GzipFile(fileobj=BytesIO(contents)).read() |
|
481 |
+ if encoding == 'deflate': |
|
482 |
+ contents = zlib.decompress(contents) |
|
483 |
+ inst = cls(u(contents), real_url, headers) |
|
484 |
+ except (HTTPError, URLError, socket.timeout, socket.error, OSError, WindowsError): |
|
485 |
+ e = sys.exc_info()[1] |
|
486 |
+ desc = str(e) |
|
487 |
+ if isinstance(e, socket.timeout): |
|
488 |
+ log_meth = logger.info |
|
489 |
+ level =1 |
|
490 |
+ desc = 'timed out' |
|
491 |
+ elif isinstance(e, URLError): |
|
492 |
+ #ssl/certificate error |
|
493 |
+ if ssl and hasattr(e, 'reason') and (isinstance(e.reason, ssl.SSLError) or isinstance(e.reason, CertificateError)): |
|
494 |
+ desc = 'There was a problem confirming the ssl certificate: %s' % e |
|
495 |
+ log_meth = logger.notify |
|
496 |
+ else: |
|
497 |
+ log_meth = logger.info |
|
498 |
+ if hasattr(e, 'reason') and isinstance(e.reason, socket.timeout): |
|
499 |
+ desc = 'timed out' |
|
500 |
+ level = 1 |
|
501 |
+ else: |
|
502 |
+ level = 2 |
|
503 |
+ elif isinstance(e, HTTPError) and e.code == 404: |
|
504 |
+ ## FIXME: notify? |
|
505 |
+ log_meth = logger.info |
|
506 |
+ level = 2 |
|
507 |
+ else: |
|
508 |
+ log_meth = logger.info |
|
509 |
+ level = 1 |
|
510 |
+ log_meth('Could not fetch URL %s: %s' % (link, desc)) |
|
511 |
+ log_meth('Will skip URL %s when looking for download links for %s' % (link.url, req)) |
|
512 |
+ if cache is not None: |
|
513 |
+ cache.add_page_failure(url, level) |
|
514 |
+ return None |
|
515 |
+ if cache is not None: |
|
516 |
+ cache.add_page([url, real_url], inst) |
|
517 |
+ return inst |
|
518 |
+ |
|
519 |
+ @staticmethod |
|
520 |
+ def _get_content_type(url): |
|
521 |
+ """Get the Content-Type of the given url, using a HEAD request""" |
|
522 |
+ scheme, netloc, path, query, fragment = urlparse.urlsplit(url) |
|
523 |
+ if not scheme in ('http', 'https', 'ftp', 'ftps'): |
|
524 |
+ ## FIXME: some warning or something? |
|
525 |
+ ## assertion error? |
|
526 |
+ return '' |
|
527 |
+ req = Urllib2HeadRequest(url, headers={'Host': netloc}) |
|
528 |
+ resp = urlopen(req) |
|
529 |
+ try: |
|
530 |
+ if hasattr(resp, 'code') and resp.code != 200 and scheme not in ('ftp', 'ftps'): |
|
531 |
+ ## FIXME: doesn't handle redirects |
|
532 |
+ return '' |
|
533 |
+ return resp.info().get('content-type', '') |
|
534 |
+ finally: |
|
535 |
+ resp.close() |
|
536 |
+ |
|
537 |
+ @property |
|
538 |
+ def base_url(self): |
|
539 |
+ if not hasattr(self, "_base_url"): |
|
540 |
+ match = self._base_re.search(self.content) |
|
541 |
+ if match: |
|
542 |
+ self._base_url = match.group(1) |
|
543 |
+ else: |
|
544 |
+ self._base_url = self.url |
|
545 |
+ return self._base_url |
|
546 |
+ |
|
547 |
+ @property |
|
548 |
+ def links(self): |
|
549 |
+ """Yields all links in the page""" |
|
550 |
+ for match in self._href_re.finditer(self.content): |
|
551 |
+ url = match.group(1) or match.group(2) or match.group(3) |
|
552 |
+ url = self.clean_link(urlparse.urljoin(self.base_url, url)) |
|
553 |
+ yield Link(url, self) |
|
554 |
+ |
|
555 |
+ def rel_links(self): |
|
556 |
+ for url in self.explicit_rel_links(): |
|
557 |
+ yield url |
|
558 |
+ for url in self.scraped_rel_links(): |
|
559 |
+ yield url |
|
560 |
+ |
|
561 |
+ def explicit_rel_links(self, rels=('homepage', 'download')): |
|
562 |
+ """Yields all links with the given relations""" |
|
563 |
+ for match in self._rel_re.finditer(self.content): |
|
564 |
+ found_rels = match.group(1).lower().split() |
|
565 |
+ for rel in rels: |
|
566 |
+ if rel in found_rels: |
|
567 |
+ break |
|
568 |
+ else: |
|
569 |
+ continue |
|
570 |
+ match = self._href_re.search(match.group(0)) |
|
571 |
+ if not match: |
|
572 |
+ continue |
|
573 |
+ url = match.group(1) or match.group(2) or match.group(3) |
|
574 |
+ url = self.clean_link(urlparse.urljoin(self.base_url, url)) |
|
575 |
+ yield Link(url, self) |
|
576 |
+ |
|
577 |
+ def scraped_rel_links(self): |
|
578 |
+ for regex in (self._homepage_re, self._download_re): |
|
579 |
+ match = regex.search(self.content) |
|
580 |
+ if not match: |
|
581 |
+ continue |
|
582 |
+ href_match = self._href_re.search(self.content, pos=match.end()) |
|
583 |
+ if not href_match: |
|
584 |
+ continue |
|
585 |
+ url = href_match.group(1) or href_match.group(2) or href_match.group(3) |
|
586 |
+ if not url: |
|
587 |
+ continue |
|
588 |
+ url = self.clean_link(urlparse.urljoin(self.base_url, url)) |
|
589 |
+ yield Link(url, self) |
|
590 |
+ |
|
591 |
+ _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) |
|
592 |
+ |
|
593 |
+ def clean_link(self, url): |
|
594 |
+ """Makes sure a link is fully encoded. That is, if a ' ' shows up in |
|
595 |
+ the link, it will be rewritten to %20 (while not over-quoting |
|
596 |
+ % or other characters).""" |
|
597 |
+ return self._clean_re.sub( |
|
598 |
+ lambda match: '%%%2x' % ord(match.group(0)), url) |
|
599 |
+ |
|
600 |
+ |
|
601 |
+class Link(object): |
|
602 |
+ |
|
603 |
+ def __init__(self, url, comes_from=None): |
|
604 |
+ self.url = url |
|
605 |
+ self.comes_from = comes_from |
|
606 |
+ |
|
607 |
+ def __str__(self): |
|
608 |
+ if self.comes_from: |
|
609 |
+ return '%s (from %s)' % (self.url, self.comes_from) |
|
610 |
+ else: |
|
611 |
+ return str(self.url) |
|
612 |
+ |
|
613 |
+ def __repr__(self): |
|
614 |
+ return '<Link %s>' % self |
|
615 |
+ |
|
616 |
+ def __eq__(self, other): |
|
617 |
+ return self.url == other.url |
|
618 |
+ |
|
619 |
+ def __ne__(self, other): |
|
620 |
+ return self.url != other.url |
|
621 |
+ |
|
622 |
+ def __lt__(self, other): |
|
623 |
+ return self.url < other.url |
|
624 |
+ |
|
625 |
+ def __le__(self, other): |
|
626 |
+ return self.url <= other.url |
|
627 |
+ |
|
628 |
+ def __gt__(self, other): |
|
629 |
+ return self.url > other.url |
|
630 |
+ |
|
631 |
+ def __ge__(self, other): |
|
632 |
+ return self.url >= other.url |
|
633 |
+ |
|
634 |
+ def __hash__(self): |
|
635 |
+ return hash(self.url) |
|
636 |
+ |
|
637 |
+ @property |
|
638 |
+ def filename(self): |
|
639 |
+ _, netloc, path, _, _ = urlparse.urlsplit(self.url) |
|
640 |
+ name = posixpath.basename(path.rstrip('/')) or netloc |
|
641 |
+ assert name, ('URL %r produced no filename' % self.url) |
|
642 |
+ return name |
|
643 |
+ |
|
644 |
+ @property |
|
645 |
+ def scheme(self): |
|
646 |
+ return urlparse.urlsplit(self.url)[0] |
|
647 |
+ |
|
648 |
+ @property |
|
649 |
+ def path(self): |
|
650 |
+ return urlparse.urlsplit(self.url)[2] |
|
651 |
+ |
|
652 |
+ def splitext(self): |
|
653 |
+ return splitext(posixpath.basename(self.path.rstrip('/'))) |
|
654 |
+ |
|
655 |
+ @property |
|
656 |
+ def url_without_fragment(self): |
|
657 |
+ scheme, netloc, path, query, fragment = urlparse.urlsplit(self.url) |
|
658 |
+ return urlparse.urlunsplit((scheme, netloc, path, query, None)) |
|
659 |
+ |
|
660 |
+ _egg_fragment_re = re.compile(r'#egg=([^&]*)') |
|
661 |
+ |
|
662 |
+ @property |
|
663 |
+ def egg_fragment(self): |
|
664 |
+ match = self._egg_fragment_re.search(self.url) |
|
665 |
+ if not match: |
|
666 |
+ return None |
|
667 |
+ return match.group(1) |
|
668 |
+ |
|
669 |
+ _hash_re = re.compile(r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)') |
|
670 |
+ |
|
671 |
+ @property |
|
672 |
+ def hash(self): |
|
673 |
+ match = self._hash_re.search(self.url) |
|
674 |
+ if match: |
|
675 |
+ return match.group(2) |
|
676 |
+ return None |
|
677 |
+ |
|
678 |
+ @property |
|
679 |
+ def hash_name(self): |
|
680 |
+ match = self._hash_re.search(self.url) |
|
681 |
+ if match: |
|
682 |
+ return match.group(1) |
|
683 |
+ return None |
|
684 |
+ |
|
685 |
+ @property |
|
686 |
+ def show_url(self): |
|
687 |
+ return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) |
|
688 |
+ |
|
689 |
+#An "Infinite Link" that compares greater than other links |
|
690 |
+InfLink = Link(Inf) #this object is not currently used as a sortable |
|
691 |
+ |
|
692 |
+ |
|
693 |
+def get_requirement_from_url(url): |
|
694 |
+ """Get a requirement from the URL, if possible. This looks for #egg |
|
695 |
+ in the URL""" |
|
696 |
+ link = Link(url) |
|
697 |
+ egg_info = link.egg_fragment |
|
698 |
+ if not egg_info: |
|
699 |
+ egg_info = splitext(link.filename)[0] |
|
700 |
+ return package_to_requirement(egg_info) |
|
701 |
+ |
|
702 |
+ |
|
703 |
+def package_to_requirement(package_name): |
|
704 |
+ """Translate a name like Foo-1.2 to Foo==1.3""" |
|
705 |
+ match = re.search(r'^(.*?)-(dev|\d.*)', package_name) |
|
706 |
+ if match: |
|
707 |
+ name = match.group(1) |
|
708 |
+ version = match.group(2) |
|
709 |
+ else: |
|
710 |
+ name = package_name |
|
711 |
+ version = '' |
|
712 |
+ if version: |
|
713 |
+ return '%s==%s' % (name, version) |
|
714 |
+ else: |
|
715 |
+ return name |
|
716 |
+ |
|
717 |
+ |
|
718 |
+def get_mirrors(hostname=None): |
|
719 |
+ """Return the list of mirrors from the last record found on the DNS |
|
720 |
+ entry:: |
|
721 |
+ |
|
722 |
+ >>> from pip.index import get_mirrors |
|
723 |
+ >>> get_mirrors() |
|
724 |
+ ['a.pypi.python.org', 'b.pypi.python.org', 'c.pypi.python.org', |
|
725 |
+ 'd.pypi.python.org'] |
|
726 |
+ |
|
727 |
+ Originally written for the distutils2 project by Alexis Metaireau. |
|
728 |
+ """ |
|
729 |
+ if hostname is None: |
|
730 |
+ hostname = DEFAULT_MIRROR_HOSTNAME |
|
731 |
+ |
|
732 |
+ # return the last mirror registered on PyPI. |
|
733 |
+ last_mirror_hostname = None |
|
734 |
+ try: |
|
735 |
+ last_mirror_hostname = socket.gethostbyname_ex(hostname)[0] |
|
736 |
+ except socket.gaierror: |
|
737 |
+ return [] |
|
738 |
+ if not last_mirror_hostname or last_mirror_hostname == DEFAULT_MIRROR_HOSTNAME: |
|
739 |
+ last_mirror_hostname = "z.pypi.python.org" |
|
740 |
+ end_letter = last_mirror_hostname.split(".", 1) |
|
741 |
+ |
|
742 |
+ # determine the list from the last one. |
|
743 |
+ return ["%s.%s" % (s, end_letter[1]) for s in string_range(end_letter[0])] |
|
744 |
+ |
|
745 |
+ |
|
746 |
+def string_range(last): |
|
747 |
+ """Compute the range of string between "a" and last. |
|
748 |
+ |
|
749 |
+ This works for simple "a to z" lists, but also for "a to zz" lists. |
|
750 |
+ """ |
|
751 |
+ for k in range(len(last)): |
|
752 |
+ for x in product(string.ascii_lowercase, repeat=k+1): |
|
753 |
+ result = ''.join(x) |
|
754 |
+ yield result |
|
755 |
+ if result == last: |
|
756 |
+ return |
|
757 |
+ |
2 | 760 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,100 @@ |
1 |
+"""Locations where we look for configs, install stuff, etc""" |
|
2 |
+ |
|
3 |
+import sys |
|
4 |
+import site |
|
5 |
+import os |
|
6 |
+import tempfile |
|
7 |
+import getpass |
|
8 |
+from pip.backwardcompat import get_python_lib |
|
9 |
+import pip.exceptions |
|
10 |
+ |
|
11 |
+default_cert_path = os.path.join(os.path.dirname(__file__), 'cacert.pem') |
|
12 |
+ |
|
13 |
+def running_under_virtualenv(): |
|
14 |
+ """ |
|
15 |
+ Return True if we're running inside a virtualenv, False otherwise. |
|
16 |
+ |
|
17 |
+ """ |
|
18 |
+ return hasattr(sys, 'real_prefix') |
|
19 |
+ |
|
20 |
+ |
|
21 |
+def virtualenv_no_global(): |
|
22 |
+ """ |
|
23 |
+ Return True if in a venv and no system site packages. |
|
24 |
+ """ |
|
25 |
+ #this mirrors the logic in virtualenv.py for locating the no-global-site-packages.txt file |
|
26 |
+ site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) |
|
27 |
+ no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') |
|
28 |
+ if running_under_virtualenv() and os.path.isfile(no_global_file): |
|
29 |
+ return True |
|
30 |
+ |
|
31 |
+def _get_build_prefix(): |
|
32 |
+ """ Returns a safe build_prefix """ |
|
33 |
+ path = os.path.join(tempfile.gettempdir(), 'pip-build-%s' % \ |
|
34 |
+ getpass.getuser()) |
|
35 |
+ if sys.platform == 'win32': |
|
36 |
+ """ on windows(tested on 7) temp dirs are isolated """ |
|
37 |
+ return path |
|
38 |
+ try: |
|
39 |
+ os.mkdir(path) |
|
40 |
+ except OSError: |
|
41 |
+ file_uid = None |
|
42 |
+ try: |
|
43 |
+ fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) |
|
44 |
+ file_uid = os.fstat(fd).st_uid |
|
45 |
+ os.close(fd) |
|
46 |
+ except OSError: |
|
47 |
+ file_uid = None |
|
48 |
+ if file_uid != os.getuid(): |
|
49 |
+ msg = "The temporary folder for building (%s) is not owned by your user!" \ |
|
50 |
+ % path |
|
51 |
+ print (msg) |
|
52 |
+ print("pip will not work until the temporary folder is " + \ |
|
53 |
+ "either deleted or owned by your user account.") |
|
54 |
+ raise pip.exceptions.InstallationError(msg) |
|
55 |
+ return path |
|
56 |
+ |
|
57 |
+if running_under_virtualenv(): |
|
58 |
+ build_prefix = os.path.join(sys.prefix, 'build') |
|
59 |
+ src_prefix = os.path.join(sys.prefix, 'src') |
|
60 |
+else: |
|
61 |
+ # Use tempfile to create a temporary folder for build |
|
62 |
+ # Note: we are NOT using mkdtemp so we can have a consistent build dir |
|
63 |
+ # Note: using realpath due to tmp dirs on OSX being symlinks |
|
64 |
+ build_prefix = _get_build_prefix() |
|
65 |
+ |
|
66 |
+ ## FIXME: keep src in cwd for now (it is not a temporary folder) |
|
67 |
+ try: |
|
68 |
+ src_prefix = os.path.join(os.getcwd(), 'src') |
|
69 |
+ except OSError: |
|
70 |
+ # In case the current working directory has been renamed or deleted |
|
71 |
+ sys.exit("The folder you are executing pip from can no longer be found.") |
|
72 |
+ |
|
73 |
+# under Mac OS X + virtualenv sys.prefix is not properly resolved |
|
74 |
+# it is something like /path/to/python/bin/.. |
|
75 |
+build_prefix = os.path.abspath(os.path.realpath(build_prefix)) |
|
76 |
+src_prefix = os.path.abspath(src_prefix) |
|
77 |
+ |
|
78 |
+# FIXME doesn't account for venv linked to global site-packages |
|
79 |
+ |
|
80 |
+site_packages = get_python_lib() |
|
81 |
+user_dir = os.path.expanduser('~') |
|
82 |
+if sys.platform == 'win32': |
|
83 |
+ bin_py = os.path.join(sys.prefix, 'Scripts') |
|
84 |
+ # buildout uses 'bin' on Windows too? |
|
85 |
+ if not os.path.exists(bin_py): |
|
86 |
+ bin_py = os.path.join(sys.prefix, 'bin') |
|
87 |
+ default_storage_dir = os.path.join(user_dir, 'pip') |
|
88 |
+ default_config_file = os.path.join(default_storage_dir, 'pip.ini') |
|
89 |
+ default_log_file = os.path.join(default_storage_dir, 'pip.log') |
|
90 |
+else: |
|
91 |
+ bin_py = os.path.join(sys.prefix, 'bin') |
|
92 |
+ default_storage_dir = os.path.join(user_dir, '.pip') |
|
93 |
+ default_config_file = os.path.join(default_storage_dir, 'pip.conf') |
|
94 |
+ default_log_file = os.path.join(default_storage_dir, 'pip.log') |
|
95 |
+ |
|
96 |
+ # Forcing to use /usr/local/bin for standard Mac OS X framework installs |
|
97 |
+ # Also log to ~/Library/Logs/ for use with the Console.app log viewer |
|
98 |
+ if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': |
|
99 |
+ bin_py = '/usr/local/bin' |
|
100 |
+ default_log_file = os.path.join(user_dir, 'Library/Logs/pip.log') |
2 | 103 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,187 @@ |
1 |
+"""Logging |
|
2 |
+""" |
|
3 |
+ |
|
4 |
+import sys |
|
5 |
+import logging |
|
6 |
+ |
|
7 |
+from pip import backwardcompat |
|
8 |
+ |
|
9 |
+ |
|
10 |
+class Logger(object): |
|
11 |
+ """ |
|
12 |
+ Logging object for use in command-line script. Allows ranges of |
|
13 |
+ levels, to avoid some redundancy of displayed information. |
|
14 |
+ """ |
|
15 |
+ VERBOSE_DEBUG = logging.DEBUG - 1 |
|
16 |
+ DEBUG = logging.DEBUG |
|
17 |
+ INFO = logging.INFO |
|
18 |
+ NOTIFY = (logging.INFO + logging.WARN) / 2 |
|
19 |
+ WARN = WARNING = logging.WARN |
|
20 |
+ ERROR = logging.ERROR |
|
21 |
+ FATAL = logging.FATAL |
|
22 |
+ |
|
23 |
+ LEVELS = [VERBOSE_DEBUG, DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL] |
|
24 |
+ |
|
25 |
+ def __init__(self): |
|
26 |
+ self.consumers = [] |
|
27 |
+ self.indent = 0 |
|
28 |
+ self.explicit_levels = False |
|
29 |
+ self.in_progress = None |
|
30 |
+ self.in_progress_hanging = False |
|
31 |
+ |
|
32 |
+ def debug(self, msg, *args, **kw): |
|
33 |
+ self.log(self.DEBUG, msg, *args, **kw) |
|
34 |
+ |
|
35 |
+ def info(self, msg, *args, **kw): |
|
36 |
+ self.log(self.INFO, msg, *args, **kw) |
|
37 |
+ |
|
38 |
+ def notify(self, msg, *args, **kw): |
|
39 |
+ self.log(self.NOTIFY, msg, *args, **kw) |
|
40 |
+ |
|
41 |
+ def warn(self, msg, *args, **kw): |
|
42 |
+ self.log(self.WARN, msg, *args, **kw) |
|
43 |
+ |
|
44 |
+ def error(self, msg, *args, **kw): |
|
45 |
+ self.log(self.WARN, msg, *args, **kw) |
|
46 |
+ |
|
47 |
+ def fatal(self, msg, *args, **kw): |
|
48 |
+ self.log(self.FATAL, msg, *args, **kw) |
|
49 |
+ |
|
50 |
+ def log(self, level, msg, *args, **kw): |
|
51 |
+ if args: |
|
52 |
+ if kw: |
|
53 |
+ raise TypeError( |
|
54 |
+ "You may give positional or keyword arguments, not both") |
|
55 |
+ args = args or kw |
|
56 |
+ rendered = None |
|
57 |
+ for consumer_level, consumer in self.consumers: |
|
58 |
+ if self.level_matches(level, consumer_level): |
|
59 |
+ if (self.in_progress_hanging |
|
60 |
+ and consumer in (sys.stdout, sys.stderr)): |
|
61 |
+ self.in_progress_hanging = False |
|
62 |
+ sys.stdout.write('\n') |
|
63 |
+ sys.stdout.flush() |
|
64 |
+ if rendered is None: |
|
65 |
+ if args: |
|
66 |
+ rendered = msg % args |
|
67 |
+ else: |
|
68 |
+ rendered = msg |
|
69 |
+ rendered = ' ' * self.indent + rendered |
|
70 |
+ if self.explicit_levels: |
|
71 |
+ ## FIXME: should this be a name, not a level number? |
|
72 |
+ rendered = '%02i %s' % (level, rendered) |
|
73 |
+ if hasattr(consumer, 'write'): |
|
74 |
+ rendered += '\n' |
|
75 |
+ backwardcompat.fwrite(consumer, rendered) |
|
76 |
+ else: |
|
77 |
+ consumer(rendered) |
|
78 |
+ |
|
79 |
+ def _show_progress(self): |
|
80 |
+ """Should we display download progress?""" |
|
81 |
+ return (self.stdout_level_matches(self.NOTIFY) and sys.stdout.isatty()) |
|
82 |
+ |
|
83 |
+ def start_progress(self, msg): |
|
84 |
+ assert not self.in_progress, ( |
|
85 |
+ "Tried to start_progress(%r) while in_progress %r" |
|
86 |
+ % (msg, self.in_progress)) |
|
87 |
+ if self._show_progress(): |
|
88 |
+ sys.stdout.write(' ' * self.indent + msg) |
|
89 |
+ sys.stdout.flush() |
|
90 |
+ self.in_progress_hanging = True |
|
91 |
+ else: |
|
92 |
+ self.in_progress_hanging = False |
|
93 |
+ self.in_progress = msg |
|
94 |
+ self.last_message = None |
|
95 |
+ |
|
96 |
+ def end_progress(self, msg='done.'): |
|
97 |
+ assert self.in_progress, ( |
|
98 |
+ "Tried to end_progress without start_progress") |
|
99 |
+ if self._show_progress(): |
|
100 |
+ if not self.in_progress_hanging: |
|
101 |
+ # Some message has been printed out since start_progress |
|
102 |
+ sys.stdout.write('...' + self.in_progress + msg + '\n') |
|
103 |
+ sys.stdout.flush() |
|
104 |
+ else: |
|
105 |
+ # These erase any messages shown with show_progress (besides .'s) |
|
106 |
+ logger.show_progress('') |
|
107 |
+ logger.show_progress('') |
|
108 |
+ sys.stdout.write(msg + '\n') |
|
109 |
+ sys.stdout.flush() |
|
110 |
+ self.in_progress = None |
|
111 |
+ self.in_progress_hanging = False |
|
112 |
+ |
|
113 |
+ def show_progress(self, message=None): |
|
114 |
+ """If we are in a progress scope, and no log messages have been |
|
115 |
+ shown, write out another '.'""" |
|
116 |
+ if self.in_progress_hanging: |
|
117 |
+ if message is None: |
|
118 |
+ sys.stdout.write('.') |
|
119 |
+ sys.stdout.flush() |
|
120 |
+ else: |
|
121 |
+ if self.last_message: |
|
122 |
+ padding = ' ' * max(0, len(self.last_message) - len(message)) |
|
123 |
+ else: |
|
124 |
+ padding = '' |
|
125 |
+ sys.stdout.write('\r%s%s%s%s' % |
|
126 |
+ (' ' * self.indent, self.in_progress, message, padding)) |
|
127 |
+ sys.stdout.flush() |
|
128 |
+ self.last_message = message |
|
129 |
+ |
|
130 |
+ def stdout_level_matches(self, level): |
|
131 |
+ """Returns true if a message at this level will go to stdout""" |
|
132 |
+ return self.level_matches(level, self._stdout_level()) |
|
133 |
+ |
|
134 |
+ def _stdout_level(self): |
|
135 |
+ """Returns the level that stdout runs at""" |
|
136 |
+ for level, consumer in self.consumers: |
|
137 |
+ if consumer is sys.stdout: |
|
138 |
+ return level |
|
139 |
+ return self.FATAL |
|
140 |
+ |
|
141 |
+ def level_matches(self, level, consumer_level): |
|
142 |
+ """ |
|
143 |
+ >>> l = Logger() |
|
144 |
+ >>> l.level_matches(3, 4) |
|
145 |
+ False |
|
146 |
+ >>> l.level_matches(3, 2) |
|
147 |
+ True |
|
148 |
+ >>> l.level_matches(slice(None, 3), 3) |
|
149 |
+ False |
|
150 |
+ >>> l.level_matches(slice(None, 3), 2) |
|
151 |
+ True |
|
152 |
+ >>> l.level_matches(slice(1, 3), 1) |
|
153 |
+ True |
|
154 |
+ >>> l.level_matches(slice(2, 3), 1) |
|
155 |
+ False |
|
156 |
+ """ |
|
157 |
+ if isinstance(level, slice): |
|
158 |
+ start, stop = level.start, level.stop |
|
159 |
+ if start is not None and start > consumer_level: |
|
160 |
+ return False |
|
161 |
+ if stop is not None or stop <= consumer_level: |
|
162 |
+ return False |
|
163 |
+ return True |
|
164 |
+ else: |
|
165 |
+ return level >= consumer_level |
|
166 |
+ |
|
167 |
+ @classmethod |
|
168 |
+ def level_for_integer(cls, level): |
|
169 |
+ levels = cls.LEVELS |
|
170 |
+ if level < 0: |
|
171 |
+ return levels[0] |
|
172 |
+ if level >= len(levels): |
|
173 |
+ return levels[-1] |
|
174 |
+ return levels[level] |
|
175 |
+ |
|
176 |
+ def move_stdout_to_stderr(self): |
|
177 |
+ to_remove = [] |
|
178 |
+ to_add = [] |
|
179 |
+ for consumer_level, consumer in self.consumers: |
|
180 |
+ if consumer == sys.stdout: |
|
181 |
+ to_remove.append((consumer_level, consumer)) |
|
182 |
+ to_add.append((consumer_level, sys.stderr)) |
|
183 |
+ for item in to_remove: |
|
184 |
+ self.consumers.remove(item) |
|
185 |
+ self.consumers.extend(to_add) |
|
186 |
+ |
|
187 |
+logger = Logger() |
2 | 190 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,1613 @@ |
1 |
+from email.parser import FeedParser |
|
2 |
+import os |
|
3 |
+import imp |
|
4 |
+import pkg_resources |
|
5 |
+import re |
|
6 |
+import sys |
|
7 |
+import shutil |
|
8 |
+import tempfile |
|
9 |
+import zipfile |
|
10 |
+ |
|
11 |
+from distutils.util import change_root |
|
12 |
+from pip.locations import bin_py, running_under_virtualenv |
|
13 |
+from pip.exceptions import (InstallationError, UninstallationError, |
|
14 |
+ BestVersionAlreadyInstalled, |
|
15 |
+ DistributionNotFound) |
|
16 |
+from pip.vcs import vcs |
|
17 |
+from pip.log import logger |
|
18 |
+from pip.util import (display_path, rmtree, ask, ask_path_exists, backup_dir, |
|
19 |
+ is_installable_dir, is_local, dist_is_local, |
|
20 |
+ dist_in_usersite, dist_in_site_packages, renames, |
|
21 |
+ normalize_path, egg_link_path, make_path_relative, |
|
22 |
+ call_subprocess) |
|
23 |
+from pip.backwardcompat import (urlparse, urllib, uses_pycache, |
|
24 |
+ ConfigParser, string_types, HTTPError, |
|
25 |
+ get_python_version, b) |
|
26 |
+from pip.index import Link |
|
27 |
+from pip.locations import build_prefix |
|
28 |
+from pip.download import (get_file_content, is_url, url_to_path, |
|
29 |
+ path_to_url, is_archive_file, |
|
30 |
+ unpack_vcs_link, is_vcs_url, is_file_url, |
|
31 |
+ unpack_file_url, unpack_http_url) |
|
32 |
+ |
|
33 |
+ |
|
34 |
+PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' |
|
35 |
+ |
|
36 |
+ |
|
37 |
+class InstallRequirement(object): |
|
38 |
+ |
|
39 |
+ def __init__(self, req, comes_from, source_dir=None, editable=False, |
|
40 |
+ url=None, as_egg=False, update=True): |
|
41 |
+ self.extras = () |
|
42 |
+ if isinstance(req, string_types): |
|
43 |
+ req = pkg_resources.Requirement.parse(req) |
|
44 |
+ self.extras = req.extras |
|
45 |
+ self.req = req |
|
46 |
+ self.comes_from = comes_from |
|
47 |
+ self.source_dir = source_dir |
|
48 |
+ self.editable = editable |
|
49 |
+ self.url = url |
|
50 |
+ self.as_egg = as_egg |
|
51 |
+ self._egg_info_path = None |
|
52 |
+ # This holds the pkg_resources.Distribution object if this requirement |
|
53 |
+ # is already available: |
|
54 |
+ self.satisfied_by = None |
|
55 |
+ # This hold the pkg_resources.Distribution object if this requirement |
|
56 |
+ # conflicts with another installed distribution: |
|
57 |
+ self.conflicts_with = None |
|
58 |
+ self._temp_build_dir = None |
|
59 |
+ self._is_bundle = None |
|
60 |
+ # True if the editable should be updated: |
|
61 |
+ self.update = update |
|
62 |
+ # Set to True after successful installation |
|
63 |
+ self.install_succeeded = None |
|
64 |
+ # UninstallPathSet of uninstalled distribution (for possible rollback) |
|
65 |
+ self.uninstalled = None |
|
66 |
+ self.use_user_site = False |
|
67 |
+ |
|
68 |
+ @classmethod |
|
69 |
+ def from_editable(cls, editable_req, comes_from=None, default_vcs=None): |
|
70 |
+ name, url, extras_override = parse_editable(editable_req, default_vcs) |
|
71 |
+ if url.startswith('file:'): |
|
72 |
+ source_dir = url_to_path(url) |
|
73 |
+ else: |
|
74 |
+ source_dir = None |
|
75 |
+ |
|
76 |
+ res = cls(name, comes_from, source_dir=source_dir, editable=True, url=url) |
|
77 |
+ |
|
78 |
+ if extras_override is not None: |
|
79 |
+ res.extras = extras_override |
|
80 |
+ |
|
81 |
+ return res |
|
82 |
+ |
|
83 |
+ @classmethod |
|
84 |
+ def from_line(cls, name, comes_from=None): |
|
85 |
+ """Creates an InstallRequirement from a name, which might be a |
|
86 |
+ requirement, directory containing 'setup.py', filename, or URL. |
|
87 |
+ """ |
|
88 |
+ url = None |
|
89 |
+ name = name.strip() |
|
90 |
+ req = None |
|
91 |
+ path = os.path.normpath(os.path.abspath(name)) |
|
92 |
+ link = None |
|
93 |
+ |
|
94 |
+ if is_url(name): |
|
95 |
+ link = Link(name) |
|
96 |
+ elif os.path.isdir(path) and (os.path.sep in name or name.startswith('.')): |
|
97 |
+ if not is_installable_dir(path): |
|
98 |
+ raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % name) |
|
99 |
+ link = Link(path_to_url(name)) |
|
100 |
+ elif is_archive_file(path): |
|
101 |
+ if not os.path.isfile(path): |
|
102 |
+ logger.warn('Requirement %r looks like a filename, but the file does not exist', name) |
|
103 |
+ link = Link(path_to_url(name)) |
|
104 |
+ |
|
105 |
+ # If the line has an egg= definition, but isn't editable, pull the requirement out. |
|
106 |
+ # Otherwise, assume the name is the req for the non URL/path/archive case. |
|
107 |
+ if link and req is None: |
|
108 |
+ url = link.url_without_fragment |
|
109 |
+ req = link.egg_fragment #when fragment is None, this will become an 'unnamed' requirement |
|
110 |
+ |
|
111 |
+ # Handle relative file URLs |
|
112 |
+ if link.scheme == 'file' and re.search(r'\.\./', url): |
|
113 |
+ url = path_to_url(os.path.normpath(os.path.abspath(link.path))) |
|
114 |
+ |
|
115 |
+ else: |
|
116 |
+ req = name |
|
117 |
+ |
|
118 |
+ return cls(req, comes_from, url=url) |
|
119 |
+ |
|
120 |
+ def __str__(self): |
|
121 |
+ if self.req: |
|
122 |
+ s = str(self.req) |
|
123 |
+ if self.url: |
|
124 |
+ s += ' from %s' % self.url |
|
125 |
+ else: |
|
126 |
+ s = self.url |
|
127 |
+ if self.satisfied_by is not None: |
|
128 |
+ s += ' in %s' % display_path(self.satisfied_by.location) |
|
129 |
+ if self.comes_from: |
|
130 |
+ if isinstance(self.comes_from, string_types): |
|
131 |
+ comes_from = self.comes_from |
|
132 |
+ else: |
|
133 |
+ comes_from = self.comes_from.from_path() |
|
134 |
+ if comes_from: |
|
135 |
+ s += ' (from %s)' % comes_from |
|
136 |
+ return s |
|
137 |
+ |
|
138 |
+ def from_path(self): |
|
139 |
+ if self.req is None: |
|
140 |
+ return None |
|
141 |
+ s = str(self.req) |
|
142 |
+ if self.comes_from: |
|
143 |
+ if isinstance(self.comes_from, string_types): |
|
144 |
+ comes_from = self.comes_from |
|
145 |
+ else: |
|
146 |
+ comes_from = self.comes_from.from_path() |
|
147 |
+ if comes_from: |
|
148 |
+ s += '->' + comes_from |
|
149 |
+ return s |
|
150 |
+ |
|
151 |
+ def build_location(self, build_dir, unpack=True): |
|
152 |
+ if self._temp_build_dir is not None: |
|
153 |
+ return self._temp_build_dir |
|
154 |
+ if self.req is None: |
|
155 |
+ self._temp_build_dir = tempfile.mkdtemp('-build', 'pip-') |
|
156 |
+ self._ideal_build_dir = build_dir |
|
157 |
+ return self._temp_build_dir |
|
158 |
+ if self.editable: |
|
159 |
+ name = self.name.lower() |
|
160 |
+ else: |
|
161 |
+ name = self.name |
|
162 |
+ # FIXME: Is there a better place to create the build_dir? (hg and bzr need this) |
|
163 |
+ if not os.path.exists(build_dir): |
|
164 |
+ _make_build_dir(build_dir) |
|
165 |
+ return os.path.join(build_dir, name) |
|
166 |
+ |
|
167 |
+ def correct_build_location(self): |
|
168 |
+ """If the build location was a temporary directory, this will move it |
|
169 |
+ to a new more permanent location""" |
|
170 |
+ if self.source_dir is not None: |
|
171 |
+ return |
|
172 |
+ assert self.req is not None |
|
173 |
+ assert self._temp_build_dir |
|
174 |
+ old_location = self._temp_build_dir |
|
175 |
+ new_build_dir = self._ideal_build_dir |
|
176 |
+ del self._ideal_build_dir |
|
177 |
+ if self.editable: |
|
178 |
+ name = self.name.lower() |
|
179 |
+ else: |
|
180 |
+ name = self.name |
|
181 |
+ new_location = os.path.join(new_build_dir, name) |
|
182 |
+ if not os.path.exists(new_build_dir): |
|
183 |
+ logger.debug('Creating directory %s' % new_build_dir) |
|
184 |
+ _make_build_dir(new_build_dir) |
|
185 |
+ if os.path.exists(new_location): |
|
186 |
+ raise InstallationError( |
|
187 |
+ 'A package already exists in %s; please remove it to continue' |
|
188 |
+ % display_path(new_location)) |
|
189 |
+ logger.debug('Moving package %s from %s to new location %s' |
|
190 |
+ % (self, display_path(old_location), display_path(new_location))) |
|
191 |
+ shutil.move(old_location, new_location) |
|
192 |
+ self._temp_build_dir = new_location |
|
193 |
+ self.source_dir = new_location |
|
194 |
+ self._egg_info_path = None |
|
195 |
+ |
|
196 |
+ @property |
|
197 |
+ def name(self): |
|
198 |
+ if self.req is None: |
|
199 |
+ return None |
|
200 |
+ return self.req.project_name |
|
201 |
+ |
|
202 |
+ @property |
|
203 |
+ def url_name(self): |
|
204 |
+ if self.req is None: |
|
205 |
+ return None |
|
206 |
+ return urllib.quote(self.req.unsafe_name) |
|
207 |
+ |
|
208 |
+ @property |
|
209 |
+ def setup_py(self): |
|
210 |
+ return os.path.join(self.source_dir, 'setup.py') |
|
211 |
+ |
|
212 |
+ def run_egg_info(self, force_root_egg_info=False): |
|
213 |
+ assert self.source_dir |
|
214 |
+ if self.name: |
|
215 |
+ logger.notify('Running setup.py egg_info for package %s' % self.name) |
|
216 |
+ else: |
|
217 |
+ logger.notify('Running setup.py egg_info for package from %s' % self.url) |
|
218 |
+ logger.indent += 2 |
|
219 |
+ try: |
|
220 |
+ script = self._run_setup_py |
|
221 |
+ script = script.replace('__SETUP_PY__', repr(self.setup_py)) |
|
222 |
+ script = script.replace('__PKG_NAME__', repr(self.name)) |
|
223 |
+ # We can't put the .egg-info files at the root, because then the source code will be mistaken |
|
224 |
+ # for an installed egg, causing problems |
|
225 |
+ if self.editable or force_root_egg_info: |
|
226 |
+ egg_base_option = [] |
|
227 |
+ else: |
|
228 |
+ egg_info_dir = os.path.join(self.source_dir, 'pip-egg-info') |
|
229 |
+ if not os.path.exists(egg_info_dir): |
|
230 |
+ os.makedirs(egg_info_dir) |
|
231 |
+ egg_base_option = ['--egg-base', 'pip-egg-info'] |
|
232 |
+ call_subprocess( |
|
233 |
+ [sys.executable, '-c', script, 'egg_info'] + egg_base_option, |
|
234 |
+ cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False, |
|
235 |
+ command_level=logger.VERBOSE_DEBUG, |
|
236 |
+ command_desc='python setup.py egg_info') |
|
237 |
+ finally: |
|
238 |
+ logger.indent -= 2 |
|
239 |
+ if not self.req: |
|
240 |
+ self.req = pkg_resources.Requirement.parse( |
|
241 |
+ "%(Name)s==%(Version)s" % self.pkg_info()) |
|
242 |
+ self.correct_build_location() |
|
243 |
+ |
|
244 |
+ ## FIXME: This is a lame hack, entirely for PasteScript which has |
|
245 |
+ ## a self-provided entry point that causes this awkwardness |
|
246 |
+ _run_setup_py = """ |
|
247 |
+__file__ = __SETUP_PY__ |
|
248 |
+from setuptools.command import egg_info |
|
249 |
+import pkg_resources |
|
250 |
+import os |
|
251 |
+def replacement_run(self): |
|
252 |
+ self.mkpath(self.egg_info) |
|
253 |
+ installer = self.distribution.fetch_build_egg |
|
254 |
+ for ep in pkg_resources.iter_entry_points('egg_info.writers'): |
|
255 |
+ # require=False is the change we're making: |
|
256 |
+ writer = ep.load(require=False) |
|
257 |
+ if writer: |
|
258 |
+ writer(self, ep.name, os.path.join(self.egg_info,ep.name)) |
|
259 |
+ self.find_sources() |
|
260 |
+egg_info.egg_info.run = replacement_run |
|
261 |
+exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec')) |
|
262 |
+""" |
|
263 |
+ |
|
264 |
+ def egg_info_data(self, filename): |
|
265 |
+ if self.satisfied_by is not None: |
|
266 |
+ if not self.satisfied_by.has_metadata(filename): |
|
267 |
+ return None |
|
268 |
+ return self.satisfied_by.get_metadata(filename) |
|
269 |
+ assert self.source_dir |
|
270 |
+ filename = self.egg_info_path(filename) |
|
271 |
+ if not os.path.exists(filename): |
|
272 |
+ return None |
|
273 |
+ fp = open(filename, 'r') |
|
274 |
+ data = fp.read() |
|
275 |
+ fp.close() |
|
276 |
+ return data |
|
277 |
+ |
|
278 |
+ def egg_info_path(self, filename): |
|
279 |
+ if self._egg_info_path is None: |
|
280 |
+ if self.editable: |
|
281 |
+ base = self.source_dir |
|
282 |
+ else: |
|
283 |
+ base = os.path.join(self.source_dir, 'pip-egg-info') |
|
284 |
+ filenames = os.listdir(base) |
|
285 |
+ if self.editable: |
|
286 |
+ filenames = [] |
|
287 |
+ for root, dirs, files in os.walk(base): |
|
288 |
+ for dir in vcs.dirnames: |
|
289 |
+ if dir in dirs: |
|
290 |
+ dirs.remove(dir) |
|
291 |
+ # Iterate over a copy of ``dirs``, since mutating |
|
292 |
+ # a list while iterating over it can cause trouble. |
|
293 |
+ # (See https://github.com/pypa/pip/pull/462.) |
|
294 |
+ for dir in list(dirs): |
|
295 |
+ # Don't search in anything that looks like a virtualenv environment |
|
296 |
+ if (os.path.exists(os.path.join(root, dir, 'bin', 'python')) |
|
297 |
+ or os.path.exists(os.path.join(root, dir, 'Scripts', 'Python.exe'))): |
|
298 |
+ dirs.remove(dir) |
|
299 |
+ # Also don't search through tests |
|
300 |
+ if dir == 'test' or dir == 'tests': |
|
301 |
+ dirs.remove(dir) |
|
302 |
+ filenames.extend([os.path.join(root, dir) |
|
303 |
+ for dir in dirs]) |
|
304 |
+ filenames = [f for f in filenames if f.endswith('.egg-info')] |
|
305 |
+ |
|
306 |
+ if not filenames: |
|
307 |
+ raise InstallationError('No files/directories in %s (from %s)' % (base, filename)) |
|
308 |
+ assert filenames, "No files/directories in %s (from %s)" % (base, filename) |
|
309 |
+ |
|
310 |
+ # if we have more than one match, we pick the toplevel one. This can |
|
311 |
+ # easily be the case if there is a dist folder which contains an |
|
312 |
+ # extracted tarball for testing purposes. |
|
313 |
+ if len(filenames) > 1: |
|
314 |
+ filenames.sort(key=lambda x: x.count(os.path.sep) + |
|
315 |
+ (os.path.altsep and |
|
316 |
+ x.count(os.path.altsep) or 0)) |
|
317 |
+ self._egg_info_path = os.path.join(base, filenames[0]) |
|
318 |
+ return os.path.join(self._egg_info_path, filename) |
|
319 |
+ |
|
320 |
+ def egg_info_lines(self, filename): |
|
321 |
+ data = self.egg_info_data(filename) |
|
322 |
+ if not data: |
|
323 |
+ return [] |
|
324 |
+ result = [] |
|
325 |
+ for line in data.splitlines(): |
|
326 |
+ line = line.strip() |
|
327 |
+ if not line or line.startswith('#'): |
|
328 |
+ continue |
|
329 |
+ result.append(line) |
|
330 |
+ return result |
|
331 |
+ |
|
332 |
+ def pkg_info(self): |
|
333 |
+ p = FeedParser() |
|
334 |
+ data = self.egg_info_data('PKG-INFO') |
|
335 |
+ if not data: |
|
336 |
+ logger.warn('No PKG-INFO file found in %s' % display_path(self.egg_info_path('PKG-INFO'))) |
|
337 |
+ p.feed(data or '') |
|
338 |
+ return p.close() |
|
339 |
+ |
|
340 |
+ @property |
|
341 |
+ def dependency_links(self): |
|
342 |
+ return self.egg_info_lines('dependency_links.txt') |
|
343 |
+ |
|
344 |
+ _requirements_section_re = re.compile(r'\[(.*?)\]') |
|
345 |
+ |
|
346 |
+ def requirements(self, extras=()): |
|
347 |
+ in_extra = None |
|
348 |
+ for line in self.egg_info_lines('requires.txt'): |
|
349 |
+ match = self._requirements_section_re.match(line.lower()) |
|
350 |
+ if match: |
|
351 |
+ in_extra = match.group(1) |
|
352 |
+ continue |
|
353 |
+ if in_extra and in_extra not in extras: |
|
354 |
+ logger.debug('skipping extra %s' % in_extra) |
|
355 |
+ # Skip requirement for an extra we aren't requiring |
|
356 |
+ continue |
|
357 |
+ yield line |
|
358 |
+ |
|
359 |
+ @property |
|
360 |
+ def absolute_versions(self): |
|
361 |
+ for qualifier, version in self.req.specs: |
|
362 |
+ if qualifier == '==': |
|
363 |
+ yield version |
|
364 |
+ |
|
365 |
+ @property |
|
366 |
+ def installed_version(self): |
|
367 |
+ return self.pkg_info()['version'] |
|
368 |
+ |
|
369 |
+ def assert_source_matches_version(self): |
|
370 |
+ assert self.source_dir |
|
371 |
+ version = self.installed_version |
|
372 |
+ if version not in self.req: |
|
373 |
+ logger.warn('Requested %s, but installing version %s' % (self, self.installed_version)) |
|
374 |
+ else: |
|
375 |
+ logger.debug('Source in %s has version %s, which satisfies requirement %s' |
|
376 |
+ % (display_path(self.source_dir), version, self)) |
|
377 |
+ |
|
378 |
+ def update_editable(self, obtain=True): |
|
379 |
+ if not self.url: |
|
380 |
+ logger.info("Cannot update repository at %s; repository location is unknown" % self.source_dir) |
|
381 |
+ return |
|
382 |
+ assert self.editable |
|
383 |
+ assert self.source_dir |
|
384 |
+ if self.url.startswith('file:'): |
|
385 |
+ # Static paths don't get updated |
|
386 |
+ return |
|
387 |
+ assert '+' in self.url, "bad url: %r" % self.url |
|
388 |
+ if not self.update: |
|
389 |
+ return |
|
390 |
+ vc_type, url = self.url.split('+', 1) |
|
391 |
+ backend = vcs.get_backend(vc_type) |
|
392 |
+ if backend: |
|
393 |
+ vcs_backend = backend(self.url) |
|
394 |
+ if obtain: |
|
395 |
+ vcs_backend.obtain(self.source_dir) |
|
396 |
+ else: |
|
397 |
+ vcs_backend.export(self.source_dir) |
|
398 |
+ else: |
|
399 |
+ assert 0, ( |
|
400 |
+ 'Unexpected version control type (in %s): %s' |
|
401 |
+ % (self.url, vc_type)) |
|
402 |
+ |
|
403 |
+ def uninstall(self, auto_confirm=False): |
|
404 |
+ """ |
|
405 |
+ Uninstall the distribution currently satisfying this requirement. |
|
406 |
+ |
|
407 |
+ Prompts before removing or modifying files unless |
|
408 |
+ ``auto_confirm`` is True. |
|
409 |
+ |
|
410 |
+ Refuses to delete or modify files outside of ``sys.prefix`` - |
|
411 |
+ thus uninstallation within a virtual environment can only |
|
412 |
+ modify that virtual environment, even if the virtualenv is |
|
413 |
+ linked to global site-packages. |
|
414 |
+ |
|
415 |
+ """ |
|
416 |
+ if not self.check_if_exists(): |
|
417 |
+ raise UninstallationError("Cannot uninstall requirement %s, not installed" % (self.name,)) |
|
418 |
+ dist = self.satisfied_by or self.conflicts_with |
|
419 |
+ |
|
420 |
+ paths_to_remove = UninstallPathSet(dist) |
|
421 |
+ |
|
422 |
+ pip_egg_info_path = os.path.join(dist.location, |
|
423 |
+ dist.egg_name()) + '.egg-info' |
|
424 |
+ # workaround for http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367 |
|
425 |
+ debian_egg_info_path = pip_egg_info_path.replace( |
|
426 |
+ '-py%s' % pkg_resources.PY_MAJOR, '') |
|
427 |
+ easy_install_egg = dist.egg_name() + '.egg' |
|
428 |
+ develop_egg_link = egg_link_path(dist) |
|
429 |
+ |
|
430 |
+ pip_egg_info_exists = os.path.exists(pip_egg_info_path) |
|
431 |
+ debian_egg_info_exists = os.path.exists(debian_egg_info_path) |
|
432 |
+ if pip_egg_info_exists or debian_egg_info_exists: |
|
433 |
+ # package installed by pip |
|
434 |
+ if pip_egg_info_exists: |
|
435 |
+ egg_info_path = pip_egg_info_path |
|
436 |
+ else: |
|
437 |
+ egg_info_path = debian_egg_info_path |
|
438 |
+ paths_to_remove.add(egg_info_path) |
|
439 |
+ if dist.has_metadata('installed-files.txt'): |
|
440 |
+ for installed_file in dist.get_metadata('installed-files.txt').splitlines(): |
|
441 |
+ path = os.path.normpath(os.path.join(egg_info_path, installed_file)) |
|
442 |
+ paths_to_remove.add(path) |
|
443 |
+ #FIXME: need a test for this elif block |
|
444 |
+ #occurs with --single-version-externally-managed/--record outside of pip |
|
445 |
+ elif dist.has_metadata('top_level.txt'): |
|
446 |
+ if dist.has_metadata('namespace_packages.txt'): |
|
447 |
+ namespaces = dist.get_metadata('namespace_packages.txt') |
|
448 |
+ else: |
|
449 |
+ namespaces = [] |
|
450 |
+ for top_level_pkg in [p for p |
|
451 |
+ in dist.get_metadata('top_level.txt').splitlines() |
|
452 |
+ if p and p not in namespaces]: |
|
453 |
+ path = os.path.join(dist.location, top_level_pkg) |
|
454 |
+ paths_to_remove.add(path) |
|
455 |
+ paths_to_remove.add(path + '.py') |
|
456 |
+ paths_to_remove.add(path + '.pyc') |
|
457 |
+ |
|
458 |
+ elif dist.location.endswith(easy_install_egg): |
|
459 |
+ # package installed by easy_install |
|
460 |
+ paths_to_remove.add(dist.location) |
|
461 |
+ easy_install_pth = os.path.join(os.path.dirname(dist.location), |
|
462 |
+ 'easy-install.pth') |
|
463 |
+ paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) |
|
464 |
+ |
|
465 |
+ elif develop_egg_link: |
|
466 |
+ # develop egg |
|
467 |
+ fh = open(develop_egg_link, 'r') |
|
468 |
+ link_pointer = os.path.normcase(fh.readline().strip()) |
|
469 |
+ fh.close() |
|
470 |
+ assert (link_pointer == dist.location), 'Egg-link %s does not match installed location of %s (at %s)' % (link_pointer, self.name, dist.location) |
|
471 |
+ paths_to_remove.add(develop_egg_link) |
|
472 |
+ easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), |
|
473 |
+ 'easy-install.pth') |
|
474 |
+ paths_to_remove.add_pth(easy_install_pth, dist.location) |
|
475 |
+ |
|
476 |
+ # find distutils scripts= scripts |
|
477 |
+ if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): |
|
478 |
+ for script in dist.metadata_listdir('scripts'): |
|
479 |
+ paths_to_remove.add(os.path.join(bin_py, script)) |
|
480 |
+ if sys.platform == 'win32': |
|
481 |
+ paths_to_remove.add(os.path.join(bin_py, script) + '.bat') |
|
482 |
+ |
|
483 |
+ # find console_scripts |
|
484 |
+ if dist.has_metadata('entry_points.txt'): |
|
485 |
+ config = ConfigParser.SafeConfigParser() |
|
486 |
+ config.readfp(FakeFile(dist.get_metadata_lines('entry_points.txt'))) |
|
487 |
+ if config.has_section('console_scripts'): |
|
488 |
+ for name, value in config.items('console_scripts'): |
|
489 |
+ paths_to_remove.add(os.path.join(bin_py, name)) |
|
490 |
+ if sys.platform == 'win32': |
|
491 |
+ paths_to_remove.add(os.path.join(bin_py, name) + '.exe') |
|
492 |
+ paths_to_remove.add(os.path.join(bin_py, name) + '.exe.manifest') |
|
493 |
+ paths_to_remove.add(os.path.join(bin_py, name) + '-script.py') |
|
494 |
+ |
|
495 |
+ paths_to_remove.remove(auto_confirm) |
|
496 |
+ self.uninstalled = paths_to_remove |
|
497 |
+ |
|
498 |
+ def rollback_uninstall(self): |
|
499 |
+ if self.uninstalled: |
|
500 |
+ self.uninstalled.rollback() |
|
501 |
+ else: |
|
502 |
+ logger.error("Can't rollback %s, nothing uninstalled." |
|
503 |
+ % (self.project_name,)) |
|
504 |
+ |
|
505 |
+ def commit_uninstall(self): |
|
506 |
+ if self.uninstalled: |
|
507 |
+ self.uninstalled.commit() |
|
508 |
+ else: |
|
509 |
+ logger.error("Can't commit %s, nothing uninstalled." |
|
510 |
+ % (self.project_name,)) |
|
511 |
+ |
|
512 |
+ def archive(self, build_dir): |
|
513 |
+ assert self.source_dir |
|
514 |
+ create_archive = True |
|
515 |
+ archive_name = '%s-%s.zip' % (self.name, self.installed_version) |
|
516 |
+ archive_path = os.path.join(build_dir, archive_name) |
|
517 |
+ if os.path.exists(archive_path): |
|
518 |
+ response = ask_path_exists( |
|
519 |
+ 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % |
|
520 |
+ display_path(archive_path), ('i', 'w', 'b')) |
|
521 |
+ if response == 'i': |
|
522 |
+ create_archive = False |
|
523 |
+ elif response == 'w': |
|
524 |
+ logger.warn('Deleting %s' % display_path(archive_path)) |
|
525 |
+ os.remove(archive_path) |
|
526 |
+ elif response == 'b': |
|
527 |
+ dest_file = backup_dir(archive_path) |
|
528 |
+ logger.warn('Backing up %s to %s' |
|
529 |
+ % (display_path(archive_path), display_path(dest_file))) |
|
530 |
+ shutil.move(archive_path, dest_file) |
|
531 |
+ if create_archive: |
|
532 |
+ zip = zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) |
|
533 |
+ dir = os.path.normcase(os.path.abspath(self.source_dir)) |
|
534 |
+ for dirpath, dirnames, filenames in os.walk(dir): |
|
535 |
+ if 'pip-egg-info' in dirnames: |
|
536 |
+ dirnames.remove('pip-egg-info') |
|
537 |
+ for dirname in dirnames: |
|
538 |
+ dirname = os.path.join(dirpath, dirname) |
|
539 |
+ name = self._clean_zip_name(dirname, dir) |
|
540 |
+ zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') |
|
541 |
+ zipdir.external_attr = 0x1ED << 16 # 0o755 |
|
542 |
+ zip.writestr(zipdir, '') |
|
543 |
+ for filename in filenames: |
|
544 |
+ if filename == PIP_DELETE_MARKER_FILENAME: |
|
545 |
+ continue |
|
546 |
+ filename = os.path.join(dirpath, filename) |
|
547 |
+ name = self._clean_zip_name(filename, dir) |
|
548 |
+ zip.write(filename, self.name + '/' + name) |
|
549 |
+ zip.close() |
|
550 |
+ logger.indent -= 2 |
|
551 |
+ logger.notify('Saved %s' % display_path(archive_path)) |
|
552 |
+ |
|
553 |
+ def _clean_zip_name(self, name, prefix): |
|
554 |
+ assert name.startswith(prefix+os.path.sep), ( |
|
555 |
+ "name %r doesn't start with prefix %r" % (name, prefix)) |
|
556 |
+ name = name[len(prefix)+1:] |
|
557 |
+ name = name.replace(os.path.sep, '/') |
|
558 |
+ return name |
|
559 |
+ |
|
560 |
+ def install(self, install_options, global_options=(), root=None): |
|
561 |
+ if self.editable: |
|
562 |
+ self.install_editable(install_options, global_options) |
|
563 |
+ return |
|
564 |
+ |
|
565 |
+ temp_location = tempfile.mkdtemp('-record', 'pip-') |
|
566 |
+ record_filename = os.path.join(temp_location, 'install-record.txt') |
|
567 |
+ try: |
|
568 |
+ install_args = [ |
|
569 |
+ sys.executable, '-c', |
|
570 |
+ "import setuptools;__file__=%r;"\ |
|
571 |
+ "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py] +\ |
|
572 |
+ list(global_options) + [ |
|
573 |
+ 'install', |
|
574 |
+ '--record', record_filename] |
|
575 |
+ |
|
576 |
+ if not self.as_egg: |
|
577 |
+ install_args += ['--single-version-externally-managed'] |
|
578 |
+ |
|
579 |
+ if root is not None: |
|
580 |
+ install_args += ['--root', root] |
|
581 |
+ |
|
582 |
+ if running_under_virtualenv(): |
|
583 |
+ ## FIXME: I'm not sure if this is a reasonable location; probably not |
|
584 |
+ ## but we can't put it in the default location, as that is a virtualenv symlink that isn't writable |
|
585 |
+ install_args += ['--install-headers', |
|
586 |
+ os.path.join(sys.prefix, 'include', 'site', |
|
587 |
+ 'python' + get_python_version())] |
|
588 |
+ logger.notify('Running setup.py install for %s' % self.name) |
|
589 |
+ logger.indent += 2 |
|
590 |
+ try: |
|
591 |
+ call_subprocess(install_args + install_options, |
|
592 |
+ cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False) |
|
593 |
+ finally: |
|
594 |
+ logger.indent -= 2 |
|
595 |
+ if not os.path.exists(record_filename): |
|
596 |
+ logger.notify('Record file %s not found' % record_filename) |
|
597 |
+ return |
|
598 |
+ self.install_succeeded = True |
|
599 |
+ if self.as_egg: |
|
600 |
+ # there's no --always-unzip option we can pass to install command |
|
601 |
+ # so we unable to save the installed-files.txt |
|
602 |
+ return |
|
603 |
+ |
|
604 |
+ def prepend_root(path): |
|
605 |
+ if root is None or not os.path.isabs(path): |
|
606 |
+ return path |
|
607 |
+ else: |
|
608 |
+ return change_root(root, path) |
|
609 |
+ |
|
610 |
+ f = open(record_filename) |
|
611 |
+ for line in f: |
|
612 |
+ line = line.strip() |
|
613 |
+ if line.endswith('.egg-info'): |
|
614 |
+ egg_info_dir = prepend_root(line) |
|
615 |
+ break |
|
616 |
+ else: |
|
617 |
+ logger.warn('Could not find .egg-info directory in install record for %s' % self) |
|
618 |
+ ## FIXME: put the record somewhere |
|
619 |
+ ## FIXME: should this be an error? |
|
620 |
+ return |
|
621 |
+ f.close() |
|
622 |
+ new_lines = [] |
|
623 |
+ f = open(record_filename) |
|
624 |
+ for line in f: |
|
625 |
+ filename = line.strip() |
|
626 |
+ if os.path.isdir(filename): |
|
627 |
+ filename += os.path.sep |
|
628 |
+ new_lines.append(make_path_relative(prepend_root(filename), egg_info_dir)) |
|
629 |
+ f.close() |
|
630 |
+ f = open(os.path.join(egg_info_dir, 'installed-files.txt'), 'w') |
|
631 |
+ f.write('\n'.join(new_lines)+'\n') |
|
632 |
+ f.close() |
|
633 |
+ finally: |
|
634 |
+ if os.path.exists(record_filename): |
|
635 |
+ os.remove(record_filename) |
|
636 |
+ os.rmdir(temp_location) |
|
637 |
+ |
|
638 |
+ def remove_temporary_source(self): |
|
639 |
+ """Remove the source files from this requirement, if they are marked |
|
640 |
+ for deletion""" |
|
641 |
+ if self.is_bundle or os.path.exists(self.delete_marker_filename): |
|
642 |
+ logger.info('Removing source in %s' % self.source_dir) |
|
643 |
+ if self.source_dir: |
|
644 |
+ rmtree(self.source_dir) |
|
645 |
+ self.source_dir = None |
|
646 |
+ if self._temp_build_dir and os.path.exists(self._temp_build_dir): |
|
647 |
+ rmtree(self._temp_build_dir) |
|
648 |
+ self._temp_build_dir = None |
|
649 |
+ |
|
650 |
+ def install_editable(self, install_options, global_options=()): |
|
651 |
+ logger.notify('Running setup.py develop for %s' % self.name) |
|
652 |
+ logger.indent += 2 |
|
653 |
+ try: |
|
654 |
+ ## FIXME: should we do --install-headers here too? |
|
655 |
+ call_subprocess( |
|
656 |
+ [sys.executable, '-c', |
|
657 |
+ "import setuptools; __file__=%r; exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py] |
|
658 |
+ + list(global_options) + ['develop', '--no-deps'] + list(install_options), |
|
659 |
+ |
|
660 |
+ cwd=self.source_dir, filter_stdout=self._filter_install, |
|
661 |
+ show_stdout=False) |
|
662 |
+ finally: |
|
663 |
+ logger.indent -= 2 |
|
664 |
+ self.install_succeeded = True |
|
665 |
+ |
|
666 |
+ def _filter_install(self, line): |
|
667 |
+ level = logger.NOTIFY |
|
668 |
+ for regex in [r'^running .*', r'^writing .*', '^creating .*', '^[Cc]opying .*', |
|
669 |
+ r'^reading .*', r"^removing .*\.egg-info' \(and everything under it\)$", |
|
670 |
+ r'^byte-compiling ', |
|
671 |
+ # Not sure what this warning is, but it seems harmless: |
|
672 |
+ r"^warning: manifest_maker: standard file '-c' not found$"]: |
|
673 |
+ if re.search(regex, line.strip()): |
|
674 |
+ level = logger.INFO |
|
675 |
+ break |
|
676 |
+ return (level, line) |
|
677 |
+ |
|
678 |
+ def check_if_exists(self): |
|
679 |
+ """Find an installed distribution that satisfies or conflicts |
|
680 |
+ with this requirement, and set self.satisfied_by or |
|
681 |
+ self.conflicts_with appropriately.""" |
|
682 |
+ |
|
683 |
+ if self.req is None: |
|
684 |
+ return False |
|
685 |
+ try: |
|
686 |
+ self.satisfied_by = pkg_resources.get_distribution(self.req) |
|
687 |
+ except pkg_resources.DistributionNotFound: |
|
688 |
+ return False |
|
689 |
+ except pkg_resources.VersionConflict: |
|
690 |
+ existing_dist = pkg_resources.get_distribution(self.req.project_name) |
|
691 |
+ if self.use_user_site: |
|
692 |
+ if dist_in_usersite(existing_dist): |
|
693 |
+ self.conflicts_with = existing_dist |
|
694 |
+ elif running_under_virtualenv() and dist_in_site_packages(existing_dist): |
|
695 |
+ raise InstallationError("Will not install to the user site because it will lack sys.path precedence to %s in %s" |
|
696 |
+ %(existing_dist.project_name, existing_dist.location)) |
|
697 |
+ else: |
|
698 |
+ self.conflicts_with = existing_dist |
|
699 |
+ return True |
|
700 |
+ |
|
701 |
+ @property |
|
702 |
+ def is_bundle(self): |
|
703 |
+ if self._is_bundle is not None: |
|
704 |
+ return self._is_bundle |
|
705 |
+ base = self._temp_build_dir |
|
706 |
+ if not base: |
|
707 |
+ ## FIXME: this doesn't seem right: |
|
708 |
+ return False |
|
709 |
+ self._is_bundle = (os.path.exists(os.path.join(base, 'pip-manifest.txt')) |
|
710 |
+ or os.path.exists(os.path.join(base, 'pyinstall-manifest.txt'))) |
|
711 |
+ return self._is_bundle |
|
712 |
+ |
|
713 |
+ def bundle_requirements(self): |
|
714 |
+ for dest_dir in self._bundle_editable_dirs: |
|
715 |
+ package = os.path.basename(dest_dir) |
|
716 |
+ ## FIXME: svnism: |
|
717 |
+ for vcs_backend in vcs.backends: |
|
718 |
+ url = rev = None |
|
719 |
+ vcs_bundle_file = os.path.join( |
|
720 |
+ dest_dir, vcs_backend.bundle_file) |
|
721 |
+ if os.path.exists(vcs_bundle_file): |
|
722 |
+ vc_type = vcs_backend.name |
|
723 |
+ fp = open(vcs_bundle_file) |
|
724 |
+ content = fp.read() |
|
725 |
+ fp.close() |
|
726 |
+ url, rev = vcs_backend().parse_vcs_bundle_file(content) |
|
727 |
+ break |
|
728 |
+ if url: |
|
729 |
+ url = '%s+%s@%s' % (vc_type, url, rev) |
|
730 |
+ else: |
|
731 |
+ url = None |
|
732 |
+ yield InstallRequirement( |
|
733 |
+ package, self, editable=True, url=url, |
|
734 |
+ update=False, source_dir=dest_dir) |
|
735 |
+ for dest_dir in self._bundle_build_dirs: |
|
736 |
+ package = os.path.basename(dest_dir) |
|
737 |
+ yield InstallRequirement( |
|
738 |
+ package, self, |
|
739 |
+ source_dir=dest_dir) |
|
740 |
+ |
|
741 |
+ def move_bundle_files(self, dest_build_dir, dest_src_dir): |
|
742 |
+ base = self._temp_build_dir |
|
743 |
+ assert base |
|
744 |
+ src_dir = os.path.join(base, 'src') |
|
745 |
+ build_dir = os.path.join(base, 'build') |
|
746 |
+ bundle_build_dirs = [] |
|
747 |
+ bundle_editable_dirs = [] |
|
748 |
+ for source_dir, dest_dir, dir_collection in [ |
|
749 |
+ (src_dir, dest_src_dir, bundle_editable_dirs), |
|
750 |
+ (build_dir, dest_build_dir, bundle_build_dirs)]: |
|
751 |
+ if os.path.exists(source_dir): |
|
752 |
+ for dirname in os.listdir(source_dir): |
|
753 |
+ dest = os.path.join(dest_dir, dirname) |
|
754 |
+ dir_collection.append(dest) |
|
755 |
+ if os.path.exists(dest): |
|
756 |
+ logger.warn('The directory %s (containing package %s) already exists; cannot move source from bundle %s' |
|
757 |
+ % (dest, dirname, self)) |
|
758 |
+ continue |
|
759 |
+ if not os.path.exists(dest_dir): |
|
760 |
+ logger.info('Creating directory %s' % dest_dir) |
|
761 |
+ os.makedirs(dest_dir) |
|
762 |
+ shutil.move(os.path.join(source_dir, dirname), dest) |
|
763 |
+ if not os.listdir(source_dir): |
|
764 |
+ os.rmdir(source_dir) |
|
765 |
+ self._temp_build_dir = None |
|
766 |
+ self._bundle_build_dirs = bundle_build_dirs |
|
767 |
+ self._bundle_editable_dirs = bundle_editable_dirs |
|
768 |
+ |
|
769 |
+ @property |
|
770 |
+ def delete_marker_filename(self): |
|
771 |
+ assert self.source_dir |
|
772 |
+ return os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME) |
|
773 |
+ |
|
774 |
+ |
|
775 |
+DELETE_MARKER_MESSAGE = '''\ |
|
776 |
+This file is placed here by pip to indicate the source was put |
|
777 |
+here by pip. |
|
778 |
+ |
|
779 |
+Once this package is successfully installed this source code will be |
|
780 |
+deleted (unless you remove this file). |
|
781 |
+''' |
|
782 |
+ |
|
783 |
+ |
|
784 |
+class Requirements(object): |
|
785 |
+ |
|
786 |
+ def __init__(self): |
|
787 |
+ self._keys = [] |
|
788 |
+ self._dict = {} |
|
789 |
+ |
|
790 |
+ def keys(self): |
|
791 |
+ return self._keys |
|
792 |
+ |
|
793 |
+ def values(self): |
|
794 |
+ return [self._dict[key] for key in self._keys] |
|
795 |
+ |
|
796 |
+ def __contains__(self, item): |
|
797 |
+ return item in self._keys |
|
798 |
+ |
|
799 |
+ def __setitem__(self, key, value): |
|
800 |
+ if key not in self._keys: |
|
801 |
+ self._keys.append(key) |
|
802 |
+ self._dict[key] = value |
|
803 |
+ |
|
804 |
+ def __getitem__(self, key): |
|
805 |
+ return self._dict[key] |
|
806 |
+ |
|
807 |
+ def __repr__(self): |
|
808 |
+ values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()] |
|
809 |
+ return 'Requirements({%s})' % ', '.join(values) |
|
810 |
+ |
|
811 |
+ |
|
812 |
+class RequirementSet(object): |
|
813 |
+ |
|
814 |
+ def __init__(self, build_dir, src_dir, download_dir, download_cache=None, |
|
815 |
+ upgrade=False, ignore_installed=False, as_egg=False, |
|
816 |
+ ignore_dependencies=False, force_reinstall=False, use_user_site=False): |
|
817 |
+ self.build_dir = build_dir |
|
818 |
+ self.src_dir = src_dir |
|
819 |
+ self.download_dir = download_dir |
|
820 |
+ self.download_cache = download_cache |
|
821 |
+ self.upgrade = upgrade |
|
822 |
+ self.ignore_installed = ignore_installed |
|
823 |
+ self.force_reinstall = force_reinstall |
|
824 |
+ self.requirements = Requirements() |
|
825 |
+ # Mapping of alias: real_name |
|
826 |
+ self.requirement_aliases = {} |
|
827 |
+ self.unnamed_requirements = [] |
|
828 |
+ self.ignore_dependencies = ignore_dependencies |
|
829 |
+ self.successfully_downloaded = [] |
|
830 |
+ self.successfully_installed = [] |
|
831 |
+ self.reqs_to_cleanup = [] |
|
832 |
+ self.as_egg = as_egg |
|
833 |
+ self.use_user_site = use_user_site |
|
834 |
+ |
|
835 |
+ def __str__(self): |
|
836 |
+ reqs = [req for req in self.requirements.values() |
|
837 |
+ if not req.comes_from] |
|
838 |
+ reqs.sort(key=lambda req: req.name.lower()) |
|
839 |
+ return ' '.join([str(req.req) for req in reqs]) |
|
840 |
+ |
|
841 |
+ def add_requirement(self, install_req): |
|
842 |
+ name = install_req.name |
|
843 |
+ install_req.as_egg = self.as_egg |
|
844 |
+ install_req.use_user_site = self.use_user_site |
|
845 |
+ if not name: |
|
846 |
+ #url or path requirement w/o an egg fragment |
|
847 |
+ self.unnamed_requirements.append(install_req) |
|
848 |
+ else: |
|
849 |
+ if self.has_requirement(name): |
|
850 |
+ raise InstallationError( |
|
851 |
+ 'Double requirement given: %s (already in %s, name=%r)' |
|
852 |
+ % (install_req, self.get_requirement(name), name)) |
|
853 |
+ self.requirements[name] = install_req |
|
854 |
+ ## FIXME: what about other normalizations? E.g., _ vs. -? |
|
855 |
+ if name.lower() != name: |
|
856 |
+ self.requirement_aliases[name.lower()] = name |
|
857 |
+ |
|
858 |
+ def has_requirement(self, project_name): |
|
859 |
+ for name in project_name, project_name.lower(): |
|
860 |
+ if name in self.requirements or name in self.requirement_aliases: |
|
861 |
+ return True |
|
862 |
+ return False |
|
863 |
+ |
|
864 |
+ @property |
|
865 |
+ def has_requirements(self): |
|
866 |
+ return list(self.requirements.values()) or self.unnamed_requirements |
|
867 |
+ |
|
868 |
+ @property |
|
869 |
+ def has_editables(self): |
|
870 |
+ if any(req.editable for req in self.requirements.values()): |
|
871 |
+ return True |
|
872 |
+ if any(req.editable for req in self.unnamed_requirements): |
|
873 |
+ return True |
|
874 |
+ return False |
|
875 |
+ |
|
876 |
+ @property |
|
877 |
+ def is_download(self): |
|
878 |
+ if self.download_dir: |
|
879 |
+ self.download_dir = os.path.expanduser(self.download_dir) |
|
880 |
+ if os.path.exists(self.download_dir): |
|
881 |
+ return True |
|
882 |
+ else: |
|
883 |
+ logger.fatal('Could not find download directory') |
|
884 |
+ raise InstallationError( |
|
885 |
+ "Could not find or access download directory '%s'" |
|
886 |
+ % display_path(self.download_dir)) |
|
887 |
+ return False |
|
888 |
+ |
|
889 |
+ def get_requirement(self, project_name): |
|
890 |
+ for name in project_name, project_name.lower(): |
|
891 |
+ if name in self.requirements: |
|
892 |
+ return self.requirements[name] |
|
893 |
+ if name in self.requirement_aliases: |
|
894 |
+ return self.requirements[self.requirement_aliases[name]] |
|
895 |
+ raise KeyError("No project with the name %r" % project_name) |
|
896 |
+ |
|
897 |
+ def uninstall(self, auto_confirm=False): |
|
898 |
+ for req in self.requirements.values(): |
|
899 |
+ req.uninstall(auto_confirm=auto_confirm) |
|
900 |
+ req.commit_uninstall() |
|
901 |
+ |
|
902 |
+ def locate_files(self): |
|
903 |
+ ## FIXME: duplicates code from prepare_files; relevant code should |
|
904 |
+ ## probably be factored out into a separate method |
|
905 |
+ unnamed = list(self.unnamed_requirements) |
|
906 |
+ reqs = list(self.requirements.values()) |
|
907 |
+ while reqs or unnamed: |
|
908 |
+ if unnamed: |
|
909 |
+ req_to_install = unnamed.pop(0) |
|
910 |
+ else: |
|
911 |
+ req_to_install = reqs.pop(0) |
|
912 |
+ install_needed = True |
|
913 |
+ if not self.ignore_installed and not req_to_install.editable: |
|
914 |
+ req_to_install.check_if_exists() |
|
915 |
+ if req_to_install.satisfied_by: |
|
916 |
+ if self.upgrade: |
|
917 |
+ #don't uninstall conflict if user install and and conflict is not user install |
|
918 |
+ if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): |
|
919 |
+ req_to_install.conflicts_with = req_to_install.satisfied_by |
|
920 |
+ req_to_install.satisfied_by = None |
|
921 |
+ else: |
|
922 |
+ install_needed = False |
|
923 |
+ if req_to_install.satisfied_by: |
|
924 |
+ logger.notify('Requirement already satisfied ' |
|
925 |
+ '(use --upgrade to upgrade): %s' |
|
926 |
+ % req_to_install) |
|
927 |
+ |
|
928 |
+ if req_to_install.editable: |
|
929 |
+ if req_to_install.source_dir is None: |
|
930 |
+ req_to_install.source_dir = req_to_install.build_location(self.src_dir) |
|
931 |
+ elif install_needed: |
|
932 |
+ req_to_install.source_dir = req_to_install.build_location(self.build_dir, not self.is_download) |
|
933 |
+ |
|
934 |
+ if req_to_install.source_dir is not None and not os.path.isdir(req_to_install.source_dir): |
|
935 |
+ raise InstallationError('Could not install requirement %s ' |
|
936 |
+ 'because source folder %s does not exist ' |
|
937 |
+ '(perhaps --no-download was used without first running ' |
|
938 |
+ 'an equivalent install with --no-install?)' |
|
939 |
+ % (req_to_install, req_to_install.source_dir)) |
|
940 |
+ |
|
941 |
+ def prepare_files(self, finder, force_root_egg_info=False, bundle=False): |
|
942 |
+ """Prepare process. Create temp directories, download and/or unpack files.""" |
|
943 |
+ unnamed = list(self.unnamed_requirements) |
|
944 |
+ reqs = list(self.requirements.values()) |
|
945 |
+ while reqs or unnamed: |
|
946 |
+ if unnamed: |
|
947 |
+ req_to_install = unnamed.pop(0) |
|
948 |
+ else: |
|
949 |
+ req_to_install = reqs.pop(0) |
|
950 |
+ install = True |
|
951 |
+ best_installed = False |
|
952 |
+ not_found = None |
|
953 |
+ if not self.ignore_installed and not req_to_install.editable: |
|
954 |
+ req_to_install.check_if_exists() |
|
955 |
+ if req_to_install.satisfied_by: |
|
956 |
+ if self.upgrade: |
|
957 |
+ if not self.force_reinstall and not req_to_install.url: |
|
958 |
+ try: |
|
959 |
+ url = finder.find_requirement( |
|
960 |
+ req_to_install, self.upgrade) |
|
961 |
+ except BestVersionAlreadyInstalled: |
|
962 |
+ best_installed = True |
|
963 |
+ install = False |
|
964 |
+ except DistributionNotFound: |
|
965 |
+ not_found = sys.exc_info()[1] |
|
966 |
+ else: |
|
967 |
+ # Avoid the need to call find_requirement again |
|
968 |
+ req_to_install.url = url.url |
|
969 |
+ |
|
970 |
+ if not best_installed: |
|
971 |
+ #don't uninstall conflict if user install and conflict is not user install |
|
972 |
+ if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): |
|
973 |
+ req_to_install.conflicts_with = req_to_install.satisfied_by |
|
974 |
+ req_to_install.satisfied_by = None |
|
975 |
+ else: |
|
976 |
+ install = False |
|
977 |
+ if req_to_install.satisfied_by: |
|
978 |
+ if best_installed: |
|
979 |
+ logger.notify('Requirement already up-to-date: %s' |
|
980 |
+ % req_to_install) |
|
981 |
+ else: |
|
982 |
+ logger.notify('Requirement already satisfied ' |
|
983 |
+ '(use --upgrade to upgrade): %s' |
|
984 |
+ % req_to_install) |
|
985 |
+ if req_to_install.editable: |
|
986 |
+ logger.notify('Obtaining %s' % req_to_install) |
|
987 |
+ elif install: |
|
988 |
+ if req_to_install.url and req_to_install.url.lower().startswith('file:'): |
|
989 |
+ logger.notify('Unpacking %s' % display_path(url_to_path(req_to_install.url))) |
|
990 |
+ else: |
|
991 |
+ logger.notify('Downloading/unpacking %s' % req_to_install) |
|
992 |
+ logger.indent += 2 |
|
993 |
+ try: |
|
994 |
+ is_bundle = False |
|
995 |
+ if req_to_install.editable: |
|
996 |
+ if req_to_install.source_dir is None: |
|
997 |
+ location = req_to_install.build_location(self.src_dir) |
|
998 |
+ req_to_install.source_dir = location |
|
999 |
+ else: |
|
1000 |
+ location = req_to_install.source_dir |
|
1001 |
+ if not os.path.exists(self.build_dir): |
|
1002 |
+ _make_build_dir(self.build_dir) |
|
1003 |
+ req_to_install.update_editable(not self.is_download) |
|
1004 |
+ if self.is_download: |
|
1005 |
+ req_to_install.run_egg_info() |
|
1006 |
+ req_to_install.archive(self.download_dir) |
|
1007 |
+ else: |
|
1008 |
+ req_to_install.run_egg_info() |
|
1009 |
+ elif install: |
|
1010 |
+ ##@@ if filesystem packages are not marked |
|
1011 |
+ ##editable in a req, a non deterministic error |
|
1012 |
+ ##occurs when the script attempts to unpack the |
|
1013 |
+ ##build directory |
|
1014 |
+ |
|
1015 |
+ # NB: This call can result in the creation of a temporary build directory |
|
1016 |
+ location = req_to_install.build_location(self.build_dir, not self.is_download) |
|
1017 |
+ |
|
1018 |
+ ## FIXME: is the existance of the checkout good enough to use it? I don't think so. |
|
1019 |
+ unpack = True |
|
1020 |
+ url = None |
|
1021 |
+ if not os.path.exists(os.path.join(location, 'setup.py')): |
|
1022 |
+ ## FIXME: this won't upgrade when there's an existing package unpacked in `location` |
|
1023 |
+ if req_to_install.url is None: |
|
1024 |
+ if not_found: |
|
1025 |
+ raise not_found |
|
1026 |
+ url = finder.find_requirement(req_to_install, upgrade=self.upgrade) |
|
1027 |
+ else: |
|
1028 |
+ ## FIXME: should req_to_install.url already be a link? |
|
1029 |
+ url = Link(req_to_install.url) |
|
1030 |
+ assert url |
|
1031 |
+ if url: |
|
1032 |
+ try: |
|
1033 |
+ self.unpack_url(url, location, self.is_download) |
|
1034 |
+ except HTTPError: |
|
1035 |
+ e = sys.exc_info()[1] |
|
1036 |
+ logger.fatal('Could not install requirement %s because of error %s' |
|
1037 |
+ % (req_to_install, e)) |
|
1038 |
+ raise InstallationError( |
|
1039 |
+ 'Could not install requirement %s because of HTTP error %s for URL %s' |
|
1040 |
+ % (req_to_install, e, url)) |
|
1041 |
+ else: |
|
1042 |
+ unpack = False |
|
1043 |
+ if unpack: |
|
1044 |
+ is_bundle = req_to_install.is_bundle |
|
1045 |
+ if is_bundle: |
|
1046 |
+ req_to_install.move_bundle_files(self.build_dir, self.src_dir) |
|
1047 |
+ for subreq in req_to_install.bundle_requirements(): |
|
1048 |
+ reqs.append(subreq) |
|
1049 |
+ self.add_requirement(subreq) |
|
1050 |
+ elif self.is_download: |
|
1051 |
+ req_to_install.source_dir = location |
|
1052 |
+ req_to_install.run_egg_info() |
|
1053 |
+ if url and url.scheme in vcs.all_schemes: |
|
1054 |
+ req_to_install.archive(self.download_dir) |
|
1055 |
+ else: |
|
1056 |
+ req_to_install.source_dir = location |
|
1057 |
+ req_to_install.run_egg_info() |
|
1058 |
+ if force_root_egg_info: |
|
1059 |
+ # We need to run this to make sure that the .egg-info/ |
|
1060 |
+ # directory is created for packing in the bundle |
|
1061 |
+ req_to_install.run_egg_info(force_root_egg_info=True) |
|
1062 |
+ req_to_install.assert_source_matches_version() |
|
1063 |
+ #@@ sketchy way of identifying packages not grabbed from an index |
|
1064 |
+ if bundle and req_to_install.url: |
|
1065 |
+ self.copy_to_build_dir(req_to_install) |
|
1066 |
+ install = False |
|
1067 |
+ # req_to_install.req is only avail after unpack for URL pkgs |
|
1068 |
+ # repeat check_if_exists to uninstall-on-upgrade (#14) |
|
1069 |
+ req_to_install.check_if_exists() |
|
1070 |
+ if req_to_install.satisfied_by: |
|
1071 |
+ if self.upgrade or self.ignore_installed: |
|
1072 |
+ #don't uninstall conflict if user install and and conflict is not user install |
|
1073 |
+ if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): |
|
1074 |
+ req_to_install.conflicts_with = req_to_install.satisfied_by |
|
1075 |
+ req_to_install.satisfied_by = None |
|
1076 |
+ else: |
|
1077 |
+ install = False |
|
1078 |
+ if not is_bundle: |
|
1079 |
+ ## FIXME: shouldn't be globally added: |
|
1080 |
+ finder.add_dependency_links(req_to_install.dependency_links) |
|
1081 |
+ if (req_to_install.extras): |
|
1082 |
+ logger.notify("Installing extra requirements: %r" % ','.join(req_to_install.extras)) |
|
1083 |
+ if not self.ignore_dependencies: |
|
1084 |
+ for req in req_to_install.requirements(req_to_install.extras): |
|
1085 |
+ try: |
|
1086 |
+ name = pkg_resources.Requirement.parse(req).project_name |
|
1087 |
+ except ValueError: |
|
1088 |
+ e = sys.exc_info()[1] |
|
1089 |
+ ## FIXME: proper warning |
|
1090 |
+ logger.error('Invalid requirement: %r (%s) in requirement %s' % (req, e, req_to_install)) |
|
1091 |
+ continue |
|
1092 |
+ if self.has_requirement(name): |
|
1093 |
+ ## FIXME: check for conflict |
|
1094 |
+ continue |
|
1095 |
+ subreq = InstallRequirement(req, req_to_install) |
|
1096 |
+ reqs.append(subreq) |
|
1097 |
+ self.add_requirement(subreq) |
|
1098 |
+ if not self.has_requirement(req_to_install.name): |
|
1099 |
+ #'unnamed' requirements will get added here |
|
1100 |
+ self.add_requirement(req_to_install) |
|
1101 |
+ if self.is_download or req_to_install._temp_build_dir is not None: |
|
1102 |
+ self.reqs_to_cleanup.append(req_to_install) |
|
1103 |
+ else: |
|
1104 |
+ self.reqs_to_cleanup.append(req_to_install) |
|
1105 |
+ |
|
1106 |
+ if install: |
|
1107 |
+ self.successfully_downloaded.append(req_to_install) |
|
1108 |
+ if bundle and (req_to_install.url and req_to_install.url.startswith('file:///')): |
|
1109 |
+ self.copy_to_build_dir(req_to_install) |
|
1110 |
+ finally: |
|
1111 |
+ logger.indent -= 2 |
|
1112 |
+ |
|
1113 |
+ def cleanup_files(self, bundle=False): |
|
1114 |
+ """Clean up files, remove builds.""" |
|
1115 |
+ logger.notify('Cleaning up...') |
|
1116 |
+ logger.indent += 2 |
|
1117 |
+ for req in self.reqs_to_cleanup: |
|
1118 |
+ req.remove_temporary_source() |
|
1119 |
+ |
|
1120 |
+ remove_dir = [] |
|
1121 |
+ if self._pip_has_created_build_dir(): |
|
1122 |
+ remove_dir.append(self.build_dir) |
|
1123 |
+ |
|
1124 |
+ # The source dir of a bundle can always be removed. |
|
1125 |
+ # FIXME: not if it pre-existed the bundle! |
|
1126 |
+ if bundle: |
|
1127 |
+ remove_dir.append(self.src_dir) |
|
1128 |
+ |
|
1129 |
+ for dir in remove_dir: |
|
1130 |
+ if os.path.exists(dir): |
|
1131 |
+ logger.info('Removing temporary dir %s...' % dir) |
|
1132 |
+ rmtree(dir) |
|
1133 |
+ |
|
1134 |
+ logger.indent -= 2 |
|
1135 |
+ |
|
1136 |
+ def _pip_has_created_build_dir(self): |
|
1137 |
+ return (self.build_dir == build_prefix and |
|
1138 |
+ os.path.exists(os.path.join(self.build_dir, PIP_DELETE_MARKER_FILENAME))) |
|
1139 |
+ |
|
1140 |
+ def copy_to_build_dir(self, req_to_install): |
|
1141 |
+ target_dir = req_to_install.editable and self.src_dir or self.build_dir |
|
1142 |
+ logger.info("Copying %s to %s" % (req_to_install.name, target_dir)) |
|
1143 |
+ dest = os.path.join(target_dir, req_to_install.name) |
|
1144 |
+ shutil.copytree(req_to_install.source_dir, dest) |
|
1145 |
+ call_subprocess(["python", "%s/setup.py" % dest, "clean"], cwd=dest, |
|
1146 |
+ command_desc='python setup.py clean') |
|
1147 |
+ |
|
1148 |
+ def unpack_url(self, link, location, only_download=False): |
|
1149 |
+ if only_download: |
|
1150 |
+ loc = self.download_dir |
|
1151 |
+ else: |
|
1152 |
+ loc = location |
|
1153 |
+ if is_vcs_url(link): |
|
1154 |
+ return unpack_vcs_link(link, loc, only_download) |
|
1155 |
+ # a local file:// index could have links with hashes |
|
1156 |
+ elif not link.hash and is_file_url(link): |
|
1157 |
+ return unpack_file_url(link, loc) |
|
1158 |
+ else: |
|
1159 |
+ if self.download_cache: |
|
1160 |
+ self.download_cache = os.path.expanduser(self.download_cache) |
|
1161 |
+ retval = unpack_http_url(link, location, self.download_cache, self.download_dir) |
|
1162 |
+ if only_download: |
|
1163 |
+ _write_delete_marker_message(os.path.join(location, PIP_DELETE_MARKER_FILENAME)) |
|
1164 |
+ return retval |
|
1165 |
+ |
|
1166 |
+ def install(self, install_options, global_options=(), *args, **kwargs): |
|
1167 |
+ """Install everything in this set (after having downloaded and unpacked the packages)""" |
|
1168 |
+ to_install = [r for r in self.requirements.values() |
|
1169 |
+ if not r.satisfied_by] |
|
1170 |
+ |
|
1171 |
+ if to_install: |
|
1172 |
+ logger.notify('Installing collected packages: %s' % ', '.join([req.name for req in to_install])) |
|
1173 |
+ logger.indent += 2 |
|
1174 |
+ try: |
|
1175 |
+ for requirement in to_install: |
|
1176 |
+ if requirement.conflicts_with: |
|
1177 |
+ logger.notify('Found existing installation: %s' |
|
1178 |
+ % requirement.conflicts_with) |
|
1179 |
+ logger.indent += 2 |
|
1180 |
+ try: |
|
1181 |
+ requirement.uninstall(auto_confirm=True) |
|
1182 |
+ finally: |
|
1183 |
+ logger.indent -= 2 |
|
1184 |
+ try: |
|
1185 |
+ requirement.install(install_options, global_options, *args, **kwargs) |
|
1186 |
+ except: |
|
1187 |
+ # if install did not succeed, rollback previous uninstall |
|
1188 |
+ if requirement.conflicts_with and not requirement.install_succeeded: |
|
1189 |
+ requirement.rollback_uninstall() |
|
1190 |
+ raise |
|
1191 |
+ else: |
|
1192 |
+ if requirement.conflicts_with and requirement.install_succeeded: |
|
1193 |
+ requirement.commit_uninstall() |
|
1194 |
+ requirement.remove_temporary_source() |
|
1195 |
+ finally: |
|
1196 |
+ logger.indent -= 2 |
|
1197 |
+ self.successfully_installed = to_install |
|
1198 |
+ |
|
1199 |
+ def create_bundle(self, bundle_filename): |
|
1200 |
+ ## FIXME: can't decide which is better; zip is easier to read |
|
1201 |
+ ## random files from, but tar.bz2 is smaller and not as lame a |
|
1202 |
+ ## format. |
|
1203 |
+ |
|
1204 |
+ ## FIXME: this file should really include a manifest of the |
|
1205 |
+ ## packages, maybe some other metadata files. It would make |
|
1206 |
+ ## it easier to detect as well. |
|
1207 |
+ zip = zipfile.ZipFile(bundle_filename, 'w', zipfile.ZIP_DEFLATED) |
|
1208 |
+ vcs_dirs = [] |
|
1209 |
+ for dir, basename in (self.build_dir, 'build'), (self.src_dir, 'src'): |
|
1210 |
+ dir = os.path.normcase(os.path.abspath(dir)) |
|
1211 |
+ for dirpath, dirnames, filenames in os.walk(dir): |
|
1212 |
+ for backend in vcs.backends: |
|
1213 |
+ vcs_backend = backend() |
|
1214 |
+ vcs_url = vcs_rev = None |
|
1215 |
+ if vcs_backend.dirname in dirnames: |
|
1216 |
+ for vcs_dir in vcs_dirs: |
|
1217 |
+ if dirpath.startswith(vcs_dir): |
|
1218 |
+ # vcs bundle file already in parent directory |
|
1219 |
+ break |
|
1220 |
+ else: |
|
1221 |
+ vcs_url, vcs_rev = vcs_backend.get_info( |
|
1222 |
+ os.path.join(dir, dirpath)) |
|
1223 |
+ vcs_dirs.append(dirpath) |
|
1224 |
+ vcs_bundle_file = vcs_backend.bundle_file |
|
1225 |
+ vcs_guide = vcs_backend.guide % {'url': vcs_url, |
|
1226 |
+ 'rev': vcs_rev} |
|
1227 |
+ dirnames.remove(vcs_backend.dirname) |
|
1228 |
+ break |
|
1229 |
+ if 'pip-egg-info' in dirnames: |
|
1230 |
+ dirnames.remove('pip-egg-info') |
|
1231 |
+ for dirname in dirnames: |
|
1232 |
+ dirname = os.path.join(dirpath, dirname) |
|
1233 |
+ name = self._clean_zip_name(dirname, dir) |
|
1234 |
+ zip.writestr(basename + '/' + name + '/', '') |
|
1235 |
+ for filename in filenames: |
|
1236 |
+ if filename == PIP_DELETE_MARKER_FILENAME: |
|
1237 |
+ continue |
|
1238 |
+ filename = os.path.join(dirpath, filename) |
|
1239 |
+ name = self._clean_zip_name(filename, dir) |
|
1240 |
+ zip.write(filename, basename + '/' + name) |
|
1241 |
+ if vcs_url: |
|
1242 |
+ name = os.path.join(dirpath, vcs_bundle_file) |
|
1243 |
+ name = self._clean_zip_name(name, dir) |
|
1244 |
+ zip.writestr(basename + '/' + name, vcs_guide) |
|
1245 |
+ |
|
1246 |
+ zip.writestr('pip-manifest.txt', self.bundle_requirements()) |
|
1247 |
+ zip.close() |
|
1248 |
+ |
|
1249 |
+ BUNDLE_HEADER = '''\ |
|
1250 |
+# This is a pip bundle file, that contains many source packages |
|
1251 |
+# that can be installed as a group. You can install this like: |
|
1252 |
+# pip this_file.zip |
|
1253 |
+# The rest of the file contains a list of all the packages included: |
|
1254 |
+''' |
|
1255 |
+ |
|
1256 |
+ def bundle_requirements(self): |
|
1257 |
+ parts = [self.BUNDLE_HEADER] |
|
1258 |
+ for req in [req for req in self.requirements.values() |
|
1259 |
+ if not req.comes_from]: |
|
1260 |
+ parts.append('%s==%s\n' % (req.name, req.installed_version)) |
|
1261 |
+ parts.append('# These packages were installed to satisfy the above requirements:\n') |
|
1262 |
+ for req in [req for req in self.requirements.values() |
|
1263 |
+ if req.comes_from]: |
|
1264 |
+ parts.append('%s==%s\n' % (req.name, req.installed_version)) |
|
1265 |
+ ## FIXME: should we do something with self.unnamed_requirements? |
|
1266 |
+ return ''.join(parts) |
|
1267 |
+ |
|
1268 |
+ def _clean_zip_name(self, name, prefix): |
|
1269 |
+ assert name.startswith(prefix+os.path.sep), ( |
|
1270 |
+ "name %r doesn't start with prefix %r" % (name, prefix)) |
|
1271 |
+ name = name[len(prefix)+1:] |
|
1272 |
+ name = name.replace(os.path.sep, '/') |
|
1273 |
+ return name |
|
1274 |
+ |
|
1275 |
+ |
|
1276 |
+def _make_build_dir(build_dir): |
|
1277 |
+ os.makedirs(build_dir) |
|
1278 |
+ _write_delete_marker_message(os.path.join(build_dir, PIP_DELETE_MARKER_FILENAME)) |
|
1279 |
+ |
|
1280 |
+ |
|
1281 |
+def _write_delete_marker_message(filepath): |
|
1282 |
+ marker_fp = open(filepath, 'w') |
|
1283 |
+ marker_fp.write(DELETE_MARKER_MESSAGE) |
|
1284 |
+ marker_fp.close() |
|
1285 |
+ |
|
1286 |
+ |
|
1287 |
+_scheme_re = re.compile(r'^(http|https|file):', re.I) |
|
1288 |
+ |
|
1289 |
+ |
|
1290 |
+def parse_requirements(filename, finder=None, comes_from=None, options=None): |
|
1291 |
+ skip_match = None |
|
1292 |
+ skip_regex = options.skip_requirements_regex if options else None |
|
1293 |
+ if skip_regex: |
|
1294 |
+ skip_match = re.compile(skip_regex) |
|
1295 |
+ reqs_file_dir = os.path.dirname(os.path.abspath(filename)) |
|
1296 |
+ filename, content = get_file_content(filename, comes_from=comes_from) |
|
1297 |
+ for line_number, line in enumerate(content.splitlines()): |
|
1298 |
+ line_number += 1 |
|
1299 |
+ line = line.strip() |
|
1300 |
+ if not line or line.startswith('#'): |
|
1301 |
+ continue |
|
1302 |
+ if skip_match and skip_match.search(line): |
|
1303 |
+ continue |
|
1304 |
+ if line.startswith('-r') or line.startswith('--requirement'): |
|
1305 |
+ if line.startswith('-r'): |
|
1306 |
+ req_url = line[2:].strip() |
|
1307 |
+ else: |
|
1308 |
+ req_url = line[len('--requirement'):].strip().strip('=') |
|
1309 |
+ if _scheme_re.search(filename): |
|
1310 |
+ # Relative to a URL |
|
1311 |
+ req_url = urlparse.urljoin(filename, req_url) |
|
1312 |
+ elif not _scheme_re.search(req_url): |
|
1313 |
+ req_url = os.path.join(os.path.dirname(filename), req_url) |
|
1314 |
+ for item in parse_requirements(req_url, finder, comes_from=filename, options=options): |
|
1315 |
+ yield item |
|
1316 |
+ elif line.startswith('-Z') or line.startswith('--always-unzip'): |
|
1317 |
+ # No longer used, but previously these were used in |
|
1318 |
+ # requirement files, so we'll ignore. |
|
1319 |
+ pass |
|
1320 |
+ elif line.startswith('-f') or line.startswith('--find-links'): |
|
1321 |
+ if line.startswith('-f'): |
|
1322 |
+ line = line[2:].strip() |
|
1323 |
+ else: |
|
1324 |
+ line = line[len('--find-links'):].strip().lstrip('=') |
|
1325 |
+ ## FIXME: it would be nice to keep track of the source of |
|
1326 |
+ ## the find_links: |
|
1327 |
+ # support a find-links local path relative to a requirements file |
|
1328 |
+ relative_to_reqs_file = os.path.join(reqs_file_dir, line) |
|
1329 |
+ if os.path.exists(relative_to_reqs_file): |
|
1330 |
+ line = relative_to_reqs_file |
|
1331 |
+ if finder: |
|
1332 |
+ finder.find_links.append(line) |
|
1333 |
+ elif line.startswith('-i') or line.startswith('--index-url'): |
|
1334 |
+ if line.startswith('-i'): |
|
1335 |
+ line = line[2:].strip() |
|
1336 |
+ else: |
|
1337 |
+ line = line[len('--index-url'):].strip().lstrip('=') |
|
1338 |
+ if finder: |
|
1339 |
+ finder.index_urls = [line] |
|
1340 |
+ elif line.startswith('--extra-index-url'): |
|
1341 |
+ line = line[len('--extra-index-url'):].strip().lstrip('=') |
|
1342 |
+ if finder: |
|
1343 |
+ finder.index_urls.append(line) |
|
1344 |
+ elif line.startswith('--no-index'): |
|
1345 |
+ finder.index_urls = [] |
|
1346 |
+ else: |
|
1347 |
+ comes_from = '-r %s (line %s)' % (filename, line_number) |
|
1348 |
+ if line.startswith('-e') or line.startswith('--editable'): |
|
1349 |
+ if line.startswith('-e'): |
|
1350 |
+ line = line[2:].strip() |
|
1351 |
+ else: |
|
1352 |
+ line = line[len('--editable'):].strip().lstrip('=') |
|
1353 |
+ req = InstallRequirement.from_editable( |
|
1354 |
+ line, comes_from=comes_from, default_vcs=options.default_vcs) |
|
1355 |
+ else: |
|
1356 |
+ req = InstallRequirement.from_line(line, comes_from) |
|
1357 |
+ yield req |
|
1358 |
+ |
|
1359 |
+ |
|
1360 |
+def parse_editable(editable_req, default_vcs=None): |
|
1361 |
+ """Parses svn+http://blahblah@rev#egg=Foobar into a requirement |
|
1362 |
+ (Foobar) and a URL""" |
|
1363 |
+ |
|
1364 |
+ url = editable_req |
|
1365 |
+ extras = None |
|
1366 |
+ |
|
1367 |
+ # If a file path is specified with extras, strip off the extras. |
|
1368 |
+ m = re.match(r'^(.+)(\[[^\]]+\])$', url) |
|
1369 |
+ if m: |
|
1370 |
+ url_no_extras = m.group(1) |
|
1371 |
+ extras = m.group(2) |
|
1372 |
+ else: |
|
1373 |
+ url_no_extras = url |
|
1374 |
+ |
|
1375 |
+ if os.path.isdir(url_no_extras): |
|
1376 |
+ if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): |
|
1377 |
+ raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % url_no_extras) |
|
1378 |
+ # Treating it as code that has already been checked out |
|
1379 |
+ url_no_extras = path_to_url(url_no_extras) |
|
1380 |
+ |
|
1381 |
+ if url_no_extras.lower().startswith('file:'): |
|
1382 |
+ if extras: |
|
1383 |
+ return None, url_no_extras, pkg_resources.Requirement.parse('__placeholder__' + extras).extras |
|
1384 |
+ else: |
|
1385 |
+ return None, url_no_extras, None |
|
1386 |
+ |
|
1387 |
+ for version_control in vcs: |
|
1388 |
+ if url.lower().startswith('%s:' % version_control): |
|
1389 |
+ url = '%s+%s' % (version_control, url) |
|
1390 |
+ if '+' not in url: |
|
1391 |
+ if default_vcs: |
|
1392 |
+ url = default_vcs + '+' + url |
|
1393 |
+ else: |
|
1394 |
+ raise InstallationError( |
|
1395 |
+ '%s should either by a path to a local project or a VCS url beginning with svn+, git+, hg+, or bzr+' % editable_req) |
|
1396 |
+ vc_type = url.split('+', 1)[0].lower() |
|
1397 |
+ if not vcs.get_backend(vc_type): |
|
1398 |
+ error_message = 'For --editable=%s only ' % editable_req + \ |
|
1399 |
+ ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ |
|
1400 |
+ ' is currently supported' |
|
1401 |
+ raise InstallationError(error_message) |
|
1402 |
+ match = re.search(r'(?:#|#.*?&)egg=([^&]*)', editable_req) |
|
1403 |
+ if (not match or not match.group(1)) and vcs.get_backend(vc_type): |
|
1404 |
+ parts = [p for p in editable_req.split('#', 1)[0].split('/') if p] |
|
1405 |
+ if parts[-2] in ('tags', 'branches', 'tag', 'branch'): |
|
1406 |
+ req = parts[-3] |
|
1407 |
+ elif parts[-1] == 'trunk': |
|
1408 |
+ req = parts[-2] |
|
1409 |
+ else: |
|
1410 |
+ raise InstallationError( |
|
1411 |
+ '--editable=%s is not the right format; it must have #egg=Package' |
|
1412 |
+ % editable_req) |
|
1413 |
+ else: |
|
1414 |
+ req = match.group(1) |
|
1415 |
+ ## FIXME: use package_to_requirement? |
|
1416 |
+ match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req) |
|
1417 |
+ if match: |
|
1418 |
+ # Strip off -dev, -0.2, etc. |
|
1419 |
+ req = match.group(1) |
|
1420 |
+ return req, url, None |
|
1421 |
+ |
|
1422 |
+ |
|
1423 |
+class UninstallPathSet(object): |
|
1424 |
+ """A set of file paths to be removed in the uninstallation of a |
|
1425 |
+ requirement.""" |
|
1426 |
+ def __init__(self, dist): |
|
1427 |
+ self.paths = set() |
|
1428 |
+ self._refuse = set() |
|
1429 |
+ self.pth = {} |
|
1430 |
+ self.dist = dist |
|
1431 |
+ self.save_dir = None |
|
1432 |
+ self._moved_paths = [] |
|
1433 |
+ |
|
1434 |
+ def _permitted(self, path): |
|
1435 |
+ """ |
|
1436 |
+ Return True if the given path is one we are permitted to |
|
1437 |
+ remove/modify, False otherwise. |
|
1438 |
+ |
|
1439 |
+ """ |
|
1440 |
+ return is_local(path) |
|
1441 |
+ |
|
1442 |
+ def _can_uninstall(self): |
|
1443 |
+ if not dist_is_local(self.dist): |
|
1444 |
+ logger.notify("Not uninstalling %s at %s, outside environment %s" |
|
1445 |
+ % (self.dist.project_name, normalize_path(self.dist.location), sys.prefix)) |
|
1446 |
+ return False |
|
1447 |
+ return True |
|
1448 |
+ |
|
1449 |
+ def add(self, path): |
|
1450 |
+ path = normalize_path(path) |
|
1451 |
+ if not os.path.exists(path): |
|
1452 |
+ return |
|
1453 |
+ if self._permitted(path): |
|
1454 |
+ self.paths.add(path) |
|
1455 |
+ else: |
|
1456 |
+ self._refuse.add(path) |
|
1457 |
+ |
|
1458 |
+ # __pycache__ files can show up after 'installed-files.txt' is created, due to imports |
|
1459 |
+ if os.path.splitext(path)[1] == '.py' and uses_pycache: |
|
1460 |
+ self.add(imp.cache_from_source(path)) |
|
1461 |
+ |
|
1462 |
+ |
|
1463 |
+ def add_pth(self, pth_file, entry): |
|
1464 |
+ pth_file = normalize_path(pth_file) |
|
1465 |
+ if self._permitted(pth_file): |
|
1466 |
+ if pth_file not in self.pth: |
|
1467 |
+ self.pth[pth_file] = UninstallPthEntries(pth_file) |
|
1468 |
+ self.pth[pth_file].add(entry) |
|
1469 |
+ else: |
|
1470 |
+ self._refuse.add(pth_file) |
|
1471 |
+ |
|
1472 |
+ def compact(self, paths): |
|
1473 |
+ """Compact a path set to contain the minimal number of paths |
|
1474 |
+ necessary to contain all paths in the set. If /a/path/ and |
|
1475 |
+ /a/path/to/a/file.txt are both in the set, leave only the |
|
1476 |
+ shorter path.""" |
|
1477 |
+ short_paths = set() |
|
1478 |
+ for path in sorted(paths, key=len): |
|
1479 |
+ if not any([(path.startswith(shortpath) and |
|
1480 |
+ path[len(shortpath.rstrip(os.path.sep))] == os.path.sep) |
|
1481 |
+ for shortpath in short_paths]): |
|
1482 |
+ short_paths.add(path) |
|
1483 |
+ return short_paths |
|
1484 |
+ |
|
1485 |
+ def _stash(self, path): |
|
1486 |
+ return os.path.join( |
|
1487 |
+ self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep)) |
|
1488 |
+ |
|
1489 |
+ def remove(self, auto_confirm=False): |
|
1490 |
+ """Remove paths in ``self.paths`` with confirmation (unless |
|
1491 |
+ ``auto_confirm`` is True).""" |
|
1492 |
+ if not self._can_uninstall(): |
|
1493 |
+ return |
|
1494 |
+ if not self.paths: |
|
1495 |
+ logger.notify("Can't uninstall '%s'. No files were found to uninstall." % self.dist.project_name) |
|
1496 |
+ return |
|
1497 |
+ logger.notify('Uninstalling %s:' % self.dist.project_name) |
|
1498 |
+ logger.indent += 2 |
|
1499 |
+ paths = sorted(self.compact(self.paths)) |
|
1500 |
+ try: |
|
1501 |
+ if auto_confirm: |
|
1502 |
+ response = 'y' |
|
1503 |
+ else: |
|
1504 |
+ for path in paths: |
|
1505 |
+ logger.notify(path) |
|
1506 |
+ response = ask('Proceed (y/n)? ', ('y', 'n')) |
|
1507 |
+ if self._refuse: |
|
1508 |
+ logger.notify('Not removing or modifying (outside of prefix):') |
|
1509 |
+ for path in self.compact(self._refuse): |
|
1510 |
+ logger.notify(path) |
|
1511 |
+ if response == 'y': |
|
1512 |
+ self.save_dir = tempfile.mkdtemp(suffix='-uninstall', |
|
1513 |
+ prefix='pip-') |
|
1514 |
+ for path in paths: |
|
1515 |
+ new_path = self._stash(path) |
|
1516 |
+ logger.info('Removing file or directory %s' % path) |
|
1517 |
+ self._moved_paths.append(path) |
|
1518 |
+ renames(path, new_path) |
|
1519 |
+ for pth in self.pth.values(): |
|
1520 |
+ pth.remove() |
|
1521 |
+ logger.notify('Successfully uninstalled %s' % self.dist.project_name) |
|
1522 |
+ |
|
1523 |
+ finally: |
|
1524 |
+ logger.indent -= 2 |
|
1525 |
+ |
|
1526 |
+ def rollback(self): |
|
1527 |
+ """Rollback the changes previously made by remove().""" |
|
1528 |
+ if self.save_dir is None: |
|
1529 |
+ logger.error("Can't roll back %s; was not uninstalled" % self.dist.project_name) |
|
1530 |
+ return False |
|
1531 |
+ logger.notify('Rolling back uninstall of %s' % self.dist.project_name) |
|
1532 |
+ for path in self._moved_paths: |
|
1533 |
+ tmp_path = self._stash(path) |
|
1534 |
+ logger.info('Replacing %s' % path) |
|
1535 |
+ renames(tmp_path, path) |
|
1536 |
+ for pth in self.pth: |
|
1537 |
+ pth.rollback() |
|
1538 |
+ |
|
1539 |
+ def commit(self): |
|
1540 |
+ """Remove temporary save dir: rollback will no longer be possible.""" |
|
1541 |
+ if self.save_dir is not None: |
|
1542 |
+ rmtree(self.save_dir) |
|
1543 |
+ self.save_dir = None |
|
1544 |
+ self._moved_paths = [] |
|
1545 |
+ |
|
1546 |
+ |
|
1547 |
+class UninstallPthEntries(object): |
|
1548 |
+ def __init__(self, pth_file): |
|
1549 |
+ if not os.path.isfile(pth_file): |
|
1550 |
+ raise UninstallationError("Cannot remove entries from nonexistent file %s" % pth_file) |
|
1551 |
+ self.file = pth_file |
|
1552 |
+ self.entries = set() |
|
1553 |
+ self._saved_lines = None |
|
1554 |
+ |
|
1555 |
+ def add(self, entry): |
|
1556 |
+ entry = os.path.normcase(entry) |
|
1557 |
+ # On Windows, os.path.normcase converts the entry to use |
|
1558 |
+ # backslashes. This is correct for entries that describe absolute |
|
1559 |
+ # paths outside of site-packages, but all the others use forward |
|
1560 |
+ # slashes. |
|
1561 |
+ if sys.platform == 'win32' and not os.path.splitdrive(entry)[0]: |
|
1562 |
+ entry = entry.replace('\\', '/') |
|
1563 |
+ self.entries.add(entry) |
|
1564 |
+ |
|
1565 |
+ def remove(self): |
|
1566 |
+ logger.info('Removing pth entries from %s:' % self.file) |
|
1567 |
+ fh = open(self.file, 'rb') |
|
1568 |
+ # windows uses '\r\n' with py3k, but uses '\n' with py2.x |
|
1569 |
+ lines = fh.readlines() |
|
1570 |
+ self._saved_lines = lines |
|
1571 |
+ fh.close() |
|
1572 |
+ if any(b('\r\n') in line for line in lines): |
|
1573 |
+ endline = '\r\n' |
|
1574 |
+ else: |
|
1575 |
+ endline = '\n' |
|
1576 |
+ for entry in self.entries: |
|
1577 |
+ try: |
|
1578 |
+ logger.info('Removing entry: %s' % entry) |
|
1579 |
+ lines.remove(b(entry + endline)) |
|
1580 |
+ except ValueError: |
|
1581 |
+ pass |
|
1582 |
+ fh = open(self.file, 'wb') |
|
1583 |
+ fh.writelines(lines) |
|
1584 |
+ fh.close() |
|
1585 |
+ |
|
1586 |
+ def rollback(self): |
|
1587 |
+ if self._saved_lines is None: |
|
1588 |
+ logger.error('Cannot roll back changes to %s, none were made' % self.file) |
|
1589 |
+ return False |
|
1590 |
+ logger.info('Rolling %s back to previous state' % self.file) |
|
1591 |
+ fh = open(self.file, 'wb') |
|
1592 |
+ fh.writelines(self._saved_lines) |
|
1593 |
+ fh.close() |
|
1594 |
+ return True |
|
1595 |
+ |
|
1596 |
+ |
|
1597 |
+class FakeFile(object): |
|
1598 |
+ """Wrap a list of lines in an object with readline() to make |
|
1599 |
+ ConfigParser happy.""" |
|
1600 |
+ def __init__(self, lines): |
|
1601 |
+ self._gen = (l for l in lines) |
|
1602 |
+ |
|
1603 |
+ def readline(self): |
|
1604 |
+ try: |
|
1605 |
+ try: |
|
1606 |
+ return next(self._gen) |
|
1607 |
+ except NameError: |
|
1608 |
+ return self._gen.next() |
|
1609 |
+ except StopIteration: |
|
1610 |
+ return '' |
|
1611 |
+ |
|
1612 |
+ def __iter__(self): |
|
1613 |
+ return self._gen |
2 | 1616 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,18 @@ |
1 |
+import sys |
|
2 |
+import os |
|
3 |
+ |
|
4 |
+ |
|
5 |
+def run(): |
|
6 |
+ base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
|
7 |
+ ## FIXME: this is kind of crude; if we could create a fake pip |
|
8 |
+ ## module, then exec into it and update pip.__path__ properly, we |
|
9 |
+ ## wouldn't have to update sys.path: |
|
10 |
+ sys.path.insert(0, base) |
|
11 |
+ import pip |
|
12 |
+ return pip.main() |
|
13 |
+ |
|
14 |
+ |
|
15 |
+if __name__ == '__main__': |
|
16 |
+ exit = run() |
|
17 |
+ if exit: |
|
18 |
+ sys.exit(exit) |
2 | 8 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,668 @@ |
1 |
+import sys |
|
2 |
+import shutil |
|
3 |
+import os |
|
4 |
+import stat |
|
5 |
+import re |
|
6 |
+import posixpath |
|
7 |
+import pkg_resources |
|
8 |
+import zipfile |
|
9 |
+import tarfile |
|
10 |
+import subprocess |
|
11 |
+import textwrap |
|
12 |
+from pip.exceptions import InstallationError, BadCommand, PipError |
|
13 |
+from pip.backwardcompat import(WindowsError, string_types, raw_input, |
|
14 |
+ console_to_str, user_site, ssl) |
|
15 |
+from pip.locations import site_packages, running_under_virtualenv, virtualenv_no_global |
|
16 |
+from pip.log import logger |
|
17 |
+ |
|
18 |
+__all__ = ['rmtree', 'display_path', 'backup_dir', |
|
19 |
+ 'find_command', 'ask', 'Inf', |
|
20 |
+ 'normalize_name', 'splitext', |
|
21 |
+ 'format_size', 'is_installable_dir', |
|
22 |
+ 'is_svn_page', 'file_contents', |
|
23 |
+ 'split_leading_dir', 'has_leading_dir', |
|
24 |
+ 'make_path_relative', 'normalize_path', |
|
25 |
+ 'renames', 'get_terminal_size', 'get_prog', |
|
26 |
+ 'unzip_file', 'untar_file', 'create_download_cache_folder', |
|
27 |
+ 'cache_download', 'unpack_file', 'call_subprocess'] |
|
28 |
+ |
|
29 |
+ |
|
30 |
+def get_prog(): |
|
31 |
+ try: |
|
32 |
+ if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'): |
|
33 |
+ return "%s -m pip" % sys.executable |
|
34 |
+ except (AttributeError, TypeError, IndexError): |
|
35 |
+ pass |
|
36 |
+ return 'pip' |
|
37 |
+ |
|
38 |
+ |
|
39 |
+def rmtree(dir, ignore_errors=False): |
|
40 |
+ shutil.rmtree(dir, ignore_errors=ignore_errors, |
|
41 |
+ onerror=rmtree_errorhandler) |
|
42 |
+ |
|
43 |
+ |
|
44 |
+def rmtree_errorhandler(func, path, exc_info): |
|
45 |
+ """On Windows, the files in .svn are read-only, so when rmtree() tries to |
|
46 |
+ remove them, an exception is thrown. We catch that here, remove the |
|
47 |
+ read-only attribute, and hopefully continue without problems.""" |
|
48 |
+ exctype, value = exc_info[:2] |
|
49 |
+ if not ((exctype is WindowsError and value.args[0] == 5) or #others |
|
50 |
+ (exctype is OSError and value.args[0] == 13) or #python2.4 |
|
51 |
+ (exctype is PermissionError and value.args[3] == 5) #python3.3 |
|
52 |
+ ): |
|
53 |
+ raise |
|
54 |
+ # file type should currently be read only |
|
55 |
+ if ((os.stat(path).st_mode & stat.S_IREAD) != stat.S_IREAD): |
|
56 |
+ raise |
|
57 |
+ # convert to read/write |
|
58 |
+ os.chmod(path, stat.S_IWRITE) |
|
59 |
+ # use the original function to repeat the operation |
|
60 |
+ func(path) |
|
61 |
+ |
|
62 |
+ |
|
63 |
+def display_path(path): |
|
64 |
+ """Gives the display value for a given path, making it relative to cwd |
|
65 |
+ if possible.""" |
|
66 |
+ path = os.path.normcase(os.path.abspath(path)) |
|
67 |
+ if path.startswith(os.getcwd() + os.path.sep): |
|
68 |
+ path = '.' + path[len(os.getcwd()):] |
|
69 |
+ return path |
|
70 |
+ |
|
71 |
+ |
|
72 |
+def backup_dir(dir, ext='.bak'): |
|
73 |
+ """Figure out the name of a directory to back up the given dir to |
|
74 |
+ (adding .bak, .bak2, etc)""" |
|
75 |
+ n = 1 |
|
76 |
+ extension = ext |
|
77 |
+ while os.path.exists(dir + extension): |
|
78 |
+ n += 1 |
|
79 |
+ extension = ext + str(n) |
|
80 |
+ return dir + extension |
|
81 |
+ |
|
82 |
+ |
|
83 |
+def find_command(cmd, paths=None, pathext=None): |
|
84 |
+ """Searches the PATH for the given command and returns its path""" |
|
85 |
+ if paths is None: |
|
86 |
+ paths = os.environ.get('PATH', '').split(os.pathsep) |
|
87 |
+ if isinstance(paths, string_types): |
|
88 |
+ paths = [paths] |
|
89 |
+ # check if there are funny path extensions for executables, e.g. Windows |
|
90 |
+ if pathext is None: |
|
91 |
+ pathext = get_pathext() |
|
92 |
+ pathext = [ext for ext in pathext.lower().split(os.pathsep) if len(ext)] |
|
93 |
+ # don't use extensions if the command ends with one of them |
|
94 |
+ if os.path.splitext(cmd)[1].lower() in pathext: |
|
95 |
+ pathext = [''] |
|
96 |
+ # check if we find the command on PATH |
|
97 |
+ for path in paths: |
|
98 |
+ # try without extension first |
|
99 |
+ cmd_path = os.path.join(path, cmd) |
|
100 |
+ for ext in pathext: |
|
101 |
+ # then including the extension |
|
102 |
+ cmd_path_ext = cmd_path + ext |
|
103 |
+ if os.path.isfile(cmd_path_ext): |
|
104 |
+ return cmd_path_ext |
|
105 |
+ if os.path.isfile(cmd_path): |
|
106 |
+ return cmd_path |
|
107 |
+ raise BadCommand('Cannot find command %r' % cmd) |
|
108 |
+ |
|
109 |
+ |
|
110 |
+def get_pathext(default_pathext=None): |
|
111 |
+ """Returns the path extensions from environment or a default""" |
|
112 |
+ if default_pathext is None: |
|
113 |
+ default_pathext = os.pathsep.join(['.COM', '.EXE', '.BAT', '.CMD']) |
|
114 |
+ pathext = os.environ.get('PATHEXT', default_pathext) |
|
115 |
+ return pathext |
|
116 |
+ |
|
117 |
+ |
|
118 |
+def ask_path_exists(message, options): |
|
119 |
+ for action in os.environ.get('PIP_EXISTS_ACTION', ''): |
|
120 |
+ if action in options: |
|
121 |
+ return action |
|
122 |
+ return ask(message, options) |
|
123 |
+ |
|
124 |
+ |
|
125 |
+def ask(message, options): |
|
126 |
+ """Ask the message interactively, with the given possible responses""" |
|
127 |
+ while 1: |
|
128 |
+ if os.environ.get('PIP_NO_INPUT'): |
|
129 |
+ raise Exception('No input was expected ($PIP_NO_INPUT set); question: %s' % message) |
|
130 |
+ response = raw_input(message) |
|
131 |
+ response = response.strip().lower() |
|
132 |
+ if response not in options: |
|
133 |
+ print('Your response (%r) was not one of the expected responses: %s' % ( |
|
134 |
+ response, ', '.join(options))) |
|
135 |
+ else: |
|
136 |
+ return response |
|
137 |
+ |
|
138 |
+ |
|
139 |
+class _Inf(object): |
|
140 |
+ """I am bigger than everything!""" |
|
141 |
+ |
|
142 |
+ def __eq__(self, other): |
|
143 |
+ if self is other: |
|
144 |
+ return True |
|
145 |
+ else: |
|
146 |
+ return False |
|
147 |
+ |
|
148 |
+ def __ne__(self, other): |
|
149 |
+ return not self.__eq__(other) |
|
150 |
+ |
|
151 |
+ def __lt__(self, other): |
|
152 |
+ return False |
|
153 |
+ |
|
154 |
+ def __le__(self, other): |
|
155 |
+ return False |
|
156 |
+ |
|
157 |
+ def __gt__(self, other): |
|
158 |
+ return True |
|
159 |
+ |
|
160 |
+ def __ge__(self, other): |
|
161 |
+ return True |
|
162 |
+ |
|
163 |
+ def __repr__(self): |
|
164 |
+ return 'Inf' |
|
165 |
+ |
|
166 |
+ |
|
167 |
+Inf = _Inf() #this object is not currently used as a sortable in our code |
|
168 |
+del _Inf |
|
169 |
+ |
|
170 |
+ |
|
171 |
+_normalize_re = re.compile(r'[^a-z]', re.I) |
|
172 |
+ |
|
173 |
+ |
|
174 |
+def normalize_name(name): |
|
175 |
+ return _normalize_re.sub('-', name.lower()) |
|
176 |
+ |
|
177 |
+ |
|
178 |
+def format_size(bytes): |
|
179 |
+ if bytes > 1000*1000: |
|
180 |
+ return '%.1fMB' % (bytes/1000.0/1000) |
|
181 |
+ elif bytes > 10*1000: |
|
182 |
+ return '%ikB' % (bytes/1000) |
|
183 |
+ elif bytes > 1000: |
|
184 |
+ return '%.1fkB' % (bytes/1000.0) |
|
185 |
+ else: |
|
186 |
+ return '%ibytes' % bytes |
|
187 |
+ |
|
188 |
+ |
|
189 |
+def is_installable_dir(path): |
|
190 |
+ """Return True if `path` is a directory containing a setup.py file.""" |
|
191 |
+ if not os.path.isdir(path): |
|
192 |
+ return False |
|
193 |
+ setup_py = os.path.join(path, 'setup.py') |
|
194 |
+ if os.path.isfile(setup_py): |
|
195 |
+ return True |
|
196 |
+ return False |
|
197 |
+ |
|
198 |
+ |
|
199 |
+def is_svn_page(html): |
|
200 |
+ """Returns true if the page appears to be the index page of an svn repository""" |
|
201 |
+ return (re.search(r'<title>[^<]*Revision \d+:', html) |
|
202 |
+ and re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) |
|
203 |
+ |
|
204 |
+ |
|
205 |
+def file_contents(filename): |
|
206 |
+ fp = open(filename, 'rb') |
|
207 |
+ try: |
|
208 |
+ return fp.read().decode('utf-8') |
|
209 |
+ finally: |
|
210 |
+ fp.close() |
|
211 |
+ |
|
212 |
+ |
|
213 |
+def split_leading_dir(path): |
|
214 |
+ path = str(path) |
|
215 |
+ path = path.lstrip('/').lstrip('\\') |
|
216 |
+ if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) |
|
217 |
+ or '\\' not in path): |
|
218 |
+ return path.split('/', 1) |
|
219 |
+ elif '\\' in path: |
|
220 |
+ return path.split('\\', 1) |
|
221 |
+ else: |
|
222 |
+ return path, '' |
|
223 |
+ |
|
224 |
+ |
|
225 |
+def has_leading_dir(paths): |
|
226 |
+ """Returns true if all the paths have the same leading path name |
|
227 |
+ (i.e., everything is in one subdirectory in an archive)""" |
|
228 |
+ common_prefix = None |
|
229 |
+ for path in paths: |
|
230 |
+ prefix, rest = split_leading_dir(path) |
|
231 |
+ if not prefix: |
|
232 |
+ return False |
|
233 |
+ elif common_prefix is None: |
|
234 |
+ common_prefix = prefix |
|
235 |
+ elif prefix != common_prefix: |
|
236 |
+ return False |
|
237 |
+ return True |
|
238 |
+ |
|
239 |
+ |
|
240 |
+def make_path_relative(path, rel_to): |
|
241 |
+ """ |
|
242 |
+ Make a filename relative, where the filename path, and it is |
|
243 |
+ relative to rel_to |
|
244 |
+ |
|
245 |
+ >>> make_relative_path('/usr/share/something/a-file.pth', |
|
246 |
+ ... '/usr/share/another-place/src/Directory') |
|
247 |
+ '../../../something/a-file.pth' |
|
248 |
+ >>> make_relative_path('/usr/share/something/a-file.pth', |
|
249 |
+ ... '/home/user/src/Directory') |
|
250 |
+ '../../../usr/share/something/a-file.pth' |
|
251 |
+ >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/') |
|
252 |
+ 'a-file.pth' |
|
253 |
+ """ |
|
254 |
+ path_filename = os.path.basename(path) |
|
255 |
+ path = os.path.dirname(path) |
|
256 |
+ path = os.path.normpath(os.path.abspath(path)) |
|
257 |
+ rel_to = os.path.normpath(os.path.abspath(rel_to)) |
|
258 |
+ path_parts = path.strip(os.path.sep).split(os.path.sep) |
|
259 |
+ rel_to_parts = rel_to.strip(os.path.sep).split(os.path.sep) |
|
260 |
+ while path_parts and rel_to_parts and path_parts[0] == rel_to_parts[0]: |
|
261 |
+ path_parts.pop(0) |
|
262 |
+ rel_to_parts.pop(0) |
|
263 |
+ full_parts = ['..']*len(rel_to_parts) + path_parts + [path_filename] |
|
264 |
+ if full_parts == ['']: |
|
265 |
+ return '.' + os.path.sep |
|
266 |
+ return os.path.sep.join(full_parts) |
|
267 |
+ |
|
268 |
+ |
|
269 |
+def normalize_path(path): |
|
270 |
+ """ |
|
271 |
+ Convert a path to its canonical, case-normalized, absolute version. |
|
272 |
+ |
|
273 |
+ """ |
|
274 |
+ return os.path.normcase(os.path.realpath(path)) |
|
275 |
+ |
|
276 |
+ |
|
277 |
+def splitext(path): |
|
278 |
+ """Like os.path.splitext, but take off .tar too""" |
|
279 |
+ base, ext = posixpath.splitext(path) |
|
280 |
+ if base.lower().endswith('.tar'): |
|
281 |
+ ext = base[-4:] + ext |
|
282 |
+ base = base[:-4] |
|
283 |
+ return base, ext |
|
284 |
+ |
|
285 |
+ |
|
286 |
+def renames(old, new): |
|
287 |
+ """Like os.renames(), but handles renaming across devices.""" |
|
288 |
+ # Implementation borrowed from os.renames(). |
|
289 |
+ head, tail = os.path.split(new) |
|
290 |
+ if head and tail and not os.path.exists(head): |
|
291 |
+ os.makedirs(head) |
|
292 |
+ |
|
293 |
+ shutil.move(old, new) |
|
294 |
+ |
|
295 |
+ head, tail = os.path.split(old) |
|
296 |
+ if head and tail: |
|
297 |
+ try: |
|
298 |
+ os.removedirs(head) |
|
299 |
+ except OSError: |
|
300 |
+ pass |
|
301 |
+ |
|
302 |
+ |
|
303 |
+def is_local(path): |
|
304 |
+ """ |
|
305 |
+ Return True if path is within sys.prefix, if we're running in a virtualenv. |
|
306 |
+ |
|
307 |
+ If we're not in a virtualenv, all paths are considered "local." |
|
308 |
+ |
|
309 |
+ """ |
|
310 |
+ if not running_under_virtualenv(): |
|
311 |
+ return True |
|
312 |
+ return normalize_path(path).startswith(normalize_path(sys.prefix)) |
|
313 |
+ |
|
314 |
+ |
|
315 |
+def dist_is_local(dist): |
|
316 |
+ """ |
|
317 |
+ Return True if given Distribution object is installed locally |
|
318 |
+ (i.e. within current virtualenv). |
|
319 |
+ |
|
320 |
+ Always True if we're not in a virtualenv. |
|
321 |
+ |
|
322 |
+ """ |
|
323 |
+ return is_local(dist_location(dist)) |
|
324 |
+ |
|
325 |
+ |
|
326 |
+def dist_in_usersite(dist): |
|
327 |
+ """ |
|
328 |
+ Return True if given Distribution is installed in user site. |
|
329 |
+ """ |
|
330 |
+ if user_site: |
|
331 |
+ return normalize_path(dist_location(dist)).startswith(normalize_path(user_site)) |
|
332 |
+ else: |
|
333 |
+ return False |
|
334 |
+ |
|
335 |
+def dist_in_site_packages(dist): |
|
336 |
+ """ |
|
337 |
+ Return True if given Distribution is installed in distutils.sysconfig.get_python_lib(). |
|
338 |
+ """ |
|
339 |
+ return normalize_path(dist_location(dist)).startswith(normalize_path(site_packages)) |
|
340 |
+ |
|
341 |
+ |
|
342 |
+def dist_is_editable(dist): |
|
343 |
+ """Is distribution an editable install?""" |
|
344 |
+ #TODO: factor out determining editableness out of FrozenRequirement |
|
345 |
+ from pip import FrozenRequirement |
|
346 |
+ req = FrozenRequirement.from_dist(dist, []) |
|
347 |
+ return req.editable |
|
348 |
+ |
|
349 |
+def get_installed_distributions(local_only=True, |
|
350 |
+ skip=('setuptools', 'pip', 'python'), |
|
351 |
+ include_editables=True, |
|
352 |
+ editables_only=False): |
|
353 |
+ """ |
|
354 |
+ Return a list of installed Distribution objects. |
|
355 |
+ |
|
356 |
+ If ``local_only`` is True (default), only return installations |
|
357 |
+ local to the current virtualenv, if in a virtualenv. |
|
358 |
+ |
|
359 |
+ ``skip`` argument is an iterable of lower-case project names to |
|
360 |
+ ignore; defaults to ('setuptools', 'pip', 'python'). [FIXME also |
|
361 |
+ skip virtualenv?] |
|
362 |
+ |
|
363 |
+ If ``editables`` is False, don't report editables. |
|
364 |
+ |
|
365 |
+ If ``editables_only`` is True , only report editables. |
|
366 |
+ |
|
367 |
+ """ |
|
368 |
+ if local_only: |
|
369 |
+ local_test = dist_is_local |
|
370 |
+ else: |
|
371 |
+ local_test = lambda d: True |
|
372 |
+ |
|
373 |
+ if include_editables: |
|
374 |
+ editable_test = lambda d: True |
|
375 |
+ else: |
|
376 |
+ editable_test = lambda d: not dist_is_editable(d) |
|
377 |
+ |
|
378 |
+ if editables_only: |
|
379 |
+ editables_only_test = lambda d: dist_is_editable(d) |
|
380 |
+ else: |
|
381 |
+ editables_only_test = lambda d: True |
|
382 |
+ |
|
383 |
+ return [d for d in pkg_resources.working_set |
|
384 |
+ if local_test(d) |
|
385 |
+ and d.key not in skip |
|
386 |
+ and editable_test(d) |
|
387 |
+ and editables_only_test(d) |
|
388 |
+ ] |
|
389 |
+ |
|
390 |
+ |
|
391 |
+def egg_link_path(dist): |
|
392 |
+ """ |
|
393 |
+ Return the path for the .egg-link file if it exists, otherwise, None. |
|
394 |
+ |
|
395 |
+ There's 3 scenarios: |
|
396 |
+ 1) not in a virtualenv |
|
397 |
+ try to find in site.USER_SITE, then site_packages |
|
398 |
+ 2) in a no-global virtualenv |
|
399 |
+ try to find in site_packages |
|
400 |
+ 3) in a yes-global virtualenv |
|
401 |
+ try to find in site_packages, then site.USER_SITE (don't look in global location) |
|
402 |
+ |
|
403 |
+ For #1 and #3, there could be odd cases, where there's an egg-link in 2 locations. |
|
404 |
+ This method will just return the first one found. |
|
405 |
+ """ |
|
406 |
+ sites = [] |
|
407 |
+ if running_under_virtualenv(): |
|
408 |
+ if virtualenv_no_global(): |
|
409 |
+ sites.append(site_packages) |
|
410 |
+ else: |
|
411 |
+ sites.append(site_packages) |
|
412 |
+ if user_site: |
|
413 |
+ sites.append(user_site) |
|
414 |
+ else: |
|
415 |
+ if user_site: |
|
416 |
+ sites.append(user_site) |
|
417 |
+ sites.append(site_packages) |
|
418 |
+ |
|
419 |
+ for site in sites: |
|
420 |
+ egglink = os.path.join(site, dist.project_name) + '.egg-link' |
|
421 |
+ if os.path.isfile(egglink): |
|
422 |
+ return egglink |
|
423 |
+ |
|
424 |
+ |
|
425 |
+def dist_location(dist): |
|
426 |
+ """ |
|
427 |
+ Get the site-packages location of this distribution. Generally |
|
428 |
+ this is dist.location, except in the case of develop-installed |
|
429 |
+ packages, where dist.location is the source code location, and we |
|
430 |
+ want to know where the egg-link file is. |
|
431 |
+ |
|
432 |
+ """ |
|
433 |
+ egg_link = egg_link_path(dist) |
|
434 |
+ if egg_link: |
|
435 |
+ return egg_link |
|
436 |
+ return dist.location |
|
437 |
+ |
|
438 |
+ |
|
439 |
+def get_terminal_size(): |
|
440 |
+ """Returns a tuple (x, y) representing the width(x) and the height(x) |
|
441 |
+ in characters of the terminal window.""" |
|
442 |
+ def ioctl_GWINSZ(fd): |
|
443 |
+ try: |
|
444 |
+ import fcntl |
|
445 |
+ import termios |
|
446 |
+ import struct |
|
447 |
+ cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, |
|
448 |
+ '1234')) |
|
449 |
+ except: |
|
450 |
+ return None |
|
451 |
+ if cr == (0, 0): |
|
452 |
+ return None |
|
453 |
+ if cr == (0, 0): |
|
454 |
+ return None |
|
455 |
+ return cr |
|
456 |
+ cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) |
|
457 |
+ if not cr: |
|
458 |
+ try: |
|
459 |
+ fd = os.open(os.ctermid(), os.O_RDONLY) |
|
460 |
+ cr = ioctl_GWINSZ(fd) |
|
461 |
+ os.close(fd) |
|
462 |
+ except: |
|
463 |
+ pass |
|
464 |
+ if not cr: |
|
465 |
+ cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) |
|
466 |
+ return int(cr[1]), int(cr[0]) |
|
467 |
+ |
|
468 |
+ |
|
469 |
+def unzip_file(filename, location, flatten=True): |
|
470 |
+ """Unzip the file (zip file located at filename) to the destination |
|
471 |
+ location""" |
|
472 |
+ if not os.path.exists(location): |
|
473 |
+ os.makedirs(location) |
|
474 |
+ zipfp = open(filename, 'rb') |
|
475 |
+ try: |
|
476 |
+ zip = zipfile.ZipFile(zipfp) |
|
477 |
+ leading = has_leading_dir(zip.namelist()) and flatten |
|
478 |
+ for name in zip.namelist(): |
|
479 |
+ data = zip.read(name) |
|
480 |
+ fn = name |
|
481 |
+ if leading: |
|
482 |
+ fn = split_leading_dir(name)[1] |
|
483 |
+ fn = os.path.join(location, fn) |
|
484 |
+ dir = os.path.dirname(fn) |
|
485 |
+ if not os.path.exists(dir): |
|
486 |
+ os.makedirs(dir) |
|
487 |
+ if fn.endswith('/') or fn.endswith('\\'): |
|
488 |
+ # A directory |
|
489 |
+ if not os.path.exists(fn): |
|
490 |
+ os.makedirs(fn) |
|
491 |
+ else: |
|
492 |
+ fp = open(fn, 'wb') |
|
493 |
+ try: |
|
494 |
+ fp.write(data) |
|
495 |
+ finally: |
|
496 |
+ fp.close() |
|
497 |
+ finally: |
|
498 |
+ zipfp.close() |
|
499 |
+ |
|
500 |
+ |
|
501 |
+def untar_file(filename, location): |
|
502 |
+ """Untar the file (tar file located at filename) to the destination location""" |
|
503 |
+ if not os.path.exists(location): |
|
504 |
+ os.makedirs(location) |
|
505 |
+ if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): |
|
506 |
+ mode = 'r:gz' |
|
507 |
+ elif filename.lower().endswith('.bz2') or filename.lower().endswith('.tbz'): |
|
508 |
+ mode = 'r:bz2' |
|
509 |
+ elif filename.lower().endswith('.tar'): |
|
510 |
+ mode = 'r' |
|
511 |
+ else: |
|
512 |
+ logger.warn('Cannot determine compression type for file %s' % filename) |
|
513 |
+ mode = 'r:*' |
|
514 |
+ tar = tarfile.open(filename, mode) |
|
515 |
+ try: |
|
516 |
+ # note: python<=2.5 doesnt seem to know about pax headers, filter them |
|
517 |
+ leading = has_leading_dir([ |
|
518 |
+ member.name for member in tar.getmembers() |
|
519 |
+ if member.name != 'pax_global_header' |
|
520 |
+ ]) |
|
521 |
+ for member in tar.getmembers(): |
|
522 |
+ fn = member.name |
|
523 |
+ if fn == 'pax_global_header': |
|
524 |
+ continue |
|
525 |
+ if leading: |
|
526 |
+ fn = split_leading_dir(fn)[1] |
|
527 |
+ path = os.path.join(location, fn) |
|
528 |
+ if member.isdir(): |
|
529 |
+ if not os.path.exists(path): |
|
530 |
+ os.makedirs(path) |
|
531 |
+ elif member.issym(): |
|
532 |
+ try: |
|
533 |
+ tar._extract_member(member, path) |
|
534 |
+ except: |
|
535 |
+ e = sys.exc_info()[1] |
|
536 |
+ # Some corrupt tar files seem to produce this |
|
537 |
+ # (specifically bad symlinks) |
|
538 |
+ logger.warn( |
|
539 |
+ 'In the tar file %s the member %s is invalid: %s' |
|
540 |
+ % (filename, member.name, e)) |
|
541 |
+ continue |
|
542 |
+ else: |
|
543 |
+ try: |
|
544 |
+ fp = tar.extractfile(member) |
|
545 |
+ except (KeyError, AttributeError): |
|
546 |
+ e = sys.exc_info()[1] |
|
547 |
+ # Some corrupt tar files seem to produce this |
|
548 |
+ # (specifically bad symlinks) |
|
549 |
+ logger.warn( |
|
550 |
+ 'In the tar file %s the member %s is invalid: %s' |
|
551 |
+ % (filename, member.name, e)) |
|
552 |
+ continue |
|
553 |
+ if not os.path.exists(os.path.dirname(path)): |
|
554 |
+ os.makedirs(os.path.dirname(path)) |
|
555 |
+ destfp = open(path, 'wb') |
|
556 |
+ try: |
|
557 |
+ shutil.copyfileobj(fp, destfp) |
|
558 |
+ finally: |
|
559 |
+ destfp.close() |
|
560 |
+ fp.close() |
|
561 |
+ finally: |
|
562 |
+ tar.close() |
|
563 |
+ |
|
564 |
+ |
|
565 |
+def create_download_cache_folder(folder): |
|
566 |
+ logger.indent -= 2 |
|
567 |
+ logger.notify('Creating supposed download cache at %s' % folder) |
|
568 |
+ logger.indent += 2 |
|
569 |
+ os.makedirs(folder) |
|
570 |
+ |
|
571 |
+ |
|
572 |
+def cache_download(target_file, temp_location, content_type): |
|
573 |
+ logger.notify('Storing download in cache at %s' % display_path(target_file)) |
|
574 |
+ shutil.copyfile(temp_location, target_file) |
|
575 |
+ fp = open(target_file+'.content-type', 'w') |
|
576 |
+ fp.write(content_type) |
|
577 |
+ fp.close() |
|
578 |
+ os.unlink(temp_location) |
|
579 |
+ |
|
580 |
+ |
|
581 |
+def unpack_file(filename, location, content_type, link): |
|
582 |
+ if (content_type == 'application/zip' |
|
583 |
+ or filename.endswith('.zip') |
|
584 |
+ or filename.endswith('.pybundle') |
|
585 |
+ or zipfile.is_zipfile(filename)): |
|
586 |
+ unzip_file(filename, location, flatten=not filename.endswith('.pybundle')) |
|
587 |
+ elif (content_type == 'application/x-gzip' |
|
588 |
+ or tarfile.is_tarfile(filename) |
|
589 |
+ or splitext(filename)[1].lower() in ('.tar', '.tar.gz', '.tar.bz2', '.tgz', '.tbz')): |
|
590 |
+ untar_file(filename, location) |
|
591 |
+ elif (content_type and content_type.startswith('text/html') |
|
592 |
+ and is_svn_page(file_contents(filename))): |
|
593 |
+ # We don't really care about this |
|
594 |
+ from pip.vcs.subversion import Subversion |
|
595 |
+ Subversion('svn+' + link.url).unpack(location) |
|
596 |
+ else: |
|
597 |
+ ## FIXME: handle? |
|
598 |
+ ## FIXME: magic signatures? |
|
599 |
+ logger.fatal('Cannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive format' |
|
600 |
+ % (filename, location, content_type)) |
|
601 |
+ raise InstallationError('Cannot determine archive format of %s' % location) |
|
602 |
+ |
|
603 |
+ |
|
604 |
+def call_subprocess(cmd, show_stdout=True, |
|
605 |
+ filter_stdout=None, cwd=None, |
|
606 |
+ raise_on_returncode=True, |
|
607 |
+ command_level=logger.DEBUG, command_desc=None, |
|
608 |
+ extra_environ=None): |
|
609 |
+ if command_desc is None: |
|
610 |
+ cmd_parts = [] |
|
611 |
+ for part in cmd: |
|
612 |
+ if ' ' in part or '\n' in part or '"' in part or "'" in part: |
|
613 |
+ part = '"%s"' % part.replace('"', '\\"') |
|
614 |
+ cmd_parts.append(part) |
|
615 |
+ command_desc = ' '.join(cmd_parts) |
|
616 |
+ if show_stdout: |
|
617 |
+ stdout = None |
|
618 |
+ else: |
|
619 |
+ stdout = subprocess.PIPE |
|
620 |
+ logger.log(command_level, "Running command %s" % command_desc) |
|
621 |
+ env = os.environ.copy() |
|
622 |
+ if extra_environ: |
|
623 |
+ env.update(extra_environ) |
|
624 |
+ try: |
|
625 |
+ proc = subprocess.Popen( |
|
626 |
+ cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, |
|
627 |
+ cwd=cwd, env=env) |
|
628 |
+ except Exception: |
|
629 |
+ e = sys.exc_info()[1] |
|
630 |
+ logger.fatal( |
|
631 |
+ "Error %s while executing command %s" % (e, command_desc)) |
|
632 |
+ raise |
|
633 |
+ all_output = [] |
|
634 |
+ if stdout is not None: |
|
635 |
+ stdout = proc.stdout |
|
636 |
+ while 1: |
|
637 |
+ line = console_to_str(stdout.readline()) |
|
638 |
+ if not line: |
|
639 |
+ break |
|
640 |
+ line = line.rstrip() |
|
641 |
+ all_output.append(line + '\n') |
|
642 |
+ if filter_stdout: |
|
643 |
+ level = filter_stdout(line) |
|
644 |
+ if isinstance(level, tuple): |
|
645 |
+ level, line = level |
|
646 |
+ logger.log(level, line) |
|
647 |
+ if not logger.stdout_level_matches(level): |
|
648 |
+ logger.show_progress() |
|
649 |
+ else: |
|
650 |
+ logger.info(line) |
|
651 |
+ else: |
|
652 |
+ returned_stdout, returned_stderr = proc.communicate() |
|
653 |
+ all_output = [returned_stdout or ''] |
|
654 |
+ proc.wait() |
|
655 |
+ if proc.returncode: |
|
656 |
+ if raise_on_returncode: |
|
657 |
+ if all_output: |
|
658 |
+ logger.notify('Complete output from command %s:' % command_desc) |
|
659 |
+ logger.notify('\n'.join(all_output) + '\n----------------------------------------') |
|
660 |
+ raise InstallationError( |
|
661 |
+ "Command %s failed with error code %s in %s" |
|
662 |
+ % (command_desc, proc.returncode, cwd)) |
|
663 |
+ else: |
|
664 |
+ logger.warn( |
|
665 |
+ "Command %s had error code %s in %s" |
|
666 |
+ % (command_desc, proc.returncode, cwd)) |
|
667 |
+ if stdout is not None: |
|
668 |
+ return ''.join(all_output) |
2 | 671 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,251 @@ |
1 |
+"""Handles all VCS (version control) support""" |
|
2 |
+ |
|
3 |
+import os |
|
4 |
+import shutil |
|
5 |
+ |
|
6 |
+from pip.backwardcompat import urlparse, urllib |
|
7 |
+from pip.log import logger |
|
8 |
+from pip.util import (display_path, backup_dir, find_command, |
|
9 |
+ rmtree, ask_path_exists) |
|
10 |
+ |
|
11 |
+ |
|
12 |
+__all__ = ['vcs', 'get_src_requirement'] |
|
13 |
+ |
|
14 |
+ |
|
15 |
+class VcsSupport(object): |
|
16 |
+ _registry = {} |
|
17 |
+ schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] |
|
18 |
+ |
|
19 |
+ def __init__(self): |
|
20 |
+ # Register more schemes with urlparse for various version control systems |
|
21 |
+ urlparse.uses_netloc.extend(self.schemes) |
|
22 |
+ # Python >= 2.7.4, 3.3 doesn't have uses_fragment |
|
23 |
+ if getattr(urlparse, 'uses_fragment', None): |
|
24 |
+ urlparse.uses_fragment.extend(self.schemes) |
|
25 |
+ super(VcsSupport, self).__init__() |
|
26 |
+ |
|
27 |
+ def __iter__(self): |
|
28 |
+ return self._registry.__iter__() |
|
29 |
+ |
|
30 |
+ @property |
|
31 |
+ def backends(self): |
|
32 |
+ return list(self._registry.values()) |
|
33 |
+ |
|
34 |
+ @property |
|
35 |
+ def dirnames(self): |
|
36 |
+ return [backend.dirname for backend in self.backends] |
|
37 |
+ |
|
38 |
+ @property |
|
39 |
+ def all_schemes(self): |
|
40 |
+ schemes = [] |
|
41 |
+ for backend in self.backends: |
|
42 |
+ schemes.extend(backend.schemes) |
|
43 |
+ return schemes |
|
44 |
+ |
|
45 |
+ def register(self, cls): |
|
46 |
+ if not hasattr(cls, 'name'): |
|
47 |
+ logger.warn('Cannot register VCS %s' % cls.__name__) |
|
48 |
+ return |
|
49 |
+ if cls.name not in self._registry: |
|
50 |
+ self._registry[cls.name] = cls |
|
51 |
+ |
|
52 |
+ def unregister(self, cls=None, name=None): |
|
53 |
+ if name in self._registry: |
|
54 |
+ del self._registry[name] |
|
55 |
+ elif cls in self._registry.values(): |
|
56 |
+ del self._registry[cls.name] |
|
57 |
+ else: |
|
58 |
+ logger.warn('Cannot unregister because no class or name given') |
|
59 |
+ |
|
60 |
+ def get_backend_name(self, location): |
|
61 |
+ """ |
|
62 |
+ Return the name of the version control backend if found at given |
|
63 |
+ location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') |
|
64 |
+ """ |
|
65 |
+ for vc_type in self._registry.values(): |
|
66 |
+ path = os.path.join(location, vc_type.dirname) |
|
67 |
+ if os.path.exists(path): |
|
68 |
+ return vc_type.name |
|
69 |
+ return None |
|
70 |
+ |
|
71 |
+ def get_backend(self, name): |
|
72 |
+ name = name.lower() |
|
73 |
+ if name in self._registry: |
|
74 |
+ return self._registry[name] |
|
75 |
+ |
|
76 |
+ def get_backend_from_location(self, location): |
|
77 |
+ vc_type = self.get_backend_name(location) |
|
78 |
+ if vc_type: |
|
79 |
+ return self.get_backend(vc_type) |
|
80 |
+ return None |
|
81 |
+ |
|
82 |
+ |
|
83 |
+vcs = VcsSupport() |
|
84 |
+ |
|
85 |
+ |
|
86 |
+class VersionControl(object): |
|
87 |
+ name = '' |
|
88 |
+ dirname = '' |
|
89 |
+ |
|
90 |
+ def __init__(self, url=None, *args, **kwargs): |
|
91 |
+ self.url = url |
|
92 |
+ self._cmd = None |
|
93 |
+ super(VersionControl, self).__init__(*args, **kwargs) |
|
94 |
+ |
|
95 |
+ def _filter(self, line): |
|
96 |
+ return (logger.INFO, line) |
|
97 |
+ |
|
98 |
+ def _is_local_repository(self, repo): |
|
99 |
+ """ |
|
100 |
+ posix absolute paths start with os.path.sep, |
|
101 |
+ win32 ones ones start with drive (like c:\\folder) |
|
102 |
+ """ |
|
103 |
+ drive, tail = os.path.splitdrive(repo) |
|
104 |
+ return repo.startswith(os.path.sep) or drive |
|
105 |
+ |
|
106 |
+ @property |
|
107 |
+ def cmd(self): |
|
108 |
+ if self._cmd is not None: |
|
109 |
+ return self._cmd |
|
110 |
+ command = find_command(self.name) |
|
111 |
+ logger.info('Found command %r at %r' % (self.name, command)) |
|
112 |
+ self._cmd = command |
|
113 |
+ return command |
|
114 |
+ |
|
115 |
+ def get_url_rev(self): |
|
116 |
+ """ |
|
117 |
+ Returns the correct repository URL and revision by parsing the given |
|
118 |
+ repository URL |
|
119 |
+ """ |
|
120 |
+ error_message = ( |
|
121 |
+ "Sorry, '%s' is a malformed VCS url. " |
|
122 |
+ "The format is <vcs>+<protocol>://<url>, " |
|
123 |
+ "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp") |
|
124 |
+ assert '+' in self.url, error_message % self.url |
|
125 |
+ url = self.url.split('+', 1)[1] |
|
126 |
+ scheme, netloc, path, query, frag = urlparse.urlsplit(url) |
|
127 |
+ rev = None |
|
128 |
+ if '@' in path: |
|
129 |
+ path, rev = path.rsplit('@', 1) |
|
130 |
+ url = urlparse.urlunsplit((scheme, netloc, path, query, '')) |
|
131 |
+ return url, rev |
|
132 |
+ |
|
133 |
+ def get_info(self, location): |
|
134 |
+ """ |
|
135 |
+ Returns (url, revision), where both are strings |
|
136 |
+ """ |
|
137 |
+ assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location |
|
138 |
+ return self.get_url(location), self.get_revision(location) |
|
139 |
+ |
|
140 |
+ def normalize_url(self, url): |
|
141 |
+ """ |
|
142 |
+ Normalize a URL for comparison by unquoting it and removing any trailing slash. |
|
143 |
+ """ |
|
144 |
+ return urllib.unquote(url).rstrip('/') |
|
145 |
+ |
|
146 |
+ def compare_urls(self, url1, url2): |
|
147 |
+ """ |
|
148 |
+ Compare two repo URLs for identity, ignoring incidental differences. |
|
149 |
+ """ |
|
150 |
+ return (self.normalize_url(url1) == self.normalize_url(url2)) |
|
151 |
+ |
|
152 |
+ def parse_vcs_bundle_file(self, content): |
|
153 |
+ """ |
|
154 |
+ Takes the contents of the bundled text file that explains how to revert |
|
155 |
+ the stripped off version control data of the given package and returns |
|
156 |
+ the URL and revision of it. |
|
157 |
+ """ |
|
158 |
+ raise NotImplementedError |
|
159 |
+ |
|
160 |
+ def obtain(self, dest): |
|
161 |
+ """ |
|
162 |
+ Called when installing or updating an editable package, takes the |
|
163 |
+ source path of the checkout. |
|
164 |
+ """ |
|
165 |
+ raise NotImplementedError |
|
166 |
+ |
|
167 |
+ def switch(self, dest, url, rev_options): |
|
168 |
+ """ |
|
169 |
+ Switch the repo at ``dest`` to point to ``URL``. |
|
170 |
+ """ |
|
171 |
+ raise NotImplemented |
|
172 |
+ |
|
173 |
+ def update(self, dest, rev_options): |
|
174 |
+ """ |
|
175 |
+ Update an already-existing repo to the given ``rev_options``. |
|
176 |
+ """ |
|
177 |
+ raise NotImplementedError |
|
178 |
+ |
|
179 |
+ def check_destination(self, dest, url, rev_options, rev_display): |
|
180 |
+ """ |
|
181 |
+ Prepare a location to receive a checkout/clone. |
|
182 |
+ |
|
183 |
+ Return True if the location is ready for (and requires) a |
|
184 |
+ checkout/clone, False otherwise. |
|
185 |
+ """ |
|
186 |
+ checkout = True |
|
187 |
+ prompt = False |
|
188 |
+ if os.path.exists(dest): |
|
189 |
+ checkout = False |
|
190 |
+ if os.path.exists(os.path.join(dest, self.dirname)): |
|
191 |
+ existing_url = self.get_url(dest) |
|
192 |
+ if self.compare_urls(existing_url, url): |
|
193 |
+ logger.info('%s in %s exists, and has correct URL (%s)' % |
|
194 |
+ (self.repo_name.title(), display_path(dest), |
|
195 |
+ url)) |
|
196 |
+ logger.notify('Updating %s %s%s' % |
|
197 |
+ (display_path(dest), self.repo_name, |
|
198 |
+ rev_display)) |
|
199 |
+ self.update(dest, rev_options) |
|
200 |
+ else: |
|
201 |
+ logger.warn('%s %s in %s exists with URL %s' % |
|
202 |
+ (self.name, self.repo_name, |
|
203 |
+ display_path(dest), existing_url)) |
|
204 |
+ prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', |
|
205 |
+ ('s', 'i', 'w', 'b')) |
|
206 |
+ else: |
|
207 |
+ logger.warn('Directory %s already exists, ' |
|
208 |
+ 'and is not a %s %s.' % |
|
209 |
+ (dest, self.name, self.repo_name)) |
|
210 |
+ prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) |
|
211 |
+ if prompt: |
|
212 |
+ logger.warn('The plan is to install the %s repository %s' % |
|
213 |
+ (self.name, url)) |
|
214 |
+ response = ask_path_exists('What to do? %s' % prompt[0], |
|
215 |
+ prompt[1]) |
|
216 |
+ |
|
217 |
+ if response == 's': |
|
218 |
+ logger.notify('Switching %s %s to %s%s' % |
|
219 |
+ (self.repo_name, display_path(dest), url, |
|
220 |
+ rev_display)) |
|
221 |
+ self.switch(dest, url, rev_options) |
|
222 |
+ elif response == 'i': |
|
223 |
+ # do nothing |
|
224 |
+ pass |
|
225 |
+ elif response == 'w': |
|
226 |
+ logger.warn('Deleting %s' % display_path(dest)) |
|
227 |
+ rmtree(dest) |
|
228 |
+ checkout = True |
|
229 |
+ elif response == 'b': |
|
230 |
+ dest_dir = backup_dir(dest) |
|
231 |
+ logger.warn('Backing up %s to %s' |
|
232 |
+ % (display_path(dest), dest_dir)) |
|
233 |
+ shutil.move(dest, dest_dir) |
|
234 |
+ checkout = True |
|
235 |
+ return checkout |
|
236 |
+ |
|
237 |
+ def unpack(self, location): |
|
238 |
+ if os.path.exists(location): |
|
239 |
+ rmtree(location) |
|
240 |
+ self.obtain(location) |
|
241 |
+ |
|
242 |
+ def get_src_requirement(self, dist, location, find_tags=False): |
|
243 |
+ raise NotImplementedError |
|
244 |
+ |
|
245 |
+ |
|
246 |
+def get_src_requirement(dist, location, find_tags): |
|
247 |
+ version_control = vcs.get_backend_from_location(location) |
|
248 |
+ if version_control: |
|
249 |
+ return version_control().get_src_requirement(dist, location, find_tags) |
|
250 |
+ logger.warn('cannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch)' % location) |
|
251 |
+ return dist.as_requirement() |
2 | 254 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,131 @@ |
1 |
+import os |
|
2 |
+import tempfile |
|
3 |
+import re |
|
4 |
+from pip.backwardcompat import urlparse |
|
5 |
+from pip.log import logger |
|
6 |
+from pip.util import rmtree, display_path, call_subprocess |
|
7 |
+from pip.vcs import vcs, VersionControl |
|
8 |
+from pip.download import path_to_url2 |
|
9 |
+ |
|
10 |
+ |
|
11 |
+class Bazaar(VersionControl): |
|
12 |
+ name = 'bzr' |
|
13 |
+ dirname = '.bzr' |
|
14 |
+ repo_name = 'branch' |
|
15 |
+ bundle_file = 'bzr-branch.txt' |
|
16 |
+ schemes = ('bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', 'bzr+lp') |
|
17 |
+ guide = ('# This was a Bazaar branch; to make it a branch again run:\n' |
|
18 |
+ 'bzr branch -r %(rev)s %(url)s .\n') |
|
19 |
+ |
|
20 |
+ def __init__(self, url=None, *args, **kwargs): |
|
21 |
+ super(Bazaar, self).__init__(url, *args, **kwargs) |
|
22 |
+ # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical |
|
23 |
+ # Register lp but do not expose as a scheme to support bzr+lp. |
|
24 |
+ if getattr(urlparse, 'uses_fragment', None): |
|
25 |
+ urlparse.uses_fragment.extend(['lp']) |
|
26 |
+ urlparse.non_hierarchical.extend(['lp']) |
|
27 |
+ |
|
28 |
+ def parse_vcs_bundle_file(self, content): |
|
29 |
+ url = rev = None |
|
30 |
+ for line in content.splitlines(): |
|
31 |
+ if not line.strip() or line.strip().startswith('#'): |
|
32 |
+ continue |
|
33 |
+ match = re.search(r'^bzr\s*branch\s*-r\s*(\d*)', line) |
|
34 |
+ if match: |
|
35 |
+ rev = match.group(1).strip() |
|
36 |
+ url = line[match.end():].strip().split(None, 1)[0] |
|
37 |
+ if url and rev: |
|
38 |
+ return url, rev |
|
39 |
+ return None, None |
|
40 |
+ |
|
41 |
+ def export(self, location): |
|
42 |
+ """Export the Bazaar repository at the url to the destination location""" |
|
43 |
+ temp_dir = tempfile.mkdtemp('-export', 'pip-') |
|
44 |
+ self.unpack(temp_dir) |
|
45 |
+ if os.path.exists(location): |
|
46 |
+ # Remove the location to make sure Bazaar can export it correctly |
|
47 |
+ rmtree(location) |
|
48 |
+ try: |
|
49 |
+ call_subprocess([self.cmd, 'export', location], cwd=temp_dir, |
|
50 |
+ filter_stdout=self._filter, show_stdout=False) |
|
51 |
+ finally: |
|
52 |
+ rmtree(temp_dir) |
|
53 |
+ |
|
54 |
+ def switch(self, dest, url, rev_options): |
|
55 |
+ call_subprocess([self.cmd, 'switch', url], cwd=dest) |
|
56 |
+ |
|
57 |
+ def update(self, dest, rev_options): |
|
58 |
+ call_subprocess( |
|
59 |
+ [self.cmd, 'pull', '-q'] + rev_options, cwd=dest) |
|
60 |
+ |
|
61 |
+ def obtain(self, dest): |
|
62 |
+ url, rev = self.get_url_rev() |
|
63 |
+ if rev: |
|
64 |
+ rev_options = ['-r', rev] |
|
65 |
+ rev_display = ' (to revision %s)' % rev |
|
66 |
+ else: |
|
67 |
+ rev_options = [] |
|
68 |
+ rev_display = '' |
|
69 |
+ if self.check_destination(dest, url, rev_options, rev_display): |
|
70 |
+ logger.notify('Checking out %s%s to %s' |
|
71 |
+ % (url, rev_display, display_path(dest))) |
|
72 |
+ call_subprocess( |
|
73 |
+ [self.cmd, 'branch', '-q'] + rev_options + [url, dest]) |
|
74 |
+ |
|
75 |
+ def get_url_rev(self): |
|
76 |
+ # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it |
|
77 |
+ url, rev = super(Bazaar, self).get_url_rev() |
|
78 |
+ if url.startswith('ssh://'): |
|
79 |
+ url = 'bzr+' + url |
|
80 |
+ return url, rev |
|
81 |
+ |
|
82 |
+ def get_url(self, location): |
|
83 |
+ urls = call_subprocess( |
|
84 |
+ [self.cmd, 'info'], show_stdout=False, cwd=location) |
|
85 |
+ for line in urls.splitlines(): |
|
86 |
+ line = line.strip() |
|
87 |
+ for x in ('checkout of branch: ', |
|
88 |
+ 'parent branch: '): |
|
89 |
+ if line.startswith(x): |
|
90 |
+ repo = line.split(x)[1] |
|
91 |
+ if self._is_local_repository(repo): |
|
92 |
+ return path_to_url2(repo) |
|
93 |
+ return repo |
|
94 |
+ return None |
|
95 |
+ |
|
96 |
+ def get_revision(self, location): |
|
97 |
+ revision = call_subprocess( |
|
98 |
+ [self.cmd, 'revno'], show_stdout=False, cwd=location) |
|
99 |
+ return revision.splitlines()[-1] |
|
100 |
+ |
|
101 |
+ def get_tag_revs(self, location): |
|
102 |
+ tags = call_subprocess( |
|
103 |
+ [self.cmd, 'tags'], show_stdout=False, cwd=location) |
|
104 |
+ tag_revs = [] |
|
105 |
+ for line in tags.splitlines(): |
|
106 |
+ tags_match = re.search(r'([.\w-]+)\s*(.*)$', line) |
|
107 |
+ if tags_match: |
|
108 |
+ tag = tags_match.group(1) |
|
109 |
+ rev = tags_match.group(2) |
|
110 |
+ tag_revs.append((rev.strip(), tag.strip())) |
|
111 |
+ return dict(tag_revs) |
|
112 |
+ |
|
113 |
+ def get_src_requirement(self, dist, location, find_tags): |
|
114 |
+ repo = self.get_url(location) |
|
115 |
+ if not repo.lower().startswith('bzr:'): |
|
116 |
+ repo = 'bzr+' + repo |
|
117 |
+ egg_project_name = dist.egg_name().split('-', 1)[0] |
|
118 |
+ if not repo: |
|
119 |
+ return None |
|
120 |
+ current_rev = self.get_revision(location) |
|
121 |
+ tag_revs = self.get_tag_revs(location) |
|
122 |
+ |
|
123 |
+ if current_rev in tag_revs: |
|
124 |
+ # It's a tag |
|
125 |
+ full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) |
|
126 |
+ else: |
|
127 |
+ full_egg_name = '%s-dev_r%s' % (dist.egg_name(), current_rev) |
|
128 |
+ return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) |
|
129 |
+ |
|
130 |
+ |
|
131 |
+vcs.register(Bazaar) |
2 | 134 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,220 @@ |
1 |
+import tempfile |
|
2 |
+import re |
|
3 |
+import os.path |
|
4 |
+from pip.util import call_subprocess |
|
5 |
+from pip.util import display_path, rmtree |
|
6 |
+from pip.vcs import vcs, VersionControl |
|
7 |
+from pip.log import logger |
|
8 |
+from pip.backwardcompat import url2pathname, urlparse |
|
9 |
+urlsplit = urlparse.urlsplit |
|
10 |
+urlunsplit = urlparse.urlunsplit |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class Git(VersionControl): |
|
14 |
+ name = 'git' |
|
15 |
+ dirname = '.git' |
|
16 |
+ repo_name = 'clone' |
|
17 |
+ schemes = ('git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file') |
|
18 |
+ bundle_file = 'git-clone.txt' |
|
19 |
+ guide = ('# This was a Git repo; to make it a repo again run:\n' |
|
20 |
+ 'git init\ngit remote add origin %(url)s -f\ngit checkout %(rev)s\n') |
|
21 |
+ |
|
22 |
+ def __init__(self, url=None, *args, **kwargs): |
|
23 |
+ |
|
24 |
+ # Works around an apparent Git bug |
|
25 |
+ # (see http://article.gmane.org/gmane.comp.version-control.git/146500) |
|
26 |
+ if url: |
|
27 |
+ scheme, netloc, path, query, fragment = urlsplit(url) |
|
28 |
+ if scheme.endswith('file'): |
|
29 |
+ initial_slashes = path[:-len(path.lstrip('/'))] |
|
30 |
+ newpath = initial_slashes + url2pathname(path).replace('\\', '/').lstrip('/') |
|
31 |
+ url = urlunsplit((scheme, netloc, newpath, query, fragment)) |
|
32 |
+ after_plus = scheme.find('+') + 1 |
|
33 |
+ url = scheme[:after_plus] + urlunsplit((scheme[after_plus:], netloc, newpath, query, fragment)) |
|
34 |
+ |
|
35 |
+ super(Git, self).__init__(url, *args, **kwargs) |
|
36 |
+ |
|
37 |
+ def parse_vcs_bundle_file(self, content): |
|
38 |
+ url = rev = None |
|
39 |
+ for line in content.splitlines(): |
|
40 |
+ if not line.strip() or line.strip().startswith('#'): |
|
41 |
+ continue |
|
42 |
+ url_match = re.search(r'git\s*remote\s*add\s*origin(.*)\s*-f', line) |
|
43 |
+ if url_match: |
|
44 |
+ url = url_match.group(1).strip() |
|
45 |
+ rev_match = re.search(r'^git\s*checkout\s*-q\s*(.*)\s*', line) |
|
46 |
+ if rev_match: |
|
47 |
+ rev = rev_match.group(1).strip() |
|
48 |
+ if url and rev: |
|
49 |
+ return url, rev |
|
50 |
+ return None, None |
|
51 |
+ |
|
52 |
+ def export(self, location): |
|
53 |
+ """Export the Git repository at the url to the destination location""" |
|
54 |
+ temp_dir = tempfile.mkdtemp('-export', 'pip-') |
|
55 |
+ self.unpack(temp_dir) |
|
56 |
+ try: |
|
57 |
+ if not location.endswith('/'): |
|
58 |
+ location = location + '/' |
|
59 |
+ call_subprocess( |
|
60 |
+ [self.cmd, 'checkout-index', '-a', '-f', '--prefix', location], |
|
61 |
+ filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) |
|
62 |
+ finally: |
|
63 |
+ rmtree(temp_dir) |
|
64 |
+ |
|
65 |
+ def check_rev_options(self, rev, dest, rev_options): |
|
66 |
+ """Check the revision options before checkout to compensate that tags |
|
67 |
+ and branches may need origin/ as a prefix. |
|
68 |
+ Returns the SHA1 of the branch or tag if found. |
|
69 |
+ """ |
|
70 |
+ revisions = self.get_tag_revs(dest) |
|
71 |
+ revisions.update(self.get_branch_revs(dest)) |
|
72 |
+ |
|
73 |
+ origin_rev = 'origin/%s' % rev |
|
74 |
+ if origin_rev in revisions: |
|
75 |
+ # remote branch |
|
76 |
+ return [revisions[origin_rev]] |
|
77 |
+ elif rev in revisions: |
|
78 |
+ # a local tag or branch name |
|
79 |
+ return [revisions[rev]] |
|
80 |
+ else: |
|
81 |
+ logger.warn("Could not find a tag or branch '%s', assuming commit." % rev) |
|
82 |
+ return rev_options |
|
83 |
+ |
|
84 |
+ def switch(self, dest, url, rev_options): |
|
85 |
+ call_subprocess( |
|
86 |
+ [self.cmd, 'config', 'remote.origin.url', url], cwd=dest) |
|
87 |
+ call_subprocess( |
|
88 |
+ [self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) |
|
89 |
+ |
|
90 |
+ self.update_submodules(dest) |
|
91 |
+ |
|
92 |
+ def update(self, dest, rev_options): |
|
93 |
+ # First fetch changes from the default remote |
|
94 |
+ call_subprocess([self.cmd, 'fetch', '-q'], cwd=dest) |
|
95 |
+ # Then reset to wanted revision (maby even origin/master) |
|
96 |
+ if rev_options: |
|
97 |
+ rev_options = self.check_rev_options(rev_options[0], dest, rev_options) |
|
98 |
+ call_subprocess([self.cmd, 'reset', '--hard', '-q'] + rev_options, cwd=dest) |
|
99 |
+ #: update submodules |
|
100 |
+ self.update_submodules(dest) |
|
101 |
+ |
|
102 |
+ def obtain(self, dest): |
|
103 |
+ url, rev = self.get_url_rev() |
|
104 |
+ if rev: |
|
105 |
+ rev_options = [rev] |
|
106 |
+ rev_display = ' (to %s)' % rev |
|
107 |
+ else: |
|
108 |
+ rev_options = ['origin/master'] |
|
109 |
+ rev_display = '' |
|
110 |
+ if self.check_destination(dest, url, rev_options, rev_display): |
|
111 |
+ logger.notify('Cloning %s%s to %s' % (url, rev_display, display_path(dest))) |
|
112 |
+ call_subprocess([self.cmd, 'clone', '-q', url, dest]) |
|
113 |
+ #: repo may contain submodules |
|
114 |
+ self.update_submodules(dest) |
|
115 |
+ if rev: |
|
116 |
+ rev_options = self.check_rev_options(rev, dest, rev_options) |
|
117 |
+ # Only do a checkout if rev_options differs from HEAD |
|
118 |
+ if not self.get_revision(dest).startswith(rev_options[0]): |
|
119 |
+ call_subprocess([self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) |
|
120 |
+ |
|
121 |
+ def get_url(self, location): |
|
122 |
+ url = call_subprocess( |
|
123 |
+ [self.cmd, 'config', 'remote.origin.url'], |
|
124 |
+ show_stdout=False, cwd=location) |
|
125 |
+ return url.strip() |
|
126 |
+ |
|
127 |
+ def get_revision(self, location): |
|
128 |
+ current_rev = call_subprocess( |
|
129 |
+ [self.cmd, 'rev-parse', 'HEAD'], show_stdout=False, cwd=location) |
|
130 |
+ return current_rev.strip() |
|
131 |
+ |
|
132 |
+ def get_tag_revs(self, location): |
|
133 |
+ tags = self._get_all_tag_names(location) |
|
134 |
+ tag_revs = {} |
|
135 |
+ for line in tags.splitlines(): |
|
136 |
+ tag = line.strip() |
|
137 |
+ rev = self._get_revision_from_rev_parse(tag, location) |
|
138 |
+ tag_revs[tag] = rev.strip() |
|
139 |
+ return tag_revs |
|
140 |
+ |
|
141 |
+ def get_branch_revs(self, location): |
|
142 |
+ branches = self._get_all_branch_names(location) |
|
143 |
+ branch_revs = {} |
|
144 |
+ for line in branches.splitlines(): |
|
145 |
+ if '(no branch)' in line: |
|
146 |
+ continue |
|
147 |
+ line = line.split('->')[0].strip() |
|
148 |
+ # actual branch case |
|
149 |
+ branch = "".join(b for b in line.split() if b != '*') |
|
150 |
+ rev = self._get_revision_from_rev_parse(branch, location) |
|
151 |
+ branch_revs[branch] = rev.strip() |
|
152 |
+ return branch_revs |
|
153 |
+ |
|
154 |
+ def get_src_requirement(self, dist, location, find_tags): |
|
155 |
+ repo = self.get_url(location) |
|
156 |
+ if not repo.lower().startswith('git:'): |
|
157 |
+ repo = 'git+' + repo |
|
158 |
+ egg_project_name = dist.egg_name().split('-', 1)[0] |
|
159 |
+ if not repo: |
|
160 |
+ return None |
|
161 |
+ current_rev = self.get_revision(location) |
|
162 |
+ tag_revs = self.get_tag_revs(location) |
|
163 |
+ branch_revs = self.get_branch_revs(location) |
|
164 |
+ |
|
165 |
+ if current_rev in tag_revs: |
|
166 |
+ # It's a tag |
|
167 |
+ full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) |
|
168 |
+ elif (current_rev in branch_revs and |
|
169 |
+ branch_revs[current_rev] != 'origin/master'): |
|
170 |
+ # It's the head of a branch |
|
171 |
+ full_egg_name = '%s-%s' % ( |
|
172 |
+ egg_project_name, |
|
173 |
+ branch_revs[current_rev].replace('origin/', '') |
|
174 |
+ ) |
|
175 |
+ else: |
|
176 |
+ full_egg_name = '%s-dev' % egg_project_name |
|
177 |
+ |
|
178 |
+ return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) |
|
179 |
+ |
|
180 |
+ def get_url_rev(self): |
|
181 |
+ """ |
|
182 |
+ Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. |
|
183 |
+ That's required because although they use SSH they sometimes doesn't |
|
184 |
+ work with a ssh:// scheme (e.g. Github). But we need a scheme for |
|
185 |
+ parsing. Hence we remove it again afterwards and return it as a stub. |
|
186 |
+ """ |
|
187 |
+ if not '://' in self.url: |
|
188 |
+ assert not 'file:' in self.url |
|
189 |
+ self.url = self.url.replace('git+', 'git+ssh://') |
|
190 |
+ url, rev = super(Git, self).get_url_rev() |
|
191 |
+ url = url.replace('ssh://', '') |
|
192 |
+ else: |
|
193 |
+ url, rev = super(Git, self).get_url_rev() |
|
194 |
+ |
|
195 |
+ return url, rev |
|
196 |
+ |
|
197 |
+ def _get_all_tag_names(self, location): |
|
198 |
+ return call_subprocess([self.cmd, 'tag', '-l'], |
|
199 |
+ show_stdout=False, |
|
200 |
+ raise_on_returncode=False, |
|
201 |
+ cwd=location) |
|
202 |
+ |
|
203 |
+ def _get_all_branch_names(self, location): |
|
204 |
+ remote_branches = call_subprocess([self.cmd, 'branch', '-r'], |
|
205 |
+ show_stdout=False, cwd=location) |
|
206 |
+ local_branches = call_subprocess([self.cmd, 'branch', '-l'], |
|
207 |
+ show_stdout=False, cwd=location) |
|
208 |
+ return remote_branches + local_branches |
|
209 |
+ |
|
210 |
+ def _get_revision_from_rev_parse(self, name, location): |
|
211 |
+ return call_subprocess([self.cmd, 'rev-parse', name], |
|
212 |
+ show_stdout=False, cwd=location) |
|
213 |
+ |
|
214 |
+ def update_submodules(self, location): |
|
215 |
+ if not os.path.exists(os.path.join(location, '.gitmodules')): |
|
216 |
+ return |
|
217 |
+ call_subprocess([self.cmd, 'submodule', 'update', '--init', '--recursive', '-q'], |
|
218 |
+ cwd=location) |
|
219 |
+ |
|
220 |
+vcs.register(Git) |
2 | 223 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,151 @@ |
1 |
+import os |
|
2 |
+import tempfile |
|
3 |
+import re |
|
4 |
+import sys |
|
5 |
+from pip.util import call_subprocess |
|
6 |
+from pip.util import display_path, rmtree |
|
7 |
+from pip.log import logger |
|
8 |
+from pip.vcs import vcs, VersionControl |
|
9 |
+from pip.download import path_to_url2 |
|
10 |
+from pip.backwardcompat import ConfigParser |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class Mercurial(VersionControl): |
|
14 |
+ name = 'hg' |
|
15 |
+ dirname = '.hg' |
|
16 |
+ repo_name = 'clone' |
|
17 |
+ schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') |
|
18 |
+ bundle_file = 'hg-clone.txt' |
|
19 |
+ guide = ('# This was a Mercurial repo; to make it a repo again run:\n' |
|
20 |
+ 'hg init\nhg pull %(url)s\nhg update -r %(rev)s\n') |
|
21 |
+ |
|
22 |
+ def parse_vcs_bundle_file(self, content): |
|
23 |
+ url = rev = None |
|
24 |
+ for line in content.splitlines(): |
|
25 |
+ if not line.strip() or line.strip().startswith('#'): |
|
26 |
+ continue |
|
27 |
+ url_match = re.search(r'hg\s*pull\s*(.*)\s*', line) |
|
28 |
+ if url_match: |
|
29 |
+ url = url_match.group(1).strip() |
|
30 |
+ rev_match = re.search(r'^hg\s*update\s*-r\s*(.*)\s*', line) |
|
31 |
+ if rev_match: |
|
32 |
+ rev = rev_match.group(1).strip() |
|
33 |
+ if url and rev: |
|
34 |
+ return url, rev |
|
35 |
+ return None, None |
|
36 |
+ |
|
37 |
+ def export(self, location): |
|
38 |
+ """Export the Hg repository at the url to the destination location""" |
|
39 |
+ temp_dir = tempfile.mkdtemp('-export', 'pip-') |
|
40 |
+ self.unpack(temp_dir) |
|
41 |
+ try: |
|
42 |
+ call_subprocess( |
|
43 |
+ [self.cmd, 'archive', location], |
|
44 |
+ filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) |
|
45 |
+ finally: |
|
46 |
+ rmtree(temp_dir) |
|
47 |
+ |
|
48 |
+ def switch(self, dest, url, rev_options): |
|
49 |
+ repo_config = os.path.join(dest, self.dirname, 'hgrc') |
|
50 |
+ config = ConfigParser.SafeConfigParser() |
|
51 |
+ try: |
|
52 |
+ config.read(repo_config) |
|
53 |
+ config.set('paths', 'default', url) |
|
54 |
+ config_file = open(repo_config, 'w') |
|
55 |
+ config.write(config_file) |
|
56 |
+ config_file.close() |
|
57 |
+ except (OSError, ConfigParser.NoSectionError): |
|
58 |
+ e = sys.exc_info()[1] |
|
59 |
+ logger.warn( |
|
60 |
+ 'Could not switch Mercurial repository to %s: %s' |
|
61 |
+ % (url, e)) |
|
62 |
+ else: |
|
63 |
+ call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) |
|
64 |
+ |
|
65 |
+ def update(self, dest, rev_options): |
|
66 |
+ call_subprocess([self.cmd, 'pull', '-q'], cwd=dest) |
|
67 |
+ call_subprocess( |
|
68 |
+ [self.cmd, 'update', '-q'] + rev_options, cwd=dest) |
|
69 |
+ |
|
70 |
+ def obtain(self, dest): |
|
71 |
+ url, rev = self.get_url_rev() |
|
72 |
+ if rev: |
|
73 |
+ rev_options = [rev] |
|
74 |
+ rev_display = ' (to revision %s)' % rev |
|
75 |
+ else: |
|
76 |
+ rev_options = [] |
|
77 |
+ rev_display = '' |
|
78 |
+ if self.check_destination(dest, url, rev_options, rev_display): |
|
79 |
+ logger.notify('Cloning hg %s%s to %s' |
|
80 |
+ % (url, rev_display, display_path(dest))) |
|
81 |
+ call_subprocess([self.cmd, 'clone', '--noupdate', '-q', url, dest]) |
|
82 |
+ call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) |
|
83 |
+ |
|
84 |
+ def get_url(self, location): |
|
85 |
+ url = call_subprocess( |
|
86 |
+ [self.cmd, 'showconfig', 'paths.default'], |
|
87 |
+ show_stdout=False, cwd=location).strip() |
|
88 |
+ if self._is_local_repository(url): |
|
89 |
+ url = path_to_url2(url) |
|
90 |
+ return url.strip() |
|
91 |
+ |
|
92 |
+ def get_tag_revs(self, location): |
|
93 |
+ tags = call_subprocess( |
|
94 |
+ [self.cmd, 'tags'], show_stdout=False, cwd=location) |
|
95 |
+ tag_revs = [] |
|
96 |
+ for line in tags.splitlines(): |
|
97 |
+ tags_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) |
|
98 |
+ if tags_match: |
|
99 |
+ tag = tags_match.group(1) |
|
100 |
+ rev = tags_match.group(2) |
|
101 |
+ if "tip" != tag: |
|
102 |
+ tag_revs.append((rev.strip(), tag.strip())) |
|
103 |
+ return dict(tag_revs) |
|
104 |
+ |
|
105 |
+ def get_branch_revs(self, location): |
|
106 |
+ branches = call_subprocess( |
|
107 |
+ [self.cmd, 'branches'], show_stdout=False, cwd=location) |
|
108 |
+ branch_revs = [] |
|
109 |
+ for line in branches.splitlines(): |
|
110 |
+ branches_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) |
|
111 |
+ if branches_match: |
|
112 |
+ branch = branches_match.group(1) |
|
113 |
+ rev = branches_match.group(2) |
|
114 |
+ if "default" != branch: |
|
115 |
+ branch_revs.append((rev.strip(), branch.strip())) |
|
116 |
+ return dict(branch_revs) |
|
117 |
+ |
|
118 |
+ def get_revision(self, location): |
|
119 |
+ current_revision = call_subprocess( |
|
120 |
+ [self.cmd, 'parents', '--template={rev}'], |
|
121 |
+ show_stdout=False, cwd=location).strip() |
|
122 |
+ return current_revision |
|
123 |
+ |
|
124 |
+ def get_revision_hash(self, location): |
|
125 |
+ current_rev_hash = call_subprocess( |
|
126 |
+ [self.cmd, 'parents', '--template={node}'], |
|
127 |
+ show_stdout=False, cwd=location).strip() |
|
128 |
+ return current_rev_hash |
|
129 |
+ |
|
130 |
+ def get_src_requirement(self, dist, location, find_tags): |
|
131 |
+ repo = self.get_url(location) |
|
132 |
+ if not repo.lower().startswith('hg:'): |
|
133 |
+ repo = 'hg+' + repo |
|
134 |
+ egg_project_name = dist.egg_name().split('-', 1)[0] |
|
135 |
+ if not repo: |
|
136 |
+ return None |
|
137 |
+ current_rev = self.get_revision(location) |
|
138 |
+ current_rev_hash = self.get_revision_hash(location) |
|
139 |
+ tag_revs = self.get_tag_revs(location) |
|
140 |
+ branch_revs = self.get_branch_revs(location) |
|
141 |
+ if current_rev in tag_revs: |
|
142 |
+ # It's a tag |
|
143 |
+ full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) |
|
144 |
+ elif current_rev in branch_revs: |
|
145 |
+ # It's the tip of a branch |
|
146 |
+ full_egg_name = '%s-%s' % (egg_project_name, branch_revs[current_rev]) |
|
147 |
+ else: |
|
148 |
+ full_egg_name = '%s-dev' % egg_project_name |
|
149 |
+ return '%s@%s#egg=%s' % (repo, current_rev_hash, full_egg_name) |
|
150 |
+ |
|
151 |
+vcs.register(Mercurial) |
2 | 154 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,272 @@ |
1 |
+import os |
|
2 |
+import re |
|
3 |
+from pip.backwardcompat import urlparse |
|
4 |
+from pip import InstallationError |
|
5 |
+from pip.index import Link |
|
6 |
+from pip.util import rmtree, display_path, call_subprocess |
|
7 |
+from pip.log import logger |
|
8 |
+from pip.vcs import vcs, VersionControl |
|
9 |
+ |
|
10 |
+_svn_xml_url_re = re.compile('url="([^"]+)"') |
|
11 |
+_svn_rev_re = re.compile('committed-rev="(\d+)"') |
|
12 |
+_svn_url_re = re.compile(r'URL: (.+)') |
|
13 |
+_svn_revision_re = re.compile(r'Revision: (.+)') |
|
14 |
+_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') |
|
15 |
+_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') |
|
16 |
+ |
|
17 |
+ |
|
18 |
+class Subversion(VersionControl): |
|
19 |
+ name = 'svn' |
|
20 |
+ dirname = '.svn' |
|
21 |
+ repo_name = 'checkout' |
|
22 |
+ schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') |
|
23 |
+ bundle_file = 'svn-checkout.txt' |
|
24 |
+ guide = ('# This was an svn checkout; to make it a checkout again run:\n' |
|
25 |
+ 'svn checkout --force -r %(rev)s %(url)s .\n') |
|
26 |
+ |
|
27 |
+ def get_info(self, location): |
|
28 |
+ """Returns (url, revision), where both are strings""" |
|
29 |
+ assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location |
|
30 |
+ output = call_subprocess( |
|
31 |
+ [self.cmd, 'info', location], show_stdout=False, extra_environ={'LANG': 'C'}) |
|
32 |
+ match = _svn_url_re.search(output) |
|
33 |
+ if not match: |
|
34 |
+ logger.warn('Cannot determine URL of svn checkout %s' % display_path(location)) |
|
35 |
+ logger.info('Output that cannot be parsed: \n%s' % output) |
|
36 |
+ return None, None |
|
37 |
+ url = match.group(1).strip() |
|
38 |
+ match = _svn_revision_re.search(output) |
|
39 |
+ if not match: |
|
40 |
+ logger.warn('Cannot determine revision of svn checkout %s' % display_path(location)) |
|
41 |
+ logger.info('Output that cannot be parsed: \n%s' % output) |
|
42 |
+ return url, None |
|
43 |
+ return url, match.group(1) |
|
44 |
+ |
|
45 |
+ def parse_vcs_bundle_file(self, content): |
|
46 |
+ for line in content.splitlines(): |
|
47 |
+ if not line.strip() or line.strip().startswith('#'): |
|
48 |
+ continue |
|
49 |
+ match = re.search(r'^-r\s*([^ ])?', line) |
|
50 |
+ if not match: |
|
51 |
+ return None, None |
|
52 |
+ rev = match.group(1) |
|
53 |
+ rest = line[match.end():].strip().split(None, 1)[0] |
|
54 |
+ return rest, rev |
|
55 |
+ return None, None |
|
56 |
+ |
|
57 |
+ def export(self, location): |
|
58 |
+ """Export the svn repository at the url to the destination location""" |
|
59 |
+ url, rev = self.get_url_rev() |
|
60 |
+ rev_options = get_rev_options(url, rev) |
|
61 |
+ logger.notify('Exporting svn repository %s to %s' % (url, location)) |
|
62 |
+ logger.indent += 2 |
|
63 |
+ try: |
|
64 |
+ if os.path.exists(location): |
|
65 |
+ # Subversion doesn't like to check out over an existing directory |
|
66 |
+ # --force fixes this, but was only added in svn 1.5 |
|
67 |
+ rmtree(location) |
|
68 |
+ call_subprocess( |
|
69 |
+ [self.cmd, 'export'] + rev_options + [url, location], |
|
70 |
+ filter_stdout=self._filter, show_stdout=False) |
|
71 |
+ finally: |
|
72 |
+ logger.indent -= 2 |
|
73 |
+ |
|
74 |
+ def switch(self, dest, url, rev_options): |
|
75 |
+ call_subprocess( |
|
76 |
+ [self.cmd, 'switch'] + rev_options + [url, dest]) |
|
77 |
+ |
|
78 |
+ def update(self, dest, rev_options): |
|
79 |
+ call_subprocess( |
|
80 |
+ [self.cmd, 'update'] + rev_options + [dest]) |
|
81 |
+ |
|
82 |
+ def obtain(self, dest): |
|
83 |
+ url, rev = self.get_url_rev() |
|
84 |
+ rev_options = get_rev_options(url, rev) |
|
85 |
+ if rev: |
|
86 |
+ rev_display = ' (to revision %s)' % rev |
|
87 |
+ else: |
|
88 |
+ rev_display = '' |
|
89 |
+ if self.check_destination(dest, url, rev_options, rev_display): |
|
90 |
+ logger.notify('Checking out %s%s to %s' |
|
91 |
+ % (url, rev_display, display_path(dest))) |
|
92 |
+ call_subprocess( |
|
93 |
+ [self.cmd, 'checkout', '-q'] + rev_options + [url, dest]) |
|
94 |
+ |
|
95 |
+ def get_location(self, dist, dependency_links): |
|
96 |
+ for url in dependency_links: |
|
97 |
+ egg_fragment = Link(url).egg_fragment |
|
98 |
+ if not egg_fragment: |
|
99 |
+ continue |
|
100 |
+ if '-' in egg_fragment: |
|
101 |
+ ## FIXME: will this work when a package has - in the name? |
|
102 |
+ key = '-'.join(egg_fragment.split('-')[:-1]).lower() |
|
103 |
+ else: |
|
104 |
+ key = egg_fragment |
|
105 |
+ if key == dist.key: |
|
106 |
+ return url.split('#', 1)[0] |
|
107 |
+ return None |
|
108 |
+ |
|
109 |
+ def get_revision(self, location): |
|
110 |
+ """ |
|
111 |
+ Return the maximum revision for all files under a given location |
|
112 |
+ """ |
|
113 |
+ # Note: taken from setuptools.command.egg_info |
|
114 |
+ revision = 0 |
|
115 |
+ |
|
116 |
+ for base, dirs, files in os.walk(location): |
|
117 |
+ if self.dirname not in dirs: |
|
118 |
+ dirs[:] = [] |
|
119 |
+ continue # no sense walking uncontrolled subdirs |
|
120 |
+ dirs.remove(self.dirname) |
|
121 |
+ entries_fn = os.path.join(base, self.dirname, 'entries') |
|
122 |
+ if not os.path.exists(entries_fn): |
|
123 |
+ ## FIXME: should we warn? |
|
124 |
+ continue |
|
125 |
+ |
|
126 |
+ dirurl, localrev = self._get_svn_url_rev(base) |
|
127 |
+ |
|
128 |
+ if base == location: |
|
129 |
+ base_url = dirurl + '/' # save the root url |
|
130 |
+ elif not dirurl or not dirurl.startswith(base_url): |
|
131 |
+ dirs[:] = [] |
|
132 |
+ continue # not part of the same svn tree, skip it |
|
133 |
+ revision = max(revision, localrev) |
|
134 |
+ return revision |
|
135 |
+ |
|
136 |
+ def get_url_rev(self): |
|
137 |
+ # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it |
|
138 |
+ url, rev = super(Subversion, self).get_url_rev() |
|
139 |
+ if url.startswith('ssh://'): |
|
140 |
+ url = 'svn+' + url |
|
141 |
+ return url, rev |
|
142 |
+ |
|
143 |
+ def get_url(self, location): |
|
144 |
+ # In cases where the source is in a subdirectory, not alongside setup.py |
|
145 |
+ # we have to look up in the location until we find a real setup.py |
|
146 |
+ orig_location = location |
|
147 |
+ while not os.path.exists(os.path.join(location, 'setup.py')): |
|
148 |
+ last_location = location |
|
149 |
+ location = os.path.dirname(location) |
|
150 |
+ if location == last_location: |
|
151 |
+ # We've traversed up to the root of the filesystem without finding setup.py |
|
152 |
+ logger.warn("Could not find setup.py for directory %s (tried all parent directories)" |
|
153 |
+ % orig_location) |
|
154 |
+ return None |
|
155 |
+ |
|
156 |
+ return self._get_svn_url_rev(location)[0] |
|
157 |
+ |
|
158 |
+ def _get_svn_url_rev(self, location): |
|
159 |
+ f = open(os.path.join(location, self.dirname, 'entries')) |
|
160 |
+ data = f.read() |
|
161 |
+ f.close() |
|
162 |
+ if data.startswith('8') or data.startswith('9') or data.startswith('10'): |
|
163 |
+ data = list(map(str.splitlines, data.split('\n\x0c\n'))) |
|
164 |
+ del data[0][0] # get rid of the '8' |
|
165 |
+ url = data[0][3] |
|
166 |
+ revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] |
|
167 |
+ elif data.startswith('<?xml'): |
|
168 |
+ match = _svn_xml_url_re.search(data) |
|
169 |
+ if not match: |
|
170 |
+ raise ValueError('Badly formatted data: %r' % data) |
|
171 |
+ url = match.group(1) # get repository URL |
|
172 |
+ revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] |
|
173 |
+ else: |
|
174 |
+ try: |
|
175 |
+ # subversion >= 1.7 |
|
176 |
+ xml = call_subprocess([self.cmd, 'info', '--xml', location], show_stdout=False) |
|
177 |
+ url = _svn_info_xml_url_re.search(xml).group(1) |
|
178 |
+ revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] |
|
179 |
+ except InstallationError: |
|
180 |
+ url, revs = None, [] |
|
181 |
+ |
|
182 |
+ if revs: |
|
183 |
+ rev = max(revs) |
|
184 |
+ else: |
|
185 |
+ rev = 0 |
|
186 |
+ |
|
187 |
+ return url, rev |
|
188 |
+ |
|
189 |
+ def get_tag_revs(self, svn_tag_url): |
|
190 |
+ stdout = call_subprocess( |
|
191 |
+ [self.cmd, 'ls', '-v', svn_tag_url], show_stdout=False) |
|
192 |
+ results = [] |
|
193 |
+ for line in stdout.splitlines(): |
|
194 |
+ parts = line.split() |
|
195 |
+ rev = int(parts[0]) |
|
196 |
+ tag = parts[-1].strip('/') |
|
197 |
+ results.append((tag, rev)) |
|
198 |
+ return results |
|
199 |
+ |
|
200 |
+ def find_tag_match(self, rev, tag_revs): |
|
201 |
+ best_match_rev = None |
|
202 |
+ best_tag = None |
|
203 |
+ for tag, tag_rev in tag_revs: |
|
204 |
+ if (tag_rev > rev and |
|
205 |
+ (best_match_rev is None or best_match_rev > tag_rev)): |
|
206 |
+ # FIXME: Is best_match > tag_rev really possible? |
|
207 |
+ # or is it a sign something is wacky? |
|
208 |
+ best_match_rev = tag_rev |
|
209 |
+ best_tag = tag |
|
210 |
+ return best_tag |
|
211 |
+ |
|
212 |
+ def get_src_requirement(self, dist, location, find_tags=False): |
|
213 |
+ repo = self.get_url(location) |
|
214 |
+ if repo is None: |
|
215 |
+ return None |
|
216 |
+ parts = repo.split('/') |
|
217 |
+ ## FIXME: why not project name? |
|
218 |
+ egg_project_name = dist.egg_name().split('-', 1)[0] |
|
219 |
+ rev = self.get_revision(location) |
|
220 |
+ if parts[-2] in ('tags', 'tag'): |
|
221 |
+ # It's a tag, perfect! |
|
222 |
+ full_egg_name = '%s-%s' % (egg_project_name, parts[-1]) |
|
223 |
+ elif parts[-2] in ('branches', 'branch'): |
|
224 |
+ # It's a branch :( |
|
225 |
+ full_egg_name = '%s-%s-r%s' % (dist.egg_name(), parts[-1], rev) |
|
226 |
+ elif parts[-1] == 'trunk': |
|
227 |
+ # Trunk :-/ |
|
228 |
+ full_egg_name = '%s-dev_r%s' % (dist.egg_name(), rev) |
|
229 |
+ if find_tags: |
|
230 |
+ tag_url = '/'.join(parts[:-1]) + '/tags' |
|
231 |
+ tag_revs = self.get_tag_revs(tag_url) |
|
232 |
+ match = self.find_tag_match(rev, tag_revs) |
|
233 |
+ if match: |
|
234 |
+ logger.notify('trunk checkout %s seems to be equivalent to tag %s' % match) |
|
235 |
+ repo = '%s/%s' % (tag_url, match) |
|
236 |
+ full_egg_name = '%s-%s' % (egg_project_name, match) |
|
237 |
+ else: |
|
238 |
+ # Don't know what it is |
|
239 |
+ logger.warn('svn URL does not fit normal structure (tags/branches/trunk): %s' % repo) |
|
240 |
+ full_egg_name = '%s-dev_r%s' % (egg_project_name, rev) |
|
241 |
+ return 'svn+%s@%s#egg=%s' % (repo, rev, full_egg_name) |
|
242 |
+ |
|
243 |
+ |
|
244 |
+def get_rev_options(url, rev): |
|
245 |
+ if rev: |
|
246 |
+ rev_options = ['-r', rev] |
|
247 |
+ else: |
|
248 |
+ rev_options = [] |
|
249 |
+ |
|
250 |
+ r = urlparse.urlsplit(url) |
|
251 |
+ if hasattr(r, 'username'): |
|
252 |
+ # >= Python-2.5 |
|
253 |
+ username, password = r.username, r.password |
|
254 |
+ else: |
|
255 |
+ netloc = r[1] |
|
256 |
+ if '@' in netloc: |
|
257 |
+ auth = netloc.split('@')[0] |
|
258 |
+ if ':' in auth: |
|
259 |
+ username, password = auth.split(':', 1) |
|
260 |
+ else: |
|
261 |
+ username, password = auth, None |
|
262 |
+ else: |
|
263 |
+ username, password = None, None |
|
264 |
+ |
|
265 |
+ if username: |
|
266 |
+ rev_options += ['--username', username] |
|
267 |
+ if password: |
|
268 |
+ rev_options += ['--password', password] |
|
269 |
+ return rev_options |
|
270 |
+ |
|
271 |
+ |
|
272 |
+vcs.register(Subversion) |
0 | 2 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,754 @@ |
1 |
+"""Append module search paths for third-party packages to sys.path. |
|
2 |
+ |
|
3 |
+**************************************************************** |
|
4 |
+* This module is automatically imported during initialization. * |
|
5 |
+**************************************************************** |
|
6 |
+ |
|
7 |
+In earlier versions of Python (up to 1.5a3), scripts or modules that |
|
8 |
+needed to use site-specific modules would place ``import site'' |
|
9 |
+somewhere near the top of their code. Because of the automatic |
|
10 |
+import, this is no longer necessary (but code that does it still |
|
11 |
+works). |
|
12 |
+ |
|
13 |
+This will append site-specific paths to the module search path. On |
|
14 |
+Unix, it starts with sys.prefix and sys.exec_prefix (if different) and |
|
15 |
+appends lib/python<version>/site-packages as well as lib/site-python. |
|
16 |
+It also supports the Debian convention of |
|
17 |
+lib/python<version>/dist-packages. On other platforms (mainly Mac and |
|
18 |
+Windows), it uses just sys.prefix (and sys.exec_prefix, if different, |
|
19 |
+but this is unlikely). The resulting directories, if they exist, are |
|
20 |
+appended to sys.path, and also inspected for path configuration files. |
|
21 |
+ |
|
22 |
+FOR DEBIAN, this sys.path is augmented with directories in /usr/local. |
|
23 |
+Local addons go into /usr/local/lib/python<version>/site-packages |
|
24 |
+(resp. /usr/local/lib/site-python), Debian addons install into |
|
25 |
+/usr/{lib,share}/python<version>/dist-packages. |
|
26 |
+ |
|
27 |
+A path configuration file is a file whose name has the form |
|
28 |
+<package>.pth; its contents are additional directories (one per line) |
|
29 |
+to be added to sys.path. Non-existing directories (or |
|
30 |
+non-directories) are never added to sys.path; no directory is added to |
|
31 |
+sys.path more than once. Blank lines and lines beginning with |
|
32 |
+'#' are skipped. Lines starting with 'import' are executed. |
|
33 |
+ |
|
34 |
+For example, suppose sys.prefix and sys.exec_prefix are set to |
|
35 |
+/usr/local and there is a directory /usr/local/lib/python2.X/site-packages |
|
36 |
+with three subdirectories, foo, bar and spam, and two path |
|
37 |
+configuration files, foo.pth and bar.pth. Assume foo.pth contains the |
|
38 |
+following: |
|
39 |
+ |
|
40 |
+ # foo package configuration |
|
41 |
+ foo |
|
42 |
+ bar |
|
43 |
+ bletch |
|
44 |
+ |
|
45 |
+and bar.pth contains: |
|
46 |
+ |
|
47 |
+ # bar package configuration |
|
48 |
+ bar |
|
49 |
+ |
|
50 |
+Then the following directories are added to sys.path, in this order: |
|
51 |
+ |
|
52 |
+ /usr/local/lib/python2.X/site-packages/bar |
|
53 |
+ /usr/local/lib/python2.X/site-packages/foo |
|
54 |
+ |
|
55 |
+Note that bletch is omitted because it doesn't exist; bar precedes foo |
|
56 |
+because bar.pth comes alphabetically before foo.pth; and spam is |
|
57 |
+omitted because it is not mentioned in either path configuration file. |
|
58 |
+ |
|
59 |
+After these path manipulations, an attempt is made to import a module |
|
60 |
+named sitecustomize, which can perform arbitrary additional |
|
61 |
+site-specific customizations. If this import fails with an |
|
62 |
+ImportError exception, it is silently ignored. |
|
63 |
+ |
|
64 |
+""" |
|
65 |
+ |
|
66 |
+import sys |
|
67 |
+import os |
|
68 |
+try: |
|
69 |
+ import __builtin__ as builtins |
|
70 |
+except ImportError: |
|
71 |
+ import builtins |
|
72 |
+try: |
|
73 |
+ set |
|
74 |
+except NameError: |
|
75 |
+ from sets import Set as set |
|
76 |
+ |
|
77 |
+# Prefixes for site-packages; add additional prefixes like /usr/local here |
|
78 |
+PREFIXES = [sys.prefix, sys.exec_prefix] |
|
79 |
+# Enable per user site-packages directory |
|
80 |
+# set it to False to disable the feature or True to force the feature |
|
81 |
+ENABLE_USER_SITE = None |
|
82 |
+# for distutils.commands.install |
|
83 |
+USER_SITE = None |
|
84 |
+USER_BASE = None |
|
85 |
+ |
|
86 |
+_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32 |
|
87 |
+_is_pypy = hasattr(sys, 'pypy_version_info') |
|
88 |
+_is_jython = sys.platform[:4] == 'java' |
|
89 |
+if _is_jython: |
|
90 |
+ ModuleType = type(os) |
|
91 |
+ |
|
92 |
+def makepath(*paths): |
|
93 |
+ dir = os.path.join(*paths) |
|
94 |
+ if _is_jython and (dir == '__classpath__' or |
|
95 |
+ dir.startswith('__pyclasspath__')): |
|
96 |
+ return dir, dir |
|
97 |
+ dir = os.path.abspath(dir) |
|
98 |
+ return dir, os.path.normcase(dir) |
|
99 |
+ |
|
100 |
+def abs__file__(): |
|
101 |
+ """Set all module' __file__ attribute to an absolute path""" |
|
102 |
+ for m in sys.modules.values(): |
|
103 |
+ if ((_is_jython and not isinstance(m, ModuleType)) or |
|
104 |
+ hasattr(m, '__loader__')): |
|
105 |
+ # only modules need the abspath in Jython. and don't mess |
|
106 |
+ # with a PEP 302-supplied __file__ |
|
107 |
+ continue |
|
108 |
+ f = getattr(m, '__file__', None) |
|
109 |
+ if f is None: |
|
110 |
+ continue |
|
111 |
+ m.__file__ = os.path.abspath(f) |
|
112 |
+ |
|
113 |
+def removeduppaths(): |
|
114 |
+ """ Remove duplicate entries from sys.path along with making them |
|
115 |
+ absolute""" |
|
116 |
+ # This ensures that the initial path provided by the interpreter contains |
|
117 |
+ # only absolute pathnames, even if we're running from the build directory. |
|
118 |
+ L = [] |
|
119 |
+ known_paths = set() |
|
120 |
+ for dir in sys.path: |
|
121 |
+ # Filter out duplicate paths (on case-insensitive file systems also |
|
122 |
+ # if they only differ in case); turn relative paths into absolute |
|
123 |
+ # paths. |
|
124 |
+ dir, dircase = makepath(dir) |
|
125 |
+ if not dircase in known_paths: |
|
126 |
+ L.append(dir) |
|
127 |
+ known_paths.add(dircase) |
|
128 |
+ sys.path[:] = L |
|
129 |
+ return known_paths |
|
130 |
+ |
|
131 |
+# XXX This should not be part of site.py, since it is needed even when |
|
132 |
+# using the -S option for Python. See http://www.python.org/sf/586680 |
|
133 |
+def addbuilddir(): |
|
134 |
+ """Append ./build/lib.<platform> in case we're running in the build dir |
|
135 |
+ (especially for Guido :-)""" |
|
136 |
+ from distutils.util import get_platform |
|
137 |
+ s = "build/lib.%s-%.3s" % (get_platform(), sys.version) |
|
138 |
+ if hasattr(sys, 'gettotalrefcount'): |
|
139 |
+ s += '-pydebug' |
|
140 |
+ s = os.path.join(os.path.dirname(sys.path[-1]), s) |
|
141 |
+ sys.path.append(s) |
|
142 |
+ |
|
143 |
+def _init_pathinfo(): |
|
144 |
+ """Return a set containing all existing directory entries from sys.path""" |
|
145 |
+ d = set() |
|
146 |
+ for dir in sys.path: |
|
147 |
+ try: |
|
148 |
+ if os.path.isdir(dir): |
|
149 |
+ dir, dircase = makepath(dir) |
|
150 |
+ d.add(dircase) |
|
151 |
+ except TypeError: |
|
152 |
+ continue |
|
153 |
+ return d |
|
154 |
+ |
|
155 |
+def addpackage(sitedir, name, known_paths): |
|
156 |
+ """Add a new path to known_paths by combining sitedir and 'name' or execute |
|
157 |
+ sitedir if it starts with 'import'""" |
|
158 |
+ if known_paths is None: |
|
159 |
+ _init_pathinfo() |
|
160 |
+ reset = 1 |
|
161 |
+ else: |
|
162 |
+ reset = 0 |
|
163 |
+ fullname = os.path.join(sitedir, name) |
|
164 |
+ try: |
|
165 |
+ f = open(fullname, "rU") |
|
166 |
+ except IOError: |
|
167 |
+ return |
|
168 |
+ try: |
|
169 |
+ for line in f: |
|
170 |
+ if line.startswith("#"): |
|
171 |
+ continue |
|
172 |
+ if line.startswith("import"): |
|
173 |
+ exec(line) |
|
174 |
+ continue |
|
175 |
+ line = line.rstrip() |
|
176 |
+ dir, dircase = makepath(sitedir, line) |
|
177 |
+ if not dircase in known_paths and os.path.exists(dir): |
|
178 |
+ sys.path.append(dir) |
|
179 |
+ known_paths.add(dircase) |
|
180 |
+ finally: |
|
181 |
+ f.close() |
|
182 |
+ if reset: |
|
183 |
+ known_paths = None |
|
184 |
+ return known_paths |
|
185 |
+ |
|
186 |
+def addsitedir(sitedir, known_paths=None): |
|
187 |
+ """Add 'sitedir' argument to sys.path if missing and handle .pth files in |
|
188 |
+ 'sitedir'""" |
|
189 |
+ if known_paths is None: |
|
190 |
+ known_paths = _init_pathinfo() |
|
191 |
+ reset = 1 |
|
192 |
+ else: |
|
193 |
+ reset = 0 |
|
194 |
+ sitedir, sitedircase = makepath(sitedir) |
|
195 |
+ if not sitedircase in known_paths: |
|
196 |
+ sys.path.append(sitedir) # Add path component |
|
197 |
+ try: |
|
198 |
+ names = os.listdir(sitedir) |
|
199 |
+ except os.error: |
|
200 |
+ return |
|
201 |
+ names.sort() |
|
202 |
+ for name in names: |
|
203 |
+ if name.endswith(os.extsep + "pth"): |
|
204 |
+ addpackage(sitedir, name, known_paths) |
|
205 |
+ if reset: |
|
206 |
+ known_paths = None |
|
207 |
+ return known_paths |
|
208 |
+ |
|
209 |
+def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): |
|
210 |
+ """Add site-packages (and possibly site-python) to sys.path""" |
|
211 |
+ prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] |
|
212 |
+ if exec_prefix != sys_prefix: |
|
213 |
+ prefixes.append(os.path.join(exec_prefix, "local")) |
|
214 |
+ |
|
215 |
+ for prefix in prefixes: |
|
216 |
+ if prefix: |
|
217 |
+ if sys.platform in ('os2emx', 'riscos') or _is_jython: |
|
218 |
+ sitedirs = [os.path.join(prefix, "Lib", "site-packages")] |
|
219 |
+ elif _is_pypy: |
|
220 |
+ sitedirs = [os.path.join(prefix, 'site-packages')] |
|
221 |
+ elif sys.platform == 'darwin' and prefix == sys_prefix: |
|
222 |
+ |
|
223 |
+ if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python |
|
224 |
+ |
|
225 |
+ sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"), |
|
226 |
+ os.path.join(prefix, "Extras", "lib", "python")] |
|
227 |
+ |
|
228 |
+ else: # any other Python distros on OSX work this way |
|
229 |
+ sitedirs = [os.path.join(prefix, "lib", |
|
230 |
+ "python" + sys.version[:3], "site-packages")] |
|
231 |
+ |
|
232 |
+ elif os.sep == '/': |
|
233 |
+ sitedirs = [os.path.join(prefix, |
|
234 |
+ "lib", |
|
235 |
+ "python" + sys.version[:3], |
|
236 |
+ "site-packages"), |
|
237 |
+ os.path.join(prefix, "lib", "site-python"), |
|
238 |
+ os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")] |
|
239 |
+ lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") |
|
240 |
+ if (os.path.exists(lib64_dir) and |
|
241 |
+ os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]): |
|
242 |
+ if _is_64bit: |
|
243 |
+ sitedirs.insert(0, lib64_dir) |
|
244 |
+ else: |
|
245 |
+ sitedirs.append(lib64_dir) |
|
246 |
+ try: |
|
247 |
+ # sys.getobjects only available in --with-pydebug build |
|
248 |
+ sys.getobjects |
|
249 |
+ sitedirs.insert(0, os.path.join(sitedirs[0], 'debug')) |
|
250 |
+ except AttributeError: |
|
251 |
+ pass |
|
252 |
+ # Debian-specific dist-packages directories: |
|
253 |
+ if sys.version[0] == '2': |
|
254 |
+ sitedirs.append(os.path.join(prefix, "lib", |
|
255 |
+ "python" + sys.version[:3], |
|
256 |
+ "dist-packages")) |
|
257 |
+ else: |
|
258 |
+ sitedirs.append(os.path.join(prefix, "lib", |
|
259 |
+ "python" + sys.version[0], |
|
260 |
+ "dist-packages")) |
|
261 |
+ sitedirs.append(os.path.join(prefix, "local/lib", |
|
262 |
+ "python" + sys.version[:3], |
|
263 |
+ "dist-packages")) |
|
264 |
+ sitedirs.append(os.path.join(prefix, "lib", "dist-python")) |
|
265 |
+ else: |
|
266 |
+ sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] |
|
267 |
+ if sys.platform == 'darwin': |
|
268 |
+ # for framework builds *only* we add the standard Apple |
|
269 |
+ # locations. Currently only per-user, but /Library and |
|
270 |
+ # /Network/Library could be added too |
|
271 |
+ if 'Python.framework' in prefix: |
|
272 |
+ home = os.environ.get('HOME') |
|
273 |
+ if home: |
|
274 |
+ sitedirs.append( |
|
275 |
+ os.path.join(home, |
|
276 |
+ 'Library', |
|
277 |
+ 'Python', |
|
278 |
+ sys.version[:3], |
|
279 |
+ 'site-packages')) |
|
280 |
+ for sitedir in sitedirs: |
|
281 |
+ if os.path.isdir(sitedir): |
|
282 |
+ addsitedir(sitedir, known_paths) |
|
283 |
+ return None |
|
284 |
+ |
|
285 |
+def check_enableusersite(): |
|
286 |
+ """Check if user site directory is safe for inclusion |
|
287 |
+ |
|
288 |
+ The function tests for the command line flag (including environment var), |
|
289 |
+ process uid/gid equal to effective uid/gid. |
|
290 |
+ |
|
291 |
+ None: Disabled for security reasons |
|
292 |
+ False: Disabled by user (command line option) |
|
293 |
+ True: Safe and enabled |
|
294 |
+ """ |
|
295 |
+ if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False): |
|
296 |
+ return False |
|
297 |
+ |
|
298 |
+ if hasattr(os, "getuid") and hasattr(os, "geteuid"): |
|
299 |
+ # check process uid == effective uid |
|
300 |
+ if os.geteuid() != os.getuid(): |
|
301 |
+ return None |
|
302 |
+ if hasattr(os, "getgid") and hasattr(os, "getegid"): |
|
303 |
+ # check process gid == effective gid |
|
304 |
+ if os.getegid() != os.getgid(): |
|
305 |
+ return None |
|
306 |
+ |
|
307 |
+ return True |
|
308 |
+ |
|
309 |
+def addusersitepackages(known_paths): |
|
310 |
+ """Add a per user site-package to sys.path |
|
311 |
+ |
|
312 |
+ Each user has its own python directory with site-packages in the |
|
313 |
+ home directory. |
|
314 |
+ |
|
315 |
+ USER_BASE is the root directory for all Python versions |
|
316 |
+ |
|
317 |
+ USER_SITE is the user specific site-packages directory |
|
318 |
+ |
|
319 |
+ USER_SITE/.. can be used for data. |
|
320 |
+ """ |
|
321 |
+ global USER_BASE, USER_SITE, ENABLE_USER_SITE |
|
322 |
+ env_base = os.environ.get("PYTHONUSERBASE", None) |
|
323 |
+ |
|
324 |
+ def joinuser(*args): |
|
325 |
+ return os.path.expanduser(os.path.join(*args)) |
|
326 |
+ |
|
327 |
+ #if sys.platform in ('os2emx', 'riscos'): |
|
328 |
+ # # Don't know what to put here |
|
329 |
+ # USER_BASE = '' |
|
330 |
+ # USER_SITE = '' |
|
331 |
+ if os.name == "nt": |
|
332 |
+ base = os.environ.get("APPDATA") or "~" |
|
333 |
+ if env_base: |
|
334 |
+ USER_BASE = env_base |
|
335 |
+ else: |
|
336 |
+ USER_BASE = joinuser(base, "Python") |
|
337 |
+ USER_SITE = os.path.join(USER_BASE, |
|
338 |
+ "Python" + sys.version[0] + sys.version[2], |
|
339 |
+ "site-packages") |
|
340 |
+ else: |
|
341 |
+ if env_base: |
|
342 |
+ USER_BASE = env_base |
|
343 |
+ else: |
|
344 |
+ USER_BASE = joinuser("~", ".local") |
|
345 |
+ USER_SITE = os.path.join(USER_BASE, "lib", |
|
346 |
+ "python" + sys.version[:3], |
|
347 |
+ "site-packages") |
|
348 |
+ |
|
349 |
+ if ENABLE_USER_SITE and os.path.isdir(USER_SITE): |
|
350 |
+ addsitedir(USER_SITE, known_paths) |
|
351 |
+ if ENABLE_USER_SITE: |
|
352 |
+ for dist_libdir in ("lib", "local/lib"): |
|
353 |
+ user_site = os.path.join(USER_BASE, dist_libdir, |
|
354 |
+ "python" + sys.version[:3], |
|
355 |
+ "dist-packages") |
|
356 |
+ if os.path.isdir(user_site): |
|
357 |
+ addsitedir(user_site, known_paths) |
|
358 |
+ return known_paths |
|
359 |
+ |
|
360 |
+ |
|
361 |
+ |
|
362 |
+def setBEGINLIBPATH(): |
|
363 |
+ """The OS/2 EMX port has optional extension modules that do double duty |
|
364 |
+ as DLLs (and must use the .DLL file extension) for other extensions. |
|
365 |
+ The library search path needs to be amended so these will be found |
|
366 |
+ during module import. Use BEGINLIBPATH so that these are at the start |
|
367 |
+ of the library search path. |
|
368 |
+ |
|
369 |
+ """ |
|
370 |
+ dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") |
|
371 |
+ libpath = os.environ['BEGINLIBPATH'].split(';') |
|
372 |
+ if libpath[-1]: |
|
373 |
+ libpath.append(dllpath) |
|
374 |
+ else: |
|
375 |
+ libpath[-1] = dllpath |
|
376 |
+ os.environ['BEGINLIBPATH'] = ';'.join(libpath) |
|
377 |
+ |
|
378 |
+ |
|
379 |
+def setquit(): |
|
380 |
+ """Define new built-ins 'quit' and 'exit'. |
|
381 |
+ These are simply strings that display a hint on how to exit. |
|
382 |
+ |
|
383 |
+ """ |
|
384 |
+ if os.sep == ':': |
|
385 |
+ eof = 'Cmd-Q' |
|
386 |
+ elif os.sep == '\\': |
|
387 |
+ eof = 'Ctrl-Z plus Return' |
|
388 |
+ else: |
|
389 |
+ eof = 'Ctrl-D (i.e. EOF)' |
|
390 |
+ |
|
391 |
+ class Quitter(object): |
|
392 |
+ def __init__(self, name): |
|
393 |
+ self.name = name |
|
394 |
+ def __repr__(self): |
|
395 |
+ return 'Use %s() or %s to exit' % (self.name, eof) |
|
396 |
+ def __call__(self, code=None): |
|
397 |
+ # Shells like IDLE catch the SystemExit, but listen when their |
|
398 |
+ # stdin wrapper is closed. |
|
399 |
+ try: |
|
400 |
+ sys.stdin.close() |
|
401 |
+ except: |
|
402 |
+ pass |
|
403 |
+ raise SystemExit(code) |
|
404 |
+ builtins.quit = Quitter('quit') |
|
405 |
+ builtins.exit = Quitter('exit') |
|
406 |
+ |
|
407 |
+ |
|
408 |
+class _Printer(object): |
|
409 |
+ """interactive prompt objects for printing the license text, a list of |
|
410 |
+ contributors and the copyright notice.""" |
|
411 |
+ |
|
412 |
+ MAXLINES = 23 |
|
413 |
+ |
|
414 |
+ def __init__(self, name, data, files=(), dirs=()): |
|
415 |
+ self.__name = name |
|
416 |
+ self.__data = data |
|
417 |
+ self.__files = files |
|
418 |
+ self.__dirs = dirs |
|
419 |
+ self.__lines = None |
|
420 |
+ |
|
421 |
+ def __setup(self): |
|
422 |
+ if self.__lines: |
|
423 |
+ return |
|
424 |
+ data = None |
|
425 |
+ for dir in self.__dirs: |
|
426 |
+ for filename in self.__files: |
|
427 |
+ filename = os.path.join(dir, filename) |
|
428 |
+ try: |
|
429 |
+ fp = open(filename, "rU") |
|
430 |
+ data = fp.read() |
|
431 |
+ fp.close() |
|
432 |
+ break |
|
433 |
+ except IOError: |
|
434 |
+ pass |
|
435 |
+ if data: |
|
436 |
+ break |
|
437 |
+ if not data: |
|
438 |
+ data = self.__data |
|
439 |
+ self.__lines = data.split('\n') |
|
440 |
+ self.__linecnt = len(self.__lines) |
|
441 |
+ |
|
442 |
+ def __repr__(self): |
|
443 |
+ self.__setup() |
|
444 |
+ if len(self.__lines) <= self.MAXLINES: |
|
445 |
+ return "\n".join(self.__lines) |
|
446 |
+ else: |
|
447 |
+ return "Type %s() to see the full %s text" % ((self.__name,)*2) |
|
448 |
+ |
|
449 |
+ def __call__(self): |
|
450 |
+ self.__setup() |
|
451 |
+ prompt = 'Hit Return for more, or q (and Return) to quit: ' |
|
452 |
+ lineno = 0 |
|
453 |
+ while 1: |
|
454 |
+ try: |
|
455 |
+ for i in range(lineno, lineno + self.MAXLINES): |
|
456 |
+ print(self.__lines[i]) |
|
457 |
+ except IndexError: |
|
458 |
+ break |
|
459 |
+ else: |
|
460 |
+ lineno += self.MAXLINES |
|
461 |
+ key = None |
|
462 |
+ while key is None: |
|
463 |
+ try: |
|
464 |
+ key = raw_input(prompt) |
|
465 |
+ except NameError: |
|
466 |
+ key = input(prompt) |
|
467 |
+ if key not in ('', 'q'): |
|
468 |
+ key = None |
|
469 |
+ if key == 'q': |
|
470 |
+ break |
|
471 |
+ |
|
472 |
+def setcopyright(): |
|
473 |
+ """Set 'copyright' and 'credits' in __builtin__""" |
|
474 |
+ builtins.copyright = _Printer("copyright", sys.copyright) |
|
475 |
+ if _is_jython: |
|
476 |
+ builtins.credits = _Printer( |
|
477 |
+ "credits", |
|
478 |
+ "Jython is maintained by the Jython developers (www.jython.org).") |
|
479 |
+ elif _is_pypy: |
|
480 |
+ builtins.credits = _Printer( |
|
481 |
+ "credits", |
|
482 |
+ "PyPy is maintained by the PyPy developers: http://codespeak.net/pypy") |
|
483 |
+ else: |
|
484 |
+ builtins.credits = _Printer("credits", """\ |
|
485 |
+ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands |
|
486 |
+ for supporting Python development. See www.python.org for more information.""") |
|
487 |
+ here = os.path.dirname(os.__file__) |
|
488 |
+ builtins.license = _Printer( |
|
489 |
+ "license", "See http://www.python.org/%.3s/license.html" % sys.version, |
|
490 |
+ ["LICENSE.txt", "LICENSE"], |
|
491 |
+ [os.path.join(here, os.pardir), here, os.curdir]) |
|
492 |
+ |
|
493 |
+ |
|
494 |
+class _Helper(object): |
|
495 |
+ """Define the built-in 'help'. |
|
496 |
+ This is a wrapper around pydoc.help (with a twist). |
|
497 |
+ |
|
498 |
+ """ |
|
499 |
+ |
|
500 |
+ def __repr__(self): |
|
501 |
+ return "Type help() for interactive help, " \ |
|
502 |
+ "or help(object) for help about object." |
|
503 |
+ def __call__(self, *args, **kwds): |
|
504 |
+ import pydoc |
|
505 |
+ return pydoc.help(*args, **kwds) |
|
506 |
+ |
|
507 |
+def sethelper(): |
|
508 |
+ builtins.help = _Helper() |
|
509 |
+ |
|
510 |
+def aliasmbcs(): |
|
511 |
+ """On Windows, some default encodings are not provided by Python, |
|
512 |
+ while they are always available as "mbcs" in each locale. Make |
|
513 |
+ them usable by aliasing to "mbcs" in such a case.""" |
|
514 |
+ if sys.platform == 'win32': |
|
515 |
+ import locale, codecs |
|
516 |
+ enc = locale.getdefaultlocale()[1] |
|
517 |
+ if enc.startswith('cp'): # "cp***" ? |
|
518 |
+ try: |
|
519 |
+ codecs.lookup(enc) |
|
520 |
+ except LookupError: |
|
521 |
+ import encodings |
|
522 |
+ encodings._cache[enc] = encodings._unknown |
|
523 |
+ encodings.aliases.aliases[enc] = 'mbcs' |
|
524 |
+ |
|
525 |
+def setencoding(): |
|
526 |
+ """Set the string encoding used by the Unicode implementation. The |
|
527 |
+ default is 'ascii', but if you're willing to experiment, you can |
|
528 |
+ change this.""" |
|
529 |
+ encoding = "ascii" # Default value set by _PyUnicode_Init() |
|
530 |
+ if 0: |
|
531 |
+ # Enable to support locale aware default string encodings. |
|
532 |
+ import locale |
|
533 |
+ loc = locale.getdefaultlocale() |
|
534 |
+ if loc[1]: |
|
535 |
+ encoding = loc[1] |
|
536 |
+ if 0: |
|
537 |
+ # Enable to switch off string to Unicode coercion and implicit |
|
538 |
+ # Unicode to string conversion. |
|
539 |
+ encoding = "undefined" |
|
540 |
+ if encoding != "ascii": |
|
541 |
+ # On Non-Unicode builds this will raise an AttributeError... |
|
542 |
+ sys.setdefaultencoding(encoding) # Needs Python Unicode build ! |
|
543 |
+ |
|
544 |
+ |
|
545 |
+def execsitecustomize(): |
|
546 |
+ """Run custom site specific code, if available.""" |
|
547 |
+ try: |
|
548 |
+ import sitecustomize |
|
549 |
+ except ImportError: |
|
550 |
+ pass |
|
551 |
+ |
|
552 |
+def virtual_install_main_packages(): |
|
553 |
+ f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt')) |
|
554 |
+ sys.real_prefix = f.read().strip() |
|
555 |
+ f.close() |
|
556 |
+ pos = 2 |
|
557 |
+ hardcoded_relative_dirs = [] |
|
558 |
+ if sys.path[0] == '': |
|
559 |
+ pos += 1 |
|
560 |
+ if _is_jython: |
|
561 |
+ paths = [os.path.join(sys.real_prefix, 'Lib')] |
|
562 |
+ elif _is_pypy: |
|
563 |
+ if sys.pypy_version_info >= (1, 5): |
|
564 |
+ cpyver = '%d.%d' % sys.version_info[:2] |
|
565 |
+ else: |
|
566 |
+ cpyver = '%d.%d.%d' % sys.version_info[:3] |
|
567 |
+ paths = [os.path.join(sys.real_prefix, 'lib_pypy'), |
|
568 |
+ os.path.join(sys.real_prefix, 'lib-python', 'modified-%s' % cpyver), |
|
569 |
+ os.path.join(sys.real_prefix, 'lib-python', cpyver)] |
|
570 |
+ hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below |
|
571 |
+ # |
|
572 |
+ # This is hardcoded in the Python executable, but relative to sys.prefix: |
|
573 |
+ for path in paths[:]: |
|
574 |
+ plat_path = os.path.join(path, 'plat-%s' % sys.platform) |
|
575 |
+ if os.path.exists(plat_path): |
|
576 |
+ paths.append(plat_path) |
|
577 |
+ elif sys.platform == 'win32': |
|
578 |
+ paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')] |
|
579 |
+ else: |
|
580 |
+ paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])] |
|
581 |
+ hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below |
|
582 |
+ lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3]) |
|
583 |
+ if os.path.exists(lib64_path): |
|
584 |
+ if _is_64bit: |
|
585 |
+ paths.insert(0, lib64_path) |
|
586 |
+ else: |
|
587 |
+ paths.append(lib64_path) |
|
588 |
+ # This is hardcoded in the Python executable, but relative to |
|
589 |
+ # sys.prefix. Debian change: we need to add the multiarch triplet |
|
590 |
+ # here, which is where the real stuff lives. As per PEP 421, in |
|
591 |
+ # Python 3.3+, this lives in sys.implementation, while in Python 2.7 |
|
592 |
+ # it lives in sys. |
|
593 |
+ try: |
|
594 |
+ arch = getattr(sys, 'implementation', sys)._multiarch |
|
595 |
+ except AttributeError: |
|
596 |
+ # This is a non-multiarch aware Python. Fallback to the old way. |
|
597 |
+ arch = sys.platform |
|
598 |
+ plat_path = os.path.join(sys.real_prefix, 'lib', |
|
599 |
+ 'python'+sys.version[:3], |
|
600 |
+ 'plat-%s' % arch) |
|
601 |
+ if os.path.exists(plat_path): |
|
602 |
+ paths.append(plat_path) |
|
603 |
+ # This is hardcoded in the Python executable, but |
|
604 |
+ # relative to sys.prefix, so we have to fix up: |
|
605 |
+ for path in list(paths): |
|
606 |
+ tk_dir = os.path.join(path, 'lib-tk') |
|
607 |
+ if os.path.exists(tk_dir): |
|
608 |
+ paths.append(tk_dir) |
|
609 |
+ |
|
610 |
+ # These are hardcoded in the Apple's Python executable, |
|
611 |
+ # but relative to sys.prefix, so we have to fix them up: |
|
612 |
+ if sys.platform == 'darwin': |
|
613 |
+ hardcoded_paths = [os.path.join(relative_dir, module) |
|
614 |
+ for relative_dir in hardcoded_relative_dirs |
|
615 |
+ for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')] |
|
616 |
+ |
|
617 |
+ for path in hardcoded_paths: |
|
618 |
+ if os.path.exists(path): |
|
619 |
+ paths.append(path) |
|
620 |
+ |
|
621 |
+ sys.path.extend(paths) |
|
622 |
+ |
|
623 |
+def force_global_eggs_after_local_site_packages(): |
|
624 |
+ """ |
|
625 |
+ Force easy_installed eggs in the global environment to get placed |
|
626 |
+ in sys.path after all packages inside the virtualenv. This |
|
627 |
+ maintains the "least surprise" result that packages in the |
|
628 |
+ virtualenv always mask global packages, never the other way |
|
629 |
+ around. |
|
630 |
+ |
|
631 |
+ """ |
|
632 |
+ egginsert = getattr(sys, '__egginsert', 0) |
|
633 |
+ for i, path in enumerate(sys.path): |
|
634 |
+ if i > egginsert and path.startswith(sys.prefix): |
|
635 |
+ egginsert = i |
|
636 |
+ sys.__egginsert = egginsert + 1 |
|
637 |
+ |
|
638 |
+def virtual_addsitepackages(known_paths): |
|
639 |
+ force_global_eggs_after_local_site_packages() |
|
640 |
+ return addsitepackages(known_paths, sys_prefix=sys.real_prefix) |
|
641 |
+ |
|
642 |
+def fixclasspath(): |
|
643 |
+ """Adjust the special classpath sys.path entries for Jython. These |
|
644 |
+ entries should follow the base virtualenv lib directories. |
|
645 |
+ """ |
|
646 |
+ paths = [] |
|
647 |
+ classpaths = [] |
|
648 |
+ for path in sys.path: |
|
649 |
+ if path == '__classpath__' or path.startswith('__pyclasspath__'): |
|
650 |
+ classpaths.append(path) |
|
651 |
+ else: |
|
652 |
+ paths.append(path) |
|
653 |
+ sys.path = paths |
|
654 |
+ sys.path.extend(classpaths) |
|
655 |
+ |
|
656 |
+def execusercustomize(): |
|
657 |
+ """Run custom user specific code, if available.""" |
|
658 |
+ try: |
|
659 |
+ import usercustomize |
|
660 |
+ except ImportError: |
|
661 |
+ pass |
|
662 |
+ |
|
663 |
+ |
|
664 |
+def main(): |
|
665 |
+ global ENABLE_USER_SITE |
|
666 |
+ virtual_install_main_packages() |
|
667 |
+ abs__file__() |
|
668 |
+ paths_in_sys = removeduppaths() |
|
669 |
+ if (os.name == "posix" and sys.path and |
|
670 |
+ os.path.basename(sys.path[-1]) == "Modules"): |
|
671 |
+ addbuilddir() |
|
672 |
+ if _is_jython: |
|
673 |
+ fixclasspath() |
|
674 |
+ GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt')) |
|
675 |
+ if not GLOBAL_SITE_PACKAGES: |
|
676 |
+ ENABLE_USER_SITE = False |
|
677 |
+ if ENABLE_USER_SITE is None: |
|
678 |
+ ENABLE_USER_SITE = check_enableusersite() |
|
679 |
+ paths_in_sys = addsitepackages(paths_in_sys) |
|
680 |
+ paths_in_sys = addusersitepackages(paths_in_sys) |
|
681 |
+ if GLOBAL_SITE_PACKAGES: |
|
682 |
+ paths_in_sys = virtual_addsitepackages(paths_in_sys) |
|
683 |
+ if sys.platform == 'os2emx': |
|
684 |
+ setBEGINLIBPATH() |
|
685 |
+ setquit() |
|
686 |
+ setcopyright() |
|
687 |
+ sethelper() |
|
688 |
+ aliasmbcs() |
|
689 |
+ setencoding() |
|
690 |
+ execsitecustomize() |
|
691 |
+ if ENABLE_USER_SITE: |
|
692 |
+ execusercustomize() |
|
693 |
+ # Remove sys.setdefaultencoding() so that users cannot change the |
|
694 |
+ # encoding after initialization. The test for presence is needed when |
|
695 |
+ # this module is run as a script, because this code is executed twice. |
|
696 |
+ if hasattr(sys, "setdefaultencoding"): |
|
697 |
+ del sys.setdefaultencoding |
|
698 |
+ |
|
699 |
+main() |
|
700 |
+ |
|
701 |
+def _script(): |
|
702 |
+ help = """\ |
|
703 |
+ %s [--user-base] [--user-site] |
|
704 |
+ |
|
705 |
+ Without arguments print some useful information |
|
706 |
+ With arguments print the value of USER_BASE and/or USER_SITE separated |
|
707 |
+ by '%s'. |
|
708 |
+ |
|
709 |
+ Exit codes with --user-base or --user-site: |
|
710 |
+ 0 - user site directory is enabled |
|
711 |
+ 1 - user site directory is disabled by user |
|
712 |
+ 2 - uses site directory is disabled by super user |
|
713 |
+ or for security reasons |
|
714 |
+ >2 - unknown error |
|
715 |
+ """ |
|
716 |
+ args = sys.argv[1:] |
|
717 |
+ if not args: |
|
718 |
+ print("sys.path = [") |
|
719 |
+ for dir in sys.path: |
|
720 |
+ print(" %r," % (dir,)) |
|
721 |
+ print("]") |
|
722 |
+ def exists(path): |
|
723 |
+ if os.path.isdir(path): |
|
724 |
+ return "exists" |
|
725 |
+ else: |
|
726 |
+ return "doesn't exist" |
|
727 |
+ print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE))) |
|
728 |
+ print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE))) |
|
729 |
+ print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) |
|
730 |
+ sys.exit(0) |
|
731 |
+ |
|
732 |
+ buffer = [] |
|
733 |
+ if '--user-base' in args: |
|
734 |
+ buffer.append(USER_BASE) |
|
735 |
+ if '--user-site' in args: |
|
736 |
+ buffer.append(USER_SITE) |
|
737 |
+ |
|
738 |
+ if buffer: |
|
739 |
+ print(os.pathsep.join(buffer)) |
|
740 |
+ if ENABLE_USER_SITE: |
|
741 |
+ sys.exit(0) |
|
742 |
+ elif ENABLE_USER_SITE is False: |
|
743 |
+ sys.exit(1) |
|
744 |
+ elif ENABLE_USER_SITE is None: |
|
745 |
+ sys.exit(2) |
|
746 |
+ else: |
|
747 |
+ sys.exit(3) |
|
748 |
+ else: |
|
749 |
+ import textwrap |
|
750 |
+ print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) |
|
751 |
+ sys.exit(10) |
|
752 |
+ |
|
753 |
+if __name__ == '__main__': |
|
754 |
+ _script() |