##// END OF EJS Templates
release: Merge default into stable for release preparation
marcink -
r3192:689a0c93 merge stable
parent child Browse files
Show More
@@ -0,0 +1,10 b''
1 {
2 "presets": [
3 ["env", {
4 "targets": {
5 "browsers": ["last 2 versions"]
6 }
7 }]
8 ],
9 "plugins": ["transform-object-rest-spread"]
10 }
@@ -0,0 +1,44 b''
1 .. _integrations-rcextensions:
2
3
4 rcextensions integrations
5 =========================
6
7
8 Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead
9 they are shipped with the new or upgraded installations.
10
11 The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory
12 of enterprise or community installation. It's always re-created and updated on upgrades.
13
14
15 Activating rcextensions
16 +++++++++++++++++++++++
17
18 To activate rcextensions simply copy or rename the created template rcextensions
19 into the path where the rhodecode.ini file is located::
20
21 pushd ~/rccontrol/enterprise-1/
22 or
23 pushd ~/rccontrol/community-1/
24
25 mv etc/rcextensions.tmpl rcextensions
26
27
28 rcextensions are loaded when |RCE| starts. So a restart is required after activation or
29 change of code in rcextensions.
30
31 Simply restart only the enterprise/community instance::
32
33 rccontrol restart enterprise-1
34 or
35 rccontrol restart community-1
36
37
38 Example usage
39 +++++++++++++
40
41
42 To see examples of usage please check the examples directory under:
43
44 https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples
@@ -0,0 +1,114 b''
1 |RCE| 4.14.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2018-11-02
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Diffs: expose range diff inside the PR view. It's now possible to show
14 commit-per-commit view of changes in pull request.
15 - Diffs: new sticky context bar.
16 When browsing diffs we show file path of the current diff so users are aware all the time
17 what file they are reviewing.
18 - Diffs: added quick file selector in diffs views. Now it's possible to select a file
19 in large diffs from the sticky header for quicker access to certain interesting files
20 in diffs.
21 - Diffs: introducing diff menu for whitespace toggle and context changes.
22 It's now possible to show/hide whitespace changes and toggle the file context in
23 all diff places including pull requests.
24 - Comments: allow commenting on empty files without content.
25 - Repositories: added option to archive repositories instead of deleting them.
26 Archived repositories are useful for future auditing, but they are read-only.
27 - rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base
28 for future low-level integrations. It's now possible to expose nice messages back
29 to the users when using `rcextensions`.
30 - Summary page: slightly re-organize summary page for better user experience.
31
32
33 General
34 ^^^^^^^
35
36 - Mailing: switched from custom library to pyramid_mailer with python3 compatibility.
37 - Frontend: Switched to Polymer 3.0.
38 - Frontend: fixed problems with IE11 and brought back support for that browser.
39 - Git: use a fetch_sync based creation of remote repositories.
40 This fixes problems with importing from Bitbucket.
41 - Comments: update comments email templates.
42 - Packaging: only wrap external dependency scripts. This makes execution of scripts
43 roughly 5x faster due to much smaller PATH tree.
44 - HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data.
45 - Fonts/UI: use consistent fonts across the whole application.
46 Few places had non-standard custom fonts.
47 - Google: updated google auth plugin with latest API changes.
48 - Core: handle edge case requesting matched routes but with hg/svn/git or api context.
49 - Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license.
50 - Dependencies: atomicwrites==1.2.1
51 - Dependencies: attrs==18.2.0
52 - Dependencies: dogpile.cache==0.6.7
53 - Dependencies: psutil==5.4.7
54 - Dependencies: pathlib2==2.3.2
55 - Dependencies: subprocess32==3.5.2
56 - Dependencies: gevent==1.3.6
57 - Dependencies: greenlet==0.4.15
58 - Dependencies: pytest==3.8.2
59 - Dependencies: py==1.6.0
60 - Dependencies: pytest-cov==2.6.0
61 - Dependencies: pytest-timeout==1.3.2
62 - Dependencies: coverage==4.5.1
63 - Dependencies: psycopg2==2.7.5
64
65
66 Security
67 ^^^^^^^^
68
69 - RST: improve Javascript RST sandbox.
70 - Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup.
71
72
73 Performance
74 ^^^^^^^^^^^
75
76 - SSH: improved SSH wrapper execution speed by using optimized binary script wrapping.
77 - Core: reduced font and JavaScript load times.
78
79
80 Fixes
81 ^^^^^
82
83 - Comments: ensure we always display unmatched comments.
84 - Branch Permissions: fixed changing rule order for branch permissions.
85 - Users: ensure get_first_superadmin actually gets the 1st created super-admin.
86 - Users: when deleting users ensure we also clear personal flag.
87 This fixes some problems with multiple personal groups.
88 - Diffs: disable the error border on highlight errors.
89 - Integrations: implement retry to HTTP[S] calls for integrations.
90 Web parts will do a 3x retry call in case service is not reachable or
91 responds with 5XX codes.
92 - Git: fixed pull-request updates in case branch names are the same as the file names.
93 - Supervisor: add patch for older kernel support.
94 - Compare: fixed file after/before links in compare view for cross repo compare.
95 - Emails: improve fonts and rendering of email HTML.
96 - Permissions: flush members of user groups permissions to clear caches.
97 - Repository: add check preventing of removal of repo with attached pull requests. Users
98 should use the new archive repo function instead.
99
100
101 Upgrade notes
102 ^^^^^^^^^^^^^
103
104 - In this release, we're shipping a new `rcextensions`. The changes made are
105 backward incompatible. An update of `rcextensions` is required
106 prior to using them again. Please check the new `rcextensions.tmpl` directory
107 located in `etc/rcextensions.tmpl` in your instance installation path.
108 Old code should be 100% portable by just copy&paste to the right function.
109
110 - Mailing: We introduced a new mailing library. The older options should be compatible and
111 generally, old configuration doesn't need any changes in order to send emails.
112 We, however, encourage users to re-check mailing setup in case of some more
113 sophisticated email setups.
114 There's a possibility to send a test email from admin > settings > email section.
@@ -0,0 +1,3 b''
1 self: super: {
2
3 }
@@ -0,0 +1,16 b''
1 diff -rup supervisor-3.3.4-orig/supervisor/options.py supervisor-3.3.4/supervisor/options.py
2 --- supervisor-3.3.4-orig/supervisor/options.py 1970-01-01 01:00:01.000000000 +0100
3 +++ supervisor-3.3.4/supervisor-new/options.py 2018-10-24 10:53:19.368503735 +0200
4 @@ -1395,7 +1395,11 @@ class ServerOptions(Options):
5 name = limit['name']
6 name = name # name is used below by locals()
7
8 - soft, hard = resource.getrlimit(res)
9 + try:
10 + soft, hard = resource.getrlimit(res)
11 + except Exception:
12 + # handle old kernel problems, this is not critical to execute
13 + soft, hard = -1, -1
14
15 if (soft < min) and (soft != -1): # -1 means unlimited
16 if (hard < min) and (hard != -1):
@@ -0,0 +1,3 b''
1 ## special libraries we could extend the requirements.txt file with to add some
2 ## custom libraries usefull for debug and memory tracing
3 objgraph==3.1.1
@@ -0,0 +1,7 b''
1 This is template rcextensions.
2
3 To edit rcextensions please edit hooks.py file.
4 The examples/ directory contain some basic example how to use hooks.
5
6
7 Changes to rcextensions requires restart of RhodeCode instances.
@@ -0,0 +1,56 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 """
20 rcextensions module, please edit `hooks.py` to over write hooks logic
21 """
22
23 from .hooks import (
24 _create_repo_hook,
25 _create_repo_group_hook,
26 _pre_create_user_hook,
27 _create_user_hook,
28 _delete_repo_hook,
29 _delete_user_hook,
30 _pre_push_hook,
31 _push_hook,
32 _pre_pull_hook,
33 _pull_hook,
34 _create_pull_request_hook,
35 _review_pull_request_hook,
36 _update_pull_request_hook,
37 _merge_pull_request_hook,
38 _close_pull_request_hook,
39 )
40
41 # set as module attributes, we use those to call hooks. *do not change this*
42 CREATE_REPO_HOOK = _create_repo_hook
43 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
44 PRE_CREATE_USER_HOOK = _pre_create_user_hook
45 CREATE_USER_HOOK = _create_user_hook
46 DELETE_REPO_HOOK = _delete_repo_hook
47 DELETE_USER_HOOK = _delete_user_hook
48 PRE_PUSH_HOOK = _pre_push_hook
49 PUSH_HOOK = _push_hook
50 PRE_PULL_HOOK = _pre_pull_hook
51 PULL_HOOK = _pull_hook
52 CREATE_PULL_REQUEST = _create_pull_request_hook
53 REVIEW_PULL_REQUEST = _review_pull_request_hook
54 UPDATE_PULL_REQUEST = _update_pull_request_hook
55 MERGE_PULL_REQUEST = _merge_pull_request_hook
56 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -0,0 +1,36 b''
1 # Example to trigger a HTTP call via an HTTP helper via post_push hook
2
3
4 @has_kwargs({
5 'server_url': 'url of instance that triggered this hook',
6 'config': 'path to .ini config used',
7 'scm': 'type of version control "git", "hg", "svn"',
8 'username': 'username of actor who triggered this event',
9 'ip': 'ip address of actor who triggered this hook',
10 'action': '',
11 'repository': 'repository name',
12 'repo_store_path': 'full path to where repositories are stored',
13 'commit_ids': '',
14 'hook_type': '',
15 'user_agent': '',
16 })
17 def _push_hook(*args, **kwargs):
18 """
19 POST PUSH HOOK, this function will be executed after each push it's
20 executed after the build-in hook that RhodeCode uses for logging pushes
21 """
22
23 from .helpers import http_call, extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 if repo_extra_fields.get('endpoint_url'):
28 endpoint = repo_extra_fields['endpoint_url']
29 if endpoint:
30 data = {
31 'some_key': 'val'
32 }
33 response = http_call.run(url=endpoint, json_data=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
35
36 return HookResponse(0, '')
@@ -0,0 +1,36 b''
1 # Example to trigger a CI call via an HTTP helper via post_push hook
2
3
4 @has_kwargs({
5 'server_url': 'url of instance that triggered this hook',
6 'config': 'path to .ini config used',
7 'scm': 'type of version control "git", "hg", "svn"',
8 'username': 'username of actor who triggered this event',
9 'ip': 'ip address of actor who triggered this hook',
10 'action': '',
11 'repository': 'repository name',
12 'repo_store_path': 'full path to where repositories are stored',
13 'commit_ids': '',
14 'hook_type': '',
15 'user_agent': '',
16 })
17 def _push_hook(*args, **kwargs):
18 """
19 POST PUSH HOOK, this function will be executed after each push it's
20 executed after the build-in hook that RhodeCode uses for logging pushes
21 """
22
23 from .helpers import http_call, extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 if repo_extra_fields.get('endpoint_url'):
28 endpoint = repo_extra_fields['endpoint_url']
29 if endpoint:
30 data = {
31 'some_key': 'val'
32 }
33 response = http_call.run(url=endpoint, json_data=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
35
36 return HookResponse(0, '')
1 NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
@@ -0,0 +1,17 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,40 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 """
28
29
30 def run(*args, **kwargs):
31 from rhodecode.model.db import Repository
32 # use temp name then the main one propagated
33 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
34 repo = Repository.get_by_repo_name(repo_name)
35
36 fields = {}
37 for field in repo.extra_fields:
38 fields[field.field_key] = field.get_dict()
39
40 return fields
@@ -0,0 +1,61 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 Extract and serialize commits taken from a list of commit_ids. This should
22 be used in post_push hook
23
24 us in hooks::
25
26 from .helpers import extract_post_commits
27 # returns list of dicts with key-val fetched from extra fields
28 commit_list = extract_post_commits.run(**kwargs)
29 """
30 import traceback
31
32
33 def run(*args, **kwargs):
34 from rhodecode.lib.utils2 import extract_mentioned_users
35 from rhodecode.model.db import Repository
36
37 commit_ids = kwargs.get('commit_ids')
38 if not commit_ids:
39 return 0
40
41 # use temp name then the main one propagated
42 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
43
44 repo = Repository.get_by_repo_name(repo_name)
45 commits = []
46
47 vcs_repo = repo.scm_instance(cache=False)
48 try:
49 for commit_id in commit_ids:
50 cs = vcs_repo.get_changeset(commit_id)
51 cs_data = cs.__json__()
52 cs_data['mentions'] = extract_mentioned_users(cs_data['message'])
53 # optionally add more logic to parse the commits, like reading extra
54 # fields of repository to read managers of reviewers ?
55 commits.append(cs_data)
56 except Exception:
57 print(traceback.format_exc())
58 # we don't send any commits when crash happens, only full list matters
59 # we short circuit then.
60 return []
61 return commits
@@ -0,0 +1,63 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import extract_pre_commits
24 # returns list of dicts with key-val fetched from extra fields
25 commit_list = extract_pre_commits.run(**kwargs)
26
27 """
28 import re
29 import collections
30
31
32 def get_hg_commits(repo, refs):
33 commits = []
34 return commits
35
36
37 def get_git_commits(repo, refs):
38 commits = []
39 return commits
40
41
42 def run(*args, **kwargs):
43 from rhodecode.model.db import Repository
44
45 vcs_type = kwargs['scm']
46 # use temp name then the main one propagated
47 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
48
49 repo = Repository.get_by_repo_name(repo_name)
50 vcs_repo = repo.scm_instance(cache=False)
51
52 commits = []
53
54 for rev_data in kwargs['commit_ids']:
55 new_environ = dict((k, v) for k, v in rev_data['hg_env'])
56
57 if vcs_type == 'git':
58 commits = get_git_commits(vcs_repo, kwargs['commit_ids'])
59
60 if vcs_type == 'hg':
61 commits = get_hg_commits(vcs_repo, kwargs['commit_ids'])
62
63 return commits
@@ -0,0 +1,36 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import http_call
24 # returns response after making a POST call
25 response = http_call.run(url=url, json_data=data)
26
27 """
28
29 from rhodecode.integrations.types.base import requests_retry_call
30
31
32 def run(url, json_data, method='post'):
33 requests_session = requests_retry_call()
34 requests_session.verify = True # Verify SSL
35 resp = requests_session.post(url, json=json_data, timeout=60)
36 return resp.raise_for_status() # raise exception on a failed request
@@ -0,0 +1,431 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 from .utils import DotDict, HookResponse, has_kwargs
20
21
22 # Config shortcut to keep, all configuration in one place
23 # Example: api_key = CONFIG.my_config.api_key
24 CONFIG = DotDict(
25 my_config=DotDict(
26 api_key='<secret>',
27 ),
28
29 )
30
31
32 @has_kwargs({
33 'repo_name': '',
34 'repo_type': '',
35 'description': '',
36 'private': '',
37 'created_on': '',
38 'enable_downloads': '',
39 'repo_id': '',
40 'user_id': '',
41 'enable_statistics': '',
42 'clone_uri': '',
43 'fork_id': '',
44 'group_id': '',
45 'created_by': ''
46 })
47 def _create_repo_hook(*args, **kwargs):
48 """
49 POST CREATE REPOSITORY HOOK. This function will be executed after
50 each repository is created. kwargs available:
51
52 """
53 return HookResponse(0, '')
54
55
56 @has_kwargs({
57 'group_name': '',
58 'group_parent_id': '',
59 'group_description': '',
60 'group_id': '',
61 'user_id': '',
62 'created_by': '',
63 'created_on': '',
64 'enable_locking': ''
65 })
66 def _create_repo_group_hook(*args, **kwargs):
67 """
68 POST CREATE REPOSITORY GROUP HOOK, this function will be
69 executed after each repository group is created. kwargs available:
70 """
71 return HookResponse(0, '')
72
73
74 @has_kwargs({
75 'username': '',
76 'password': '',
77 'email': '',
78 'firstname': '',
79 'lastname': '',
80 'active': '',
81 'admin': '',
82 'created_by': '',
83 })
84 def _pre_create_user_hook(*args, **kwargs):
85 """
86 PRE CREATE USER HOOK, this function will be executed before each
87 user is created, it returns a tuple of bool, reason.
88 If bool is False the user creation will be stopped and reason
89 will be displayed to the user.
90
91 Return HookResponse(1, reason) to block user creation
92
93 """
94
95 reason = 'allowed'
96 return HookResponse(0, reason)
97
98
99 @has_kwargs({
100 'username': '',
101 'full_name_or_username': '',
102 'full_contact': '',
103 'user_id': '',
104 'name': '',
105 'firstname': '',
106 'short_contact': '',
107 'admin': '',
108 'lastname': '',
109 'ip_addresses': '',
110 'extern_type': '',
111 'extern_name': '',
112 'email': '',
113 'api_key': '',
114 'api_keys': '',
115 'last_login': '',
116 'full_name': '',
117 'active': '',
118 'password': '',
119 'emails': '',
120 'inherit_default_permissions': '',
121 'created_by': '',
122 'created_on': '',
123 })
124 def _create_user_hook(*args, **kwargs):
125 """
126 POST CREATE USER HOOK, this function will be executed after each user is created
127 """
128 return HookResponse(0, '')
129
130
131 @has_kwargs({
132 'repo_name': '',
133 'repo_type': '',
134 'description': '',
135 'private': '',
136 'created_on': '',
137 'enable_downloads': '',
138 'repo_id': '',
139 'user_id': '',
140 'enable_statistics': '',
141 'clone_uri': '',
142 'fork_id': '',
143 'group_id': '',
144 'deleted_by': '',
145 'deleted_on': '',
146 })
147 def _delete_repo_hook(*args, **kwargs):
148 """
149 POST DELETE REPOSITORY HOOK, this function will be executed after
150 each repository deletion
151 """
152 return HookResponse(0, '')
153
154
155 @has_kwargs({
156 'username': '',
157 'full_name_or_username': '',
158 'full_contact': '',
159 'user_id': '',
160 'name': '',
161 'short_contact': '',
162 'admin': '',
163 'firstname': '',
164 'lastname': '',
165 'ip_addresses': '',
166 'email': '',
167 'api_key': '',
168 'last_login': '',
169 'full_name': '',
170 'active': '',
171 'password': '',
172 'emails': '',
173 'inherit_default_permissions': '',
174 'deleted_by': '',
175 })
176 def _delete_user_hook(*args, **kwargs):
177 """
178 POST DELETE USER HOOK, this function will be executed after each
179 user is deleted kwargs available:
180 """
181 return HookResponse(0, '')
182
183
184 # =============================================================================
185 # PUSH/PULL RELATED HOOKS
186 # =============================================================================
187 @has_kwargs({
188 'server_url': 'url of instance that triggered this hook',
189 'config': 'path to .ini config used',
190 'scm': 'type of version control "git", "hg", "svn"',
191 'username': 'username of actor who triggered this event',
192 'ip': 'ip address of actor who triggered this hook',
193 'action': '',
194 'repository': 'repository name',
195 'repo_store_path': 'full path to where repositories are stored',
196 'commit_ids': 'pre transaction metadata for commit ids',
197 'hook_type': '',
198 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
199 })
200 def _pre_push_hook(*args, **kwargs):
201 """
202 Post push hook
203 To stop version control from storing the transaction and send a message to user
204 use non-zero HookResponse with a message, e.g return HookResponse(1, 'Not allowed')
205
206 This message will be shown back to client during PUSH operation
207
208 Commit ids might look like that::
209
210 [{u'hg_env|git_env': ...,
211 u'multiple_heads': [],
212 u'name': u'default',
213 u'new_rev': u'd0befe0692e722e01d5677f27a104631cf798b69',
214 u'old_rev': u'd0befe0692e722e01d5677f27a104631cf798b69',
215 u'ref': u'',
216 u'total_commits': 2,
217 u'type': u'branch'}]
218 """
219 return HookResponse(0, '')
220
221
222 @has_kwargs({
223 'server_url': 'url of instance that triggered this hook',
224 'config': 'path to .ini config used',
225 'scm': 'type of version control "git", "hg", "svn"',
226 'username': 'username of actor who triggered this event',
227 'ip': 'ip address of actor who triggered this hook',
228 'action': '',
229 'repository': 'repository name',
230 'repo_store_path': 'full path to where repositories are stored',
231 'commit_ids': 'list of pushed commit_ids (sha1)',
232 'hook_type': '',
233 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
234 })
235 def _push_hook(*args, **kwargs):
236 """
237 POST PUSH HOOK, this function will be executed after each push it's
238 executed after the build-in hook that RhodeCode uses for logging pushes
239 """
240 return HookResponse(0, '')
241
242
243 @has_kwargs({
244 'server_url': 'url of instance that triggered this hook',
245 'repo_store_path': 'full path to where repositories are stored',
246 'config': 'path to .ini config used',
247 'scm': 'type of version control "git", "hg", "svn"',
248 'username': 'username of actor who triggered this event',
249 'ip': 'ip address of actor who triggered this hook',
250 'action': '',
251 'repository': 'repository name',
252 'hook_type': '',
253 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
254 })
255 def _pre_pull_hook(*args, **kwargs):
256 """
257 Post pull hook
258 """
259 return HookResponse(0, '')
260
261
262 @has_kwargs({
263 'server_url': 'url of instance that triggered this hook',
264 'repo_store_path': 'full path to where repositories are stored',
265 'config': 'path to .ini config used',
266 'scm': 'type of version control "git", "hg", "svn"',
267 'username': 'username of actor who triggered this event',
268 'ip': 'ip address of actor who triggered this hook',
269 'action': '',
270 'repository': 'repository name',
271 'hook_type': '',
272 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
273 })
274 def _pull_hook(*args, **kwargs):
275 """
276 This hook will be executed after each code pull.
277 """
278 return HookResponse(0, '')
279
280
281 # =============================================================================
282 # PULL REQUEST RELATED HOOKS
283 # =============================================================================
284 @has_kwargs({
285 'server_url': 'url of instance that triggered this hook',
286 'config': 'path to .ini config used',
287 'scm': 'type of version control "git", "hg", "svn"',
288 'username': 'username of actor who triggered this event',
289 'ip': 'ip address of actor who triggered this hook',
290 'action': '',
291 'repository': 'repository name',
292 'pull_request_id': '',
293 'url': '',
294 'title': '',
295 'description': '',
296 'status': '',
297 'created_on': '',
298 'updated_on': '',
299 'commit_ids': '',
300 'review_status': '',
301 'mergeable': '',
302 'source': '',
303 'target': '',
304 'author': '',
305 'reviewers': '',
306 })
307 def _create_pull_request_hook(*args, **kwargs):
308 """
309 This hook will be executed after creation of a pull request.
310 """
311 return HookResponse(0, '')
312
313
314 @has_kwargs({
315 'server_url': 'url of instance that triggered this hook',
316 'config': 'path to .ini config used',
317 'scm': 'type of version control "git", "hg", "svn"',
318 'username': 'username of actor who triggered this event',
319 'ip': 'ip address of actor who triggered this hook',
320 'action': '',
321 'repository': 'repository name',
322 'pull_request_id': '',
323 'url': '',
324 'title': '',
325 'description': '',
326 'status': '',
327 'created_on': '',
328 'updated_on': '',
329 'commit_ids': '',
330 'review_status': '',
331 'mergeable': '',
332 'source': '',
333 'target': '',
334 'author': '',
335 'reviewers': '',
336 })
337 def _review_pull_request_hook(*args, **kwargs):
338 """
339 This hook will be executed after review action was made on a pull request.
340 """
341 return HookResponse(0, '')
342
343
344 @has_kwargs({
345 'server_url': 'url of instance that triggered this hook',
346 'config': 'path to .ini config used',
347 'scm': 'type of version control "git", "hg", "svn"',
348 'username': 'username of actor who triggered this event',
349 'ip': 'ip address of actor who triggered this hook',
350 'action': '',
351 'repository': 'repository name',
352 'pull_request_id': '',
353 'url': '',
354 'title': '',
355 'description': '',
356 'status': '',
357 'created_on': '',
358 'updated_on': '',
359 'commit_ids': '',
360 'review_status': '',
361 'mergeable': '',
362 'source': '',
363 'target': '',
364 'author': '',
365 'reviewers': '',
366 })
367 def _update_pull_request_hook(*args, **kwargs):
368 """
369 This hook will be executed after pull requests has been updated with new commits.
370 """
371 return HookResponse(0, '')
372
373
374 @has_kwargs({
375 'server_url': 'url of instance that triggered this hook',
376 'config': 'path to .ini config used',
377 'scm': 'type of version control "git", "hg", "svn"',
378 'username': 'username of actor who triggered this event',
379 'ip': 'ip address of actor who triggered this hook',
380 'action': '',
381 'repository': 'repository name',
382 'pull_request_id': '',
383 'url': '',
384 'title': '',
385 'description': '',
386 'status': '',
387 'created_on': '',
388 'updated_on': '',
389 'commit_ids': '',
390 'review_status': '',
391 'mergeable': '',
392 'source': '',
393 'target': '',
394 'author': '',
395 'reviewers': '',
396 })
397 def _merge_pull_request_hook(*args, **kwargs):
398 """
399 This hook will be executed after merge of a pull request.
400 """
401 return HookResponse(0, '')
402
403
404 @has_kwargs({
405 'server_url': 'url of instance that triggered this hook',
406 'config': 'path to .ini config used',
407 'scm': 'type of version control "git", "hg", "svn"',
408 'username': 'username of actor who triggered this event',
409 'ip': 'ip address of actor who triggered this hook',
410 'action': '',
411 'repository': 'repository name',
412 'pull_request_id': '',
413 'url': '',
414 'title': '',
415 'description': '',
416 'status': '',
417 'created_on': '',
418 'updated_on': '',
419 'commit_ids': '',
420 'review_status': '',
421 'mergeable': '',
422 'source': '',
423 'target': '',
424 'author': '',
425 'reviewers': '',
426 })
427 def _close_pull_request_hook(*args, **kwargs):
428 """
429 This hook will be executed after close of a pull request.
430 """
431 return HookResponse(0, '')
@@ -0,0 +1,21 b''
1 # =============================================================================
2 # END OF UTILITY FUNCTIONS HERE
3 # =============================================================================
4
5 # Additional mappings that are not present in the pygments lexers
6 # used for building stats
7 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
8 # more than one name for extension
9 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
10 # build by pygments
11 EXTRA_MAPPINGS = {'html': ['Text']}
12
13 # additional lexer definitions for custom files it's overrides pygments lexers,
14 # and uses defined name of lexer to colorize the files. Format is {'ext':
15 # 'lexer_name'} List of lexers can be printed running:
16 # >> python -c "import pprint;from pygments import lexers;
17 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
18
19 EXTRA_LEXERS = {
20 'tt': 'vbnet'
21 }
@@ -0,0 +1,147 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import os
20 import functools
21 import collections
22
23
24 class HookResponse(object):
25 def __init__(self, status, output):
26 self.status = status
27 self.output = output
28
29 def __add__(self, other):
30 other_status = getattr(other, 'status', 0)
31 new_status = max(self.status, other_status)
32 other_output = getattr(other, 'output', '')
33 new_output = self.output + other_output
34
35 return HookResponse(new_status, new_output)
36
37 def __bool__(self):
38 return self.status == 0
39
40
41 class DotDict(dict):
42
43 def __contains__(self, k):
44 try:
45 return dict.__contains__(self, k) or hasattr(self, k)
46 except:
47 return False
48
49 # only called if k not found in normal places
50 def __getattr__(self, k):
51 try:
52 return object.__getattribute__(self, k)
53 except AttributeError:
54 try:
55 return self[k]
56 except KeyError:
57 raise AttributeError(k)
58
59 def __setattr__(self, k, v):
60 try:
61 object.__getattribute__(self, k)
62 except AttributeError:
63 try:
64 self[k] = v
65 except:
66 raise AttributeError(k)
67 else:
68 object.__setattr__(self, k, v)
69
70 def __delattr__(self, k):
71 try:
72 object.__getattribute__(self, k)
73 except AttributeError:
74 try:
75 del self[k]
76 except KeyError:
77 raise AttributeError(k)
78 else:
79 object.__delattr__(self, k)
80
81 def toDict(self):
82 return unserialize(self)
83
84 def __repr__(self):
85 keys = list(self.keys())
86 keys.sort()
87 args = ', '.join(['%s=%r' % (key, self[key]) for key in keys])
88 return '%s(%s)' % (self.__class__.__name__, args)
89
90 @staticmethod
91 def fromDict(d):
92 return serialize(d)
93
94
95 def serialize(x):
96 if isinstance(x, dict):
97 return DotDict((k, serialize(v)) for k, v in x.items())
98 elif isinstance(x, (list, tuple)):
99 return type(x)(serialize(v) for v in x)
100 else:
101 return x
102
103
104 def unserialize(x):
105 if isinstance(x, dict):
106 return dict((k, unserialize(v)) for k, v in x.items())
107 elif isinstance(x, (list, tuple)):
108 return type(x)(unserialize(v) for v in x)
109 else:
110 return x
111
112
113 def _verify_kwargs(func_name, expected_parameters, kwargs):
114 """
115 Verify that exactly `expected_parameters` are passed in as `kwargs`.
116 """
117 expected_parameters = set(expected_parameters)
118 kwargs_keys = set(kwargs.keys())
119 if kwargs_keys != expected_parameters:
120 missing_kwargs = expected_parameters - kwargs_keys
121 unexpected_kwargs = kwargs_keys - expected_parameters
122 raise AssertionError(
123 "func:%s: missing parameters: %r, unexpected parameters: %s" %
124 (func_name, missing_kwargs, unexpected_kwargs))
125
126
127 def has_kwargs(required_args):
128 """
129 decorator to verify extension calls arguments.
130
131 :param required_args:
132 """
133 def wrap(func):
134 def wrapper(*args, **kwargs):
135 _verify_kwargs(func.func_name, required_args.keys(), kwargs)
136 # in case there's `calls` defined on module we store the data
137 maybe_log_call(func.func_name, args, kwargs)
138 return func(*args, **kwargs)
139 return wrapper
140 return wrap
141
142
143 def maybe_log_call(name, args, kwargs):
144 from rhodecode.config import rcextensions
145 if hasattr(rcextensions, 'calls'):
146 calls = rcextensions.calls
147 calls[name].append((args, kwargs))
@@ -0,0 +1,36 b''
1 import logging
2
3 from sqlalchemy import *
4
5 from rhodecode.model import meta
6 from rhodecode.lib.dbmigrate.versions import _reset_base, notify
7
8 log = logging.getLogger(__name__)
9
10
11 def upgrade(migrate_engine):
12 """
13 Upgrade operations go here.
14 Don't create your own engine; bind migrate_engine to your metadata
15 """
16 _reset_base(migrate_engine)
17 from rhodecode.lib.dbmigrate.schema import db_4_13_0_0 as db
18
19 repository_table = db.Repository.__table__
20
21 archived = Column('archived', Boolean(), nullable=True)
22 archived.create(table=repository_table)
23
24 # issue fixups
25 fixups(db, meta.Session)
26
27
28 def downgrade(migrate_engine):
29 meta = MetaData()
30 meta.bind = migrate_engine
31
32
33 def fixups(models, _SESSION):
34 pass
35
36
@@ -0,0 +1,7 b''
1 import '@polymer/iron-ajax/iron-ajax.js';
2 import './shared-styles.js';
3 import './channelstream-connection/channelstream-connection.js';
4 import './rhodecode-toast/rhodecode-toast.js';
5 import './rhodecode-toggle/rhodecode-toggle.js';
6 import './rhodecode-unsafe-html/rhodecode-unsafe-html.js';
7 import './rhodecode-app/rhodecode-app.js';
@@ -0,0 +1,12 b''
1 const styleElement = document.createElement('dom-module');
2 // this will use raw-loader
3 import sharedCSS from './style-polymer.css';
4
5 styleElement.innerHTML =
6 `<template>
7 <style>
8 ${sharedCSS}
9 </style>
10 </template>`;
11
12 styleElement.register('shared-styles');
@@ -0,0 +1,45 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.tests import TestController
24 from rhodecode.tests.fixture import Fixture
25
26
27 class TestBadRequestData(TestController):
28
29 def test_bad_get_data(self):
30 self.app.get(
31 '/', params={'f\xfc': '\xfc%f6%22%20onmouseover%3dveA2(9352)%20'},
32 status=400)
33
34 def test_bad_url_data(self):
35 self.app.post(
36 '/f\xfc',
37 status=400)
38
39 def test_bad_post_data(self, csrf_token, xhr_header):
40 self.app.post(
41 '/_markup_preview',
42 params={'f\xfc': '\xfc%f6%22%20onmouseover%3dveA2(9352)%20',
43 'csrf_token': csrf_token},
44 extra_environ=xhr_header,
45 status=400)
@@ -0,0 +1,83 b''
1 /* webpack.config.js */
2 require('style-loader');
3 require('css-loader');
4 var path = require('path');
5
6 const projectName = 'rhodecode-components';
7 let destinationDirectory = path.join(process.cwd(), 'rhodecode', 'public', 'js')
8
9 if (process.env.RC_STATIC_DIR) {
10 destinationDirectory = process.env.RC_STATIC_DIR;
11 }
12
13 // doing it this way because it seems that plugin via grunt does not pick up .babelrc
14 let babelRCOptions = {
15 "presets": [
16 ["env", {
17 "targets": {
18 "browsers": ["last 2 versions"]
19 }
20 }]
21 ],
22 "plugins": ["transform-object-rest-spread"]
23 }
24
25 module.exports = {
26 // Tell Webpack which file kicks off our app.
27 entry: {
28 main: path.resolve(__dirname, 'rhodecode/public/js/src/components/index.js'),
29 },
30 output: {
31 filename: 'rhodecode-components.js',
32 path: path.resolve(destinationDirectory)
33 },
34 // Tell Webpack which directories to look in to resolve import statements.
35 // Normally Webpack will look in node_modules by default but since we’re overriding
36 resolve: {
37 modules: [
38 path.resolve(__dirname, 'node_modules'),
39 ]
40 },
41 // These rules tell Webpack how to process different module types.
42 // Remember, *everything* is a module in Webpack. That includes
43 // CSS, and (thanks to our loader) HTML.
44 module: {
45 rules: [
46 {
47 test: /style-polymer.css/,
48 use: 'raw-loader'
49 },
50 {
51 // If you see a file that ends in .html, send it to these loaders.
52 test: /\.html$/,
53 // This is an example of chained loaders in Webpack.
54 // Chained loaders run last to first. So it will run
55 // polymer-webpack-loader, and hand the output to
56 // babel-loader. This let's us transpile JS in our `<script>` elements.
57 use: [
58 {loader: 'babel-loader',
59 options: babelRCOptions},
60 {loader: 'polymer-webpack-loader',
61 options: {
62 processStyleLinks: true,
63 }
64 }
65 ],
66 },
67 {
68 // If you see a file that ends in .js, just send it to the babel-loader.
69 test: /\.js$/,
70 use: {loader: 'babel-loader', options: babelRCOptions}
71 // Optionally exclude node_modules from transpilation except for polymer-webpack-loader:
72 // exclude: /node_modules\/(?!polymer-webpack-loader\/).*/
73 },
74 // this is required because of bug:
75 // https://github.com/webpack-contrib/polymer-webpack-loader/issues/49
76 {
77 test: /intl-messageformat.min.js/,
78 use: 'imports-loader?this=>window'
79 }
80 ]
81 },
82 plugins: []
83 };
@@ -1,5 +1,5 b''
1 1 [bumpversion]
2 current_version = 4.13.3
2 current_version = 4.14.0
3 3 message = release: Bump version {current_version} to {new_version}
4 4
5 5 [bumpversion:file:rhodecode/VERSION]
@@ -24,7 +24,6 b' syntax: regexp'
24 24 ^.dev
25 25 ^._dev
26 26 ^build/
27 ^bower_components/
28 27 ^coverage\.xml$
29 28 ^data$
30 29 ^\.eggs/
@@ -36,14 +35,15 b' syntax: regexp'
36 35 ^htmlcov
37 36 ^junit\.xml$
38 37 ^node_modules/
38 ^node_binaries/
39 39 ^pylint.log$
40 40 ^rcextensions/
41 41 ^result$
42 42 ^rhodecode/public/css/style.css$
43 43 ^rhodecode/public/css/style-polymer.css$
44 44 ^rhodecode/public/js/rhodecode-components.html$
45 ^rhodecode/public/js/rhodecode-components.js$
45 46 ^rhodecode/public/js/scripts.js$
46 ^rhodecode/public/js/rhodecode-components.js$
47 47 ^rhodecode/public/js/src/components/root-styles.gen.html$
48 48 ^rhodecode/public/js/vendors/webcomponentsjs/
49 49 ^rhodecode\.db$
@@ -5,25 +5,20 b' done = false'
5 5 done = true
6 6
7 7 [task:rc_tools_pinned]
8 done = true
9 8
10 9 [task:fixes_on_stable]
11 done = true
12 10
13 11 [task:pip2nix_generated]
14 done = true
15 12
16 13 [task:changelog_updated]
17 done = true
18 14
19 15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21 18
22 19 [release]
23 state = prepared
24 version = 4.13.3
25
26 [task:updated_translation]
20 state = in_progress
21 version = 4.14.0
27 22
28 23 [task:generate_js_routes]
29 24
@@ -1,4 +1,12 b''
1 1 var gruntConfig = require('./grunt_config.json');
2 var webpackConfig = require('./webpack.config');
3 gruntConfig["webpack"] = {
4 options: {
5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
6 },
7 prod: webpackConfig,
8 dev: Object.assign({ watch: false }, webpackConfig)
9 };
2 10
3 11 module.exports = function(grunt) {
4 12 grunt.initConfig(gruntConfig);
@@ -7,9 +15,7 b' module.exports = function(grunt) {'
7 15 grunt.loadNpmTasks('grunt-contrib-concat');
8 16 grunt.loadNpmTasks('grunt-contrib-watch');
9 17 grunt.loadNpmTasks('grunt-contrib-jshint');
10 grunt.loadNpmTasks('grunt-vulcanize');
11 grunt.loadNpmTasks('grunt-crisper');
12 18 grunt.loadNpmTasks('grunt-contrib-copy');
13
14 grunt.registerTask('default', ['less:production', 'less:components', 'concat:polymercss', 'copy', 'concat:dist', 'vulcanize', 'crisper']);
19 grunt.loadNpmTasks('grunt-webpack');
20 grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist']);
15 21 };
@@ -39,7 +39,6 b' include rhodecode/public/sounds/*.mp3'
39 39 include rhodecode/public/sounds/*.wav
40 40
41 41 # fonts
42 recursive-include rhodecode/public/fonts/ProximaNova *
43 42 recursive-include rhodecode/public/fonts/RCIcons *
44 43
45 44 # js
@@ -1,9 +1,9 b''
1 1
2 2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build
3 3
4 WEBPACK=./node_modules/webpack/bin/webpack.js
5 GRUNT=grunt
6 4 NODE_PATH=./node_modules
5 WEBPACK=./node_binaries/webpack
6 GRUNT=./node_binaries/grunt
7 7
8 8
9 9 clean:
@@ -26,8 +26,6 b' debug = true'
26 26 #smtp_port =
27 27 #smtp_use_tls = false
28 28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31 29
32 30 [server:main]
33 31 ## COMMON ##
@@ -281,8 +279,10 b' supervisor.group_id = dev'
281 279 ## Display extended labs settings
282 280 labs_settings_active = true
283 281
284 ## custom exception store path, defaults to TMPDIR
285 exception_tracker.store_path =
282 ## Custom exception store path, defaults to TMPDIR
283 ## This is used to store exception from RhodeCode in shared directory
284 #exception_tracker.store_path =
285
286 286
287 287 ####################################
288 288 ### CELERY CONFIG ####
@@ -506,7 +506,7 b' debug_style = true'
506 506 ###########################################
507 507 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
508 508 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
510 510 # pymysql is an alternative driver for MySQL, use in case of problems with default one
511 511 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
512 512
@@ -26,8 +26,6 b' debug = true'
26 26 #smtp_port =
27 27 #smtp_use_tls = false
28 28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31 29
32 30 [server:main]
33 31 ## COMMON ##
@@ -256,8 +254,9 b' supervisor.group_id = prod'
256 254 ## Display extended labs settings
257 255 labs_settings_active = true
258 256
259 ## custom exception store path, defaults to TMPDIR
260 exception_tracker.store_path =
257 ## Custom exception store path, defaults to TMPDIR
258 ## This is used to store exception from RhodeCode in shared directory
259 #exception_tracker.store_path =
261 260
262 261
263 262 ####################################
@@ -480,7 +479,7 b' set debug = false'
480 479 ###########################################
481 480 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
482 481 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
483 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
482 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
484 483 # pymysql is an alternative driver for MySQL, use in case of problems with default one
485 484 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
486 485
@@ -9,7 +9,7 b''
9 9 # {
10 10 # # Thoughts on how to configure the dev environment
11 11 # rc = {
12 # codeInternalUrl = "https://usr:token@internal-code.rhodecode.com";
12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
13 13 # sources = {
14 14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
@@ -26,10 +26,18 b' args@'
26 26 }:
27 27
28 28 let
29 # Use nixpkgs from args or import them. We use this indirect approach
30 # through args to be able to use the name `pkgs` for our customized packages.
31 # Otherwise we will end up with an infinite recursion.
32 pkgs = args.pkgs or (import <nixpkgs> { });
29 pkgs_ = (import <nixpkgs> {});
30 in
31
32 let
33 pkgs = import <nixpkgs> {
34 overlays = [
35 (import ./pkgs/overlays.nix)
36 ];
37 inherit
38 (pkgs_)
39 system;
40 };
33 41
34 42 # Works with the new python-packages, still can fallback to the old
35 43 # variant.
@@ -46,7 +54,7 b' let'
46 54 in
47 55 !builtins.elem (basename path) [
48 56 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
49 "bower_components" "node_modules"
57 "node_modules" "node_binaries"
50 58 "build" "data" "result" "tmp"] &&
51 59 !builtins.elem ext ["egg-info" "pyc"] &&
52 60 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
@@ -55,7 +63,11 b' let'
55 63
56 64 sources =
57 65 let
58 inherit (pkgs.lib) all isString attrValues;
66 inherit
67 (pkgs.lib)
68 all
69 isString
70 attrValues;
59 71 sourcesConfig = pkgs.config.rc.sources or {};
60 72 in
61 73 # Ensure that sources are configured as strings. Using a path
@@ -66,18 +78,12 b' let'
66 78 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
67 79 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
68 80
69 buildBowerComponents = pkgs.buildBowerComponents;
70 81 nodeEnv = import ./pkgs/node-default.nix {
71 inherit pkgs;
82 inherit
83 pkgs;
72 84 };
73 85 nodeDependencies = nodeEnv.shell.nodeDependencies;
74 86
75 bowerComponents = buildBowerComponents {
76 name = "enterprise-ce-${version}";
77 generated = ./pkgs/bower-packages.nix;
78 src = rhodecode-enterprise-ce-src;
79 };
80
81 87 rhodecode-testdata-src = sources.rhodecode-testdata or (
82 88 pkgs.fetchhg {
83 89 url = "https://code.rhodecode.com/upstream/rc_testdata";
@@ -95,23 +101,22 b' let'
95 101 pythonLocalOverrides = self: super: {
96 102 rhodecode-enterprise-ce =
97 103 let
98 linkNodeAndBowerPackages = ''
104 linkNodePackages = ''
99 105 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
100 106
101 echo "[BEGIN]: Link node packages"
102 rm -fr node_modules
103 mkdir node_modules
107 echo "[BEGIN]: Link node packages and binaries"
104 108 # johbo: Linking individual packages allows us to run "npm install"
105 109 # inside of a shell to try things out. Re-entering the shell will
106 110 # restore a clean environment.
111 rm -fr node_modules
112 mkdir node_modules
107 113 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
108 echo "[DONE]: Link node packages"
114 export NODE_PATH=./node_modules
109 115
110 echo "[BEGIN]: Link bower packages"
111 rm -fr bower_components
112 mkdir bower_components
113 ln -s ${bowerComponents}/bower_components/* bower_components/
114 echo "[DONE]: Link bower packages"
116 rm -fr node_binaries
117 mkdir node_binaries
118 ln -s ${nodeDependencies}/bin/* node_binaries/
119 echo "[DONE ]: Link node packages and binaries"
115 120 '';
116 121
117 122 releaseName = "RhodeCodeEnterpriseCE-${version}";
@@ -129,8 +134,7 b' let'
129 134 passthru = {
130 135 inherit
131 136 rhodecode-testdata
132 bowerComponents
133 linkNodeAndBowerPackages
137 linkNodePackages
134 138 myPythonPackagesUnfix
135 139 pythonLocalOverrides
136 140 pythonCommunityOverrides;
@@ -141,8 +145,6 b' let'
141 145 buildInputs =
142 146 attrs.buildInputs or [] ++ [
143 147 rhodecode-testdata
144 pkgs.nodePackages.bower
145 pkgs.nodePackages.grunt-cli
146 148 ];
147 149
148 150 #NOTE: option to inject additional propagatedBuildInputs
@@ -175,14 +177,28 b' let'
175 177 '';
176 178
177 179 preBuild = ''
178
179 echo "Building frontend assets"
180 ${linkNodeAndBowerPackages}
181 grunt
180 echo "[BEGIN]: Building frontend assets"
181 ${linkNodePackages}
182 make web-build
182 183 rm -fr node_modules
184 rm -fr node_binaries
185 echo "[DONE ]: Building frontend assets"
183 186 '';
184 187
185 188 postInstall = ''
189 # check required files
190 STATIC_CHECK="/robots.txt /502.html
191 /js/scripts.js /js/rhodecode-components.js
192 /css/style.css /css/style-polymer.css"
193
194 for file in $STATIC_CHECK;
195 do
196 if [ ! -f rhodecode/public/$file ]; then
197 echo "Missing $file"
198 exit 1
199 fi
200 done
201
186 202 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
187 203 mkdir -p $out/nix-support/rccontrol
188 204 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
@@ -192,22 +208,35 b' let'
192 208 cp configs/production.ini $out/etc
193 209 echo "[DONE]: saved enterprise-ce production.ini into $out/etc"
194 210
211 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
212 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
213
195 214 # python based programs need to be wrapped
196 215 mkdir -p $out/bin
197 # rhodecode-tools
198 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
199 216
200 217 # required binaries from dependencies
201 #ln -s ${self.python}/bin/python $out/bin
202 ln -s ${self.pyramid}/bin/* $out/bin/
203 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
204 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
218 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
219 ln -s ${self.supervisor}/bin/supervisord $out/bin/
205 220 ln -s ${self.pastescript}/bin/paster $out/bin/
206 221 ln -s ${self.channelstream}/bin/channelstream $out/bin/
207 222 ln -s ${self.celery}/bin/celery $out/bin/
208 echo "[DONE]: created symlinks into $out/bin"
223 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
224 ln -s ${self.pyramid}/bin/prequest $out/bin/
225 ln -s ${self.pyramid}/bin/pserve $out/bin/
209 226
210 for file in $out/bin/*;
227 echo "[DONE ]: created symlinks into $out/bin"
228 DEPS="$out/bin/supervisorctl \
229 $out/bin/supervisord \
230 $out/bin/paster \
231 $out/bin/channelstream \
232 $out/bin/celery \
233 $out/bin/gunicorn \
234 $out/bin/prequest \
235 $out/bin/pserve"
236
237 # wrap only dependency scripts, they require to have full PYTHONPATH set
238 # to be able to import all packages
239 for file in $DEPS;
211 240 do
212 241 wrapProgram $file \
213 242 --prefix PATH : $PATH \
@@ -217,14 +246,16 b' let'
217 246
218 247 echo "[DONE]: enterprise-ce binary wrapping"
219 248
220 if [ ! -f rhodecode/public/js/scripts.js ]; then
221 echo "Missing scripts.js"
222 exit 1
223 fi
224 if [ ! -f rhodecode/public/css/style.css ]; then
225 echo "Missing style.css"
226 exit 1
227 fi
249 # rhodecode-tools don't need wrapping
250 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
251
252 # expose sources of CE
253 ln -s $out $out/etc/rhodecode_enterprise_ce_source
254
255 # expose static files folder
256 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
257 chmod 755 -R $out/etc/static
258
228 259 '';
229 260 });
230 261
@@ -237,8 +268,13 b' let'
237 268 getAttr pythonPackages pkgs;
238 269
239 270 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
240 inherit pkgs;
241 inherit (pkgs) fetchurl fetchgit fetchhg;
271 inherit
272 pkgs;
273 inherit
274 (pkgs)
275 fetchurl
276 fetchgit
277 fetchhg;
242 278 };
243 279
244 280 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
@@ -162,7 +162,8 b' To add custom hooks to your instance, us'
162 162
163 163 1. Open :menuselection:`Admin --> Settings --> Hooks`
164 164 2. Add your custom hook details, you can use a file path to specify custom
165 hook scripts, for example: ``python:/path/to/custom_hook.py``
165 hook scripts, for example:
166 ``pretxnchangegroup.example`` with value ``python:/path/to/custom_hook.py:my_func_name``
166 167 3. Select :guilabel:`Save`
167 168
168 169 Also, see the |RC| Extensions section of the :ref:`rc-tools` guide. |RC|
@@ -18,8 +18,8 b' Prerequisites'
18 18 .. tip::
19 19
20 20 We recommend using Wandisco repositories which provide latest SVN versions
21 for most platforms. Below is example how to add the wandisco repositories
22 for Ubuntu.
21 for most platforms.
22 Here is an example how to add the Wandisco repositories for Ubuntu.
23 23
24 24 .. code-block:: bash
25 25
@@ -27,15 +27,28 b' Prerequisites'
27 27 $ sudo wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
28 28 $ sudo apt-get update
29 29
30
31 Using Ubuntu 14.04/16.04 Distribution as an example execute the following to
32 install required components:
30 Here is an example how to add the Wandisco repositories for Centos/Redhat. Using
31 a yum config
33 32
34 33 .. code-block:: bash
35 34
36 $ sudo apt-get install apache2 libapache2-mod-svn
35 [wandisco-Git]
36 name=CentOS-6 - Wandisco Git
37 baseurl=http://opensource.wandisco.com/centos/6/git/$basearch/
38 enabled=1
39 gpgcheck=1
40 gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
41
42
37 43
38 Once installed you need to enable ``dav_svn``:
44 Example installation of required components for Ubuntu platform:
45
46 .. code-block:: bash
47
48 $ sudo apt-get install apache2
49 $ sudo apt-get install libapache2-mod-svn
50
51 Once installed you need to enable ``dav_svn`` on Ubuntu:
39 52
40 53 .. code-block:: bash
41 54
@@ -44,6 +57,26 b' Once installed you need to enable ``dav_'
44 57 $ sudo a2enmod authn_anon
45 58
46 59
60 Example installation of required components for RedHat/CentOS platform:
61
62 .. code-block:: bash
63
64 $ sudo yum install httpd
65 $ sudo yum install subversion mod_dav_svn
66
67
68 Once installed you need to enable ``dav_svn`` on RedHat/CentOS:
69
70 .. code-block:: bash
71
72 sudo vi /etc/httpd/conf.modules.d/10-subversion.conf
73 ## The file should read:
74
75 LoadModule dav_svn_module modules/mod_dav_svn.so
76 LoadModule headers_module modules/mod_headers.so
77 LoadModule authn_anon_module modules/mod_authn_anon.so
78
79
47 80 Configuring Apache Setup
48 81 ========================
49 82
@@ -13,48 +13,4 b' dependencies for Python and JavaScript w'
13 13 this section to generate the needed Nix derivations.
14 14
15 15
16 Python dependencies
17 ===================
18
19 We use the tool `pip2nix` to generate the Nix derivations for our Python
20 dependencies.
21
22 Generating the dependencies should be done with the following command:
23
24 .. code:: shell
25
26 pip2nix generate --license
27
28
29 .. note::
30
31 License extraction support is still experimental, use the version from the
32 following pull request: https://github.com/ktosiek/pip2nix/pull/30
33
34
35
36 Node dependencies
37 =================
38
39 After adding new dependencies via ``npm install --save``, use `node2nix` to
40 update the corresponding Nix derivations:
41
42 .. code:: shell
43
44 cd pkgs
45 node2nix --input ../package.json \
46 -o node-packages.nix \
47 -e node-env.nix \
48 -c node-default.nix \
49 -d --flatten
50
51
52 Bower dependencies
53 ==================
54
55 Frontend dependencies are managed based on `bower`, with `bower2nix` a tool
56 exists which can generate the needed Nix derivations:
57
58 .. code:: shell
59
60 bower2nix bower.json pkgs/bower-packages.nix
16 Please check pkgs/README.rst file for mor information on how to build the packages.
@@ -14,12 +14,23 b' so to clarify what is meant each time, r'
14 14 between software components and can be used to trigger plugins, or their
15 15 extensions.
16 16
17 .. toctree::
17
18 Hooks
19 -----
20
21 Within |RCM| there are two types of supported hooks.
18 22
19 rcx
20 install-ext
21 config-ext
22 extensions
23 hooks
24 full-blown-example
25 int-slack
23 * **Internal built-in hooks**: The internal |hg|, |git| or |svn| hooks are
24 triggered by different VCS operations, like push, pull,
25 or clone and are non-configurable, but you can add your own VCS hooks,
26 see :ref:`custom-hooks`.
27 * **Custom rcextensions hooks**: User defined hooks centre around the lifecycle of
28 certain actions such are |repo| creation, user creation etc. The actions
29 these hooks trigger can be rejected based on the API permissions of the
30 user calling them.
31
32 On instructions how to use the custom `rcextensions`
33 see :ref:`integrations-rcextensions` section.
34
35
36
@@ -19,9 +19,7 b' Once configured you can check the settin'
19 19 ## Additionally these settings will be used by the RhodeCode mailing system ##
20 20 ################################################################################
21 21 #email_to = admin@localhost
22 #error_email_from = paste_error@localhost
23 22 #app_email_from = rhodecode-noreply@localhost
24 #error_message =
25 23 #email_prefix = [RhodeCode]
26 24
27 25 #smtp_server = mail.server.com
@@ -30,5 +28,3 b' Once configured you can check the settin'
30 28 #smtp_port =
31 29 #smtp_use_tls = false
32 30 #smtp_use_ssl = true
33 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
34 #smtp_auth =
@@ -3,7 +3,7 b''
3 3 Integrations
4 4 ------------
5 5
6 Rhodecode supports integrations with external services for various events,
6 |RCE| supports integrations with external services for various events,
7 7 such as commit pushes and pull requests. Multiple integrations of the same type
8 8 can be added at the same time; this is useful for posting different events to
9 9 different Slack channels, for example.
@@ -11,18 +11,20 b' different Slack channels, for example.'
11 11 Supported integrations
12 12 ^^^^^^^^^^^^^^^^^^^^^^
13 13
14 ============================ ============ =====================================
14 ================================ ============ ========================================
15 15 Type/Name |RC| Edition Description
16 ============================ ============ =====================================
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
16 ================================ ============ ========================================
17 :ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url
18 :ref:`integrations-slack` |RCCEshort| Integrate with https://slack.com/
19 :ref:`integrations-hipchat` |RCCEshort| Integrate with https://www.hipchat.com/
20 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
20 21 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
21 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
22 :ref:`integrations-rcextensions` |RCCEshort| Advanced low-level integration framework
23
22 24 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
23 25 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
24 26 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
25 ============================ ============ =====================================
27 ================================ ============ ========================================
26 28
27 29 .. _creating-integrations:
28 30
@@ -55,3 +57,4 b' See pages specific to each type of integ'
55 57 email
56 58 ci
57 59 jenkins
60 integrations-rcextensions
@@ -9,6 +9,7 b' Release Notes'
9 9 .. toctree::
10 10 :maxdepth: 1
11 11
12 release-notes-4.14.0.rst
12 13 release-notes-4.13.3.rst
13 14 release-notes-4.13.2.rst
14 15 release-notes-4.13.1.rst
@@ -1,6 +1,6 b''
1 1 .menuselection, .guilabel {
2 2 font-size: .90em;
3 font-family: "proximanovaregular", "Proxima Nova Regular", "Proxima Nova", sans-serif;
3 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
4 4 font-style: oblique;
5 5 }
6 6
@@ -273,107 +273,8 b' Use this to create or update a |RCE| con'
273 273 rhodecode-extensions
274 274 --------------------
275 275
276 |RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
277 additional code for push/pull/create/delete |repo| hooks. These hooks can be
278 used to send signals to build-bots such as jenkins. Options:
279
280 .. rst-class:: dl-horizontal
281
282 \-c, - -config <config_file>
283 Create a configuration file. The default file is created
284 in ``~/.rhoderc``
285
286 \-h, - -help
287 Show help messages.
288
289 \-F, - -format {json,pretty}
290 Set the formatted representation.
291
292 \-I, - -install-dir <str>
293 Set the location of the |RCE| installation. The default location is
294 :file:`/home/{user}/.rccontrol/`.
295
296 \ - -ini-file <str>
297 Path to the :file:`rhodecode.ini` file for that instance.
298
299 \ - -instance-name <instance-id>
300 Set the instance name.
301
302 \ - -plugins
303 Add plugins to your |RCE| installation. See the
304 :ref:`extensions-hooks-ref` section for more details.
305
306 \ - -version
307 Display your |RCT| version.
308
309
310 Once installed, you will see a :file:`rcextensions` folder in the instance
311 directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
312
313 To install ``rcextensions``, use the following example:
314
315 .. code-block:: bash
316
317 # install extensions on the given instance
318 # If using virtualenv prior to RCE 350
319 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
320 --ini-file=rhodecode.ini
321 Writen new extensions file to rcextensions
322
323 # install extensions with additional plugins on the given instance
324 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
325 --ini-file=rhodecode.ini --plugins
326 Writen new extensions file to rcextensions
327
328 # installing extensions from 350 onwards
329 # as they are packaged with RCE
330 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
331 --instance-name=enterprise-4 --ini-file=rhodecode.ini
332
333 Writen new extensions file to rcextensions
334
335 See the new extensions inside this directory for more details about the
336 additional hooks available, for example see the ``push_post.py`` file.
337
338 .. code-block:: python
339
340 import urllib
341 import urllib2
342
343 def run(*args, **kwargs):
344 """
345 Extra params
346
347 :param URL: url to send the data to
348 """
349
350 url = kwargs.pop('URL', None)
351 if url:
352 from rhodecode.lib.compat import json
353 from rhodecode.model.db import Repository
354
355 repo = Repository.get_by_repo_name(kwargs['repository'])
356 changesets = []
357 vcs_repo = repo.scm_instance_no_cache()
358 for r in kwargs['pushed_revs']:
359 cs = vcs_repo.get_changeset(r)
360 changesets.append(json.dumps(cs))
361
362 kwargs['pushed_revs'] = changesets
363 headers = {
364 'User-Agent': 'RhodeCode-SCM web hook',
365 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
366 'Accept': 'text/javascript, text/html, application/xml, '
367 'text/xml, */*',
368 'Accept-Encoding': 'gzip,deflate,sdch',
369 }
370
371 data = kwargs
372 data = urllib.urlencode(data)
373 req = urllib2.Request(url, data, headers)
374 response = urllib2.urlopen(req)
375 response.read()
376 return 0
276 The `rcextensions` since version 4.14 are now shipped together with |RCE| please check
277 the using :ref:`integrations-rcextensions` section.
377 278
378 279
379 280 rhodecode-gist
@@ -54,23 +54,13 b' packaged with |RCE| by default.'
54 54
55 55 .. code-block:: bash
56 56
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
58 --instance-name=enterprise-4 --ini-file=rhodecode.ini
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-api --instance-name=enterprise-4 get_ip [11:56:57 on 05/10/2018]
59 58
60 Writen new extensions file to rcextensions
61 Copied hipchat_push_notify.py plugin to rcextensions
62 Copied jira_pr_flow.py plugin to rcextensions
63 Copied default_reviewers.py plugin to rcextensions
64 Copied extract_commits.py plugin to rcextensions
65 Copied extract_issues.py plugin to rcextensions
66 Copied redmine_pr_flow.py plugin to rcextensions
67 Copied extra_fields.py plugin to rcextensions
68 Copied jira_smart_commits.py plugin to rcextensions
69 Copied http_notify.py plugin to rcextensions
70 Copied slack_push_notify.py plugin to rcextensions
71 Copied slack_message.py plugin to rcextensions
72 Copied extract_jira_issues.py plugin to rcextensions
73 Copied extract_redmine_issues.py plugin to rcextensions
74 Copied redmine_smart_commits.py plugin to rcextensions
75 Copied send_mail.py plugin to rcextensions
76
59 {
60 "error": null,
61 "id": 1000,
62 "result": {
63 "server_ip_addr": "1.2.3.4",
64 "user_ips": []
65 }
66 }
@@ -8,28 +8,26 b''
8 8 "src": "rhodecode/public/js/src",
9 9 "src_rc": "rhodecode/public/js/rhodecode",
10 10 "dest": "rhodecode/public/js",
11 "bower": "bower_components",
12 11 "node_modules": "node_modules"
13 12 }
14 13 },
15 14 "copy": {
16 15 "main": {
16 "files": [
17 {
17 18 "expand": true,
18 "cwd": "bower_components",
19 "src": "webcomponentsjs/webcomponents-lite.js",
19 "cwd": "node_modules/@webcomponents",
20 "src": "webcomponentsjs/*.*",
20 21 "dest": "<%= dirs.js.dest %>/vendors"
22 },
23 {
24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 }
27 ]
21 28 }
22 29 },
23 30 "concat": {
24 "polymercss": {
25 "src": [
26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
27 "<%= dirs.css.src %>/style-polymer.css",
28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
29 ],
30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
31 "nonull": true
32 },
33 31 "dist": {
34 32 "src": [
35 33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
@@ -37,6 +35,10 b''
37 35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
38 36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
39 37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
40 42 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
41 43 "<%= dirs.js.src %>/logging.js",
42 44 "<%= dirs.js.src %>/bootstrap.js",
@@ -89,22 +91,13 b''
89 91 "<%= dirs.js.src %>/rhodecode/tooltips.js",
90 92 "<%= dirs.js.src %>/rhodecode/users.js",
91 93 "<%= dirs.js.src %>/rhodecode/appenlight.js",
92 "<%= dirs.js.src %>/rhodecode.js"
94 "<%= dirs.js.src %>/rhodecode.js",
95 "<%= dirs.js.dest %>/rhodecode-components.js"
93 96 ],
94 97 "dest": "<%= dirs.js.dest %>/scripts.js",
95 98 "nonull": true
96 99 }
97 100 },
98 "crisper": {
99 "dist": {
100 "options": {
101 "cleanup": false,
102 "onlySplit": true
103 },
104 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
105 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
106 }
107 },
108 101 "less": {
109 102 "development": {
110 103 "options": {
@@ -152,8 +145,7 b''
152 145 "less:development",
153 146 "less:components",
154 147 "concat:polymercss",
155 "vulcanize",
156 "crisper",
148 "webpack",
157 149 "concat:dist"
158 150 ]
159 151 },
@@ -166,8 +158,7 b''
166 158 "tasks": [
167 159 "less:components",
168 160 "concat:polymercss",
169 "vulcanize",
170 "crisper",
161 "webpack",
171 162 "concat:dist"
172 163 ]
173 164 }
@@ -179,18 +170,5 b''
179 170 "jshintrc": ".jshintrc"
180 171 }
181 172 }
182 },
183 "vulcanize": {
184 "default": {
185 "options": {
186 "abspath": "",
187 "inlineScripts": true,
188 "inlineCss": true,
189 "stripComments": true
190 },
191 "files": {
192 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
193 173 }
194 174 }
195 }
196 }
@@ -1,6 +1,6 b''
1 1 {
2 2 "name": "rhodecode-enterprise",
3 "version": "1.0.0",
3 "version": "2.0.0",
4 4 "private": true,
5 5 "description" : "RhodeCode JS packaged",
6 6 "license": "SEE LICENSE IN LICENSE.txt",
@@ -9,25 +9,50 b''
9 9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 10 },
11 11 "devDependencies": {
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 "clipboard": "^2.0.1",
14 "exports-loader": "^0.6.4",
15 "favico.js": "^0.3.10",
12 16 "grunt": "^0.4.5",
17 "grunt-cli": "^1.3.1",
18 "grunt-contrib-concat": "^0.5.1",
13 19 "grunt-contrib-copy": "^1.0.0",
14 "grunt-contrib-concat": "^0.5.1",
15 20 "grunt-contrib-jshint": "^0.12.0",
16 21 "grunt-contrib-less": "^1.1.0",
17 22 "grunt-contrib-watch": "^0.6.1",
18 "crisper": "^2.1.1",
19 "vulcanize": "^1.16.0",
20 "grunt-crisper": "^1.0.1",
21 "grunt-vulcanize": "^1.0.0",
22 "node2nix": "^1.0.0",
23 "grunt-webpack": "^3.1.3",
24 "jquery": "1.11.3",
23 25 "jshint": "^2.9.1-rc3",
24 "bower": "^1.8.4",
25 "jquery": "1.11.3",
26 "favico.js": "^0.3.10",
27 "clipboard": "^2.0.1",
28 "qrious": "^4.0.2",
29 26 "moment": "^2.18.1",
30 27 "mousetrap": "^1.6.1",
31 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
28 "qrious": "^4.0.2",
29 "sticky-sidebar": "3.3.1",
30 "waypoints": "4.0.1",
31 "webpack": "4.23.1",
32 "webpack-cli": "3.1.2",
33 "babel-core": "^6.26.3",
34 "babel-loader": "^7.1.2",
35 "babel-plugin-transform-object-rest-spread": "^6.26.0",
36 "babel-preset-env": "^1.6.0",
37 "copy-webpack-plugin": "^4.4.2",
38 "css-loader": "^0.28.11",
39 "html-loader": "^0.4.4",
40 "html-webpack-plugin": "^3.2.0",
41 "imports-loader": "^0.7.1",
42 "polymer-webpack-loader": "^2.0.1",
43 "style-loader": "^0.21.0",
44 "webpack-uglify-js-plugin": "^1.1.9",
45 "raw-loader": "1.0.0-beta.0",
46 "ts-loader": "^1.3.3",
47 "@webcomponents/webcomponentsjs": "^2.0.0",
48 "@polymer/polymer": "^3.0.0",
49 "@polymer/paper-button": "^3.0.0",
50 "@polymer/paper-spinner": "^3.0.0",
51 "@polymer/paper-tooltip": "^3.0.0",
52 "@polymer/paper-toast": "^3.0.0",
53 "@polymer/paper-toggle-button": "^3.0.0",
54 "@polymer/iron-ajax": "^3.0.0",
55 "@polymer/iron-autogrow-textarea": "^3.0.0",
56 "@polymer/iron-a11y-keys": "^3.0.0"
32 57 }
33 58 }
@@ -27,24 +27,29 b' Python dependencies'
27 27 NodeJS dependencies
28 28 ===================
29 29
30 Generate node-packages.nix file with all dependencies from NPM and package.json file
31 This should be run before entering nix-shell.
32
33 The sed at the end fixes a bug with http rewrite of re-generated packages
34
30 35 .. code:: shell
31 36
32 rm -rf node_modules
37 rm -rf node_modules &&
33 38 nix-shell pkgs/shell-generate.nix --command "
34 39 node2nix --input package.json \
35 40 -o pkgs/node-packages.nix \
36 41 -e pkgs/node-env.nix \
37 42 -c pkgs/node-default.nix \
38 -d --flatten --nodejs-6 "
43 -d --flatten --nodejs-8 " &&
44 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
39 45
40 46
41
42 Bower dependencies
43 ==================
47 Generate license data
48 =====================
44 49
45 50 .. code:: shell
46 51
47 nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix"
52 nix-build pkgs/license-generate.nix -o result-license && cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json
48 53
49 54
50 55 .. Links
@@ -2,9 +2,9 b''
2 2 #
3 3 # Usage:
4 4 #
5 # nix-build -I ~/dev license.nix -A result
5 # nix-build license.nix -o result-license
6 6 #
7 # Afterwards ./result will contain the license information as JSON files.
7 # Afterwards ./result-license will contain the license information as JSON files.
8 8 #
9 9 #
10 10 # Overview
@@ -19,7 +19,7 b''
19 19 # dependencies. The results from step 1 are then limited to the ones which
20 20 # are in this list.
21 21 #
22 # The result is then available in ./result/license.json.
22 # The result is then available in ./result-license/license.json.
23 23 #
24 24
25 25
@@ -32,20 +32,20 b' let'
32 32 # Enterprise as simple as possible, goal here is just to identify the runtime
33 33 # dependencies. Ideally we could avoid building Enterprise at all and somehow
34 34 # figure it out without calling into nix-store.
35 enterprise = import ./default.nix {
35 enterprise = import ../default.nix {
36 36 doCheck = false;
37 37 };
38 38
39 39 # For a given derivation, return the list of all dependencies
40 40 drvToDependencies = drv: nixpkgs.lib.flatten [
41 drv.nativeBuildInputs or []
42 drv.propagatedNativeBuildInputs or []
41 drv.buildInputs or []
42 drv.propagatedBuildInputs or []
43 43 ];
44 44
45 45 # Transform the given derivation into the meta information which we need in
46 46 # the resulting JSON files.
47 47 drvToMeta = drv: {
48 name = drv.name or "UNNAMED";
48 name = drv.name or drv;
49 49 license = if drv ? meta.license then drv.meta.license else "UNKNOWN";
50 50 };
51 51
@@ -70,10 +70,8 b' let'
70 70 rawStorePaths = nixpkgs.lib.removeSuffix "\n" (
71 71 builtins.readFile srcPath);
72 72 storePaths = nixpkgs.lib.splitString "\n" rawStorePaths;
73 # TODO: johbo: Would be nice to use some sort of utility here to convert
74 # the path to a derivation name.
75 73 storePathPrefix = (
76 builtins.stringLength "/nix/store/zwy7aavnif9ayw30rya1k6xiacafzzl6-");
74 builtins.stringLength "/nix/store/afafafafafafafafafafafafafafafaf-");
77 75 storePathToName = path:
78 76 builtins.substring storePathPrefix (builtins.stringLength path) path;
79 77 in (map storePathToName storePaths);
@@ -147,6 +145,7 b' in rec {'
147 145 cat > build/licenses.json <<EOF
148 146 ${builtins.toJSON enterpriseRuntimeLicenses}
149 147 EOF
148
150 149 '';
151 150
152 151 installPhase = ''
@@ -2,7 +2,7 b''
2 2
3 3 {pkgs ? import <nixpkgs> {
4 4 inherit system;
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}:
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-8_x"}:
6 6
7 7 let
8 8 nodeEnv = import ./node-env.nix {
This diff has been collapsed as it changes many lines, (7633 lines changed) Show them Hide them
@@ -4,6 +4,222 b''
4 4
5 5 let
6 6 sources = {
7 "@polymer/font-roboto-3.0.2" = {
8 name = "_at_polymer_slash_font-roboto";
9 packageName = "@polymer/font-roboto";
10 version = "3.0.2";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz";
13 sha512 = "tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==";
14 };
15 };
16 "@polymer/iron-a11y-announcer-3.0.1" = {
17 name = "_at_polymer_slash_iron-a11y-announcer";
18 packageName = "@polymer/iron-a11y-announcer";
19 version = "3.0.1";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.0.1.tgz";
22 sha512 = "Xiqmpz0AEEbMNGYPpbrXBIrcI/xaR4tn77pmSLfxVKGGwjEUR/YrRgyIwXp4EN7lvst1dFC8kyl2hLga0uDIVQ==";
23 };
24 };
25 "@polymer/iron-a11y-keys-3.0.1" = {
26 name = "_at_polymer_slash_iron-a11y-keys";
27 packageName = "@polymer/iron-a11y-keys";
28 version = "3.0.1";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@polymer/iron-a11y-keys/-/iron-a11y-keys-3.0.1.tgz";
31 sha512 = "zmTi8xHeY4ZMJLAitW2hAmW5zXZ35hVy/eHQUFadAlOccuBK3oRRmoPRQRaZgpyJrCVFDAQRXXzzJtUDil/0CA==";
32 };
33 };
34 "@polymer/iron-a11y-keys-behavior-3.0.1" = {
35 name = "_at_polymer_slash_iron-a11y-keys-behavior";
36 packageName = "@polymer/iron-a11y-keys-behavior";
37 version = "3.0.1";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.1.tgz";
40 sha512 = "lnrjKq3ysbBPT/74l0Fj0U9H9C35Tpw2C/tpJ8a+5g8Y3YJs1WSZYnEl1yOkw6sEyaxOq/1DkzH0+60gGu5/PQ==";
41 };
42 };
43 "@polymer/iron-ajax-3.0.1" = {
44 name = "_at_polymer_slash_iron-ajax";
45 packageName = "@polymer/iron-ajax";
46 version = "3.0.1";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@polymer/iron-ajax/-/iron-ajax-3.0.1.tgz";
49 sha512 = "7+TPEAfWsRdhj1Y8UeF1759ktpVu+c3sG16rJiUC3wF9+woQ9xI1zUm2d59i7Yc3aDEJrR/Q8Y262KlOvyGVNg==";
50 };
51 };
52 "@polymer/iron-autogrow-textarea-3.0.1" = {
53 name = "_at_polymer_slash_iron-autogrow-textarea";
54 packageName = "@polymer/iron-autogrow-textarea";
55 version = "3.0.1";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.1.tgz";
58 sha512 = "FgSL7APrOSL9Vu812sBCFlQ17hvnJsBAV2C2e1UAiaHhB+dyfLq8gGdGUpqVWuGJ50q4Y/49QwCNnLf85AdVYA==";
59 };
60 };
61 "@polymer/iron-behaviors-3.0.1" = {
62 name = "_at_polymer_slash_iron-behaviors";
63 packageName = "@polymer/iron-behaviors";
64 version = "3.0.1";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@polymer/iron-behaviors/-/iron-behaviors-3.0.1.tgz";
67 sha512 = "IMEwcv1lhf1HSQxuyWOUIL0lOBwmeaoSTpgCJeP9IBYnuB1SPQngmfRuHKgK6/m9LQ9F9miC7p3HeQQUdKAE0w==";
68 };
69 };
70 "@polymer/iron-checked-element-behavior-3.0.1" = {
71 name = "_at_polymer_slash_iron-checked-element-behavior";
72 packageName = "@polymer/iron-checked-element-behavior";
73 version = "3.0.1";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.1.tgz";
76 sha512 = "aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA==";
77 };
78 };
79 "@polymer/iron-fit-behavior-3.0.1" = {
80 name = "_at_polymer_slash_iron-fit-behavior";
81 packageName = "@polymer/iron-fit-behavior";
82 version = "3.0.1";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.1.tgz";
85 sha512 = "/M0B1L30k31vmwNBaGuZcxzUAhJSHoGccb/DF0CDKI/hT8UlkTvcyemaWdOpmHHLgY52ceKIkRwA3AeXrKyvaQ==";
86 };
87 };
88 "@polymer/iron-flex-layout-3.0.1" = {
89 name = "_at_polymer_slash_iron-flex-layout";
90 packageName = "@polymer/iron-flex-layout";
91 version = "3.0.1";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz";
94 sha512 = "7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==";
95 };
96 };
97 "@polymer/iron-form-element-behavior-3.0.1" = {
98 name = "_at_polymer_slash_iron-form-element-behavior";
99 packageName = "@polymer/iron-form-element-behavior";
100 version = "3.0.1";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.1.tgz";
103 sha512 = "G/e2KXyL5AY7mMjmomHkGpgS0uAf4ovNpKhkuUTRnMuMJuf589bKqE85KN4ovE1Tzhv2hJoh/igyD6ekHiYU1A==";
104 };
105 };
106 "@polymer/iron-meta-3.0.1" = {
107 name = "_at_polymer_slash_iron-meta";
108 packageName = "@polymer/iron-meta";
109 version = "3.0.1";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.1.tgz";
112 sha512 = "pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==";
113 };
114 };
115 "@polymer/iron-overlay-behavior-3.0.2" = {
116 name = "_at_polymer_slash_iron-overlay-behavior";
117 packageName = "@polymer/iron-overlay-behavior";
118 version = "3.0.2";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.2.tgz";
121 sha512 = "j1qmt6mJHCwpe1mKOvqK5kcCUPQr5LSrlqpgRDbUuLgUfNJ/vGTipjrkBlfbEUagm5FEQdc1VLPLSQP6WVuP9g==";
122 };
123 };
124 "@polymer/iron-resizable-behavior-3.0.1" = {
125 name = "_at_polymer_slash_iron-resizable-behavior";
126 packageName = "@polymer/iron-resizable-behavior";
127 version = "3.0.1";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.1.tgz";
130 sha512 = "FyHxRxFspVoRaeZSWpT3y0C9awomb4tXXolIJcZ7RvXhMP632V5lez+ch5G5SwK0LpnAPkg35eB0LPMFv+YMMQ==";
131 };
132 };
133 "@polymer/iron-validatable-behavior-3.0.1" = {
134 name = "_at_polymer_slash_iron-validatable-behavior";
135 packageName = "@polymer/iron-validatable-behavior";
136 version = "3.0.1";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.1.tgz";
139 sha512 = "wwpYh6wOa4fNI+jH5EYKC7TVPYQ2OfgQqocWat7GsNWcsblKYhLYbwsvEY5nO0n2xKqNfZzDLrUom5INJN7msQ==";
140 };
141 };
142 "@polymer/paper-behaviors-3.0.1" = {
143 name = "_at_polymer_slash_paper-behaviors";
144 packageName = "@polymer/paper-behaviors";
145 version = "3.0.1";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@polymer/paper-behaviors/-/paper-behaviors-3.0.1.tgz";
148 sha512 = "6knhj69fPJejv8qR0kCSUY+Q0XjaUf0OSnkjRjmTJPAwSrRYtgqE+l6P1FfA+py1X/cUjgne9EF5rMZAKJIg1g==";
149 };
150 };
151 "@polymer/paper-button-3.0.1" = {
152 name = "_at_polymer_slash_paper-button";
153 packageName = "@polymer/paper-button";
154 version = "3.0.1";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@polymer/paper-button/-/paper-button-3.0.1.tgz";
157 sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==";
158 };
159 };
160 "@polymer/paper-ripple-3.0.1" = {
161 name = "_at_polymer_slash_paper-ripple";
162 packageName = "@polymer/paper-ripple";
163 version = "3.0.1";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.1.tgz";
166 sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg==";
167 };
168 };
169 "@polymer/paper-spinner-3.0.1" = {
170 name = "_at_polymer_slash_paper-spinner";
171 packageName = "@polymer/paper-spinner";
172 version = "3.0.1";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@polymer/paper-spinner/-/paper-spinner-3.0.1.tgz";
175 sha512 = "MYIU6qWZnhZ5yNFOBzROPgBteGfxKEnDZ6bCgjrvUtJkBuQEz0MQZzSE/zmZc0oaJ9u5QK5xAFuYdudsGv7+sQ==";
176 };
177 };
178 "@polymer/paper-styles-3.0.1" = {
179 name = "_at_polymer_slash_paper-styles";
180 packageName = "@polymer/paper-styles";
181 version = "3.0.1";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.1.tgz";
184 sha512 = "y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g==";
185 };
186 };
187 "@polymer/paper-toast-3.0.1" = {
188 name = "_at_polymer_slash_paper-toast";
189 packageName = "@polymer/paper-toast";
190 version = "3.0.1";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.1.tgz";
193 sha512 = "pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ==";
194 };
195 };
196 "@polymer/paper-toggle-button-3.0.1" = {
197 name = "_at_polymer_slash_paper-toggle-button";
198 packageName = "@polymer/paper-toggle-button";
199 version = "3.0.1";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@polymer/paper-toggle-button/-/paper-toggle-button-3.0.1.tgz";
202 sha512 = "jadZB60fycT7YnSAH0H23LYo6/2HYmMZTtNr9LpdSIRFPLX6mqqxewex92cFz019bMKaRJgORn308hRlJo2u6A==";
203 };
204 };
205 "@polymer/paper-tooltip-3.0.1" = {
206 name = "_at_polymer_slash_paper-tooltip";
207 packageName = "@polymer/paper-tooltip";
208 version = "3.0.1";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz";
211 sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==";
212 };
213 };
214 "@polymer/polymer-3.1.0" = {
215 name = "_at_polymer_slash_polymer";
216 packageName = "@polymer/polymer";
217 version = "3.1.0";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.1.0.tgz";
220 sha512 = "hwN8IMERsFATz/9dSMxYHL+84J9uBkPuuarxJWlTsppZ4CAYTZKnepBfNrKoyNsafBmA3yXBiiKPPf+fJtza7A==";
221 };
222 };
7 223 "@types/clone-0.1.30" = {
8 224 name = "_at_types_slash_clone";
9 225 packageName = "@types/clone";
@@ -13,31 +229,220 b' let'
13 229 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
14 230 };
15 231 };
16 "@types/node-4.2.23" = {
17 name = "_at_types_slash_node";
18 packageName = "@types/node";
19 version = "4.2.23";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz";
22 sha512 = "U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==";
23 };
24 };
25 "@types/node-6.0.114" = {
232 "@types/node-6.14.0" = {
26 233 name = "_at_types_slash_node";
27 234 packageName = "@types/node";
28 version = "6.0.114";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz";
31 sha512 = "5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==";
32 };
33 };
34 "@types/parse5-0.0.31" = {
235 version = "6.14.0";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.0.tgz";
238 sha512 = "6tQyh4Q4B5pECcXBOQDZ5KjyBIxRZGzrweGPM47sAYTdVG4+7R+2EGMTmp0h6ZwgqHrFRCeg2gdhsG9xXEl2Sg==";
239 };
240 };
241 "@types/parse5-2.2.34" = {
35 242 name = "_at_types_slash_parse5";
36 243 packageName = "@types/parse5";
37 version = "0.0.31";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
40 sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7";
244 version = "2.2.34";
245 src = fetchurl {
246 url = "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz";
247 sha1 = "e3870a10e82735a720f62d71dcd183ba78ef3a9d";
248 };
249 };
250 "@webassemblyjs/ast-1.7.10" = {
251 name = "_at_webassemblyjs_slash_ast";
252 packageName = "@webassemblyjs/ast";
253 version = "1.7.10";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz";
256 sha512 = "wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==";
257 };
258 };
259 "@webassemblyjs/floating-point-hex-parser-1.7.10" = {
260 name = "_at_webassemblyjs_slash_floating-point-hex-parser";
261 packageName = "@webassemblyjs/floating-point-hex-parser";
262 version = "1.7.10";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz";
265 sha512 = "gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==";
266 };
267 };
268 "@webassemblyjs/helper-api-error-1.7.10" = {
269 name = "_at_webassemblyjs_slash_helper-api-error";
270 packageName = "@webassemblyjs/helper-api-error";
271 version = "1.7.10";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz";
274 sha512 = "DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==";
275 };
276 };
277 "@webassemblyjs/helper-buffer-1.7.10" = {
278 name = "_at_webassemblyjs_slash_helper-buffer";
279 packageName = "@webassemblyjs/helper-buffer";
280 version = "1.7.10";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz";
283 sha512 = "+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==";
284 };
285 };
286 "@webassemblyjs/helper-code-frame-1.7.10" = {
287 name = "_at_webassemblyjs_slash_helper-code-frame";
288 packageName = "@webassemblyjs/helper-code-frame";
289 version = "1.7.10";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz";
292 sha512 = "UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==";
293 };
294 };
295 "@webassemblyjs/helper-fsm-1.7.10" = {
296 name = "_at_webassemblyjs_slash_helper-fsm";
297 packageName = "@webassemblyjs/helper-fsm";
298 version = "1.7.10";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz";
301 sha512 = "w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==";
302 };
303 };
304 "@webassemblyjs/helper-module-context-1.7.10" = {
305 name = "_at_webassemblyjs_slash_helper-module-context";
306 packageName = "@webassemblyjs/helper-module-context";
307 version = "1.7.10";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz";
310 sha512 = "yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==";
311 };
312 };
313 "@webassemblyjs/helper-wasm-bytecode-1.7.10" = {
314 name = "_at_webassemblyjs_slash_helper-wasm-bytecode";
315 packageName = "@webassemblyjs/helper-wasm-bytecode";
316 version = "1.7.10";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz";
319 sha512 = "u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==";
320 };
321 };
322 "@webassemblyjs/helper-wasm-section-1.7.10" = {
323 name = "_at_webassemblyjs_slash_helper-wasm-section";
324 packageName = "@webassemblyjs/helper-wasm-section";
325 version = "1.7.10";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz";
328 sha512 = "Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==";
329 };
330 };
331 "@webassemblyjs/ieee754-1.7.10" = {
332 name = "_at_webassemblyjs_slash_ieee754";
333 packageName = "@webassemblyjs/ieee754";
334 version = "1.7.10";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz";
337 sha512 = "HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==";
338 };
339 };
340 "@webassemblyjs/leb128-1.7.10" = {
341 name = "_at_webassemblyjs_slash_leb128";
342 packageName = "@webassemblyjs/leb128";
343 version = "1.7.10";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz";
346 sha512 = "og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==";
347 };
348 };
349 "@webassemblyjs/utf8-1.7.10" = {
350 name = "_at_webassemblyjs_slash_utf8";
351 packageName = "@webassemblyjs/utf8";
352 version = "1.7.10";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz";
355 sha512 = "Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==";
356 };
357 };
358 "@webassemblyjs/wasm-edit-1.7.10" = {
359 name = "_at_webassemblyjs_slash_wasm-edit";
360 packageName = "@webassemblyjs/wasm-edit";
361 version = "1.7.10";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz";
364 sha512 = "e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==";
365 };
366 };
367 "@webassemblyjs/wasm-gen-1.7.10" = {
368 name = "_at_webassemblyjs_slash_wasm-gen";
369 packageName = "@webassemblyjs/wasm-gen";
370 version = "1.7.10";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz";
373 sha512 = "M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==";
374 };
375 };
376 "@webassemblyjs/wasm-opt-1.7.10" = {
377 name = "_at_webassemblyjs_slash_wasm-opt";
378 packageName = "@webassemblyjs/wasm-opt";
379 version = "1.7.10";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz";
382 sha512 = "R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==";
383 };
384 };
385 "@webassemblyjs/wasm-parser-1.7.10" = {
386 name = "_at_webassemblyjs_slash_wasm-parser";
387 packageName = "@webassemblyjs/wasm-parser";
388 version = "1.7.10";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz";
391 sha512 = "AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==";
392 };
393 };
394 "@webassemblyjs/wast-parser-1.7.10" = {
395 name = "_at_webassemblyjs_slash_wast-parser";
396 packageName = "@webassemblyjs/wast-parser";
397 version = "1.7.10";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz";
400 sha512 = "YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==";
401 };
402 };
403 "@webassemblyjs/wast-printer-1.7.10" = {
404 name = "_at_webassemblyjs_slash_wast-printer";
405 packageName = "@webassemblyjs/wast-printer";
406 version = "1.7.10";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz";
409 sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==";
410 };
411 };
412 "@webcomponents/shadycss-1.5.2" = {
413 name = "_at_webcomponents_slash_shadycss";
414 packageName = "@webcomponents/shadycss";
415 version = "1.5.2";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.5.2.tgz";
418 sha512 = "0OyrmVc7S+INtzoqP2ofAo+OdVn2Nj0Qvq4wD9FEGN7nMmLRxaD2mzy6hD6EslzxUSuGH302CDU4KXiY66SEqg==";
419 };
420 };
421 "@webcomponents/webcomponentsjs-2.1.3" = {
422 name = "_at_webcomponents_slash_webcomponentsjs";
423 packageName = "@webcomponents/webcomponentsjs";
424 version = "2.1.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.1.3.tgz";
427 sha512 = "0UHJNY88lR3pnEYtBVT7F8cuuxOiITQGWJa0LxoELqkBSB7IabzJFOj5K99PajD3CGAsWpjB0CAeijfe376Y1w==";
428 };
429 };
430 "@xtuc/ieee754-1.2.0" = {
431 name = "_at_xtuc_slash_ieee754";
432 packageName = "@xtuc/ieee754";
433 version = "1.2.0";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
436 sha512 = "DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==";
437 };
438 };
439 "@xtuc/long-4.2.1" = {
440 name = "_at_xtuc_slash_long";
441 packageName = "@xtuc/long";
442 version = "4.2.1";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz";
445 sha512 = "FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==";
41 446 };
42 447 };
43 448 "abbrev-1.1.1" = {
@@ -58,13 +463,22 b' let'
58 463 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
59 464 };
60 465 };
61 "acorn-5.7.1" = {
466 "acorn-5.7.3" = {
62 467 name = "acorn";
63 468 packageName = "acorn";
64 version = "5.7.1";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz";
67 sha512 = "d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==";
469 version = "5.7.3";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
472 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
473 };
474 };
475 "acorn-dynamic-import-3.0.0" = {
476 name = "acorn-dynamic-import";
477 packageName = "acorn-dynamic-import";
478 version = "3.0.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz";
481 sha512 = "zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==";
68 482 };
69 483 };
70 484 "acorn-jsx-3.0.1" = {
@@ -85,6 +499,42 b' let'
85 499 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
86 500 };
87 501 };
502 "ajv-6.5.4" = {
503 name = "ajv";
504 packageName = "ajv";
505 version = "6.5.4";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz";
508 sha512 = "4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==";
509 };
510 };
511 "ajv-keywords-3.2.0" = {
512 name = "ajv-keywords";
513 packageName = "ajv-keywords";
514 version = "3.2.0";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
517 sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
518 };
519 };
520 "align-text-0.1.4" = {
521 name = "align-text";
522 packageName = "align-text";
523 version = "0.1.4";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz";
526 sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
527 };
528 };
529 "alphanum-sort-1.0.2" = {
530 name = "alphanum-sort";
531 packageName = "alphanum-sort";
532 version = "1.0.2";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
535 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
536 };
537 };
88 538 "amdefine-1.0.1" = {
89 539 name = "amdefine";
90 540 packageName = "amdefine";
@@ -94,15 +544,6 b' let'
94 544 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
95 545 };
96 546 };
97 "ansi-escape-sequences-3.0.0" = {
98 name = "ansi-escape-sequences";
99 packageName = "ansi-escape-sequences";
100 version = "3.0.0";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz";
103 sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e";
104 };
105 };
106 547 "ansi-regex-0.2.1" = {
107 548 name = "ansi-regex";
108 549 packageName = "ansi-regex";
@@ -121,6 +562,15 b' let'
121 562 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
122 563 };
123 564 };
565 "ansi-regex-3.0.0" = {
566 name = "ansi-regex";
567 packageName = "ansi-regex";
568 version = "3.0.0";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
571 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
572 };
573 };
124 574 "ansi-styles-1.1.0" = {
125 575 name = "ansi-styles";
126 576 packageName = "ansi-styles";
@@ -139,6 +589,24 b' let'
139 589 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
140 590 };
141 591 };
592 "ansi-styles-3.2.1" = {
593 name = "ansi-styles";
594 packageName = "ansi-styles";
595 version = "3.2.1";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
598 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
599 };
600 };
601 "anymatch-2.0.0" = {
602 name = "anymatch";
603 packageName = "anymatch";
604 version = "2.0.0";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz";
607 sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==";
608 };
609 };
142 610 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
143 611 name = "appenlight-client";
144 612 packageName = "appenlight-client";
@@ -158,15 +626,6 b' let'
158 626 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
159 627 };
160 628 };
161 "are-we-there-yet-1.1.5" = {
162 name = "are-we-there-yet";
163 packageName = "are-we-there-yet";
164 version = "1.1.5";
165 src = fetchurl {
166 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
167 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
168 };
169 };
170 629 "argparse-0.1.16" = {
171 630 name = "argparse";
172 631 packageName = "argparse";
@@ -176,13 +635,94 b' let'
176 635 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
177 636 };
178 637 };
179 "array-back-1.0.4" = {
180 name = "array-back";
181 packageName = "array-back";
182 version = "1.0.4";
183 src = fetchurl {
184 url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz";
185 sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b";
638 "argparse-1.0.10" = {
639 name = "argparse";
640 packageName = "argparse";
641 version = "1.0.10";
642 src = fetchurl {
643 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
644 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
645 };
646 };
647 "arr-diff-4.0.0" = {
648 name = "arr-diff";
649 packageName = "arr-diff";
650 version = "4.0.0";
651 src = fetchurl {
652 url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz";
653 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
654 };
655 };
656 "arr-flatten-1.1.0" = {
657 name = "arr-flatten";
658 packageName = "arr-flatten";
659 version = "1.1.0";
660 src = fetchurl {
661 url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
662 sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
663 };
664 };
665 "arr-union-3.1.0" = {
666 name = "arr-union";
667 packageName = "arr-union";
668 version = "3.1.0";
669 src = fetchurl {
670 url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
671 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
672 };
673 };
674 "array-each-1.0.1" = {
675 name = "array-each";
676 packageName = "array-each";
677 version = "1.0.1";
678 src = fetchurl {
679 url = "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz";
680 sha1 = "a794af0c05ab1752846ee753a1f211a05ba0c44f";
681 };
682 };
683 "array-slice-1.1.0" = {
684 name = "array-slice";
685 packageName = "array-slice";
686 version = "1.1.0";
687 src = fetchurl {
688 url = "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz";
689 sha512 = "B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==";
690 };
691 };
692 "array-union-1.0.2" = {
693 name = "array-union";
694 packageName = "array-union";
695 version = "1.0.2";
696 src = fetchurl {
697 url = "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz";
698 sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
699 };
700 };
701 "array-uniq-1.0.3" = {
702 name = "array-uniq";
703 packageName = "array-uniq";
704 version = "1.0.3";
705 src = fetchurl {
706 url = "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz";
707 sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
708 };
709 };
710 "array-unique-0.3.2" = {
711 name = "array-unique";
712 packageName = "array-unique";
713 version = "0.3.2";
714 src = fetchurl {
715 url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";
716 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
717 };
718 };
719 "arrify-1.0.1" = {
720 name = "arrify";
721 packageName = "arrify";
722 version = "1.0.1";
723 src = fetchurl {
724 url = "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz";
725 sha1 = "898508da2226f380df904728456849c1501a4b0d";
186 726 };
187 727 };
188 728 "asap-2.0.6" = {
@@ -194,13 +734,31 b' let'
194 734 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
195 735 };
196 736 };
197 "asn1-0.2.3" = {
737 "asn1-0.2.4" = {
198 738 name = "asn1";
199 739 packageName = "asn1";
200 version = "0.2.3";
201 src = fetchurl {
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
203 sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
740 version = "0.2.4";
741 src = fetchurl {
742 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
743 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
744 };
745 };
746 "asn1.js-4.10.1" = {
747 name = "asn1.js";
748 packageName = "asn1.js";
749 version = "4.10.1";
750 src = fetchurl {
751 url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz";
752 sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==";
753 };
754 };
755 "assert-1.4.1" = {
756 name = "assert";
757 packageName = "assert";
758 version = "1.4.1";
759 src = fetchurl {
760 url = "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz";
761 sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
204 762 };
205 763 };
206 764 "assert-plus-0.2.0" = {
@@ -221,6 +779,24 b' let'
221 779 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
222 780 };
223 781 };
782 "assign-symbols-1.0.0" = {
783 name = "assign-symbols";
784 packageName = "assign-symbols";
785 version = "1.0.0";
786 src = fetchurl {
787 url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz";
788 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
789 };
790 };
791 "ast-types-0.9.6" = {
792 name = "ast-types";
793 packageName = "ast-types";
794 version = "0.9.6";
795 src = fetchurl {
796 url = "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz";
797 sha1 = "102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9";
798 };
799 };
224 800 "async-0.1.22" = {
225 801 name = "async";
226 802 packageName = "async";
@@ -257,6 +833,15 b' let'
257 833 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
258 834 };
259 835 };
836 "async-each-1.0.1" = {
837 name = "async-each";
838 packageName = "async-each";
839 version = "1.0.1";
840 src = fetchurl {
841 url = "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz";
842 sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
843 };
844 };
260 845 "asynckit-0.4.0" = {
261 846 name = "asynckit";
262 847 packageName = "asynckit";
@@ -266,6 +851,24 b' let'
266 851 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
267 852 };
268 853 };
854 "atob-2.1.2" = {
855 name = "atob";
856 packageName = "atob";
857 version = "2.1.2";
858 src = fetchurl {
859 url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz";
860 sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==";
861 };
862 };
863 "autoprefixer-6.7.7" = {
864 name = "autoprefixer";
865 packageName = "autoprefixer";
866 version = "6.7.7";
867 src = fetchurl {
868 url = "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz";
869 sha1 = "1dbd1c835658e35ce3f9984099db00585c782014";
870 };
871 };
269 872 "aws-sign2-0.6.0" = {
270 873 name = "aws-sign2";
271 874 packageName = "aws-sign2";
@@ -275,22 +878,472 b' let'
275 878 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
276 879 };
277 880 };
278 "aws4-1.7.0" = {
881 "aws4-1.8.0" = {
279 882 name = "aws4";
280 883 packageName = "aws4";
884 version = "1.8.0";
885 src = fetchurl {
886 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
887 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
888 };
889 };
890 "babel-code-frame-6.26.0" = {
891 name = "babel-code-frame";
892 packageName = "babel-code-frame";
893 version = "6.26.0";
894 src = fetchurl {
895 url = "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
896 sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
897 };
898 };
899 "babel-core-6.26.3" = {
900 name = "babel-core";
901 packageName = "babel-core";
902 version = "6.26.3";
903 src = fetchurl {
904 url = "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz";
905 sha512 = "6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==";
906 };
907 };
908 "babel-generator-6.26.1" = {
909 name = "babel-generator";
910 packageName = "babel-generator";
911 version = "6.26.1";
912 src = fetchurl {
913 url = "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz";
914 sha512 = "HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==";
915 };
916 };
917 "babel-helper-builder-binary-assignment-operator-visitor-6.24.1" = {
918 name = "babel-helper-builder-binary-assignment-operator-visitor";
919 packageName = "babel-helper-builder-binary-assignment-operator-visitor";
920 version = "6.24.1";
921 src = fetchurl {
922 url = "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz";
923 sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664";
924 };
925 };
926 "babel-helper-call-delegate-6.24.1" = {
927 name = "babel-helper-call-delegate";
928 packageName = "babel-helper-call-delegate";
929 version = "6.24.1";
930 src = fetchurl {
931 url = "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz";
932 sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d";
933 };
934 };
935 "babel-helper-define-map-6.26.0" = {
936 name = "babel-helper-define-map";
937 packageName = "babel-helper-define-map";
938 version = "6.26.0";
939 src = fetchurl {
940 url = "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz";
941 sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f";
942 };
943 };
944 "babel-helper-explode-assignable-expression-6.24.1" = {
945 name = "babel-helper-explode-assignable-expression";
946 packageName = "babel-helper-explode-assignable-expression";
947 version = "6.24.1";
948 src = fetchurl {
949 url = "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz";
950 sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa";
951 };
952 };
953 "babel-helper-function-name-6.24.1" = {
954 name = "babel-helper-function-name";
955 packageName = "babel-helper-function-name";
956 version = "6.24.1";
957 src = fetchurl {
958 url = "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz";
959 sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9";
960 };
961 };
962 "babel-helper-get-function-arity-6.24.1" = {
963 name = "babel-helper-get-function-arity";
964 packageName = "babel-helper-get-function-arity";
965 version = "6.24.1";
966 src = fetchurl {
967 url = "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz";
968 sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d";
969 };
970 };
971 "babel-helper-hoist-variables-6.24.1" = {
972 name = "babel-helper-hoist-variables";
973 packageName = "babel-helper-hoist-variables";
974 version = "6.24.1";
975 src = fetchurl {
976 url = "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz";
977 sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76";
978 };
979 };
980 "babel-helper-optimise-call-expression-6.24.1" = {
981 name = "babel-helper-optimise-call-expression";
982 packageName = "babel-helper-optimise-call-expression";
983 version = "6.24.1";
984 src = fetchurl {
985 url = "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz";
986 sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257";
987 };
988 };
989 "babel-helper-regex-6.26.0" = {
990 name = "babel-helper-regex";
991 packageName = "babel-helper-regex";
992 version = "6.26.0";
993 src = fetchurl {
994 url = "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz";
995 sha1 = "325c59f902f82f24b74faceed0363954f6495e72";
996 };
997 };
998 "babel-helper-remap-async-to-generator-6.24.1" = {
999 name = "babel-helper-remap-async-to-generator";
1000 packageName = "babel-helper-remap-async-to-generator";
1001 version = "6.24.1";
1002 src = fetchurl {
1003 url = "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz";
1004 sha1 = "5ec581827ad723fecdd381f1c928390676e4551b";
1005 };
1006 };
1007 "babel-helper-replace-supers-6.24.1" = {
1008 name = "babel-helper-replace-supers";
1009 packageName = "babel-helper-replace-supers";
1010 version = "6.24.1";
1011 src = fetchurl {
1012 url = "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz";
1013 sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a";
1014 };
1015 };
1016 "babel-helpers-6.24.1" = {
1017 name = "babel-helpers";
1018 packageName = "babel-helpers";
1019 version = "6.24.1";
1020 src = fetchurl {
1021 url = "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz";
1022 sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
1023 };
1024 };
1025 "babel-loader-7.1.5" = {
1026 name = "babel-loader";
1027 packageName = "babel-loader";
1028 version = "7.1.5";
1029 src = fetchurl {
1030 url = "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz";
1031 sha512 = "iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==";
1032 };
1033 };
1034 "babel-messages-6.23.0" = {
1035 name = "babel-messages";
1036 packageName = "babel-messages";
1037 version = "6.23.0";
1038 src = fetchurl {
1039 url = "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz";
1040 sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
1041 };
1042 };
1043 "babel-plugin-check-es2015-constants-6.22.0" = {
1044 name = "babel-plugin-check-es2015-constants";
1045 packageName = "babel-plugin-check-es2015-constants";
1046 version = "6.22.0";
1047 src = fetchurl {
1048 url = "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz";
1049 sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a";
1050 };
1051 };
1052 "babel-plugin-syntax-async-functions-6.13.0" = {
1053 name = "babel-plugin-syntax-async-functions";
1054 packageName = "babel-plugin-syntax-async-functions";
1055 version = "6.13.0";
1056 src = fetchurl {
1057 url = "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz";
1058 sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95";
1059 };
1060 };
1061 "babel-plugin-syntax-exponentiation-operator-6.13.0" = {
1062 name = "babel-plugin-syntax-exponentiation-operator";
1063 packageName = "babel-plugin-syntax-exponentiation-operator";
1064 version = "6.13.0";
1065 src = fetchurl {
1066 url = "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz";
1067 sha1 = "9ee7e8337290da95288201a6a57f4170317830de";
1068 };
1069 };
1070 "babel-plugin-syntax-object-rest-spread-6.13.0" = {
1071 name = "babel-plugin-syntax-object-rest-spread";
1072 packageName = "babel-plugin-syntax-object-rest-spread";
1073 version = "6.13.0";
1074 src = fetchurl {
1075 url = "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz";
1076 sha1 = "fd6536f2bce13836ffa3a5458c4903a597bb3bf5";
1077 };
1078 };
1079 "babel-plugin-syntax-trailing-function-commas-6.22.0" = {
1080 name = "babel-plugin-syntax-trailing-function-commas";
1081 packageName = "babel-plugin-syntax-trailing-function-commas";
1082 version = "6.22.0";
1083 src = fetchurl {
1084 url = "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz";
1085 sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3";
1086 };
1087 };
1088 "babel-plugin-transform-async-to-generator-6.24.1" = {
1089 name = "babel-plugin-transform-async-to-generator";
1090 packageName = "babel-plugin-transform-async-to-generator";
1091 version = "6.24.1";
1092 src = fetchurl {
1093 url = "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz";
1094 sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761";
1095 };
1096 };
1097 "babel-plugin-transform-es2015-arrow-functions-6.22.0" = {
1098 name = "babel-plugin-transform-es2015-arrow-functions";
1099 packageName = "babel-plugin-transform-es2015-arrow-functions";
1100 version = "6.22.0";
1101 src = fetchurl {
1102 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz";
1103 sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221";
1104 };
1105 };
1106 "babel-plugin-transform-es2015-block-scoped-functions-6.22.0" = {
1107 name = "babel-plugin-transform-es2015-block-scoped-functions";
1108 packageName = "babel-plugin-transform-es2015-block-scoped-functions";
1109 version = "6.22.0";
1110 src = fetchurl {
1111 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz";
1112 sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141";
1113 };
1114 };
1115 "babel-plugin-transform-es2015-block-scoping-6.26.0" = {
1116 name = "babel-plugin-transform-es2015-block-scoping";
1117 packageName = "babel-plugin-transform-es2015-block-scoping";
1118 version = "6.26.0";
1119 src = fetchurl {
1120 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz";
1121 sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f";
1122 };
1123 };
1124 "babel-plugin-transform-es2015-classes-6.24.1" = {
1125 name = "babel-plugin-transform-es2015-classes";
1126 packageName = "babel-plugin-transform-es2015-classes";
1127 version = "6.24.1";
1128 src = fetchurl {
1129 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz";
1130 sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db";
1131 };
1132 };
1133 "babel-plugin-transform-es2015-computed-properties-6.24.1" = {
1134 name = "babel-plugin-transform-es2015-computed-properties";
1135 packageName = "babel-plugin-transform-es2015-computed-properties";
1136 version = "6.24.1";
1137 src = fetchurl {
1138 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz";
1139 sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3";
1140 };
1141 };
1142 "babel-plugin-transform-es2015-destructuring-6.23.0" = {
1143 name = "babel-plugin-transform-es2015-destructuring";
1144 packageName = "babel-plugin-transform-es2015-destructuring";
1145 version = "6.23.0";
1146 src = fetchurl {
1147 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz";
1148 sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d";
1149 };
1150 };
1151 "babel-plugin-transform-es2015-duplicate-keys-6.24.1" = {
1152 name = "babel-plugin-transform-es2015-duplicate-keys";
1153 packageName = "babel-plugin-transform-es2015-duplicate-keys";
1154 version = "6.24.1";
1155 src = fetchurl {
1156 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz";
1157 sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e";
1158 };
1159 };
1160 "babel-plugin-transform-es2015-for-of-6.23.0" = {
1161 name = "babel-plugin-transform-es2015-for-of";
1162 packageName = "babel-plugin-transform-es2015-for-of";
1163 version = "6.23.0";
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz";
1166 sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691";
1167 };
1168 };
1169 "babel-plugin-transform-es2015-function-name-6.24.1" = {
1170 name = "babel-plugin-transform-es2015-function-name";
1171 packageName = "babel-plugin-transform-es2015-function-name";
1172 version = "6.24.1";
1173 src = fetchurl {
1174 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz";
1175 sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b";
1176 };
1177 };
1178 "babel-plugin-transform-es2015-literals-6.22.0" = {
1179 name = "babel-plugin-transform-es2015-literals";
1180 packageName = "babel-plugin-transform-es2015-literals";
1181 version = "6.22.0";
1182 src = fetchurl {
1183 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz";
1184 sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e";
1185 };
1186 };
1187 "babel-plugin-transform-es2015-modules-amd-6.24.1" = {
1188 name = "babel-plugin-transform-es2015-modules-amd";
1189 packageName = "babel-plugin-transform-es2015-modules-amd";
1190 version = "6.24.1";
1191 src = fetchurl {
1192 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz";
1193 sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154";
1194 };
1195 };
1196 "babel-plugin-transform-es2015-modules-commonjs-6.26.2" = {
1197 name = "babel-plugin-transform-es2015-modules-commonjs";
1198 packageName = "babel-plugin-transform-es2015-modules-commonjs";
1199 version = "6.26.2";
1200 src = fetchurl {
1201 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz";
1202 sha512 = "CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==";
1203 };
1204 };
1205 "babel-plugin-transform-es2015-modules-systemjs-6.24.1" = {
1206 name = "babel-plugin-transform-es2015-modules-systemjs";
1207 packageName = "babel-plugin-transform-es2015-modules-systemjs";
1208 version = "6.24.1";
1209 src = fetchurl {
1210 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz";
1211 sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23";
1212 };
1213 };
1214 "babel-plugin-transform-es2015-modules-umd-6.24.1" = {
1215 name = "babel-plugin-transform-es2015-modules-umd";
1216 packageName = "babel-plugin-transform-es2015-modules-umd";
1217 version = "6.24.1";
1218 src = fetchurl {
1219 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz";
1220 sha1 = "ac997e6285cd18ed6176adb607d602344ad38468";
1221 };
1222 };
1223 "babel-plugin-transform-es2015-object-super-6.24.1" = {
1224 name = "babel-plugin-transform-es2015-object-super";
1225 packageName = "babel-plugin-transform-es2015-object-super";
1226 version = "6.24.1";
1227 src = fetchurl {
1228 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz";
1229 sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d";
1230 };
1231 };
1232 "babel-plugin-transform-es2015-parameters-6.24.1" = {
1233 name = "babel-plugin-transform-es2015-parameters";
1234 packageName = "babel-plugin-transform-es2015-parameters";
1235 version = "6.24.1";
1236 src = fetchurl {
1237 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz";
1238 sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b";
1239 };
1240 };
1241 "babel-plugin-transform-es2015-shorthand-properties-6.24.1" = {
1242 name = "babel-plugin-transform-es2015-shorthand-properties";
1243 packageName = "babel-plugin-transform-es2015-shorthand-properties";
1244 version = "6.24.1";
1245 src = fetchurl {
1246 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz";
1247 sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0";
1248 };
1249 };
1250 "babel-plugin-transform-es2015-spread-6.22.0" = {
1251 name = "babel-plugin-transform-es2015-spread";
1252 packageName = "babel-plugin-transform-es2015-spread";
1253 version = "6.22.0";
1254 src = fetchurl {
1255 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz";
1256 sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1";
1257 };
1258 };
1259 "babel-plugin-transform-es2015-sticky-regex-6.24.1" = {
1260 name = "babel-plugin-transform-es2015-sticky-regex";
1261 packageName = "babel-plugin-transform-es2015-sticky-regex";
1262 version = "6.24.1";
1263 src = fetchurl {
1264 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz";
1265 sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc";
1266 };
1267 };
1268 "babel-plugin-transform-es2015-template-literals-6.22.0" = {
1269 name = "babel-plugin-transform-es2015-template-literals";
1270 packageName = "babel-plugin-transform-es2015-template-literals";
1271 version = "6.22.0";
1272 src = fetchurl {
1273 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz";
1274 sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d";
1275 };
1276 };
1277 "babel-plugin-transform-es2015-typeof-symbol-6.23.0" = {
1278 name = "babel-plugin-transform-es2015-typeof-symbol";
1279 packageName = "babel-plugin-transform-es2015-typeof-symbol";
1280 version = "6.23.0";
1281 src = fetchurl {
1282 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz";
1283 sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372";
1284 };
1285 };
1286 "babel-plugin-transform-es2015-unicode-regex-6.24.1" = {
1287 name = "babel-plugin-transform-es2015-unicode-regex";
1288 packageName = "babel-plugin-transform-es2015-unicode-regex";
1289 version = "6.24.1";
1290 src = fetchurl {
1291 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz";
1292 sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9";
1293 };
1294 };
1295 "babel-plugin-transform-exponentiation-operator-6.24.1" = {
1296 name = "babel-plugin-transform-exponentiation-operator";
1297 packageName = "babel-plugin-transform-exponentiation-operator";
1298 version = "6.24.1";
1299 src = fetchurl {
1300 url = "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz";
1301 sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e";
1302 };
1303 };
1304 "babel-plugin-transform-object-rest-spread-6.26.0" = {
1305 name = "babel-plugin-transform-object-rest-spread";
1306 packageName = "babel-plugin-transform-object-rest-spread";
1307 version = "6.26.0";
1308 src = fetchurl {
1309 url = "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz";
1310 sha1 = "0f36692d50fef6b7e2d4b3ac1478137a963b7b06";
1311 };
1312 };
1313 "babel-plugin-transform-regenerator-6.26.0" = {
1314 name = "babel-plugin-transform-regenerator";
1315 packageName = "babel-plugin-transform-regenerator";
1316 version = "6.26.0";
1317 src = fetchurl {
1318 url = "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz";
1319 sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f";
1320 };
1321 };
1322 "babel-plugin-transform-strict-mode-6.24.1" = {
1323 name = "babel-plugin-transform-strict-mode";
1324 packageName = "babel-plugin-transform-strict-mode";
1325 version = "6.24.1";
1326 src = fetchurl {
1327 url = "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz";
1328 sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758";
1329 };
1330 };
1331 "babel-preset-env-1.7.0" = {
1332 name = "babel-preset-env";
1333 packageName = "babel-preset-env";
281 1334 version = "1.7.0";
282 1335 src = fetchurl {
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz";
284 sha512 = "32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==";
285 };
286 };
287 "babel-polyfill-6.26.0" = {
288 name = "babel-polyfill";
289 packageName = "babel-polyfill";
1336 url = "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz";
1337 sha512 = "9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==";
1338 };
1339 };
1340 "babel-register-6.26.0" = {
1341 name = "babel-register";
1342 packageName = "babel-register";
290 1343 version = "6.26.0";
291 1344 src = fetchurl {
292 url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
293 sha1 = "379937abc67d7895970adc621f284cd966cf2153";
1345 url = "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz";
1346 sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
294 1347 };
295 1348 };
296 1349 "babel-runtime-6.26.0" = {
@@ -302,6 +1355,51 b' let'
302 1355 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
303 1356 };
304 1357 };
1358 "babel-template-6.26.0" = {
1359 name = "babel-template";
1360 packageName = "babel-template";
1361 version = "6.26.0";
1362 src = fetchurl {
1363 url = "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz";
1364 sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
1365 };
1366 };
1367 "babel-traverse-6.26.0" = {
1368 name = "babel-traverse";
1369 packageName = "babel-traverse";
1370 version = "6.26.0";
1371 src = fetchurl {
1372 url = "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz";
1373 sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
1374 };
1375 };
1376 "babel-types-6.26.0" = {
1377 name = "babel-types";
1378 packageName = "babel-types";
1379 version = "6.26.0";
1380 src = fetchurl {
1381 url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz";
1382 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
1383 };
1384 };
1385 "babylon-6.18.0" = {
1386 name = "babylon";
1387 packageName = "babylon";
1388 version = "6.18.0";
1389 src = fetchurl {
1390 url = "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz";
1391 sha512 = "q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==";
1392 };
1393 };
1394 "balanced-match-0.4.2" = {
1395 name = "balanced-match";
1396 packageName = "balanced-match";
1397 version = "0.4.2";
1398 src = fetchurl {
1399 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz";
1400 sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838";
1401 };
1402 };
305 1403 "balanced-match-1.0.0" = {
306 1404 name = "balanced-match";
307 1405 packageName = "balanced-match";
@@ -311,13 +1409,22 b' let'
311 1409 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
312 1410 };
313 1411 };
314 "base64-js-1.2.3" = {
1412 "base-0.11.2" = {
1413 name = "base";
1414 packageName = "base";
1415 version = "0.11.2";
1416 src = fetchurl {
1417 url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz";
1418 sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==";
1419 };
1420 };
1421 "base64-js-1.3.0" = {
315 1422 name = "base64-js";
316 1423 packageName = "base64-js";
317 version = "1.2.3";
318 src = fetchurl {
319 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz";
320 sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==";
1424 version = "1.3.0";
1425 src = fetchurl {
1426 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz";
1427 sha512 = "ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==";
321 1428 };
322 1429 };
323 1430 "bcrypt-pbkdf-1.0.2" = {
@@ -329,6 +1436,51 b' let'
329 1436 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
330 1437 };
331 1438 };
1439 "big.js-3.2.0" = {
1440 name = "big.js";
1441 packageName = "big.js";
1442 version = "3.2.0";
1443 src = fetchurl {
1444 url = "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz";
1445 sha512 = "+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==";
1446 };
1447 };
1448 "binary-extensions-1.12.0" = {
1449 name = "binary-extensions";
1450 packageName = "binary-extensions";
1451 version = "1.12.0";
1452 src = fetchurl {
1453 url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz";
1454 sha512 = "DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==";
1455 };
1456 };
1457 "bluebird-3.5.2" = {
1458 name = "bluebird";
1459 packageName = "bluebird";
1460 version = "3.5.2";
1461 src = fetchurl {
1462 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz";
1463 sha512 = "dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==";
1464 };
1465 };
1466 "bn.js-4.11.8" = {
1467 name = "bn.js";
1468 packageName = "bn.js";
1469 version = "4.11.8";
1470 src = fetchurl {
1471 url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz";
1472 sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==";
1473 };
1474 };
1475 "boolbase-1.0.0" = {
1476 name = "boolbase";
1477 packageName = "boolbase";
1478 version = "1.0.0";
1479 src = fetchurl {
1480 url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
1481 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1482 };
1483 };
332 1484 "boom-2.10.1" = {
333 1485 name = "boom";
334 1486 packageName = "boom";
@@ -338,15 +1490,6 b' let'
338 1490 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
339 1491 };
340 1492 };
341 "bower-1.8.4" = {
342 name = "bower";
343 packageName = "bower";
344 version = "1.8.4";
345 src = fetchurl {
346 url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz";
347 sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a";
348 };
349 };
350 1493 "brace-expansion-1.1.11" = {
351 1494 name = "brace-expansion";
352 1495 packageName = "brace-expansion";
@@ -356,6 +1499,105 b' let'
356 1499 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
357 1500 };
358 1501 };
1502 "braces-2.3.2" = {
1503 name = "braces";
1504 packageName = "braces";
1505 version = "2.3.2";
1506 src = fetchurl {
1507 url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";
1508 sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==";
1509 };
1510 };
1511 "brorand-1.1.0" = {
1512 name = "brorand";
1513 packageName = "brorand";
1514 version = "1.1.0";
1515 src = fetchurl {
1516 url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz";
1517 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1518 };
1519 };
1520 "browserify-aes-1.2.0" = {
1521 name = "browserify-aes";
1522 packageName = "browserify-aes";
1523 version = "1.2.0";
1524 src = fetchurl {
1525 url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz";
1526 sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==";
1527 };
1528 };
1529 "browserify-cipher-1.0.1" = {
1530 name = "browserify-cipher";
1531 packageName = "browserify-cipher";
1532 version = "1.0.1";
1533 src = fetchurl {
1534 url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1535 sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==";
1536 };
1537 };
1538 "browserify-des-1.0.2" = {
1539 name = "browserify-des";
1540 packageName = "browserify-des";
1541 version = "1.0.2";
1542 src = fetchurl {
1543 url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz";
1544 sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==";
1545 };
1546 };
1547 "browserify-rsa-4.0.1" = {
1548 name = "browserify-rsa";
1549 packageName = "browserify-rsa";
1550 version = "4.0.1";
1551 src = fetchurl {
1552 url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1553 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1554 };
1555 };
1556 "browserify-sign-4.0.4" = {
1557 name = "browserify-sign";
1558 packageName = "browserify-sign";
1559 version = "4.0.4";
1560 src = fetchurl {
1561 url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz";
1562 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1563 };
1564 };
1565 "browserify-zlib-0.2.0" = {
1566 name = "browserify-zlib";
1567 packageName = "browserify-zlib";
1568 version = "0.2.0";
1569 src = fetchurl {
1570 url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1571 sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==";
1572 };
1573 };
1574 "browserslist-1.7.7" = {
1575 name = "browserslist";
1576 packageName = "browserslist";
1577 version = "1.7.7";
1578 src = fetchurl {
1579 url = "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz";
1580 sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9";
1581 };
1582 };
1583 "browserslist-3.2.8" = {
1584 name = "browserslist";
1585 packageName = "browserslist";
1586 version = "3.2.8";
1587 src = fetchurl {
1588 url = "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz";
1589 sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==";
1590 };
1591 };
1592 "buffer-4.9.1" = {
1593 name = "buffer";
1594 packageName = "buffer";
1595 version = "4.9.1";
1596 src = fetchurl {
1597 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz";
1598 sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
1599 };
1600 };
359 1601 "buffer-from-1.1.1" = {
360 1602 name = "buffer-from";
361 1603 packageName = "buffer-from";
@@ -365,22 +1607,94 b' let'
365 1607 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
366 1608 };
367 1609 };
368 "builtin-modules-1.1.1" = {
369 name = "builtin-modules";
370 packageName = "builtin-modules";
371 version = "1.1.1";
372 src = fetchurl {
373 url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz";
374 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
375 };
376 };
377 "builtins-1.0.3" = {
378 name = "builtins";
379 packageName = "builtins";
1610 "buffer-xor-1.0.3" = {
1611 name = "buffer-xor";
1612 packageName = "buffer-xor";
380 1613 version = "1.0.3";
381 1614 src = fetchurl {
382 url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz";
383 sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
1615 url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz";
1616 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1617 };
1618 };
1619 "builtin-status-codes-3.0.0" = {
1620 name = "builtin-status-codes";
1621 packageName = "builtin-status-codes";
1622 version = "3.0.0";
1623 src = fetchurl {
1624 url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1625 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1626 };
1627 };
1628 "cacache-10.0.4" = {
1629 name = "cacache";
1630 packageName = "cacache";
1631 version = "10.0.4";
1632 src = fetchurl {
1633 url = "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz";
1634 sha512 = "Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==";
1635 };
1636 };
1637 "cache-base-1.0.1" = {
1638 name = "cache-base";
1639 packageName = "cache-base";
1640 version = "1.0.1";
1641 src = fetchurl {
1642 url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz";
1643 sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==";
1644 };
1645 };
1646 "camel-case-3.0.0" = {
1647 name = "camel-case";
1648 packageName = "camel-case";
1649 version = "3.0.0";
1650 src = fetchurl {
1651 url = "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz";
1652 sha1 = "ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73";
1653 };
1654 };
1655 "camelcase-1.2.1" = {
1656 name = "camelcase";
1657 packageName = "camelcase";
1658 version = "1.2.1";
1659 src = fetchurl {
1660 url = "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz";
1661 sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
1662 };
1663 };
1664 "camelcase-4.1.0" = {
1665 name = "camelcase";
1666 packageName = "camelcase";
1667 version = "4.1.0";
1668 src = fetchurl {
1669 url = "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz";
1670 sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
1671 };
1672 };
1673 "caniuse-api-1.6.1" = {
1674 name = "caniuse-api";
1675 packageName = "caniuse-api";
1676 version = "1.6.1";
1677 src = fetchurl {
1678 url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz";
1679 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1680 };
1681 };
1682 "caniuse-db-1.0.30000900" = {
1683 name = "caniuse-db";
1684 packageName = "caniuse-db";
1685 version = "1.0.30000900";
1686 src = fetchurl {
1687 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000900.tgz";
1688 sha512 = "fvicVRDlhHIQpt/bmbLl3hDHKUZb5ZP8O2OuZLz2fSEPlUBbvwwbhhqhGS617ldN6bDoo9A3+MQKQyFq0p7UXA==";
1689 };
1690 };
1691 "caniuse-lite-1.0.30000900" = {
1692 name = "caniuse-lite";
1693 packageName = "caniuse-lite";
1694 version = "1.0.30000900";
1695 src = fetchurl {
1696 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000900.tgz";
1697 sha512 = "xDVs8pBFr6bzq9pXUkLKpGQQnzsF/l6/yX38UnCkTcUcwC0rDl1NGZGildcJVTU+uGBxfsyniK/ZWagPNn1Oqw==";
384 1698 };
385 1699 };
386 1700 "caseless-0.12.0" = {
@@ -392,6 +1706,15 b' let'
392 1706 sha1 = "1b681c21ff84033c826543090689420d187151dc";
393 1707 };
394 1708 };
1709 "center-align-0.1.3" = {
1710 name = "center-align";
1711 packageName = "center-align";
1712 version = "0.1.3";
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz";
1715 sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
1716 };
1717 };
395 1718 "chalk-0.5.1" = {
396 1719 name = "chalk";
397 1720 packageName = "chalk";
@@ -410,6 +1733,78 b' let'
410 1733 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
411 1734 };
412 1735 };
1736 "chalk-2.4.1" = {
1737 name = "chalk";
1738 packageName = "chalk";
1739 version = "2.4.1";
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz";
1742 sha512 = "ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==";
1743 };
1744 };
1745 "chokidar-2.0.4" = {
1746 name = "chokidar";
1747 packageName = "chokidar";
1748 version = "2.0.4";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz";
1751 sha512 = "z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==";
1752 };
1753 };
1754 "chownr-1.1.1" = {
1755 name = "chownr";
1756 packageName = "chownr";
1757 version = "1.1.1";
1758 src = fetchurl {
1759 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz";
1760 sha512 = "j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==";
1761 };
1762 };
1763 "chrome-trace-event-1.0.0" = {
1764 name = "chrome-trace-event";
1765 packageName = "chrome-trace-event";
1766 version = "1.0.0";
1767 src = fetchurl {
1768 url = "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz";
1769 sha512 = "xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==";
1770 };
1771 };
1772 "cipher-base-1.0.4" = {
1773 name = "cipher-base";
1774 packageName = "cipher-base";
1775 version = "1.0.4";
1776 src = fetchurl {
1777 url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";
1778 sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==";
1779 };
1780 };
1781 "clap-1.2.3" = {
1782 name = "clap";
1783 packageName = "clap";
1784 version = "1.2.3";
1785 src = fetchurl {
1786 url = "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz";
1787 sha512 = "4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==";
1788 };
1789 };
1790 "class-utils-0.3.6" = {
1791 name = "class-utils";
1792 packageName = "class-utils";
1793 version = "0.3.6";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz";
1796 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1797 };
1798 };
1799 "clean-css-4.2.1" = {
1800 name = "clean-css";
1801 packageName = "clean-css";
1802 version = "4.2.1";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz";
1805 sha512 = "4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==";
1806 };
1807 };
413 1808 "cli-1.0.1" = {
414 1809 name = "cli";
415 1810 packageName = "cli";
@@ -428,6 +1823,24 b' let'
428 1823 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
429 1824 };
430 1825 };
1826 "cliui-2.1.0" = {
1827 name = "cliui";
1828 packageName = "cliui";
1829 version = "2.1.0";
1830 src = fetchurl {
1831 url = "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz";
1832 sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
1833 };
1834 };
1835 "cliui-4.1.0" = {
1836 name = "cliui";
1837 packageName = "cliui";
1838 version = "4.1.0";
1839 src = fetchurl {
1840 url = "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz";
1841 sha512 = "4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==";
1842 };
1843 };
431 1844 "clone-1.0.4" = {
432 1845 name = "clone";
433 1846 packageName = "clone";
@@ -437,6 +1850,15 b' let'
437 1850 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
438 1851 };
439 1852 };
1853 "clone-2.1.2" = {
1854 name = "clone";
1855 packageName = "clone";
1856 version = "2.1.2";
1857 src = fetchurl {
1858 url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz";
1859 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1860 };
1861 };
440 1862 "co-4.6.0" = {
441 1863 name = "co";
442 1864 packageName = "co";
@@ -446,6 +1868,15 b' let'
446 1868 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
447 1869 };
448 1870 };
1871 "coa-1.0.4" = {
1872 name = "coa";
1873 packageName = "coa";
1874 version = "1.0.4";
1875 src = fetchurl {
1876 url = "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz";
1877 sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd";
1878 };
1879 };
449 1880 "code-point-at-1.1.0" = {
450 1881 name = "code-point-at";
451 1882 packageName = "code-point-at";
@@ -464,6 +1895,60 b' let'
464 1895 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
465 1896 };
466 1897 };
1898 "collection-visit-1.0.0" = {
1899 name = "collection-visit";
1900 packageName = "collection-visit";
1901 version = "1.0.0";
1902 src = fetchurl {
1903 url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz";
1904 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1905 };
1906 };
1907 "color-0.11.4" = {
1908 name = "color";
1909 packageName = "color";
1910 version = "0.11.4";
1911 src = fetchurl {
1912 url = "https://registry.npmjs.org/color/-/color-0.11.4.tgz";
1913 sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764";
1914 };
1915 };
1916 "color-convert-1.9.3" = {
1917 name = "color-convert";
1918 packageName = "color-convert";
1919 version = "1.9.3";
1920 src = fetchurl {
1921 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
1922 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
1923 };
1924 };
1925 "color-name-1.1.3" = {
1926 name = "color-name";
1927 packageName = "color-name";
1928 version = "1.1.3";
1929 src = fetchurl {
1930 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
1931 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1932 };
1933 };
1934 "color-string-0.3.0" = {
1935 name = "color-string";
1936 packageName = "color-string";
1937 version = "0.3.0";
1938 src = fetchurl {
1939 url = "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz";
1940 sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991";
1941 };
1942 };
1943 "colormin-1.1.2" = {
1944 name = "colormin";
1945 packageName = "colormin";
1946 version = "1.1.2";
1947 src = fetchurl {
1948 url = "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz";
1949 sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133";
1950 };
1951 };
467 1952 "colors-0.6.2" = {
468 1953 name = "colors";
469 1954 packageName = "colors";
@@ -482,31 +1967,67 b' let'
482 1967 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
483 1968 };
484 1969 };
485 "combined-stream-1.0.6" = {
1970 "colors-1.1.2" = {
1971 name = "colors";
1972 packageName = "colors";
1973 version = "1.1.2";
1974 src = fetchurl {
1975 url = "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz";
1976 sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
1977 };
1978 };
1979 "colors-1.3.2" = {
1980 name = "colors";
1981 packageName = "colors";
1982 version = "1.3.2";
1983 src = fetchurl {
1984 url = "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz";
1985 sha512 = "rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==";
1986 };
1987 };
1988 "combined-stream-1.0.7" = {
486 1989 name = "combined-stream";
487 1990 packageName = "combined-stream";
488 version = "1.0.6";
489 src = fetchurl {
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz";
491 sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
492 };
493 };
494 "command-line-args-3.0.5" = {
495 name = "command-line-args";
496 packageName = "command-line-args";
497 version = "3.0.5";
498 src = fetchurl {
499 url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz";
500 sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0";
501 };
502 };
503 "command-line-usage-3.0.8" = {
504 name = "command-line-usage";
505 packageName = "command-line-usage";
506 version = "3.0.8";
507 src = fetchurl {
508 url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz";
509 sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d";
1991 version = "1.0.7";
1992 src = fetchurl {
1993 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";
1994 sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==";
1995 };
1996 };
1997 "commander-2.14.1" = {
1998 name = "commander";
1999 packageName = "commander";
2000 version = "2.14.1";
2001 src = fetchurl {
2002 url = "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz";
2003 sha512 = "+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==";
2004 };
2005 };
2006 "commander-2.17.1" = {
2007 name = "commander";
2008 packageName = "commander";
2009 version = "2.17.1";
2010 src = fetchurl {
2011 url = "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz";
2012 sha512 = "wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==";
2013 };
2014 };
2015 "commondir-1.0.1" = {
2016 name = "commondir";
2017 packageName = "commondir";
2018 version = "1.0.1";
2019 src = fetchurl {
2020 url = "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz";
2021 sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
2022 };
2023 };
2024 "component-emitter-1.2.1" = {
2025 name = "component-emitter";
2026 packageName = "component-emitter";
2027 version = "1.2.1";
2028 src = fetchurl {
2029 url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
2030 sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
510 2031 };
511 2032 };
512 2033 "concat-map-0.0.1" = {
@@ -527,15 +2048,6 b' let'
527 2048 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
528 2049 };
529 2050 };
530 "config-chain-1.1.11" = {
531 name = "config-chain";
532 packageName = "config-chain";
533 version = "1.1.11";
534 src = fetchurl {
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz";
536 sha1 = "aba09747dfbe4c3e70e766a6e41586e1859fc6f2";
537 };
538 };
539 2051 "console-browserify-1.1.0" = {
540 2052 name = "console-browserify";
541 2053 packageName = "console-browserify";
@@ -545,13 +2057,49 b' let'
545 2057 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
546 2058 };
547 2059 };
548 "console-control-strings-1.1.0" = {
549 name = "console-control-strings";
550 packageName = "console-control-strings";
551 version = "1.1.0";
552 src = fetchurl {
553 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
554 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
2060 "constants-browserify-1.0.0" = {
2061 name = "constants-browserify";
2062 packageName = "constants-browserify";
2063 version = "1.0.0";
2064 src = fetchurl {
2065 url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz";
2066 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2067 };
2068 };
2069 "convert-source-map-1.6.0" = {
2070 name = "convert-source-map";
2071 packageName = "convert-source-map";
2072 version = "1.6.0";
2073 src = fetchurl {
2074 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz";
2075 sha512 = "eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==";
2076 };
2077 };
2078 "copy-concurrently-1.0.5" = {
2079 name = "copy-concurrently";
2080 packageName = "copy-concurrently";
2081 version = "1.0.5";
2082 src = fetchurl {
2083 url = "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
2084 sha512 = "f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==";
2085 };
2086 };
2087 "copy-descriptor-0.1.1" = {
2088 name = "copy-descriptor";
2089 packageName = "copy-descriptor";
2090 version = "0.1.1";
2091 src = fetchurl {
2092 url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
2093 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
2094 };
2095 };
2096 "copy-webpack-plugin-4.5.4" = {
2097 name = "copy-webpack-plugin";
2098 packageName = "copy-webpack-plugin";
2099 version = "4.5.4";
2100 src = fetchurl {
2101 url = "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz";
2102 sha512 = "0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==";
555 2103 };
556 2104 };
557 2105 "core-js-2.5.7" = {
@@ -572,22 +2120,40 b' let'
572 2120 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
573 2121 };
574 2122 };
575 "crisper-1.2.0" = {
576 name = "crisper";
577 packageName = "crisper";
2123 "create-ecdh-4.0.3" = {
2124 name = "create-ecdh";
2125 packageName = "create-ecdh";
2126 version = "4.0.3";
2127 src = fetchurl {
2128 url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz";
2129 sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==";
2130 };
2131 };
2132 "create-hash-1.2.0" = {
2133 name = "create-hash";
2134 packageName = "create-hash";
578 2135 version = "1.2.0";
579 2136 src = fetchurl {
580 url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz";
581 sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46";
582 };
583 };
584 "crisper-2.1.1" = {
585 name = "crisper";
586 packageName = "crisper";
587 version = "2.1.1";
588 src = fetchurl {
589 url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz";
590 sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw==";
2137 url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz";
2138 sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==";
2139 };
2140 };
2141 "create-hmac-1.1.7" = {
2142 name = "create-hmac";
2143 packageName = "create-hmac";
2144 version = "1.1.7";
2145 src = fetchurl {
2146 url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz";
2147 sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==";
2148 };
2149 };
2150 "cross-spawn-6.0.5" = {
2151 name = "cross-spawn";
2152 packageName = "cross-spawn";
2153 version = "6.0.5";
2154 src = fetchurl {
2155 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
2156 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
591 2157 };
592 2158 };
593 2159 "cryptiles-2.0.5" = {
@@ -599,6 +2165,87 b' let'
599 2165 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
600 2166 };
601 2167 };
2168 "crypto-browserify-3.12.0" = {
2169 name = "crypto-browserify";
2170 packageName = "crypto-browserify";
2171 version = "3.12.0";
2172 src = fetchurl {
2173 url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
2174 sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==";
2175 };
2176 };
2177 "css-color-names-0.0.4" = {
2178 name = "css-color-names";
2179 packageName = "css-color-names";
2180 version = "0.0.4";
2181 src = fetchurl {
2182 url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz";
2183 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
2184 };
2185 };
2186 "css-loader-0.28.11" = {
2187 name = "css-loader";
2188 packageName = "css-loader";
2189 version = "0.28.11";
2190 src = fetchurl {
2191 url = "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz";
2192 sha512 = "wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==";
2193 };
2194 };
2195 "css-select-1.2.0" = {
2196 name = "css-select";
2197 packageName = "css-select";
2198 version = "1.2.0";
2199 src = fetchurl {
2200 url = "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz";
2201 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2202 };
2203 };
2204 "css-selector-tokenizer-0.7.0" = {
2205 name = "css-selector-tokenizer";
2206 packageName = "css-selector-tokenizer";
2207 version = "0.7.0";
2208 src = fetchurl {
2209 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz";
2210 sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86";
2211 };
2212 };
2213 "css-what-2.1.2" = {
2214 name = "css-what";
2215 packageName = "css-what";
2216 version = "2.1.2";
2217 src = fetchurl {
2218 url = "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz";
2219 sha512 = "wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==";
2220 };
2221 };
2222 "cssesc-0.1.0" = {
2223 name = "cssesc";
2224 packageName = "cssesc";
2225 version = "0.1.0";
2226 src = fetchurl {
2227 url = "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz";
2228 sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
2229 };
2230 };
2231 "cssnano-3.10.0" = {
2232 name = "cssnano";
2233 packageName = "cssnano";
2234 version = "3.10.0";
2235 src = fetchurl {
2236 url = "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz";
2237 sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38";
2238 };
2239 };
2240 "csso-2.3.2" = {
2241 name = "csso";
2242 packageName = "csso";
2243 version = "2.3.2";
2244 src = fetchurl {
2245 url = "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz";
2246 sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85";
2247 };
2248 };
602 2249 "cycle-1.0.3" = {
603 2250 name = "cycle";
604 2251 packageName = "cycle";
@@ -608,6 +2255,15 b' let'
608 2255 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
609 2256 };
610 2257 };
2258 "cyclist-0.2.2" = {
2259 name = "cyclist";
2260 packageName = "cyclist";
2261 version = "0.2.2";
2262 src = fetchurl {
2263 url = "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz";
2264 sha1 = "1b33792e11e914a2fd6d6ed6447464444e5fa640";
2265 };
2266 };
611 2267 "dashdash-1.14.1" = {
612 2268 name = "dashdash";
613 2269 packageName = "dashdash";
@@ -653,22 +2309,85 b' let'
653 2309 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
654 2310 };
655 2311 };
656 "deep-extend-0.4.2" = {
657 name = "deep-extend";
658 packageName = "deep-extend";
659 version = "0.4.2";
660 src = fetchurl {
661 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz";
662 sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f";
663 };
664 };
665 "deep-is-0.1.3" = {
666 name = "deep-is";
667 packageName = "deep-is";
668 version = "0.1.3";
669 src = fetchurl {
670 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
671 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2312 "decamelize-1.2.0" = {
2313 name = "decamelize";
2314 packageName = "decamelize";
2315 version = "1.2.0";
2316 src = fetchurl {
2317 url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
2318 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
2319 };
2320 };
2321 "decamelize-2.0.0" = {
2322 name = "decamelize";
2323 packageName = "decamelize";
2324 version = "2.0.0";
2325 src = fetchurl {
2326 url = "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz";
2327 sha512 = "Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==";
2328 };
2329 };
2330 "decode-uri-component-0.2.0" = {
2331 name = "decode-uri-component";
2332 packageName = "decode-uri-component";
2333 version = "0.2.0";
2334 src = fetchurl {
2335 url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
2336 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
2337 };
2338 };
2339 "deep-for-each-2.0.3" = {
2340 name = "deep-for-each";
2341 packageName = "deep-for-each";
2342 version = "2.0.3";
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/deep-for-each/-/deep-for-each-2.0.3.tgz";
2345 sha512 = "Y9mu+rplGcNZ7veer+5rqcdI9w3aPb7/WyE/nYnsuPevaE2z5YuC2u7/Gz/hIKsa0zo8sE8gKoBimSNsO/sr+A==";
2346 };
2347 };
2348 "define-properties-1.1.3" = {
2349 name = "define-properties";
2350 packageName = "define-properties";
2351 version = "1.1.3";
2352 src = fetchurl {
2353 url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
2354 sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
2355 };
2356 };
2357 "define-property-0.2.5" = {
2358 name = "define-property";
2359 packageName = "define-property";
2360 version = "0.2.5";
2361 src = fetchurl {
2362 url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz";
2363 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2364 };
2365 };
2366 "define-property-1.0.0" = {
2367 name = "define-property";
2368 packageName = "define-property";
2369 version = "1.0.0";
2370 src = fetchurl {
2371 url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz";
2372 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2373 };
2374 };
2375 "define-property-2.0.2" = {
2376 name = "define-property";
2377 packageName = "define-property";
2378 version = "2.0.2";
2379 src = fetchurl {
2380 url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz";
2381 sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==";
2382 };
2383 };
2384 "defined-1.0.0" = {
2385 name = "defined";
2386 packageName = "defined";
2387 version = "1.0.0";
2388 src = fetchurl {
2389 url = "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz";
2390 sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
672 2391 };
673 2392 };
674 2393 "delayed-stream-1.0.0" = {
@@ -689,22 +2408,58 b' let'
689 2408 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
690 2409 };
691 2410 };
692 "delegates-1.0.0" = {
693 name = "delegates";
694 packageName = "delegates";
2411 "des.js-1.0.0" = {
2412 name = "des.js";
2413 packageName = "des.js";
2414 version = "1.0.0";
2415 src = fetchurl {
2416 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz";
2417 sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
2418 };
2419 };
2420 "detect-file-1.0.0" = {
2421 name = "detect-file";
2422 packageName = "detect-file";
695 2423 version = "1.0.0";
696 2424 src = fetchurl {
697 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
698 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
699 };
700 };
701 "doctrine-0.7.2" = {
702 name = "doctrine";
703 packageName = "doctrine";
704 version = "0.7.2";
705 src = fetchurl {
706 url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz";
707 sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
2425 url = "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz";
2426 sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
2427 };
2428 };
2429 "detect-indent-4.0.0" = {
2430 name = "detect-indent";
2431 packageName = "detect-indent";
2432 version = "4.0.0";
2433 src = fetchurl {
2434 url = "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz";
2435 sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
2436 };
2437 };
2438 "diffie-hellman-5.0.3" = {
2439 name = "diffie-hellman";
2440 packageName = "diffie-hellman";
2441 version = "5.0.3";
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2444 sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==";
2445 };
2446 };
2447 "dir-glob-2.0.0" = {
2448 name = "dir-glob";
2449 packageName = "dir-glob";
2450 version = "2.0.0";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz";
2453 sha512 = "37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==";
2454 };
2455 };
2456 "dom-converter-0.2.0" = {
2457 name = "dom-converter";
2458 packageName = "dom-converter";
2459 version = "0.2.0";
2460 src = fetchurl {
2461 url = "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz";
2462 sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==";
708 2463 };
709 2464 };
710 2465 "dom-serializer-0.1.0" = {
@@ -716,22 +2471,22 b' let'
716 2471 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
717 2472 };
718 2473 };
719 "dom5-1.1.0" = {
2474 "dom5-2.3.0" = {
720 2475 name = "dom5";
721 2476 packageName = "dom5";
722 version = "1.1.0";
723 src = fetchurl {
724 url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz";
725 sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794";
726 };
727 };
728 "dom5-1.3.6" = {
729 name = "dom5";
730 packageName = "dom5";
731 version = "1.3.6";
732 src = fetchurl {
733 url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz";
734 sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d";
2477 version = "2.3.0";
2478 src = fetchurl {
2479 url = "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz";
2480 sha1 = "f8204975bd0dacbbe5b58a8a93ffc1fed0ffcd2a";
2481 };
2482 };
2483 "domain-browser-1.2.0" = {
2484 name = "domain-browser";
2485 packageName = "domain-browser";
2486 version = "1.2.0";
2487 src = fetchurl {
2488 url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz";
2489 sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==";
735 2490 };
736 2491 };
737 2492 "domelementtype-1.1.3" = {
@@ -752,6 +2507,15 b' let'
752 2507 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
753 2508 };
754 2509 };
2510 "domhandler-2.1.0" = {
2511 name = "domhandler";
2512 packageName = "domhandler";
2513 version = "2.1.0";
2514 src = fetchurl {
2515 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz";
2516 sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594";
2517 };
2518 };
755 2519 "domhandler-2.3.0" = {
756 2520 name = "domhandler";
757 2521 packageName = "domhandler";
@@ -761,6 +2525,15 b' let'
761 2525 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
762 2526 };
763 2527 };
2528 "domutils-1.1.6" = {
2529 name = "domutils";
2530 packageName = "domutils";
2531 version = "1.1.6";
2532 src = fetchurl {
2533 url = "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz";
2534 sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485";
2535 };
2536 };
764 2537 "domutils-1.5.1" = {
765 2538 name = "domutils";
766 2539 packageName = "domutils";
@@ -770,6 +2543,15 b' let'
770 2543 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
771 2544 };
772 2545 };
2546 "duplexify-3.6.1" = {
2547 name = "duplexify";
2548 packageName = "duplexify";
2549 version = "3.6.1";
2550 src = fetchurl {
2551 url = "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz";
2552 sha512 = "vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==";
2553 };
2554 };
773 2555 "ecc-jsbn-0.1.2" = {
774 2556 name = "ecc-jsbn";
775 2557 packageName = "ecc-jsbn";
@@ -779,6 +2561,60 b' let'
779 2561 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
780 2562 };
781 2563 };
2564 "electron-to-chromium-1.3.82" = {
2565 name = "electron-to-chromium";
2566 packageName = "electron-to-chromium";
2567 version = "1.3.82";
2568 src = fetchurl {
2569 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.82.tgz";
2570 sha512 = "NI4nB2IWGcU4JVT1AE8kBb/dFor4zjLHMLsOROPahppeHrR0FG5uslxMmkp/thO1MvPjM2xhlKoY29/I60s0ew==";
2571 };
2572 };
2573 "elliptic-6.4.1" = {
2574 name = "elliptic";
2575 packageName = "elliptic";
2576 version = "6.4.1";
2577 src = fetchurl {
2578 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz";
2579 sha512 = "BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==";
2580 };
2581 };
2582 "emojis-list-2.1.0" = {
2583 name = "emojis-list";
2584 packageName = "emojis-list";
2585 version = "2.1.0";
2586 src = fetchurl {
2587 url = "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz";
2588 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
2589 };
2590 };
2591 "end-of-stream-1.4.1" = {
2592 name = "end-of-stream";
2593 packageName = "end-of-stream";
2594 version = "1.4.1";
2595 src = fetchurl {
2596 url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz";
2597 sha512 = "1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==";
2598 };
2599 };
2600 "enhanced-resolve-3.4.1" = {
2601 name = "enhanced-resolve";
2602 packageName = "enhanced-resolve";
2603 version = "3.4.1";
2604 src = fetchurl {
2605 url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz";
2606 sha1 = "0421e339fd71419b3da13d129b3979040230476e";
2607 };
2608 };
2609 "enhanced-resolve-4.1.0" = {
2610 name = "enhanced-resolve";
2611 packageName = "enhanced-resolve";
2612 version = "4.1.0";
2613 src = fetchurl {
2614 url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz";
2615 sha512 = "F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==";
2616 };
2617 };
782 2618 "entities-1.0.0" = {
783 2619 name = "entities";
784 2620 packageName = "entities";
@@ -788,13 +2624,13 b' let'
788 2624 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
789 2625 };
790 2626 };
791 "entities-1.1.1" = {
2627 "entities-1.1.2" = {
792 2628 name = "entities";
793 2629 packageName = "entities";
794 version = "1.1.1";
795 src = fetchurl {
796 url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz";
797 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
2630 version = "1.1.2";
2631 src = fetchurl {
2632 url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
2633 sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
798 2634 };
799 2635 };
800 2636 "errno-0.1.7" = {
@@ -806,22 +2642,40 b' let'
806 2642 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
807 2643 };
808 2644 };
809 "es6-promise-2.3.0" = {
2645 "es-abstract-1.12.0" = {
2646 name = "es-abstract";
2647 packageName = "es-abstract";
2648 version = "1.12.0";
2649 src = fetchurl {
2650 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz";
2651 sha512 = "C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==";
2652 };
2653 };
2654 "es-to-primitive-1.2.0" = {
2655 name = "es-to-primitive";
2656 packageName = "es-to-primitive";
2657 version = "1.2.0";
2658 src = fetchurl {
2659 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
2660 sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==";
2661 };
2662 };
2663 "es6-promise-4.2.5" = {
810 2664 name = "es6-promise";
811 2665 packageName = "es6-promise";
812 version = "2.3.0";
813 src = fetchurl {
814 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz";
815 sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc";
816 };
817 };
818 "es6-promise-4.2.4" = {
819 name = "es6-promise";
820 packageName = "es6-promise";
821 version = "4.2.4";
822 src = fetchurl {
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz";
824 sha512 = "/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==";
2666 version = "4.2.5";
2667 src = fetchurl {
2668 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz";
2669 sha512 = "n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==";
2670 };
2671 };
2672 "es6-templates-0.2.3" = {
2673 name = "es6-templates";
2674 packageName = "es6-templates";
2675 version = "0.2.3";
2676 src = fetchurl {
2677 url = "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz";
2678 sha1 = "5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4";
825 2679 };
826 2680 };
827 2681 "escape-string-regexp-1.0.5" = {
@@ -833,13 +2687,13 b' let'
833 2687 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
834 2688 };
835 2689 };
836 "escodegen-1.11.0" = {
837 name = "escodegen";
838 packageName = "escodegen";
839 version = "1.11.0";
840 src = fetchurl {
841 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz";
842 sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==";
2690 "eslint-scope-4.0.0" = {
2691 name = "eslint-scope";
2692 packageName = "eslint-scope";
2693 version = "4.0.0";
2694 src = fetchurl {
2695 url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz";
2696 sha512 = "1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==";
843 2697 };
844 2698 };
845 2699 "espree-3.5.4" = {
@@ -860,6 +2714,15 b' let'
860 2714 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
861 2715 };
862 2716 };
2717 "esprima-2.7.3" = {
2718 name = "esprima";
2719 packageName = "esprima";
2720 version = "2.7.3";
2721 src = fetchurl {
2722 url = "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz";
2723 sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
2724 };
2725 };
863 2726 "esprima-3.1.3" = {
864 2727 name = "esprima";
865 2728 packageName = "esprima";
@@ -869,13 +2732,13 b' let'
869 2732 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
870 2733 };
871 2734 };
872 "estraverse-3.1.0" = {
873 name = "estraverse";
874 packageName = "estraverse";
875 version = "3.1.0";
876 src = fetchurl {
877 url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz";
878 sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba";
2735 "esrecurse-4.2.1" = {
2736 name = "esrecurse";
2737 packageName = "esrecurse";
2738 version = "4.2.1";
2739 src = fetchurl {
2740 url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz";
2741 sha512 = "64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==";
879 2742 };
880 2743 };
881 2744 "estraverse-4.2.0" = {
@@ -887,15 +2750,6 b' let'
887 2750 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
888 2751 };
889 2752 };
890 "esutils-1.1.6" = {
891 name = "esutils";
892 packageName = "esutils";
893 version = "1.1.6";
894 src = fetchurl {
895 url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz";
896 sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
897 };
898 };
899 2753 "esutils-2.0.2" = {
900 2754 name = "esutils";
901 2755 packageName = "esutils";
@@ -914,6 +2768,33 b' let'
914 2768 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
915 2769 };
916 2770 };
2771 "events-1.1.1" = {
2772 name = "events";
2773 packageName = "events";
2774 version = "1.1.1";
2775 src = fetchurl {
2776 url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz";
2777 sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
2778 };
2779 };
2780 "evp_bytestokey-1.0.3" = {
2781 name = "evp_bytestokey";
2782 packageName = "evp_bytestokey";
2783 version = "1.0.3";
2784 src = fetchurl {
2785 url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2786 sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==";
2787 };
2788 };
2789 "execa-0.10.0" = {
2790 name = "execa";
2791 packageName = "execa";
2792 version = "0.10.0";
2793 src = fetchurl {
2794 url = "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz";
2795 sha512 = "7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==";
2796 };
2797 };
917 2798 "exit-0.1.2" = {
918 2799 name = "exit";
919 2800 packageName = "exit";
@@ -923,6 +2804,33 b' let'
923 2804 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
924 2805 };
925 2806 };
2807 "expand-brackets-2.1.4" = {
2808 name = "expand-brackets";
2809 packageName = "expand-brackets";
2810 version = "2.1.4";
2811 src = fetchurl {
2812 url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz";
2813 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2814 };
2815 };
2816 "expand-tilde-2.0.2" = {
2817 name = "expand-tilde";
2818 packageName = "expand-tilde";
2819 version = "2.0.2";
2820 src = fetchurl {
2821 url = "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz";
2822 sha1 = "97e801aa052df02454de46b02bf621642cdc8502";
2823 };
2824 };
2825 "exports-loader-0.6.4" = {
2826 name = "exports-loader";
2827 packageName = "exports-loader";
2828 version = "0.6.4";
2829 src = fetchurl {
2830 url = "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz";
2831 sha1 = "d70fc6121975b35fc12830cf52754be2740fc886";
2832 };
2833 };
926 2834 "extend-3.0.2" = {
927 2835 name = "extend";
928 2836 packageName = "extend";
@@ -932,6 +2840,33 b' let'
932 2840 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
933 2841 };
934 2842 };
2843 "extend-shallow-2.0.1" = {
2844 name = "extend-shallow";
2845 packageName = "extend-shallow";
2846 version = "2.0.1";
2847 src = fetchurl {
2848 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";
2849 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2850 };
2851 };
2852 "extend-shallow-3.0.2" = {
2853 name = "extend-shallow";
2854 packageName = "extend-shallow";
2855 version = "3.0.2";
2856 src = fetchurl {
2857 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz";
2858 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2859 };
2860 };
2861 "extglob-2.0.4" = {
2862 name = "extglob";
2863 packageName = "extglob";
2864 version = "2.0.4";
2865 src = fetchurl {
2866 url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz";
2867 sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==";
2868 };
2869 };
935 2870 "extract-zip-1.6.7" = {
936 2871 name = "extract-zip";
937 2872 packageName = "extract-zip";
@@ -959,13 +2894,31 b' let'
959 2894 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
960 2895 };
961 2896 };
962 "fast-levenshtein-2.0.6" = {
963 name = "fast-levenshtein";
964 packageName = "fast-levenshtein";
965 version = "2.0.6";
966 src = fetchurl {
967 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
968 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2897 "fast-deep-equal-2.0.1" = {
2898 name = "fast-deep-equal";
2899 packageName = "fast-deep-equal";
2900 version = "2.0.1";
2901 src = fetchurl {
2902 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
2903 sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
2904 };
2905 };
2906 "fast-json-stable-stringify-2.0.0" = {
2907 name = "fast-json-stable-stringify";
2908 packageName = "fast-json-stable-stringify";
2909 version = "2.0.0";
2910 src = fetchurl {
2911 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
2912 sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
2913 };
2914 };
2915 "fastparse-1.1.1" = {
2916 name = "fastparse";
2917 packageName = "fastparse";
2918 version = "1.1.1";
2919 src = fetchurl {
2920 url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz";
2921 sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8";
969 2922 };
970 2923 };
971 2924 "favico.js-0.3.10" = {
@@ -995,15 +2948,6 b' let'
995 2948 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
996 2949 };
997 2950 };
998 "feature-detect-es6-1.5.0" = {
999 name = "feature-detect-es6";
1000 packageName = "feature-detect-es6";
1001 version = "1.5.0";
1002 src = fetchurl {
1003 url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz";
1004 sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==";
1005 };
1006 };
1007 2951 "file-sync-cmp-0.1.1" = {
1008 2952 name = "file-sync-cmp";
1009 2953 packageName = "file-sync-cmp";
@@ -1013,22 +2957,40 b' let'
1013 2957 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
1014 2958 };
1015 2959 };
1016 "find-replace-1.0.3" = {
1017 name = "find-replace";
1018 packageName = "find-replace";
1019 version = "1.0.3";
1020 src = fetchurl {
1021 url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz";
1022 sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0";
1023 };
1024 };
1025 "findit-2.0.0" = {
1026 name = "findit";
1027 packageName = "findit";
1028 version = "2.0.0";
1029 src = fetchurl {
1030 url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz";
1031 sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e";
2960 "fill-range-4.0.0" = {
2961 name = "fill-range";
2962 packageName = "fill-range";
2963 version = "4.0.0";
2964 src = fetchurl {
2965 url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";
2966 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2967 };
2968 };
2969 "find-cache-dir-1.0.0" = {
2970 name = "find-cache-dir";
2971 packageName = "find-cache-dir";
2972 version = "1.0.0";
2973 src = fetchurl {
2974 url = "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
2975 sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
2976 };
2977 };
2978 "find-up-2.1.0" = {
2979 name = "find-up";
2980 packageName = "find-up";
2981 version = "2.1.0";
2982 src = fetchurl {
2983 url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz";
2984 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2985 };
2986 };
2987 "find-up-3.0.0" = {
2988 name = "find-up";
2989 packageName = "find-up";
2990 version = "3.0.0";
2991 src = fetchurl {
2992 url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
2993 sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
1032 2994 };
1033 2995 };
1034 2996 "findup-sync-0.1.3" = {
@@ -1040,13 +3002,67 b' let'
1040 3002 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
1041 3003 };
1042 3004 };
1043 "foreachasync-3.0.0" = {
1044 name = "foreachasync";
1045 packageName = "foreachasync";
1046 version = "3.0.0";
1047 src = fetchurl {
1048 url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz";
1049 sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6";
3005 "findup-sync-2.0.0" = {
3006 name = "findup-sync";
3007 packageName = "findup-sync";
3008 version = "2.0.0";
3009 src = fetchurl {
3010 url = "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz";
3011 sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc";
3012 };
3013 };
3014 "fined-1.1.0" = {
3015 name = "fined";
3016 packageName = "fined";
3017 version = "1.1.0";
3018 src = fetchurl {
3019 url = "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz";
3020 sha1 = "b37dc844b76a2f5e7081e884f7c0ae344f153476";
3021 };
3022 };
3023 "flagged-respawn-1.0.0" = {
3024 name = "flagged-respawn";
3025 packageName = "flagged-respawn";
3026 version = "1.0.0";
3027 src = fetchurl {
3028 url = "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz";
3029 sha1 = "4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7";
3030 };
3031 };
3032 "flatten-1.0.2" = {
3033 name = "flatten";
3034 packageName = "flatten";
3035 version = "1.0.2";
3036 src = fetchurl {
3037 url = "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz";
3038 sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
3039 };
3040 };
3041 "flush-write-stream-1.0.3" = {
3042 name = "flush-write-stream";
3043 packageName = "flush-write-stream";
3044 version = "1.0.3";
3045 src = fetchurl {
3046 url = "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz";
3047 sha512 = "calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==";
3048 };
3049 };
3050 "for-in-1.0.2" = {
3051 name = "for-in";
3052 packageName = "for-in";
3053 version = "1.0.2";
3054 src = fetchurl {
3055 url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
3056 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
3057 };
3058 };
3059 "for-own-1.0.0" = {
3060 name = "for-own";
3061 packageName = "for-own";
3062 version = "1.0.0";
3063 src = fetchurl {
3064 url = "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz";
3065 sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
1050 3066 };
1051 3067 };
1052 3068 "forever-agent-0.6.1" = {
@@ -1067,13 +3083,22 b' let'
1067 3083 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
1068 3084 };
1069 3085 };
1070 "fs-extra-0.6.4" = {
1071 name = "fs-extra";
1072 packageName = "fs-extra";
1073 version = "0.6.4";
1074 src = fetchurl {
1075 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz";
1076 sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15";
3086 "fragment-cache-0.2.1" = {
3087 name = "fragment-cache";
3088 packageName = "fragment-cache";
3089 version = "0.2.1";
3090 src = fetchurl {
3091 url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz";
3092 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
3093 };
3094 };
3095 "from2-2.3.0" = {
3096 name = "from2";
3097 packageName = "from2";
3098 version = "2.3.0";
3099 src = fetchurl {
3100 url = "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz";
3101 sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
1077 3102 };
1078 3103 };
1079 3104 "fs-extra-1.0.0" = {
@@ -1085,13 +3110,13 b' let'
1085 3110 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
1086 3111 };
1087 3112 };
1088 "fs.extra-1.3.2" = {
1089 name = "fs.extra";
1090 packageName = "fs.extra";
1091 version = "1.3.2";
1092 src = fetchurl {
1093 url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz";
1094 sha1 = "dd023f93013bee24531f1b33514c37b20fd93349";
3113 "fs-write-stream-atomic-1.0.10" = {
3114 name = "fs-write-stream-atomic";
3115 packageName = "fs-write-stream-atomic";
3116 version = "1.0.10";
3117 src = fetchurl {
3118 url = "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
3119 sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
1095 3120 };
1096 3121 };
1097 3122 "fs.realpath-1.0.0" = {
@@ -1103,13 +3128,22 b' let'
1103 3128 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1104 3129 };
1105 3130 };
1106 "gauge-2.7.4" = {
1107 name = "gauge";
1108 packageName = "gauge";
1109 version = "2.7.4";
1110 src = fetchurl {
1111 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
1112 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
3131 "fsevents-1.2.4" = {
3132 name = "fsevents";
3133 packageName = "fsevents";
3134 version = "1.2.4";
3135 src = fetchurl {
3136 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz";
3137 sha512 = "z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==";
3138 };
3139 };
3140 "function-bind-1.1.1" = {
3141 name = "function-bind";
3142 packageName = "function-bind";
3143 version = "1.1.1";
3144 src = fetchurl {
3145 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
3146 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
1113 3147 };
1114 3148 };
1115 3149 "gaze-0.5.2" = {
@@ -1121,6 +3155,33 b' let'
1121 3155 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
1122 3156 };
1123 3157 };
3158 "get-caller-file-1.0.3" = {
3159 name = "get-caller-file";
3160 packageName = "get-caller-file";
3161 version = "1.0.3";
3162 src = fetchurl {
3163 url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz";
3164 sha512 = "3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==";
3165 };
3166 };
3167 "get-stream-3.0.0" = {
3168 name = "get-stream";
3169 packageName = "get-stream";
3170 version = "3.0.0";
3171 src = fetchurl {
3172 url = "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz";
3173 sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
3174 };
3175 };
3176 "get-value-2.0.6" = {
3177 name = "get-value";
3178 packageName = "get-value";
3179 version = "2.0.6";
3180 src = fetchurl {
3181 url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz";
3182 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
3183 };
3184 };
1124 3185 "getobject-0.1.0" = {
1125 3186 name = "getobject";
1126 3187 packageName = "getobject";
@@ -1157,13 +3218,67 b' let'
1157 3218 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
1158 3219 };
1159 3220 };
1160 "glob-7.1.2" = {
3221 "glob-7.1.3" = {
1161 3222 name = "glob";
1162 3223 packageName = "glob";
1163 version = "7.1.2";
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz";
1166 sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==";
3224 version = "7.1.3";
3225 src = fetchurl {
3226 url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";
3227 sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==";
3228 };
3229 };
3230 "glob-parent-3.1.0" = {
3231 name = "glob-parent";
3232 packageName = "glob-parent";
3233 version = "3.1.0";
3234 src = fetchurl {
3235 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz";
3236 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
3237 };
3238 };
3239 "global-modules-1.0.0" = {
3240 name = "global-modules";
3241 packageName = "global-modules";
3242 version = "1.0.0";
3243 src = fetchurl {
3244 url = "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz";
3245 sha512 = "sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==";
3246 };
3247 };
3248 "global-modules-path-2.3.0" = {
3249 name = "global-modules-path";
3250 packageName = "global-modules-path";
3251 version = "2.3.0";
3252 src = fetchurl {
3253 url = "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz";
3254 sha512 = "HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==";
3255 };
3256 };
3257 "global-prefix-1.0.2" = {
3258 name = "global-prefix";
3259 packageName = "global-prefix";
3260 version = "1.0.2";
3261 src = fetchurl {
3262 url = "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz";
3263 sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe";
3264 };
3265 };
3266 "globals-9.18.0" = {
3267 name = "globals";
3268 packageName = "globals";
3269 version = "9.18.0";
3270 src = fetchurl {
3271 url = "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz";
3272 sha512 = "S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==";
3273 };
3274 };
3275 "globby-7.1.1" = {
3276 name = "globby";
3277 packageName = "globby";
3278 version = "7.1.1";
3279 src = fetchurl {
3280 url = "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz";
3281 sha1 = "fb2ccff9401f8600945dfada97440cca972b8680";
1167 3282 };
1168 3283 };
1169 3284 "globule-0.1.0" = {
@@ -1211,6 +3326,15 b' let'
1211 3326 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
1212 3327 };
1213 3328 };
3329 "grunt-cli-1.3.1" = {
3330 name = "grunt-cli";
3331 packageName = "grunt-cli";
3332 version = "1.3.1";
3333 src = fetchurl {
3334 url = "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.1.tgz";
3335 sha512 = "UwBRu/QpAjDc53DRLEkyilFdL0zenpxu+fddTIlsF/KJqdNcHaQmvyu1W3cDesZ9rqqZdKK5A8+QDIyLUEWoZQ==";
3336 };
3337 };
1214 3338 "grunt-contrib-concat-0.5.1" = {
1215 3339 name = "grunt-contrib-concat";
1216 3340 packageName = "grunt-contrib-concat";
@@ -1256,13 +3380,13 b' let'
1256 3380 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
1257 3381 };
1258 3382 };
1259 "grunt-crisper-1.0.1" = {
1260 name = "grunt-crisper";
1261 packageName = "grunt-crisper";
1262 version = "1.0.1";
1263 src = fetchurl {
1264 url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz";
1265 sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7";
3383 "grunt-known-options-1.1.1" = {
3384 name = "grunt-known-options";
3385 packageName = "grunt-known-options";
3386 version = "1.1.1";
3387 src = fetchurl {
3388 url = "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz";
3389 sha512 = "cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==";
1266 3390 };
1267 3391 };
1268 3392 "grunt-legacy-log-0.1.3" = {
@@ -1292,13 +3416,13 b' let'
1292 3416 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
1293 3417 };
1294 3418 };
1295 "grunt-vulcanize-1.0.0" = {
1296 name = "grunt-vulcanize";
1297 packageName = "grunt-vulcanize";
1298 version = "1.0.0";
1299 src = fetchurl {
1300 url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz";
1301 sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f";
3419 "grunt-webpack-3.1.3" = {
3420 name = "grunt-webpack";
3421 packageName = "grunt-webpack";
3422 version = "3.1.3";
3423 src = fetchurl {
3424 url = "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-3.1.3.tgz";
3425 sha512 = "SaZ8K8lG4iTxs7ClZxOWCf3kxqS2y+Eel8SbaEGgBKwhAp6e45beIu+vhBZRLX3vonKML2kjemKsQ21REaqNFQ==";
1302 3426 };
1303 3427 };
1304 3428 "har-schema-1.0.5" = {
@@ -1319,6 +3443,15 b' let'
1319 3443 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
1320 3444 };
1321 3445 };
3446 "has-1.0.3" = {
3447 name = "has";
3448 packageName = "has";
3449 version = "1.0.3";
3450 src = fetchurl {
3451 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
3452 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
3453 };
3454 };
1322 3455 "has-ansi-0.1.0" = {
1323 3456 name = "has-ansi";
1324 3457 packageName = "has-ansi";
@@ -1337,13 +3470,85 b' let'
1337 3470 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
1338 3471 };
1339 3472 };
1340 "has-unicode-2.0.1" = {
1341 name = "has-unicode";
1342 packageName = "has-unicode";
1343 version = "2.0.1";
1344 src = fetchurl {
1345 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
1346 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
3473 "has-flag-1.0.0" = {
3474 name = "has-flag";
3475 packageName = "has-flag";
3476 version = "1.0.0";
3477 src = fetchurl {
3478 url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz";
3479 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
3480 };
3481 };
3482 "has-flag-3.0.0" = {
3483 name = "has-flag";
3484 packageName = "has-flag";
3485 version = "3.0.0";
3486 src = fetchurl {
3487 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
3488 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3489 };
3490 };
3491 "has-symbols-1.0.0" = {
3492 name = "has-symbols";
3493 packageName = "has-symbols";
3494 version = "1.0.0";
3495 src = fetchurl {
3496 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";
3497 sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
3498 };
3499 };
3500 "has-value-0.3.1" = {
3501 name = "has-value";
3502 packageName = "has-value";
3503 version = "0.3.1";
3504 src = fetchurl {
3505 url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz";
3506 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
3507 };
3508 };
3509 "has-value-1.0.0" = {
3510 name = "has-value";
3511 packageName = "has-value";
3512 version = "1.0.0";
3513 src = fetchurl {
3514 url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz";
3515 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
3516 };
3517 };
3518 "has-values-0.1.4" = {
3519 name = "has-values";
3520 packageName = "has-values";
3521 version = "0.1.4";
3522 src = fetchurl {
3523 url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
3524 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
3525 };
3526 };
3527 "has-values-1.0.0" = {
3528 name = "has-values";
3529 packageName = "has-values";
3530 version = "1.0.0";
3531 src = fetchurl {
3532 url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz";
3533 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
3534 };
3535 };
3536 "hash-base-3.0.4" = {
3537 name = "hash-base";
3538 packageName = "hash-base";
3539 version = "3.0.4";
3540 src = fetchurl {
3541 url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz";
3542 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
3543 };
3544 };
3545 "hash.js-1.1.5" = {
3546 name = "hash.js";
3547 packageName = "hash.js";
3548 version = "1.1.5";
3549 src = fetchurl {
3550 url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz";
3551 sha512 = "eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==";
1347 3552 };
1348 3553 };
1349 3554 "hasha-2.2.0" = {
@@ -1364,6 +3569,24 b' let'
1364 3569 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
1365 3570 };
1366 3571 };
3572 "he-1.2.0" = {
3573 name = "he";
3574 packageName = "he";
3575 version = "1.2.0";
3576 src = fetchurl {
3577 url = "https://registry.npmjs.org/he/-/he-1.2.0.tgz";
3578 sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==";
3579 };
3580 };
3581 "hmac-drbg-1.0.1" = {
3582 name = "hmac-drbg";
3583 packageName = "hmac-drbg";
3584 version = "1.0.1";
3585 src = fetchurl {
3586 url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
3587 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
3588 };
3589 };
1367 3590 "hoek-2.16.3" = {
1368 3591 name = "hoek";
1369 3592 packageName = "hoek";
@@ -1373,6 +3596,24 b' let'
1373 3596 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
1374 3597 };
1375 3598 };
3599 "home-or-tmp-2.0.0" = {
3600 name = "home-or-tmp";
3601 packageName = "home-or-tmp";
3602 version = "2.0.0";
3603 src = fetchurl {
3604 url = "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
3605 sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
3606 };
3607 };
3608 "homedir-polyfill-1.0.1" = {
3609 name = "homedir-polyfill";
3610 packageName = "homedir-polyfill";
3611 version = "1.0.1";
3612 src = fetchurl {
3613 url = "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz";
3614 sha1 = "4c2bbc8a758998feebf5ed68580f76d46768b4bc";
3615 };
3616 };
1376 3617 "hooker-0.2.3" = {
1377 3618 name = "hooker";
1378 3619 packageName = "hooker";
@@ -1382,13 +3623,58 b' let'
1382 3623 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
1383 3624 };
1384 3625 };
1385 "hosted-git-info-2.7.1" = {
1386 name = "hosted-git-info";
1387 packageName = "hosted-git-info";
1388 version = "2.7.1";
1389 src = fetchurl {
1390 url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
1391 sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==";
3626 "html-comment-regex-1.1.2" = {
3627 name = "html-comment-regex";
3628 packageName = "html-comment-regex";
3629 version = "1.1.2";
3630 src = fetchurl {
3631 url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
3632 sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==";
3633 };
3634 };
3635 "html-loader-0.4.5" = {
3636 name = "html-loader";
3637 packageName = "html-loader";
3638 version = "0.4.5";
3639 src = fetchurl {
3640 url = "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz";
3641 sha1 = "5fbcd87cd63a5c49a7fce2fe56f425e05729c68c";
3642 };
3643 };
3644 "html-loader-0.5.5" = {
3645 name = "html-loader";
3646 packageName = "html-loader";
3647 version = "0.5.5";
3648 src = fetchurl {
3649 url = "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz";
3650 sha512 = "7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==";
3651 };
3652 };
3653 "html-minifier-3.5.21" = {
3654 name = "html-minifier";
3655 packageName = "html-minifier";
3656 version = "3.5.21";
3657 src = fetchurl {
3658 url = "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz";
3659 sha512 = "LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==";
3660 };
3661 };
3662 "html-webpack-plugin-3.2.0" = {
3663 name = "html-webpack-plugin";
3664 packageName = "html-webpack-plugin";
3665 version = "3.2.0";
3666 src = fetchurl {
3667 url = "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz";
3668 sha1 = "b01abbd723acaaa7b37b6af4492ebda03d9dd37b";
3669 };
3670 };
3671 "htmlparser2-3.3.0" = {
3672 name = "htmlparser2";
3673 packageName = "htmlparser2";
3674 version = "3.3.0";
3675 src = fetchurl {
3676 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz";
3677 sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe";
1392 3678 };
1393 3679 };
1394 3680 "htmlparser2-3.8.3" = {
@@ -1409,13 +3695,13 b' let'
1409 3695 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
1410 3696 };
1411 3697 };
1412 "hydrolysis-1.25.0" = {
1413 name = "hydrolysis";
1414 packageName = "hydrolysis";
1415 version = "1.25.0";
1416 src = fetchurl {
1417 url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz";
1418 sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84";
3698 "https-browserify-1.0.0" = {
3699 name = "https-browserify";
3700 packageName = "https-browserify";
3701 version = "1.0.0";
3702 src = fetchurl {
3703 url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";
3704 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
1419 3705 };
1420 3706 };
1421 3707 "iconv-lite-0.2.11" = {
@@ -1427,6 +3713,51 b' let'
1427 3713 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
1428 3714 };
1429 3715 };
3716 "icss-replace-symbols-1.1.0" = {
3717 name = "icss-replace-symbols";
3718 packageName = "icss-replace-symbols";
3719 version = "1.1.0";
3720 src = fetchurl {
3721 url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
3722 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
3723 };
3724 };
3725 "icss-utils-2.1.0" = {
3726 name = "icss-utils";
3727 packageName = "icss-utils";
3728 version = "2.1.0";
3729 src = fetchurl {
3730 url = "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz";
3731 sha1 = "83f0a0ec378bf3246178b6c2ad9136f135b1c962";
3732 };
3733 };
3734 "ieee754-1.1.12" = {
3735 name = "ieee754";
3736 packageName = "ieee754";
3737 version = "1.1.12";
3738 src = fetchurl {
3739 url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz";
3740 sha512 = "GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==";
3741 };
3742 };
3743 "iferr-0.1.5" = {
3744 name = "iferr";
3745 packageName = "iferr";
3746 version = "0.1.5";
3747 src = fetchurl {
3748 url = "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz";
3749 sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
3750 };
3751 };
3752 "ignore-3.3.10" = {
3753 name = "ignore";
3754 packageName = "ignore";
3755 version = "3.3.10";
3756 src = fetchurl {
3757 url = "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz";
3758 sha512 = "Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==";
3759 };
3760 };
1430 3761 "image-size-0.5.5" = {
1431 3762 name = "image-size";
1432 3763 packageName = "image-size";
@@ -1436,6 +3767,51 b' let'
1436 3767 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1437 3768 };
1438 3769 };
3770 "import-local-2.0.0" = {
3771 name = "import-local";
3772 packageName = "import-local";
3773 version = "2.0.0";
3774 src = fetchurl {
3775 url = "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz";
3776 sha512 = "b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==";
3777 };
3778 };
3779 "imports-loader-0.7.1" = {
3780 name = "imports-loader";
3781 packageName = "imports-loader";
3782 version = "0.7.1";
3783 src = fetchurl {
3784 url = "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz";
3785 sha1 = "f204b5f34702a32c1db7d48d89d5e867a0441253";
3786 };
3787 };
3788 "imurmurhash-0.1.4" = {
3789 name = "imurmurhash";
3790 packageName = "imurmurhash";
3791 version = "0.1.4";
3792 src = fetchurl {
3793 url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz";
3794 sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
3795 };
3796 };
3797 "indexes-of-1.0.1" = {
3798 name = "indexes-of";
3799 packageName = "indexes-of";
3800 version = "1.0.1";
3801 src = fetchurl {
3802 url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz";
3803 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3804 };
3805 };
3806 "indexof-0.0.1" = {
3807 name = "indexof";
3808 packageName = "indexof";
3809 version = "0.0.1";
3810 src = fetchurl {
3811 url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
3812 sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
3813 };
3814 };
1439 3815 "inflight-1.0.6" = {
1440 3816 name = "inflight";
1441 3817 packageName = "inflight";
@@ -1454,6 +3830,15 b' let'
1454 3830 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
1455 3831 };
1456 3832 };
3833 "inherits-2.0.1" = {
3834 name = "inherits";
3835 packageName = "inherits";
3836 version = "2.0.1";
3837 src = fetchurl {
3838 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
3839 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3840 };
3841 };
1457 3842 "inherits-2.0.3" = {
1458 3843 name = "inherits";
1459 3844 packageName = "inherits";
@@ -1472,13 +3857,175 b' let'
1472 3857 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
1473 3858 };
1474 3859 };
1475 "is-builtin-module-1.0.0" = {
1476 name = "is-builtin-module";
1477 packageName = "is-builtin-module";
3860 "interpret-1.1.0" = {
3861 name = "interpret";
3862 packageName = "interpret";
3863 version = "1.1.0";
3864 src = fetchurl {
3865 url = "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz";
3866 sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
3867 };
3868 };
3869 "invariant-2.2.4" = {
3870 name = "invariant";
3871 packageName = "invariant";
3872 version = "2.2.4";
3873 src = fetchurl {
3874 url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz";
3875 sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==";
3876 };
3877 };
3878 "invert-kv-2.0.0" = {
3879 name = "invert-kv";
3880 packageName = "invert-kv";
3881 version = "2.0.0";
3882 src = fetchurl {
3883 url = "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz";
3884 sha512 = "wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==";
3885 };
3886 };
3887 "is-absolute-1.0.0" = {
3888 name = "is-absolute";
3889 packageName = "is-absolute";
3890 version = "1.0.0";
3891 src = fetchurl {
3892 url = "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz";
3893 sha512 = "dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==";
3894 };
3895 };
3896 "is-absolute-url-2.1.0" = {
3897 name = "is-absolute-url";
3898 packageName = "is-absolute-url";
3899 version = "2.1.0";
3900 src = fetchurl {
3901 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3902 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3903 };
3904 };
3905 "is-accessor-descriptor-0.1.6" = {
3906 name = "is-accessor-descriptor";
3907 packageName = "is-accessor-descriptor";
3908 version = "0.1.6";
3909 src = fetchurl {
3910 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3911 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3912 };
3913 };
3914 "is-accessor-descriptor-1.0.0" = {
3915 name = "is-accessor-descriptor";
3916 packageName = "is-accessor-descriptor";
1478 3917 version = "1.0.0";
1479 3918 src = fetchurl {
1480 url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
1481 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
3919 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
3920 sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==";
3921 };
3922 };
3923 "is-binary-path-1.0.1" = {
3924 name = "is-binary-path";
3925 packageName = "is-binary-path";
3926 version = "1.0.1";
3927 src = fetchurl {
3928 url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz";
3929 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3930 };
3931 };
3932 "is-buffer-1.1.6" = {
3933 name = "is-buffer";
3934 packageName = "is-buffer";
3935 version = "1.1.6";
3936 src = fetchurl {
3937 url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
3938 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3939 };
3940 };
3941 "is-callable-1.1.4" = {
3942 name = "is-callable";
3943 packageName = "is-callable";
3944 version = "1.1.4";
3945 src = fetchurl {
3946 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz";
3947 sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==";
3948 };
3949 };
3950 "is-data-descriptor-0.1.4" = {
3951 name = "is-data-descriptor";
3952 packageName = "is-data-descriptor";
3953 version = "0.1.4";
3954 src = fetchurl {
3955 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3956 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3957 };
3958 };
3959 "is-data-descriptor-1.0.0" = {
3960 name = "is-data-descriptor";
3961 packageName = "is-data-descriptor";
3962 version = "1.0.0";
3963 src = fetchurl {
3964 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3965 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3966 };
3967 };
3968 "is-date-object-1.0.1" = {
3969 name = "is-date-object";
3970 packageName = "is-date-object";
3971 version = "1.0.1";
3972 src = fetchurl {
3973 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz";
3974 sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
3975 };
3976 };
3977 "is-descriptor-0.1.6" = {
3978 name = "is-descriptor";
3979 packageName = "is-descriptor";
3980 version = "0.1.6";
3981 src = fetchurl {
3982 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz";
3983 sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==";
3984 };
3985 };
3986 "is-descriptor-1.0.2" = {
3987 name = "is-descriptor";
3988 packageName = "is-descriptor";
3989 version = "1.0.2";
3990 src = fetchurl {
3991 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz";
3992 sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==";
3993 };
3994 };
3995 "is-extendable-0.1.1" = {
3996 name = "is-extendable";
3997 packageName = "is-extendable";
3998 version = "0.1.1";
3999 src = fetchurl {
4000 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
4001 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
4002 };
4003 };
4004 "is-extendable-1.0.1" = {
4005 name = "is-extendable";
4006 packageName = "is-extendable";
4007 version = "1.0.1";
4008 src = fetchurl {
4009 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz";
4010 sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==";
4011 };
4012 };
4013 "is-extglob-2.1.1" = {
4014 name = "is-extglob";
4015 packageName = "is-extglob";
4016 version = "2.1.1";
4017 src = fetchurl {
4018 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
4019 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
4020 };
4021 };
4022 "is-finite-1.0.2" = {
4023 name = "is-finite";
4024 packageName = "is-finite";
4025 version = "1.0.2";
4026 src = fetchurl {
4027 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";
4028 sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
1482 4029 };
1483 4030 };
1484 4031 "is-fullwidth-code-point-1.0.0" = {
@@ -1490,6 +4037,78 b' let'
1490 4037 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1491 4038 };
1492 4039 };
4040 "is-fullwidth-code-point-2.0.0" = {
4041 name = "is-fullwidth-code-point";
4042 packageName = "is-fullwidth-code-point";
4043 version = "2.0.0";
4044 src = fetchurl {
4045 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
4046 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
4047 };
4048 };
4049 "is-glob-3.1.0" = {
4050 name = "is-glob";
4051 packageName = "is-glob";
4052 version = "3.1.0";
4053 src = fetchurl {
4054 url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz";
4055 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
4056 };
4057 };
4058 "is-glob-4.0.0" = {
4059 name = "is-glob";
4060 packageName = "is-glob";
4061 version = "4.0.0";
4062 src = fetchurl {
4063 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz";
4064 sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
4065 };
4066 };
4067 "is-number-3.0.0" = {
4068 name = "is-number";
4069 packageName = "is-number";
4070 version = "3.0.0";
4071 src = fetchurl {
4072 url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";
4073 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
4074 };
4075 };
4076 "is-plain-obj-1.1.0" = {
4077 name = "is-plain-obj";
4078 packageName = "is-plain-obj";
4079 version = "1.1.0";
4080 src = fetchurl {
4081 url = "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
4082 sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
4083 };
4084 };
4085 "is-plain-object-2.0.4" = {
4086 name = "is-plain-object";
4087 packageName = "is-plain-object";
4088 version = "2.0.4";
4089 src = fetchurl {
4090 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
4091 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
4092 };
4093 };
4094 "is-regex-1.0.4" = {
4095 name = "is-regex";
4096 packageName = "is-regex";
4097 version = "1.0.4";
4098 src = fetchurl {
4099 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";
4100 sha1 = "5517489b547091b0930e095654ced25ee97e9491";
4101 };
4102 };
4103 "is-relative-1.0.0" = {
4104 name = "is-relative";
4105 packageName = "is-relative";
4106 version = "1.0.0";
4107 src = fetchurl {
4108 url = "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz";
4109 sha512 = "Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==";
4110 };
4111 };
1493 4112 "is-stream-1.1.0" = {
1494 4113 name = "is-stream";
1495 4114 packageName = "is-stream";
@@ -1499,6 +4118,24 b' let'
1499 4118 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
1500 4119 };
1501 4120 };
4121 "is-svg-2.1.0" = {
4122 name = "is-svg";
4123 packageName = "is-svg";
4124 version = "2.1.0";
4125 src = fetchurl {
4126 url = "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz";
4127 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
4128 };
4129 };
4130 "is-symbol-1.0.2" = {
4131 name = "is-symbol";
4132 packageName = "is-symbol";
4133 version = "1.0.2";
4134 src = fetchurl {
4135 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz";
4136 sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==";
4137 };
4138 };
1502 4139 "is-typedarray-1.0.0" = {
1503 4140 name = "is-typedarray";
1504 4141 packageName = "is-typedarray";
@@ -1508,6 +4145,24 b' let'
1508 4145 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1509 4146 };
1510 4147 };
4148 "is-unc-path-1.0.0" = {
4149 name = "is-unc-path";
4150 packageName = "is-unc-path";
4151 version = "1.0.0";
4152 src = fetchurl {
4153 url = "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz";
4154 sha512 = "mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==";
4155 };
4156 };
4157 "is-windows-1.0.2" = {
4158 name = "is-windows";
4159 packageName = "is-windows";
4160 version = "1.0.2";
4161 src = fetchurl {
4162 url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz";
4163 sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==";
4164 };
4165 };
1511 4166 "isarray-0.0.1" = {
1512 4167 name = "isarray";
1513 4168 packageName = "isarray";
@@ -1535,6 +4190,24 b' let'
1535 4190 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1536 4191 };
1537 4192 };
4193 "isobject-2.1.0" = {
4194 name = "isobject";
4195 packageName = "isobject";
4196 version = "2.1.0";
4197 src = fetchurl {
4198 url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz";
4199 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
4200 };
4201 };
4202 "isobject-3.0.1" = {
4203 name = "isobject";
4204 packageName = "isobject";
4205 version = "3.0.1";
4206 src = fetchurl {
4207 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
4208 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
4209 };
4210 };
1538 4211 "isstream-0.1.2" = {
1539 4212 name = "isstream";
1540 4213 packageName = "isstream";
@@ -1553,6 +4226,24 b' let'
1553 4226 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
1554 4227 };
1555 4228 };
4229 "js-base64-2.4.9" = {
4230 name = "js-base64";
4231 packageName = "js-base64";
4232 version = "2.4.9";
4233 src = fetchurl {
4234 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz";
4235 sha512 = "xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==";
4236 };
4237 };
4238 "js-tokens-3.0.2" = {
4239 name = "js-tokens";
4240 packageName = "js-tokens";
4241 version = "3.0.2";
4242 src = fetchurl {
4243 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz";
4244 sha1 = "9866df395102130e38f7f996bceb65443209c25b";
4245 };
4246 };
1556 4247 "js-yaml-2.0.5" = {
1557 4248 name = "js-yaml";
1558 4249 packageName = "js-yaml";
@@ -1562,6 +4253,15 b' let'
1562 4253 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
1563 4254 };
1564 4255 };
4256 "js-yaml-3.7.0" = {
4257 name = "js-yaml";
4258 packageName = "js-yaml";
4259 version = "3.7.0";
4260 src = fetchurl {
4261 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz";
4262 sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80";
4263 };
4264 };
1565 4265 "jsbn-0.1.1" = {
1566 4266 name = "jsbn";
1567 4267 packageName = "jsbn";
@@ -1571,6 +4271,24 b' let'
1571 4271 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1572 4272 };
1573 4273 };
4274 "jsesc-0.5.0" = {
4275 name = "jsesc";
4276 packageName = "jsesc";
4277 version = "0.5.0";
4278 src = fetchurl {
4279 url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz";
4280 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
4281 };
4282 };
4283 "jsesc-1.3.0" = {
4284 name = "jsesc";
4285 packageName = "jsesc";
4286 version = "1.3.0";
4287 src = fetchurl {
4288 url = "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz";
4289 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4290 };
4291 };
1574 4292 "jshint-2.9.6" = {
1575 4293 name = "jshint";
1576 4294 packageName = "jshint";
@@ -1580,6 +4298,15 b' let'
1580 4298 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
1581 4299 };
1582 4300 };
4301 "json-parse-better-errors-1.0.2" = {
4302 name = "json-parse-better-errors";
4303 packageName = "json-parse-better-errors";
4304 version = "1.0.2";
4305 src = fetchurl {
4306 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
4307 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
4308 };
4309 };
1583 4310 "json-schema-0.2.3" = {
1584 4311 name = "json-schema";
1585 4312 packageName = "json-schema";
@@ -1589,6 +4316,15 b' let'
1589 4316 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1590 4317 };
1591 4318 };
4319 "json-schema-traverse-0.4.1" = {
4320 name = "json-schema-traverse";
4321 packageName = "json-schema-traverse";
4322 version = "0.4.1";
4323 src = fetchurl {
4324 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
4325 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
4326 };
4327 };
1592 4328 "json-stable-stringify-1.0.1" = {
1593 4329 name = "json-stable-stringify";
1594 4330 packageName = "json-stable-stringify";
@@ -1607,13 +4343,13 b' let'
1607 4343 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
1608 4344 };
1609 4345 };
1610 "jsonfile-1.0.1" = {
1611 name = "jsonfile";
1612 packageName = "jsonfile";
1613 version = "1.0.1";
1614 src = fetchurl {
1615 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz";
1616 sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd";
4346 "json5-0.5.1" = {
4347 name = "json5";
4348 packageName = "json5";
4349 version = "0.5.1";
4350 src = fetchurl {
4351 url = "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz";
4352 sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
1617 4353 };
1618 4354 };
1619 4355 "jsonfile-2.4.0" = {
@@ -1652,6 +4388,42 b' let'
1652 4388 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
1653 4389 };
1654 4390 };
4391 "kind-of-3.2.2" = {
4392 name = "kind-of";
4393 packageName = "kind-of";
4394 version = "3.2.2";
4395 src = fetchurl {
4396 url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
4397 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
4398 };
4399 };
4400 "kind-of-4.0.0" = {
4401 name = "kind-of";
4402 packageName = "kind-of";
4403 version = "4.0.0";
4404 src = fetchurl {
4405 url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz";
4406 sha1 = "20813df3d712928b207378691a45066fae72dd57";
4407 };
4408 };
4409 "kind-of-5.1.0" = {
4410 name = "kind-of";
4411 packageName = "kind-of";
4412 version = "5.1.0";
4413 src = fetchurl {
4414 url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz";
4415 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
4416 };
4417 };
4418 "kind-of-6.0.2" = {
4419 name = "kind-of";
4420 packageName = "kind-of";
4421 version = "6.0.2";
4422 src = fetchurl {
4423 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz";
4424 sha512 = "s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==";
4425 };
4426 };
1655 4427 "klaw-1.3.1" = {
1656 4428 name = "klaw";
1657 4429 packageName = "klaw";
@@ -1661,6 +4433,24 b' let'
1661 4433 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
1662 4434 };
1663 4435 };
4436 "lazy-cache-1.0.4" = {
4437 name = "lazy-cache";
4438 packageName = "lazy-cache";
4439 version = "1.0.4";
4440 src = fetchurl {
4441 url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";
4442 sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
4443 };
4444 };
4445 "lcid-2.0.0" = {
4446 name = "lcid";
4447 packageName = "lcid";
4448 version = "2.0.0";
4449 src = fetchurl {
4450 url = "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz";
4451 sha512 = "avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==";
4452 };
4453 };
1664 4454 "less-2.7.3" = {
1665 4455 name = "less";
1666 4456 packageName = "less";
@@ -1670,13 +4460,58 b' let'
1670 4460 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
1671 4461 };
1672 4462 };
1673 "levn-0.3.0" = {
1674 name = "levn";
1675 packageName = "levn";
1676 version = "0.3.0";
1677 src = fetchurl {
1678 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
1679 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
4463 "liftoff-2.5.0" = {
4464 name = "liftoff";
4465 packageName = "liftoff";
4466 version = "2.5.0";
4467 src = fetchurl {
4468 url = "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz";
4469 sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec";
4470 };
4471 };
4472 "loader-runner-2.3.1" = {
4473 name = "loader-runner";
4474 packageName = "loader-runner";
4475 version = "2.3.1";
4476 src = fetchurl {
4477 url = "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz";
4478 sha512 = "By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==";
4479 };
4480 };
4481 "loader-utils-0.2.17" = {
4482 name = "loader-utils";
4483 packageName = "loader-utils";
4484 version = "0.2.17";
4485 src = fetchurl {
4486 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz";
4487 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
4488 };
4489 };
4490 "loader-utils-1.1.0" = {
4491 name = "loader-utils";
4492 packageName = "loader-utils";
4493 version = "1.1.0";
4494 src = fetchurl {
4495 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz";
4496 sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd";
4497 };
4498 };
4499 "locate-path-2.0.0" = {
4500 name = "locate-path";
4501 packageName = "locate-path";
4502 version = "2.0.0";
4503 src = fetchurl {
4504 url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz";
4505 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
4506 };
4507 };
4508 "locate-path-3.0.0" = {
4509 name = "locate-path";
4510 packageName = "locate-path";
4511 version = "3.0.0";
4512 src = fetchurl {
4513 url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
4514 sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
1680 4515 };
1681 4516 };
1682 4517 "lodash-0.9.2" = {
@@ -1706,13 +4541,85 b' let'
1706 4541 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
1707 4542 };
1708 4543 };
1709 "lodash-4.17.10" = {
4544 "lodash-4.17.11" = {
1710 4545 name = "lodash";
1711 4546 packageName = "lodash";
1712 version = "4.17.10";
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz";
1715 sha512 = "UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==";
4547 version = "4.17.11";
4548 src = fetchurl {
4549 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz";
4550 sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==";
4551 };
4552 };
4553 "lodash.camelcase-4.3.0" = {
4554 name = "lodash.camelcase";
4555 packageName = "lodash.camelcase";
4556 version = "4.3.0";
4557 src = fetchurl {
4558 url = "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz";
4559 sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6";
4560 };
4561 };
4562 "lodash.debounce-4.0.8" = {
4563 name = "lodash.debounce";
4564 packageName = "lodash.debounce";
4565 version = "4.0.8";
4566 src = fetchurl {
4567 url = "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
4568 sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
4569 };
4570 };
4571 "lodash.isplainobject-4.0.6" = {
4572 name = "lodash.isplainobject";
4573 packageName = "lodash.isplainobject";
4574 version = "4.0.6";
4575 src = fetchurl {
4576 url = "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz";
4577 sha1 = "7c526a52d89b45c45cc690b88163be0497f550cb";
4578 };
4579 };
4580 "lodash.memoize-4.1.2" = {
4581 name = "lodash.memoize";
4582 packageName = "lodash.memoize";
4583 version = "4.1.2";
4584 src = fetchurl {
4585 url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
4586 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
4587 };
4588 };
4589 "lodash.uniq-4.5.0" = {
4590 name = "lodash.uniq";
4591 packageName = "lodash.uniq";
4592 version = "4.5.0";
4593 src = fetchurl {
4594 url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
4595 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
4596 };
4597 };
4598 "longest-1.0.1" = {
4599 name = "longest";
4600 packageName = "longest";
4601 version = "1.0.1";
4602 src = fetchurl {
4603 url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz";
4604 sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
4605 };
4606 };
4607 "loose-envify-1.4.0" = {
4608 name = "loose-envify";
4609 packageName = "loose-envify";
4610 version = "1.4.0";
4611 src = fetchurl {
4612 url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";
4613 sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==";
4614 };
4615 };
4616 "lower-case-1.1.4" = {
4617 name = "lower-case";
4618 packageName = "lower-case";
4619 version = "1.1.4";
4620 src = fetchurl {
4621 url = "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz";
4622 sha1 = "9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac";
1716 4623 };
1717 4624 };
1718 4625 "lru-cache-2.7.3" = {
@@ -1724,6 +4631,114 b' let'
1724 4631 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
1725 4632 };
1726 4633 };
4634 "lru-cache-4.1.3" = {
4635 name = "lru-cache";
4636 packageName = "lru-cache";
4637 version = "4.1.3";
4638 src = fetchurl {
4639 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz";
4640 sha512 = "fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==";
4641 };
4642 };
4643 "make-dir-1.3.0" = {
4644 name = "make-dir";
4645 packageName = "make-dir";
4646 version = "1.3.0";
4647 src = fetchurl {
4648 url = "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz";
4649 sha512 = "2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==";
4650 };
4651 };
4652 "make-iterator-1.0.1" = {
4653 name = "make-iterator";
4654 packageName = "make-iterator";
4655 version = "1.0.1";
4656 src = fetchurl {
4657 url = "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz";
4658 sha512 = "pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==";
4659 };
4660 };
4661 "map-age-cleaner-0.1.2" = {
4662 name = "map-age-cleaner";
4663 packageName = "map-age-cleaner";
4664 version = "0.1.2";
4665 src = fetchurl {
4666 url = "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz";
4667 sha512 = "UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==";
4668 };
4669 };
4670 "map-cache-0.2.2" = {
4671 name = "map-cache";
4672 packageName = "map-cache";
4673 version = "0.2.2";
4674 src = fetchurl {
4675 url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz";
4676 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
4677 };
4678 };
4679 "map-visit-1.0.0" = {
4680 name = "map-visit";
4681 packageName = "map-visit";
4682 version = "1.0.0";
4683 src = fetchurl {
4684 url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";
4685 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
4686 };
4687 };
4688 "math-expression-evaluator-1.2.17" = {
4689 name = "math-expression-evaluator";
4690 packageName = "math-expression-evaluator";
4691 version = "1.2.17";
4692 src = fetchurl {
4693 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
4694 sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
4695 };
4696 };
4697 "md5.js-1.3.5" = {
4698 name = "md5.js";
4699 packageName = "md5.js";
4700 version = "1.3.5";
4701 src = fetchurl {
4702 url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz";
4703 sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==";
4704 };
4705 };
4706 "mem-4.0.0" = {
4707 name = "mem";
4708 packageName = "mem";
4709 version = "4.0.0";
4710 src = fetchurl {
4711 url = "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz";
4712 sha512 = "WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==";
4713 };
4714 };
4715 "memory-fs-0.4.1" = {
4716 name = "memory-fs";
4717 packageName = "memory-fs";
4718 version = "0.4.1";
4719 src = fetchurl {
4720 url = "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz";
4721 sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
4722 };
4723 };
4724 "micromatch-3.1.10" = {
4725 name = "micromatch";
4726 packageName = "micromatch";
4727 version = "3.1.10";
4728 src = fetchurl {
4729 url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";
4730 sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==";
4731 };
4732 };
4733 "miller-rabin-4.0.1" = {
4734 name = "miller-rabin";
4735 packageName = "miller-rabin";
4736 version = "4.0.1";
4737 src = fetchurl {
4738 url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz";
4739 sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==";
4740 };
4741 };
1727 4742 "mime-1.6.0" = {
1728 4743 name = "mime";
1729 4744 packageName = "mime";
@@ -1733,22 +4748,49 b' let'
1733 4748 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
1734 4749 };
1735 4750 };
1736 "mime-db-1.35.0" = {
4751 "mime-db-1.37.0" = {
1737 4752 name = "mime-db";
1738 4753 packageName = "mime-db";
1739 version = "1.35.0";
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz";
1742 sha512 = "JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==";
1743 };
1744 };
1745 "mime-types-2.1.19" = {
4754 version = "1.37.0";
4755 src = fetchurl {
4756 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz";
4757 sha512 = "R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==";
4758 };
4759 };
4760 "mime-types-2.1.21" = {
1746 4761 name = "mime-types";
1747 4762 packageName = "mime-types";
1748 version = "2.1.19";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz";
1751 sha512 = "P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==";
4763 version = "2.1.21";
4764 src = fetchurl {
4765 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz";
4766 sha512 = "3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==";
4767 };
4768 };
4769 "mimic-fn-1.2.0" = {
4770 name = "mimic-fn";
4771 packageName = "mimic-fn";
4772 version = "1.2.0";
4773 src = fetchurl {
4774 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";
4775 sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==";
4776 };
4777 };
4778 "minimalistic-assert-1.0.1" = {
4779 name = "minimalistic-assert";
4780 packageName = "minimalistic-assert";
4781 version = "1.0.1";
4782 src = fetchurl {
4783 url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
4784 sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==";
4785 };
4786 };
4787 "minimalistic-crypto-utils-1.0.1" = {
4788 name = "minimalistic-crypto-utils";
4789 packageName = "minimalistic-crypto-utils";
4790 version = "1.0.1";
4791 src = fetchurl {
4792 url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
4793 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
1752 4794 };
1753 4795 };
1754 4796 "minimatch-0.2.14" = {
@@ -1787,31 +4829,22 b' let'
1787 4829 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
1788 4830 };
1789 4831 };
1790 "minipass-2.3.3" = {
1791 name = "minipass";
1792 packageName = "minipass";
1793 version = "2.3.3";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz";
1796 sha512 = "/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==";
1797 };
1798 };
1799 "minizlib-1.1.0" = {
1800 name = "minizlib";
1801 packageName = "minizlib";
1802 version = "1.1.0";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz";
1805 sha512 = "4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==";
1806 };
1807 };
1808 "mkdirp-0.3.5" = {
1809 name = "mkdirp";
1810 packageName = "mkdirp";
1811 version = "0.3.5";
1812 src = fetchurl {
1813 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz";
1814 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
4832 "mississippi-2.0.0" = {
4833 name = "mississippi";
4834 packageName = "mississippi";
4835 version = "2.0.0";
4836 src = fetchurl {
4837 url = "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz";
4838 sha512 = "zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==";
4839 };
4840 };
4841 "mixin-deep-1.3.1" = {
4842 name = "mixin-deep";
4843 packageName = "mixin-deep";
4844 version = "1.3.1";
4845 src = fetchurl {
4846 url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz";
4847 sha512 = "8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==";
1815 4848 };
1816 4849 };
1817 4850 "mkdirp-0.5.1" = {
@@ -1841,6 +4874,15 b' let'
1841 4874 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
1842 4875 };
1843 4876 };
4877 "move-concurrently-1.0.1" = {
4878 name = "move-concurrently";
4879 packageName = "move-concurrently";
4880 version = "1.0.1";
4881 src = fetchurl {
4882 url = "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz";
4883 sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
4884 };
4885 };
1844 4886 "ms-2.0.0" = {
1845 4887 name = "ms";
1846 4888 packageName = "ms";
@@ -1850,31 +4892,58 b' let'
1850 4892 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
1851 4893 };
1852 4894 };
1853 "ncp-0.4.2" = {
1854 name = "ncp";
1855 packageName = "ncp";
1856 version = "0.4.2";
1857 src = fetchurl {
1858 url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
1859 sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
1860 };
1861 };
1862 "nijs-0.0.25" = {
1863 name = "nijs";
1864 packageName = "nijs";
1865 version = "0.0.25";
1866 src = fetchurl {
1867 url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz";
1868 sha1 = "04b035cb530d46859d1018839a518c029133f676";
1869 };
1870 };
1871 "node2nix-1.6.0" = {
1872 name = "node2nix";
1873 packageName = "node2nix";
1874 version = "1.6.0";
1875 src = fetchurl {
1876 url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz";
1877 sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw==";
4895 "nan-2.11.1" = {
4896 name = "nan";
4897 packageName = "nan";
4898 version = "2.11.1";
4899 src = fetchurl {
4900 url = "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz";
4901 sha512 = "iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==";
4902 };
4903 };
4904 "nanomatch-1.2.13" = {
4905 name = "nanomatch";
4906 packageName = "nanomatch";
4907 version = "1.2.13";
4908 src = fetchurl {
4909 url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz";
4910 sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==";
4911 };
4912 };
4913 "neo-async-2.6.0" = {
4914 name = "neo-async";
4915 packageName = "neo-async";
4916 version = "2.6.0";
4917 src = fetchurl {
4918 url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz";
4919 sha512 = "MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==";
4920 };
4921 };
4922 "nice-try-1.0.5" = {
4923 name = "nice-try";
4924 packageName = "nice-try";
4925 version = "1.0.5";
4926 src = fetchurl {
4927 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
4928 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
4929 };
4930 };
4931 "no-case-2.3.2" = {
4932 name = "no-case";
4933 packageName = "no-case";
4934 version = "2.3.2";
4935 src = fetchurl {
4936 url = "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz";
4937 sha512 = "rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==";
4938 };
4939 };
4940 "node-libs-browser-2.1.0" = {
4941 name = "node-libs-browser";
4942 packageName = "node-libs-browser";
4943 version = "2.1.0";
4944 src = fetchurl {
4945 url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
4946 sha512 = "5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==";
1878 4947 };
1879 4948 };
1880 4949 "nopt-1.0.10" = {
@@ -1895,13 +4964,13 b' let'
1895 4964 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
1896 4965 };
1897 4966 };
1898 "nopt-3.0.6" = {
4967 "nopt-4.0.1" = {
1899 4968 name = "nopt";
1900 4969 packageName = "nopt";
1901 version = "3.0.6";
1902 src = fetchurl {
1903 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
1904 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
4970 version = "4.0.1";
4971 src = fetchurl {
4972 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";
4973 sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
1905 4974 };
1906 4975 };
1907 4976 "noptify-0.0.3" = {
@@ -1913,49 +4982,58 b' let'
1913 4982 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
1914 4983 };
1915 4984 };
1916 "normalize-package-data-2.4.0" = {
1917 name = "normalize-package-data";
1918 packageName = "normalize-package-data";
1919 version = "2.4.0";
1920 src = fetchurl {
1921 url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
1922 sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==";
1923 };
1924 };
1925 "npm-package-arg-6.1.0" = {
1926 name = "npm-package-arg";
1927 packageName = "npm-package-arg";
1928 version = "6.1.0";
1929 src = fetchurl {
1930 url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
1931 sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==";
1932 };
1933 };
1934 "npm-registry-client-8.5.1" = {
1935 name = "npm-registry-client";
1936 packageName = "npm-registry-client";
1937 version = "8.5.1";
1938 src = fetchurl {
1939 url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz";
1940 sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==";
1941 };
1942 };
1943 "npmconf-2.1.3" = {
1944 name = "npmconf";
1945 packageName = "npmconf";
1946 version = "2.1.3";
1947 src = fetchurl {
1948 url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz";
1949 sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==";
1950 };
1951 };
1952 "npmlog-4.1.2" = {
1953 name = "npmlog";
1954 packageName = "npmlog";
1955 version = "4.1.2";
1956 src = fetchurl {
1957 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
1958 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
4985 "normalize-path-2.1.1" = {
4986 name = "normalize-path";
4987 packageName = "normalize-path";
4988 version = "2.1.1";
4989 src = fetchurl {
4990 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz";
4991 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
4992 };
4993 };
4994 "normalize-range-0.1.2" = {
4995 name = "normalize-range";
4996 packageName = "normalize-range";
4997 version = "0.1.2";
4998 src = fetchurl {
4999 url = "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz";
5000 sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
5001 };
5002 };
5003 "normalize-url-1.9.1" = {
5004 name = "normalize-url";
5005 packageName = "normalize-url";
5006 version = "1.9.1";
5007 src = fetchurl {
5008 url = "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz";
5009 sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
5010 };
5011 };
5012 "npm-run-path-2.0.2" = {
5013 name = "npm-run-path";
5014 packageName = "npm-run-path";
5015 version = "2.0.2";
5016 src = fetchurl {
5017 url = "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz";
5018 sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
5019 };
5020 };
5021 "nth-check-1.0.2" = {
5022 name = "nth-check";
5023 packageName = "nth-check";
5024 version = "1.0.2";
5025 src = fetchurl {
5026 url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
5027 sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
5028 };
5029 };
5030 "num2fraction-1.2.2" = {
5031 name = "num2fraction";
5032 packageName = "num2fraction";
5033 version = "1.2.2";
5034 src = fetchurl {
5035 url = "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz";
5036 sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
1959 5037 };
1960 5038 };
1961 5039 "number-is-nan-1.0.1" = {
@@ -1985,13 +5063,67 b' let'
1985 5063 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
1986 5064 };
1987 5065 };
1988 "once-1.3.3" = {
1989 name = "once";
1990 packageName = "once";
1991 version = "1.3.3";
1992 src = fetchurl {
1993 url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz";
1994 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
5066 "object-copy-0.1.0" = {
5067 name = "object-copy";
5068 packageName = "object-copy";
5069 version = "0.1.0";
5070 src = fetchurl {
5071 url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz";
5072 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5073 };
5074 };
5075 "object-keys-1.0.12" = {
5076 name = "object-keys";
5077 packageName = "object-keys";
5078 version = "1.0.12";
5079 src = fetchurl {
5080 url = "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz";
5081 sha512 = "FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==";
5082 };
5083 };
5084 "object-visit-1.0.1" = {
5085 name = "object-visit";
5086 packageName = "object-visit";
5087 version = "1.0.1";
5088 src = fetchurl {
5089 url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz";
5090 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
5091 };
5092 };
5093 "object.defaults-1.1.0" = {
5094 name = "object.defaults";
5095 packageName = "object.defaults";
5096 version = "1.1.0";
5097 src = fetchurl {
5098 url = "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz";
5099 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
5100 };
5101 };
5102 "object.getownpropertydescriptors-2.0.3" = {
5103 name = "object.getownpropertydescriptors";
5104 packageName = "object.getownpropertydescriptors";
5105 version = "2.0.3";
5106 src = fetchurl {
5107 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz";
5108 sha1 = "8758c846f5b407adab0f236e0986f14b051caa16";
5109 };
5110 };
5111 "object.map-1.0.1" = {
5112 name = "object.map";
5113 packageName = "object.map";
5114 version = "1.0.1";
5115 src = fetchurl {
5116 url = "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz";
5117 sha1 = "cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37";
5118 };
5119 };
5120 "object.pick-1.3.0" = {
5121 name = "object.pick";
5122 packageName = "object.pick";
5123 version = "1.3.0";
5124 src = fetchurl {
5125 url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
5126 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
1995 5127 };
1996 5128 };
1997 5129 "once-1.4.0" = {
@@ -2003,22 +5135,13 b' let'
2003 5135 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2004 5136 };
2005 5137 };
2006 "optionator-0.8.2" = {
2007 name = "optionator";
2008 packageName = "optionator";
2009 version = "0.8.2";
2010 src = fetchurl {
2011 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
2012 sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
2013 };
2014 };
2015 "optparse-1.0.5" = {
2016 name = "optparse";
2017 packageName = "optparse";
2018 version = "1.0.5";
2019 src = fetchurl {
2020 url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz";
2021 sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16";
5138 "os-browserify-0.3.0" = {
5139 name = "os-browserify";
5140 packageName = "os-browserify";
5141 version = "0.3.0";
5142 src = fetchurl {
5143 url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz";
5144 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
2022 5145 };
2023 5146 };
2024 5147 "os-homedir-1.0.2" = {
@@ -2030,6 +5153,15 b' let'
2030 5153 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2031 5154 };
2032 5155 };
5156 "os-locale-3.0.1" = {
5157 name = "os-locale";
5158 packageName = "os-locale";
5159 version = "3.0.1";
5160 src = fetchurl {
5161 url = "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz";
5162 sha512 = "7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==";
5163 };
5164 };
2033 5165 "os-tmpdir-1.0.2" = {
2034 5166 name = "os-tmpdir";
2035 5167 packageName = "os-tmpdir";
@@ -2048,13 +5180,202 b' let'
2048 5180 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2049 5181 };
2050 5182 };
2051 "parse5-1.5.1" = {
5183 "p-defer-1.0.0" = {
5184 name = "p-defer";
5185 packageName = "p-defer";
5186 version = "1.0.0";
5187 src = fetchurl {
5188 url = "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz";
5189 sha1 = "9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c";
5190 };
5191 };
5192 "p-finally-1.0.0" = {
5193 name = "p-finally";
5194 packageName = "p-finally";
5195 version = "1.0.0";
5196 src = fetchurl {
5197 url = "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz";
5198 sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
5199 };
5200 };
5201 "p-is-promise-1.1.0" = {
5202 name = "p-is-promise";
5203 packageName = "p-is-promise";
5204 version = "1.1.0";
5205 src = fetchurl {
5206 url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz";
5207 sha1 = "9c9456989e9f6588017b0434d56097675c3da05e";
5208 };
5209 };
5210 "p-limit-1.3.0" = {
5211 name = "p-limit";
5212 packageName = "p-limit";
5213 version = "1.3.0";
5214 src = fetchurl {
5215 url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz";
5216 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
5217 };
5218 };
5219 "p-limit-2.0.0" = {
5220 name = "p-limit";
5221 packageName = "p-limit";
5222 version = "2.0.0";
5223 src = fetchurl {
5224 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz";
5225 sha512 = "fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==";
5226 };
5227 };
5228 "p-locate-2.0.0" = {
5229 name = "p-locate";
5230 packageName = "p-locate";
5231 version = "2.0.0";
5232 src = fetchurl {
5233 url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz";
5234 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
5235 };
5236 };
5237 "p-locate-3.0.0" = {
5238 name = "p-locate";
5239 packageName = "p-locate";
5240 version = "3.0.0";
5241 src = fetchurl {
5242 url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
5243 sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
5244 };
5245 };
5246 "p-try-1.0.0" = {
5247 name = "p-try";
5248 packageName = "p-try";
5249 version = "1.0.0";
5250 src = fetchurl {
5251 url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz";
5252 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
5253 };
5254 };
5255 "p-try-2.0.0" = {
5256 name = "p-try";
5257 packageName = "p-try";
5258 version = "2.0.0";
5259 src = fetchurl {
5260 url = "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz";
5261 sha512 = "hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==";
5262 };
5263 };
5264 "pako-1.0.6" = {
5265 name = "pako";
5266 packageName = "pako";
5267 version = "1.0.6";
5268 src = fetchurl {
5269 url = "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz";
5270 sha512 = "lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==";
5271 };
5272 };
5273 "parallel-transform-1.1.0" = {
5274 name = "parallel-transform";
5275 packageName = "parallel-transform";
5276 version = "1.1.0";
5277 src = fetchurl {
5278 url = "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz";
5279 sha1 = "d410f065b05da23081fcd10f28854c29bda33b06";
5280 };
5281 };
5282 "param-case-2.1.1" = {
5283 name = "param-case";
5284 packageName = "param-case";
5285 version = "2.1.1";
5286 src = fetchurl {
5287 url = "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz";
5288 sha1 = "df94fd8cf6531ecf75e6bef9a0858fbc72be2247";
5289 };
5290 };
5291 "parse-asn1-5.1.1" = {
5292 name = "parse-asn1";
5293 packageName = "parse-asn1";
5294 version = "5.1.1";
5295 src = fetchurl {
5296 url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz";
5297 sha512 = "KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==";
5298 };
5299 };
5300 "parse-filepath-1.0.2" = {
5301 name = "parse-filepath";
5302 packageName = "parse-filepath";
5303 version = "1.0.2";
5304 src = fetchurl {
5305 url = "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz";
5306 sha1 = "a632127f53aaf3d15876f5872f3ffac763d6c891";
5307 };
5308 };
5309 "parse-passwd-1.0.0" = {
5310 name = "parse-passwd";
5311 packageName = "parse-passwd";
5312 version = "1.0.0";
5313 src = fetchurl {
5314 url = "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz";
5315 sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6";
5316 };
5317 };
5318 "parse5-2.2.3" = {
2052 5319 name = "parse5";
2053 5320 packageName = "parse5";
2054 version = "1.5.1";
2055 src = fetchurl {
2056 url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
2057 sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
5321 version = "2.2.3";
5322 src = fetchurl {
5323 url = "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz";
5324 sha1 = "0c4fc41c1000c5e6b93d48b03f8083837834e9f6";
5325 };
5326 };
5327 "parse5-3.0.3" = {
5328 name = "parse5";
5329 packageName = "parse5";
5330 version = "3.0.3";
5331 src = fetchurl {
5332 url = "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz";
5333 sha512 = "rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==";
5334 };
5335 };
5336 "parse5-utils-2.0.0" = {
5337 name = "parse5-utils";
5338 packageName = "parse5-utils";
5339 version = "2.0.0";
5340 src = fetchurl {
5341 url = "https://registry.npmjs.org/parse5-utils/-/parse5-utils-2.0.0.tgz";
5342 sha1 = "c926c1764e2431a450a5941f302db9beaec9d78a";
5343 };
5344 };
5345 "pascalcase-0.1.1" = {
5346 name = "pascalcase";
5347 packageName = "pascalcase";
5348 version = "0.1.1";
5349 src = fetchurl {
5350 url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz";
5351 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
5352 };
5353 };
5354 "path-browserify-0.0.0" = {
5355 name = "path-browserify";
5356 packageName = "path-browserify";
5357 version = "0.0.0";
5358 src = fetchurl {
5359 url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz";
5360 sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
5361 };
5362 };
5363 "path-dirname-1.0.2" = {
5364 name = "path-dirname";
5365 packageName = "path-dirname";
5366 version = "1.0.2";
5367 src = fetchurl {
5368 url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz";
5369 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
5370 };
5371 };
5372 "path-exists-3.0.0" = {
5373 name = "path-exists";
5374 packageName = "path-exists";
5375 version = "3.0.0";
5376 src = fetchurl {
5377 url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
5378 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
2058 5379 };
2059 5380 };
2060 5381 "path-is-absolute-1.0.1" = {
@@ -2066,13 +5387,58 b' let'
2066 5387 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2067 5388 };
2068 5389 };
2069 "path-posix-1.0.0" = {
2070 name = "path-posix";
2071 packageName = "path-posix";
2072 version = "1.0.0";
2073 src = fetchurl {
2074 url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz";
2075 sha1 = "06b26113f56beab042545a23bfa88003ccac260f";
5390 "path-key-2.0.1" = {
5391 name = "path-key";
5392 packageName = "path-key";
5393 version = "2.0.1";
5394 src = fetchurl {
5395 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
5396 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
5397 };
5398 };
5399 "path-parse-1.0.6" = {
5400 name = "path-parse";
5401 packageName = "path-parse";
5402 version = "1.0.6";
5403 src = fetchurl {
5404 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
5405 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
5406 };
5407 };
5408 "path-root-0.1.1" = {
5409 name = "path-root";
5410 packageName = "path-root";
5411 version = "0.1.1";
5412 src = fetchurl {
5413 url = "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz";
5414 sha1 = "9a4a6814cac1c0cd73360a95f32083c8ea4745b7";
5415 };
5416 };
5417 "path-root-regex-0.1.2" = {
5418 name = "path-root-regex";
5419 packageName = "path-root-regex";
5420 version = "0.1.2";
5421 src = fetchurl {
5422 url = "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz";
5423 sha1 = "bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d";
5424 };
5425 };
5426 "path-type-3.0.0" = {
5427 name = "path-type";
5428 packageName = "path-type";
5429 version = "3.0.0";
5430 src = fetchurl {
5431 url = "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz";
5432 sha512 = "T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==";
5433 };
5434 };
5435 "pbkdf2-3.0.17" = {
5436 name = "pbkdf2";
5437 packageName = "pbkdf2";
5438 version = "3.0.17";
5439 src = fetchurl {
5440 url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz";
5441 sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==";
2076 5442 };
2077 5443 };
2078 5444 "pend-1.2.0" = {
@@ -2111,6 +5477,15 b' let'
2111 5477 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
2112 5478 };
2113 5479 };
5480 "pify-3.0.0" = {
5481 name = "pify";
5482 packageName = "pify";
5483 version = "3.0.0";
5484 src = fetchurl {
5485 url = "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz";
5486 sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
5487 };
5488 };
2114 5489 "pinkie-2.0.4" = {
2115 5490 name = "pinkie";
2116 5491 packageName = "pinkie";
@@ -2129,13 +5504,382 b' let'
2129 5504 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
2130 5505 };
2131 5506 };
2132 "prelude-ls-1.1.2" = {
2133 name = "prelude-ls";
2134 packageName = "prelude-ls";
2135 version = "1.1.2";
2136 src = fetchurl {
2137 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
2138 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
5507 "pkg-dir-2.0.0" = {
5508 name = "pkg-dir";
5509 packageName = "pkg-dir";
5510 version = "2.0.0";
5511 src = fetchurl {
5512 url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz";
5513 sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
5514 };
5515 };
5516 "pkg-dir-3.0.0" = {
5517 name = "pkg-dir";
5518 packageName = "pkg-dir";
5519 version = "3.0.0";
5520 src = fetchurl {
5521 url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz";
5522 sha512 = "/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==";
5523 };
5524 };
5525 "polymer-webpack-loader-2.0.3" = {
5526 name = "polymer-webpack-loader";
5527 packageName = "polymer-webpack-loader";
5528 version = "2.0.3";
5529 src = fetchurl {
5530 url = "https://registry.npmjs.org/polymer-webpack-loader/-/polymer-webpack-loader-2.0.3.tgz";
5531 sha512 = "3SR+/qVAGeVKltvsSMA+euGdLwj8ZZJnwd5NvXRvbdQ7yO57sdcTpRw3d34pTc9YTZxncW/kozuI/9bHjr/rdg==";
5532 };
5533 };
5534 "posix-character-classes-0.1.1" = {
5535 name = "posix-character-classes";
5536 packageName = "posix-character-classes";
5537 version = "0.1.1";
5538 src = fetchurl {
5539 url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
5540 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
5541 };
5542 };
5543 "postcss-5.2.18" = {
5544 name = "postcss";
5545 packageName = "postcss";
5546 version = "5.2.18";
5547 src = fetchurl {
5548 url = "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz";
5549 sha512 = "zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==";
5550 };
5551 };
5552 "postcss-6.0.23" = {
5553 name = "postcss";
5554 packageName = "postcss";
5555 version = "6.0.23";
5556 src = fetchurl {
5557 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz";
5558 sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==";
5559 };
5560 };
5561 "postcss-calc-5.3.1" = {
5562 name = "postcss-calc";
5563 packageName = "postcss-calc";
5564 version = "5.3.1";
5565 src = fetchurl {
5566 url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz";
5567 sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e";
5568 };
5569 };
5570 "postcss-colormin-2.2.2" = {
5571 name = "postcss-colormin";
5572 packageName = "postcss-colormin";
5573 version = "2.2.2";
5574 src = fetchurl {
5575 url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz";
5576 sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b";
5577 };
5578 };
5579 "postcss-convert-values-2.6.1" = {
5580 name = "postcss-convert-values";
5581 packageName = "postcss-convert-values";
5582 version = "2.6.1";
5583 src = fetchurl {
5584 url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz";
5585 sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d";
5586 };
5587 };
5588 "postcss-discard-comments-2.0.4" = {
5589 name = "postcss-discard-comments";
5590 packageName = "postcss-discard-comments";
5591 version = "2.0.4";
5592 src = fetchurl {
5593 url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz";
5594 sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d";
5595 };
5596 };
5597 "postcss-discard-duplicates-2.1.0" = {
5598 name = "postcss-discard-duplicates";
5599 packageName = "postcss-discard-duplicates";
5600 version = "2.1.0";
5601 src = fetchurl {
5602 url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz";
5603 sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932";
5604 };
5605 };
5606 "postcss-discard-empty-2.1.0" = {
5607 name = "postcss-discard-empty";
5608 packageName = "postcss-discard-empty";
5609 version = "2.1.0";
5610 src = fetchurl {
5611 url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz";
5612 sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5";
5613 };
5614 };
5615 "postcss-discard-overridden-0.1.1" = {
5616 name = "postcss-discard-overridden";
5617 packageName = "postcss-discard-overridden";
5618 version = "0.1.1";
5619 src = fetchurl {
5620 url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz";
5621 sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58";
5622 };
5623 };
5624 "postcss-discard-unused-2.2.3" = {
5625 name = "postcss-discard-unused";
5626 packageName = "postcss-discard-unused";
5627 version = "2.2.3";
5628 src = fetchurl {
5629 url = "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz";
5630 sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433";
5631 };
5632 };
5633 "postcss-filter-plugins-2.0.3" = {
5634 name = "postcss-filter-plugins";
5635 packageName = "postcss-filter-plugins";
5636 version = "2.0.3";
5637 src = fetchurl {
5638 url = "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz";
5639 sha512 = "T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==";
5640 };
5641 };
5642 "postcss-merge-idents-2.1.7" = {
5643 name = "postcss-merge-idents";
5644 packageName = "postcss-merge-idents";
5645 version = "2.1.7";
5646 src = fetchurl {
5647 url = "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz";
5648 sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270";
5649 };
5650 };
5651 "postcss-merge-longhand-2.0.2" = {
5652 name = "postcss-merge-longhand";
5653 packageName = "postcss-merge-longhand";
5654 version = "2.0.2";
5655 src = fetchurl {
5656 url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz";
5657 sha1 = "23d90cd127b0a77994915332739034a1a4f3d658";
5658 };
5659 };
5660 "postcss-merge-rules-2.1.2" = {
5661 name = "postcss-merge-rules";
5662 packageName = "postcss-merge-rules";
5663 version = "2.1.2";
5664 src = fetchurl {
5665 url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz";
5666 sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721";
5667 };
5668 };
5669 "postcss-message-helpers-2.0.0" = {
5670 name = "postcss-message-helpers";
5671 packageName = "postcss-message-helpers";
5672 version = "2.0.0";
5673 src = fetchurl {
5674 url = "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz";
5675 sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e";
5676 };
5677 };
5678 "postcss-minify-font-values-1.0.5" = {
5679 name = "postcss-minify-font-values";
5680 packageName = "postcss-minify-font-values";
5681 version = "1.0.5";
5682 src = fetchurl {
5683 url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz";
5684 sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69";
5685 };
5686 };
5687 "postcss-minify-gradients-1.0.5" = {
5688 name = "postcss-minify-gradients";
5689 packageName = "postcss-minify-gradients";
5690 version = "1.0.5";
5691 src = fetchurl {
5692 url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz";
5693 sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1";
5694 };
5695 };
5696 "postcss-minify-params-1.2.2" = {
5697 name = "postcss-minify-params";
5698 packageName = "postcss-minify-params";
5699 version = "1.2.2";
5700 src = fetchurl {
5701 url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz";
5702 sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3";
5703 };
5704 };
5705 "postcss-minify-selectors-2.1.1" = {
5706 name = "postcss-minify-selectors";
5707 packageName = "postcss-minify-selectors";
5708 version = "2.1.1";
5709 src = fetchurl {
5710 url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz";
5711 sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf";
5712 };
5713 };
5714 "postcss-modules-extract-imports-1.2.0" = {
5715 name = "postcss-modules-extract-imports";
5716 packageName = "postcss-modules-extract-imports";
5717 version = "1.2.0";
5718 src = fetchurl {
5719 url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz";
5720 sha1 = "66140ecece38ef06bf0d3e355d69bf59d141ea85";
5721 };
5722 };
5723 "postcss-modules-local-by-default-1.2.0" = {
5724 name = "postcss-modules-local-by-default";
5725 packageName = "postcss-modules-local-by-default";
5726 version = "1.2.0";
5727 src = fetchurl {
5728 url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
5729 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
5730 };
5731 };
5732 "postcss-modules-scope-1.1.0" = {
5733 name = "postcss-modules-scope";
5734 packageName = "postcss-modules-scope";
5735 version = "1.1.0";
5736 src = fetchurl {
5737 url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
5738 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
5739 };
5740 };
5741 "postcss-modules-values-1.3.0" = {
5742 name = "postcss-modules-values";
5743 packageName = "postcss-modules-values";
5744 version = "1.3.0";
5745 src = fetchurl {
5746 url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
5747 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
5748 };
5749 };
5750 "postcss-normalize-charset-1.1.1" = {
5751 name = "postcss-normalize-charset";
5752 packageName = "postcss-normalize-charset";
5753 version = "1.1.1";
5754 src = fetchurl {
5755 url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz";
5756 sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1";
5757 };
5758 };
5759 "postcss-normalize-url-3.0.8" = {
5760 name = "postcss-normalize-url";
5761 packageName = "postcss-normalize-url";
5762 version = "3.0.8";
5763 src = fetchurl {
5764 url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz";
5765 sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222";
5766 };
5767 };
5768 "postcss-ordered-values-2.2.3" = {
5769 name = "postcss-ordered-values";
5770 packageName = "postcss-ordered-values";
5771 version = "2.2.3";
5772 src = fetchurl {
5773 url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz";
5774 sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d";
5775 };
5776 };
5777 "postcss-reduce-idents-2.4.0" = {
5778 name = "postcss-reduce-idents";
5779 packageName = "postcss-reduce-idents";
5780 version = "2.4.0";
5781 src = fetchurl {
5782 url = "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz";
5783 sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3";
5784 };
5785 };
5786 "postcss-reduce-initial-1.0.1" = {
5787 name = "postcss-reduce-initial";
5788 packageName = "postcss-reduce-initial";
5789 version = "1.0.1";
5790 src = fetchurl {
5791 url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz";
5792 sha1 = "68f80695f045d08263a879ad240df8dd64f644ea";
5793 };
5794 };
5795 "postcss-reduce-transforms-1.0.4" = {
5796 name = "postcss-reduce-transforms";
5797 packageName = "postcss-reduce-transforms";
5798 version = "1.0.4";
5799 src = fetchurl {
5800 url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz";
5801 sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1";
5802 };
5803 };
5804 "postcss-selector-parser-2.2.3" = {
5805 name = "postcss-selector-parser";
5806 packageName = "postcss-selector-parser";
5807 version = "2.2.3";
5808 src = fetchurl {
5809 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz";
5810 sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90";
5811 };
5812 };
5813 "postcss-svgo-2.1.6" = {
5814 name = "postcss-svgo";
5815 packageName = "postcss-svgo";
5816 version = "2.1.6";
5817 src = fetchurl {
5818 url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz";
5819 sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d";
5820 };
5821 };
5822 "postcss-unique-selectors-2.0.2" = {
5823 name = "postcss-unique-selectors";
5824 packageName = "postcss-unique-selectors";
5825 version = "2.0.2";
5826 src = fetchurl {
5827 url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz";
5828 sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d";
5829 };
5830 };
5831 "postcss-value-parser-3.3.1" = {
5832 name = "postcss-value-parser";
5833 packageName = "postcss-value-parser";
5834 version = "3.3.1";
5835 src = fetchurl {
5836 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
5837 sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==";
5838 };
5839 };
5840 "postcss-zindex-2.2.0" = {
5841 name = "postcss-zindex";
5842 packageName = "postcss-zindex";
5843 version = "2.2.0";
5844 src = fetchurl {
5845 url = "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz";
5846 sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22";
5847 };
5848 };
5849 "prepend-http-1.0.4" = {
5850 name = "prepend-http";
5851 packageName = "prepend-http";
5852 version = "1.0.4";
5853 src = fetchurl {
5854 url = "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz";
5855 sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
5856 };
5857 };
5858 "pretty-error-2.1.1" = {
5859 name = "pretty-error";
5860 packageName = "pretty-error";
5861 version = "2.1.1";
5862 src = fetchurl {
5863 url = "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz";
5864 sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
5865 };
5866 };
5867 "private-0.1.8" = {
5868 name = "private";
5869 packageName = "private";
5870 version = "0.1.8";
5871 src = fetchurl {
5872 url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz";
5873 sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==";
5874 };
5875 };
5876 "process-0.11.10" = {
5877 name = "process";
5878 packageName = "process";
5879 version = "0.11.10";
5880 src = fetchurl {
5881 url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz";
5882 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
2139 5883 };
2140 5884 };
2141 5885 "process-nextick-args-2.0.0" = {
@@ -2165,13 +5909,13 b' let'
2165 5909 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
2166 5910 };
2167 5911 };
2168 "proto-list-1.2.4" = {
2169 name = "proto-list";
2170 packageName = "proto-list";
2171 version = "1.2.4";
2172 src = fetchurl {
2173 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
2174 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
5912 "promise-inflight-1.0.1" = {
5913 name = "promise-inflight";
5914 packageName = "promise-inflight";
5915 version = "1.0.1";
5916 src = fetchurl {
5917 url = "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz";
5918 sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
2175 5919 };
2176 5920 };
2177 5921 "prr-1.0.1" = {
@@ -2183,6 +5927,51 b' let'
2183 5927 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2184 5928 };
2185 5929 };
5930 "pseudomap-1.0.2" = {
5931 name = "pseudomap";
5932 packageName = "pseudomap";
5933 version = "1.0.2";
5934 src = fetchurl {
5935 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
5936 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
5937 };
5938 };
5939 "public-encrypt-4.0.3" = {
5940 name = "public-encrypt";
5941 packageName = "public-encrypt";
5942 version = "4.0.3";
5943 src = fetchurl {
5944 url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz";
5945 sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==";
5946 };
5947 };
5948 "pump-2.0.1" = {
5949 name = "pump";
5950 packageName = "pump";
5951 version = "2.0.1";
5952 src = fetchurl {
5953 url = "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz";
5954 sha512 = "ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==";
5955 };
5956 };
5957 "pumpify-1.5.1" = {
5958 name = "pumpify";
5959 packageName = "pumpify";
5960 version = "1.5.1";
5961 src = fetchurl {
5962 url = "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz";
5963 sha512 = "oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==";
5964 };
5965 };
5966 "punycode-1.3.2" = {
5967 name = "punycode";
5968 packageName = "punycode";
5969 version = "1.3.2";
5970 src = fetchurl {
5971 url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz";
5972 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
5973 };
5974 };
2186 5975 "punycode-1.4.1" = {
2187 5976 name = "punycode";
2188 5977 packageName = "punycode";
@@ -2192,6 +5981,24 b' let'
2192 5981 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
2193 5982 };
2194 5983 };
5984 "punycode-2.1.1" = {
5985 name = "punycode";
5986 packageName = "punycode";
5987 version = "2.1.1";
5988 src = fetchurl {
5989 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
5990 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
5991 };
5992 };
5993 "q-1.5.1" = {
5994 name = "q";
5995 packageName = "q";
5996 version = "1.5.1";
5997 src = fetchurl {
5998 url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz";
5999 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
6000 };
6001 };
2195 6002 "qrious-4.0.2" = {
2196 6003 name = "qrious";
2197 6004 packageName = "qrious";
@@ -2219,6 +6026,69 b' let'
2219 6026 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
2220 6027 };
2221 6028 };
6029 "query-string-4.3.4" = {
6030 name = "query-string";
6031 packageName = "query-string";
6032 version = "4.3.4";
6033 src = fetchurl {
6034 url = "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz";
6035 sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
6036 };
6037 };
6038 "querystring-0.2.0" = {
6039 name = "querystring";
6040 packageName = "querystring";
6041 version = "0.2.0";
6042 src = fetchurl {
6043 url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz";
6044 sha1 = "b209849203bb25df820da756e747005878521620";
6045 };
6046 };
6047 "querystring-es3-0.2.1" = {
6048 name = "querystring-es3";
6049 packageName = "querystring-es3";
6050 version = "0.2.1";
6051 src = fetchurl {
6052 url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz";
6053 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
6054 };
6055 };
6056 "randombytes-2.0.6" = {
6057 name = "randombytes";
6058 packageName = "randombytes";
6059 version = "2.0.6";
6060 src = fetchurl {
6061 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz";
6062 sha512 = "CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==";
6063 };
6064 };
6065 "randomfill-1.0.4" = {
6066 name = "randomfill";
6067 packageName = "randomfill";
6068 version = "1.0.4";
6069 src = fetchurl {
6070 url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz";
6071 sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==";
6072 };
6073 };
6074 "raw-loader-1.0.0-beta.0" = {
6075 name = "raw-loader";
6076 packageName = "raw-loader";
6077 version = "1.0.0-beta.0";
6078 src = fetchurl {
6079 url = "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0-beta.0.tgz";
6080 sha512 = "guh4ZNAf96f+CDwfnPbFeFiO5YcfPllUmZrgcoOmx6iqZPq+DcKbnyjPuBxEAtQ3tqqd++qChsQfQB+VBzFT0Q==";
6081 };
6082 };
6083 "readable-stream-1.0.34" = {
6084 name = "readable-stream";
6085 packageName = "readable-stream";
6086 version = "1.0.34";
6087 src = fetchurl {
6088 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz";
6089 sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
6090 };
6091 };
2222 6092 "readable-stream-1.1.14" = {
2223 6093 name = "readable-stream";
2224 6094 packageName = "readable-stream";
@@ -2237,22 +6107,58 b' let'
2237 6107 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
2238 6108 };
2239 6109 };
2240 "reduce-flatten-1.0.1" = {
2241 name = "reduce-flatten";
2242 packageName = "reduce-flatten";
2243 version = "1.0.1";
2244 src = fetchurl {
2245 url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz";
2246 sha1 = "258c78efd153ddf93cb561237f61184f3696e327";
2247 };
2248 };
2249 "regenerator-runtime-0.10.5" = {
2250 name = "regenerator-runtime";
2251 packageName = "regenerator-runtime";
2252 version = "0.10.5";
2253 src = fetchurl {
2254 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
2255 sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
6110 "readdirp-2.2.1" = {
6111 name = "readdirp";
6112 packageName = "readdirp";
6113 version = "2.2.1";
6114 src = fetchurl {
6115 url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz";
6116 sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==";
6117 };
6118 };
6119 "recast-0.11.23" = {
6120 name = "recast";
6121 packageName = "recast";
6122 version = "0.11.23";
6123 src = fetchurl {
6124 url = "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz";
6125 sha1 = "451fd3004ab1e4df9b4e4b66376b2a21912462d3";
6126 };
6127 };
6128 "rechoir-0.6.2" = {
6129 name = "rechoir";
6130 packageName = "rechoir";
6131 version = "0.6.2";
6132 src = fetchurl {
6133 url = "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz";
6134 sha1 = "85204b54dba82d5742e28c96756ef43af50e3384";
6135 };
6136 };
6137 "reduce-css-calc-1.3.0" = {
6138 name = "reduce-css-calc";
6139 packageName = "reduce-css-calc";
6140 version = "1.3.0";
6141 src = fetchurl {
6142 url = "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz";
6143 sha1 = "747c914e049614a4c9cfbba629871ad1d2927716";
6144 };
6145 };
6146 "reduce-function-call-1.0.2" = {
6147 name = "reduce-function-call";
6148 packageName = "reduce-function-call";
6149 version = "1.0.2";
6150 src = fetchurl {
6151 url = "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz";
6152 sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99";
6153 };
6154 };
6155 "regenerate-1.4.0" = {
6156 name = "regenerate";
6157 packageName = "regenerate";
6158 version = "1.4.0";
6159 src = fetchurl {
6160 url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz";
6161 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
2256 6162 };
2257 6163 };
2258 6164 "regenerator-runtime-0.11.1" = {
@@ -2264,6 +6170,114 b' let'
2264 6170 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
2265 6171 };
2266 6172 };
6173 "regenerator-transform-0.10.1" = {
6174 name = "regenerator-transform";
6175 packageName = "regenerator-transform";
6176 version = "0.10.1";
6177 src = fetchurl {
6178 url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz";
6179 sha512 = "PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==";
6180 };
6181 };
6182 "regex-not-1.0.2" = {
6183 name = "regex-not";
6184 packageName = "regex-not";
6185 version = "1.0.2";
6186 src = fetchurl {
6187 url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz";
6188 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
6189 };
6190 };
6191 "regexpu-core-1.0.0" = {
6192 name = "regexpu-core";
6193 packageName = "regexpu-core";
6194 version = "1.0.0";
6195 src = fetchurl {
6196 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz";
6197 sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
6198 };
6199 };
6200 "regexpu-core-2.0.0" = {
6201 name = "regexpu-core";
6202 packageName = "regexpu-core";
6203 version = "2.0.0";
6204 src = fetchurl {
6205 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz";
6206 sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
6207 };
6208 };
6209 "regjsgen-0.2.0" = {
6210 name = "regjsgen";
6211 packageName = "regjsgen";
6212 version = "0.2.0";
6213 src = fetchurl {
6214 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz";
6215 sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
6216 };
6217 };
6218 "regjsparser-0.1.5" = {
6219 name = "regjsparser";
6220 packageName = "regjsparser";
6221 version = "0.1.5";
6222 src = fetchurl {
6223 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz";
6224 sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
6225 };
6226 };
6227 "relateurl-0.2.7" = {
6228 name = "relateurl";
6229 packageName = "relateurl";
6230 version = "0.2.7";
6231 src = fetchurl {
6232 url = "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz";
6233 sha1 = "54dbf377e51440aca90a4cd274600d3ff2d888a9";
6234 };
6235 };
6236 "remove-trailing-separator-1.1.0" = {
6237 name = "remove-trailing-separator";
6238 packageName = "remove-trailing-separator";
6239 version = "1.1.0";
6240 src = fetchurl {
6241 url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
6242 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
6243 };
6244 };
6245 "renderkid-2.0.2" = {
6246 name = "renderkid";
6247 packageName = "renderkid";
6248 version = "2.0.2";
6249 src = fetchurl {
6250 url = "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz";
6251 sha512 = "FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==";
6252 };
6253 };
6254 "repeat-element-1.1.3" = {
6255 name = "repeat-element";
6256 packageName = "repeat-element";
6257 version = "1.1.3";
6258 src = fetchurl {
6259 url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz";
6260 sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==";
6261 };
6262 };
6263 "repeat-string-1.6.1" = {
6264 name = "repeat-string";
6265 packageName = "repeat-string";
6266 version = "1.6.1";
6267 src = fetchurl {
6268 url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
6269 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
6270 };
6271 };
6272 "repeating-2.0.1" = {
6273 name = "repeating";
6274 packageName = "repeating";
6275 version = "2.0.1";
6276 src = fetchurl {
6277 url = "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz";
6278 sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
6279 };
6280 };
2267 6281 "request-2.81.0" = {
2268 6282 name = "request";
2269 6283 packageName = "request";
@@ -2282,13 +6296,85 b' let'
2282 6296 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
2283 6297 };
2284 6298 };
2285 "retry-0.10.1" = {
2286 name = "retry";
2287 packageName = "retry";
2288 version = "0.10.1";
2289 src = fetchurl {
2290 url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz";
2291 sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
6299 "require-directory-2.1.1" = {
6300 name = "require-directory";
6301 packageName = "require-directory";
6302 version = "2.1.1";
6303 src = fetchurl {
6304 url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";
6305 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
6306 };
6307 };
6308 "require-main-filename-1.0.1" = {
6309 name = "require-main-filename";
6310 packageName = "require-main-filename";
6311 version = "1.0.1";
6312 src = fetchurl {
6313 url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz";
6314 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6315 };
6316 };
6317 "resolve-1.8.1" = {
6318 name = "resolve";
6319 packageName = "resolve";
6320 version = "1.8.1";
6321 src = fetchurl {
6322 url = "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz";
6323 sha512 = "AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==";
6324 };
6325 };
6326 "resolve-cwd-2.0.0" = {
6327 name = "resolve-cwd";
6328 packageName = "resolve-cwd";
6329 version = "2.0.0";
6330 src = fetchurl {
6331 url = "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
6332 sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
6333 };
6334 };
6335 "resolve-dir-1.0.1" = {
6336 name = "resolve-dir";
6337 packageName = "resolve-dir";
6338 version = "1.0.1";
6339 src = fetchurl {
6340 url = "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz";
6341 sha1 = "79a40644c362be82f26effe739c9bb5382046f43";
6342 };
6343 };
6344 "resolve-from-3.0.0" = {
6345 name = "resolve-from";
6346 packageName = "resolve-from";
6347 version = "3.0.0";
6348 src = fetchurl {
6349 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz";
6350 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
6351 };
6352 };
6353 "resolve-url-0.2.1" = {
6354 name = "resolve-url";
6355 packageName = "resolve-url";
6356 version = "0.2.1";
6357 src = fetchurl {
6358 url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz";
6359 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
6360 };
6361 };
6362 "ret-0.1.15" = {
6363 name = "ret";
6364 packageName = "ret";
6365 version = "0.1.15";
6366 src = fetchurl {
6367 url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
6368 sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
6369 };
6370 };
6371 "right-align-0.1.3" = {
6372 name = "right-align";
6373 packageName = "right-align";
6374 version = "0.1.3";
6375 src = fetchurl {
6376 url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz";
6377 sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
2292 6378 };
2293 6379 };
2294 6380 "rimraf-2.2.8" = {
@@ -2300,6 +6386,33 b' let'
2300 6386 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
2301 6387 };
2302 6388 };
6389 "rimraf-2.6.2" = {
6390 name = "rimraf";
6391 packageName = "rimraf";
6392 version = "2.6.2";
6393 src = fetchurl {
6394 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz";
6395 sha512 = "lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==";
6396 };
6397 };
6398 "ripemd160-2.0.2" = {
6399 name = "ripemd160";
6400 packageName = "ripemd160";
6401 version = "2.0.2";
6402 src = fetchurl {
6403 url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz";
6404 sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==";
6405 };
6406 };
6407 "run-queue-1.0.3" = {
6408 name = "run-queue";
6409 packageName = "run-queue";
6410 version = "1.0.3";
6411 src = fetchurl {
6412 url = "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz";
6413 sha1 = "e848396f057d223f24386924618e25694161ec47";
6414 };
6415 };
2303 6416 "safe-buffer-5.1.2" = {
2304 6417 name = "safe-buffer";
2305 6418 packageName = "safe-buffer";
@@ -2309,6 +6422,15 b' let'
2309 6422 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2310 6423 };
2311 6424 };
6425 "safe-regex-1.1.0" = {
6426 name = "safe-regex";
6427 packageName = "safe-regex";
6428 version = "1.1.0";
6429 src = fetchurl {
6430 url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz";
6431 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
6432 };
6433 };
2312 6434 "safer-buffer-2.1.2" = {
2313 6435 name = "safer-buffer";
2314 6436 packageName = "safer-buffer";
@@ -2318,6 +6440,24 b' let'
2318 6440 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
2319 6441 };
2320 6442 };
6443 "sax-1.2.4" = {
6444 name = "sax";
6445 packageName = "sax";
6446 version = "1.2.4";
6447 src = fetchurl {
6448 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
6449 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
6450 };
6451 };
6452 "schema-utils-0.4.7" = {
6453 name = "schema-utils";
6454 packageName = "schema-utils";
6455 version = "0.4.7";
6456 src = fetchurl {
6457 url = "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz";
6458 sha512 = "v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==";
6459 };
6460 };
2321 6461 "select-1.1.2" = {
2322 6462 name = "select";
2323 6463 packageName = "select";
@@ -2327,22 +6467,22 b' let'
2327 6467 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
2328 6468 };
2329 6469 };
2330 "semver-4.3.6" = {
6470 "semver-5.6.0" = {
2331 6471 name = "semver";
2332 6472 packageName = "semver";
2333 version = "4.3.6";
2334 src = fetchurl {
2335 url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
2336 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
2337 };
2338 };
2339 "semver-5.5.0" = {
2340 name = "semver";
2341 packageName = "semver";
2342 version = "5.5.0";
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz";
2345 sha512 = "4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==";
6473 version = "5.6.0";
6474 src = fetchurl {
6475 url = "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz";
6476 sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==";
6477 };
6478 };
6479 "serialize-javascript-1.5.0" = {
6480 name = "serialize-javascript";
6481 packageName = "serialize-javascript";
6482 version = "1.5.0";
6483 src = fetchurl {
6484 url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz";
6485 sha512 = "Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==";
2346 6486 };
2347 6487 };
2348 6488 "set-blocking-2.0.0" = {
@@ -2354,6 +6494,60 b' let'
2354 6494 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
2355 6495 };
2356 6496 };
6497 "set-value-0.4.3" = {
6498 name = "set-value";
6499 packageName = "set-value";
6500 version = "0.4.3";
6501 src = fetchurl {
6502 url = "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz";
6503 sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
6504 };
6505 };
6506 "set-value-2.0.0" = {
6507 name = "set-value";
6508 packageName = "set-value";
6509 version = "2.0.0";
6510 src = fetchurl {
6511 url = "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz";
6512 sha512 = "hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==";
6513 };
6514 };
6515 "setimmediate-1.0.5" = {
6516 name = "setimmediate";
6517 packageName = "setimmediate";
6518 version = "1.0.5";
6519 src = fetchurl {
6520 url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz";
6521 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
6522 };
6523 };
6524 "sha.js-2.4.11" = {
6525 name = "sha.js";
6526 packageName = "sha.js";
6527 version = "2.4.11";
6528 src = fetchurl {
6529 url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz";
6530 sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==";
6531 };
6532 };
6533 "shebang-command-1.2.0" = {
6534 name = "shebang-command";
6535 packageName = "shebang-command";
6536 version = "1.2.0";
6537 src = fetchurl {
6538 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
6539 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
6540 };
6541 };
6542 "shebang-regex-1.0.0" = {
6543 name = "shebang-regex";
6544 packageName = "shebang-regex";
6545 version = "1.0.0";
6546 src = fetchurl {
6547 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
6548 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
6549 };
6550 };
2357 6551 "shelljs-0.3.0" = {
2358 6552 name = "shelljs";
2359 6553 packageName = "shelljs";
@@ -2381,22 +6575,40 b' let'
2381 6575 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
2382 6576 };
2383 6577 };
2384 "slasp-0.0.4" = {
2385 name = "slasp";
2386 packageName = "slasp";
2387 version = "0.0.4";
2388 src = fetchurl {
2389 url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz";
2390 sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9";
2391 };
2392 };
2393 "slide-1.1.6" = {
2394 name = "slide";
2395 packageName = "slide";
2396 version = "1.1.6";
2397 src = fetchurl {
2398 url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
2399 sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
6578 "slash-1.0.0" = {
6579 name = "slash";
6580 packageName = "slash";
6581 version = "1.0.0";
6582 src = fetchurl {
6583 url = "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz";
6584 sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
6585 };
6586 };
6587 "snapdragon-0.8.2" = {
6588 name = "snapdragon";
6589 packageName = "snapdragon";
6590 version = "0.8.2";
6591 src = fetchurl {
6592 url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz";
6593 sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==";
6594 };
6595 };
6596 "snapdragon-node-2.1.1" = {
6597 name = "snapdragon-node";
6598 packageName = "snapdragon-node";
6599 version = "2.1.1";
6600 src = fetchurl {
6601 url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
6602 sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==";
6603 };
6604 };
6605 "snapdragon-util-3.0.1" = {
6606 name = "snapdragon-util";
6607 packageName = "snapdragon-util";
6608 version = "3.0.1";
6609 src = fetchurl {
6610 url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
6611 sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==";
2400 6612 };
2401 6613 };
2402 6614 "sntp-1.0.9" = {
@@ -2408,6 +6620,33 b' let'
2408 6620 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
2409 6621 };
2410 6622 };
6623 "sort-keys-1.1.2" = {
6624 name = "sort-keys";
6625 packageName = "sort-keys";
6626 version = "1.1.2";
6627 src = fetchurl {
6628 url = "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz";
6629 sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
6630 };
6631 };
6632 "source-list-map-0.1.8" = {
6633 name = "source-list-map";
6634 packageName = "source-list-map";
6635 version = "0.1.8";
6636 src = fetchurl {
6637 url = "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz";
6638 sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106";
6639 };
6640 };
6641 "source-list-map-2.0.1" = {
6642 name = "source-list-map";
6643 packageName = "source-list-map";
6644 version = "2.0.1";
6645 src = fetchurl {
6646 url = "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz";
6647 sha512 = "qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==";
6648 };
6649 };
2411 6650 "source-map-0.3.0" = {
2412 6651 name = "source-map";
2413 6652 packageName = "source-map";
@@ -2417,6 +6656,15 b' let'
2417 6656 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
2418 6657 };
2419 6658 };
6659 "source-map-0.4.4" = {
6660 name = "source-map";
6661 packageName = "source-map";
6662 version = "0.4.4";
6663 src = fetchurl {
6664 url = "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz";
6665 sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
6666 };
6667 };
2420 6668 "source-map-0.5.7" = {
2421 6669 name = "source-map";
2422 6670 packageName = "source-map";
@@ -2435,40 +6683,31 b' let'
2435 6683 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
2436 6684 };
2437 6685 };
2438 "spdx-correct-3.0.0" = {
2439 name = "spdx-correct";
2440 packageName = "spdx-correct";
2441 version = "3.0.0";
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz";
2444 sha512 = "N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==";
2445 };
2446 };
2447 "spdx-exceptions-2.1.0" = {
2448 name = "spdx-exceptions";
2449 packageName = "spdx-exceptions";
2450 version = "2.1.0";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
2453 sha512 = "4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==";
2454 };
2455 };
2456 "spdx-expression-parse-3.0.0" = {
2457 name = "spdx-expression-parse";
2458 packageName = "spdx-expression-parse";
2459 version = "3.0.0";
2460 src = fetchurl {
2461 url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
2462 sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==";
2463 };
2464 };
2465 "spdx-license-ids-3.0.0" = {
2466 name = "spdx-license-ids";
2467 packageName = "spdx-license-ids";
2468 version = "3.0.0";
2469 src = fetchurl {
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
2471 sha512 = "2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==";
6686 "source-map-resolve-0.5.2" = {
6687 name = "source-map-resolve";
6688 packageName = "source-map-resolve";
6689 version = "0.5.2";
6690 src = fetchurl {
6691 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
6692 sha512 = "MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==";
6693 };
6694 };
6695 "source-map-support-0.4.18" = {
6696 name = "source-map-support";
6697 packageName = "source-map-support";
6698 version = "0.4.18";
6699 src = fetchurl {
6700 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz";
6701 sha512 = "try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==";
6702 };
6703 };
6704 "source-map-url-0.4.0" = {
6705 name = "source-map-url";
6706 packageName = "source-map-url";
6707 version = "0.4.0";
6708 src = fetchurl {
6709 url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz";
6710 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
2472 6711 };
2473 6712 };
2474 6713 "split-1.0.1" = {
@@ -2480,13 +6719,31 b' let'
2480 6719 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
2481 6720 };
2482 6721 };
2483 "sshpk-1.14.2" = {
6722 "split-string-3.1.0" = {
6723 name = "split-string";
6724 packageName = "split-string";
6725 version = "3.1.0";
6726 src = fetchurl {
6727 url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";
6728 sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==";
6729 };
6730 };
6731 "sprintf-js-1.0.3" = {
6732 name = "sprintf-js";
6733 packageName = "sprintf-js";
6734 version = "1.0.3";
6735 src = fetchurl {
6736 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
6737 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
6738 };
6739 };
6740 "sshpk-1.15.1" = {
2484 6741 name = "sshpk";
2485 6742 packageName = "sshpk";
2486 version = "1.14.2";
2487 src = fetchurl {
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz";
2489 sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
6743 version = "1.15.1";
6744 src = fetchurl {
6745 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz";
6746 sha512 = "mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==";
2490 6747 };
2491 6748 };
2492 6749 "ssri-5.3.0" = {
@@ -2507,6 +6764,69 b' let'
2507 6764 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
2508 6765 };
2509 6766 };
6767 "static-extend-0.1.2" = {
6768 name = "static-extend";
6769 packageName = "static-extend";
6770 version = "0.1.2";
6771 src = fetchurl {
6772 url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz";
6773 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
6774 };
6775 };
6776 "sticky-sidebar-3.3.1" = {
6777 name = "sticky-sidebar";
6778 packageName = "sticky-sidebar";
6779 version = "3.3.1";
6780 src = fetchurl {
6781 url = "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz";
6782 sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877";
6783 };
6784 };
6785 "stream-browserify-2.0.1" = {
6786 name = "stream-browserify";
6787 packageName = "stream-browserify";
6788 version = "2.0.1";
6789 src = fetchurl {
6790 url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz";
6791 sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
6792 };
6793 };
6794 "stream-each-1.2.3" = {
6795 name = "stream-each";
6796 packageName = "stream-each";
6797 version = "1.2.3";
6798 src = fetchurl {
6799 url = "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz";
6800 sha512 = "vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==";
6801 };
6802 };
6803 "stream-http-2.8.3" = {
6804 name = "stream-http";
6805 packageName = "stream-http";
6806 version = "2.8.3";
6807 src = fetchurl {
6808 url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz";
6809 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
6810 };
6811 };
6812 "stream-shift-1.0.0" = {
6813 name = "stream-shift";
6814 packageName = "stream-shift";
6815 version = "1.0.0";
6816 src = fetchurl {
6817 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz";
6818 sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
6819 };
6820 };
6821 "strict-uri-encode-1.1.0" = {
6822 name = "strict-uri-encode";
6823 packageName = "strict-uri-encode";
6824 version = "1.1.0";
6825 src = fetchurl {
6826 url = "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
6827 sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
6828 };
6829 };
2510 6830 "string-width-1.0.2" = {
2511 6831 name = "string-width";
2512 6832 packageName = "string-width";
@@ -2516,6 +6836,15 b' let'
2516 6836 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
2517 6837 };
2518 6838 };
6839 "string-width-2.1.1" = {
6840 name = "string-width";
6841 packageName = "string-width";
6842 version = "2.1.1";
6843 src = fetchurl {
6844 url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
6845 sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
6846 };
6847 };
2519 6848 "string_decoder-0.10.31" = {
2520 6849 name = "string_decoder";
2521 6850 packageName = "string_decoder";
@@ -2561,6 +6890,24 b' let'
2561 6890 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
2562 6891 };
2563 6892 };
6893 "strip-ansi-4.0.0" = {
6894 name = "strip-ansi";
6895 packageName = "strip-ansi";
6896 version = "4.0.0";
6897 src = fetchurl {
6898 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
6899 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
6900 };
6901 };
6902 "strip-eof-1.0.0" = {
6903 name = "strip-eof";
6904 packageName = "strip-eof";
6905 version = "1.0.0";
6906 src = fetchurl {
6907 url = "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz";
6908 sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
6909 };
6910 };
2564 6911 "strip-json-comments-1.0.4" = {
2565 6912 name = "strip-json-comments";
2566 6913 packageName = "strip-json-comments";
@@ -2570,6 +6917,15 b' let'
2570 6917 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
2571 6918 };
2572 6919 };
6920 "style-loader-0.21.0" = {
6921 name = "style-loader";
6922 packageName = "style-loader";
6923 version = "0.21.0";
6924 src = fetchurl {
6925 url = "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz";
6926 sha512 = "T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==";
6927 };
6928 };
2573 6929 "supports-color-0.2.0" = {
2574 6930 name = "supports-color";
2575 6931 packageName = "supports-color";
@@ -2588,40 +6944,49 b' let'
2588 6944 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
2589 6945 };
2590 6946 };
2591 "table-layout-0.3.0" = {
2592 name = "table-layout";
2593 packageName = "table-layout";
2594 version = "0.3.0";
2595 src = fetchurl {
2596 url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz";
2597 sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a";
2598 };
2599 };
2600 "tar-3.1.15" = {
2601 name = "tar";
2602 packageName = "tar";
2603 version = "3.1.15";
2604 src = fetchurl {
2605 url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz";
2606 sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw==";
2607 };
2608 };
2609 "temp-0.8.3" = {
2610 name = "temp";
2611 packageName = "temp";
2612 version = "0.8.3";
2613 src = fetchurl {
2614 url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
2615 sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
2616 };
2617 };
2618 "test-value-2.1.0" = {
2619 name = "test-value";
2620 packageName = "test-value";
2621 version = "2.1.0";
2622 src = fetchurl {
2623 url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz";
2624 sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291";
6947 "supports-color-3.2.3" = {
6948 name = "supports-color";
6949 packageName = "supports-color";
6950 version = "3.2.3";
6951 src = fetchurl {
6952 url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz";
6953 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
6954 };
6955 };
6956 "supports-color-5.5.0" = {
6957 name = "supports-color";
6958 packageName = "supports-color";
6959 version = "5.5.0";
6960 src = fetchurl {
6961 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
6962 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
6963 };
6964 };
6965 "svgo-0.7.2" = {
6966 name = "svgo";
6967 packageName = "svgo";
6968 version = "0.7.2";
6969 src = fetchurl {
6970 url = "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz";
6971 sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
6972 };
6973 };
6974 "tapable-0.2.8" = {
6975 name = "tapable";
6976 packageName = "tapable";
6977 version = "0.2.8";
6978 src = fetchurl {
6979 url = "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz";
6980 sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22";
6981 };
6982 };
6983 "tapable-1.1.0" = {
6984 name = "tapable";
6985 packageName = "tapable";
6986 version = "1.1.0";
6987 src = fetchurl {
6988 url = "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz";
6989 sha512 = "IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==";
2625 6990 };
2626 6991 };
2627 6992 "throttleit-1.0.0" = {
@@ -2642,6 +7007,24 b' let'
2642 7007 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
2643 7008 };
2644 7009 };
7010 "through2-2.0.3" = {
7011 name = "through2";
7012 packageName = "through2";
7013 version = "2.0.3";
7014 src = fetchurl {
7015 url = "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz";
7016 sha1 = "0004569b37c7c74ba39c43f3ced78d1ad94140be";
7017 };
7018 };
7019 "timers-browserify-2.0.10" = {
7020 name = "timers-browserify";
7021 packageName = "timers-browserify";
7022 version = "2.0.10";
7023 src = fetchurl {
7024 url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz";
7025 sha512 = "YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==";
7026 };
7027 };
2645 7028 "tiny-emitter-2.0.2" = {
2646 7029 name = "tiny-emitter";
2647 7030 packageName = "tiny-emitter";
@@ -2660,6 +7043,60 b' let'
2660 7043 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
2661 7044 };
2662 7045 };
7046 "to-arraybuffer-1.0.1" = {
7047 name = "to-arraybuffer";
7048 packageName = "to-arraybuffer";
7049 version = "1.0.1";
7050 src = fetchurl {
7051 url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
7052 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
7053 };
7054 };
7055 "to-fast-properties-1.0.3" = {
7056 name = "to-fast-properties";
7057 packageName = "to-fast-properties";
7058 version = "1.0.3";
7059 src = fetchurl {
7060 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
7061 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
7062 };
7063 };
7064 "to-object-path-0.3.0" = {
7065 name = "to-object-path";
7066 packageName = "to-object-path";
7067 version = "0.3.0";
7068 src = fetchurl {
7069 url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz";
7070 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
7071 };
7072 };
7073 "to-regex-3.0.2" = {
7074 name = "to-regex";
7075 packageName = "to-regex";
7076 version = "3.0.2";
7077 src = fetchurl {
7078 url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz";
7079 sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==";
7080 };
7081 };
7082 "to-regex-range-2.1.1" = {
7083 name = "to-regex-range";
7084 packageName = "to-regex-range";
7085 version = "2.1.1";
7086 src = fetchurl {
7087 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";
7088 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
7089 };
7090 };
7091 "toposort-1.0.7" = {
7092 name = "toposort";
7093 packageName = "toposort";
7094 version = "1.0.7";
7095 src = fetchurl {
7096 url = "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz";
7097 sha1 = "2e68442d9f64ec720b8cc89e6443ac6caa950029";
7098 };
7099 };
2663 7100 "tough-cookie-2.3.4" = {
2664 7101 name = "tough-cookie";
2665 7102 packageName = "tough-cookie";
@@ -2669,6 +7106,42 b' let'
2669 7106 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
2670 7107 };
2671 7108 };
7109 "trim-right-1.0.1" = {
7110 name = "trim-right";
7111 packageName = "trim-right";
7112 version = "1.0.1";
7113 src = fetchurl {
7114 url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz";
7115 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
7116 };
7117 };
7118 "ts-loader-1.3.3" = {
7119 name = "ts-loader";
7120 packageName = "ts-loader";
7121 version = "1.3.3";
7122 src = fetchurl {
7123 url = "https://registry.npmjs.org/ts-loader/-/ts-loader-1.3.3.tgz";
7124 sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026";
7125 };
7126 };
7127 "tslib-1.9.3" = {
7128 name = "tslib";
7129 packageName = "tslib";
7130 version = "1.9.3";
7131 src = fetchurl {
7132 url = "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz";
7133 sha512 = "4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==";
7134 };
7135 };
7136 "tty-browserify-0.0.0" = {
7137 name = "tty-browserify";
7138 packageName = "tty-browserify";
7139 version = "0.0.0";
7140 src = fetchurl {
7141 url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz";
7142 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
7143 };
7144 };
2672 7145 "tunnel-agent-0.6.0" = {
2673 7146 name = "tunnel-agent";
2674 7147 packageName = "tunnel-agent";
@@ -2687,15 +7160,6 b' let'
2687 7160 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
2688 7161 };
2689 7162 };
2690 "type-check-0.3.2" = {
2691 name = "type-check";
2692 packageName = "type-check";
2693 version = "0.3.2";
2694 src = fetchurl {
2695 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
2696 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
2697 };
2698 };
2699 7163 "typedarray-0.0.6" = {
2700 7164 name = "typedarray";
2701 7165 packageName = "typedarray";
@@ -2705,22 +7169,58 b' let'
2705 7169 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
2706 7170 };
2707 7171 };
2708 "typical-2.6.1" = {
2709 name = "typical";
2710 packageName = "typical";
2711 version = "2.6.1";
2712 src = fetchurl {
2713 url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz";
2714 sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d";
2715 };
2716 };
2717 "uid-number-0.0.5" = {
2718 name = "uid-number";
2719 packageName = "uid-number";
2720 version = "0.0.5";
2721 src = fetchurl {
2722 url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz";
2723 sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e";
7172 "uglify-es-3.3.10" = {
7173 name = "uglify-es";
7174 packageName = "uglify-es";
7175 version = "3.3.10";
7176 src = fetchurl {
7177 url = "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz";
7178 sha512 = "rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==";
7179 };
7180 };
7181 "uglify-js-2.8.29" = {
7182 name = "uglify-js";
7183 packageName = "uglify-js";
7184 version = "2.8.29";
7185 src = fetchurl {
7186 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz";
7187 sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
7188 };
7189 };
7190 "uglify-js-3.4.9" = {
7191 name = "uglify-js";
7192 packageName = "uglify-js";
7193 version = "3.4.9";
7194 src = fetchurl {
7195 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz";
7196 sha512 = "8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==";
7197 };
7198 };
7199 "uglify-to-browserify-1.0.2" = {
7200 name = "uglify-to-browserify";
7201 packageName = "uglify-to-browserify";
7202 version = "1.0.2";
7203 src = fetchurl {
7204 url = "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
7205 sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
7206 };
7207 };
7208 "uglifyjs-webpack-plugin-1.3.0" = {
7209 name = "uglifyjs-webpack-plugin";
7210 packageName = "uglifyjs-webpack-plugin";
7211 version = "1.3.0";
7212 src = fetchurl {
7213 url = "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz";
7214 sha512 = "ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==";
7215 };
7216 };
7217 "unc-path-regex-0.1.2" = {
7218 name = "unc-path-regex";
7219 packageName = "unc-path-regex";
7220 version = "0.1.2";
7221 src = fetchurl {
7222 url = "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz";
7223 sha1 = "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa";
2724 7224 };
2725 7225 };
2726 7226 "underscore-1.7.0" = {
@@ -2768,6 +7268,132 b' let'
2768 7268 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
2769 7269 };
2770 7270 };
7271 "union-value-1.0.0" = {
7272 name = "union-value";
7273 packageName = "union-value";
7274 version = "1.0.0";
7275 src = fetchurl {
7276 url = "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz";
7277 sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
7278 };
7279 };
7280 "uniq-1.0.1" = {
7281 name = "uniq";
7282 packageName = "uniq";
7283 version = "1.0.1";
7284 src = fetchurl {
7285 url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz";
7286 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
7287 };
7288 };
7289 "uniqs-2.0.0" = {
7290 name = "uniqs";
7291 packageName = "uniqs";
7292 version = "2.0.0";
7293 src = fetchurl {
7294 url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz";
7295 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
7296 };
7297 };
7298 "unique-filename-1.1.1" = {
7299 name = "unique-filename";
7300 packageName = "unique-filename";
7301 version = "1.1.1";
7302 src = fetchurl {
7303 url = "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz";
7304 sha512 = "Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==";
7305 };
7306 };
7307 "unique-slug-2.0.1" = {
7308 name = "unique-slug";
7309 packageName = "unique-slug";
7310 version = "2.0.1";
7311 src = fetchurl {
7312 url = "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz";
7313 sha512 = "n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==";
7314 };
7315 };
7316 "unset-value-1.0.0" = {
7317 name = "unset-value";
7318 packageName = "unset-value";
7319 version = "1.0.0";
7320 src = fetchurl {
7321 url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";
7322 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
7323 };
7324 };
7325 "upath-1.1.0" = {
7326 name = "upath";
7327 packageName = "upath";
7328 version = "1.1.0";
7329 src = fetchurl {
7330 url = "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz";
7331 sha512 = "bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==";
7332 };
7333 };
7334 "upper-case-1.1.3" = {
7335 name = "upper-case";
7336 packageName = "upper-case";
7337 version = "1.1.3";
7338 src = fetchurl {
7339 url = "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz";
7340 sha1 = "f6b4501c2ec4cdd26ba78be7222961de77621598";
7341 };
7342 };
7343 "uri-js-4.2.2" = {
7344 name = "uri-js";
7345 packageName = "uri-js";
7346 version = "4.2.2";
7347 src = fetchurl {
7348 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
7349 sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
7350 };
7351 };
7352 "urix-0.1.0" = {
7353 name = "urix";
7354 packageName = "urix";
7355 version = "0.1.0";
7356 src = fetchurl {
7357 url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz";
7358 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
7359 };
7360 };
7361 "url-0.11.0" = {
7362 name = "url";
7363 packageName = "url";
7364 version = "0.11.0";
7365 src = fetchurl {
7366 url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz";
7367 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
7368 };
7369 };
7370 "use-3.1.1" = {
7371 name = "use";
7372 packageName = "use";
7373 version = "3.1.1";
7374 src = fetchurl {
7375 url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz";
7376 sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==";
7377 };
7378 };
7379 "util-0.10.3" = {
7380 name = "util";
7381 packageName = "util";
7382 version = "0.10.3";
7383 src = fetchurl {
7384 url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz";
7385 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
7386 };
7387 };
7388 "util-0.10.4" = {
7389 name = "util";
7390 packageName = "util";
7391 version = "0.10.4";
7392 src = fetchurl {
7393 url = "https://registry.npmjs.org/util/-/util-0.10.4.tgz";
7394 sha512 = "0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==";
7395 };
7396 };
2771 7397 "util-deprecate-1.0.2" = {
2772 7398 name = "util-deprecate";
2773 7399 packageName = "util-deprecate";
@@ -2777,6 +7403,24 b' let'
2777 7403 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
2778 7404 };
2779 7405 };
7406 "util.promisify-1.0.0" = {
7407 name = "util.promisify";
7408 packageName = "util.promisify";
7409 version = "1.0.0";
7410 src = fetchurl {
7411 url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz";
7412 sha512 = "i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==";
7413 };
7414 };
7415 "utila-0.4.0" = {
7416 name = "utila";
7417 packageName = "utila";
7418 version = "0.4.0";
7419 src = fetchurl {
7420 url = "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz";
7421 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7422 };
7423 };
2780 7424 "uuid-3.3.2" = {
2781 7425 name = "uuid";
2782 7426 packageName = "uuid";
@@ -2786,22 +7430,31 b' let'
2786 7430 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
2787 7431 };
2788 7432 };
2789 "validate-npm-package-license-3.0.3" = {
2790 name = "validate-npm-package-license";
2791 packageName = "validate-npm-package-license";
2792 version = "3.0.3";
2793 src = fetchurl {
2794 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
2795 sha512 = "63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==";
2796 };
2797 };
2798 "validate-npm-package-name-3.0.0" = {
2799 name = "validate-npm-package-name";
2800 packageName = "validate-npm-package-name";
2801 version = "3.0.0";
2802 src = fetchurl {
2803 url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
2804 sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
7433 "v8-compile-cache-2.0.2" = {
7434 name = "v8-compile-cache";
7435 packageName = "v8-compile-cache";
7436 version = "2.0.2";
7437 src = fetchurl {
7438 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz";
7439 sha512 = "1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==";
7440 };
7441 };
7442 "v8flags-3.0.2" = {
7443 name = "v8flags";
7444 packageName = "v8flags";
7445 version = "3.0.2";
7446 src = fetchurl {
7447 url = "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz";
7448 sha512 = "6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==";
7449 };
7450 };
7451 "vendors-1.0.2" = {
7452 name = "vendors";
7453 packageName = "vendors";
7454 version = "1.0.2";
7455 src = fetchurl {
7456 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz";
7457 sha512 = "w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==";
2805 7458 };
2806 7459 };
2807 7460 "verror-1.10.0" = {
@@ -2813,22 +7466,85 b' let'
2813 7466 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
2814 7467 };
2815 7468 };
2816 "vulcanize-1.16.0" = {
2817 name = "vulcanize";
2818 packageName = "vulcanize";
2819 version = "1.16.0";
2820 src = fetchurl {
2821 url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz";
2822 sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==";
2823 };
2824 };
2825 "walk-2.3.14" = {
2826 name = "walk";
2827 packageName = "walk";
2828 version = "2.3.14";
2829 src = fetchurl {
2830 url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz";
2831 sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==";
7469 "vm-browserify-0.0.4" = {
7470 name = "vm-browserify";
7471 packageName = "vm-browserify";
7472 version = "0.0.4";
7473 src = fetchurl {
7474 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz";
7475 sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
7476 };
7477 };
7478 "watchpack-1.6.0" = {
7479 name = "watchpack";
7480 packageName = "watchpack";
7481 version = "1.6.0";
7482 src = fetchurl {
7483 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz";
7484 sha512 = "i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==";
7485 };
7486 };
7487 "waypoints-4.0.1" = {
7488 name = "waypoints";
7489 packageName = "waypoints";
7490 version = "4.0.1";
7491 src = fetchurl {
7492 url = "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz";
7493 sha1 = "09979a0573810b29627cba4366a284a062ec69c8";
7494 };
7495 };
7496 "webpack-4.23.1" = {
7497 name = "webpack";
7498 packageName = "webpack";
7499 version = "4.23.1";
7500 src = fetchurl {
7501 url = "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz";
7502 sha512 = "iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==";
7503 };
7504 };
7505 "webpack-cli-3.1.2" = {
7506 name = "webpack-cli";
7507 packageName = "webpack-cli";
7508 version = "3.1.2";
7509 src = fetchurl {
7510 url = "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz";
7511 sha512 = "Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==";
7512 };
7513 };
7514 "webpack-core-0.6.9" = {
7515 name = "webpack-core";
7516 packageName = "webpack-core";
7517 version = "0.6.9";
7518 src = fetchurl {
7519 url = "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz";
7520 sha1 = "fc571588c8558da77be9efb6debdc5a3b172bdc2";
7521 };
7522 };
7523 "webpack-sources-1.3.0" = {
7524 name = "webpack-sources";
7525 packageName = "webpack-sources";
7526 version = "1.3.0";
7527 src = fetchurl {
7528 url = "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz";
7529 sha512 = "OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==";
7530 };
7531 };
7532 "webpack-uglify-js-plugin-1.1.9" = {
7533 name = "webpack-uglify-js-plugin";
7534 packageName = "webpack-uglify-js-plugin";
7535 version = "1.1.9";
7536 src = fetchurl {
7537 url = "https://registry.npmjs.org/webpack-uglify-js-plugin/-/webpack-uglify-js-plugin-1.1.9.tgz";
7538 sha1 = "ecd4c27843a4ac17ee318f45229cdf1d2fb5e103";
7539 };
7540 };
7541 "whet.extend-0.9.9" = {
7542 name = "whet.extend";
7543 packageName = "whet.extend";
7544 version = "0.9.9";
7545 src = fetchurl {
7546 url = "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz";
7547 sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1";
2832 7548 };
2833 7549 };
2834 7550 "which-1.0.9" = {
@@ -2849,40 +7565,58 b' let'
2849 7565 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
2850 7566 };
2851 7567 };
2852 "wide-align-1.1.3" = {
2853 name = "wide-align";
2854 packageName = "wide-align";
2855 version = "1.1.3";
2856 src = fetchurl {
2857 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
2858 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
2859 };
2860 };
2861 "winston-2.4.3" = {
7568 "which-module-2.0.0" = {
7569 name = "which-module";
7570 packageName = "which-module";
7571 version = "2.0.0";
7572 src = fetchurl {
7573 url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";
7574 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
7575 };
7576 };
7577 "window-size-0.1.0" = {
7578 name = "window-size";
7579 packageName = "window-size";
7580 version = "0.1.0";
7581 src = fetchurl {
7582 url = "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz";
7583 sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
7584 };
7585 };
7586 "winston-2.4.4" = {
2862 7587 name = "winston";
2863 7588 packageName = "winston";
2864 version = "2.4.3";
2865 src = fetchurl {
2866 url = "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz";
2867 sha512 = "GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==";
2868 };
2869 };
2870 "wordwrap-1.0.0" = {
7589 version = "2.4.4";
7590 src = fetchurl {
7591 url = "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz";
7592 sha512 = "NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==";
7593 };
7594 };
7595 "wordwrap-0.0.2" = {
2871 7596 name = "wordwrap";
2872 7597 packageName = "wordwrap";
2873 version = "1.0.0";
2874 src = fetchurl {
2875 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
2876 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
2877 };
2878 };
2879 "wordwrapjs-2.0.0" = {
2880 name = "wordwrapjs";
2881 packageName = "wordwrapjs";
2882 version = "2.0.0";
2883 src = fetchurl {
2884 url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz";
2885 sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20";
7598 version = "0.0.2";
7599 src = fetchurl {
7600 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz";
7601 sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
7602 };
7603 };
7604 "worker-farm-1.6.0" = {
7605 name = "worker-farm";
7606 packageName = "worker-farm";
7607 version = "1.6.0";
7608 src = fetchurl {
7609 url = "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz";
7610 sha512 = "6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==";
7611 };
7612 };
7613 "wrap-ansi-2.1.0" = {
7614 name = "wrap-ansi";
7615 packageName = "wrap-ansi";
7616 version = "2.1.0";
7617 src = fetchurl {
7618 url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
7619 sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
2886 7620 };
2887 7621 };
2888 7622 "wrappy-1.0.2" = {
@@ -2894,13 +7628,67 b' let'
2894 7628 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
2895 7629 };
2896 7630 };
2897 "yallist-3.0.2" = {
7631 "xregexp-4.0.0" = {
7632 name = "xregexp";
7633 packageName = "xregexp";
7634 version = "4.0.0";
7635 src = fetchurl {
7636 url = "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz";
7637 sha512 = "PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==";
7638 };
7639 };
7640 "xtend-4.0.1" = {
7641 name = "xtend";
7642 packageName = "xtend";
7643 version = "4.0.1";
7644 src = fetchurl {
7645 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";
7646 sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
7647 };
7648 };
7649 "y18n-4.0.0" = {
7650 name = "y18n";
7651 packageName = "y18n";
7652 version = "4.0.0";
7653 src = fetchurl {
7654 url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
7655 sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
7656 };
7657 };
7658 "yallist-2.1.2" = {
2898 7659 name = "yallist";
2899 7660 packageName = "yallist";
2900 version = "3.0.2";
2901 src = fetchurl {
2902 url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz";
2903 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
7661 version = "2.1.2";
7662 src = fetchurl {
7663 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
7664 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
7665 };
7666 };
7667 "yargs-12.0.2" = {
7668 name = "yargs";
7669 packageName = "yargs";
7670 version = "12.0.2";
7671 src = fetchurl {
7672 url = "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz";
7673 sha512 = "e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==";
7674 };
7675 };
7676 "yargs-3.10.0" = {
7677 name = "yargs";
7678 packageName = "yargs";
7679 version = "3.10.0";
7680 src = fetchurl {
7681 url = "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz";
7682 sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
7683 };
7684 };
7685 "yargs-parser-10.1.0" = {
7686 name = "yargs-parser";
7687 packageName = "yargs-parser";
7688 version = "10.1.0";
7689 src = fetchurl {
7690 url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz";
7691 sha512 = "VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==";
2904 7692 };
2905 7693 };
2906 7694 "yauzl-2.4.1" = {
@@ -2916,82 +7704,396 b' let'
2916 7704 args = {
2917 7705 name = "rhodecode-enterprise";
2918 7706 packageName = "rhodecode-enterprise";
2919 version = "1.0.0";
7707 version = "2.0.0";
2920 7708 src = ./..;
2921 7709 dependencies = [
7710 sources."@polymer/font-roboto-3.0.2"
7711 sources."@polymer/iron-a11y-announcer-3.0.1"
7712 sources."@polymer/iron-a11y-keys-3.0.1"
7713 sources."@polymer/iron-a11y-keys-behavior-3.0.1"
7714 sources."@polymer/iron-ajax-3.0.1"
7715 sources."@polymer/iron-autogrow-textarea-3.0.1"
7716 sources."@polymer/iron-behaviors-3.0.1"
7717 sources."@polymer/iron-checked-element-behavior-3.0.1"
7718 sources."@polymer/iron-fit-behavior-3.0.1"
7719 sources."@polymer/iron-flex-layout-3.0.1"
7720 sources."@polymer/iron-form-element-behavior-3.0.1"
7721 sources."@polymer/iron-meta-3.0.1"
7722 sources."@polymer/iron-overlay-behavior-3.0.2"
7723 sources."@polymer/iron-resizable-behavior-3.0.1"
7724 sources."@polymer/iron-validatable-behavior-3.0.1"
7725 sources."@polymer/paper-behaviors-3.0.1"
7726 sources."@polymer/paper-button-3.0.1"
7727 sources."@polymer/paper-ripple-3.0.1"
7728 sources."@polymer/paper-spinner-3.0.1"
7729 sources."@polymer/paper-styles-3.0.1"
7730 sources."@polymer/paper-toast-3.0.1"
7731 sources."@polymer/paper-toggle-button-3.0.1"
7732 sources."@polymer/paper-tooltip-3.0.1"
7733 sources."@polymer/polymer-3.1.0"
2922 7734 sources."@types/clone-0.1.30"
2923 sources."@types/node-4.2.23"
2924 (sources."@types/parse5-0.0.31" // {
2925 dependencies = [
2926 sources."@types/node-6.0.114"
2927 ];
2928 })
7735 sources."@types/node-6.14.0"
7736 sources."@types/parse5-2.2.34"
7737 sources."@webassemblyjs/ast-1.7.10"
7738 sources."@webassemblyjs/floating-point-hex-parser-1.7.10"
7739 sources."@webassemblyjs/helper-api-error-1.7.10"
7740 sources."@webassemblyjs/helper-buffer-1.7.10"
7741 sources."@webassemblyjs/helper-code-frame-1.7.10"
7742 sources."@webassemblyjs/helper-fsm-1.7.10"
7743 sources."@webassemblyjs/helper-module-context-1.7.10"
7744 sources."@webassemblyjs/helper-wasm-bytecode-1.7.10"
7745 sources."@webassemblyjs/helper-wasm-section-1.7.10"
7746 sources."@webassemblyjs/ieee754-1.7.10"
7747 sources."@webassemblyjs/leb128-1.7.10"
7748 sources."@webassemblyjs/utf8-1.7.10"
7749 sources."@webassemblyjs/wasm-edit-1.7.10"
7750 sources."@webassemblyjs/wasm-gen-1.7.10"
7751 sources."@webassemblyjs/wasm-opt-1.7.10"
7752 sources."@webassemblyjs/wasm-parser-1.7.10"
7753 sources."@webassemblyjs/wast-parser-1.7.10"
7754 sources."@webassemblyjs/wast-printer-1.7.10"
7755 sources."@webcomponents/shadycss-1.5.2"
7756 sources."@webcomponents/webcomponentsjs-2.1.3"
7757 sources."@xtuc/ieee754-1.2.0"
7758 sources."@xtuc/long-4.2.1"
2929 7759 sources."abbrev-1.1.1"
7760 sources."acorn-5.7.3"
7761 sources."acorn-dynamic-import-3.0.0"
7762 (sources."acorn-jsx-3.0.1" // {
7763 dependencies = [
2930 7764 sources."acorn-3.3.0"
2931 sources."acorn-jsx-3.0.1"
7765 ];
7766 })
2932 7767 sources."ajv-4.11.8"
7768 sources."ajv-keywords-3.2.0"
7769 (sources."align-text-0.1.4" // {
7770 dependencies = [
7771 sources."kind-of-3.2.2"
7772 ];
7773 })
7774 sources."alphanum-sort-1.0.2"
2933 7775 sources."amdefine-1.0.1"
2934 sources."ansi-escape-sequences-3.0.0"
2935 sources."ansi-regex-2.1.1"
2936 sources."ansi-styles-2.2.1"
7776 sources."ansi-regex-0.2.1"
7777 sources."ansi-styles-1.1.0"
7778 sources."anymatch-2.0.0"
2937 7779 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
2938 7780 sources."aproba-1.2.0"
2939 sources."are-we-there-yet-1.1.5"
2940 7781 (sources."argparse-0.1.16" // {
2941 7782 dependencies = [
2942 7783 sources."underscore.string-2.4.0"
2943 7784 ];
2944 7785 })
2945 sources."array-back-1.0.4"
7786 sources."arr-diff-4.0.0"
7787 sources."arr-flatten-1.1.0"
7788 sources."arr-union-3.1.0"
7789 sources."array-each-1.0.1"
7790 sources."array-slice-1.1.0"
7791 sources."array-union-1.0.2"
7792 sources."array-uniq-1.0.3"
7793 sources."array-unique-0.3.2"
7794 sources."arrify-1.0.1"
2946 7795 sources."asap-2.0.6"
2947 sources."asn1-0.2.3"
7796 sources."asn1-0.2.4"
7797 sources."asn1.js-4.10.1"
7798 (sources."assert-1.4.1" // {
7799 dependencies = [
7800 sources."inherits-2.0.1"
7801 sources."util-0.10.3"
7802 ];
7803 })
2948 7804 sources."assert-plus-0.2.0"
7805 sources."assign-symbols-1.0.0"
7806 sources."ast-types-0.9.6"
2949 7807 sources."async-0.1.22"
7808 sources."async-each-1.0.1"
2950 7809 sources."asynckit-0.4.0"
7810 sources."atob-2.1.2"
7811 (sources."autoprefixer-6.7.7" // {
7812 dependencies = [
7813 sources."browserslist-1.7.7"
7814 ];
7815 })
2951 7816 sources."aws-sign2-0.6.0"
2952 sources."aws4-1.7.0"
2953 sources."babel-polyfill-6.26.0"
2954 (sources."babel-runtime-6.26.0" // {
2955 dependencies = [
2956 sources."regenerator-runtime-0.11.1"
2957 ];
2958 })
7817 sources."aws4-1.8.0"
7818 (sources."babel-code-frame-6.26.0" // {
7819 dependencies = [
7820 sources."ansi-regex-2.1.1"
7821 sources."ansi-styles-2.2.1"
7822 sources."chalk-1.1.3"
7823 sources."has-ansi-2.0.0"
7824 sources."strip-ansi-3.0.1"
7825 sources."supports-color-2.0.0"
7826 ];
7827 })
7828 (sources."babel-core-6.26.3" // {
7829 dependencies = [
7830 sources."lodash-4.17.11"
7831 sources."minimatch-3.0.4"
7832 ];
7833 })
7834 (sources."babel-generator-6.26.1" // {
7835 dependencies = [
7836 sources."lodash-4.17.11"
7837 ];
7838 })
7839 sources."babel-helper-builder-binary-assignment-operator-visitor-6.24.1"
7840 sources."babel-helper-call-delegate-6.24.1"
7841 (sources."babel-helper-define-map-6.26.0" // {
7842 dependencies = [
7843 sources."lodash-4.17.11"
7844 ];
7845 })
7846 sources."babel-helper-explode-assignable-expression-6.24.1"
7847 sources."babel-helper-function-name-6.24.1"
7848 sources."babel-helper-get-function-arity-6.24.1"
7849 sources."babel-helper-hoist-variables-6.24.1"
7850 sources."babel-helper-optimise-call-expression-6.24.1"
7851 (sources."babel-helper-regex-6.26.0" // {
7852 dependencies = [
7853 sources."lodash-4.17.11"
7854 ];
7855 })
7856 sources."babel-helper-remap-async-to-generator-6.24.1"
7857 sources."babel-helper-replace-supers-6.24.1"
7858 sources."babel-helpers-6.24.1"
7859 sources."babel-loader-7.1.5"
7860 sources."babel-messages-6.23.0"
7861 sources."babel-plugin-check-es2015-constants-6.22.0"
7862 sources."babel-plugin-syntax-async-functions-6.13.0"
7863 sources."babel-plugin-syntax-exponentiation-operator-6.13.0"
7864 sources."babel-plugin-syntax-object-rest-spread-6.13.0"
7865 sources."babel-plugin-syntax-trailing-function-commas-6.22.0"
7866 sources."babel-plugin-transform-async-to-generator-6.24.1"
7867 sources."babel-plugin-transform-es2015-arrow-functions-6.22.0"
7868 sources."babel-plugin-transform-es2015-block-scoped-functions-6.22.0"
7869 (sources."babel-plugin-transform-es2015-block-scoping-6.26.0" // {
7870 dependencies = [
7871 sources."lodash-4.17.11"
7872 ];
7873 })
7874 sources."babel-plugin-transform-es2015-classes-6.24.1"
7875 sources."babel-plugin-transform-es2015-computed-properties-6.24.1"
7876 sources."babel-plugin-transform-es2015-destructuring-6.23.0"
7877 sources."babel-plugin-transform-es2015-duplicate-keys-6.24.1"
7878 sources."babel-plugin-transform-es2015-for-of-6.23.0"
7879 sources."babel-plugin-transform-es2015-function-name-6.24.1"
7880 sources."babel-plugin-transform-es2015-literals-6.22.0"
7881 sources."babel-plugin-transform-es2015-modules-amd-6.24.1"
7882 sources."babel-plugin-transform-es2015-modules-commonjs-6.26.2"
7883 sources."babel-plugin-transform-es2015-modules-systemjs-6.24.1"
7884 sources."babel-plugin-transform-es2015-modules-umd-6.24.1"
7885 sources."babel-plugin-transform-es2015-object-super-6.24.1"
7886 sources."babel-plugin-transform-es2015-parameters-6.24.1"
7887 sources."babel-plugin-transform-es2015-shorthand-properties-6.24.1"
7888 sources."babel-plugin-transform-es2015-spread-6.22.0"
7889 sources."babel-plugin-transform-es2015-sticky-regex-6.24.1"
7890 sources."babel-plugin-transform-es2015-template-literals-6.22.0"
7891 sources."babel-plugin-transform-es2015-typeof-symbol-6.23.0"
7892 sources."babel-plugin-transform-es2015-unicode-regex-6.24.1"
7893 sources."babel-plugin-transform-exponentiation-operator-6.24.1"
7894 sources."babel-plugin-transform-object-rest-spread-6.26.0"
7895 sources."babel-plugin-transform-regenerator-6.26.0"
7896 sources."babel-plugin-transform-strict-mode-6.24.1"
7897 sources."babel-preset-env-1.7.0"
7898 (sources."babel-register-6.26.0" // {
7899 dependencies = [
7900 sources."lodash-4.17.11"
7901 ];
7902 })
7903 sources."babel-runtime-6.26.0"
7904 (sources."babel-template-6.26.0" // {
7905 dependencies = [
7906 sources."lodash-4.17.11"
7907 ];
7908 })
7909 (sources."babel-traverse-6.26.0" // {
7910 dependencies = [
7911 sources."lodash-4.17.11"
7912 ];
7913 })
7914 (sources."babel-types-6.26.0" // {
7915 dependencies = [
7916 sources."lodash-4.17.11"
7917 ];
7918 })
7919 sources."babylon-6.18.0"
2959 7920 sources."balanced-match-1.0.0"
2960 sources."base64-js-1.2.3"
7921 (sources."base-0.11.2" // {
7922 dependencies = [
7923 sources."define-property-1.0.0"
7924 ];
7925 })
7926 sources."base64-js-1.3.0"
2961 7927 sources."bcrypt-pbkdf-1.0.2"
7928 sources."big.js-3.2.0"
7929 sources."binary-extensions-1.12.0"
7930 sources."bluebird-3.5.2"
7931 sources."bn.js-4.11.8"
7932 sources."boolbase-1.0.0"
2962 7933 sources."boom-2.10.1"
2963 sources."bower-1.8.4"
2964 7934 sources."brace-expansion-1.1.11"
7935 (sources."braces-2.3.2" // {
7936 dependencies = [
7937 sources."extend-shallow-2.0.1"
7938 ];
7939 })
7940 sources."brorand-1.1.0"
7941 sources."browserify-aes-1.2.0"
7942 sources."browserify-cipher-1.0.1"
7943 sources."browserify-des-1.0.2"
7944 sources."browserify-rsa-4.0.1"
7945 sources."browserify-sign-4.0.4"
7946 sources."browserify-zlib-0.2.0"
7947 sources."browserslist-3.2.8"
7948 sources."buffer-4.9.1"
2965 7949 sources."buffer-from-1.1.1"
2966 sources."builtin-modules-1.1.1"
2967 sources."builtins-1.0.3"
7950 sources."buffer-xor-1.0.3"
7951 sources."builtin-status-codes-3.0.0"
7952 (sources."cacache-10.0.4" // {
7953 dependencies = [
7954 sources."glob-7.1.3"
7955 sources."graceful-fs-4.1.11"
7956 sources."lru-cache-4.1.3"
7957 sources."minimatch-3.0.4"
7958 sources."rimraf-2.6.2"
7959 ];
7960 })
7961 sources."cache-base-1.0.1"
7962 sources."camel-case-3.0.0"
7963 sources."camelcase-4.1.0"
7964 (sources."caniuse-api-1.6.1" // {
7965 dependencies = [
7966 sources."browserslist-1.7.7"
7967 ];
7968 })
7969 sources."caniuse-db-1.0.30000900"
7970 sources."caniuse-lite-1.0.30000900"
2968 7971 sources."caseless-0.12.0"
7972 sources."center-align-0.1.3"
7973 sources."chalk-0.5.1"
7974 (sources."chokidar-2.0.4" // {
7975 dependencies = [
7976 sources."is-glob-4.0.0"
7977 ];
7978 })
7979 sources."chownr-1.1.1"
7980 sources."chrome-trace-event-1.0.0"
7981 sources."cipher-base-1.0.4"
7982 (sources."clap-1.2.3" // {
7983 dependencies = [
7984 sources."ansi-regex-2.1.1"
7985 sources."ansi-styles-2.2.1"
2969 7986 sources."chalk-1.1.3"
7987 sources."has-ansi-2.0.0"
7988 sources."strip-ansi-3.0.1"
7989 sources."supports-color-2.0.0"
7990 ];
7991 })
7992 (sources."class-utils-0.3.6" // {
7993 dependencies = [
7994 sources."define-property-0.2.5"
7995 (sources."is-accessor-descriptor-0.1.6" // {
7996 dependencies = [
7997 sources."kind-of-3.2.2"
7998 ];
7999 })
8000 (sources."is-data-descriptor-0.1.4" // {
8001 dependencies = [
8002 sources."kind-of-3.2.2"
8003 ];
8004 })
8005 sources."is-descriptor-0.1.6"
8006 sources."kind-of-5.1.0"
8007 ];
8008 })
8009 (sources."clean-css-4.2.1" // {
8010 dependencies = [
8011 sources."source-map-0.6.1"
8012 ];
8013 })
2970 8014 (sources."cli-1.0.1" // {
2971 8015 dependencies = [
2972 sources."glob-7.1.2"
8016 sources."glob-7.1.3"
2973 8017 sources."minimatch-3.0.4"
2974 8018 ];
2975 8019 })
2976 8020 sources."clipboard-2.0.1"
8021 (sources."cliui-4.1.0" // {
8022 dependencies = [
8023 sources."ansi-regex-3.0.0"
8024 sources."strip-ansi-4.0.0"
8025 ];
8026 })
2977 8027 sources."clone-1.0.4"
2978 8028 sources."co-4.6.0"
8029 sources."coa-1.0.4"
2979 8030 sources."code-point-at-1.1.0"
2980 8031 sources."coffee-script-1.3.3"
8032 sources."collection-visit-1.0.0"
8033 sources."color-0.11.4"
8034 sources."color-convert-1.9.3"
8035 sources."color-name-1.1.3"
8036 sources."color-string-0.3.0"
8037 sources."colormin-1.1.2"
2981 8038 sources."colors-0.6.2"
2982 sources."combined-stream-1.0.6"
2983 sources."command-line-args-3.0.5"
2984 sources."command-line-usage-3.0.8"
8039 sources."combined-stream-1.0.7"
8040 sources."commander-2.14.1"
8041 sources."commondir-1.0.1"
8042 sources."component-emitter-1.2.1"
2985 8043 sources."concat-map-0.0.1"
2986 sources."concat-stream-1.6.2"
2987 sources."config-chain-1.1.11"
8044 (sources."concat-stream-1.6.2" // {
8045 dependencies = [
8046 sources."readable-stream-2.3.6"
8047 sources."string_decoder-1.1.1"
8048 ];
8049 })
2988 8050 sources."console-browserify-1.1.0"
2989 sources."console-control-strings-1.1.0"
8051 sources."constants-browserify-1.0.0"
8052 sources."convert-source-map-1.6.0"
8053 (sources."copy-concurrently-1.0.5" // {
8054 dependencies = [
8055 sources."glob-7.1.3"
8056 sources."minimatch-3.0.4"
8057 sources."rimraf-2.6.2"
8058 ];
8059 })
8060 sources."copy-descriptor-0.1.1"
8061 (sources."copy-webpack-plugin-4.5.4" // {
8062 dependencies = [
8063 sources."is-glob-4.0.0"
8064 sources."minimatch-3.0.4"
8065 ];
8066 })
2990 8067 sources."core-js-2.5.7"
2991 8068 sources."core-util-is-1.0.2"
2992 sources."crisper-2.1.1"
8069 sources."create-ecdh-4.0.3"
8070 sources."create-hash-1.2.0"
8071 sources."create-hmac-1.1.7"
8072 (sources."cross-spawn-6.0.5" // {
8073 dependencies = [
8074 sources."which-1.3.1"
8075 ];
8076 })
2993 8077 sources."cryptiles-2.0.5"
8078 sources."crypto-browserify-3.12.0"
8079 sources."css-color-names-0.0.4"
8080 sources."css-loader-0.28.11"
8081 sources."css-select-1.2.0"
8082 (sources."css-selector-tokenizer-0.7.0" // {
8083 dependencies = [
8084 sources."regexpu-core-1.0.0"
8085 ];
8086 })
8087 sources."css-what-2.1.2"
8088 sources."cssesc-0.1.0"
8089 (sources."cssnano-3.10.0" // {
8090 dependencies = [
8091 sources."decamelize-1.2.0"
8092 ];
8093 })
8094 sources."csso-2.3.2"
2994 8095 sources."cycle-1.0.3"
8096 sources."cyclist-0.2.2"
2995 8097 (sources."dashdash-1.14.1" // {
2996 8098 dependencies = [
2997 8099 sources."assert-plus-1.0.0"
@@ -2999,62 +8101,120 b' let'
2999 8101 })
3000 8102 sources."date-now-0.1.4"
3001 8103 sources."dateformat-1.0.2-1.2.3"
3002 sources."debug-0.7.4"
3003 sources."deep-extend-0.4.2"
3004 sources."deep-is-0.1.3"
8104 sources."debug-2.6.9"
8105 sources."decamelize-2.0.0"
8106 sources."decode-uri-component-0.2.0"
8107 sources."deep-for-each-2.0.3"
8108 sources."define-properties-1.1.3"
8109 sources."define-property-2.0.2"
8110 sources."defined-1.0.0"
3005 8111 sources."delayed-stream-1.0.0"
3006 8112 sources."delegate-3.2.0"
3007 sources."delegates-1.0.0"
3008 sources."doctrine-0.7.2"
8113 sources."des.js-1.0.0"
8114 sources."detect-file-1.0.0"
8115 sources."detect-indent-4.0.0"
8116 sources."diffie-hellman-5.0.3"
8117 sources."dir-glob-2.0.0"
8118 sources."dom-converter-0.2.0"
3009 8119 (sources."dom-serializer-0.1.0" // {
3010 8120 dependencies = [
3011 8121 sources."domelementtype-1.1.3"
3012 sources."entities-1.1.1"
3013 ];
3014 })
3015 sources."dom5-1.3.6"
8122 sources."entities-1.1.2"
8123 ];
8124 })
8125 (sources."dom5-2.3.0" // {
8126 dependencies = [
8127 sources."clone-2.1.2"
8128 sources."parse5-2.2.3"
8129 ];
8130 })
8131 sources."domain-browser-1.2.0"
3016 8132 sources."domelementtype-1.3.0"
3017 8133 sources."domhandler-2.3.0"
3018 8134 sources."domutils-1.5.1"
8135 (sources."duplexify-3.6.1" // {
8136 dependencies = [
8137 sources."readable-stream-2.3.6"
8138 sources."string_decoder-1.1.1"
8139 ];
8140 })
3019 8141 sources."ecc-jsbn-0.1.2"
8142 sources."electron-to-chromium-1.3.82"
8143 sources."elliptic-6.4.1"
8144 sources."emojis-list-2.1.0"
8145 sources."end-of-stream-1.4.1"
8146 (sources."enhanced-resolve-4.1.0" // {
8147 dependencies = [
8148 sources."graceful-fs-4.1.11"
8149 ];
8150 })
3020 8151 sources."entities-1.0.0"
3021 8152 sources."errno-0.1.7"
3022 sources."es6-promise-2.3.0"
8153 sources."es-abstract-1.12.0"
8154 sources."es-to-primitive-1.2.0"
8155 sources."es6-promise-4.2.5"
8156 sources."es6-templates-0.2.3"
3023 8157 sources."escape-string-regexp-1.0.5"
3024 (sources."escodegen-1.11.0" // {
3025 dependencies = [
3026 sources."esprima-3.1.3"
8158 sources."eslint-scope-4.0.0"
8159 sources."espree-3.5.4"
8160 sources."esprima-1.0.4"
8161 sources."esrecurse-4.2.1"
3027 8162 sources."estraverse-4.2.0"
3028 8163 sources."esutils-2.0.2"
3029 sources."source-map-0.6.1"
3030 ];
3031 })
3032 (sources."espree-3.5.4" // {
3033 dependencies = [
3034 sources."acorn-5.7.1"
3035 ];
3036 })
3037 sources."esprima-1.0.4"
3038 sources."estraverse-3.1.0"
3039 sources."esutils-1.1.6"
3040 8164 sources."eventemitter2-0.4.14"
8165 sources."events-1.1.1"
8166 sources."evp_bytestokey-1.0.3"
8167 sources."execa-0.10.0"
3041 8168 sources."exit-0.1.2"
8169 (sources."expand-brackets-2.1.4" // {
8170 dependencies = [
8171 sources."define-property-0.2.5"
8172 sources."extend-shallow-2.0.1"
8173 (sources."is-accessor-descriptor-0.1.6" // {
8174 dependencies = [
8175 sources."kind-of-3.2.2"
8176 ];
8177 })
8178 (sources."is-data-descriptor-0.1.4" // {
8179 dependencies = [
8180 sources."kind-of-3.2.2"
8181 ];
8182 })
8183 sources."is-descriptor-0.1.6"
8184 sources."kind-of-5.1.0"
8185 ];
8186 })
8187 sources."expand-tilde-2.0.2"
8188 sources."exports-loader-0.6.4"
3042 8189 sources."extend-3.0.2"
3043 (sources."extract-zip-1.6.7" // {
3044 dependencies = [
3045 sources."debug-2.6.9"
3046 ];
3047 })
8190 (sources."extend-shallow-3.0.2" // {
8191 dependencies = [
8192 sources."is-extendable-1.0.1"
8193 ];
8194 })
8195 (sources."extglob-2.0.4" // {
8196 dependencies = [
8197 sources."define-property-1.0.0"
8198 sources."extend-shallow-2.0.1"
8199 ];
8200 })
8201 sources."extract-zip-1.6.7"
3048 8202 sources."extsprintf-1.3.0"
3049 8203 sources."eyes-0.1.8"
3050 sources."fast-levenshtein-2.0.6"
8204 sources."fast-deep-equal-2.0.1"
8205 sources."fast-json-stable-stringify-2.0.0"
8206 sources."fastparse-1.1.1"
3051 8207 sources."favico.js-0.3.10"
3052 8208 sources."faye-websocket-0.4.4"
3053 8209 sources."fd-slicer-1.0.1"
3054 sources."feature-detect-es6-1.5.0"
3055 8210 sources."file-sync-cmp-0.1.1"
3056 sources."find-replace-1.0.3"
3057 sources."findit-2.0.0"
8211 (sources."fill-range-4.0.0" // {
8212 dependencies = [
8213 sources."extend-shallow-2.0.1"
8214 ];
8215 })
8216 sources."find-cache-dir-1.0.0"
8217 sources."find-up-2.1.0"
3058 8218 (sources."findup-sync-0.1.3" // {
3059 8219 dependencies = [
3060 8220 sources."glob-3.2.11"
@@ -3062,22 +8222,43 b' let'
3062 8222 sources."minimatch-0.3.0"
3063 8223 ];
3064 8224 })
3065 sources."foreachasync-3.0.0"
8225 sources."fined-1.1.0"
8226 sources."flagged-respawn-1.0.0"
8227 sources."flatten-1.0.2"
8228 (sources."flush-write-stream-1.0.3" // {
8229 dependencies = [
8230 sources."readable-stream-2.3.6"
8231 sources."string_decoder-1.1.1"
8232 ];
8233 })
8234 sources."for-in-1.0.2"
8235 sources."for-own-1.0.0"
3066 8236 sources."forever-agent-0.6.1"
3067 8237 sources."form-data-2.1.4"
3068 (sources."fs-extra-0.6.4" // {
3069 dependencies = [
3070 sources."mkdirp-0.3.5"
3071 ];
3072 })
3073 (sources."fs.extra-1.3.2" // {
3074 dependencies = [
3075 sources."mkdirp-0.3.5"
8238 sources."fragment-cache-0.2.1"
8239 (sources."from2-2.3.0" // {
8240 dependencies = [
8241 sources."readable-stream-2.3.6"
8242 sources."string_decoder-1.1.1"
8243 ];
8244 })
8245 (sources."fs-extra-1.0.0" // {
8246 dependencies = [
8247 sources."graceful-fs-4.1.11"
8248 ];
8249 })
8250 (sources."fs-write-stream-atomic-1.0.10" // {
8251 dependencies = [
8252 sources."graceful-fs-4.1.11"
3076 8253 ];
3077 8254 })
3078 8255 sources."fs.realpath-1.0.0"
3079 sources."gauge-2.7.4"
8256 sources."fsevents-1.2.4"
8257 sources."function-bind-1.1.1"
3080 8258 sources."gaze-0.5.2"
8259 sources."get-caller-file-1.0.3"
8260 sources."get-stream-3.0.0"
8261 sources."get-value-2.0.6"
3081 8262 sources."getobject-0.1.0"
3082 8263 (sources."getpass-0.1.7" // {
3083 8264 dependencies = [
@@ -3089,6 +8270,21 b' let'
3089 8270 sources."inherits-1.0.2"
3090 8271 ];
3091 8272 })
8273 sources."glob-parent-3.1.0"
8274 sources."global-modules-1.0.0"
8275 sources."global-modules-path-2.3.0"
8276 (sources."global-prefix-1.0.2" // {
8277 dependencies = [
8278 sources."which-1.3.1"
8279 ];
8280 })
8281 sources."globals-9.18.0"
8282 (sources."globby-7.1.1" // {
8283 dependencies = [
8284 sources."glob-7.1.3"
8285 sources."minimatch-3.0.4"
8286 ];
8287 })
3092 8288 (sources."globule-0.1.0" // {
3093 8289 dependencies = [
3094 8290 sources."lodash-1.0.2"
@@ -3097,22 +8293,37 b' let'
3097 8293 sources."good-listener-1.2.2"
3098 8294 sources."graceful-fs-1.2.3"
3099 8295 sources."grunt-0.4.5"
8296 (sources."grunt-cli-1.3.1" // {
8297 dependencies = [
8298 sources."nopt-4.0.1"
8299 ];
8300 })
3100 8301 (sources."grunt-contrib-concat-0.5.1" // {
3101 8302 dependencies = [
3102 sources."ansi-regex-0.2.1"
3103 sources."ansi-styles-1.1.0"
3104 sources."chalk-0.5.1"
3105 sources."has-ansi-0.1.0"
3106 sources."strip-ansi-0.3.0"
3107 sources."supports-color-0.2.0"
3108 ];
3109 })
3110 sources."grunt-contrib-copy-1.0.0"
8303 sources."source-map-0.3.0"
8304 ];
8305 })
8306 (sources."grunt-contrib-copy-1.0.0" // {
8307 dependencies = [
8308 sources."ansi-regex-2.1.1"
8309 sources."ansi-styles-2.2.1"
8310 sources."chalk-1.1.3"
8311 sources."has-ansi-2.0.0"
8312 sources."strip-ansi-3.0.1"
8313 sources."supports-color-2.0.0"
8314 ];
8315 })
3111 8316 sources."grunt-contrib-jshint-0.12.0"
3112 8317 (sources."grunt-contrib-less-1.4.1" // {
3113 8318 dependencies = [
8319 sources."ansi-regex-2.1.1"
8320 sources."ansi-styles-2.2.1"
3114 8321 sources."async-2.6.1"
3115 sources."lodash-4.17.10"
8322 sources."chalk-1.1.3"
8323 sources."has-ansi-2.0.0"
8324 sources."lodash-4.17.11"
8325 sources."strip-ansi-3.0.1"
8326 sources."supports-color-2.0.0"
3116 8327 ];
3117 8328 })
3118 8329 (sources."grunt-contrib-watch-0.6.1" // {
@@ -3121,7 +8332,7 b' let'
3121 8332 sources."lodash-2.4.2"
3122 8333 ];
3123 8334 })
3124 sources."grunt-crisper-1.0.1"
8335 sources."grunt-known-options-1.1.1"
3125 8336 (sources."grunt-legacy-log-0.1.3" // {
3126 8337 dependencies = [
3127 8338 sources."lodash-2.4.2"
@@ -3135,58 +8346,140 b' let'
3135 8346 ];
3136 8347 })
3137 8348 sources."grunt-legacy-util-0.2.0"
3138 (sources."grunt-vulcanize-1.0.0" // {
3139 dependencies = [
3140 sources."crisper-1.2.0"
3141 sources."nopt-3.0.6"
8349 (sources."grunt-webpack-3.1.3" // {
8350 dependencies = [
8351 sources."lodash-4.17.11"
3142 8352 ];
3143 8353 })
3144 8354 sources."har-schema-1.0.5"
3145 8355 sources."har-validator-4.2.1"
3146 sources."has-ansi-2.0.0"
3147 sources."has-unicode-2.0.1"
8356 sources."has-1.0.3"
8357 sources."has-ansi-0.1.0"
8358 sources."has-flag-3.0.0"
8359 sources."has-symbols-1.0.0"
8360 sources."has-value-1.0.0"
8361 (sources."has-values-1.0.0" // {
8362 dependencies = [
8363 sources."kind-of-4.0.0"
8364 ];
8365 })
8366 sources."hash-base-3.0.4"
8367 sources."hash.js-1.1.5"
3148 8368 sources."hasha-2.2.0"
3149 8369 sources."hawk-3.1.3"
8370 sources."he-1.2.0"
8371 sources."hmac-drbg-1.0.1"
3150 8372 sources."hoek-2.16.3"
8373 sources."home-or-tmp-2.0.0"
8374 sources."homedir-polyfill-1.0.1"
3151 8375 sources."hooker-0.2.3"
3152 sources."hosted-git-info-2.7.1"
3153 (sources."htmlparser2-3.8.3" // {
3154 dependencies = [
3155 sources."readable-stream-1.1.14"
3156 sources."string_decoder-0.10.31"
3157 ];
3158 })
8376 sources."html-comment-regex-1.1.2"
8377 sources."html-loader-0.4.5"
8378 (sources."html-minifier-3.5.21" // {
8379 dependencies = [
8380 sources."commander-2.17.1"
8381 ];
8382 })
8383 (sources."html-webpack-plugin-3.2.0" // {
8384 dependencies = [
8385 sources."loader-utils-0.2.17"
8386 sources."lodash-4.17.11"
8387 ];
8388 })
8389 sources."htmlparser2-3.8.3"
3159 8390 sources."http-signature-1.1.1"
3160 (sources."hydrolysis-1.25.0" // {
3161 dependencies = [
3162 sources."dom5-1.1.0"
3163 ];
3164 })
8391 sources."https-browserify-1.0.0"
3165 8392 sources."iconv-lite-0.2.11"
8393 sources."icss-replace-symbols-1.1.0"
8394 (sources."icss-utils-2.1.0" // {
8395 dependencies = [
8396 sources."ansi-styles-3.2.1"
8397 sources."chalk-2.4.1"
8398 sources."postcss-6.0.23"
8399 sources."source-map-0.6.1"
8400 sources."supports-color-5.5.0"
8401 ];
8402 })
8403 sources."ieee754-1.1.12"
8404 sources."iferr-0.1.5"
8405 sources."ignore-3.3.10"
3166 8406 sources."image-size-0.5.5"
8407 (sources."import-local-2.0.0" // {
8408 dependencies = [
8409 sources."find-up-3.0.0"
8410 sources."locate-path-3.0.0"
8411 sources."p-limit-2.0.0"
8412 sources."p-locate-3.0.0"
8413 sources."p-try-2.0.0"
8414 sources."pkg-dir-3.0.0"
8415 ];
8416 })
8417 sources."imports-loader-0.7.1"
8418 sources."imurmurhash-0.1.4"
8419 sources."indexes-of-1.0.1"
8420 sources."indexof-0.0.1"
3167 8421 sources."inflight-1.0.6"
3168 8422 sources."inherits-2.0.3"
3169 8423 sources."ini-1.3.5"
3170 sources."is-builtin-module-1.0.0"
8424 sources."interpret-1.1.0"
8425 sources."invariant-2.2.4"
8426 sources."invert-kv-2.0.0"
8427 sources."is-absolute-1.0.0"
8428 sources."is-absolute-url-2.1.0"
8429 sources."is-accessor-descriptor-1.0.0"
8430 sources."is-binary-path-1.0.1"
8431 sources."is-buffer-1.1.6"
8432 sources."is-callable-1.1.4"
8433 sources."is-data-descriptor-1.0.0"
8434 sources."is-date-object-1.0.1"
8435 sources."is-descriptor-1.0.2"
8436 sources."is-extendable-0.1.1"
8437 sources."is-extglob-2.1.1"
8438 sources."is-finite-1.0.2"
3171 8439 sources."is-fullwidth-code-point-1.0.0"
8440 sources."is-glob-3.1.0"
8441 (sources."is-number-3.0.0" // {
8442 dependencies = [
8443 sources."kind-of-3.2.2"
8444 ];
8445 })
8446 sources."is-plain-obj-1.1.0"
8447 sources."is-plain-object-2.0.4"
8448 sources."is-regex-1.0.4"
8449 sources."is-relative-1.0.0"
3172 8450 sources."is-stream-1.1.0"
8451 sources."is-svg-2.1.0"
8452 sources."is-symbol-1.0.2"
3173 8453 sources."is-typedarray-1.0.0"
3174 sources."isarray-0.0.1"
8454 sources."is-unc-path-1.0.0"
8455 sources."is-windows-1.0.2"
8456 sources."isarray-1.0.0"
3175 8457 sources."isexe-2.0.0"
8458 sources."isobject-3.0.1"
3176 8459 sources."isstream-0.1.2"
3177 8460 sources."jquery-1.11.3"
8461 sources."js-base64-2.4.9"
8462 sources."js-tokens-3.0.2"
3178 8463 sources."js-yaml-2.0.5"
3179 8464 sources."jsbn-0.1.1"
8465 sources."jsesc-1.3.0"
3180 8466 (sources."jshint-2.9.6" // {
3181 8467 dependencies = [
3182 sources."lodash-4.17.10"
8468 sources."lodash-4.17.11"
3183 8469 sources."minimatch-3.0.4"
3184 8470 ];
3185 8471 })
8472 sources."json-parse-better-errors-1.0.2"
3186 8473 sources."json-schema-0.2.3"
8474 sources."json-schema-traverse-0.4.1"
3187 8475 sources."json-stable-stringify-1.0.1"
3188 8476 sources."json-stringify-safe-5.0.1"
3189 sources."jsonfile-1.0.1"
8477 sources."json5-0.5.1"
8478 (sources."jsonfile-2.4.0" // {
8479 dependencies = [
8480 sources."graceful-fs-4.1.11"
8481 ];
8482 })
3190 8483 sources."jsonify-0.0.0"
3191 8484 (sources."jsprim-1.4.1" // {
3192 8485 dependencies = [
@@ -3194,180 +8487,680 b' let'
3194 8487 ];
3195 8488 })
3196 8489 sources."kew-0.7.0"
8490 sources."kind-of-6.0.2"
3197 8491 (sources."klaw-1.3.1" // {
3198 8492 dependencies = [
3199 8493 sources."graceful-fs-4.1.11"
3200 8494 ];
3201 8495 })
8496 sources."lazy-cache-1.0.4"
8497 sources."lcid-2.0.0"
3202 8498 (sources."less-2.7.3" // {
3203 8499 dependencies = [
3204 8500 sources."graceful-fs-4.1.11"
3205 sources."source-map-0.5.7"
3206 ];
3207 })
3208 sources."levn-0.3.0"
8501 ];
8502 })
8503 (sources."liftoff-2.5.0" // {
8504 dependencies = [
8505 sources."findup-sync-2.0.0"
8506 ];
8507 })
8508 sources."loader-runner-2.3.1"
8509 sources."loader-utils-1.1.0"
8510 sources."locate-path-2.0.0"
3209 8511 sources."lodash-0.9.2"
8512 sources."lodash.camelcase-4.3.0"
8513 sources."lodash.debounce-4.0.8"
8514 sources."lodash.isplainobject-4.0.6"
8515 sources."lodash.memoize-4.1.2"
8516 sources."lodash.uniq-4.5.0"
8517 sources."longest-1.0.1"
8518 sources."loose-envify-1.4.0"
8519 sources."lower-case-1.1.4"
3210 8520 sources."lru-cache-2.7.3"
8521 sources."make-dir-1.3.0"
8522 sources."make-iterator-1.0.1"
8523 sources."map-age-cleaner-0.1.2"
8524 sources."map-cache-0.2.2"
8525 sources."map-visit-1.0.0"
8526 sources."math-expression-evaluator-1.2.17"
8527 sources."md5.js-1.3.5"
8528 sources."mem-4.0.0"
8529 (sources."memory-fs-0.4.1" // {
8530 dependencies = [
8531 sources."readable-stream-2.3.6"
8532 sources."string_decoder-1.1.1"
8533 ];
8534 })
8535 sources."micromatch-3.1.10"
8536 sources."miller-rabin-4.0.1"
3211 8537 sources."mime-1.6.0"
3212 sources."mime-db-1.35.0"
3213 sources."mime-types-2.1.19"
8538 sources."mime-db-1.37.0"
8539 sources."mime-types-2.1.21"
8540 sources."mimic-fn-1.2.0"
8541 sources."minimalistic-assert-1.0.1"
8542 sources."minimalistic-crypto-utils-1.0.1"
3214 8543 sources."minimatch-0.2.14"
3215 8544 sources."minimist-0.0.8"
3216 sources."minipass-2.3.3"
3217 sources."minizlib-1.1.0"
8545 sources."mississippi-2.0.0"
8546 (sources."mixin-deep-1.3.1" // {
8547 dependencies = [
8548 sources."is-extendable-1.0.1"
8549 ];
8550 })
3218 8551 sources."mkdirp-0.5.1"
3219 8552 sources."moment-2.22.2"
3220 8553 sources."mousetrap-1.6.2"
8554 (sources."move-concurrently-1.0.1" // {
8555 dependencies = [
8556 sources."glob-7.1.3"
8557 sources."minimatch-3.0.4"
8558 sources."rimraf-2.6.2"
8559 ];
8560 })
3221 8561 sources."ms-2.0.0"
3222 sources."ncp-0.4.2"
3223 sources."nijs-0.0.25"
3224 sources."node2nix-1.6.0"
8562 sources."nan-2.11.1"
8563 sources."nanomatch-1.2.13"
8564 sources."neo-async-2.6.0"
8565 sources."nice-try-1.0.5"
8566 sources."no-case-2.3.2"
8567 (sources."node-libs-browser-2.1.0" // {
8568 dependencies = [
8569 sources."readable-stream-2.3.6"
8570 sources."string_decoder-1.1.1"
8571 ];
8572 })
3225 8573 sources."nopt-1.0.10"
3226 8574 (sources."noptify-0.0.3" // {
3227 8575 dependencies = [
3228 8576 sources."nopt-2.0.0"
3229 8577 ];
3230 8578 })
3231 sources."normalize-package-data-2.4.0"
3232 sources."npm-package-arg-6.1.0"
3233 (sources."npm-registry-client-8.5.1" // {
3234 dependencies = [
3235 sources."graceful-fs-4.1.11"
3236 ];
3237 })
3238 (sources."npmconf-2.1.3" // {
3239 dependencies = [
3240 sources."nopt-3.0.6"
3241 sources."once-1.3.3"
3242 sources."semver-4.3.6"
3243 ];
3244 })
3245 sources."npmlog-4.1.2"
8579 sources."normalize-path-2.1.1"
8580 sources."normalize-range-0.1.2"
8581 sources."normalize-url-1.9.1"
8582 sources."npm-run-path-2.0.2"
8583 sources."nth-check-1.0.2"
8584 sources."num2fraction-1.2.2"
3246 8585 sources."number-is-nan-1.0.1"
3247 8586 sources."oauth-sign-0.8.2"
3248 8587 sources."object-assign-4.1.1"
8588 (sources."object-copy-0.1.0" // {
8589 dependencies = [
8590 sources."define-property-0.2.5"
8591 sources."is-accessor-descriptor-0.1.6"
8592 sources."is-data-descriptor-0.1.4"
8593 (sources."is-descriptor-0.1.6" // {
8594 dependencies = [
8595 sources."kind-of-5.1.0"
8596 ];
8597 })
8598 sources."kind-of-3.2.2"
8599 ];
8600 })
8601 sources."object-keys-1.0.12"
8602 sources."object-visit-1.0.1"
8603 sources."object.defaults-1.1.0"
8604 sources."object.getownpropertydescriptors-2.0.3"
8605 sources."object.map-1.0.1"
8606 sources."object.pick-1.3.0"
3249 8607 sources."once-1.4.0"
3250 sources."optionator-0.8.2"
3251 sources."optparse-1.0.5"
8608 sources."os-browserify-0.3.0"
3252 8609 sources."os-homedir-1.0.2"
8610 sources."os-locale-3.0.1"
3253 8611 sources."os-tmpdir-1.0.2"
3254 8612 sources."osenv-0.1.5"
3255 sources."parse5-1.5.1"
8613 sources."p-defer-1.0.0"
8614 sources."p-finally-1.0.0"
8615 sources."p-is-promise-1.1.0"
8616 sources."p-limit-1.3.0"
8617 sources."p-locate-2.0.0"
8618 sources."p-try-1.0.0"
8619 sources."pako-1.0.6"
8620 (sources."parallel-transform-1.1.0" // {
8621 dependencies = [
8622 sources."readable-stream-2.3.6"
8623 sources."string_decoder-1.1.1"
8624 ];
8625 })
8626 sources."param-case-2.1.1"
8627 sources."parse-asn1-5.1.1"
8628 sources."parse-filepath-1.0.2"
8629 sources."parse-passwd-1.0.0"
8630 sources."parse5-3.0.3"
8631 (sources."parse5-utils-2.0.0" // {
8632 dependencies = [
8633 sources."parse5-2.2.3"
8634 ];
8635 })
8636 sources."pascalcase-0.1.1"
8637 sources."path-browserify-0.0.0"
8638 sources."path-dirname-1.0.2"
8639 sources."path-exists-3.0.0"
3256 8640 sources."path-is-absolute-1.0.1"
3257 sources."path-posix-1.0.0"
8641 sources."path-key-2.0.1"
8642 sources."path-parse-1.0.6"
8643 sources."path-root-0.1.1"
8644 sources."path-root-regex-0.1.2"
8645 sources."path-type-3.0.0"
8646 sources."pbkdf2-3.0.17"
3258 8647 sources."pend-1.2.0"
3259 8648 sources."performance-now-0.2.0"
3260 8649 sources."phantom-4.0.12"
3261 8650 (sources."phantomjs-prebuilt-2.1.16" // {
3262 8651 dependencies = [
3263 sources."es6-promise-4.2.4"
3264 sources."fs-extra-1.0.0"
3265 sources."graceful-fs-4.1.11"
3266 sources."jsonfile-2.4.0"
3267 8652 sources."which-1.3.1"
3268 8653 ];
3269 8654 })
8655 sources."pify-3.0.0"
3270 8656 sources."pinkie-2.0.4"
3271 8657 sources."pinkie-promise-2.0.1"
3272 sources."prelude-ls-1.1.2"
8658 sources."pkg-dir-2.0.0"
8659 (sources."polymer-webpack-loader-2.0.3" // {
8660 dependencies = [
8661 sources."ansi-styles-3.2.1"
8662 sources."chalk-2.4.1"
8663 sources."html-loader-0.5.5"
8664 (sources."postcss-6.0.23" // {
8665 dependencies = [
8666 sources."source-map-0.6.1"
8667 ];
8668 })
8669 sources."supports-color-5.5.0"
8670 ];
8671 })
8672 sources."posix-character-classes-0.1.1"
8673 (sources."postcss-5.2.18" // {
8674 dependencies = [
8675 sources."ansi-regex-2.1.1"
8676 sources."ansi-styles-2.2.1"
8677 (sources."chalk-1.1.3" // {
8678 dependencies = [
8679 sources."supports-color-2.0.0"
8680 ];
8681 })
8682 sources."has-ansi-2.0.0"
8683 sources."has-flag-1.0.0"
8684 sources."strip-ansi-3.0.1"
8685 sources."supports-color-3.2.3"
8686 ];
8687 })
8688 sources."postcss-calc-5.3.1"
8689 sources."postcss-colormin-2.2.2"
8690 sources."postcss-convert-values-2.6.1"
8691 sources."postcss-discard-comments-2.0.4"
8692 sources."postcss-discard-duplicates-2.1.0"
8693 sources."postcss-discard-empty-2.1.0"
8694 sources."postcss-discard-overridden-0.1.1"
8695 sources."postcss-discard-unused-2.2.3"
8696 sources."postcss-filter-plugins-2.0.3"
8697 sources."postcss-merge-idents-2.1.7"
8698 sources."postcss-merge-longhand-2.0.2"
8699 (sources."postcss-merge-rules-2.1.2" // {
8700 dependencies = [
8701 sources."browserslist-1.7.7"
8702 ];
8703 })
8704 sources."postcss-message-helpers-2.0.0"
8705 sources."postcss-minify-font-values-1.0.5"
8706 sources."postcss-minify-gradients-1.0.5"
8707 sources."postcss-minify-params-1.2.2"
8708 sources."postcss-minify-selectors-2.1.1"
8709 (sources."postcss-modules-extract-imports-1.2.0" // {
8710 dependencies = [
8711 sources."ansi-styles-3.2.1"
8712 sources."chalk-2.4.1"
8713 sources."postcss-6.0.23"
8714 sources."source-map-0.6.1"
8715 sources."supports-color-5.5.0"
8716 ];
8717 })
8718 (sources."postcss-modules-local-by-default-1.2.0" // {
8719 dependencies = [
8720 sources."ansi-styles-3.2.1"
8721 sources."chalk-2.4.1"
8722 sources."postcss-6.0.23"
8723 sources."source-map-0.6.1"
8724 sources."supports-color-5.5.0"
8725 ];
8726 })
8727 (sources."postcss-modules-scope-1.1.0" // {
8728 dependencies = [
8729 sources."ansi-styles-3.2.1"
8730 sources."chalk-2.4.1"
8731 sources."postcss-6.0.23"
8732 sources."source-map-0.6.1"
8733 sources."supports-color-5.5.0"
8734 ];
8735 })
8736 (sources."postcss-modules-values-1.3.0" // {
8737 dependencies = [
8738 sources."ansi-styles-3.2.1"
8739 sources."chalk-2.4.1"
8740 sources."postcss-6.0.23"
8741 sources."source-map-0.6.1"
8742 sources."supports-color-5.5.0"
8743 ];
8744 })
8745 sources."postcss-normalize-charset-1.1.1"
8746 sources."postcss-normalize-url-3.0.8"
8747 sources."postcss-ordered-values-2.2.3"
8748 sources."postcss-reduce-idents-2.4.0"
8749 sources."postcss-reduce-initial-1.0.1"
8750 sources."postcss-reduce-transforms-1.0.4"
8751 sources."postcss-selector-parser-2.2.3"
8752 sources."postcss-svgo-2.1.6"
8753 sources."postcss-unique-selectors-2.0.2"
8754 sources."postcss-value-parser-3.3.1"
8755 sources."postcss-zindex-2.2.0"
8756 sources."prepend-http-1.0.4"
8757 sources."pretty-error-2.1.1"
8758 sources."private-0.1.8"
8759 sources."process-0.11.10"
3273 8760 sources."process-nextick-args-2.0.0"
3274 8761 sources."progress-1.1.8"
3275 8762 sources."promise-7.3.1"
3276 sources."proto-list-1.2.4"
8763 sources."promise-inflight-1.0.1"
3277 8764 sources."prr-1.0.1"
8765 sources."pseudomap-1.0.2"
8766 sources."public-encrypt-4.0.3"
8767 sources."pump-2.0.1"
8768 sources."pumpify-1.5.1"
3278 8769 sources."punycode-1.4.1"
8770 sources."q-1.5.1"
3279 8771 sources."qrious-4.0.2"
3280 8772 sources."qs-6.4.0"
3281 (sources."readable-stream-2.3.6" // {
3282 dependencies = [
3283 sources."isarray-1.0.0"
3284 ];
3285 })
3286 sources."reduce-flatten-1.0.1"
3287 sources."regenerator-runtime-0.10.5"
8773 sources."query-string-4.3.4"
8774 sources."querystring-0.2.0"
8775 sources."querystring-es3-0.2.1"
8776 sources."randombytes-2.0.6"
8777 sources."randomfill-1.0.4"
8778 sources."raw-loader-1.0.0-beta.0"
8779 (sources."readable-stream-1.1.14" // {
8780 dependencies = [
8781 sources."isarray-0.0.1"
8782 ];
8783 })
8784 (sources."readdirp-2.2.1" // {
8785 dependencies = [
8786 sources."graceful-fs-4.1.11"
8787 sources."readable-stream-2.3.6"
8788 sources."string_decoder-1.1.1"
8789 ];
8790 })
8791 (sources."recast-0.11.23" // {
8792 dependencies = [
8793 sources."esprima-3.1.3"
8794 ];
8795 })
8796 sources."rechoir-0.6.2"
8797 (sources."reduce-css-calc-1.3.0" // {
8798 dependencies = [
8799 sources."balanced-match-0.4.2"
8800 ];
8801 })
8802 (sources."reduce-function-call-1.0.2" // {
8803 dependencies = [
8804 sources."balanced-match-0.4.2"
8805 ];
8806 })
8807 sources."regenerate-1.4.0"
8808 sources."regenerator-runtime-0.11.1"
8809 sources."regenerator-transform-0.10.1"
8810 sources."regex-not-1.0.2"
8811 sources."regexpu-core-2.0.0"
8812 sources."regjsgen-0.2.0"
8813 (sources."regjsparser-0.1.5" // {
8814 dependencies = [
8815 sources."jsesc-0.5.0"
8816 ];
8817 })
8818 sources."relateurl-0.2.7"
8819 sources."remove-trailing-separator-1.1.0"
8820 (sources."renderkid-2.0.2" // {
8821 dependencies = [
8822 sources."ansi-regex-2.1.1"
8823 sources."domhandler-2.1.0"
8824 sources."domutils-1.1.6"
8825 sources."htmlparser2-3.3.0"
8826 sources."isarray-0.0.1"
8827 sources."readable-stream-1.0.34"
8828 sources."strip-ansi-3.0.1"
8829 ];
8830 })
8831 sources."repeat-element-1.1.3"
8832 sources."repeat-string-1.6.1"
8833 sources."repeating-2.0.1"
3288 8834 sources."request-2.81.0"
3289 8835 sources."request-progress-2.0.1"
3290 sources."retry-0.10.1"
8836 sources."require-directory-2.1.1"
8837 sources."require-main-filename-1.0.1"
8838 sources."resolve-1.8.1"
8839 sources."resolve-cwd-2.0.0"
8840 sources."resolve-dir-1.0.1"
8841 sources."resolve-from-3.0.0"
8842 sources."resolve-url-0.2.1"
8843 sources."ret-0.1.15"
8844 sources."right-align-0.1.3"
3291 8845 sources."rimraf-2.2.8"
8846 sources."ripemd160-2.0.2"
8847 sources."run-queue-1.0.3"
3292 8848 sources."safe-buffer-5.1.2"
8849 sources."safe-regex-1.1.0"
3293 8850 sources."safer-buffer-2.1.2"
8851 sources."sax-1.2.4"
8852 (sources."schema-utils-0.4.7" // {
8853 dependencies = [
8854 sources."ajv-6.5.4"
8855 ];
8856 })
3294 8857 sources."select-1.1.2"
3295 sources."semver-5.5.0"
8858 sources."semver-5.6.0"
8859 sources."serialize-javascript-1.5.0"
3296 8860 sources."set-blocking-2.0.0"
8861 (sources."set-value-2.0.0" // {
8862 dependencies = [
8863 sources."extend-shallow-2.0.1"
8864 ];
8865 })
8866 sources."setimmediate-1.0.5"
8867 sources."sha.js-2.4.11"
8868 sources."shebang-command-1.2.0"
8869 sources."shebang-regex-1.0.0"
3297 8870 sources."shelljs-0.3.0"
3298 8871 sources."sigmund-1.0.1"
3299 8872 sources."signal-exit-3.0.2"
3300 sources."slasp-0.0.4"
3301 sources."slide-1.1.6"
8873 sources."slash-1.0.0"
8874 (sources."snapdragon-0.8.2" // {
8875 dependencies = [
8876 sources."define-property-0.2.5"
8877 sources."extend-shallow-2.0.1"
8878 (sources."is-accessor-descriptor-0.1.6" // {
8879 dependencies = [
8880 sources."kind-of-3.2.2"
8881 ];
8882 })
8883 (sources."is-data-descriptor-0.1.4" // {
8884 dependencies = [
8885 sources."kind-of-3.2.2"
8886 ];
8887 })
8888 sources."is-descriptor-0.1.6"
8889 sources."kind-of-5.1.0"
8890 ];
8891 })
8892 (sources."snapdragon-node-2.1.1" // {
8893 dependencies = [
8894 sources."define-property-1.0.0"
8895 ];
8896 })
8897 (sources."snapdragon-util-3.0.1" // {
8898 dependencies = [
8899 sources."kind-of-3.2.2"
8900 ];
8901 })
3302 8902 sources."sntp-1.0.9"
3303 sources."source-map-0.3.0"
3304 sources."spdx-correct-3.0.0"
3305 sources."spdx-exceptions-2.1.0"
3306 sources."spdx-expression-parse-3.0.0"
3307 sources."spdx-license-ids-3.0.0"
8903 sources."sort-keys-1.1.2"
8904 sources."source-list-map-2.0.1"
8905 sources."source-map-0.5.7"
8906 sources."source-map-resolve-0.5.2"
8907 sources."source-map-support-0.4.18"
8908 sources."source-map-url-0.4.0"
3308 8909 sources."split-1.0.1"
3309 (sources."sshpk-1.14.2" // {
8910 sources."split-string-3.1.0"
8911 sources."sprintf-js-1.0.3"
8912 (sources."sshpk-1.15.1" // {
3310 8913 dependencies = [
3311 8914 sources."assert-plus-1.0.0"
3312 8915 ];
3313 8916 })
3314 8917 sources."ssri-5.3.0"
3315 8918 sources."stack-trace-0.0.10"
3316 sources."string-width-1.0.2"
8919 (sources."static-extend-0.1.2" // {
8920 dependencies = [
8921 sources."define-property-0.2.5"
8922 (sources."is-accessor-descriptor-0.1.6" // {
8923 dependencies = [
8924 sources."kind-of-3.2.2"
8925 ];
8926 })
8927 (sources."is-data-descriptor-0.1.4" // {
8928 dependencies = [
8929 sources."kind-of-3.2.2"
8930 ];
8931 })
8932 sources."is-descriptor-0.1.6"
8933 sources."kind-of-5.1.0"
8934 ];
8935 })
8936 sources."sticky-sidebar-3.3.1"
8937 (sources."stream-browserify-2.0.1" // {
8938 dependencies = [
8939 sources."readable-stream-2.3.6"
3317 8940 sources."string_decoder-1.1.1"
8941 ];
8942 })
8943 sources."stream-each-1.2.3"
8944 (sources."stream-http-2.8.3" // {
8945 dependencies = [
8946 sources."readable-stream-2.3.6"
8947 sources."string_decoder-1.1.1"
8948 ];
8949 })
8950 sources."stream-shift-1.0.0"
8951 sources."strict-uri-encode-1.1.0"
8952 (sources."string-width-2.1.1" // {
8953 dependencies = [
8954 sources."ansi-regex-3.0.0"
8955 sources."is-fullwidth-code-point-2.0.0"
8956 sources."strip-ansi-4.0.0"
8957 ];
8958 })
8959 sources."string_decoder-0.10.31"
3318 8960 sources."stringstream-0.0.6"
3319 sources."strip-ansi-3.0.1"
8961 sources."strip-ansi-0.3.0"
8962 sources."strip-eof-1.0.0"
3320 8963 sources."strip-json-comments-1.0.4"
3321 sources."supports-color-2.0.0"
3322 sources."table-layout-0.3.0"
3323 sources."tar-3.1.15"
3324 sources."temp-0.8.3"
3325 sources."test-value-2.1.0"
8964 sources."style-loader-0.21.0"
8965 sources."supports-color-0.2.0"
8966 (sources."svgo-0.7.2" // {
8967 dependencies = [
8968 sources."argparse-1.0.10"
8969 sources."colors-1.1.2"
8970 sources."esprima-2.7.3"
8971 sources."js-yaml-3.7.0"
8972 ];
8973 })
8974 sources."tapable-1.1.0"
3326 8975 sources."throttleit-1.0.0"
3327 8976 sources."through-2.3.8"
8977 (sources."through2-2.0.3" // {
8978 dependencies = [
8979 sources."readable-stream-2.3.6"
8980 sources."string_decoder-1.1.1"
8981 ];
8982 })
8983 sources."timers-browserify-2.0.10"
3328 8984 sources."tiny-emitter-2.0.2"
3329 8985 (sources."tiny-lr-fork-0.0.5" // {
3330 8986 dependencies = [
8987 sources."debug-0.7.4"
3331 8988 sources."qs-0.5.6"
3332 8989 ];
3333 8990 })
8991 sources."to-arraybuffer-1.0.1"
8992 sources."to-fast-properties-1.0.3"
8993 (sources."to-object-path-0.3.0" // {
8994 dependencies = [
8995 sources."kind-of-3.2.2"
8996 ];
8997 })
8998 sources."to-regex-3.0.2"
8999 sources."to-regex-range-2.1.1"
9000 sources."toposort-1.0.7"
3334 9001 sources."tough-cookie-2.3.4"
9002 sources."trim-right-1.0.1"
9003 (sources."ts-loader-1.3.3" // {
9004 dependencies = [
9005 sources."colors-1.3.2"
9006 sources."enhanced-resolve-3.4.1"
9007 sources."graceful-fs-4.1.11"
9008 sources."loader-utils-0.2.17"
9009 sources."tapable-0.2.8"
9010 ];
9011 })
9012 sources."tslib-1.9.3"
9013 sources."tty-browserify-0.0.0"
3335 9014 sources."tunnel-agent-0.6.0"
3336 9015 sources."tweetnacl-0.14.5"
3337 sources."type-check-0.3.2"
3338 9016 sources."typedarray-0.0.6"
3339 sources."typical-2.6.1"
3340 sources."uid-number-0.0.5"
9017 (sources."uglify-es-3.3.10" // {
9018 dependencies = [
9019 sources."source-map-0.6.1"
9020 ];
9021 })
9022 (sources."uglify-js-3.4.9" // {
9023 dependencies = [
9024 sources."commander-2.17.1"
9025 sources."source-map-0.6.1"
9026 ];
9027 })
9028 sources."uglify-to-browserify-1.0.2"
9029 (sources."uglifyjs-webpack-plugin-1.3.0" // {
9030 dependencies = [
9031 sources."source-map-0.6.1"
9032 ];
9033 })
9034 sources."unc-path-regex-0.1.2"
3341 9035 sources."underscore-1.7.0"
3342 9036 sources."underscore.string-2.2.1"
3343 9037 sources."unicode-5.2.0-0.7.5"
9038 (sources."union-value-1.0.0" // {
9039 dependencies = [
9040 sources."extend-shallow-2.0.1"
9041 sources."set-value-0.4.3"
9042 ];
9043 })
9044 sources."uniq-1.0.1"
9045 sources."uniqs-2.0.0"
9046 sources."unique-filename-1.1.1"
9047 sources."unique-slug-2.0.1"
9048 (sources."unset-value-1.0.0" // {
9049 dependencies = [
9050 (sources."has-value-0.3.1" // {
9051 dependencies = [
9052 sources."isobject-2.1.0"
9053 ];
9054 })
9055 sources."has-values-0.1.4"
9056 ];
9057 })
9058 sources."upath-1.1.0"
9059 sources."upper-case-1.1.3"
9060 (sources."uri-js-4.2.2" // {
9061 dependencies = [
9062 sources."punycode-2.1.1"
9063 ];
9064 })
9065 sources."urix-0.1.0"
9066 (sources."url-0.11.0" // {
9067 dependencies = [
9068 sources."punycode-1.3.2"
9069 ];
9070 })
9071 sources."use-3.1.1"
9072 sources."util-0.10.4"
3344 9073 sources."util-deprecate-1.0.2"
9074 sources."util.promisify-1.0.0"
9075 sources."utila-0.4.0"
3345 9076 sources."uuid-3.3.2"
3346 sources."validate-npm-package-license-3.0.3"
3347 sources."validate-npm-package-name-3.0.0"
9077 sources."v8-compile-cache-2.0.2"
9078 sources."v8flags-3.0.2"
9079 sources."vendors-1.0.2"
3348 9080 (sources."verror-1.10.0" // {
3349 9081 dependencies = [
3350 9082 sources."assert-plus-1.0.0"
3351 9083 ];
3352 9084 })
3353 (sources."vulcanize-1.16.0" // {
3354 dependencies = [
3355 sources."nopt-3.0.6"
3356 ];
3357 })
3358 sources."walk-2.3.14"
9085 sources."vm-browserify-0.0.4"
9086 (sources."watchpack-1.6.0" // {
9087 dependencies = [
9088 sources."graceful-fs-4.1.11"
9089 ];
9090 })
9091 sources."waypoints-4.0.1"
9092 (sources."webpack-4.23.1" // {
9093 dependencies = [
9094 sources."ajv-6.5.4"
9095 ];
9096 })
9097 (sources."webpack-cli-3.1.2" // {
9098 dependencies = [
9099 sources."ansi-styles-3.2.1"
9100 sources."chalk-2.4.1"
9101 sources."supports-color-5.5.0"
9102 ];
9103 })
9104 (sources."webpack-core-0.6.9" // {
9105 dependencies = [
9106 sources."source-list-map-0.1.8"
9107 sources."source-map-0.4.4"
9108 ];
9109 })
9110 (sources."webpack-sources-1.3.0" // {
9111 dependencies = [
9112 sources."source-map-0.6.1"
9113 ];
9114 })
9115 (sources."webpack-uglify-js-plugin-1.1.9" // {
9116 dependencies = [
9117 sources."ansi-regex-2.1.1"
9118 sources."ansi-styles-2.2.1"
9119 sources."camelcase-1.2.1"
9120 sources."chalk-1.1.3"
9121 sources."cliui-2.1.0"
9122 sources."decamelize-1.2.0"
9123 sources."has-ansi-2.0.0"
9124 sources."strip-ansi-3.0.1"
9125 sources."supports-color-2.0.0"
9126 sources."uglify-js-2.8.29"
9127 sources."yargs-3.10.0"
9128 ];
9129 })
9130 sources."whet.extend-0.9.9"
3359 9131 sources."which-1.0.9"
3360 sources."wide-align-1.1.3"
3361 (sources."winston-2.4.3" // {
9132 sources."which-module-2.0.0"
9133 sources."window-size-0.1.0"
9134 (sources."winston-2.4.4" // {
3362 9135 dependencies = [
3363 9136 sources."async-1.0.0"
3364 9137 sources."colors-1.0.3"
3365 9138 ];
3366 9139 })
3367 sources."wordwrap-1.0.0"
3368 sources."wordwrapjs-2.0.0"
9140 sources."wordwrap-0.0.2"
9141 sources."worker-farm-1.6.0"
9142 (sources."wrap-ansi-2.1.0" // {
9143 dependencies = [
9144 sources."ansi-regex-2.1.1"
9145 sources."string-width-1.0.2"
9146 sources."strip-ansi-3.0.1"
9147 ];
9148 })
3369 9149 sources."wrappy-1.0.2"
3370 sources."yallist-3.0.2"
9150 sources."xregexp-4.0.0"
9151 sources."xtend-4.0.1"
9152 sources."y18n-4.0.0"
9153 sources."yallist-2.1.2"
9154 (sources."yargs-12.0.2" // {
9155 dependencies = [
9156 sources."find-up-3.0.0"
9157 sources."locate-path-3.0.0"
9158 sources."p-limit-2.0.0"
9159 sources."p-locate-3.0.0"
9160 sources."p-try-2.0.0"
9161 ];
9162 })
9163 sources."yargs-parser-10.1.0"
3371 9164 sources."yauzl-2.4.1"
3372 9165 ];
3373 9166 buildInputs = globalBuildInputs;
@@ -3376,7 +9169,7 b' let'
3376 9169 license = "SEE LICENSE IN LICENSE.txt";
3377 9170 };
3378 9171 production = false;
3379 bypassCache = false;
9172 bypassCache = true;
3380 9173 };
3381 9174 in
3382 9175 {
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-lock-func-debug.diff to pkgs/patches/beaker/patch-beaker-lock-func-debug.diff
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-metadata-reuse.diff to pkgs/patches/beaker/patch-beaker-metadata-reuse.diff
@@ -30,8 +30,8 b' self: super: {'
30 30
31 31 "beaker" = super."beaker".override (attrs: {
32 32 patches = [
33 ./patch_beaker/patch-beaker-lock-func-debug.diff
34 ./patch_beaker/patch-beaker-metadata-reuse.diff
33 ./patches/beaker/patch-beaker-lock-func-debug.diff
34 ./patches/beaker/patch-beaker-metadata-reuse.diff
35 35 ];
36 36 });
37 37
@@ -240,6 +240,12 b' self: super: {'
240 240 };
241 241 });
242 242
243 "supervisor" = super."supervisor".override (attrs: {
244 patches = [
245 ./patches/supervisor/patch-rlimits-old-kernel.diff
246 ];
247 });
248
243 249 # Avoid that base packages screw up the build process
244 250 inherit (basePythonPackages)
245 251 setuptools;
@@ -52,22 +52,22 b' self: super: {'
52 52 };
53 53 };
54 54 "atomicwrites" = super.buildPythonPackage {
55 name = "atomicwrites-1.1.5";
55 name = "atomicwrites-1.2.1";
56 56 doCheck = false;
57 57 src = fetchurl {
58 url = "https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz";
59 sha256 = "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214";
58 url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz";
59 sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc";
60 60 };
61 61 meta = {
62 62 license = [ pkgs.lib.licenses.mit ];
63 63 };
64 64 };
65 65 "attrs" = super.buildPythonPackage {
66 name = "attrs-18.1.0";
66 name = "attrs-18.2.0";
67 67 doCheck = false;
68 68 src = fetchurl {
69 url = "https://files.pythonhosted.org/packages/e4/ac/a04671e118b57bee87dabca1e0f2d3bda816b7a551036012d0ca24190e71/attrs-18.1.0.tar.gz";
70 sha256 = "0yzqz8wv3w1srav5683a55v49i0szkm47dyrnkd56fqs8j8ypl70";
69 url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz";
70 sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh";
71 71 };
72 72 meta = {
73 73 license = [ pkgs.lib.licenses.mit ];
@@ -160,17 +160,6 b' self: super: {'
160 160 license = [ pkgs.lib.licenses.asl20 ];
161 161 };
162 162 };
163 "bottle" = super.buildPythonPackage {
164 name = "bottle-0.12.13";
165 doCheck = false;
166 src = fetchurl {
167 url = "https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz";
168 sha256 = "0m9k2a7yxvggc4kw8fsvj381vgsvfcdshg5nzy6vwrxiw2p53drr";
169 };
170 meta = {
171 license = [ pkgs.lib.licenses.mit ];
172 };
173 };
174 163 "bumpversion" = super.buildPythonPackage {
175 164 name = "bumpversion-0.5.3";
176 165 doCheck = false;
@@ -295,28 +284,14 b' self: super: {'
295 284 };
296 285 };
297 286 "coverage" = super.buildPythonPackage {
298 name = "coverage-3.7.1";
287 name = "coverage-4.5.1";
299 288 doCheck = false;
300 289 src = fetchurl {
301 url = "https://files.pythonhosted.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
302 sha256 = "0knlbq79g2ww6xzsyknj9rirrgrgc983dpa2d9nkdf31mb2a3bni";
290 url = "https://files.pythonhosted.org/packages/35/fe/e7df7289d717426093c68d156e0fd9117c8f4872b6588e8a8928a0f68424/coverage-4.5.1.tar.gz";
291 sha256 = "1wbrzpxka3xd4nmmkc6q0ir343d91kymwsm8pbmwa0d2a7q4ir2n";
303 292 };
304 293 meta = {
305 license = [ pkgs.lib.licenses.bsdOriginal ];
306 };
307 };
308 "cprofilev" = super.buildPythonPackage {
309 name = "cprofilev-1.0.7";
310 doCheck = false;
311 propagatedBuildInputs = [
312 self."bottle"
313 ];
314 src = fetchurl {
315 url = "https://files.pythonhosted.org/packages/df/50/d8c1ada7d537c64b0f76453fa31dedb6af6e27b82fcf0331e5f71a4cf98b/CProfileV-1.0.7.tar.gz";
316 sha256 = "0xwszfhxgndpcjkpq89dix6vi02hj1gzvhr7r716hd1x3y5p94c7";
317 };
318 meta = {
319 license = [ pkgs.lib.licenses.mit ];
294 license = [ pkgs.lib.licenses.asl20 ];
320 295 };
321 296 };
322 297 "cssselect" = super.buildPythonPackage {
@@ -372,11 +347,11 b' self: super: {'
372 347 };
373 348 };
374 349 "dogpile.cache" = super.buildPythonPackage {
375 name = "dogpile.cache-0.6.6";
350 name = "dogpile.cache-0.6.7";
376 351 doCheck = false;
377 352 src = fetchurl {
378 url = "https://files.pythonhosted.org/packages/48/ca/604154d835c3668efb8a31bd979b0ea4bf39c2934a40ffecc0662296cb51/dogpile.cache-0.6.6.tar.gz";
379 sha256 = "1h8n1lxd4l2qvahfkiinljkqz7pww7w3sgag0j8j9ixbl2h4wk84";
353 url = "https://files.pythonhosted.org/packages/ee/bd/440da735a11c6087eed7cc8747fc4b995cbac2464168682f8ee1c8e43844/dogpile.cache-0.6.7.tar.gz";
354 sha256 = "1aw8rx8vhb75y7zc6gi67g21sw057jdx7i8m3jq7kf3nqavxx9zw";
380 355 };
381 356 meta = {
382 357 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -515,14 +490,14 b' self: super: {'
515 490 };
516 491 };
517 492 "gevent" = super.buildPythonPackage {
518 name = "gevent-1.3.5";
493 name = "gevent-1.3.6";
519 494 doCheck = false;
520 495 propagatedBuildInputs = [
521 496 self."greenlet"
522 497 ];
523 498 src = fetchurl {
524 url = "https://files.pythonhosted.org/packages/e6/0a/fc345c6e6161f84484870dbcaa58e427c10bd9bdcd08a69bed3d6b398bf1/gevent-1.3.5.tar.gz";
525 sha256 = "1w3gydxirgd2f60c5yv579w4903ds9s4g3587ik4jby97hgqc5bz";
499 url = "https://files.pythonhosted.org/packages/49/13/aa4bb3640b5167fe58875d3d7e65390cdb14f9682a41a741a566bb560842/gevent-1.3.6.tar.gz";
500 sha256 = "1ih4k73dqz2zb561hda99vbanja3m6cdch3mgxxn1mla3qwkqhbv";
526 501 };
527 502 meta = {
528 503 license = [ pkgs.lib.licenses.mit ];
@@ -550,23 +525,12 b' self: super: {'
550 525 license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ];
551 526 };
552 527 };
553 "graphviz" = super.buildPythonPackage {
554 name = "graphviz-0.9";
528 "greenlet" = super.buildPythonPackage {
529 name = "greenlet-0.4.15";
555 530 doCheck = false;
556 531 src = fetchurl {
557 url = "https://files.pythonhosted.org/packages/2b/e6/71521bab8fb99833133f08f6ac0460e2f6b425a7f75ac4b02323c3c3b512/graphviz-0.9.zip";
558 sha256 = "14r9brj4r31b3qy1nnn34v3l4h0n39bqxg9sn2fz4p3pp5mglnl6";
559 };
560 meta = {
561 license = [ pkgs.lib.licenses.mit ];
562 };
563 };
564 "greenlet" = super.buildPythonPackage {
565 name = "greenlet-0.4.13";
566 doCheck = false;
567 src = fetchurl {
568 url = "https://files.pythonhosted.org/packages/13/de/ba92335e9e76040ca7274224942282a80d54f85e342a5e33c5277c7f87eb/greenlet-0.4.13.tar.gz";
569 sha256 = "1r412gfx25jrdiv444prmz5a8igrfabwnwqyr6b52ypq7ga87vqg";
532 url = "https://files.pythonhosted.org/packages/f8/e8/b30ae23b45f69aa3f024b46064c0ac8e5fcb4f22ace0dca8d6f9c8bbe5e7/greenlet-0.4.15.tar.gz";
533 sha256 = "1g4g1wwc472ds89zmqlpyan3fbnzpa8qm48z3z1y6mlk44z485ll";
570 534 };
571 535 meta = {
572 536 license = [ pkgs.lib.licenses.mit ];
@@ -599,11 +563,11 b' self: super: {'
599 563 };
600 564 };
601 565 "hupper" = super.buildPythonPackage {
602 name = "hupper-1.3";
566 name = "hupper-1.3.1";
603 567 doCheck = false;
604 568 src = fetchurl {
605 url = "https://files.pythonhosted.org/packages/51/0c/96335b1f2f32245fb871eea5bb9773196505ddb71fad15190056a282df9e/hupper-1.3.tar.gz";
606 sha256 = "1pkyrm9c2crc32ps00k1ahnc5clj3pjwiarc7j0x8aykwih7ff10";
569 url = "https://files.pythonhosted.org/packages/cf/4b/467b826a84c8594b81f414b5ab6794e981951dac90ca40abaf9ea1cb36b0/hupper-1.3.1.tar.gz";
570 sha256 = "03mf13n6i4dd60wlb9m99ddl4m3lmly70cjp7f82vdkibfl1v6l9";
607 571 };
608 572 meta = {
609 573 license = [ pkgs.lib.licenses.mit ];
@@ -850,11 +814,11 b' self: super: {'
850 814 };
851 815 };
852 816 "mistune" = super.buildPythonPackage {
853 name = "mistune-0.8.3";
817 name = "mistune-0.8.4";
854 818 doCheck = false;
855 819 src = fetchurl {
856 url = "https://files.pythonhosted.org/packages/9d/be/e06d4346cc608a01dec6bf770d7d0303a4fd6db588b318ced18f5f257145/mistune-0.8.3.tar.gz";
857 sha256 = "06b662p6kf46wh2jsabaqhaq4bz1srh2zxkrnx4yg96azlxw645w";
820 url = "https://files.pythonhosted.org/packages/2d/a4/509f6e7783ddd35482feda27bc7f72e65b5e7dc910eca4ab2164daf9c577/mistune-0.8.4.tar.gz";
821 sha256 = "0vkmsh0x480rni51lhyvigfdf06b9247z868pk3bal1wnnfl58sr";
858 822 };
859 823 meta = {
860 824 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -947,20 +911,6 b' self: super: {'
947 911 license = [ pkgs.lib.licenses.bsdOriginal ];
948 912 };
949 913 };
950 "objgraph" = super.buildPythonPackage {
951 name = "objgraph-3.1.1";
952 doCheck = false;
953 propagatedBuildInputs = [
954 self."graphviz"
955 ];
956 src = fetchurl {
957 url = "https://files.pythonhosted.org/packages/be/58/9ca81a20cc837054e94866df1475d899caaa94f3732b8a46006858b015f7/objgraph-3.1.1.tar.gz";
958 sha256 = "17aq4cwainiwvj8x61j0hx45c313bkwza5fijnmmw8v8glyy2bcc";
959 };
960 meta = {
961 license = [ pkgs.lib.licenses.mit ];
962 };
963 };
964 914 "packaging" = super.buildPythonPackage {
965 915 name = "packaging-15.2";
966 916 doCheck = false;
@@ -1025,15 +975,15 b' self: super: {'
1025 975 };
1026 976 };
1027 977 "pathlib2" = super.buildPythonPackage {
1028 name = "pathlib2-2.3.0";
978 name = "pathlib2-2.3.2";
1029 979 doCheck = false;
1030 980 propagatedBuildInputs = [
1031 981 self."six"
1032 982 self."scandir"
1033 983 ];
1034 984 src = fetchurl {
1035 url = "https://files.pythonhosted.org/packages/a1/14/df0deb867c2733f7d857523c10942b3d6612a1b222502fdffa9439943dfb/pathlib2-2.3.0.tar.gz";
1036 sha256 = "1cx5gs2v9j2vnzmcrbq5l8fq2mwrr1h6pyf1sjdji2w1bavm09fk";
985 url = "https://files.pythonhosted.org/packages/db/a8/7d6439c1aec525ed70810abee5b7d7f3aa35347f59bc28343e8f62019aa2/pathlib2-2.3.2.tar.gz";
986 sha256 = "10yb0iv5x2hs631rcppkhbddx799d3h8pcwmkbh2a66ns3w71ccf";
1037 987 };
1038 988 meta = {
1039 989 license = [ pkgs.lib.licenses.mit ];
@@ -1065,14 +1015,14 b' self: super: {'
1065 1015 };
1066 1016 };
1067 1017 "pickleshare" = super.buildPythonPackage {
1068 name = "pickleshare-0.7.4";
1018 name = "pickleshare-0.7.5";
1069 1019 doCheck = false;
1070 1020 propagatedBuildInputs = [
1071 1021 self."pathlib2"
1072 1022 ];
1073 1023 src = fetchurl {
1074 url = "https://files.pythonhosted.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
1075 sha256 = "0yvk14dzxk7g6qpr7iw23vzqbsr0dh4ij4xynkhnzpfz4xr2bac4";
1024 url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz";
1025 sha256 = "1jmghg3c53yp1i8cm6pcrm280ayi8621rwyav9fac7awjr3kss47";
1076 1026 };
1077 1027 meta = {
1078 1028 license = [ pkgs.lib.licenses.mit ];
@@ -1108,11 +1058,11 b' self: super: {'
1108 1058 };
1109 1059 };
1110 1060 "pluggy" = super.buildPythonPackage {
1111 name = "pluggy-0.6.0";
1061 name = "pluggy-0.8.0";
1112 1062 doCheck = false;
1113 1063 src = fetchurl {
1114 url = "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz";
1115 sha256 = "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz";
1064 url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz";
1065 sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4";
1116 1066 };
1117 1067 meta = {
1118 1068 license = [ pkgs.lib.licenses.mit ];
@@ -1134,22 +1084,22 b' self: super: {'
1134 1084 };
1135 1085 };
1136 1086 "psutil" = super.buildPythonPackage {
1137 name = "psutil-5.4.6";
1087 name = "psutil-5.4.7";
1138 1088 doCheck = false;
1139 1089 src = fetchurl {
1140 url = "https://files.pythonhosted.org/packages/51/9e/0f8f5423ce28c9109807024f7bdde776ed0b1161de20b408875de7e030c3/psutil-5.4.6.tar.gz";
1141 sha256 = "1xmw4qi6hnrhw81xqzkvmsm9im7j2vkk4v26ycjwq2jczqsmlvk8";
1090 url = "https://files.pythonhosted.org/packages/7d/9a/1e93d41708f8ed2b564395edfa3389f0fd6d567597401c2e5e2775118d8b/psutil-5.4.7.tar.gz";
1091 sha256 = "0fsgmvzwbdbszkwfnqhib8jcxm4w6zyhvlxlcda0rfm5cyqj4qsv";
1142 1092 };
1143 1093 meta = {
1144 1094 license = [ pkgs.lib.licenses.bsdOriginal ];
1145 1095 };
1146 1096 };
1147 1097 "psycopg2" = super.buildPythonPackage {
1148 name = "psycopg2-2.7.4";
1098 name = "psycopg2-2.7.5";
1149 1099 doCheck = false;
1150 1100 src = fetchurl {
1151 url = "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz";
1152 sha256 = "02b2yaf1hlwb91xkscbzmajpfj5z3d8yikzh5r48fs8gss8i3xcb";
1101 url = "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz";
1102 sha256 = "17klx964gw8z0znl0raz3by8vdc7cq5gxj4pdcrfcina84nrdkzc";
1153 1103 };
1154 1104 meta = {
1155 1105 license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
@@ -1167,11 +1117,11 b' self: super: {'
1167 1117 };
1168 1118 };
1169 1119 "py" = super.buildPythonPackage {
1170 name = "py-1.5.3";
1120 name = "py-1.6.0";
1171 1121 doCheck = false;
1172 1122 src = fetchurl {
1173 url = "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz";
1174 sha256 = "10gq2lckvgwlk9w6yzijhzkarx44hsaknd0ypa08wlnpjnsgmj99";
1123 url = "https://files.pythonhosted.org/packages/4f/38/5f427d1eedae73063ce4da680d2bae72014995f9fdeaa57809df61c968cd/py-1.6.0.tar.gz";
1124 sha256 = "1wcs3zv9wl5m5x7p16avqj2gsrviyb23yvc3pr330isqs0sh98q6";
1175 1125 };
1176 1126 meta = {
1177 1127 license = [ pkgs.lib.licenses.mit ];
@@ -1393,6 +1343,22 b' self: super: {'
1393 1343 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1394 1344 };
1395 1345 };
1346 "pyramid-mailer" = super.buildPythonPackage {
1347 name = "pyramid-mailer-0.15.1";
1348 doCheck = false;
1349 propagatedBuildInputs = [
1350 self."pyramid"
1351 self."repoze.sendmail"
1352 self."transaction"
1353 ];
1354 src = fetchurl {
1355 url = "https://files.pythonhosted.org/packages/a0/f2/6febf5459dff4d7e653314d575469ad2e11b9d2af2c3606360e1c67202f2/pyramid_mailer-0.15.1.tar.gz";
1356 sha256 = "16vg8jb203jgb7b0hd6wllfqvp542qh2ry1gjai2m6qpv5agy2pc";
1357 };
1358 meta = {
1359 license = [ pkgs.lib.licenses.bsdOriginal ];
1360 };
1361 };
1396 1362 "pyramid-mako" = super.buildPythonPackage {
1397 1363 name = "pyramid-mako-1.0.2";
1398 1364 doCheck = false;
@@ -1420,7 +1386,7 b' self: super: {'
1420 1386 };
1421 1387 };
1422 1388 "pytest" = super.buildPythonPackage {
1423 name = "pytest-3.6.0";
1389 name = "pytest-3.8.2";
1424 1390 doCheck = false;
1425 1391 propagatedBuildInputs = [
1426 1392 self."py"
@@ -1431,25 +1397,26 b' self: super: {'
1431 1397 self."atomicwrites"
1432 1398 self."pluggy"
1433 1399 self."funcsigs"
1400 self."pathlib2"
1434 1401 ];
1435 1402 src = fetchurl {
1436 url = "https://files.pythonhosted.org/packages/67/6a/5bcdc22f8dbada1d2910d6e1a3a03f6b14306c78f81122890735b28be4bf/pytest-3.6.0.tar.gz";
1437 sha256 = "0bdfazvjjbxssqzyvkb3m2x2in7xv56ipr899l00s87k7815sm9r";
1403 url = "https://files.pythonhosted.org/packages/5f/d2/7f77f406ac505abda02ab4afb50d06ebf304f6ea42fca34f8f37529106b2/pytest-3.8.2.tar.gz";
1404 sha256 = "18nrwzn61kph2y6gxwfz9ms68rfvr9d4vcffsxng9p7jk9z18clk";
1438 1405 };
1439 1406 meta = {
1440 1407 license = [ pkgs.lib.licenses.mit ];
1441 1408 };
1442 1409 };
1443 1410 "pytest-cov" = super.buildPythonPackage {
1444 name = "pytest-cov-2.5.1";
1411 name = "pytest-cov-2.6.0";
1445 1412 doCheck = false;
1446 1413 propagatedBuildInputs = [
1447 1414 self."pytest"
1448 1415 self."coverage"
1449 1416 ];
1450 1417 src = fetchurl {
1451 url = "https://files.pythonhosted.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz";
1452 sha256 = "0bbfpwdh9k3636bxc88vz9fa7vf4akchgn513ql1vd0xy4n7bah3";
1418 url = "https://files.pythonhosted.org/packages/d9/e2/58f90a316fbd94dd50bf5c826a23f3f5d079fb3cc448c1e9f0e3c33a3d2a/pytest-cov-2.6.0.tar.gz";
1419 sha256 = "0qnpp9y3ygx4jk4pf5ad71fh2skbvnr6gl54m7rg5qysnx4g0q73";
1453 1420 };
1454 1421 meta = {
1455 1422 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
@@ -1498,14 +1465,14 b' self: super: {'
1498 1465 };
1499 1466 };
1500 1467 "pytest-timeout" = super.buildPythonPackage {
1501 name = "pytest-timeout-1.2.1";
1468 name = "pytest-timeout-1.3.2";
1502 1469 doCheck = false;
1503 1470 propagatedBuildInputs = [
1504 1471 self."pytest"
1505 1472 ];
1506 1473 src = fetchurl {
1507 url = "https://files.pythonhosted.org/packages/be/e9/a9106b8bc87521c6813060f50f7d1fdc15665bc1bbbe71c0ffc1c571aaa2/pytest-timeout-1.2.1.tar.gz";
1508 sha256 = "1kdp6qbh5v1168l99rba5yfzvy05gmzkmkhldgp36p9xcdjd5dv8";
1474 url = "https://files.pythonhosted.org/packages/8c/3e/1b6a319d12ae7baa3acb7c18ff2c8630a09471a0319d43535c683b4d03eb/pytest-timeout-1.3.2.tar.gz";
1475 sha256 = "09wnmzvnls2mnsdz7x3c3sk2zdp6jl4dryvyj5i8hqz16q2zq5qi";
1509 1476 };
1510 1477 meta = {
1511 1478 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
@@ -1620,6 +1587,22 b' self: super: {'
1620 1587 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1621 1588 };
1622 1589 };
1590 "repoze.sendmail" = super.buildPythonPackage {
1591 name = "repoze.sendmail-4.4.1";
1592 doCheck = false;
1593 propagatedBuildInputs = [
1594 self."setuptools"
1595 self."zope.interface"
1596 self."transaction"
1597 ];
1598 src = fetchurl {
1599 url = "https://files.pythonhosted.org/packages/12/4e/8ef1fd5c42765d712427b9c391419a77bd48877886d2cbc5e9f23c8cad9b/repoze.sendmail-4.4.1.tar.gz";
1600 sha256 = "096ln02jr2afk7ab9j2czxqv2ryqq7m86ah572nqplx52iws73ks";
1601 };
1602 meta = {
1603 license = [ pkgs.lib.licenses.zpl21 ];
1604 };
1605 };
1623 1606 "requests" = super.buildPythonPackage {
1624 1607 name = "requests-2.9.1";
1625 1608 doCheck = false;
@@ -1632,7 +1615,7 b' self: super: {'
1632 1615 };
1633 1616 };
1634 1617 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1635 name = "rhodecode-enterprise-ce-4.13.3";
1618 name = "rhodecode-enterprise-ce-4.14.0";
1636 1619 buildInputs = [
1637 1620 self."pytest"
1638 1621 self."py"
@@ -1640,8 +1623,8 b' self: super: {'
1640 1623 self."pytest-sugar"
1641 1624 self."pytest-runner"
1642 1625 self."pytest-profiling"
1626 self."pytest-timeout"
1643 1627 self."gprof2dot"
1644 self."pytest-timeout"
1645 1628 self."mock"
1646 1629 self."webtest"
1647 1630 self."cov-core"
@@ -1688,7 +1671,6 b' self: super: {'
1688 1671 self."mysql-python"
1689 1672 self."pymysql"
1690 1673 self."pyotp"
1691 self."objgraph"
1692 1674 self."packaging"
1693 1675 self."paste"
1694 1676 self."pastedeploy"
@@ -1709,6 +1691,7 b' self: super: {'
1709 1691 self."pyramid-jinja2"
1710 1692 self."pyramid-mako"
1711 1693 self."pyramid"
1694 self."pyramid-mailer"
1712 1695 self."pysqlite"
1713 1696 self."python-dateutil"
1714 1697 self."python-ldap"
@@ -1722,7 +1705,6 b' self: super: {'
1722 1705 self."repoze.lru"
1723 1706 self."requests"
1724 1707 self."routes"
1725 self."setproctitle"
1726 1708 self."simplejson"
1727 1709 self."six"
1728 1710 self."sqlalchemy"
@@ -1756,10 +1738,9 b' self: super: {'
1756 1738 self."greenlet"
1757 1739 self."gunicorn"
1758 1740 self."waitress"
1741 self."setproctitle"
1759 1742 self."ipdb"
1760 1743 self."ipython"
1761 self."cprofilev"
1762 self."bottle"
1763 1744 self."rhodecode-tools"
1764 1745 self."appenlight-client"
1765 1746 self."pytest"
@@ -1768,8 +1749,8 b' self: super: {'
1768 1749 self."pytest-sugar"
1769 1750 self."pytest-runner"
1770 1751 self."pytest-profiling"
1752 self."pytest-timeout"
1771 1753 self."gprof2dot"
1772 self."pytest-timeout"
1773 1754 self."mock"
1774 1755 self."webtest"
1775 1756 self."cov-core"
@@ -1781,7 +1762,7 b' self: super: {'
1781 1762 };
1782 1763 };
1783 1764 "rhodecode-tools" = super.buildPythonPackage {
1784 name = "rhodecode-tools-0.16.0";
1765 name = "rhodecode-tools-1.0.1";
1785 1766 doCheck = false;
1786 1767 propagatedBuildInputs = [
1787 1768 self."click"
@@ -1796,11 +1777,11 b' self: super: {'
1796 1777 self."whoosh"
1797 1778 ];
1798 1779 src = fetchurl {
1799 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164";
1800 sha256 = "00xcc2mj99lx9d0ksml0p2xrd00kf5ypwyigg58cc9j9bznx7mzr";
1780 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b";
1781 sha256 = "0nr300s4sg685qs4wgbwlplwriawrwi6jq79z37frcnpyc89gpvm";
1801 1782 };
1802 1783 meta = {
1803 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1784 license = [ { fullName = "Apache 2.0 and Proprietary"; } ];
1804 1785 };
1805 1786 };
1806 1787 "routes" = super.buildPythonPackage {
@@ -1841,11 +1822,11 b' self: super: {'
1841 1822 };
1842 1823 };
1843 1824 "setuptools" = super.buildPythonPackage {
1844 name = "setuptools-40.1.0";
1825 name = "setuptools-40.4.3";
1845 1826 doCheck = false;
1846 1827 src = fetchurl {
1847 url = "https://files.pythonhosted.org/packages/5a/df/b2e3d9693bb0dcbeac516a73dd7a9eb82b126ae52e4a74605a9b01beddd5/setuptools-40.1.0.zip";
1848 sha256 = "0w1blx5ajga5y15dci0mddk49cf2xpq0mp7rp7jrqr2diqk00ib6";
1828 url = "https://files.pythonhosted.org/packages/6e/9c/6a003320b00ef237f94aa74e4ad66c57a7618f6c79d67527136e2544b728/setuptools-40.4.3.zip";
1829 sha256 = "058v6zns4634n4al2nmmvp15j8nrgwn8wjrbdks47wk3vm05gg5c";
1849 1830 };
1850 1831 meta = {
1851 1832 license = [ pkgs.lib.licenses.mit ];
@@ -1922,11 +1903,11 b' self: super: {'
1922 1903 };
1923 1904 };
1924 1905 "subprocess32" = super.buildPythonPackage {
1925 name = "subprocess32-3.5.1";
1906 name = "subprocess32-3.5.2";
1926 1907 doCheck = false;
1927 1908 src = fetchurl {
1928 url = "https://files.pythonhosted.org/packages/de/fb/fd3e91507021e2aecdb081d1b920082628d6b8869ead845e3e87b3d2e2ca/subprocess32-3.5.1.tar.gz";
1929 sha256 = "0wgi3bfnssid1g6h0v803z3k1wjal6il16nr3r9c587cfzwfkv0q";
1909 url = "https://files.pythonhosted.org/packages/c3/5f/7117737fc7114061837a4f51670d863dd7f7f9c762a6546fa8a0dcfe61c8/subprocess32-3.5.2.tar.gz";
1910 sha256 = "11v62shwmdys48g7ncs3a8jwwnkcl8d4zcwy6dk73z1zy2f9hazb";
1930 1911 };
1931 1912 meta = {
1932 1913 license = [ pkgs.lib.licenses.psfl ];
@@ -1969,11 +1950,11 b' self: super: {'
1969 1950 };
1970 1951 };
1971 1952 "testpath" = super.buildPythonPackage {
1972 name = "testpath-0.3.1";
1953 name = "testpath-0.4.2";
1973 1954 doCheck = false;
1974 1955 src = fetchurl {
1975 url = "https://files.pythonhosted.org/packages/f4/8b/b71e9ee10e5f751e9d959bc750ab122ba04187f5aa52aabdc4e63b0e31a7/testpath-0.3.1.tar.gz";
1976 sha256 = "02bnmkvm6a8a1p5kcygylcd19v2s040qw3zp1n8ab3bqkj1kflqd";
1956 url = "https://files.pythonhosted.org/packages/06/30/9a7e917066d851d8b4117e85794b5f14516419ea714a8a2681ec6aa8a981/testpath-0.4.2.tar.gz";
1957 sha256 = "1y40hywscnnyb734pnzm55nd8r8kp1072bjxbil83gcd53cv755n";
1977 1958 };
1978 1959 meta = {
1979 1960 license = [ ];
@@ -1996,6 +1977,20 b' self: super: {'
1996 1977 license = [ pkgs.lib.licenses.bsdOriginal ];
1997 1978 };
1998 1979 };
1980 "transaction" = super.buildPythonPackage {
1981 name = "transaction-2.4.0";
1982 doCheck = false;
1983 propagatedBuildInputs = [
1984 self."zope.interface"
1985 ];
1986 src = fetchurl {
1987 url = "https://files.pythonhosted.org/packages/9d/7d/0e8af0d059e052b9dcf2bb5a08aad20ae3e238746bdd3f8701a60969b363/transaction-2.4.0.tar.gz";
1988 sha256 = "17wz1y524ca07vr03yddy8dv0gbscs06dbdywmllxv5rc725jq3j";
1989 };
1990 meta = {
1991 license = [ pkgs.lib.licenses.zpl21 ];
1992 };
1993 };
1999 1994 "translationstring" = super.buildPythonPackage {
2000 1995 name = "translationstring-1.3";
2001 1996 doCheck = false;
@@ -23,9 +23,6 b' pkgs.stdenv.mkDerivation {'
23 23 pip2nix.pip2nix
24 24 pythonPackages.pip-tools
25 25
26 # Allows to generate bower dependencies
27 pkgs.nodePackages.bower2nix
28
29 26 # Allows to generate node dependencies
30 27 pkgs.nodePackages.node2nix
31 28
@@ -1,14 +1,12 b''
1 1 # This file defines how to "build" for packaging.
2 2
3 { pkgs ? import <nixpkgs> {}
4 , doCheck ? false
3 { doCheck ? false
5 4 }:
6 5
7 6 let
8 7 enterprise_ce = import ./default.nix {
9 8 inherit
10 doCheck
11 pkgs;
9 doCheck;
12 10
13 11 # disable checkPhase for build
14 12 checkPhase = ''
@@ -4,8 +4,8 b' setuptools-scm==2.1.0'
4 4 amqp==2.3.1
5 5 # not released authomatic that has updated some oauth providers
6 6 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
7 atomicwrites==1.1.5
8 attrs==18.1.0
7 atomicwrites==1.2.1
8 attrs==18.2.0
9 9 babel==1.3
10 10 beaker==1.9.1
11 11 celery==4.1.1
@@ -19,7 +19,7 b' cssselect==1.0.3'
19 19 decorator==4.1.2
20 20 deform==2.0.5
21 21 docutils==0.14.0
22 dogpile.cache==0.6.6
22 dogpile.cache==0.6.7
23 23 dogpile.core==0.4.1
24 24 ecdsa==0.13
25 25 formencode==1.2.4
@@ -40,15 +40,14 b' msgpack-python==0.5.6'
40 40 mysql-python==1.2.5
41 41 pymysql==0.8.1
42 42 pyotp==2.2.6
43 objgraph==3.1.1
44 43 packaging==15.2
45 44 paste==2.0.3
46 45 pastedeploy==1.5.2
47 46 pastescript==2.0.2
48 pathlib2==2.3.0
47 pathlib2==2.3.2
49 48 peppercorn==0.5
50 psutil==5.4.6
51 psycopg2==2.7.4
49 psutil==5.4.7
50 psycopg2==2.7.5
52 51 py-bcrypt==0.4
53 52 pycrypto==2.6.1
54 53 pycurl==7.43.0.2
@@ -61,6 +60,7 b' pyramid-debugtoolbar==4.4.0'
61 60 pyramid-jinja2==2.7
62 61 pyramid-mako==1.0.2
63 62 pyramid==1.9.2
63 pyramid_mailer==0.15.1
64 64 pysqlite==2.8.3
65 65 python-dateutil
66 66 python-ldap==3.1.0
@@ -74,12 +74,11 b' redis==2.10.6'
74 74 repoze.lru==0.7
75 75 requests==2.9.1
76 76 routes==2.4.1
77 setproctitle==1.1.10
78 77 simplejson==3.11.1
79 78 six==1.11.0
80 79 sqlalchemy==1.1.18
81 80 sshpubkeys==2.2.0
82 subprocess32==3.5.1
81 subprocess32==3.5.2
83 82 supervisor==3.3.4
84 83 tempita==0.5.2
85 84 translationstring==1.3
@@ -113,22 +112,24 b' invoke==0.13.0'
113 112 bumpversion==0.5.3
114 113
115 114 ## http servers
116 gevent==1.3.5
117 greenlet==0.4.13
115 gevent==1.3.6
116 greenlet==0.4.15
118 117 gunicorn==19.9.0
119 118 waitress==1.1.0
119 setproctitle==1.1.10
120 120
121 121 ## debug
122 122 ipdb==0.11.0
123 123 ipython==5.1.0
124 cprofilev==1.0.7
125 bottle==0.12.13
126 124
127 125 ## rhodecode-tools, special case
128 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164#egg=rhodecode-tools==0.16.0
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b#egg=rhodecode-tools==1.0.1
129 127
130 128 ## appenlight
131 129 appenlight-client==0.6.25
132 130
133 131 ## test related requirements
134 132 -r requirements_test.txt
133
134 ## uncomment to add the debug libraries
135 #-r requirements_debug.txt
@@ -1,14 +1,14 b''
1 1 # test related requirements
2 pytest==3.6.0
3 py==1.5.3
4 pytest-cov==2.5.1
2 pytest==3.8.2
3 py==1.6.0
4 pytest-cov==2.6.0
5 5 pytest-sugar==0.9.1
6 6 pytest-runner==4.2.0
7 7 pytest-profiling==1.3.0
8 pytest-timeout==1.3.2
8 9 gprof2dot==2017.9.19
9 pytest-timeout==1.2.1
10 10
11 11 mock==1.0.1
12 12 webtest==2.0.29
13 13 cov-core==1.15.0
14 coverage==3.7.1
14 coverage==4.5.1
@@ -1,1 +1,1 b''
1 4.13.3 No newline at end of file
1 4.14.0 No newline at end of file
@@ -51,7 +51,7 b' PYRAMID_SETTINGS = {}'
51 51 EXTENSIONS = {}
52 52
53 53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
54 __dbversion__ = 90 # defines current db version for migrations
54 __dbversion__ = 91 # defines current db version for migrations
55 55 __platform__ = platform.system()
56 56 __license__ = 'AGPLv3, and Commercial License'
57 57 __author__ = 'RhodeCode GmbH'
@@ -204,7 +204,7 b' def request_view(request):'
204 204 message='Request from IP:%s not allowed' % (
205 205 request.rpc_ip_addr,))
206 206 else:
207 log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,))
207 log.info('Access for IP:%s allowed', request.rpc_ip_addr)
208 208
209 209 # register our auth-user
210 210 request.rpc_user = auth_u
@@ -352,8 +352,7 b' def setup_request(request):'
352 352 request.rpc_params = json_body['args'] \
353 353 if isinstance(json_body['args'], dict) else {}
354 354
355 log.debug(
356 'method: %s, params: %s' % (request.rpc_method, request.rpc_params))
355 log.debug('method: %s, params: %s', request.rpc_method, request.rpc_params)
357 356 except KeyError as e:
358 357 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
359 358
@@ -20,7 +20,9 b''
20 20
21 21
22 22 class JSONRPCBaseError(Exception):
23 pass
23 def __init__(self, message='', *args):
24 self.message = message
25 super(JSONRPCBaseError, self).__init__(message, *args)
24 26
25 27
26 28 class JSONRPCError(JSONRPCBaseError):
@@ -31,7 +33,8 b' class JSONRPCValidationError(JSONRPCBase'
31 33
32 34 def __init__(self, *args, **kwargs):
33 35 self.colander_exception = kwargs.pop('colander_exc')
34 super(JSONRPCValidationError, self).__init__(*args, **kwargs)
36 super(JSONRPCValidationError, self).__init__(
37 message=self.colander_exception, *args)
35 38
36 39
37 40 class JSONRPCForbidden(JSONRPCBaseError):
@@ -65,7 +65,7 b' class TestCommentCommit(object):'
65 65 self, backend, status_change, message, commit_id,
66 66 no_notifications):
67 67
68 commit_id = backend.repo.scm_instance().get_changeset(commit_id).raw_id
68 commit_id = backend.repo.scm_instance().get_commit(commit_id).raw_id
69 69
70 70 id_, params = build_data(
71 71 self.apikey, 'comment_commit', repoid=backend.repo_name,
@@ -74,7 +74,7 b' class TestCommentCommit(object):'
74 74 repo = backend.repo.scm_instance()
75 75 expected = {
76 76 'msg': 'Commented on commit `%s` for repository `%s`' % (
77 repo.get_changeset().raw_id, backend.repo_name),
77 repo.get_commit().raw_id, backend.repo_name),
78 78 'status_change': status_change,
79 79 'success': True
80 80 }
@@ -66,6 +66,7 b' class TestCreatePullRequestApi(object):'
66 66 expected_message = "Created new pull request `{title}`".format(
67 67 title=data['title'])
68 68 result = response.json
69 assert result['error'] == None
69 70 assert result['result']['msg'] == expected_message
70 71 pull_request_id = result['result']['pull_request_id']
71 72 pull_request = PullRequestModel().get(pull_request_id)
@@ -88,6 +89,7 b' class TestCreatePullRequestApi(object):'
88 89 expected_message = "Created new pull request `{title}`".format(
89 90 title=data['title'])
90 91 result = response.json
92 assert result['error'] == None
91 93 assert result['result']['msg'] == expected_message
92 94 pull_request_id = result['result']['pull_request_id']
93 95 pull_request = PullRequestModel().get(pull_request_id)
@@ -127,6 +129,7 b' class TestCreatePullRequestApi(object):'
127 129 expected_message = "Created new pull request `{title}`".format(
128 130 title=data['title'])
129 131 result = response.json
132 assert result['error'] == None
130 133 assert result['result']['msg'] == expected_message
131 134 pull_request_id = result['result']['pull_request_id']
132 135 pull_request = PullRequestModel().get(pull_request_id)
@@ -170,6 +173,7 b' class TestCreatePullRequestApi(object):'
170 173 expected_message = "Created new pull request `{title}`".format(
171 174 title=data['title'])
172 175 result = response.json
176 assert result['error'] == None
173 177 assert result['result']['msg'] == expected_message
174 178 pull_request_id = result['result']['pull_request_id']
175 179 pull_request = PullRequestModel().get(pull_request_id)
@@ -19,7 +19,7 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import os
22
22 import mock
23 23 import pytest
24 24
25 25 from rhodecode.tests import TESTS_TMP_PATH
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29 29
30 30 @pytest.mark.usefixtures("testuser_api", "app")
31 31 class TestPull(object):
32
32 33 @pytest.mark.backends("git", "hg")
33 34 def test_api_pull(self, backend):
34 35 r = backend.create_repo()
@@ -37,6 +38,7 b' class TestPull(object):'
37 38 r.clone_uri = clone_uri
38 39
39 40 id_, params = build_data(self.apikey, 'pull', repoid=repo_name,)
41 with mock.patch('rhodecode.model.scm.url_validator'):
40 42 response = api_call(self.app, params)
41 43 msg = 'Pulled from url `%s` on repo `%s`' % (
42 44 clone_uri, repo_name)
@@ -89,7 +89,6 b' class TestUpdatePullRequest(object):'
89 89 pr_util.update_source_repository(head='c')
90 90 repo = pull_request.source_repo.scm_instance()
91 91 commits = [x for x in repo.get_commits()]
92 print commits
93 92
94 93 added_commit_id = commits[-1].raw_id # c commit
95 94 common_commit_id = commits[1].raw_id # b commit is common ancestor
@@ -26,7 +26,7 b' from rhodecode.tests import TEST_USER_AD'
26 26 from rhodecode.api.tests.utils import (
27 27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
28 28 from rhodecode.tests.fixture import Fixture
29 from rhodecode.tests.plugin import http_host_stub, http_host_only_stub
29 from rhodecode.tests.plugin import plain_http_host_only_stub
30 30
31 31 fixture = Fixture()
32 32
@@ -56,9 +56,15 b' class TestApiUpdateRepo(object):'
56 56 ({'clone_uri': ''},
57 57 {'clone_uri': ''}),
58 58
59 ({'clone_uri': 'http://example.com/repo_pull'},
60 {'clone_uri': 'http://example.com/repo_pull'}),
61
59 62 ({'push_uri': ''},
60 63 {'push_uri': ''}),
61 64
65 ({'push_uri': 'http://example.com/repo_push'},
66 {'push_uri': 'http://example.com/repo_push'}),
67
62 68 ({'landing_rev': 'rev:tip'},
63 69 {'landing_rev': ['rev', 'tip']}),
64 70
@@ -74,7 +80,7 b' class TestApiUpdateRepo(object):'
74 80 ({'repo_name': 'new_repo_name'},
75 81 {
76 82 'repo_name': 'new_repo_name',
77 'url': 'http://{}/new_repo_name'.format(http_host_only_stub())
83 'url': 'http://{}/new_repo_name'.format(plain_http_host_only_stub())
78 84 }),
79 85
80 86 ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
@@ -82,7 +88,7 b' class TestApiUpdateRepo(object):'
82 88 {
83 89 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
84 90 'url': 'http://{}/test_group_for_update/{}'.format(
85 http_host_only_stub(), UPDATE_REPO_NAME)
91 plain_http_host_only_stub(), UPDATE_REPO_NAME)
86 92 }),
87 93 ])
88 94 def test_api_update_repo(self, updates, expected, backend):
@@ -33,7 +33,7 b' from rhodecode.lib import audit_logger'
33 33 from rhodecode.lib import repo_maintenance
34 34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
35 35 from rhodecode.lib.celerylib.utils import get_task_id
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str
37 37 from rhodecode.lib.ext_json import json
38 38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 39 from rhodecode.model.changeset_status import ChangesetStatusModel
@@ -316,7 +316,7 b' def get_repo_changeset(request, apiuser,'
316 316 try:
317 317 cs = repo.get_commit(commit_id=revision, pre_load=pre_load)
318 318 except TypeError as e:
319 raise JSONRPCError(e.message)
319 raise JSONRPCError(safe_str(e))
320 320 _cs_json = cs.__json__()
321 321 _cs_json['diff'] = build_commit_data(cs, changes_details)
322 322 if changes_details == 'full':
@@ -382,7 +382,7 b' def get_repo_changesets(request, apiuser'
382 382 commits = vcs_repo.get_commits(
383 383 start_id=start_rev, pre_load=pre_load)
384 384 except TypeError as e:
385 raise JSONRPCError(e.message)
385 raise JSONRPCError(safe_str(e))
386 386 except Exception:
387 387 log.exception('Fetching of commits failed')
388 388 raise JSONRPCError('Error occurred during commit fetching')
@@ -1433,7 +1433,7 b' def comment_commit('
1433 1433 commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id
1434 1434 except Exception as e:
1435 1435 log.exception('Failed to fetch commit')
1436 raise JSONRPCError(e.message)
1436 raise JSONRPCError(safe_str(e))
1437 1437
1438 1438 if isinstance(userid, Optional):
1439 1439 userid = apiuser.user_id
@@ -25,7 +25,8 b' import operator'
25 25 from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPBadRequest
26 26
27 27 from rhodecode.lib import helpers as h, diffs
28 from rhodecode.lib.utils2 import StrictAttributeDict, safe_int, datetime_to_time
28 from rhodecode.lib.utils2 import (
29 StrictAttributeDict, safe_int, datetime_to_time, safe_unicode)
29 30 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
30 31 from rhodecode.model import repo
31 32 from rhodecode.model import repo_group
@@ -61,12 +62,13 b' def add_route_with_slash(config,name, pa'
61 62 config.add_route(name + '_slash', pattern + '/', **kw)
62 63
63 64
64 def add_route_requirements(route_path, requirements=URL_NAME_REQUIREMENTS):
65 def add_route_requirements(route_path, requirements=None):
65 66 """
66 67 Adds regex requirements to pyramid routes using a mapping dict
67 68 e.g::
68 69 add_route_requirements('{repo_name}/settings')
69 70 """
71 requirements = requirements or URL_NAME_REQUIREMENTS
70 72 for key, regex in requirements.items():
71 73 route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex))
72 74 return route_path
@@ -201,7 +203,7 b' class RepoAppView(BaseAppView):'
201 203 def _handle_missing_requirements(self, error):
202 204 log.error(
203 205 'Requirements are missing for repository %s: %s',
204 self.db_repo_name, error.message)
206 self.db_repo_name, safe_unicode(error))
205 207
206 208 def _get_local_tmpl_context(self, include_app_defaults=True):
207 209 _ = self.request.translate
@@ -301,7 +303,8 b' class PathFilter(object):'
301 303
302 304 def render_patchset_filtered(self, diffset, patchset, source_ref=None, target_ref=None):
303 305 filtered_patchset, has_hidden_changes = self.filter_patchset(patchset)
304 result = diffset.render_patchset(filtered_patchset, source_ref=source_ref, target_ref=target_ref)
306 result = diffset.render_patchset(
307 filtered_patchset, source_ref=source_ref, target_ref=target_ref)
305 308 result.has_hidden_changes = has_hidden_changes
306 309 return result
307 310
@@ -505,6 +508,36 b' class RepoRoutePredicate(object):'
505 508 return False
506 509
507 510
511 class RepoForbidArchivedRoutePredicate(object):
512 def __init__(self, val, config):
513 self.val = val
514
515 def text(self):
516 return 'repo_forbid_archived = %s' % self.val
517
518 phash = text
519
520 def __call__(self, info, request):
521 _ = request.translate
522 rhodecode_db_repo = request.db_repo
523
524 log.debug(
525 '%s checking if archived flag for repo for %s',
526 self.__class__.__name__, rhodecode_db_repo.repo_name)
527
528 if rhodecode_db_repo.archived:
529 log.warning('Current view is not supported for archived repo:%s',
530 rhodecode_db_repo.repo_name)
531
532 h.flash(
533 h.literal(_('Action not supported for archived repository.')),
534 category='warning')
535 summary_url = request.route_path(
536 'repo_summary', repo_name=rhodecode_db_repo.repo_name)
537 raise HTTPFound(summary_url)
538 return True
539
540
508 541 class RepoTypeRoutePredicate(object):
509 542 def __init__(self, val, config):
510 543 self.val = val or ['hg', 'git', 'svn']
@@ -530,13 +563,6 b' class RepoTypeRoutePredicate(object):'
530 563 else:
531 564 log.warning('Current view is not supported for repo type:%s',
532 565 rhodecode_db_repo.repo_type)
533
534 # h.flash(h.literal(
535 # _('Action not supported for %s.' % rhodecode_repo.alias)),
536 # category='warning')
537 # return redirect(
538 # route_path('repo_summary', repo_name=cls.rhodecode_db_repo.repo_name))
539
540 566 return False
541 567
542 568
@@ -643,10 +669,12 b' def includeme(config):'
643 669 config.add_route_predicate(
644 670 'repo_accepted_types', RepoTypeRoutePredicate)
645 671 config.add_route_predicate(
672 'repo_forbid_when_archived', RepoForbidArchivedRoutePredicate)
673 config.add_route_predicate(
646 674 'repo_group_route', RepoGroupRoutePredicate)
647 675 config.add_route_predicate(
648 676 'user_group_route', UserGroupRoutePredicate)
649 677 config.add_route_predicate(
650 678 'user_route_with_default', UserRouteWithDefaultPredicate)
651 679 config.add_route_predicate(
652 'user_route', UserRoutePredicate) No newline at end of file
680 'user_route', UserRoutePredicate)
@@ -488,14 +488,30 b' class TestLabsSettings(object):'
488 488 class TestOpenSourceLicenses(object):
489 489
490 490 def test_records_are_displayed(self, autologin_user):
491 sample_licenses = {
492 "python2.7-pytest-2.7.1": {
493 "UNKNOWN": None
491 sample_licenses = [
492 {
493 "license": [
494 {
495 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
496 "shortName": "bsdOriginal",
497 "spdxId": "BSD-4-Clause",
498 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
499 }
500 ],
501 "name": "python2.7-coverage-3.7.1"
494 502 },
495 "python2.7-Markdown-2.6.2": {
496 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
503 {
504 "license": [
505 {
506 "fullName": "MIT License",
507 "shortName": "mit",
508 "spdxId": "MIT",
509 "url": "http://spdx.org/licenses/MIT.html"
497 510 }
498 }
511 ],
512 "name": "python2.7-bootstrapped-pip-9.0.1"
513 },
514 ]
499 515 read_licenses_patch = mock.patch(
500 516 'rhodecode.apps.admin.views.open_source_licenses.read_opensource_licenses',
501 517 return_value=sample_licenses)
@@ -506,10 +522,9 b' class TestOpenSourceLicenses(object):'
506 522 assert_response = AssertResponse(response)
507 523 assert_response.element_contains(
508 524 '.panel-heading', 'Licenses of Third Party Packages')
509 for name in sample_licenses:
510 response.mustcontain(name)
511 for license in sample_licenses[name]:
512 assert_response.element_contains('.panel-body', license)
525 for license_data in sample_licenses:
526 response.mustcontain(license_data["license"][0]["spdxId"])
527 assert_response.element_contains('.panel-body', license_data["name"])
513 528
514 529 def test_records_can_be_read(self, autologin_user):
515 530 response = self.app.get(
@@ -35,7 +35,6 b' class OpenSourceLicensesAdminSettingsVie'
35 35
36 36 def load_default_context(self):
37 37 c = self._get_local_tmpl_context()
38
39 38 return c
40 39
41 40 @LoginRequired()
@@ -47,7 +46,6 b' class OpenSourceLicensesAdminSettingsVie'
47 46 c = self.load_default_context()
48 47 c.active = 'open_source'
49 48 c.navlist = navigation_list(self.request)
50 items = sorted(read_opensource_licenses().items(), key=lambda t: t[0])
51 c.opensource_licenses = collections.OrderedDict(items)
52
49 c.opensource_licenses = sorted(
50 read_opensource_licenses(), key=lambda d: d["name"])
53 51 return self._get_template_context(c)
@@ -26,6 +26,7 b' from pyramid.view import view_config'
26 26
27 27 from rhodecode.apps._base import BaseAppView
28 28 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.lib import system_info
29 30 from rhodecode.lib.auth import (
30 31 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
31 32 from rhodecode.lib.utils2 import safe_int, StrictAttributeDict
@@ -71,6 +72,16 b' class AdminProcessManagementView(BaseApp'
71 72
72 73 return proc_list
73 74
75 def get_workers(self):
76 workers = None
77 try:
78 rc_config = system_info.rhodecode_config().value['config']
79 workers = rc_config['server:main'].get('workers')
80 except Exception:
81 pass
82
83 return workers or '?'
84
74 85 @LoginRequired()
75 86 @HasPermissionAllDecorator('hg.admin')
76 87 @view_config(
@@ -83,6 +94,7 b' class AdminProcessManagementView(BaseApp'
83 94 c.active = 'process_management'
84 95 c.navlist = navigation_list(self.request)
85 96 c.gunicorn_processes = self.get_processes()
97 c.gunicorn_workers = self.get_workers()
86 98 return self._get_template_context(c)
87 99
88 100 @LoginRequired()
@@ -26,7 +26,7 b' from pyramid.httpexceptions import HTTPB'
26 26
27 27 from rhodecode.apps._base import BaseAppView
28 28 from rhodecode.lib.channelstream import (
29 channelstream_request,
29 channelstream_request, get_channelstream_server_url,
30 30 ChannelstreamConnectionException,
31 31 ChannelstreamPermissionException,
32 32 check_channel_permissions,
@@ -56,8 +56,9 b' class ChannelstreamView(BaseAppView):'
56 56 @NotAnonymous()
57 57 @view_config(route_name='channelstream_connect', renderer='json_ext')
58 58 def connect(self):
59 """ handle authorization of users trying to connect """
60
59 61 self.load_default_context()
60 """ handle authorization of users trying to connect """
61 62 try:
62 63 json_body = self.request.json_body
63 64 except Exception:
@@ -107,11 +108,14 b' class ChannelstreamView(BaseAppView):'
107 108 'broadcast_presence_with_user_lists': True
108 109 }
109 110 # connect user to server
111 channelstream_url = get_channelstream_server_url(
112 self.channelstream_config, '/connect')
110 113 try:
111 connect_result = channelstream_request(self.channelstream_config,
112 payload, '/connect')
114 connect_result = channelstream_request(
115 self.channelstream_config, payload, '/connect')
113 116 except ChannelstreamConnectionException:
114 log.exception('Channelstream service is down')
117 log.exception(
118 'Channelstream service at {} is down'.format(channelstream_url))
115 119 return HTTPBadGateway()
116 120
117 121 connect_result['channels'] = channels
@@ -153,17 +157,21 b' class ChannelstreamView(BaseAppView):'
153 157 'store_history': True,
154 158 'broadcast_presence_with_user_lists': True
155 159 }
160
161 channelstream_url = get_channelstream_server_url(
162 self.channelstream_config, '/subscribe')
156 163 try:
157 164 connect_result = channelstream_request(
158 165 self.channelstream_config, payload, '/subscribe')
159 166 except ChannelstreamConnectionException:
160 log.exception('Channelstream service is down')
167 log.exception(
168 'Channelstream service at {} is down'.format(channelstream_url))
161 169 return HTTPBadGateway()
162 170 # include_channel_info will limit history only to new channel
163 171 # to not overwrite histories on other channels in client
164 172 connect_result['channels_info'] = parse_channels_info(
165 173 connect_result['channels_info'],
166 174 include_channel_info=filtered_channels)
167 update_history_from_logs(self.channelstream_config,
168 filtered_channels, connect_result)
175 update_history_from_logs(
176 self.channelstream_config, filtered_channels, connect_result)
169 177 return connect_result
@@ -21,22 +21,31 b' from rhodecode.apps._base import ADMIN_P'
21 21 from rhodecode.lib.utils2 import str2bool
22 22
23 23
24 def debug_style_enabled(info, request):
24 class DebugStylePredicate(object):
25 def __init__(self, val, config):
26 self.val = val
27
28 def text(self):
29 return 'debug style route = %s' % self.val
30
31 phash = text
32
33 def __call__(self, info, request):
25 34 return str2bool(request.registry.settings.get('debug_style'))
26 35
27 36
28 37 def includeme(config):
38 config.add_route_predicate(
39 'debug_style', DebugStylePredicate)
40
29 41 config.add_route(
30 42 name='debug_style_home',
31 43 pattern=ADMIN_PREFIX + '/debug_style',
32 custom_predicates=(debug_style_enabled,))
44 debug_style=True)
33 45 config.add_route(
34 46 name='debug_style_template',
35 47 pattern=ADMIN_PREFIX + '/debug_style/t/{t_path}',
36 custom_predicates=(debug_style_enabled,))
48 debug_style=True)
37 49
38 50 # Scan module for configuration decorators.
39 51 config.scan('.views', ignore='.tests')
40
41
42
@@ -405,8 +405,8 b' class GistView(BaseAppView):'
405 405 revision = self.request.GET.get('revision')
406 406
407 407 if revision != last_rev.raw_id:
408 log.error('Last revision %s is different then submitted %s'
409 % (revision, last_rev))
408 log.error('Last revision %s is different then submitted %s',
409 revision, last_rev)
410 410 # our gist has newer version than we
411 411 success = False
412 412
@@ -63,6 +63,10 b' def includeme(config):'
63 63 name='markup_preview',
64 64 pattern='/_markup_preview')
65 65
66 config.add_route(
67 name='store_user_session_value',
68 pattern='/_store_session_attr')
69
66 70 # register our static links via redirection mechanism
67 71 routing_links.connect_redirection_links(config)
68 72
@@ -62,8 +62,7 b' class TestHomeController(TestController)'
62 62 rhodecode_version_hash = calculate_version_hash(
63 63 {'beaker.session.secret':'test-rc-uytcxaz'})
64 64 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
65 response.mustcontain('rhodecode-components.js?ver={0}'.format(
66 rhodecode_version_hash))
65 response.mustcontain('scripts.js?ver={0}'.format(rhodecode_version_hash))
67 66
68 67 def test_index_contains_backend_specific_details(self, backend):
69 68 self.log_user()
@@ -33,7 +33,7 b' from rhodecode.lib.index import searcher'
33 33 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
34 34 from rhodecode.lib.ext_json import json
35 35 from rhodecode.model.db import (
36 func, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
36 func, true, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
37 37 from rhodecode.model.repo import RepoModel
38 38 from rhodecode.model.repo_group import RepoGroupModel
39 39 from rhodecode.model.scm import RepoGroupList, RepoList
@@ -114,6 +114,7 b' class HomeView(BaseAppView):'
114 114 query = Repository.query()\
115 115 .order_by(func.length(Repository.repo_name))\
116 116 .order_by(Repository.repo_name)\
117 .filter(Repository.archived.isnot(true()))\
117 118 .filter(or_(
118 119 # generate multiple IN to fix limitation problems
119 120 *in_filter_generator(Repository.repo_id, allowed_ids)
@@ -444,3 +445,18 b' class HomeView(BaseAppView):'
444 445 if text:
445 446 return h.render(text, renderer=renderer, mentions=True)
446 447 return ''
448
449 @LoginRequired()
450 @CSRFRequired()
451 @view_config(
452 route_name='store_user_session_value', request_method='POST',
453 renderer='string', xhr=True)
454 def store_user_session_attr(self):
455 key = self.request.POST.get('key')
456 val = self.request.POST.get('val')
457
458 existing_value = self.request.session.get(key)
459 if existing_value != val:
460 self.request.session[key] = val
461
462 return 'stored:{}'.format(key)
@@ -93,16 +93,16 b' def get_came_from(request):'
93 93 allowed_schemes = ['http', 'https']
94 94 default_came_from = h.route_path('home')
95 95 if parsed.scheme and parsed.scheme not in allowed_schemes:
96 log.error('Suspicious URL scheme detected %s for url %s' %
97 (parsed.scheme, parsed))
96 log.error('Suspicious URL scheme detected %s for url %s',
97 parsed.scheme, parsed)
98 98 came_from = default_came_from
99 99 elif parsed.netloc and request.host != parsed.netloc:
100 100 log.error('Suspicious NETLOC detected %s for url %s server url '
101 'is: %s' % (parsed.netloc, parsed, request.host))
101 'is: %s', parsed.netloc, parsed, request.host)
102 102 came_from = default_came_from
103 103 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
104 log.error('Header injection detected `%s` for url %s server url ' %
105 (parsed.path, parsed))
104 log.error('Header injection detected `%s` for url %s server url ',
105 parsed.path, parsed)
106 106 came_from = default_came_from
107 107
108 108 return came_from or default_came_from
@@ -29,6 +29,8 b' from rhodecode.lib import helpers as h'
29 29 from rhodecode.lib import audit_logger
30 30 from rhodecode.lib.auth import (
31 31 LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
33 from rhodecode.model.db import UserGroup
32 34 from rhodecode.model.repo_group import RepoGroupModel
33 35 from rhodecode.model.forms import RepoGroupPermsForm
34 36 from rhodecode.model.meta import Session
@@ -101,6 +103,11 b' class RepoGroupPermissionsView(RepoGroup'
101 103 for change in changes['added'] + changes['updated'] + changes['deleted']:
102 104 if change['type'] == 'user':
103 105 affected_user_ids.append(change['id'])
106 if change['type'] == 'user_group':
107 user_group = UserGroup.get(safe_int(change['id']))
108 if user_group:
109 group_members_ids = [x.user_id for x in user_group.members]
110 affected_user_ids.extend(group_members_ids)
104 111
105 112 events.trigger(events.UserPermissionsChange(affected_user_ids))
106 113
@@ -231,11 +231,13 b' def includeme(config):'
231 231 config.add_route(
232 232 name='repo_fork_new',
233 233 pattern='/{repo_name:.*?[^/]}/fork', repo_route=True,
234 repo_forbid_when_archived=True,
234 235 repo_accepted_types=['hg', 'git'])
235 236
236 237 config.add_route(
237 238 name='repo_fork_create',
238 239 pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True,
240 repo_forbid_when_archived=True,
239 241 repo_accepted_types=['hg', 'git'])
240 242
241 243 config.add_route(
@@ -276,27 +278,29 b' def includeme(config):'
276 278 config.add_route(
277 279 name='pullrequest_new',
278 280 pattern='/{repo_name:.*?[^/]}/pull-request/new',
279 repo_route=True, repo_accepted_types=['hg', 'git'])
281 repo_route=True, repo_accepted_types=['hg', 'git'],
282 repo_forbid_when_archived=True)
280 283
281 284 config.add_route(
282 285 name='pullrequest_create',
283 286 pattern='/{repo_name:.*?[^/]}/pull-request/create',
284 repo_route=True, repo_accepted_types=['hg', 'git'])
287 repo_route=True, repo_accepted_types=['hg', 'git'],
288 repo_forbid_when_archived=True)
285 289
286 290 config.add_route(
287 291 name='pullrequest_update',
288 292 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update',
289 repo_route=True)
293 repo_route=True, repo_forbid_when_archived=True)
290 294
291 295 config.add_route(
292 296 name='pullrequest_merge',
293 297 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge',
294 repo_route=True)
298 repo_route=True, repo_forbid_when_archived=True)
295 299
296 300 config.add_route(
297 301 name='pullrequest_delete',
298 302 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete',
299 repo_route=True)
303 repo_route=True, repo_forbid_when_archived=True)
300 304
301 305 config.add_route(
302 306 name='pullrequest_comment_create',
@@ -319,6 +323,9 b' def includeme(config):'
319 323 name='edit_repo_advanced',
320 324 pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True)
321 325 config.add_route(
326 name='edit_repo_advanced_archive',
327 pattern='/{repo_name:.*?[^/]}/settings/advanced/archive', repo_route=True)
328 config.add_route(
322 329 name='edit_repo_advanced_delete',
323 330 pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True)
324 331 config.add_route(
@@ -97,9 +97,10 b' class TestRepoCommitCommentsView(TestCon'
97 97 comment_id = ChangesetComment.query().first().comment_id
98 98 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
99 99
100 sbj = 'left {0} on commit `{1}` in the {2} repository'.format(
101 comment_type, h.show_id(commit), backend.repo_name)
102 assert sbj in notification.subject
100 author = notification.created_by_user.username_and_name
101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
102 author, comment_type, h.show_id(commit), backend.repo_name)
103 assert sbj == notification.subject
103 104
104 105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
105 106 backend.repo_name, commit_id, comment_id))
@@ -134,12 +135,18 b' class TestRepoCommitCommentsView(TestCon'
134 135 if backend.alias == 'svn':
135 136 response.mustcontain(
136 137 '''data-f-path="vcs/commands/summary.py" '''
137 '''id="a_c--ad05457a43f8"'''
138 '''data-anchor-id="c-300-ad05457a43f8"'''
138 139 )
139 else:
140 if backend.alias == 'git':
140 141 response.mustcontain(
141 142 '''data-f-path="vcs/backends/hg.py" '''
142 '''id="a_c--9c390eb52cd6"'''
143 '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"'''
144 )
145
146 if backend.alias == 'hg':
147 response.mustcontain(
148 '''data-f-path="vcs/backends/hg.py" '''
149 '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"'''
143 150 )
144 151
145 152 assert Notification.query().count() == 1
@@ -150,12 +157,12 b' class TestRepoCommitCommentsView(TestCon'
150 157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
151 158
152 159 assert comment.revision == commit_id
153 sbj = 'left {comment_type} on commit `{commit}` ' \
154 '(file: `{f_path}`) in the {repo} repository'.format(
155 commit=h.show_id(commit),
156 f_path=f_path, line=line, repo=backend.repo_name,
157 comment_type=comment_type)
158 assert sbj in notification.subject
160
161 author = notification.created_by_user.username_and_name
162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
164
165 assert sbj == notification.subject
159 166
160 167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
161 168 backend.repo_name, commit_id, comment.comment_id))
@@ -222,10 +229,10 b' class TestRepoCommitCommentsView(TestCon'
222 229 comment_id = ChangesetComment.query().first().comment_id
223 230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
224 231
225 sbj = 'left note on commit `{0}` (status: Approved) ' \
226 'in the {1} repository'.format(
227 h.show_id(commit), backend.repo_name)
228 assert sbj in notification.subject
232 author = notification.created_by_user.username_and_name
233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
234 author, h.show_id(commit), backend.repo_name)
235 assert sbj == notification.subject
229 236
230 237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
231 238 backend.repo_name, commit_id, comment_id))
@@ -88,7 +88,7 b' class TestRepoCommitView(object):'
88 88 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
89 89
90 90 # files op files
91 response.mustcontain('File no longer present at commit: %s' %
91 response.mustcontain('File not present at commit: %s' %
92 92 _shorten_commit_id(commit_id))
93 93
94 94 # svn uses a different filename
@@ -133,7 +133,7 b' class TestRepoCommitView(object):'
133 133 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
134 134
135 135 # files op files
136 response.mustcontain('File no longer present at commit: %s' %
136 response.mustcontain('File not present at commit: %s' %
137 137 _shorten_commit_id(commit_ids[1]))
138 138 response.mustcontain('Added docstrings to vcs.cli') # commit msg
139 139 response.mustcontain('Changed theme to ADC theme') # commit msg
@@ -163,7 +163,7 b' class TestRepoCommitView(object):'
163 163 response.mustcontain(_shorten_commit_id(commit_ids[1]))
164 164
165 165 # files op files
166 response.mustcontain('File no longer present at commit: %s' %
166 response.mustcontain('File not present at commit: %s' %
167 167 _shorten_commit_id(commit_ids[1]))
168 168
169 169 # svn is special
@@ -293,26 +293,13 b' Added a symlink'
293 293 """ + diffs['svn'],
294 294 }
295 295
296 def _check_diff_menus(self, response, right_menu=False,):
297 # diff menus
298 for elem in ['Show File', 'Unified Diff', 'Side-by-side Diff',
299 'Raw Diff', 'Download Diff']:
296 def _check_new_diff_menus(self, response, right_menu=False,):
297 # individual file diff menus
298 for elem in ['Show file before', 'Show file after']:
300 299 response.mustcontain(elem)
301 300
302 301 # right pane diff menus
303 302 if right_menu:
304 for elem in ['Ignore whitespace', 'Increase context',
305 'Hide comments']:
303 for elem in ['Hide whitespace changes', 'Toggle Wide Mode diff',
304 'Show full context diff']:
306 305 response.mustcontain(elem)
307
308 def _check_new_diff_menus(self, response, right_menu=False,):
309 # diff menus
310 for elem in ['Show file before', 'Show file after',
311 'Raw diff', 'Download diff']:
312 response.mustcontain(elem)
313
314 # right pane diff menus
315 if right_menu:
316 for elem in ['Ignore whitespace', 'Increase context',
317 'Hide comments']:
318 response.mustcontain(elem)
@@ -105,10 +105,8 b' class TestCompareView(object):'
105 105 response = self.app.get(
106 106 route_path('repo_compare',
107 107 repo_name=origin.repo_name,
108 source_ref_type="rev",
109 source_ref=commit3.raw_id,
110 target_ref_type="rev",
111 target_ref=commit4.raw_id,
108 source_ref_type="rev", source_ref=commit3.raw_id,
109 target_ref_type="rev", target_ref=commit4.raw_id,
112 110 params=dict(merge='1', target_repo=fork.repo_name)
113 111 ))
114 112
@@ -143,10 +141,8 b' class TestCompareView(object):'
143 141 response = self.app.get(
144 142 route_path('repo_compare',
145 143 repo_name=repo1.repo_name,
146 source_ref_type="branch",
147 source_ref=commit_id2,
148 target_ref_type="branch",
149 target_ref=commit_id1,
144 source_ref_type="branch", source_ref=commit_id2,
145 target_ref_type="branch", target_ref=commit_id1,
150 146 params=dict(merge='1', target_repo=repo2.repo_name)
151 147 ))
152 148
@@ -156,9 +152,9 b' class TestCompareView(object):'
156 152 compare_page = ComparePage(response)
157 153 compare_page.contains_change_summary(1, 2, 0)
158 154 compare_page.contains_commits([commit1, commit2])
159 compare_page.contains_file_links_and_anchors([
160 ('file1', 'a_c--826e8142e6ba'),
161 ])
155
156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
162 158
163 159 # Swap is removed when comparing branches since it's a PR feature and
164 160 # it is then a preview mode
@@ -200,10 +196,8 b' class TestCompareView(object):'
200 196 response = self.app.get(
201 197 route_path('repo_compare',
202 198 repo_name=repo1.repo_name,
203 source_ref_type="branch",
204 source_ref=commit_id2,
205 target_ref_type="branch",
206 target_ref=commit_id1,
199 source_ref_type="branch", source_ref=commit_id2,
200 target_ref_type="branch", target_ref=commit_id1,
207 201 params=dict(merge='1', target_repo=repo2.repo_name),
208 202 ))
209 203
@@ -213,9 +207,8 b' class TestCompareView(object):'
213 207 compare_page = ComparePage(response)
214 208 compare_page.contains_change_summary(1, 2, 0)
215 209 compare_page.contains_commits([commit1, commit2])
216 compare_page.contains_file_links_and_anchors([
217 ('file1', 'a_c--826e8142e6ba'),
218 ])
210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
219 212
220 213 # Swap is removed when comparing branches since it's a PR feature and
221 214 # it is then a preview mode
@@ -231,10 +224,8 b' class TestCompareView(object):'
231 224 response = self.app.get(
232 225 route_path('repo_compare',
233 226 repo_name=orig.repo_name,
234 source_ref_type="rev",
235 source_ref="tip",
236 target_ref_type="rev",
237 target_ref="tip",
227 source_ref_type="rev", source_ref="tip",
228 target_ref_type="rev", target_ref="tip",
238 229 params=dict(merge='1', target_repo=fork.repo_name),
239 230 ),
240 231 status=302)
@@ -290,11 +281,9 b' class TestCompareView(object):'
290 281 response = self.app.get(
291 282 route_path('repo_compare',
292 283 repo_name=repo2.repo_name,
293 source_ref_type="rev",
294 284 # parent of commit2, in target repo2
295 source_ref=commit1.raw_id,
296 target_ref_type="rev",
297 target_ref=commit4.raw_id,
285 source_ref_type="rev", source_ref=commit1.raw_id,
286 target_ref_type="rev", target_ref=commit4.raw_id,
298 287 params=dict(merge='1', target_repo=repo1.repo_name),
299 288 ))
300 289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
@@ -304,9 +293,8 b' class TestCompareView(object):'
304 293 compare_page = ComparePage(response)
305 294 compare_page.contains_change_summary(1, 3, 0)
306 295 compare_page.contains_commits([commit2, commit3, commit4])
307 compare_page.contains_file_links_and_anchors([
308 ('file1', 'a_c--826e8142e6ba'),
309 ])
296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
310 298
311 299 @pytest.mark.xfail_backends("svn")
312 300 def test_compare_cherry_pick_commits_from_top(self, backend):
@@ -356,13 +344,10 b' class TestCompareView(object):'
356 344 response = self.app.get(
357 345 route_path('repo_compare',
358 346 repo_name=repo1.repo_name,
359 source_ref_type="rev",
360 347 # parent of commit3, not in source repo2
361 source_ref=commit2.raw_id,
362 target_ref_type="rev",
363 target_ref=commit5.raw_id,
364 params=dict(merge='1'),
365 ))
348 source_ref_type="rev", source_ref=commit2.raw_id,
349 target_ref_type="rev", target_ref=commit5.raw_id,
350 params=dict(merge='1'),))
366 351
367 352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
368 353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
@@ -372,9 +357,8 b' class TestCompareView(object):'
372 357 compare_page.contains_commits([commit3, commit4, commit5])
373 358
374 359 # files
375 compare_page.contains_file_links_and_anchors([
376 ('file1', 'a_c--826e8142e6ba'),
377 ])
360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
378 362
379 363 @pytest.mark.xfail_backends("svn")
380 364 def test_compare_remote_branches(self, backend):
@@ -382,15 +366,15 b' class TestCompareView(object):'
382 366 repo2 = backend.create_fork()
383 367
384 368 commit_id1 = repo1.get_commit(commit_idx=3).raw_id
369 commit_id1_short = repo1.get_commit(commit_idx=3).short_id
385 370 commit_id2 = repo1.get_commit(commit_idx=6).raw_id
371 commit_id2_short = repo1.get_commit(commit_idx=6).short_id
386 372
387 373 response = self.app.get(
388 374 route_path('repo_compare',
389 375 repo_name=repo1.repo_name,
390 source_ref_type="rev",
391 source_ref=commit_id1,
392 target_ref_type="rev",
393 target_ref=commit_id2,
376 source_ref_type="rev", source_ref=commit_id1,
377 target_ref_type="rev", target_ref=commit_id2,
394 378 params=dict(merge='1', target_repo=repo2.repo_name),
395 379 ))
396 380
@@ -405,9 +389,9 b' class TestCompareView(object):'
405 389
406 390 # files
407 391 compare_page.contains_file_links_and_anchors([
408 ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'),
409 ('vcs/backends/__init__.py', 'a_c--41b41c1f2796'),
410 ('vcs/backends/base.py', 'a_c--2f574d260608'),
392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
411 395 ])
412 396
413 397 @pytest.mark.xfail_backends("svn")
@@ -452,10 +436,8 b' class TestCompareView(object):'
452 436 response = self.app.get(
453 437 route_path('repo_compare',
454 438 repo_name=r2_name,
455 source_ref_type="branch",
456 source_ref=commit_id1,
457 target_ref_type="branch",
458 target_ref=commit_id2,
439 source_ref_type="branch", source_ref=commit_id1,
440 target_ref_type="branch", target_ref=commit_id2,
459 441 params=dict(merge='1', target_repo=r1_name),
460 442 ))
461 443
@@ -473,10 +455,8 b' class TestCompareView(object):'
473 455 response = self.app.get(
474 456 route_path('repo_compare',
475 457 repo_name=r2_name,
476 source_ref_type="branch",
477 source_ref=commit_id1,
478 target_ref_type="branch",
479 target_ref=commit_id2,
458 source_ref_type="branch", source_ref=commit_id1,
459 target_ref_type="branch", target_ref=commit_id2,
480 460 params=dict(merge='1', target_repo=r1_name),
481 461 ))
482 462
@@ -496,10 +476,8 b' class TestCompareView(object):'
496 476 response = self.app.get(
497 477 route_path('repo_compare',
498 478 repo_name=backend.repo_name,
499 source_ref_type="rev",
500 source_ref=commit0.raw_id,
501 target_ref_type="rev",
502 target_ref=commit1.raw_id,
479 source_ref_type="rev", source_ref=commit0.raw_id,
480 target_ref_type="rev", target_ref=commit1.raw_id,
503 481 params=dict(merge='1')
504 482 ),
505 483 extra_environ=xhr_header,)
@@ -515,10 +493,8 b' class TestCompareView(object):'
515 493 response = self.app.get(
516 494 route_path('repo_compare',
517 495 repo_name=badrepo,
518 source_ref_type="rev",
519 source_ref='tip',
520 target_ref_type="rev",
521 target_ref='tip',
496 source_ref_type="rev", source_ref='tip',
497 target_ref_type="rev", target_ref='tip',
522 498 params=dict(merge='1', target_repo=repo.repo_name)
523 499 ),
524 500 status=404)
@@ -530,10 +506,8 b' class TestCompareView(object):'
530 506 response = self.app.get(
531 507 route_path('repo_compare',
532 508 repo_name=repo.repo_name,
533 source_ref_type="rev",
534 source_ref='tip',
535 target_ref_type="rev",
536 target_ref='tip',
509 source_ref_type="rev", source_ref='tip',
510 target_ref_type="rev", target_ref='tip',
537 511 params=dict(merge='1', target_repo=badrepo),
538 512 ),
539 513 status=302)
@@ -548,10 +522,8 b' class TestCompareView(object):'
548 522 response = self.app.get(
549 523 route_path('repo_compare',
550 524 repo_name=backend_stub.repo_name,
551 source_ref_type="rev",
552 source_ref=commit0.raw_id,
553 target_ref_type="rev",
554 target_ref=commit1.raw_id,
525 source_ref_type="rev", source_ref=commit0.raw_id,
526 target_ref_type="rev", target_ref=commit1.raw_id,
555 527 ))
556 528
557 529 # outgoing commits between those commits
@@ -576,10 +548,8 b' class TestCompareView(object):'
576 548 response = self.app.get(
577 549 route_path('repo_compare',
578 550 repo_name=orig.repo_name,
579 source_ref_type="rev",
580 source_ref="tip",
581 target_ref_type="rev",
582 target_ref="tip",
551 source_ref_type="rev", source_ref="tip",
552 target_ref_type="rev", target_ref="tip",
583 553 params=dict(merge='1', target_repo=fork.repo_name),
584 554 ),
585 555 status=302)
@@ -648,7 +618,7 b' class ComparePage(AssertResponse):'
648 618 for filename, file_id in files:
649 619 self.contains_one_anchor(file_id)
650 620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
651 assert len(diffblock) == 1
621 assert len(diffblock) == 2
652 622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
653 623
654 624 def contains_change_summary(self, files_changed, inserted, deleted):
@@ -694,4 +664,3 b' class ComparePage(AssertResponse):'
694 664 def target_source_are_enabled(self):
695 665 response = self.response
696 666 response.mustcontain("var enable_fields = true;")
697
@@ -47,10 +47,8 b' class TestCompareView(object):'
47 47 route_path(
48 48 'repo_compare',
49 49 repo_name=backend.repo_name,
50 source_ref_type="tag",
51 source_ref=tag1,
52 target_ref_type="tag",
53 target_ref=tag2),
50 source_ref_type="tag", source_ref=tag1,
51 target_ref_type="tag", target_ref=tag2),
54 52 status=200)
55 53
56 54 response.mustcontain('%s@%s' % (backend.repo_name, tag1))
@@ -69,18 +67,28 b' class TestCompareView(object):'
69 67 compare_page.contains_commits(commits)
70 68
71 69 # files diff
70 short_id = short_id_new = ''
71 if backend.alias == 'git':
72 short_id = '5a3a8fb00555'
73 short_id_new = '0ba5f8a46600'
74 if backend.alias == 'hg':
75 short_id = '17544fbfcd33'
76 short_id_new = 'a7e60bff65d5'
77
72 78 compare_page.contains_file_links_and_anchors([
73 ('docs/api/utils/index.rst', 'a_c--1c5cf9e91c12'),
74 ('test_and_report.sh', 'a_c--e3305437df55'),
75 ('.hgignore', 'a_c--c8e92ef85cd1'),
76 ('.hgtags', 'a_c--6e08b694d687'),
77 ('docs/api/index.rst', 'a_c--2c14b00f3393'),
78 ('vcs/__init__.py', 'a_c--430ccbc82bdf'),
79 ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'),
80 ('vcs/utils/__init__.py', 'a_c--ebb592c595c0'),
81 ('vcs/utils/annotate.py', 'a_c--7abc741b5052'),
82 ('vcs/utils/diffs.py', 'a_c--2ef0ef106c56'),
83 ('vcs/utils/lazy.py', 'a_c--3150cb87d4b7'),
79 # modified
80 ('docs/api/utils/index.rst', 'a_c-{}-1c5cf9e91c12'.format(short_id)),
81 ('test_and_report.sh', 'a_c-{}-e3305437df55'.format(short_id)),
82 # added
83 ('.hgignore', 'a_c-{}-c8e92ef85cd1'.format(short_id_new)),
84 ('.hgtags', 'a_c-{}-6e08b694d687'.format(short_id_new)),
85 ('docs/api/index.rst', 'a_c-{}-2c14b00f3393'.format(short_id_new)),
86 ('vcs/__init__.py', 'a_c-{}-430ccbc82bdf'.format(short_id_new)),
87 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(short_id_new)),
88 ('vcs/utils/__init__.py', 'a_c-{}-ebb592c595c0'.format(short_id_new)),
89 ('vcs/utils/annotate.py', 'a_c-{}-7abc741b5052'.format(short_id_new)),
90 ('vcs/utils/diffs.py', 'a_c-{}-2ef0ef106c56'.format(short_id_new)),
91 ('vcs/utils/lazy.py', 'a_c-{}-3150cb87d4b7'.format(short_id_new)),
84 92 ])
85 93
86 94 @pytest.mark.xfail_backends("svn", msg="Depends on branch and tag support")
@@ -106,10 +114,8 b' class TestCompareView(object):'
106 114 route_path(
107 115 'repo_compare',
108 116 repo_name=backend.repo_name,
109 source_ref_type='branch',
110 source_ref=data['branch'],
111 target_ref_type="tag",
112 target_ref=data['tag'],
117 source_ref_type='branch', source_ref=data['branch'],
118 target_ref_type="tag", target_ref=data['tag'],
113 119 ))
114 120
115 121 response.mustcontain('%s@%s' % (backend.repo_name, data['branch']))
@@ -123,10 +129,8 b' class TestCompareView(object):'
123 129 route_path(
124 130 'repo_compare',
125 131 repo_name=backend.repo_name,
126 source_ref_type="branch",
127 source_ref=head_id,
128 target_ref_type="branch",
129 target_ref=head_id,
132 source_ref_type="branch", source_ref=head_id,
133 target_ref_type="branch", target_ref=head_id,
130 134 ))
131 135
132 136 response.mustcontain('%s@%s' % (backend.repo_name, head_id))
@@ -138,16 +142,16 b' class TestCompareView(object):'
138 142 def test_compare_commits(self, backend):
139 143 repo = backend.repo
140 144 commit1 = repo.get_commit(commit_idx=0)
145 commit1_short_id = commit1.short_id
141 146 commit2 = repo.get_commit(commit_idx=1)
147 commit2_short_id = commit2.short_id
142 148
143 149 response = self.app.get(
144 150 route_path(
145 151 'repo_compare',
146 152 repo_name=backend.repo_name,
147 source_ref_type="rev",
148 source_ref=commit1.raw_id,
149 target_ref_type="rev",
150 target_ref=commit2.raw_id,
153 source_ref_type="rev", source_ref=commit1.raw_id,
154 target_ref_type="rev", target_ref=commit2.raw_id,
151 155 ))
152 156 response.mustcontain('%s@%s' % (backend.repo_name, commit1.raw_id))
153 157 response.mustcontain('%s@%s' % (backend.repo_name, commit2.raw_id))
@@ -158,6 +162,6 b' class TestCompareView(object):'
158 162
159 163 # outgoing commits between those commits
160 164 compare_page.contains_commits([commit2])
161 compare_page.contains_file_links_and_anchors([
162 ('.hgignore', 'a_c--c8e92ef85cd1'),
163 ])
165 anchor = 'a_c-{}-c8e92ef85cd1'.format(commit2_short_id)
166 response.mustcontain(anchor)
167 compare_page.contains_file_links_and_anchors([('.hgignore', anchor),])
@@ -303,6 +303,27 b' class TestRepoForkViewTests(TestControll'
303 303 assert response.json == {u'data': [], u'draw': None,
304 304 u'recordsFiltered': 0, u'recordsTotal': 0}
305 305
306 @pytest.mark.parametrize('url_type', [
307 'repo_fork_new',
308 'repo_fork_create'
309 ])
310 def test_fork_is_forbidden_on_archived_repo(self, backend, xhr_header, user_util, url_type):
311 user = user_util.create_user(password='qweqwe')
312 self.log_user(user.username, 'qweqwe')
313
314 # create a temporary repo
315 source = user_util.create_repo(repo_type=backend.alias)
316 repo_name = source.repo_name
317 repo = Repository.get_by_repo_name(repo_name)
318 repo.archived = True
319 Session().commit()
320
321 response = self.app.get(
322 route_path(url_type, repo_name=repo_name), status=302)
323
324 msg = 'Action not supported for archived repository.'
325 assert_session_flash(response, msg)
326
306 327
307 328 class TestSVNFork(TestController):
308 329 @pytest.mark.parametrize('route_name', [
@@ -26,7 +26,7 b' from rhodecode.lib.vcs.nodes import File'
26 26 from rhodecode.lib import helpers as h
27 27 from rhodecode.model.changeset_status import ChangesetStatusModel
28 28 from rhodecode.model.db import (
29 PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment)
29 PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment, Repository)
30 30 from rhodecode.model.meta import Session
31 31 from rhodecode.model.pull_request import PullRequestModel
32 32 from rhodecode.model.user import UserModel
@@ -81,20 +81,21 b' class TestPullrequestsView(object):'
81 81 repo = backend.repo
82 82
83 83 self.app.get(
84 route_path('pullrequest_new',
85 repo_name=repo.repo_name,
84 route_path('pullrequest_new', repo_name=repo.repo_name,
86 85 commit=repo.get_commit().raw_id),
87 86 status=200)
88 87
89 88 @pytest.mark.parametrize('pr_merge_enabled', [True, False])
90 def test_show(self, pr_util, pr_merge_enabled):
89 @pytest.mark.parametrize('range_diff', ["0", "1"])
90 def test_show(self, pr_util, pr_merge_enabled, range_diff):
91 91 pull_request = pr_util.create_pull_request(
92 92 mergeable=pr_merge_enabled, enable_notifications=False)
93 93
94 94 response = self.app.get(route_path(
95 95 'pullrequest_show',
96 96 repo_name=pull_request.target_repo.scm_instance().name,
97 pull_request_id=pull_request.pull_request_id))
97 pull_request_id=pull_request.pull_request_id,
98 params={'range-diff': range_diff}))
98 99
99 100 for commit_id in pull_request.revisions:
100 101 response.mustcontain(commit_id)
@@ -105,9 +106,13 b' class TestPullrequestsView(object):'
105 106 assert target_clone_url in response
106 107
107 108 assert 'class="pull-request-merge"' in response
108 assert (
109 'Server-side pull request merging is disabled.'
110 in response) != pr_merge_enabled
109 if pr_merge_enabled:
110 response.mustcontain('Pull request reviewer approval is pending')
111 else:
112 response.mustcontain('Server-side pull request merging is disabled.')
113
114 if range_diff == "1":
115 response.mustcontain('Turn off: Show the diff as commit range')
111 116
112 117 def test_close_status_visibility(self, pr_util, user_util, csrf_token):
113 118 # Logout
@@ -573,11 +578,11 b' class TestPullrequestsView(object):'
573 578 assert actions[-1].action_data['commit_ids'] == pr_commit_ids
574 579
575 580 # Check post_push rcextension was really executed
576 push_calls = rhodecode.EXTENSIONS.calls['post_push']
581 push_calls = rhodecode.EXTENSIONS.calls['_push_hook']
577 582 assert len(push_calls) == 1
578 583 unused_last_call_args, last_call_kwargs = push_calls[0]
579 584 assert last_call_kwargs['action'] == 'push'
580 assert last_call_kwargs['pushed_revs'] == pr_commit_ids
585 assert last_call_kwargs['commit_ids'] == pr_commit_ids
581 586
582 587 def test_merge_pull_request_disabled(self, pr_util, csrf_token):
583 588 pull_request = pr_util.create_pull_request(mergeable=False)
@@ -1191,6 +1196,28 b' class TestPullrequestsControllerDelete(o'
1191 1196 )
1192 1197 assert response.body == 'true'
1193 1198
1199 @pytest.mark.parametrize('url_type', [
1200 'pullrequest_new',
1201 'pullrequest_create',
1202 'pullrequest_update',
1203 'pullrequest_merge',
1204 ])
1205 def test_pull_request_is_forbidden_on_archived_repo(
1206 self, autologin_user, backend, xhr_header, user_util, url_type):
1207
1208 # create a temporary repo
1209 source = user_util.create_repo(repo_type=backend.alias)
1210 repo_name = source.repo_name
1211 repo = Repository.get_by_repo_name(repo_name)
1212 repo.archived = True
1213 Session().commit()
1214
1215 response = self.app.get(
1216 route_path(url_type, repo_name=repo_name, pull_request_id=1), status=302)
1217
1218 msg = 'Action not supported for archived repository.'
1219 assert_session_flash(response, msg)
1220
1194 1221
1195 1222 def assert_pull_request_status(pull_request, expected_status):
1196 1223 status = ChangesetStatusModel().calculated_review_status(
@@ -39,6 +39,7 b' def route_path(name, params=None, **kwar'
39 39 'repo_summary': '/{repo_name}',
40 40 'edit_repo_advanced': '/{repo_name}/settings/advanced',
41 41 'edit_repo_advanced_delete': '/{repo_name}/settings/advanced/delete',
42 'edit_repo_advanced_archive': '/{repo_name}/settings/advanced/archive',
42 43 'edit_repo_advanced_fork': '/{repo_name}/settings/advanced/fork',
43 44 'edit_repo_advanced_locking': '/{repo_name}/settings/advanced/locking',
44 45 'edit_repo_advanced_journal': '/{repo_name}/settings/advanced/journal',
@@ -133,7 +134,7 b' class TestAdminRepoSettingsAdvanced(obje'
133 134 "suffix",
134 135 ['', u'ąęł' , '123'],
135 136 ids=no_newline_id_generator)
136 def test_advanced_delete(self, autologin_user, backend, suffix, csrf_token):
137 def test_advanced_repo_delete(self, autologin_user, backend, suffix, csrf_token):
137 138 repo = backend.create_repo(name_suffix=suffix)
138 139 repo_name = repo.repo_name
139 140 repo_name_str = safe_str(repo.repo_name)
@@ -148,3 +149,25 b' class TestAdminRepoSettingsAdvanced(obje'
148 149 # check if repo was deleted from db
149 150 assert RepoModel().get_by_repo_name(repo_name) is None
150 151 assert not repo_on_filesystem(repo_name_str)
152
153 @pytest.mark.parametrize(
154 "suffix",
155 ['', u'ąęł' , '123'],
156 ids=no_newline_id_generator)
157 def test_advanced_repo_archive(self, autologin_user, backend, suffix, csrf_token):
158 repo = backend.create_repo(name_suffix=suffix)
159 repo_name = repo.repo_name
160 repo_name_str = safe_str(repo.repo_name)
161
162 response = self.app.post(
163 route_path('edit_repo_advanced_archive', repo_name=repo_name_str),
164 params={'csrf_token': csrf_token})
165
166 assert_session_flash(response,
167 u'Archived repository `{}`'.format(repo_name))
168
169 response = self.app.get(route_path('repo_summary', repo_name=repo_name_str))
170 response.mustcontain('This repository has been archived. It is now read-only.')
171
172 # check if repo was deleted from db
173 assert RepoModel().get_by_repo_name(repo_name).archived is True
@@ -34,7 +34,9 b' from rhodecode.lib.auth import ('
34 34 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
35 35
36 36 from rhodecode.lib.compat import OrderedDict
37 from rhodecode.lib.diffs import cache_diff, load_cached_diff, diff_cache_exist
37 from rhodecode.lib.diffs import (
38 cache_diff, load_cached_diff, diff_cache_exist, get_diff_context,
39 get_diff_whitespace_flag)
38 40 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 41 import rhodecode.lib.helpers as h
40 42 from rhodecode.lib.utils2 import safe_unicode, str2bool
@@ -55,96 +57,8 b' def _update_with_GET(params, request):'
55 57 params[k] += request.GET.getall(k)
56 58
57 59
58 def get_ignore_ws(fid, request):
59 ig_ws_global = request.GET.get('ignorews')
60 ig_ws = filter(lambda k: k.startswith('WS'), request.GET.getall(fid))
61 if ig_ws:
62 try:
63 return int(ig_ws[0].split(':')[-1])
64 except Exception:
65 pass
66 return ig_ws_global
67 60
68 61
69 def _ignorews_url(request, fileid=None):
70 _ = request.translate
71 fileid = str(fileid) if fileid else None
72 params = collections.defaultdict(list)
73 _update_with_GET(params, request)
74 label = _('Show whitespace')
75 tooltiplbl = _('Show whitespace for all diffs')
76 ig_ws = get_ignore_ws(fileid, request)
77 ln_ctx = get_line_ctx(fileid, request)
78
79 if ig_ws is None:
80 params['ignorews'] += [1]
81 label = _('Ignore whitespace')
82 tooltiplbl = _('Ignore whitespace for all diffs')
83 ctx_key = 'context'
84 ctx_val = ln_ctx
85
86 # if we have passed in ln_ctx pass it along to our params
87 if ln_ctx:
88 params[ctx_key] += [ctx_val]
89
90 if fileid:
91 params['anchor'] = 'a_' + fileid
92 return h.link_to(label, request.current_route_path(_query=params),
93 title=tooltiplbl, class_='tooltip')
94
95
96 def get_line_ctx(fid, request):
97 ln_ctx_global = request.GET.get('context')
98 if fid:
99 ln_ctx = filter(lambda k: k.startswith('C'), request.GET.getall(fid))
100 else:
101 _ln_ctx = filter(lambda k: k.startswith('C'), request.GET)
102 ln_ctx = request.GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
103 if ln_ctx:
104 ln_ctx = [ln_ctx]
105
106 if ln_ctx:
107 retval = ln_ctx[0].split(':')[-1]
108 else:
109 retval = ln_ctx_global
110
111 try:
112 return int(retval)
113 except Exception:
114 return 3
115
116
117 def _context_url(request, fileid=None):
118 """
119 Generates a url for context lines.
120
121 :param fileid:
122 """
123
124 _ = request.translate
125 fileid = str(fileid) if fileid else None
126 ig_ws = get_ignore_ws(fileid, request)
127 ln_ctx = (get_line_ctx(fileid, request) or 3) * 2
128
129 params = collections.defaultdict(list)
130 _update_with_GET(params, request)
131
132 if ln_ctx > 0:
133 params['context'] += [ln_ctx]
134
135 if ig_ws:
136 ig_ws_key = 'ignorews'
137 ig_ws_val = 1
138 params[ig_ws_key] += [ig_ws_val]
139
140 lbl = _('Increase context')
141 tooltiplbl = _('Increase context for all diffs')
142
143 if fileid:
144 params['anchor'] = 'a_' + fileid
145 return h.link_to(lbl, request.current_route_path(_query=params),
146 title=tooltiplbl, class_='tooltip')
147
148 62
149 63 class RepoCommitsView(RepoAppView):
150 64 def load_default_context(self):
@@ -162,13 +76,11 b' class RepoCommitsView(RepoAppView):'
162 76 def _commit(self, commit_id_range, method):
163 77 _ = self.request.translate
164 78 c = self.load_default_context()
165 c.ignorews_url = _ignorews_url
166 c.context_url = _context_url
167 79 c.fulldiff = self.request.GET.get('fulldiff')
168 80
169 81 # fetch global flags of ignore ws or context lines
170 context_lcl = get_line_ctx('', self.request)
171 ign_whitespace_lcl = get_ignore_ws('', self.request)
82 diff_context = get_diff_context(self.request)
83 hide_whitespace_changes = get_diff_whitespace_flag(self.request)
172 84
173 85 # diff_limit will cut off the whole diff if the limit is applied
174 86 # otherwise it will just hide the big files from the front-end
@@ -245,7 +157,7 b' class RepoCommitsView(RepoAppView):'
245 157 c.changes[commit.raw_id] = []
246 158
247 159 commit2 = commit
248 commit1 = commit.parents[0] if commit.parents else EmptyCommit()
160 commit1 = commit.first_parent
249 161
250 162 if method == 'show':
251 163 inline_comments = CommentsModel().get_inline_comments(
@@ -258,7 +170,7 b' class RepoCommitsView(RepoAppView):'
258 170 self.db_repo)
259 171 cache_file_path = diff_cache_exist(
260 172 cache_path, 'diff', commit.raw_id,
261 ign_whitespace_lcl, context_lcl, c.fulldiff)
173 hide_whitespace_changes, diff_context, c.fulldiff)
262 174
263 175 caching_enabled = self._is_diff_cache_enabled(self.db_repo)
264 176 force_recache = str2bool(self.request.GET.get('force_recache'))
@@ -273,8 +185,8 b' class RepoCommitsView(RepoAppView):'
273 185 else:
274 186 vcs_diff = self.rhodecode_vcs_repo.get_diff(
275 187 commit1, commit2,
276 ignore_whitespace=ign_whitespace_lcl,
277 context=context_lcl)
188 ignore_whitespace=hide_whitespace_changes,
189 context=diff_context)
278 190
279 191 diff_processor = diffs.DiffProcessor(
280 192 vcs_diff, format='newdiff', diff_limit=diff_limit,
@@ -300,7 +212,7 b' class RepoCommitsView(RepoAppView):'
300 212 # TODO(marcink): no cache usage here...
301 213 _diff = self.rhodecode_vcs_repo.get_diff(
302 214 commit1, commit2,
303 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
215 ignore_whitespace=hide_whitespace_changes, context=diff_context)
304 216 diff_processor = diffs.DiffProcessor(
305 217 _diff, format='newdiff', diff_limit=diff_limit,
306 218 file_limit=file_limit, show_full_diff=c.fulldiff)
@@ -44,10 +44,7 b' log = logging.getLogger(__name__)'
44 44 class RepoCompareView(RepoAppView):
45 45 def load_default_context(self):
46 46 c = self._get_local_tmpl_context(include_app_defaults=True)
47
48 47 c.rhodecode_repo = self.rhodecode_vcs_repo
49
50
51 48 return c
52 49
53 50 def _get_commit_or_redirect(
@@ -145,6 +142,10 b' class RepoCompareView(RepoAppView):'
145 142 # c.fulldiff disables cut_off_limit
146 143 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
147 144
145 # fetch global flags of ignore ws or context lines
146 diff_context = diffs.get_diff_context(self.request)
147 hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request)
148
148 149 c.file_path = target_path
149 150 c.commit_statuses = ChangesetStatus.STATUSES
150 151
@@ -256,8 +257,8 b' class RepoCompareView(RepoAppView):'
256 257 # case we want a simple diff without incoming commits,
257 258 # previewing what will be merged.
258 259 # Make the diff on target repo (which is known to have target_ref)
259 log.debug('Using ancestor %s as source_ref instead of %s'
260 % (c.ancestor, source_ref))
260 log.debug('Using ancestor %s as source_ref instead of %s',
261 c.ancestor, source_ref)
261 262 source_repo = target_repo
262 263 source_commit = target_repo.get_commit(commit_id=c.ancestor)
263 264
@@ -288,7 +289,8 b' class RepoCompareView(RepoAppView):'
288 289
289 290 txt_diff = source_repo.scm_instance().get_diff(
290 291 commit1=source_commit, commit2=target_commit,
291 path=target_path, path1=source_path)
292 path=target_path, path1=source_path,
293 ignore_whitespace=hide_whitespace_changes, context=diff_context)
292 294
293 295 diff_processor = diffs.DiffProcessor(
294 296 txt_diff, format='newdiff', diff_limit=diff_limit,
@@ -298,6 +300,7 b' class RepoCompareView(RepoAppView):'
298 300 diffset = codeblocks.DiffSet(
299 301 repo_name=source_repo.repo_name,
300 302 source_node_getter=codeblocks.diffset_node_getter(source_commit),
303 target_repo_name=self.db_repo_name,
301 304 target_node_getter=codeblocks.diffset_node_getter(target_commit),
302 305 )
303 306 c.diffset = self.path_filter.render_patchset_filtered(
@@ -29,6 +29,8 b' from rhodecode.lib import helpers as h'
29 29 from rhodecode.lib import audit_logger
30 30 from rhodecode.lib.auth import (
31 31 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
33 from rhodecode.model.db import UserGroup
32 34 from rhodecode.model.forms import RepoPermsForm
33 35 from rhodecode.model.meta import Session
34 36 from rhodecode.model.repo import RepoModel
@@ -88,6 +90,11 b' class RepoSettingsPermissionsView(RepoAp'
88 90 for change in changes['added'] + changes['updated'] + changes['deleted']:
89 91 if change['type'] == 'user':
90 92 affected_user_ids.append(change['id'])
93 if change['type'] == 'user_group':
94 user_group = UserGroup.get(safe_int(change['id']))
95 if user_group:
96 group_members_ids = [x.user_id for x in user_group.members]
97 affected_user_ids.extend(group_members_ids)
91 98
92 99 events.trigger(events.UserPermissionsChange(affected_user_ids))
93 100
@@ -138,6 +138,13 b' class RepoPullRequestsView(RepoAppView, '
138 138 })
139 139 return data
140 140
141 def get_recache_flag(self):
142 for flag_name in ['force_recache', 'force-recache', 'no-cache']:
143 flag_val = self.request.GET.get(flag_name)
144 if str2bool(flag_val):
145 return True
146 return False
147
141 148 @LoginRequired()
142 149 @HasRepoPermissionAnyDecorator(
143 150 'repository.read', 'repository.write', 'repository.admin')
@@ -212,10 +219,11 b' class RepoPullRequestsView(RepoAppView, '
212 219 def _get_diffset(self, source_repo_name, source_repo,
213 220 source_ref_id, target_ref_id,
214 221 target_commit, source_commit, diff_limit, file_limit,
215 fulldiff):
222 fulldiff, hide_whitespace_changes, diff_context):
216 223
217 224 vcs_diff = PullRequestModel().get_diff(
218 source_repo, source_ref_id, target_ref_id)
225 source_repo, source_ref_id, target_ref_id,
226 hide_whitespace_changes, diff_context)
219 227
220 228 diff_processor = diffs.DiffProcessor(
221 229 vcs_diff, format='newdiff', diff_limit=diff_limit,
@@ -234,6 +242,30 b' class RepoPullRequestsView(RepoAppView, '
234 242
235 243 return diffset
236 244
245 def _get_range_diffset(self, source_scm, source_repo,
246 commit1, commit2, diff_limit, file_limit,
247 fulldiff, hide_whitespace_changes, diff_context):
248 vcs_diff = source_scm.get_diff(
249 commit1, commit2,
250 ignore_whitespace=hide_whitespace_changes,
251 context=diff_context)
252
253 diff_processor = diffs.DiffProcessor(
254 vcs_diff, format='newdiff', diff_limit=diff_limit,
255 file_limit=file_limit, show_full_diff=fulldiff)
256
257 _parsed = diff_processor.prepare()
258
259 diffset = codeblocks.DiffSet(
260 repo_name=source_repo.repo_name,
261 source_node_getter=codeblocks.diffset_node_getter(commit1),
262 target_node_getter=codeblocks.diffset_node_getter(commit2))
263
264 diffset = self.path_filter.render_patchset_filtered(
265 diffset, _parsed, commit1.raw_id, commit2.raw_id)
266
267 return diffset
268
237 269 @LoginRequired()
238 270 @HasRepoPermissionAnyDecorator(
239 271 'repository.read', 'repository.write', 'repository.admin')
@@ -249,6 +281,11 b' class RepoPullRequestsView(RepoAppView, '
249 281 from_version = self.request.GET.get('from_version') or version
250 282 merge_checks = self.request.GET.get('merge_checks')
251 283 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
284
285 # fetch global flags of ignore ws or context lines
286 diff_context = diffs.get_diff_context(self.request)
287 hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request)
288
252 289 force_refresh = str2bool(self.request.GET.get('force_refresh'))
253 290
254 291 (pull_request_latest,
@@ -265,6 +302,9 b' class RepoPullRequestsView(RepoAppView, '
265 302 pull_request_id=pull_request_id))
266 303
267 304 versions = pull_request_display_obj.versions()
305 # used to store per-commit range diffs
306 c.changes = collections.OrderedDict()
307 c.range_diff_on = self.request.GET.get('range-diff') == "1"
268 308
269 309 c.at_version = at_version
270 310 c.at_version_num = (at_version
@@ -453,14 +493,14 b' class RepoPullRequestsView(RepoAppView, '
453 493 version_normalized = version or 'latest'
454 494 from_version_normalized = from_version or 'latest'
455 495
456 cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(
457 target_repo)
496 cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(target_repo)
458 497 cache_file_path = diff_cache_exist(
459 498 cache_path, 'pull_request', pull_request_id, version_normalized,
460 from_version_normalized, source_ref_id, target_ref_id, c.fulldiff)
499 from_version_normalized, source_ref_id, target_ref_id,
500 hide_whitespace_changes, diff_context, c.fulldiff)
461 501
462 502 caching_enabled = self._is_diff_cache_enabled(c.target_repo)
463 force_recache = str2bool(self.request.GET.get('force_recache'))
503 force_recache = self.get_recache_flag()
464 504
465 505 cached_diff = None
466 506 if caching_enabled:
@@ -471,7 +511,8 b' class RepoPullRequestsView(RepoAppView, '
471 511 and len(cached_diff.get('commits', [])) == 5
472 512 and cached_diff.get('commits')[0]
473 513 and cached_diff.get('commits')[3])
474 if not force_recache and has_proper_commit_cache:
514
515 if not force_recache and not c.range_diff_on and has_proper_commit_cache:
475 516 diff_commit_cache = \
476 517 (ancestor_commit, commit_cache, missing_requirements,
477 518 source_commit, target_commit) = cached_diff['commits']
@@ -527,7 +568,8 b' class RepoPullRequestsView(RepoAppView, '
527 568 c.source_repo.repo_name, commits_source_repo,
528 569 source_ref_id, target_ref_id,
529 570 target_commit, source_commit,
530 diff_limit, file_limit, c.fulldiff)
571 diff_limit, file_limit, c.fulldiff,
572 hide_whitespace_changes, diff_context)
531 573
532 574 # save cached diff
533 575 if caching_enabled:
@@ -546,8 +588,41 b' class RepoPullRequestsView(RepoAppView, '
546 588 c.deleted_files_comments[fname]['stats'] = 0
547 589 c.deleted_files_comments[fname]['comments'] = list()
548 590 for lno, comments in per_line_comments.items():
549 c.deleted_files_comments[fname]['comments'].extend(
550 comments)
591 c.deleted_files_comments[fname]['comments'].extend(comments)
592
593 # maybe calculate the range diff
594 if c.range_diff_on:
595 # TODO(marcink): set whitespace/context
596 context_lcl = 3
597 ign_whitespace_lcl = False
598
599 for commit in c.commit_ranges:
600 commit2 = commit
601 commit1 = commit.first_parent
602
603 range_diff_cache_file_path = diff_cache_exist(
604 cache_path, 'diff', commit.raw_id,
605 ign_whitespace_lcl, context_lcl, c.fulldiff)
606
607 cached_diff = None
608 if caching_enabled:
609 cached_diff = load_cached_diff(range_diff_cache_file_path)
610
611 has_proper_diff_cache = cached_diff and cached_diff.get('diff')
612 if not force_recache and has_proper_diff_cache:
613 diffset = cached_diff['diff']
614 else:
615 diffset = self._get_range_diffset(
616 source_scm, source_repo,
617 commit1, commit2, diff_limit, file_limit,
618 c.fulldiff, ign_whitespace_lcl, context_lcl
619 )
620
621 # save cached diff
622 if caching_enabled:
623 cache_diff(range_diff_cache_file_path, diffset, None)
624
625 c.changes[commit.raw_id] = diffset
551 626
552 627 # this is a hack to properly display links, when creating PR, the
553 628 # compare view and others uses different notation, and
@@ -607,7 +682,7 b' class RepoPullRequestsView(RepoAppView, '
607 682 commit_cache = collections.OrderedDict()
608 683 missing_requirements = False
609 684 try:
610 pre_load = ["author", "branch", "date", "message"]
685 pre_load = ["author", "branch", "date", "message", "parents"]
611 686 show_revs = pull_request_at_ver.revisions
612 687 for rev in show_revs:
613 688 comm = commits_source_repo.get_commit(
@@ -23,13 +23,14 b' import logging'
23 23 from pyramid.view import view_config
24 24 from pyramid.httpexceptions import HTTPFound
25 25
26 from rhodecode import events
26 27 from rhodecode.apps._base import RepoAppView
27 28 from rhodecode.lib import helpers as h
28 29 from rhodecode.lib import audit_logger
29 30 from rhodecode.lib.auth import (
30 31 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired,
31 32 HasRepoPermissionAny)
32 from rhodecode.lib.exceptions import AttachedForksError
33 from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError
33 34 from rhodecode.lib.utils2 import safe_int
34 35 from rhodecode.lib.vcs import RepositoryError
35 36 from rhodecode.model.db import Session, UserFollowing, User, Repository
@@ -45,6 +46,13 b' class RepoSettingsView(RepoAppView):'
45 46 c = self._get_local_tmpl_context()
46 47 return c
47 48
49 def _get_users_with_permissions(self):
50 user_permissions = {}
51 for perm in self.db_repo.permissions():
52 user_permissions[perm.user_id] = perm
53
54 return user_permissions
55
48 56 @LoginRequired()
49 57 @HasRepoPermissionAnyDecorator('repository.admin')
50 58 @view_config(
@@ -71,6 +79,49 b' class RepoSettingsView(RepoAppView):'
71 79 @HasRepoPermissionAnyDecorator('repository.admin')
72 80 @CSRFRequired()
73 81 @view_config(
82 route_name='edit_repo_advanced_archive', request_method='POST',
83 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
84 def edit_advanced_archive(self):
85 """
86 Archives the repository. It will become read-only, and not visible in search
87 or other queries. But still visible for super-admins.
88 """
89
90 _ = self.request.translate
91
92 try:
93 old_data = self.db_repo.get_api_data()
94 RepoModel().archive(self.db_repo)
95
96 repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name)
97 audit_logger.store_web(
98 'repo.archive', action_data={'old_data': old_data},
99 user=self._rhodecode_user, repo=repo)
100
101 ScmModel().mark_for_invalidation(self.db_repo_name, delete=True)
102 h.flash(
103 _('Archived repository `%s`') % self.db_repo_name,
104 category='success')
105 Session().commit()
106 except Exception:
107 log.exception("Exception during archiving of repository")
108 h.flash(_('An error occurred during archiving of `%s`')
109 % self.db_repo_name, category='error')
110 # redirect to advanced for more deletion options
111 raise HTTPFound(
112 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name,
113 _anchor='advanced-archive'))
114
115 # flush permissions for all users defined in permissions
116 affected_user_ids = self._get_users_with_permissions().keys()
117 events.trigger(events.UserPermissionsChange(affected_user_ids))
118
119 raise HTTPFound(h.route_path('home'))
120
121 @LoginRequired()
122 @HasRepoPermissionAnyDecorator('repository.admin')
123 @CSRFRequired()
124 @view_config(
74 125 route_name='edit_repo_advanced_delete', request_method='POST',
75 126 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
76 127 def edit_advanced_delete(self):
@@ -80,22 +131,23 b' class RepoSettingsView(RepoAppView):'
80 131 """
81 132 _ = self.request.translate
82 133 handle_forks = self.request.POST.get('forks', None)
134 if handle_forks == 'detach_forks':
135 handle_forks = 'detach'
136 elif handle_forks == 'delete_forks':
137 handle_forks = 'delete'
83 138
84 139 try:
140 old_data = self.db_repo.get_api_data()
141 RepoModel().delete(self.db_repo, forks=handle_forks)
142
85 143 _forks = self.db_repo.forks.count()
86 144 if _forks and handle_forks:
87 145 if handle_forks == 'detach_forks':
88 handle_forks = 'detach'
89 146 h.flash(_('Detached %s forks') % _forks, category='success')
90 147 elif handle_forks == 'delete_forks':
91 handle_forks = 'delete'
92 148 h.flash(_('Deleted %s forks') % _forks, category='success')
93 149
94 old_data = self.db_repo.get_api_data()
95 RepoModel().delete(self.db_repo, forks=handle_forks)
96
97 repo = audit_logger.RepoWrap(repo_id=None,
98 repo_name=self.db_repo.repo_name)
150 repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name)
99 151 audit_logger.store_web(
100 152 'repo.delete', action_data={'old_data': old_data},
101 153 user=self._rhodecode_user, repo=repo)
@@ -118,6 +170,20 b' class RepoSettingsView(RepoAppView):'
118 170 # redirect to advanced for forks handle action ?
119 171 raise HTTPFound(repo_advanced_url)
120 172
173 except AttachedPullRequestsError:
174 repo_advanced_url = h.route_path(
175 'edit_repo_advanced', repo_name=self.db_repo_name,
176 _anchor='advanced-delete')
177 attached_prs = len(self.db_repo.pull_requests_source +
178 self.db_repo.pull_requests_target)
179 h.flash(
180 _('Cannot delete `{repo}` it still contains {num} attached pull requests. '
181 'Consider archiving the repository instead.').format(
182 repo=self.db_repo_name, num=attached_prs), category='warning')
183
184 # redirect to advanced for forks handle action ?
185 raise HTTPFound(repo_advanced_url)
186
121 187 except Exception:
122 188 log.exception("Exception during deletion of repository")
123 189 h.flash(_('An error occurred during deletion of `%s`')
@@ -65,7 +65,7 b' class StripView(RepoAppView):'
65 65 check = rp.get(chset)
66 66
67 67 if check:
68 data[i] = self.db_repo.get_changeset(rp[chset])
68 data[i] = self.db_repo.get_commit(rp[chset])
69 69 if isinstance(data[i], EmptyCommit):
70 70 data[i] = {'rev': None, 'commit': h.escape(rp[chset])}
71 71 else:
@@ -98,8 +98,8 b' class StripView(RepoAppView):'
98 98 ScmModel().strip(
99 99 repo=self.db_repo,
100 100 commit_id=commit['rev'], branch=commit['branch'])
101 log.info('Stripped commit %s from repo `%s` by %s' % (
102 commit['rev'], self.db_repo_name, user))
101 log.info('Stripped commit %s from repo `%s` by %s',
102 commit['rev'], self.db_repo_name, user)
103 103 data[commit['rev']] = True
104 104
105 105 audit_logger.store_web(
@@ -108,6 +108,6 b' class StripView(RepoAppView):'
108 108
109 109 except Exception as e:
110 110 data[commit['rev']] = False
111 log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s' % (
112 commit['rev'], self.db_repo_name, user, e.message))
111 log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s',
112 commit['rev'], self.db_repo_name, user, e.message)
113 113 return data
@@ -103,6 +103,7 b' class VcsServer(object):'
103 103 'repository': self.repo_name,
104 104 'scm': self.backend,
105 105 'config': self.ini_path,
106 'repo_store': self.store,
106 107 'make_lock': None,
107 108 'locked_by': [None, None],
108 109 'server_url': None,
@@ -41,8 +41,7 b' def dummy_conf_file(tmpdir):'
41 41 return os.path.join(f_path)
42 42
43 43
44 @pytest.fixture
45 def dummy_env():
44 def plain_dummy_env():
46 45 return {
47 46 'request':
48 47 AttributeDict(host_url='http://localhost', script_name='/')
@@ -50,8 +49,17 b' def dummy_env():'
50 49
51 50
52 51 @pytest.fixture
52 def dummy_env():
53 return plain_dummy_env()
54
55
56 def plain_dummy_user():
57 return AttributeDict(username='test_user')
58
59
60 @pytest.fixture
53 61 def dummy_user():
54 return AttributeDict(username='test_user')
62 return plain_dummy_user()
55 63
56 64
57 65 @pytest.fixture
@@ -23,7 +23,7 b' import mock'
23 23 import pytest
24 24
25 25 from rhodecode.apps.ssh_support.lib.backends.git import GitServer
26 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
26 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
27 27
28 28
29 29 class GitServerCreator(object):
@@ -37,7 +37,7 b' class GitServerCreator(object):'
37 37 }
38 38 repo_name = 'test_git'
39 39 repo_mode = 'receive-pack'
40 user = dummy_user()
40 user = plain_dummy_user()
41 41
42 42 def __init__(self):
43 43 def config_get(part, key):
@@ -56,7 +56,7 b' class GitServerCreator(object):'
56 56 self.repo_name: 'repository.admin'
57 57 },
58 58 'config': self.config_mock,
59 'env': dummy_env()
59 'env': plain_dummy_env()
60 60 }
61 61 parameters.update(kwargs)
62 62 server = GitServer(**parameters)
@@ -121,6 +121,8 b' class TestGitServer(object):'
121 121 ])
122 122 def test_update_environment(self, git_server, repo_mode, action):
123 123 server = git_server.create(repo_mode=repo_mode)
124 store = server.store
125
124 126 with mock.patch('os.environ', {'SSH_CLIENT': '10.10.10.10 b'}):
125 127 with mock.patch('os.putenv') as putenv_mock:
126 128 server.update_environment(action)
@@ -135,6 +137,7 b' class TestGitServer(object):'
135 137 'ip': '10.10.10.10',
136 138 'locked_by': [None, None],
137 139 'config': '',
140 'repo_store': store,
138 141 'server_url': None,
139 142 'hooks': ['push', 'pull'],
140 143 'is_shadow_repo': False,
@@ -22,7 +22,7 b' import mock'
22 22 import pytest
23 23
24 24 from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer
25 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
25 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
26 26
27 27
28 28 class MercurialServerCreator(object):
@@ -36,7 +36,7 b' class MercurialServerCreator(object):'
36 36 }
37 37 }
38 38 repo_name = 'test_hg'
39 user = dummy_user()
39 user = plain_dummy_user()
40 40
41 41 def __init__(self):
42 42 def config_get(part, key):
@@ -54,7 +54,7 b' class MercurialServerCreator(object):'
54 54 'test_hg': 'repository.admin'
55 55 },
56 56 'config': self.config_mock,
57 'env': dummy_env()
57 'env': plain_dummy_env()
58 58 }
59 59 parameters.update(kwargs)
60 60 server = MercurialServer(**parameters)
@@ -22,7 +22,7 b' import mock'
22 22 import pytest
23 23
24 24 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer
25 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
25 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
26 26
27 27
28 28 class SubversionServerCreator(object):
@@ -35,7 +35,7 b' class SubversionServerCreator(object):'
35 35 }
36 36 }
37 37 repo_name = 'test-svn'
38 user = dummy_user()
38 user = plain_dummy_user()
39 39
40 40 def __init__(self):
41 41 def config_get(part, key):
@@ -53,7 +53,7 b' class SubversionServerCreator(object):'
53 53 self.repo_name: 'repository.admin'
54 54 },
55 55 'config': self.config_mock,
56 'env': dummy_env()
56 'env': plain_dummy_env()
57 57 }
58 58
59 59 parameters.update(kwargs)
@@ -28,7 +28,7 b' class TestSSHWrapper(object):'
28 28 ssh_wrapper.serve(
29 29 vcs='microsoft-tfs', repo='test-repo', mode=None, user='test',
30 30 permissions={}, branch_permissions={})
31 assert exc_info.value.message == 'Unrecognised VCS: microsoft-tfs'
31 assert str(exc_info.value) == 'Unrecognised VCS: microsoft-tfs'
32 32
33 33 def test_parse_config(self, ssh_wrapper):
34 34 config = ssh_wrapper.parse_config(ssh_wrapper.ini_path)
@@ -40,8 +40,8 b' from rhodecode.apps._base import UserGro'
40 40 from rhodecode.lib.auth import (
41 41 LoginRequired, HasUserGroupPermissionAnyDecorator, CSRFRequired)
42 42 from rhodecode.lib import helpers as h, audit_logger
43 from rhodecode.lib.utils2 import str2bool
44 from rhodecode.model.db import User
43 from rhodecode.lib.utils2 import str2bool, safe_int
44 from rhodecode.model.db import User, UserGroup
45 45 from rhodecode.model.meta import Session
46 46 from rhodecode.model.user_group import UserGroupModel
47 47
@@ -377,6 +377,11 b' class UserGroupsView(UserGroupAppView):'
377 377 for change in changes['added'] + changes['updated'] + changes['deleted']:
378 378 if change['type'] == 'user':
379 379 affected_user_ids.append(change['id'])
380 if change['type'] == 'user_group':
381 user_group = UserGroup.get(safe_int(change['id']))
382 if user_group:
383 group_members_ids = [x.user_id for x in user_group.members]
384 affected_user_ids.extend(group_members_ids)
380 385
381 386 events.trigger(events.UserPermissionsChange(affected_user_ids))
382 387
@@ -241,16 +241,16 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
241 241 log.debug('Empty username or password skipping...')
242 242 return None
243 243
244 log.debug("Crowd settings: \n%s" % (formatted_json(settings)))
244 log.debug("Crowd settings: \n%s", formatted_json(settings))
245 245 server = CrowdServer(**settings)
246 246 server.set_credentials(settings["app_name"], settings["app_password"])
247 247 crowd_user = server.user_auth(username, password)
248 log.debug("Crowd returned: \n%s" % (formatted_json(crowd_user)))
248 log.debug("Crowd returned: \n%s", formatted_json(crowd_user))
249 249 if not crowd_user["status"]:
250 250 return None
251 251
252 252 res = server.user_groups(crowd_user["name"])
253 log.debug("Crowd groups: \n%s" % (formatted_json(res)))
253 log.debug("Crowd groups: \n%s", formatted_json(res))
254 254 crowd_user["groups"] = [x["name"] for x in res["groups"]]
255 255
256 256 # old attrs fetched from RhodeCode database
@@ -280,6 +280,6 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
280 280 for group in settings["admin_groups"]:
281 281 if group in user_attrs["groups"]:
282 282 user_attrs["admin"] = True
283 log.debug("Final crowd user object: \n%s" % (formatted_json(user_attrs)))
284 log.info('user `%s` authenticated correctly' % user_attrs['username'])
283 log.debug("Final crowd user object: \n%s", formatted_json(user_attrs))
284 log.info('user `%s` authenticated correctly', user_attrs['username'])
285 285 return user_attrs
@@ -125,24 +125,24 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
125 125 username = None
126 126 environ = environ or {}
127 127 if not environ:
128 log.debug('got empty environ: %s' % environ)
128 log.debug('got empty environ: %s', environ)
129 129
130 130 settings = settings or {}
131 131 if settings.get('header'):
132 132 header = settings.get('header')
133 133 username = environ.get(header)
134 log.debug('extracted %s:%s' % (header, username))
134 log.debug('extracted %s:%s', header, username)
135 135
136 136 # fallback mode
137 137 if not username and settings.get('fallback_header'):
138 138 header = settings.get('fallback_header')
139 139 username = environ.get(header)
140 log.debug('extracted %s:%s' % (header, username))
140 log.debug('extracted %s:%s', header, username)
141 141
142 142 if username and str2bool(settings.get('clean_username')):
143 log.debug('Received username `%s` from headers' % username)
143 log.debug('Received username `%s` from headers', username)
144 144 username = self._clean_username(username)
145 log.debug('New cleanup user is:%s' % username)
145 log.debug('New cleanup user is:%s', username)
146 146 return username
147 147
148 148 def get_user(self, username=None, **kwargs):
@@ -221,5 +221,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
221 221 'extern_type': extern_type,
222 222 }
223 223
224 log.info('user `%s` authenticated correctly' % user_attrs['username'])
224 log.info('user `%s` authenticated correctly', user_attrs['username'])
225 225 return user_attrs
@@ -134,10 +134,10 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
134 134 try:
135 135 response = urllib2.urlopen(request)
136 136 except urllib2.HTTPError as e:
137 log.debug("HTTPError when requesting Jasig CAS (status code: %d)" % e.code)
137 log.debug("HTTPError when requesting Jasig CAS (status code: %d)", e.code)
138 138 return None
139 139 except urllib2.URLError as e:
140 log.debug("URLError when requesting Jasig CAS url: %s " % url)
140 log.debug("URLError when requesting Jasig CAS url: %s ", url)
141 141 return None
142 142
143 143 # old attrs fetched from RhodeCode database
@@ -163,5 +163,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
163 163 'extern_type': extern_type,
164 164 }
165 165
166 log.info('user `%s` authenticated correctly' % user_attrs['username'])
166 log.info('user `%s` authenticated correctly', user_attrs['username'])
167 167 return user_attrs
@@ -115,10 +115,10 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
115 115 auth_result = _pam.authenticate(username, password, settings["service"])
116 116
117 117 if not auth_result:
118 log.error("PAM was unable to authenticate user: %s" % (username, ))
118 log.error("PAM was unable to authenticate user: %s", username)
119 119 return None
120 120
121 log.debug('Got PAM response %s' % (auth_result, ))
121 log.debug('Got PAM response %s', auth_result)
122 122
123 123 # old attrs fetched from RhodeCode database
124 124 default_email = "%s@%s" % (username, socket.gethostname())
@@ -157,5 +157,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
157 157 pass
158 158
159 159 log.debug("pamuser: %s", user_attrs)
160 log.info('user `%s` authenticated correctly' % user_attrs['username'])
160 log.info('user `%s` authenticated correctly', user_attrs['username'])
161 161 return user_attrs
@@ -87,12 +87,12 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
87 87
88 88 def auth(self, userobj, username, password, settings, **kwargs):
89 89 if not userobj:
90 log.debug('userobj was:%s skipping' % (userobj, ))
90 log.debug('userobj was:%s skipping', userobj)
91 91 return None
92 92 if userobj.extern_type != self.name:
93 93 log.warning(
94 "userobj:%s extern_type mismatch got:`%s` expected:`%s`" %
95 (userobj, userobj.extern_type, self.name))
94 "userobj:%s extern_type mismatch got:`%s` expected:`%s`",
95 userobj, userobj.extern_type, self.name)
96 96 return None
97 97
98 98 user_attrs = {
@@ -109,7 +109,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
109 109 "extern_type": userobj.extern_type,
110 110 }
111 111
112 log.debug("User attributes:%s" % (user_attrs, ))
112 log.debug("User attributes:%s", user_attrs)
113 113 if userobj.active:
114 114 from rhodecode.lib import auth
115 115 crypto_backend = auth.crypto_backend()
@@ -103,7 +103,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
103 103
104 104 def auth(self, userobj, username, password, settings, **kwargs):
105 105 if not userobj:
106 log.debug('userobj was:%s skipping' % (userobj, ))
106 log.debug('userobj was:%s skipping', userobj)
107 107 return None
108 108
109 109 user_attrs = {
This diff has been collapsed as it changes many lines, (2026 lines changed) Show them Hide them
@@ -1,369 +1,1901 b''
1 [
1 2 {
2 "libnghttp2-1.7.1": {
3 "MIT License": "http://spdx.org/licenses/MIT"
3 "license": [
4 {
5 "fullName": "Python Software Foundation License version 2",
6 "shortName": "psfl",
7 "spdxId": "Python-2.0",
8 "url": "http://spdx.org/licenses/Python-2.0.html"
9 },
10 {
11 "fullName": "Zope Public License 2.0",
12 "shortName": "zpl20",
13 "spdxId": "ZPL-2.0",
14 "url": "http://spdx.org/licenses/ZPL-2.0.html"
15 }
16 ],
17 "name": "python2.7-setuptools-38.4.0"
4 18 },
5 "nodejs-4.3.1": {
6 "MIT License": "http://spdx.org/licenses/MIT"
19 {
20 "license": {
21 "fullName": "Python Software Foundation License version 2",
22 "shortName": "psfl",
23 "spdxId": "Python-2.0",
24 "url": "http://spdx.org/licenses/Python-2.0.html"
25 },
26 "name": "python-2.7.15"
7 27 },
8 "python-2.7.12": {
9 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
28 {
29 "license": [
30 {
31 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
32 "shortName": "bsdOriginal",
33 "spdxId": "BSD-4-Clause",
34 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
35 }
36 ],
37 "name": "python2.7-coverage-3.7.1"
38 },
39 {
40 "license": [
41 {
42 "fullName": "MIT License",
43 "shortName": "mit",
44 "spdxId": "MIT",
45 "url": "http://spdx.org/licenses/MIT.html"
46 }
47 ],
48 "name": "python2.7-bootstrapped-pip-9.0.1"
10 49 },
11 "python2.7-Babel-1.3": {
12 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
50 {
51 "license": [
52 {
53 "fullName": "MIT License",
54 "shortName": "mit",
55 "spdxId": "MIT",
56 "url": "http://spdx.org/licenses/MIT.html"
57 }
58 ],
59 "name": "python2.7-cov-core-1.15.0"
13 60 },
14 "python2.7-Beaker-1.7.0": {
15 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
61 {
62 "license": [
63 {
64 "fullName": "MIT License",
65 "shortName": "mit",
66 "spdxId": "MIT",
67 "url": "http://spdx.org/licenses/MIT.html"
68 }
69 ],
70 "name": "python2.7-webtest-2.0.29"
71 },
72 {
73 "license": [
74 {
75 "fullName": "MIT License",
76 "shortName": "mit",
77 "spdxId": "MIT",
78 "url": "http://spdx.org/licenses/MIT.html"
79 }
80 ],
81 "name": "python2.7-beautifulsoup4-4.6.3"
16 82 },
17 "python2.7-Chameleon-2.24": {
18 "BSD-like": "http://repoze.org/license.html"
83 {
84 "license": [
85 {
86 "fullName": "Zope Public License 2.1",
87 "shortName": "zpl21",
88 "spdxId": "ZPL-2.1",
89 "url": "http://spdx.org/licenses/ZPL-2.1.html"
90 }
91 ],
92 "name": "python2.7-waitress-1.1.0"
19 93 },
20 "python2.7-FormEncode-1.2.4": {
21 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
94 {
95 "license": [
96 {
97 "fullName": "MIT License",
98 "shortName": "mit",
99 "spdxId": "MIT",
100 "url": "http://spdx.org/licenses/MIT.html"
101 }
102 ],
103 "name": "python2.7-webob-1.7.4"
104 },
105 {
106 "license": [
107 {
108 "fullName": "MIT License",
109 "shortName": "mit",
110 "spdxId": "MIT",
111 "url": "http://spdx.org/licenses/MIT.html"
112 }
113 ],
114 "name": "python2.7-six-1.11.0"
22 115 },
23 "python2.7-Jinja2-2.7.3": {
24 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
116 {
117 "license": [
118 {
119 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
120 "shortName": "bsdOriginal",
121 "spdxId": "BSD-4-Clause",
122 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
123 }
124 ],
125 "name": "python2.7-mock-1.0.1"
25 126 },
26 "python2.7-Mako-1.0.6": {
27 "MIT License": "http://spdx.org/licenses/MIT"
127 {
128 "license": [
129 {
130 "fullName": "MIT License",
131 "shortName": "mit",
132 "spdxId": "MIT",
133 "url": "http://spdx.org/licenses/MIT.html"
134 },
135 {
136 "fullName": "DFSG approved"
137 }
138 ],
139 "name": "python2.7-pytest-timeout-1.2.1"
28 140 },
29 "python2.7-Markdown-2.6.7": {
30 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
141 {
142 "license": [
143 {
144 "fullName": "MIT License",
145 "shortName": "mit",
146 "spdxId": "MIT",
147 "url": "http://spdx.org/licenses/MIT.html"
148 }
149 ],
150 "name": "python2.7-pytest-3.6.0"
31 151 },
32 "python2.7-MarkupSafe-0.23": {
33 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
152 {
153 "license": [
154 {
155 "fullName": "ASL"
156 },
157 {
158 "fullName": "Apache License 2.0",
159 "shortName": "asl20",
160 "spdxId": "Apache-2.0",
161 "url": "http://spdx.org/licenses/Apache-2.0.html"
162 }
163 ],
164 "name": "python2.7-funcsigs-1.0.2"
34 165 },
35 "python2.7-Paste-2.0.3": {
36 "MIT License": "http://spdx.org/licenses/MIT"
166 {
167 "license": [
168 {
169 "fullName": "MIT License",
170 "shortName": "mit",
171 "spdxId": "MIT",
172 "url": "http://spdx.org/licenses/MIT.html"
173 }
174 ],
175 "name": "python2.7-pluggy-0.6.0"
37 176 },
38 "python2.7-PasteDeploy-1.5.2": {
39 "MIT License": "http://spdx.org/licenses/MIT"
177 {
178 "license": [
179 {
180 "fullName": "MIT License",
181 "shortName": "mit",
182 "spdxId": "MIT",
183 "url": "http://spdx.org/licenses/MIT.html"
184 }
185 ],
186 "name": "python2.7-atomicwrites-1.1.5"
187 },
188 {
189 "license": [
190 {
191 "fullName": "MIT License",
192 "shortName": "mit",
193 "spdxId": "MIT",
194 "url": "http://spdx.org/licenses/MIT.html"
195 }
196 ],
197 "name": "python2.7-more-itertools-4.3.0"
40 198 },
41 "python2.7-PasteScript-1.7.5": {
42 "MIT License": "http://spdx.org/licenses/MIT"
199 {
200 "license": [
201 {
202 "fullName": "MIT License",
203 "shortName": "mit",
204 "spdxId": "MIT",
205 "url": "http://spdx.org/licenses/MIT.html"
206 }
207 ],
208 "name": "python2.7-attrs-18.1.0"
43 209 },
44 "python2.7-Pygments-2.2.0": {
45 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
210 {
211 "license": [
212 {
213 "fullName": "MIT License",
214 "shortName": "mit",
215 "spdxId": "MIT",
216 "url": "http://spdx.org/licenses/MIT.html"
217 }
218 ],
219 "name": "python2.7-py-1.5.3"
220 },
221 {
222 "license": [
223 {
224 "fullName": "GNU Lesser General Public License v3 or later (LGPLv3+)"
225 },
226 {
227 "fullName": "LGPL"
228 }
229 ],
230 "name": "python2.7-gprof2dot-2017.9.19"
46 231 },
47 "python2.7-Routes-1.13": {
48 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
232 {
233 "license": [
234 {
235 "fullName": "MIT License",
236 "shortName": "mit",
237 "spdxId": "MIT",
238 "url": "http://spdx.org/licenses/MIT.html"
239 }
240 ],
241 "name": "python2.7-pytest-profiling-1.3.0"
242 },
243 {
244 "license": [
245 {
246 "fullName": "MIT License",
247 "shortName": "mit",
248 "spdxId": "MIT",
249 "url": "http://spdx.org/licenses/MIT.html"
250 }
251 ],
252 "name": "python2.7-pytest-runner-4.2"
49 253 },
50 "python2.7-SQLAlchemy-0.9.9": {
51 "MIT License": "http://spdx.org/licenses/MIT"
254 {
255 "license": [
256 {
257 "fullName": "MIT License",
258 "shortName": "mit",
259 "spdxId": "MIT",
260 "url": "http://spdx.org/licenses/MIT.html"
261 }
262 ],
263 "name": "python2.7-setuptools-scm-2.1.0"
52 264 },
53 "python2.7-Tempita-0.5.2": {
54 "MIT License": "http://spdx.org/licenses/MIT"
265 {
266 "license": [
267 {
268 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
269 "shortName": "bsdOriginal",
270 "spdxId": "BSD-4-Clause",
271 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
272 }
273 ],
274 "name": "python2.7-pytest-sugar-0.9.1"
275 },
276 {
277 "license": [
278 {
279 "fullName": "MIT License",
280 "shortName": "mit",
281 "spdxId": "MIT",
282 "url": "http://spdx.org/licenses/MIT.html"
283 }
284 ],
285 "name": "python2.7-termcolor-1.1.0"
55 286 },
56 "python2.7-URLObject-2.4.0": {
57 "The Unlicense": "http://unlicense.org/"
287 {
288 "license": [
289 {
290 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
291 "shortName": "bsdOriginal",
292 "spdxId": "BSD-4-Clause",
293 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
58 294 },
59 "python2.7-WebError-0.10.3": {
60 "MIT License": "http://spdx.org/licenses/MIT"
295 {
296 "fullName": "MIT License",
297 "shortName": "mit",
298 "spdxId": "MIT",
299 "url": "http://spdx.org/licenses/MIT.html"
300 }
301 ],
302 "name": "python2.7-pytest-cov-2.5.1"
303 },
304 {
305 "license": [
306 {
307 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
308 "shortName": "bsdOriginal",
309 "spdxId": "BSD-4-Clause",
310 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
311 }
312 ],
313 "name": "python2.7-appenlight-client-0.6.25"
61 314 },
62 "python2.7-WebHelpers-1.3": {
63 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
315 {
316 "license": [
317 {
318 "fullName": "Apache License 2.0",
319 "shortName": "asl20",
320 "spdxId": "Apache-2.0",
321 "url": "http://spdx.org/licenses/Apache-2.0.html"
322 }
323 ],
324 "name": "python2.7-requests-2.9.1"
64 325 },
65 "python2.7-WebHelpers2-2.0": {
66 "MIT License": "http://spdx.org/licenses/MIT"
326 {
327 "license": [
328 {
329 "fullName": "AGPLv3 and Proprietary"
330 }
331 ],
332 "name": "python2.7-rhodecode-tools-0.16.0"
333 },
334 {
335 "license": [
336 {
337 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
338 "shortName": "bsdOriginal",
339 "spdxId": "BSD-4-Clause",
340 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
341 },
342 {
343 "fullName": "BSD 2-clause \"Simplified\" License",
344 "shortName": "bsd2",
345 "spdxId": "BSD-2-Clause",
346 "url": "http://spdx.org/licenses/BSD-2-Clause.html"
347 }
348 ],
349 "name": "python2.7-whoosh-2.7.4"
67 350 },
68 "python2.7-WebOb-1.3.1": {
69 "MIT License": "http://spdx.org/licenses/MIT"
351 {
352 "license": [
353 {
354 "fullName": "MIT License",
355 "shortName": "mit",
356 "spdxId": "MIT",
357 "url": "http://spdx.org/licenses/MIT.html"
358 }
359 ],
360 "name": "python2.7-urllib3-1.21"
361 },
362 {
363 "license": [
364 {
365 "fullName": "Apache License 2.0",
366 "shortName": "asl20",
367 "spdxId": "Apache-2.0",
368 "url": "http://spdx.org/licenses/Apache-2.0.html"
369 }
370 ],
371 "name": "python2.7-elasticsearch-dsl-2.2.0"
70 372 },
71 "python2.7-Whoosh-2.7.4": {
72 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause",
73 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
373 {
374 "license": [
375 {
376 "fullName": "Apache License 2.0",
377 "shortName": "asl20",
378 "spdxId": "Apache-2.0",
379 "url": "http://spdx.org/licenses/Apache-2.0.html"
380 }
381 ],
382 "name": "python2.7-elasticsearch-2.3.0"
74 383 },
75 "python2.7-alembic-0.8.4": {
76 "MIT License": "http://spdx.org/licenses/MIT"
384 {
385 "license": [
386 {
387 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
388 "shortName": "bsdOriginal",
389 "spdxId": "BSD-4-Clause",
390 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
391 },
392 {
393 "fullName": "Apache License 2.0",
394 "shortName": "asl20",
395 "spdxId": "Apache-2.0",
396 "url": "http://spdx.org/licenses/Apache-2.0.html"
397 },
398 {
399 "fullName": "Dual License"
400 }
401 ],
402 "name": "python2.7-python-dateutil-2.7.3"
77 403 },
78 "python2.7-appenlight-client-0.6.14": {
79 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
404 {
405 "license": [
406 {
407 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
408 "shortName": "bsdOriginal",
409 "spdxId": "BSD-4-Clause",
410 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
411 }
412 ],
413 "name": "python2.7-markupsafe-1.0"
80 414 },
81 "python2.7-authomatic-0.1.0.post1": {
82 "MIT License": "http://spdx.org/licenses/MIT"
415 {
416 "license": [
417 {
418 "fullName": "MIT License",
419 "shortName": "mit",
420 "spdxId": "MIT",
421 "url": "http://spdx.org/licenses/MIT.html"
422 }
423 ],
424 "name": "python2.7-mako-1.0.7"
425 },
426 {
427 "license": [
428 {
429 "fullName": "MIT License",
430 "shortName": "mit",
431 "spdxId": "MIT",
432 "url": "http://spdx.org/licenses/MIT.html"
433 }
434 ],
435 "name": "python2.7-future-0.14.3"
83 436 },
84 "python2.7-backports.shutil-get-terminal-size-1.0.0": {
85 "MIT License": "http://spdx.org/licenses/MIT"
437 {
438 "license": [
439 {
440 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
441 "shortName": "bsdOriginal",
442 "spdxId": "BSD-4-Clause",
443 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
444 }
445 ],
446 "name": "python2.7-click-6.6"
86 447 },
87 "python2.7-bleach-1.5.0": {
88 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
448 {
449 "license": [
450 {
451 "fullName": "MIT License",
452 "shortName": "mit",
453 "spdxId": "MIT",
454 "url": "http://spdx.org/licenses/MIT.html"
455 }
456 ],
457 "name": "python2.7-bottle-0.12.13"
89 458 },
90 "python2.7-celery-2.2.10": {
91 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
459 {
460 "license": [
461 {
462 "fullName": "MIT License",
463 "shortName": "mit",
464 "spdxId": "MIT",
465 "url": "http://spdx.org/licenses/MIT.html"
466 }
467 ],
468 "name": "python2.7-cprofilev-1.0.7"
92 469 },
93 "python2.7-channelstream-0.5.2": {
94 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
470 {
471 "license": [
472 {
473 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
474 "shortName": "bsdOriginal",
475 "spdxId": "BSD-4-Clause",
476 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
477 }
478 ],
479 "name": "python2.7-ipython-5.1.0"
480 },
481 {
482 "license": [
483 {
484 "fullName": "GNU General Public License v3 (GPLv3)"
485 },
486 {
487 "fullName": "GNU General Public License v1.0 only",
488 "shortName": "gpl1",
489 "spdxId": "GPL-1.0",
490 "url": "http://spdx.org/licenses/GPL-1.0.html"
491 }
492 ],
493 "name": "python2.7-gnureadline-6.3.8"
95 494 },
96 "python2.7-click-5.1": {
97 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
495 {
496 "license": [
497 {
498 "fullName": "ISC License",
499 "shortName": "isc",
500 "spdxId": "ISC",
501 "url": "http://spdx.org/licenses/ISC.html"
502 },
503 {
504 "fullName": "ISC License (ISCL)"
505 }
506 ],
507 "name": "python2.7-pexpect-4.6.0"
98 508 },
99 "python2.7-colander-1.2": {
100 "Repoze License": "http://www.repoze.org/LICENSE.txt"
509 {
510 "license": [],
511 "name": "python2.7-ptyprocess-0.6.0"
512 },
513 {
514 "license": [
515 {
516 "fullName": "MIT License",
517 "shortName": "mit",
518 "spdxId": "MIT",
519 "url": "http://spdx.org/licenses/MIT.html"
520 }
521 ],
522 "name": "python2.7-pathlib2-2.3.0"
101 523 },
102 "python2.7-configobj-5.0.6": {
103 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
524 {
525 "license": [
526 {
527 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
528 "shortName": "bsdOriginal",
529 "spdxId": "BSD-4-Clause",
530 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
104 531 },
105 "python2.7-configparser-3.5.0": {
106 "MIT License": "http://spdx.org/licenses/MIT"
532 {
533 "fullName": "New BSD License"
534 }
535 ],
536 "name": "python2.7-scandir-1.9.0"
537 },
538 {
539 "license": [
540 {
541 "fullName": "MIT License",
542 "shortName": "mit",
543 "spdxId": "MIT",
544 "url": "http://spdx.org/licenses/MIT.html"
545 }
546 ],
547 "name": "python2.7-backports.shutil-get-terminal-size-1.0.0"
107 548 },
108 "python2.7-cssselect-1.0.1": {
109 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
549 {
550 "license": [
551 {
552 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
553 "shortName": "bsdOriginal",
554 "spdxId": "BSD-4-Clause",
555 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
556 }
557 ],
558 "name": "python2.7-pygments-2.2.0"
110 559 },
111 "python2.7-decorator-4.0.11": {
112 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
560 {
561 "license": [
562 {
563 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
564 "shortName": "bsdOriginal",
565 "spdxId": "BSD-4-Clause",
566 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
567 }
568 ],
569 "name": "python2.7-prompt-toolkit-1.0.15"
570 },
571 {
572 "license": [
573 {
574 "fullName": "MIT License",
575 "shortName": "mit",
576 "spdxId": "MIT",
577 "url": "http://spdx.org/licenses/MIT.html"
578 }
579 ],
580 "name": "python2.7-wcwidth-0.1.7"
113 581 },
114 "python2.7-deform-2.0a2": {
115 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
582 {
583 "license": [
584 {
585 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
586 "shortName": "bsdOriginal",
587 "spdxId": "BSD-4-Clause",
588 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
589 }
590 ],
591 "name": "python2.7-traitlets-4.3.2"
116 592 },
117 "python2.7-docutils-0.12": {
118 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause"
593 {
594 "license": [
595 {
596 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
597 "shortName": "bsdOriginal",
598 "spdxId": "BSD-4-Clause",
599 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
600 }
601 ],
602 "name": "python2.7-enum34-1.1.6"
119 603 },
120 "python2.7-dogpile.cache-0.6.1": {
121 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
604 {
605 "license": [
606 {
607 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
608 "shortName": "bsdOriginal",
609 "spdxId": "BSD-4-Clause",
610 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
611 },
612 {
613 "fullName": "new BSD License"
614 }
615 ],
616 "name": "python2.7-decorator-4.1.2"
122 617 },
123 "python2.7-dogpile.core-0.4.1": {
124 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
618 {
619 "license": [
620 {
621 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
622 "shortName": "bsdOriginal",
623 "spdxId": "BSD-4-Clause",
624 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
625 }
626 ],
627 "name": "python2.7-ipython-genutils-0.2.0"
628 },
629 {
630 "license": [
631 {
632 "fullName": "Zope Public License 2.1",
633 "shortName": "zpl21",
634 "spdxId": "ZPL-2.1",
635 "url": "http://spdx.org/licenses/ZPL-2.1.html"
636 }
637 ],
638 "name": "python2.7-simplegeneric-0.8.1"
125 639 },
126 "python2.7-elasticsearch-2.3.0": {
127 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
640 {
641 "license": [
642 {
643 "fullName": "MIT License",
644 "shortName": "mit",
645 "spdxId": "MIT",
646 "url": "http://spdx.org/licenses/MIT.html"
647 }
648 ],
649 "name": "python2.7-pickleshare-0.7.4"
128 650 },
129 "python2.7-elasticsearch-dsl-2.2.0": {
130 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
651 {
652 "license": [
653 {
654 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
655 "shortName": "bsdOriginal",
656 "spdxId": "BSD-4-Clause",
657 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
658 }
659 ],
660 "name": "python2.7-ipdb-0.11"
661 },
662 {
663 "license": [
664 {
665 "fullName": "MIT License",
666 "shortName": "mit",
667 "spdxId": "MIT",
668 "url": "http://spdx.org/licenses/MIT.html"
669 }
670 ],
671 "name": "python2.7-gunicorn-19.9.0"
131 672 },
132 "python2.7-entrypoints-0.2.2": {
133 "MIT License": "http://spdx.org/licenses/MIT"
673 {
674 "license": [
675 {
676 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
677 "shortName": "bsdOriginal",
678 "spdxId": "BSD-4-Clause",
679 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
680 }
681 ],
682 "name": "python2.7-futures-3.0.2"
134 683 },
135 "python2.7-enum34-1.1.6": {
136 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
684 {
685 "license": [
686 {
687 "fullName": "MIT License",
688 "shortName": "mit",
689 "spdxId": "MIT",
690 "url": "http://spdx.org/licenses/MIT.html"
691 }
692 ],
693 "name": "python2.7-greenlet-0.4.13"
694 },
695 {
696 "license": [
697 {
698 "fullName": "MIT License",
699 "shortName": "mit",
700 "spdxId": "MIT",
701 "url": "http://spdx.org/licenses/MIT.html"
702 }
703 ],
704 "name": "python2.7-gevent-1.3.5"
137 705 },
138 "python2.7-functools32-3.2.3.post2": {
139 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
706 {
707 "license": [
708 {
709 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
710 "shortName": "bsdOriginal",
711 "spdxId": "BSD-4-Clause",
712 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
713 }
714 ],
715 "name": "python2.7-psutil-5.4.6"
140 716 },
141 "python2.7-future-0.14.3": {
142 "MIT License": "http://spdx.org/licenses/MIT"
717 {
718 "license": [
719 {
720 "fullName": "MIT License",
721 "shortName": "mit",
722 "spdxId": "MIT",
723 "url": "http://spdx.org/licenses/MIT.html"
724 }
725 ],
726 "name": "python2.7-bumpversion-0.5.3"
143 727 },
144 "python2.7-futures-3.0.2": {
145 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
728 {
729 "license": [
730 {
731 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
732 "shortName": "bsdOriginal",
733 "spdxId": "BSD-4-Clause",
734 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
735 }
736 ],
737 "name": "python2.7-invoke-0.13.0"
146 738 },
147 "python2.7-gevent-1.1.2": {
148 "MIT License": "http://spdx.org/licenses/MIT"
739 {
740 "license": [
741 {
742 "fullName": "MIT License",
743 "shortName": "mit",
744 "spdxId": "MIT",
745 "url": "http://spdx.org/licenses/MIT.html"
746 }
747 ],
748 "name": "python2.7-alembic-0.9.9"
749 },
750 {
751 "license": {
752 "fullName": "Apache License 2.0",
753 "shortName": "asl20",
754 "spdxId": "Apache-2.0",
755 "url": "http://spdx.org/licenses/Apache-2.0.html"
756 },
757 "name": "python2.7-python-editor-1.0.3"
149 758 },
150 "python2.7-gnureadline-6.3.3": {
151 "GNU General Public License v1.0 only": "http://spdx.org/licenses/GPL-1.0"
759 {
760 "license": [
761 {
762 "fullName": "MIT License",
763 "shortName": "mit",
764 "spdxId": "MIT",
765 "url": "http://spdx.org/licenses/MIT.html"
766 }
767 ],
768 "name": "python2.7-sqlalchemy-1.1.18"
152 769 },
153 "python2.7-gprof2dot-2016.10.13": {
154 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
770 {
771 "license": [
772 {
773 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
774 "shortName": "bsdOriginal",
775 "spdxId": "BSD-4-Clause",
776 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
777 }
778 ],
779 "name": "python2.7-jupyter-client-5.0.0"
780 },
781 {
782 "license": [
783 {
784 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
785 "shortName": "bsdOriginal",
786 "spdxId": "BSD-4-Clause",
787 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
155 788 },
156 "python2.7-greenlet-0.4.10": {
157 "MIT License": "http://spdx.org/licenses/MIT"
789 {
790 "fullName": "LGPL+BSD"
791 },
792 {
793 "fullName": "GNU Library or Lesser General Public License (LGPL)"
794 }
795 ],
796 "name": "python2.7-pyzmq-14.6.0"
158 797 },
159 "python2.7-gunicorn-19.6.0": {
160 "MIT License": "http://spdx.org/licenses/MIT"
798 {
799 "license": [
800 {
801 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
802 "shortName": "bsdOriginal",
803 "spdxId": "BSD-4-Clause",
804 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
805 }
806 ],
807 "name": "python2.7-jupyter-core-4.4.0"
808 },
809 {
810 "license": [
811 {
812 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
813 "shortName": "bsdOriginal",
814 "spdxId": "BSD-4-Clause",
815 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
816 }
817 ],
818 "name": "python2.7-nbformat-4.4.0"
161 819 },
162 "python2.7-html5lib-0.9999999": {
163 "MIT License": "http://spdx.org/licenses/MIT"
820 {
821 "license": [
822 {
823 "fullName": "MIT License",
824 "shortName": "mit",
825 "spdxId": "MIT",
826 "url": "http://spdx.org/licenses/MIT.html"
827 }
828 ],
829 "name": "python2.7-jsonschema-2.6.0"
164 830 },
165 "python2.7-infrae.cache-1.0.1": {
166 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
831 {
832 "license": [
833 {
834 "fullName": "Python Software Foundation License version 2",
835 "shortName": "psfl",
836 "spdxId": "Python-2.0",
837 "url": "http://spdx.org/licenses/Python-2.0.html"
838 }
839 ],
840 "name": "python2.7-functools32-3.2.3.post2"
841 },
842 {
843 "license": [
844 {
845 "fullName": "Apache License 2.0",
846 "shortName": "asl20",
847 "spdxId": "Apache-2.0",
848 "url": "http://spdx.org/licenses/Apache-2.0.html"
849 }
850 ],
851 "name": "python2.7-bleach-2.1.4"
167 852 },
168 "python2.7-ipython-5.1.0": {
169 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
853 {
854 "license": [
855 {
856 "fullName": "MIT License",
857 "shortName": "mit",
858 "spdxId": "MIT",
859 "url": "http://spdx.org/licenses/MIT.html"
860 }
861 ],
862 "name": "python2.7-html5lib-1.0.1"
170 863 },
171 "python2.7-ipython-genutils-0.2.0": {
172 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
864 {
865 "license": [
866 {
867 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
868 "shortName": "bsdOriginal",
869 "spdxId": "BSD-4-Clause",
870 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
871 }
872 ],
873 "name": "python2.7-webencodings-0.5.1"
874 },
875 {
876 "license": [
877 {
878 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
879 "shortName": "bsdOriginal",
880 "spdxId": "BSD-4-Clause",
881 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
882 }
883 ],
884 "name": "python2.7-nbconvert-5.3.1"
173 885 },
174 "python2.7-iso8601-0.1.11": {
175 "MIT License": "http://spdx.org/licenses/MIT"
886 {
887 "license": [
888 {
889 "fullName": "MIT License",
890 "shortName": "mit",
891 "spdxId": "MIT",
892 "url": "http://spdx.org/licenses/MIT.html"
893 }
894 ],
895 "name": "python2.7-testpath-0.3.1"
176 896 },
177 "python2.7-itsdangerous-0.24": {
178 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
897 {
898 "license": [
899 {
900 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
901 "shortName": "bsdOriginal",
902 "spdxId": "BSD-4-Clause",
903 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
904 }
905 ],
906 "name": "python2.7-pandocfilters-1.4.2"
907 },
908 {
909 "license": [
910 {
911 "fullName": "MIT License",
912 "shortName": "mit",
913 "spdxId": "MIT",
914 "url": "http://spdx.org/licenses/MIT.html"
915 }
916 ],
917 "name": "python2.7-entrypoints-0.2.2"
179 918 },
180 "python2.7-jsonschema-2.6.0": {
181 "MIT License": "http://spdx.org/licenses/MIT"
919 {
920 "license": [
921 {
922 "fullName": "MIT License",
923 "shortName": "mit",
924 "spdxId": "MIT",
925 "url": "http://spdx.org/licenses/MIT.html"
926 }
927 ],
928 "name": "python2.7-configparser-3.5.0"
182 929 },
183 "python2.7-jupyter-client-5.0.0": {
184 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
930 {
931 "license": [
932 {
933 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
934 "shortName": "bsdOriginal",
935 "spdxId": "BSD-4-Clause",
936 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
937 }
938 ],
939 "name": "python2.7-jinja2-2.9.6"
940 },
941 {
942 "license": [
943 {
944 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
945 "shortName": "bsdOriginal",
946 "spdxId": "BSD-4-Clause",
947 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
948 }
949 ],
950 "name": "python2.7-mistune-0.8.3"
185 951 },
186 "python2.7-jupyter-core-4.3.0": {
187 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
952 {
953 "license": [
954 {
955 "fullName": "Zope Public License 2.1",
956 "shortName": "zpl21",
957 "spdxId": "ZPL-2.1",
958 "url": "http://spdx.org/licenses/ZPL-2.1.html"
959 }
960 ],
961 "name": "python2.7-zope.interface-4.5.0"
962 },
963 {
964 "license": [
965 {
966 "fullName": "Zope Public License 2.1",
967 "shortName": "zpl21",
968 "spdxId": "ZPL-2.1",
969 "url": "http://spdx.org/licenses/ZPL-2.1.html"
970 }
971 ],
972 "name": "python2.7-zope.event-4.3.0"
188 973 },
189 "python2.7-kombu-4.1.0": {
190 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
974 {
975 "license": [
976 {
977 "fullName": "Zope Public License 2.1",
978 "shortName": "zpl21",
979 "spdxId": "ZPL-2.1",
980 "url": "http://spdx.org/licenses/ZPL-2.1.html"
981 }
982 ],
983 "name": "python2.7-zope.deprecation-4.3.0"
191 984 },
192 "python2.7-mistune-0.7.4": {
193 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
985 {
986 "license": [
987 {
988 "fullName": "Zope Public License 2.1",
989 "shortName": "zpl21",
990 "spdxId": "ZPL-2.1",
991 "url": "http://spdx.org/licenses/ZPL-2.1.html"
992 }
993 ],
994 "name": "python2.7-zope.cachedescriptors-4.3.1"
995 },
996 {
997 "license": [
998 {
999 "fullName": "PSF or ZPL"
1000 }
1001 ],
1002 "name": "python2.7-wsgiref-0.1.2"
194 1003 },
195 "python2.7-msgpack-python-0.4.8": {
196 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
1004 {
1005 "license": [
1006 {
1007 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1008 "shortName": "bsdOriginal",
1009 "spdxId": "BSD-4-Clause",
1010 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1011 }
1012 ],
1013 "name": "python2.7-webhelpers-1.3"
197 1014 },
198 "python2.7-nbconvert-5.1.1": {
199 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1015 {
1016 "license": [
1017 {
1018 "fullName": "MIT License",
1019 "shortName": "mit",
1020 "spdxId": "MIT",
1021 "url": "http://spdx.org/licenses/MIT.html"
1022 }
1023 ],
1024 "name": "python2.7-webhelpers2-2.0"
200 1025 },
201 "python2.7-nbformat-4.3.0": {
202 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1026 {
1027 "license": [
1028 {
1029 "fullName": "MIT License",
1030 "shortName": "mit",
1031 "spdxId": "MIT",
1032 "url": "http://spdx.org/licenses/MIT.html"
1033 }
1034 ],
1035 "name": "python2.7-weberror-0.10.3"
203 1036 },
204 "python2.7-packaging-15.2": {
205 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
1037 {
1038 "license": [
1039 {
1040 "fullName": "MIT License",
1041 "shortName": "mit",
1042 "spdxId": "MIT",
1043 "url": "http://spdx.org/licenses/MIT.html"
1044 }
1045 ],
1046 "name": "python2.7-paste-2.0.3"
1047 },
1048 {
1049 "license": [
1050 {
1051 "fullName": "MIT License",
1052 "shortName": "mit",
1053 "spdxId": "MIT",
1054 "url": "http://spdx.org/licenses/MIT.html"
1055 }
1056 ],
1057 "name": "python2.7-tempita-0.5.2"
1058 },
1059 {
1060 "license": {
1061 "fullName": "Repoze License",
1062 "url": "http://www.repoze.org/LICENSE.txt"
1063 },
1064 "name": "python2.7-venusian-1.1.0"
206 1065 },
207 "python2.7-pandocfilters-1.4.1": {
208 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1066 {
1067 "license": {
1068 "fullName": "The Unlicense",
1069 "spdxId": "Unlicense",
1070 "url": "http://unlicense.org/"
1071 },
1072 "name": "python2.7-urlobject-2.4.3"
209 1073 },
210 "python2.7-pathlib2-2.1.0": {
211 "MIT License": "http://spdx.org/licenses/MIT"
1074 {
1075 "license": [
1076 {
1077 "fullName": "Apache License 2.0",
1078 "shortName": "asl20",
1079 "spdxId": "Apache-2.0",
1080 "url": "http://spdx.org/licenses/Apache-2.0.html"
1081 }
1082 ],
1083 "name": "python2.7-trollius-1.0.4"
1084 },
1085 {
1086 "license": {
1087 "fullName": "Repoze License",
1088 "url": "http://www.repoze.org/LICENSE.txt"
1089 },
1090 "name": "python2.7-translationstring-1.3"
212 1091 },
213 "python2.7-peppercorn-0.5": {
214 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
1092 {
1093 "license": [
1094 {
1095 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1096 }
1097 ],
1098 "name": "python2.7-supervisor-3.3.4"
215 1099 },
216 "python2.7-pexpect-4.2.1": {
217 "ISC License": "http://spdx.org/licenses/ISC"
1100 {
1101 "license": [
1102 {
1103 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1104 }
1105 ],
1106 "name": "python2.7-meld3-1.0.2"
1107 },
1108 {
1109 "license": [
1110 {
1111 "fullName": "Python Software Foundation License version 2",
1112 "shortName": "psfl",
1113 "spdxId": "Python-2.0",
1114 "url": "http://spdx.org/licenses/Python-2.0.html"
1115 }
1116 ],
1117 "name": "python2.7-subprocess32-3.5.1"
218 1118 },
219 "python2.7-pickleshare-0.7.4": {
220 "MIT License": "http://spdx.org/licenses/MIT"
1119 {
1120 "license": [
1121 {
1122 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1123 "shortName": "bsdOriginal",
1124 "spdxId": "BSD-4-Clause",
1125 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1126 }
1127 ],
1128 "name": "python2.7-sshpubkeys-2.2.0"
221 1129 },
222 "python2.7-prompt-toolkit-1.0.14": {
223 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1130 {
1131 "license": [
1132 {
1133 "fullName": "MIT License",
1134 "shortName": "mit",
1135 "spdxId": "MIT",
1136 "url": "http://spdx.org/licenses/MIT.html"
1137 }
1138 ],
1139 "name": "python2.7-ecdsa-0.13"
1140 },
1141 {
1142 "license": [
1143 {
1144 "fullName": "Public Domain",
1145 "shortName": "publicDomain"
1146 }
1147 ],
1148 "name": "python2.7-pycrypto-2.6.1"
224 1149 },
225 "python2.7-psutil-4.3.1": {
226 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1150 {
1151 "license": [
1152 {
1153 "fullName": "Academic Free License (AFL)"
1154 },
1155 {
1156 "fullName": "MIT License",
1157 "shortName": "mit",
1158 "spdxId": "MIT",
1159 "url": "http://spdx.org/licenses/MIT.html"
1160 }
1161 ],
1162 "name": "python2.7-simplejson-3.11.1"
227 1163 },
228 "python2.7-psycopg2-2.6.1": {
229 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
1164 {
1165 "license": [
1166 {
1167 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1168 "shortName": "bsdOriginal",
1169 "spdxId": "BSD-4-Clause",
1170 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1171 }
1172 ],
1173 "name": "python2.7-setproctitle-1.1.10"
1174 },
1175 {
1176 "license": [
1177 {
1178 "fullName": "MIT License",
1179 "shortName": "mit",
1180 "spdxId": "MIT",
1181 "url": "http://spdx.org/licenses/MIT.html"
1182 }
1183 ],
1184 "name": "python2.7-routes-2.4.1"
230 1185 },
231 "python2.7-ptyprocess-0.5.1": {
232 "ISC License": "http://opensource.org/licenses/ISC"
1186 {
1187 "license": {
1188 "fullName": "Repoze License",
1189 "url": "http://www.repoze.org/LICENSE.txt"
1190 },
1191 "name": "python2.7-repoze.lru-0.7"
1192 },
1193 {
1194 "license": [
1195 {
1196 "fullName": "MIT License",
1197 "shortName": "mit",
1198 "spdxId": "MIT",
1199 "url": "http://spdx.org/licenses/MIT.html"
1200 }
1201 ],
1202 "name": "python2.7-redis-2.10.6"
233 1203 },
234 "python2.7-py-1.4.31": {
235 "MIT License": "http://spdx.org/licenses/MIT"
1204 {
1205 "license": [
1206 {
1207 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1208 "shortName": "bsdOriginal",
1209 "spdxId": "BSD-4-Clause",
1210 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1211 }
1212 ],
1213 "name": "python2.7-py-gfm-0.1.3"
236 1214 },
237 "python2.7-py-bcrypt-0.4": {
238 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1215 {
1216 "license": [
1217 {
1218 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1219 "shortName": "bsdOriginal",
1220 "spdxId": "BSD-4-Clause",
1221 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1222 }
1223 ],
1224 "name": "python2.7-markdown-2.6.11"
1225 },
1226 {
1227 "license": [
1228 {
1229 "fullName": "MIT License",
1230 "shortName": "mit",
1231 "spdxId": "MIT",
1232 "url": "http://spdx.org/licenses/MIT.html"
1233 }
1234 ],
1235 "name": "python2.7-tzlocal-1.5.1"
239 1236 },
240 "python2.7-py-gfm-0.1.3.rhodecode-upstream1": {
241 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1237 {
1238 "license": [
1239 {
1240 "fullName": "MIT License",
1241 "shortName": "mit",
1242 "spdxId": "MIT",
1243 "url": "http://spdx.org/licenses/MIT.html"
1244 }
1245 ],
1246 "name": "python2.7-pytz-2018.4"
242 1247 },
243 "python2.7-pycrypto-2.6.1": {
244 "Public Domain": null
1248 {
1249 "license": [
1250 {
1251 "fullName": "License :: OSI Approved :: MIT License"
1252 },
1253 {
1254 "fullName": "MIT License",
1255 "shortName": "mit",
1256 "spdxId": "MIT",
1257 "url": "http://spdx.org/licenses/MIT.html"
1258 }
1259 ],
1260 "name": "python2.7-python-pam-1.8.4"
245 1261 },
246 "python2.7-pycurl-7.19.5": {
247 "MIT License": "http://spdx.org/licenses/MIT"
1262 {
1263 "license": [
1264 {
1265 "fullName": "GNU General Public License v1.0 only",
1266 "shortName": "gpl1",
1267 "spdxId": "GPL-1.0",
1268 "url": "http://spdx.org/licenses/GPL-1.0.html"
1269 }
1270 ],
1271 "name": "linux-pam-1.3.0"
248 1272 },
249 "python2.7-pygments-markdown-lexer-0.1.0.dev39": {
250 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
1273 {
1274 "license": [
1275 {
1276 "fullName": "Python Software Foundation License version 2",
1277 "shortName": "psfl",
1278 "spdxId": "Python-2.0",
1279 "url": "http://spdx.org/licenses/Python-2.0.html"
1280 }
1281 ],
1282 "name": "python2.7-python-memcached-1.59"
1283 },
1284 {
1285 "license": [
1286 {
1287 "fullName": "Python Software Foundation License version 2",
1288 "shortName": "psfl",
1289 "spdxId": "Python-2.0",
1290 "url": "http://spdx.org/licenses/Python-2.0.html"
1291 }
1292 ],
1293 "name": "python2.7-python-ldap-3.1.0"
1294 },
1295 {
1296 "license": {
1297 "fullName": "MIT License",
1298 "shortName": "mit",
1299 "spdxId": "MIT",
1300 "url": "http://spdx.org/licenses/MIT.html"
1301 },
1302 "name": "libkrb5-1.15.2"
251 1303 },
252 "python2.7-pyparsing-1.5.7": {
253 "MIT License": "http://spdx.org/licenses/MIT"
1304 {
1305 "license":{
1306 "fullName": "BSD-derived (https://www.openldap.org/software/release/license.html)"
1307 },
1308 "name": "openldap-2.4.45"
254 1309 },
255 "python2.7-pyramid-1.7.4": {
256 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1310 {
1311 "license": [
1312 {
1313 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1314 "shortName": "bsdOriginal",
1315 "spdxId": "BSD-4-Clause",
1316 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1317 }
1318 ],
1319 "name": "python2.7-pyasn1-modules-0.2.2"
257 1320 },
258 "python2.7-pyramid-beaker-0.8": {
259 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1321 {
1322 "license": [
1323 {
1324 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1325 "shortName": "bsdOriginal",
1326 "spdxId": "BSD-4-Clause",
1327 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1328 }
1329 ],
1330 "name": "python2.7-pyasn1-0.4.4"
260 1331 },
261 "python2.7-pyramid-debugtoolbar-3.0.5": {
262 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause",
263 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1332 {
1333 "license": [
1334 {
1335 "fullName": "zlib License",
1336 "shortName": "zlib",
1337 "spdxId": "Zlib",
1338 "url": "http://spdx.org/licenses/Zlib.html"
1339 },
1340 {
1341 "fullName": "libpng License",
1342 "shortName": "libpng",
1343 "spdxId": "Libpng",
1344 "url": "http://spdx.org/licenses/Libpng.html"
1345 }
1346 ],
1347 "name": "python2.7-pysqlite-2.8.3"
1348 },
1349 {
1350 "license": {
1351 "fullName": "Repoze License",
1352 "url": "http://www.repoze.org/LICENSE.txt"
1353 },
1354 "name": "python2.7-pyramid-1.9.2"
264 1355 },
265 "python2.7-pyramid-jinja2-2.5": {
266 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
1356 {
1357 "license": [
1358 {
1359 "fullName": "MIT License",
1360 "shortName": "mit",
1361 "spdxId": "MIT",
1362 "url": "http://spdx.org/licenses/MIT.html"
1363 }
1364 ],
1365 "name": "python2.7-hupper-1.3"
267 1366 },
268 "python2.7-pyramid-mako-1.0.2": {
269 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1367 {
1368 "license": [
1369 {
1370 "fullName": "MIT License",
1371 "shortName": "mit",
1372 "spdxId": "MIT",
1373 "url": "http://spdx.org/licenses/MIT.html"
1374 }
1375 ],
1376 "name": "python2.7-plaster-pastedeploy-0.6"
1377 },
1378 {
1379 "license": [
1380 {
1381 "fullName": "MIT License",
1382 "shortName": "mit",
1383 "spdxId": "MIT",
1384 "url": "http://spdx.org/licenses/MIT.html"
1385 }
1386 ],
1387 "name": "python2.7-plaster-1.0"
270 1388 },
271 "python2.7-pysqlite-2.6.3": {
272 "libpng License": "http://spdx.org/licenses/Libpng",
273 "zlib License": "http://spdx.org/licenses/Zlib"
1389 {
1390 "license": [
1391 {
1392 "fullName": "MIT License",
1393 "shortName": "mit",
1394 "spdxId": "MIT",
1395 "url": "http://spdx.org/licenses/MIT.html"
1396 }
1397 ],
1398 "name": "python2.7-pastedeploy-1.5.2"
1399 },
1400 {
1401 "license": {
1402 "fullName": "Repoze License",
1403 "url": "http://www.repoze.org/LICENSE.txt"
1404 },
1405 "name": "python2.7-pyramid-mako-1.0.2"
274 1406 },
275 "python2.7-pytest-3.0.5": {
276 "MIT License": "http://spdx.org/licenses/MIT"
1407 {
1408 "license": [
1409 {
1410 "fullName": "Repoze Public License"
1411 },
1412 {
1413 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1414 }
1415 ],
1416 "name": "python2.7-pyramid-jinja2-2.7"
1417 },
1418 {
1419 "license": [
1420 {
1421 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1422 "shortName": "bsdOriginal",
1423 "spdxId": "BSD-4-Clause",
1424 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
277 1425 },
278 "python2.7-pytest-profiling-1.2.2": {
279 "MIT License": "http://spdx.org/licenses/MIT"
1426 {
1427 "fullName": "Repoze License",
1428 "url": "http://www.repoze.org/LICENSE.txt"
1429 }
1430 ],
1431 "name": "python2.7-pyramid-debugtoolbar-4.4"
1432 },
1433 {
1434 "license": [
1435 {
1436 "fullName": "Python Software Foundation License version 2",
1437 "shortName": "psfl",
1438 "spdxId": "Python-2.0",
1439 "url": "http://spdx.org/licenses/Python-2.0.html"
1440 }
1441 ],
1442 "name": "python2.7-ipaddress-1.0.22"
1443 },
1444 {
1445 "license": {
1446 "fullName": "Repoze License",
1447 "url": "http://www.repoze.org/LICENSE.txt"
280 1448 },
281 "python2.7-pytest-runner-2.9": {
282 "MIT License": "http://spdx.org/licenses/MIT"
1449 "name": "python2.7-pyramid-beaker-0.8"
283 1450 },
284 "python2.7-pytest-sugar-0.7.1": {
285 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1451 {
1452 "license": [
1453 {
1454 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1455 "shortName": "bsdOriginal",
1456 "spdxId": "BSD-4-Clause",
1457 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1458 }
1459 ],
1460 "name": "python2.7-beaker-1.9.1"
1461 },
1462 {
1463 "license": [
1464 {
1465 "fullName": "MIT License",
1466 "shortName": "mit",
1467 "spdxId": "MIT",
1468 "url": "http://spdx.org/licenses/MIT.html"
1469 }
1470 ],
1471 "name": "python2.7-pyparsing-1.5.7"
286 1472 },
287 "python2.7-pytest-timeout-1.2.0": {
288 "MIT License": "http://spdx.org/licenses/MIT"
1473 {
1474 "license": [
1475 {
1476 "fullName": "Apache License 2.0",
1477 "shortName": "asl20",
1478 "spdxId": "Apache-2.0",
1479 "url": "http://spdx.org/licenses/Apache-2.0.html"
1480 }
1481 ],
1482 "name": "python2.7-pygments-markdown-lexer-0.1.0.dev39"
289 1483 },
290 "python2.7-python-dateutil-2.1": {
291 "Simplified BSD": null
1484 {
1485 "license": [
1486 {
1487 "fullName": "MIT License",
1488 "shortName": "mit",
1489 "spdxId": "MIT",
1490 "url": "http://spdx.org/licenses/MIT.html"
1491 }
1492 ],
1493 "name": "python2.7-pyflakes-0.8.1"
1494 },
1495 {
1496 "license": {
1497 "fullName": "MIT License",
1498 "shortName": "mit",
1499 "spdxId": "MIT",
1500 "url": "http://spdx.org/licenses/MIT.html"
1501 },
1502 "name": "python2.7-pycurl-7.43.0.2"
292 1503 },
293 "python2.7-python-editor-1.0.3": {
294 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
1504 {
1505 "license": [
1506 {
1507 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1508 "shortName": "bsdOriginal",
1509 "spdxId": "BSD-4-Clause",
1510 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1511 }
1512 ],
1513 "name": "python2.7-py-bcrypt-0.4"
1514 },
1515 {
1516 "license": {
1517 "fullName": "GNU Lesser General Public License v3.0 or later",
1518 "shortName": "lgpl3Plus",
1519 "spdxId": "LGPL-3.0+",
1520 "url": "http://spdx.org/licenses/LGPL-3.0+.html"
295 1521 },
296 "python2.7-python-ldap-2.4.19": {
297 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
1522 "name": "python2.7-psycopg2-2.7.4"
1523 },
1524 {
1525 "license": {
1526 "fullName": "PostgreSQL License",
1527 "shortName": "postgresql",
1528 "spdxId": "PostgreSQL",
1529 "url": "http://spdx.org/licenses/PostgreSQL.html"
1530 },
1531 "name": "postgresql-9.6.10"
1532 },
1533 {
1534 "license": [
1535 {
1536 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1537 }
1538 ],
1539 "name": "python2.7-peppercorn-0.5"
298 1540 },
299 "python2.7-python-memcached-1.57": {
300 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
1541 {
1542 "license": [
1543 {
1544 "fullName": "MIT License",
1545 "shortName": "mit",
1546 "spdxId": "MIT",
1547 "url": "http://spdx.org/licenses/MIT.html"
1548 }
1549 ],
1550 "name": "python2.7-pastescript-2.0.2"
301 1551 },
302 "python2.7-pytz-2015.4": {
303 "MIT License": "http://spdx.org/licenses/MIT"
1552 {
1553 "license": [
1554 {
1555 "fullName": "Apache License 2.0",
1556 "shortName": "asl20",
1557 "spdxId": "Apache-2.0",
1558 "url": "http://spdx.org/licenses/Apache-2.0.html"
1559 }
1560 ],
1561 "name": "python2.7-packaging-15.2"
304 1562 },
305 "python2.7-pyzmq-14.6.0": {
306 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1563 {
1564 "license": [
1565 {
1566 "fullName": "MIT License",
1567 "shortName": "mit",
1568 "spdxId": "MIT",
1569 "url": "http://spdx.org/licenses/MIT.html"
1570 }
1571 ],
1572 "name": "python2.7-objgraph-3.1.1"
307 1573 },
308 "python2.7-repoze.lru-0.6": {
309 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1574 {
1575 "license": [
1576 {
1577 "fullName": "MIT License",
1578 "shortName": "mit",
1579 "spdxId": "MIT",
1580 "url": "http://spdx.org/licenses/MIT.html"
1581 }
1582 ],
1583 "name": "python2.7-graphviz-0.9"
1584 },
1585 {
1586 "license": [
1587 {
1588 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1589 "shortName": "bsdOriginal",
1590 "spdxId": "BSD-4-Clause",
1591 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1592 }
1593 ],
1594 "name": "python2.7-pyotp-2.2.6"
310 1595 },
311 "python2.7-requests-2.9.1": {
312 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
1596 {
1597 "license": [
1598 {
1599 "fullName": "MIT License",
1600 "shortName": "mit",
1601 "spdxId": "MIT",
1602 "url": "http://spdx.org/licenses/MIT.html"
1603 }
1604 ],
1605 "name": "python2.7-pymysql-0.8.1"
313 1606 },
314 "python2.7-setuptools-scm-1.15.6": {
315 "MIT License": "http://spdx.org/licenses/MIT"
1607 {
1608 "license": [
1609 {
1610 "fullName": "GNU General Public License v1.0 only",
1611 "shortName": "gpl1",
1612 "spdxId": "GPL-1.0",
1613 "url": "http://spdx.org/licenses/GPL-1.0.html"
1614 }
1615 ],
1616 "name": "python2.7-mysql-python-1.2.5"
1617 },
1618 {
1619 "license": {
1620 "fullName": "GNU Library General Public License v2.1 only",
1621 "shortName": "lgpl21",
1622 "spdxId": "LGPL-2.1",
1623 "url": "http://spdx.org/licenses/LGPL-2.1.html"
1624 },
1625 "name": "mariadb-connector-c-2.3.4"
316 1626 },
317 "python2.7-simplegeneric-0.8.1": {
318 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
1627 {
1628 "license": [
1629 {
1630 "fullName": "Apache License 2.0",
1631 "shortName": "asl20",
1632 "spdxId": "Apache-2.0",
1633 "url": "http://spdx.org/licenses/Apache-2.0.html"
1634 }
1635 ],
1636 "name": "python2.7-msgpack-python-0.5.6"
319 1637 },
320 "python2.7-simplejson-3.7.2": {
321 "MIT License": "http://spdx.org/licenses/MIT"
1638 {
1639 "license": [
1640 {
1641 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1642 "shortName": "bsdOriginal",
1643 "spdxId": "BSD-4-Clause",
1644 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1645 }
1646 ],
1647 "name": "python2.7-lxml-3.7.3"
1648 },
1649 {
1650 "license": [
1651 {
1652 "fullName": "MIT License",
1653 "shortName": "mit",
1654 "spdxId": "MIT",
1655 "url": "http://spdx.org/licenses/MIT.html"
1656 }
1657 ],
1658 "name": "python2.7-wheel-0.30.0"
322 1659 },
323 "python2.7-six-1.9.0": {
324 "MIT License": "http://spdx.org/licenses/MIT"
1660 {
1661 "license": [
1662 {
1663 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1664 "shortName": "bsdOriginal",
1665 "spdxId": "BSD-4-Clause",
1666 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1667 }
1668 ],
1669 "name": "python2.7-kombu-4.2.0"
325 1670 },
326 "python2.7-subprocess32-3.2.6": {
327 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
1671 {
1672 "license": [
1673 {
1674 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1675 "shortName": "bsdOriginal",
1676 "spdxId": "BSD-4-Clause",
1677 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1678 }
1679 ],
1680 "name": "python2.7-amqp-2.3.1"
328 1681 },
329 "python2.7-termcolor-1.1.0": {
330 "MIT License": "http://spdx.org/licenses/MIT"
1682 {
1683 "license": [
1684 {
1685 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1686 "shortName": "bsdOriginal",
1687 "spdxId": "BSD-4-Clause",
1688 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1689 }
1690 ],
1691 "name": "python2.7-vine-1.1.4"
331 1692 },
332 "python2.7-testpath-0.1": {
333 "MIT License": "http://spdx.org/licenses/MIT"
1693 {
1694 "license": [
1695 {
1696 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1697 "shortName": "bsdOriginal",
1698 "spdxId": "BSD-4-Clause",
1699 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1700 }
1701 ],
1702 "name": "python2.7-billiard-3.5.0.3"
1703 },
1704 {
1705 "license": [
1706 {
1707 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1708 "shortName": "bsdOriginal",
1709 "spdxId": "BSD-4-Clause",
1710 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1711 }
1712 ],
1713 "name": "python2.7-itsdangerous-0.24"
334 1714 },
335 "python2.7-traitlets-4.3.2": {
336 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1715 {
1716 "license": [
1717 {
1718 "fullName": "MIT License",
1719 "shortName": "mit",
1720 "spdxId": "MIT",
1721 "url": "http://spdx.org/licenses/MIT.html"
1722 }
1723 ],
1724 "name": "python2.7-iso8601-0.1.11"
337 1725 },
338 "python2.7-translationstring-1.3": {
339 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1726 {
1727 "license": [
1728 {
1729 "fullName": "Zope Public License 2.1",
1730 "shortName": "zpl21",
1731 "spdxId": "ZPL-2.1",
1732 "url": "http://spdx.org/licenses/ZPL-2.1.html"
1733 }
1734 ],
1735 "name": "python2.7-infrae.cache-1.0.1"
340 1736 },
341 "python2.7-urllib3-1.16": {
342 "MIT License": "http://spdx.org/licenses/MIT"
1737 {
1738 "license": [
1739 {
1740 "fullName": "Python Software Foundation License version 2",
1741 "shortName": "psfl",
1742 "spdxId": "Python-2.0",
1743 "url": "http://spdx.org/licenses/Python-2.0.html"
1744 }
1745 ],
1746 "name": "python2.7-formencode-1.2.4"
343 1747 },
344 "python2.7-venusian-1.0": {
345 "Repoze License": "http://www.repoze.org/LICENSE.txt"
1748 {
1749 "license": [
1750 {
1751 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1752 "shortName": "bsdOriginal",
1753 "spdxId": "BSD-4-Clause",
1754 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1755 }
1756 ],
1757 "name": "python2.7-dogpile.core-0.4.1"
1758 },
1759 {
1760 "license": [
1761 {
1762 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1763 "shortName": "bsdOriginal",
1764 "spdxId": "BSD-4-Clause",
1765 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1766 }
1767 ],
1768 "name": "python2.7-dogpile.cache-0.6.6"
1769 },
1770 {
1771 "license": {
1772 "fullName": "BSD 2-clause \"Simplified\" License",
1773 "shortName": "bsd2",
1774 "spdxId": "BSD-2-Clause",
1775 "url": "http://spdx.org/licenses/BSD-2-Clause.html"
1776 },
1777 "name": "python2.7-docutils-0.14"
346 1778 },
347 "python2.7-waitress-1.0.1": {
348 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
1779 {
1780 "license": [
1781 {
1782 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1783 }
1784 ],
1785 "name": "python2.7-deform-2.0.5"
349 1786 },
350 "python2.7-wcwidth-0.1.7": {
351 "MIT License": "http://spdx.org/licenses/MIT"
1787 {
1788 "license": {
1789 "fullName": "Repoze License",
1790 "url": "http://www.repoze.org/LICENSE.txt"
1791 },
1792 "name": "python2.7-colander-1.4"
1793 },
1794 {
1795 "license": [
1796 {
1797 "fullName": "BSD-like (http://repoze.org/license.html)"
1798 }
1799 ],
1800 "name": "python2.7-chameleon-2.24"
352 1801 },
353 "python2.7-ws4py-0.3.5": {
354 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
1802 {
1803 "license": [
1804 {
1805 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1806 "shortName": "bsdOriginal",
1807 "spdxId": "BSD-4-Clause",
1808 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1809 }
1810 ],
1811 "name": "python2.7-cssselect-1.0.3"
355 1812 },
356 "python2.7-zope.cachedescriptors-4.0.0": {
357 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
1813 {
1814 "license": [
1815 {
1816 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1817 "shortName": "bsdOriginal",
1818 "spdxId": "BSD-4-Clause",
1819 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1820 }
1821 ],
1822 "name": "python2.7-configobj-5.0.6"
1823 },
1824 {
1825 "license": [
1826 {
1827 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1828 "shortName": "bsdOriginal",
1829 "spdxId": "BSD-4-Clause",
1830 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1831 }
1832 ],
1833 "name": "python2.7-channelstream-0.5.2"
358 1834 },
359 "python2.7-zope.deprecation-4.1.2": {
360 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
1835 {
1836 "license": [
1837 {
1838 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1839 "shortName": "bsdOriginal",
1840 "spdxId": "BSD-4-Clause",
1841 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1842 }
1843 ],
1844 "name": "python2.7-ws4py-0.5.1"
361 1845 },
362 "python2.7-zope.interface-4.1.3": {
363 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
1846 {
1847 "license": [
1848 {
1849 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1850 "shortName": "bsdOriginal",
1851 "spdxId": "BSD-4-Clause",
1852 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1853 }
1854 ],
1855 "name": "python2.7-celery-4.1.1"
1856 },
1857 {
1858 "license": [
1859 {
1860 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1861 "shortName": "bsdOriginal",
1862 "spdxId": "BSD-4-Clause",
1863 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1864 }
1865 ],
1866 "name": "python2.7-babel-1.3"
364 1867 },
365 "xz-5.2.2": {
366 "GNU General Public License v2.0 or later": "http://spdx.org/licenses/GPL-2.0+",
367 "GNU Library General Public License v2.1 or later": "http://spdx.org/licenses/LGPL-2.1+"
1868 {
1869 "license": [
1870 {
1871 "fullName": "MIT License",
1872 "shortName": "mit",
1873 "spdxId": "MIT",
1874 "url": "http://spdx.org/licenses/MIT.html"
368 1875 }
369 } No newline at end of file
1876 ],
1877 "name": "python2.7-authomatic-0.1.0.post1"
1878 },
1879 {
1880 "license": [
1881 {
1882 "fullName": "MIT License",
1883 "shortName": "mit",
1884 "spdxId": "MIT",
1885 "url": "http://spdx.org/licenses/MIT.html"
1886 }
1887 ],
1888 "name": "node-grunt-cli-1.2.0"
1889 },
1890 {
1891 "license": [
1892 {
1893 "fullName": "MIT License",
1894 "shortName": "mit",
1895 "spdxId": "MIT",
1896 "url": "http://spdx.org/licenses/MIT.html"
1897 }
1898 ],
1899 "name": "python2.7-rhodecode-testdata-0.10.0"
1900 }
1901 ]
@@ -99,7 +99,7 b' def _commits_as_dict(event, commit_ids, '
99 99
100 100 else:
101 101 try:
102 cs = vcs_repo.get_changeset(commit_id)
102 cs = vcs_repo.get_commit(commit_id)
103 103 except CommitDoesNotExistError:
104 104 continue # maybe its in next repo
105 105
@@ -133,7 +133,7 b' def _commits_as_dict(event, commit_ids, '
133 133 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
134 134 if missing_commits:
135 135 log.error('Inconsistent repository state. '
136 'Missing commits: %s' % ', '.join(missing_commits))
136 'Missing commits: %s', ', '.join(missing_commits))
137 137
138 138 return commits
139 139
@@ -66,8 +66,8 b' def integrations_event_handler(event):'
66 66 exc_info = sys.exc_info()
67 67 store_exception(id(exc_info), exc_info)
68 68 log.exception(
69 'failure occurred when sending event %s to integration %s' % (
70 event, integration))
69 'failure occurred when sending event %s to integration %s',
70 event, integration)
71 71
72 72
73 73 def includeme(config):
@@ -31,8 +31,7 b' class IntegrationTypeRegistry(collection'
31 31 key = IntegrationType.key
32 32 if key in self:
33 33 log.debug(
34 'Overriding existing integration type %s (%s) with %s' % (
35 self[key], key, IntegrationType))
34 'Overriding existing integration type %s (%s) with %s',
35 self[key], key, IntegrationType)
36 36
37 37 self[key] = IntegrationType
38
@@ -28,7 +28,57 b' from rhodecode.integrations import integ'
28 28 log = logging.getLogger(__name__)
29 29
30 30
31 class ValidIntegrationPredicate(object):
32 def __init__(self, val, config):
33 self.val = val
34
35 def text(self):
36 return 'valid_integration_route = %s' % self.val
37
38 phash = text
39
40 def __call__(self, info, request):
41 integration_type = info['match']['integration']
42 integration_id = info['match'].get('integration_id')
43
44 if integration_type not in integration_type_registry:
45 return False
46
47 if integration_id:
48 if not safe_int(integration_id):
49 return False
50
51 integration = Integration.get(integration_id)
52 if not integration:
53 return False
54 if integration.integration_type != integration_type:
55 return False
56
57 # match types to repo or repo group
58 repo_name = info['match'].get('repo_name')
59 repo_group_name = info['match'].get('repo_group_name')
60 repo, repo_group = None, None
61 if repo_name:
62 repo = Repository.get_by_repo_name(repo_name)
63 if not repo:
64 return False
65
66 if repo_group_name:
67 repo_group = RepoGroup.get_by_group_name(repo_group_name)
68 if not repo_group:
69 return False
70
71 if repo and repo.repo_id != integration.repo_id:
72 return False
73 if repo_group and repo_group.group_id != integration.repo_group_id:
74 return False
75
76 return True
77
78
31 79 def includeme(config):
80 config.add_route_predicate(
81 'valid_integration', ValidIntegrationPredicate)
32 82
33 83 # global integrations
34 84 config.add_route('global_integrations_new',
@@ -52,10 +102,10 b' def includeme(config):'
52 102
53 103 config.add_route('global_integrations_create',
54 104 ADMIN_PREFIX + '/integrations/{integration}/new',
55 custom_predicates=(valid_integration,))
105 valid_integration=True)
56 106 config.add_route('global_integrations_edit',
57 107 ADMIN_PREFIX + '/integrations/{integration}/{integration_id}',
58 custom_predicates=(valid_integration,))
108 valid_integration=True)
59 109
60 110 for route_name in ['global_integrations_create', 'global_integrations_edit']:
61 111 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
@@ -92,7 +142,7 b' def includeme(config):'
92 142 config.add_route('repo_group_integrations_list',
93 143 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}'),
94 144 repo_group_route=True,
95 custom_predicates=(valid_integration,))
145 valid_integration=True)
96 146 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
97 147 attr='integration_list',
98 148 renderer='rhodecode:templates/admin/integrations/list.mako',
@@ -102,7 +152,7 b' def includeme(config):'
102 152 config.add_route('repo_group_integrations_create',
103 153 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/new'),
104 154 repo_group_route=True,
105 custom_predicates=(valid_integration,))
155 valid_integration=True)
106 156 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
107 157 attr='settings_get',
108 158 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -117,7 +167,7 b' def includeme(config):'
117 167 config.add_route('repo_group_integrations_edit',
118 168 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/{integration_id}'),
119 169 repo_group_route=True,
120 custom_predicates=(valid_integration,))
170 valid_integration=True)
121 171
122 172 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
123 173 attr='settings_get',
@@ -152,7 +202,7 b' def includeme(config):'
152 202 config.add_route('repo_integrations_list',
153 203 add_route_requirements('/{repo_name}/settings/integrations/{integration}'),
154 204 repo_route=True,
155 custom_predicates=(valid_integration,))
205 valid_integration=True)
156 206 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
157 207 attr='integration_list',
158 208 request_method='GET',
@@ -162,7 +212,7 b' def includeme(config):'
162 212 config.add_route('repo_integrations_create',
163 213 add_route_requirements('/{repo_name}/settings/integrations/{integration}/new'),
164 214 repo_route=True,
165 custom_predicates=(valid_integration,))
215 valid_integration=True)
166 216 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
167 217 attr='settings_get',
168 218 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -177,7 +227,7 b' def includeme(config):'
177 227 config.add_route('repo_integrations_edit',
178 228 add_route_requirements('/{repo_name}/settings/integrations/{integration}/{integration_id}'),
179 229 repo_route=True,
180 custom_predicates=(valid_integration,))
230 valid_integration=True)
181 231 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
182 232 attr='settings_get',
183 233 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -188,43 +238,3 b' def includeme(config):'
188 238 renderer='rhodecode:templates/admin/integrations/form.mako',
189 239 request_method='POST',
190 240 route_name='repo_integrations_edit')
191
192
193
194 def valid_integration(info, request):
195 integration_type = info['match']['integration']
196 integration_id = info['match'].get('integration_id')
197
198 if integration_type not in integration_type_registry:
199 return False
200
201 if integration_id:
202 if not safe_int(integration_id):
203 return False
204
205 integration = Integration.get(integration_id)
206 if not integration:
207 return False
208 if integration.integration_type != integration_type:
209 return False
210
211 # match types to repo or repo group
212 repo_name = info['match'].get('repo_name')
213 repo_group_name = info['match'].get('repo_group_name')
214 repo, repo_group = None, None
215 if repo_name:
216 repo = Repository.get_by_repo_name(repo_name)
217 if not repo:
218 return False
219
220 if repo_group_name:
221 repo_group = RepoGroup.get_by_group_name(repo_group_name)
222 if not repo_group:
223 return False
224
225 if repo and repo.repo_id != integration.repo_id:
226 return False
227 if repo_group and repo_group.group_id != integration.repo_group_id:
228 return False
229
230 return True
@@ -22,6 +22,9 b' import colander'
22 22 import string
23 23 import collections
24 24 import logging
25 import requests
26 from requests.adapters import HTTPAdapter
27 from requests.packages.urllib3.util.retry import Retry
25 28
26 29 from mako import exceptions
27 30
@@ -320,3 +323,33 b' def render_with_traceback(template, *arg'
320 323 except Exception:
321 324 log.error(exceptions.text_error_template().render())
322 325 raise
326
327
328 STATUS_400 = (400, 401, 403)
329 STATUS_500 = (500, 502, 504)
330
331
332 def requests_retry_call(
333 retries=3, backoff_factor=0.3, status_forcelist=STATUS_400+STATUS_500,
334 session=None):
335 """
336 session = requests_retry_session()
337 response = session.get('http://example.com')
338
339 :param retries:
340 :param backoff_factor:
341 :param status_forcelist:
342 :param session:
343 """
344 session = session or requests.Session()
345 retry = Retry(
346 total=retries,
347 read=retries,
348 connect=retries,
349 backoff_factor=backoff_factor,
350 status_forcelist=status_forcelist,
351 )
352 adapter = HTTPAdapter(max_retries=retry)
353 session.mount('http://', adapter)
354 session.mount('https://', adapter)
355 return session
@@ -35,7 +35,7 b' from rhodecode.integrations.types.base i'
35 35
36 36 log = logging.getLogger(__name__)
37 37
38 repo_push_template_plaintext = Template('''
38 REPO_PUSH_TEMPLATE_PLAINTEXT = Template('''
39 39 Commits:
40 40
41 41 % for commit in data['push']['commits']:
@@ -46,9 +46,7 b' Commits:'
46 46 % endfor
47 47 ''')
48 48
49 ## TODO (marcink): think about putting this into a file, or use base.mako email template
50
51 repo_push_template_html = Template('''
49 REPO_PUSH_TEMPLATE_HTML = Template('''
52 50 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
53 51 <html xmlns="http://www.w3.org/1999/xhtml">
54 52 <head>
@@ -283,13 +281,13 b' def repo_push_handler(data, settings):'
283 281 branch['name'] for branch in data['push']['branches']))
284 282
285 283 email_body_plaintext = render_with_traceback(
286 repo_push_template_plaintext,
284 REPO_PUSH_TEMPLATE_PLAINTEXT,
287 285 data=data,
288 286 subject=subject,
289 287 instance_url=server_url)
290 288
291 289 email_body_html = render_with_traceback(
292 repo_push_template_html,
290 REPO_PUSH_TEMPLATE_HTML,
293 291 data=data,
294 292 subject=subject,
295 293 instance_url=server_url)
@@ -31,7 +31,8 b' from rhodecode.lib import helpers as h'
31 31 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
32 32 from rhodecode.lib.colander_utils import strip_whitespace
33 33 from rhodecode.integrations.types.base import (
34 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback)
34 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback,
35 requests_retry_call)
35 36
36 37 log = logging.getLogger(__name__)
37 38
@@ -119,11 +120,11 b' class HipchatIntegrationType(Integration'
119 120
120 121 def send_event(self, event):
121 122 if event.__class__ not in self.valid_events:
122 log.debug('event not valid: %r' % event)
123 log.debug('event not valid: %r', event)
123 124 return
124 125
125 126 if event.name not in self.settings['events']:
126 log.debug('event ignored: %r' % event)
127 log.debug('event ignored: %r', event)
127 128 return
128 129
129 130 data = event.as_dict()
@@ -131,7 +132,7 b' class HipchatIntegrationType(Integration'
131 132 text = '<b>%s<b> caused a <b>%s</b> event' % (
132 133 data['actor']['username'], event.name)
133 134
134 log.debug('handling hipchat event for %s' % event.name)
135 log.debug('handling hipchat event for %s', event.name)
135 136
136 137 if isinstance(event, events.PullRequestCommentEvent):
137 138 text = self.format_pull_request_comment_event(event, data)
@@ -144,7 +145,7 b' class HipchatIntegrationType(Integration'
144 145 elif isinstance(event, events.RepoCreateEvent):
145 146 text = self.format_repo_create_event(data)
146 147 else:
147 log.error('unhandled event type: %r' % event)
148 log.error('unhandled event type: %r', event)
148 149
149 150 run_task(post_text_to_hipchat, self.settings, text)
150 151
@@ -242,12 +243,12 b' class HipchatIntegrationType(Integration'
242 243
243 244 @async_task(ignore_result=True, base=RequestContextTask)
244 245 def post_text_to_hipchat(settings, text):
245 log.debug('sending %s to hipchat %s' % (text, settings['server_url']))
246 log.debug('sending %s to hipchat %s', text, settings['server_url'])
246 247 json_message = {
247 248 "message": text,
248 249 "color": settings.get('color', 'yellow'),
249 250 "notify": settings.get('notify', False),
250 251 }
251
252 resp = requests.post(settings['server_url'], json=json_message, timeout=60)
252 req_session = requests_retry_call()
253 resp = req_session.post(settings['server_url'], json=json_message, timeout=60)
253 254 resp.raise_for_status() # raise exception on a failed request
@@ -35,7 +35,8 b' from rhodecode.lib import helpers as h'
35 35 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
36 36 from rhodecode.lib.colander_utils import strip_whitespace
37 37 from rhodecode.integrations.types.base import (
38 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback)
38 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback,
39 requests_retry_call)
39 40
40 41 log = logging.getLogger(__name__)
41 42
@@ -110,11 +111,11 b' class SlackIntegrationType(IntegrationTy'
110 111
111 112 def send_event(self, event):
112 113 if event.__class__ not in self.valid_events:
113 log.debug('event not valid: %r' % event)
114 log.debug('event not valid: %r', event)
114 115 return
115 116
116 117 if event.name not in self.settings['events']:
117 log.debug('event ignored: %r' % event)
118 log.debug('event ignored: %r', event)
118 119 return
119 120
120 121 data = event.as_dict()
@@ -127,7 +128,7 b' class SlackIntegrationType(IntegrationTy'
127 128 fields = None
128 129 overrides = None
129 130
130 log.debug('handling slack event for %s' % event.name)
131 log.debug('handling slack event for %s', event.name)
131 132
132 133 if isinstance(event, events.PullRequestCommentEvent):
133 134 (title, text, fields, overrides) \
@@ -141,7 +142,7 b' class SlackIntegrationType(IntegrationTy'
141 142 elif isinstance(event, events.RepoCreateEvent):
142 143 title, text = self.format_repo_create_event(data)
143 144 else:
144 log.error('unhandled event type: %r' % event)
145 log.error('unhandled event type: %r', event)
145 146
146 147 run_task(post_text_to_slack, self.settings, title, text, fields, overrides)
147 148
@@ -314,8 +315,7 b' def html_to_slack_links(message):'
314 315
315 316 @async_task(ignore_result=True, base=RequestContextTask)
316 317 def post_text_to_slack(settings, title, text, fields=None, overrides=None):
317 log.debug('sending %s (%s) to slack %s' % (
318 title, text, settings['service']))
318 log.debug('sending %s (%s) to slack %s', title, text, settings['service'])
319 319
320 320 fields = fields or []
321 321 overrides = overrides or {}
@@ -345,6 +345,6 b' def post_text_to_slack(settings, title, '
345 345 "username": settings.get('username', 'Rhodecode'),
346 346 "attachments": [message_data]
347 347 }
348
349 resp = requests.post(settings['service'], json=json_message, timeout=60)
348 req_session = requests_retry_call()
349 resp = req_session.post(settings['service'], json=json_message, timeout=60)
350 350 resp.raise_for_status() # raise exception on a failed request
@@ -23,17 +23,14 b' from __future__ import unicode_literals'
23 23 import deform
24 24 import deform.widget
25 25 import logging
26 import requests
27 import requests.adapters
28 26 import colander
29 from requests.packages.urllib3.util.retry import Retry
30 27
31 28 import rhodecode
32 29 from rhodecode import events
33 30 from rhodecode.translation import _
34 31 from rhodecode.integrations.types.base import (
35 32 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
36 WebhookDataHandler, WEBHOOK_URL_VARS)
33 WebhookDataHandler, WEBHOOK_URL_VARS, requests_retry_call)
37 34 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
38 35 from rhodecode.model.validation_schema import widgets
39 36
@@ -171,11 +168,11 b' class WebhookIntegrationType(Integration'
171 168 'handling event %s with Webhook integration %s', event.name, self)
172 169
173 170 if event.__class__ not in self.valid_events:
174 log.debug('event not valid: %r' % event)
171 log.debug('event not valid: %r', event)
175 172 return
176 173
177 174 if event.name not in self.settings['events']:
178 log.debug('event ignored: %r' % event)
175 log.debug('event ignored: %r', event)
179 176 return
180 177
181 178 data = event.as_dict()
@@ -233,11 +230,6 b' def post_to_webhook(url_calls, settings)'
233 230 'utc_timestamp': datetime.datetime(2017, 11, 30, 13, 0, 1, 569276)
234 231
235 232 """
236 max_retries = 3
237 retries = Retry(
238 total=max_retries,
239 backoff_factor=0.15,
240 status_forcelist=[500, 502, 503, 504])
241 233 call_headers = {
242 234 'User-Agent': 'RhodeCode-webhook-caller/{}'.format(
243 235 rhodecode.__version__)
@@ -247,9 +239,7 b' def post_to_webhook(url_calls, settings)'
247 239 token = get_web_token(settings)
248 240
249 241 for url, headers, data in url_calls:
250 req_session = requests.Session()
251 req_session.mount( # retry max N times
252 'http://', requests.adapters.HTTPAdapter(max_retries=retries))
242 req_session = requests_retry_call()
253 243
254 244 method = settings.get('method_type') or 'post'
255 245 call_method = getattr(req_session, method)
@@ -65,6 +65,7 b' ACTIONS_V1 = {'
65 65 'repo.edit': {'old_data': {}},
66 66 'repo.edit.permissions': {},
67 67 'repo.edit.permissions.branch': {},
68 'repo.archive': {'old_data': {}},
68 69 'repo.delete': {'old_data': {}},
69 70
70 71 'repo.archive.download': {'user_agent': '', 'archive_name': '',
@@ -68,7 +68,6 b' class PasswordGenerator(object):'
68 68 This is a simple class for generating password from different sets of
69 69 characters
70 70 usage::
71
72 71 passwd_gen = PasswordGenerator()
73 72 #print 8-letter password containing only big and small letters
74 73 of alphabet
@@ -322,6 +321,7 b' def _cached_perms_data(user_id, scope, u'
322 321
323 322 class PermOrigin(object):
324 323 SUPER_ADMIN = 'superadmin'
324 ARCHIVED = 'archived'
325 325
326 326 REPO_USER = 'user:%s'
327 327 REPO_USERGROUP = 'usergroup:%s'
@@ -463,8 +463,14 b' class PermissionCalculator(object):'
463 463 # repositories
464 464 for perm in self.default_repo_perms:
465 465 r_k = perm.UserRepoToPerm.repository.repo_name
466 archived = perm.UserRepoToPerm.repository.archived
466 467 p = 'repository.admin'
467 468 self.permissions_repositories[r_k] = p, PermOrigin.SUPER_ADMIN
469 # special case for archived repositories, which we block still even for
470 # super admins
471 if archived:
472 p = 'repository.read'
473 self.permissions_repositories[r_k] = p, PermOrigin.ARCHIVED
468 474
469 475 # repository groups
470 476 for perm in self.default_repo_groups_perms:
@@ -572,6 +578,7 b' class PermissionCalculator(object):'
572 578 def _calculate_default_permissions_repositories(self, user_inherit_object_permissions):
573 579 for perm in self.default_repo_perms:
574 580 r_k = perm.UserRepoToPerm.repository.repo_name
581 archived = perm.UserRepoToPerm.repository.archived
575 582 p = perm.Permission.permission_name
576 583 o = PermOrigin.REPO_DEFAULT
577 584 self.permissions_repositories[r_k] = p, o
@@ -602,6 +609,15 b' class PermissionCalculator(object):'
602 609 o = PermOrigin.SUPER_ADMIN
603 610 self.permissions_repositories[r_k] = p, o
604 611
612 # finally in case of archived repositories, we downgrade higher
613 # permissions to read
614 if archived:
615 current_perm = self.permissions_repositories[r_k]
616 if current_perm in ['repository.write', 'repository.admin']:
617 p = 'repository.read'
618 o = PermOrigin.ARCHIVED
619 self.permissions_repositories[r_k] = p, o
620
605 621 def _calculate_default_permissions_repository_branches(self, user_inherit_object_permissions):
606 622 for perm in self.default_branch_repo_perms:
607 623
@@ -611,8 +627,11 b' class PermissionCalculator(object):'
611 627 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
612 628
613 629 if not self.explicit:
614 # TODO(marcink): fix this for multiple entries
615 cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none'
630 cur_perm = self.permissions_repository_branches.get(r_k)
631 if cur_perm:
632 cur_perm = cur_perm[pattern]
633 cur_perm = cur_perm or 'branch.none'
634
616 635 p = self._choose_permission(p, cur_perm)
617 636
618 637 # NOTE(marcink): register all pattern/perm instances in this
@@ -784,8 +803,7 b' class PermissionCalculator(object):'
784 803
785 804 multiple_counter[r_k] += 1
786 805 if multiple_counter[r_k] > 1:
787 # TODO(marcink): fix this for multi branch support, and multiple entries
788 cur_perm = self.permissions_repository_branches[r_k]
806 cur_perm = self.permissions_repository_branches[r_k][pattern]
789 807 p = self._choose_permission(p, cur_perm)
790 808
791 809 self.permissions_repository_branches[r_k] = pattern, p, o
@@ -803,8 +821,10 b' class PermissionCalculator(object):'
803 821 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
804 822
805 823 if not self.explicit:
806 # TODO(marcink): fix this for multiple entries
807 cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none'
824 cur_perm = self.permissions_repository_branches.get(r_k)
825 if cur_perm:
826 cur_perm = cur_perm[pattern]
827 cur_perm = cur_perm or 'branch.none'
808 828 p = self._choose_permission(p, cur_perm)
809 829
810 830 # NOTE(marcink): register all pattern/perm instances in this
@@ -858,8 +878,7 b' class PermissionCalculator(object):'
858 878 p = perm.Permission.permission_name
859 879
860 880 if not self.explicit:
861 cur_perm = self.permissions_repository_groups.get(
862 rg_k, 'group.none')
881 cur_perm = self.permissions_repository_groups.get(rg_k, 'group.none')
863 882 p = self._choose_permission(p, cur_perm)
864 883
865 884 self.permissions_repository_groups[rg_k] = p, o
@@ -920,8 +939,7 b' class PermissionCalculator(object):'
920 939 p = perm.Permission.permission_name
921 940
922 941 if not self.explicit:
923 cur_perm = self.permissions_user_groups.get(
924 ug_k, 'usergroup.none')
942 cur_perm = self.permissions_user_groups.get(ug_k, 'usergroup.none')
925 943 p = self._choose_permission(p, cur_perm)
926 944
927 945 self.permissions_user_groups[ug_k] = p, o
@@ -979,7 +997,7 b' def allowed_auth_token_access(view_name,'
979 997 }
980 998
981 999 log.debug(
982 'Allowed views for AUTH TOKEN access: %s' % (whitelist,))
1000 'Allowed views for AUTH TOKEN access: %s', whitelist)
983 1001 auth_token_access_valid = False
984 1002
985 1003 for entry in whitelist:
@@ -998,8 +1016,9 b' def allowed_auth_token_access(view_name,'
998 1016 break
999 1017
1000 1018 if auth_token_access_valid:
1001 log.debug('view: `%s` matches entry in whitelist: %s'
1002 % (view_name, whitelist))
1019 log.debug('view: `%s` matches entry in whitelist: %s',
1020 view_name, whitelist)
1021
1003 1022 else:
1004 1023 msg = ('view: `%s` does *NOT* match any entry in whitelist: %s'
1005 1024 % (view_name, whitelist))
@@ -1190,7 +1209,7 b' class AuthUser(object):'
1190 1209
1191 1210 log.debug(
1192 1211 'Computing PERMISSION tree for user %s scope `%s` '
1193 'with caching: %s[TTL: %ss]' % (user, scope, cache_on, cache_seconds or 0))
1212 'with caching: %s[TTL: %ss]', user, scope, cache_on, cache_seconds or 0)
1194 1213
1195 1214 cache_namespace_uid = 'cache_user_auth.{}'.format(user_id)
1196 1215 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
@@ -1214,8 +1233,8 b' class AuthUser(object):'
1214 1233 for k in result:
1215 1234 result_repr.append((k, len(result[k])))
1216 1235 total = time.time() - start
1217 log.debug('PERMISSION tree for user %s computed in %.3fs: %s' % (
1218 user, total, result_repr))
1236 log.debug('PERMISSION tree for user %s computed in %.3fs: %s',
1237 user, total, result_repr)
1219 1238
1220 1239 return result
1221 1240
@@ -1352,12 +1371,12 b' class AuthUser(object):'
1352 1371 allowed_ips = AuthUser.get_allowed_ips(
1353 1372 user_id, cache=True, inherit_from_default=inherit_from_default)
1354 1373 if check_ip_access(source_ip=ip_addr, allowed_ips=allowed_ips):
1355 log.debug('IP:%s for user %s is in range of %s' % (
1356 ip_addr, user_id, allowed_ips))
1374 log.debug('IP:%s for user %s is in range of %s',
1375 ip_addr, user_id, allowed_ips)
1357 1376 return True
1358 1377 else:
1359 1378 log.info('Access for IP:%s forbidden for user %s, '
1360 'not in %s' % (ip_addr, user_id, allowed_ips))
1379 'not in %s', ip_addr, user_id, allowed_ips)
1361 1380 return False
1362 1381
1363 1382 def get_branch_permissions(self, repo_name, perms=None):
@@ -1593,7 +1612,7 b' class LoginRequired(object):'
1593 1612 _ = request.translate
1594 1613
1595 1614 loc = "%s:%s" % (cls.__class__.__name__, func.__name__)
1596 log.debug('Starting login restriction checks for user: %s' % (user,))
1615 log.debug('Starting login restriction checks for user: %s', user)
1597 1616 # check if our IP is allowed
1598 1617 ip_access_valid = True
1599 1618 if not user.ip_allowed:
@@ -1610,7 +1629,7 b' class LoginRequired(object):'
1610 1629
1611 1630 # explicit controller is enabled or API is in our whitelist
1612 1631 if self.auth_token_access or auth_token_access_valid:
1613 log.debug('Checking AUTH TOKEN access for %s' % (cls,))
1632 log.debug('Checking AUTH TOKEN access for %s', cls)
1614 1633 db_user = user.get_instance()
1615 1634
1616 1635 if db_user:
@@ -1626,36 +1645,33 b' class LoginRequired(object):'
1626 1645
1627 1646 if _auth_token and token_match:
1628 1647 auth_token_access_valid = True
1629 log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],))
1648 log.debug('AUTH TOKEN ****%s is VALID', _auth_token[-4:])
1630 1649 else:
1631 1650 auth_token_access_valid = False
1632 1651 if not _auth_token:
1633 1652 log.debug("AUTH TOKEN *NOT* present in request")
1634 1653 else:
1635 log.warning(
1636 "AUTH TOKEN ****%s *NOT* valid" % _auth_token[-4:])
1637
1638 log.debug('Checking if %s is authenticated @ %s' % (user.username, loc))
1654 log.warning("AUTH TOKEN ****%s *NOT* valid", _auth_token[-4:])
1655
1656 log.debug('Checking if %s is authenticated @ %s', user.username, loc)
1639 1657 reason = 'RHODECODE_AUTH' if user.is_authenticated \
1640 1658 else 'AUTH_TOKEN_AUTH'
1641 1659
1642 1660 if ip_access_valid and (
1643 1661 user.is_authenticated or auth_token_access_valid):
1644 log.info(
1645 'user %s authenticating with:%s IS authenticated on func %s'
1646 % (user, reason, loc))
1662 log.info('user %s authenticating with:%s IS authenticated on func %s',
1663 user, reason, loc)
1647 1664
1648 1665 return func(*fargs, **fkwargs)
1649 1666 else:
1650 1667 log.warning(
1651 1668 'user %s authenticating with:%s NOT authenticated on '
1652 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s'
1653 % (user, reason, loc, ip_access_valid,
1654 auth_token_access_valid))
1669 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s',
1670 user, reason, loc, ip_access_valid, auth_token_access_valid)
1655 1671 # we preserve the get PARAM
1656 1672 came_from = get_came_from(request)
1657 1673
1658 log.debug('redirecting to login page with %s' % (came_from,))
1674 log.debug('redirecting to login page with %s', came_from)
1659 1675 raise HTTPFound(
1660 1676 h.route_path('login', _query={'came_from': came_from}))
1661 1677
@@ -1678,7 +1694,7 b' class NotAnonymous(object):'
1678 1694 self.user = cls._rhodecode_user
1679 1695 request = self._get_request()
1680 1696 _ = request.translate
1681 log.debug('Checking if user is not anonymous @%s' % cls)
1697 log.debug('Checking if user is not anonymous @%s', cls)
1682 1698
1683 1699 anonymous = self.user.username == User.DEFAULT_USER
1684 1700
@@ -1939,7 +1955,7 b' class PermsFunction(object):'
1939 1955 frame = inspect.currentframe()
1940 1956 stack_trace = traceback.format_stack(frame)
1941 1957 log.error('Checking bool value on a class instance of perm '
1942 'function is not allowed: %s' % ''.join(stack_trace))
1958 'function is not allowed: %s', ''.join(stack_trace))
1943 1959 # rather than throwing errors, here we always return False so if by
1944 1960 # accident someone checks truth for just an instance it will always end
1945 1961 # up in returning False
@@ -2182,9 +2198,8 b' class _BaseApiPerm(object):'
2182 2198 if user_group_name:
2183 2199 check_scope += ', user_group_name:%s' % (user_group_name,)
2184 2200
2185 log.debug(
2186 'checking cls:%s %s %s @ %s'
2187 % (cls_name, self.required_perms, check_scope, check_location))
2201 log.debug('checking cls:%s %s %s @ %s',
2202 cls_name, self.required_perms, check_scope, check_location)
2188 2203 if not user:
2189 2204 log.debug('Empty User passed into arguments')
2190 2205 return False
@@ -2305,7 +2320,7 b' def check_ip_access(source_ip, allowed_i'
2305 2320 :param source_ip:
2306 2321 :param allowed_ips: list of allowed ips together with mask
2307 2322 """
2308 log.debug('checking if ip:%s is subnet of %s' % (source_ip, allowed_ips))
2323 log.debug('checking if ip:%s is subnet of %s', source_ip, allowed_ips)
2309 2324 source_ip_address = ipaddress.ip_address(safe_unicode(source_ip))
2310 2325 if isinstance(allowed_ips, (tuple, list, set)):
2311 2326 for ip in allowed_ips:
@@ -2313,8 +2328,7 b' def check_ip_access(source_ip, allowed_i'
2313 2328 try:
2314 2329 network_address = ipaddress.ip_network(ip, strict=False)
2315 2330 if source_ip_address in network_address:
2316 log.debug('IP %s is network %s' %
2317 (source_ip_address, network_address))
2331 log.debug('IP %s is network %s', source_ip_address, network_address)
2318 2332 return True
2319 2333 # for any case we cannot determine the IP, don't crash just
2320 2334 # skip it and log as error, we want to say forbidden still when
@@ -180,7 +180,12 b' def vcs_operation_context('
180 180 ui_settings = settings_model.get_ui_settings()
181 181
182 182 # NOTE(marcink): This should be also in sync with
183 # rhodecode/apps/ssh_support/lib/backends/base.py:update_enviroment scm_data
183 # rhodecode/apps/ssh_support/lib/backends/base.py:update_environment scm_data
184 store = [x for x in ui_settings if x.key == '/']
185 repo_store = ''
186 if store:
187 repo_store = store[0].value
188
184 189 scm_data = {
185 190 'ip': get_ip_addr(environ),
186 191 'username': username,
@@ -189,6 +194,7 b' def vcs_operation_context('
189 194 'repository': repo_name,
190 195 'scm': scm,
191 196 'config': rhodecode.CONFIG['__file__'],
197 'repo_store': repo_store,
192 198 'make_lock': make_lock,
193 199 'locked_by': locked_by,
194 200 'server_url': utils2.get_server_url(environ),
@@ -216,7 +222,7 b' class BasicAuth(AuthBasicAuthenticator):'
216 222 try:
217 223 return get_exception(safe_int(http_code))
218 224 except Exception:
219 log.exception('Failed to fetch response for code %s' % http_code)
225 log.exception('Failed to fetch response for code %s', http_code)
220 226 return HTTPForbidden
221 227
222 228 def get_rc_realm(self):
@@ -357,6 +363,28 b' def attach_context_attributes(context, r'
357 363 'appenlight.api_public_key', '')
358 364 context.appenlight_server_url = config.get('appenlight.server_url', '')
359 365
366 diffmode = {
367 "unified": "unified",
368 "sideside": "sideside"
369 }.get(request.GET.get('diffmode'))
370
371 if diffmode and diffmode != request.session.get('rc_user_session_attr.diffmode'):
372 request.session['rc_user_session_attr.diffmode'] = diffmode
373
374 # session settings per user
375 session_attrs = {
376 # defaults
377 "clone_url_format": "http",
378 "diffmode": "sideside"
379 }
380 for k, v in request.session.items():
381 pref = 'rc_user_session_attr.'
382 if k and k.startswith(pref):
383 k = k[len(pref):]
384 session_attrs[k] = v
385
386 context.user_session_attrs = session_attrs
387
360 388 # JS template context
361 389 context.template_context = {
362 390 'repo_name': None,
@@ -367,6 +395,7 b' def attach_context_attributes(context, r'
367 395 'email': None,
368 396 'notification_status': False
369 397 },
398 'session_attrs': session_attrs,
370 399 'visual': {
371 400 'default_renderer': None
372 401 },
@@ -385,18 +414,6 b' def attach_context_attributes(context, r'
385 414 }
386 415 # END CONFIG VARS
387 416
388 diffmode = 'sideside'
389 if request.GET.get('diffmode'):
390 if request.GET['diffmode'] == 'unified':
391 diffmode = 'unified'
392 elif request.session.get('diffmode'):
393 diffmode = request.session['diffmode']
394
395 context.diffmode = diffmode
396
397 if request.session.get('diffmode') != diffmode:
398 request.session['diffmode'] = diffmode
399
400 417 context.csrf_token = auth.get_csrf_token(session=request.session)
401 418 context.backends = rhodecode.BACKENDS.keys()
402 419 context.backends.sort()
@@ -26,11 +26,13 b' by celery daemon'
26 26 import os
27 27 import time
28 28
29 from pyramid_mailer.mailer import Mailer
30 from pyramid_mailer.message import Message
31
29 32 import rhodecode
30 33 from rhodecode.lib import audit_logger
31 34 from rhodecode.lib.celerylib import get_logger, async_task, RequestContextTask
32 35 from rhodecode.lib.hooks_base import log_create_repository
33 from rhodecode.lib.rcmail.smtp_mailer import SmtpMailer
34 36 from rhodecode.lib.utils2 import safe_int, str2bool
35 37 from rhodecode.model.db import Session, IntegrityError, Repository, User, true
36 38
@@ -49,8 +51,20 b' def send_email(recipients, subject, body'
49 51 log = get_logger(send_email)
50 52
51 53 email_config = email_config or rhodecode.CONFIG
54
55 mail_server = email_config.get('smtp_server') or None
56 if mail_server is None:
57 log.error("SMTP server information missing. Sending email failed. "
58 "Make sure that `smtp_server` variable is configured "
59 "inside the .ini file")
60 return False
61
52 62 subject = "%s %s" % (email_config.get('email_prefix', ''), subject)
53 if not recipients:
63
64 if recipients:
65 if isinstance(recipients, basestring):
66 recipients = recipients.split(',')
67 else:
54 68 # if recipients are not defined we send to email_config + all admins
55 69 admins = []
56 70 for u in User.query().filter(User.admin == true()).all():
@@ -62,26 +76,44 b' def send_email(recipients, subject, body'
62 76 recipients += [config_email]
63 77 recipients += admins
64 78
65 mail_server = email_config.get('smtp_server') or None
66 if mail_server is None:
67 log.error("SMTP server information missing. Sending email failed. "
68 "Make sure that `smtp_server` variable is configured "
69 "inside the .ini file")
70 return False
79 # translate our LEGACY config into the one that pyramid_mailer supports
80 email_conf = dict(
81 host=mail_server,
82 port=email_config.get('smtp_port'),
83 username=email_config.get('smtp_username'),
84 password=email_config.get('smtp_password'),
85
86 tls=str2bool(email_config.get('smtp_use_tls')),
87 ssl=str2bool(email_config.get('smtp_use_ssl')),
88
89 # SSL key file
90 # keyfile='',
71 91
72 mail_from = email_config.get('app_email_from', 'RhodeCode')
73 user = email_config.get('smtp_username')
74 passwd = email_config.get('smtp_password')
75 mail_port = email_config.get('smtp_port')
76 tls = str2bool(email_config.get('smtp_use_tls'))
77 ssl = str2bool(email_config.get('smtp_use_ssl'))
78 debug = str2bool(email_config.get('debug'))
79 smtp_auth = email_config.get('smtp_auth')
92 # SSL certificate file
93 # certfile='',
94
95 # Location of maildir
96 # queue_path='',
97
98 default_sender=email_config.get('app_email_from', 'RhodeCode'),
99
100 debug=str2bool(email_config.get('smtp_debug')),
101 # /usr/sbin/sendmail Sendmail executable
102 # sendmail_app='',
103
104 # {sendmail_app} -t -i -f {sender} Template for sendmail execution
105 # sendmail_template='',
106 )
80 107
81 108 try:
82 m = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth,
83 mail_port, ssl, tls, debug=debug)
84 m.send(recipients, subject, body, html_body)
109 mailer = Mailer(**email_conf)
110
111 message = Message(subject=subject,
112 sender=email_conf['default_sender'],
113 recipients=recipients,
114 body=body, html=html_body)
115 mailer.send_immediately(message)
116
85 117 except Exception:
86 118 log.exception('Mail sending failed')
87 119 return False
@@ -122,7 +154,7 b' def create_repo(form_data, cur_user):'
122 154 'enable_downloads', defs.get('repo_enable_downloads'))
123 155
124 156 try:
125 repo = RepoModel()._create_repo(
157 RepoModel()._create_repo(
126 158 repo_name=repo_name_full,
127 159 repo_type=repo_type,
128 160 description=description,
@@ -53,23 +53,27 b' class ChannelstreamPermissionException(C'
53 53 pass
54 54
55 55
56 def get_channelstream_server_url(config, endpoint):
57 return 'http://{}{}'.format(config['server'], endpoint)
58
59
56 60 def channelstream_request(config, payload, endpoint, raise_exc=True):
57 61 signer = itsdangerous.TimestampSigner(config['secret'])
58 62 sig_for_server = signer.sign(endpoint)
59 63 secret_headers = {'x-channelstream-secret': sig_for_server,
60 64 'x-channelstream-endpoint': endpoint,
61 65 'Content-Type': 'application/json'}
62 req_url = 'http://{}{}'.format(config['server'], endpoint)
66 req_url = get_channelstream_server_url(config, endpoint)
63 67 response = None
64 68 try:
65 69 response = requests.post(req_url, data=json.dumps(payload),
66 70 headers=secret_headers).json()
67 71 except requests.ConnectionError:
68 log.exception('ConnectionError happened')
72 log.exception('ConnectionError occurred for endpoint %s', req_url)
69 73 if raise_exc:
70 raise ChannelstreamConnectionException()
74 raise ChannelstreamConnectionException(req_url)
71 75 except Exception:
72 log.exception('Exception related to channelstream happened')
76 log.exception('Exception related to Channelstream happened')
73 77 if raise_exc:
74 78 raise ChannelstreamConnectionException()
75 79 return response
@@ -25,15 +25,16 b' from itertools import groupby'
25 25 from pygments import lex
26 26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
27 27 from pygments.lexers.special import TextLexer, Token
28 from pygments.lexers import get_lexer_by_name
28 29
29 30 from rhodecode.lib.helpers import (
30 31 get_lexer_for_filenode, html_escape, get_custom_lexer)
31 from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict
32 from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict, safe_unicode
32 33 from rhodecode.lib.vcs.nodes import FileNode
33 34 from rhodecode.lib.vcs.exceptions import VCSError, NodeDoesNotExistError
34 35 from rhodecode.lib.diff_match_patch import diff_match_patch
35 from rhodecode.lib.diffs import LimitedDiffContainer
36 from pygments.lexers import get_lexer_by_name
36 from rhodecode.lib.diffs import LimitedDiffContainer, DEL_FILENODE, BIN_FILENODE
37
37 38
38 39 plain_text_lexer = get_lexer_by_name(
39 40 'text', stripall=False, stripnl=False, ensurenl=False)
@@ -376,11 +377,11 b' class DiffSet(object):'
376 377 def __init__(self, highlight_mode=HL_REAL, repo_name=None,
377 378 source_repo_name=None,
378 379 source_node_getter=lambda filename: None,
380 target_repo_name=None,
379 381 target_node_getter=lambda filename: None,
380 382 source_nodes=None, target_nodes=None,
381 max_file_size_limit=150 * 1024, # files over this size will
382 # use fast highlighting
383 comments=None,
383 # files over this size will use fast highlighting
384 max_file_size_limit=150 * 1024,
384 385 ):
385 386
386 387 self.highlight_mode = highlight_mode
@@ -390,9 +391,8 b' class DiffSet(object):'
390 391 self.source_nodes = source_nodes or {}
391 392 self.target_nodes = target_nodes or {}
392 393 self.repo_name = repo_name
394 self.target_repo_name = target_repo_name or repo_name
393 395 self.source_repo_name = source_repo_name or repo_name
394 self.comments = comments or {}
395 self.comments_store = self.comments.copy()
396 396 self.max_file_size_limit = max_file_size_limit
397 397
398 398 def render_patchset(self, patchset, source_ref=None, target_ref=None):
@@ -404,6 +404,7 b' class DiffSet(object):'
404 404 file_stats={},
405 405 limited_diff=isinstance(patchset, LimitedDiffContainer),
406 406 repo_name=self.repo_name,
407 target_repo_name=self.target_repo_name,
407 408 source_repo_name=self.source_repo_name,
408 409 source_ref=source_ref,
409 410 target_ref=target_ref,
@@ -416,6 +417,7 b' class DiffSet(object):'
416 417 target_ref=diffset.target_ref,
417 418 repo_name=diffset.repo_name,
418 419 source_repo_name=diffset.source_repo_name,
420 target_repo_name=diffset.target_repo_name,
419 421 ))
420 422 diffset.files.append(filediff)
421 423 diffset.changed_files += 1
@@ -442,7 +444,7 b' class DiffSet(object):'
442 444 return self._lexer_cache[filename]
443 445
444 446 def render_patch(self, patch):
445 log.debug('rendering diff for %r' % patch['filename'])
447 log.debug('rendering diff for %r', patch['filename'])
446 448
447 449 source_filename = patch['original_filename']
448 450 target_filename = patch['filename']
@@ -451,7 +453,10 b' class DiffSet(object):'
451 453 target_lexer = plain_text_lexer
452 454
453 455 if not patch['stats']['binary']:
454 if self.highlight_mode == self.HL_REAL:
456 node_hl_mode = self.HL_NONE if patch['chunks'] == [] else None
457 hl_mode = node_hl_mode or self.highlight_mode
458
459 if hl_mode == self.HL_REAL:
455 460 if (source_filename and patch['operation'] in ('D', 'M')
456 461 and source_filename not in self.source_nodes):
457 462 self.source_nodes[source_filename] = (
@@ -462,12 +467,19 b' class DiffSet(object):'
462 467 self.target_nodes[target_filename] = (
463 468 self.target_node_getter(target_filename))
464 469
465 elif self.highlight_mode == self.HL_FAST:
470 elif hl_mode == self.HL_FAST:
466 471 source_lexer = self._get_lexer_for_filename(source_filename)
467 472 target_lexer = self._get_lexer_for_filename(target_filename)
468 473
469 474 source_file = self.source_nodes.get(source_filename, source_filename)
470 475 target_file = self.target_nodes.get(target_filename, target_filename)
476 raw_id_uid = ''
477 if self.source_nodes.get(source_filename):
478 raw_id_uid = self.source_nodes[source_filename].commit.raw_id
479
480 if not raw_id_uid and self.target_nodes.get(target_filename):
481 # in case this is a new file we only have it in target
482 raw_id_uid = self.target_nodes[target_filename].commit.raw_id
471 483
472 484 source_filenode, target_filenode = None, None
473 485
@@ -509,29 +521,43 b' class DiffSet(object):'
509 521 'target_mode': patch['stats']['new_mode'],
510 522 'limited_diff': isinstance(patch, LimitedDiffContainer),
511 523 'hunks': [],
524 'hunk_ops': None,
512 525 'diffset': self,
526 'raw_id': raw_id_uid,
513 527 })
514 528
515 for hunk in patch['chunks'][1:]:
529 file_chunks = patch['chunks'][1:]
530 for hunk in file_chunks:
516 531 hunkbit = self.parse_hunk(hunk, source_file, target_file)
517 532 hunkbit.source_file_path = source_file_path
518 533 hunkbit.target_file_path = target_file_path
519 534 filediff.hunks.append(hunkbit)
520 535
521 left_comments = {}
522 if source_file_path in self.comments_store:
523 for lineno, comments in self.comments_store[source_file_path].items():
524 left_comments[lineno] = comments
536 # Simulate hunk on OPS type line which doesn't really contain any diff
537 # this allows commenting on those
538 if not file_chunks:
539 actions = []
540 for op_id, op_text in filediff.patch['stats']['ops'].items():
541 if op_id == DEL_FILENODE:
542 actions.append(u'file was removed')
543 elif op_id == BIN_FILENODE:
544 actions.append(u'binary diff hidden')
545 else:
546 actions.append(safe_unicode(op_text))
547 action_line = u'NO CONTENT: ' + \
548 u', '.join(actions) or u'UNDEFINED_ACTION'
525 549
526 if target_file_path in self.comments_store:
527 for lineno, comments in self.comments_store[target_file_path].items():
528 left_comments[lineno] = comments
550 hunk_ops = {'source_length': 0, 'source_start': 0,
551 'lines': [
552 {'new_lineno': 0, 'old_lineno': 1,
553 'action': 'unmod-no-hl', 'line': action_line}
554 ],
555 'section_header': u'', 'target_start': 1, 'target_length': 1}
529 556
530 # left comments are one that we couldn't place in diff lines.
531 # could be outdated, or the diff changed and this line is no
532 # longer available
533 filediff.left_comments = left_comments
534
557 hunkbit = self.parse_hunk(hunk_ops, source_file, target_file)
558 hunkbit.source_file_path = source_file_path
559 hunkbit.target_file_path = target_file_path
560 filediff.hunk_ops = hunkbit
535 561 return filediff
536 562
537 563 def parse_hunk(self, hunk, source_file, target_file):
@@ -546,10 +572,10 b' class DiffSet(object):'
546 572 before, after = [], []
547 573
548 574 for line in hunk['lines']:
549
550 if line['action'] == 'unmod':
575 if line['action'] in ['unmod', 'unmod-no-hl']:
576 no_hl = line['action'] == 'unmod-no-hl'
551 577 result.lines.extend(
552 self.parse_lines(before, after, source_file, target_file))
578 self.parse_lines(before, after, source_file, target_file, no_hl=no_hl))
553 579 after.append(line)
554 580 before.append(line)
555 581 elif line['action'] == 'add':
@@ -561,14 +587,18 b' class DiffSet(object):'
561 587 elif line['action'] == 'new-no-nl':
562 588 after.append(line)
563 589
590 all_actions = [x['action'] for x in after] + [x['action'] for x in before]
591 no_hl = {x for x in all_actions} == {'unmod-no-hl'}
564 592 result.lines.extend(
565 self.parse_lines(before, after, source_file, target_file))
593 self.parse_lines(before, after, source_file, target_file, no_hl=no_hl))
594 # NOTE(marcink): we must keep list() call here so we can cache the result...
566 595 result.unified = list(self.as_unified(result.lines))
567 596 result.sideside = result.lines
568 597
569 598 return result
570 599
571 def parse_lines(self, before_lines, after_lines, source_file, target_file):
600 def parse_lines(self, before_lines, after_lines, source_file, target_file,
601 no_hl=False):
572 602 # TODO: dan: investigate doing the diff comparison and fast highlighting
573 603 # on the entire before and after buffered block lines rather than by
574 604 # line, this means we can get better 'fast' highlighting if the context
@@ -612,9 +642,8 b' class DiffSet(object):'
612 642 before_tokens = [('nonl', before['line'])]
613 643 else:
614 644 before_tokens = self.get_line_tokens(
615 line_text=before['line'],
616 line_number=before['old_lineno'],
617 file=source_file)
645 line_text=before['line'], line_number=before['old_lineno'],
646 input_file=source_file, no_hl=no_hl)
618 647 original.lineno = before['old_lineno']
619 648 original.content = before['line']
620 649 original.action = self.action_to_op(before['action'])
@@ -628,13 +657,12 b' class DiffSet(object):'
628 657 else:
629 658 after_tokens = self.get_line_tokens(
630 659 line_text=after['line'], line_number=after['new_lineno'],
631 file=target_file)
660 input_file=target_file, no_hl=no_hl)
632 661 modified.lineno = after['new_lineno']
633 662 modified.content = after['line']
634 663 modified.action = self.action_to_op(after['action'])
635 664
636 modified.get_comment_args = (
637 target_file, 'n', after['new_lineno'])
665 modified.get_comment_args = (target_file, 'n', after['new_lineno'])
638 666
639 667 # diff the lines
640 668 if before_tokens and after_tokens:
@@ -663,24 +691,25 b' class DiffSet(object):'
663 691
664 692 return lines
665 693
666 def get_line_tokens(self, line_text, line_number, file=None):
694 def get_line_tokens(self, line_text, line_number, input_file=None, no_hl=False):
667 695 filenode = None
668 696 filename = None
669 697
670 if isinstance(file, basestring):
671 filename = file
672 elif isinstance(file, FileNode):
673 filenode = file
674 filename = file.unicode_path
698 if isinstance(input_file, basestring):
699 filename = input_file
700 elif isinstance(input_file, FileNode):
701 filenode = input_file
702 filename = input_file.unicode_path
675 703
676 if self.highlight_mode == self.HL_REAL and filenode:
704 hl_mode = self.HL_NONE if no_hl else self.highlight_mode
705 if hl_mode == self.HL_REAL and filenode:
677 706 lexer = self._get_lexer_for_filename(filename)
678 file_size_allowed = file.size < self.max_file_size_limit
707 file_size_allowed = input_file.size < self.max_file_size_limit
679 708 if line_number and file_size_allowed:
680 709 return self.get_tokenized_filenode_line(
681 file, line_number, lexer)
710 input_file, line_number, lexer)
682 711
683 if self.highlight_mode in (self.HL_REAL, self.HL_FAST) and filename:
712 if hl_mode in (self.HL_REAL, self.HL_FAST) and filename:
684 713 lexer = self._get_lexer_for_filename(filename)
685 714 return list(tokenize_string(line_text, lexer))
686 715
@@ -698,6 +727,7 b' class DiffSet(object):'
698 727 'add': '+',
699 728 'del': '-',
700 729 'unmod': ' ',
730 'unmod-no-hl': ' ',
701 731 'old-no-nl': ' ',
702 732 'new-no-nl': ' ',
703 733 }.get(action, action)
@@ -107,7 +107,7 b' class DbManage(object):'
107 107
108 108 checkfirst = not override
109 109 Base.metadata.create_all(checkfirst=checkfirst)
110 log.info('Created tables for %s' % self.dbname)
110 log.info('Created tables for %s', self.dbname)
111 111
112 112 def set_db_version(self):
113 113 ver = DbMigrateVersion()
@@ -115,7 +115,7 b' class DbManage(object):'
115 115 ver.repository_id = 'rhodecode_db_migrations'
116 116 ver.repository_path = 'versions'
117 117 self.sa.add(ver)
118 log.info('db version set to: %s' % __dbversion__)
118 log.info('db version set to: %s', __dbversion__)
119 119
120 120 def run_pre_migration_tasks(self):
121 121 """
@@ -402,7 +402,7 b' class DbManage(object):'
402 402 ('auth_rhodecode_enabled', 'True', 'bool')]:
403 403 if (skip_existing and
404 404 SettingsModel().get_setting_by_name(k) is not None):
405 log.debug('Skipping option %s' % k)
405 log.debug('Skipping option %s', k)
406 406 continue
407 407 setting = RhodeCodeSetting(k, v, t)
408 408 self.sa.add(setting)
@@ -419,7 +419,7 b' class DbManage(object):'
419 419
420 420 if (skip_existing and
421 421 SettingsModel().get_setting_by_name(k) is not None):
422 log.debug('Skipping option %s' % k)
422 log.debug('Skipping option %s', k)
423 423 continue
424 424 setting = RhodeCodeSetting(k, v, t)
425 425 self.sa.add(setting)
@@ -436,7 +436,7 b' class DbManage(object):'
436 436 .scalar()
437 437
438 438 if default is None:
439 log.debug('missing default permission for group %s adding' % g)
439 log.debug('missing default permission for group %s adding', g)
440 440 perm_obj = RepoGroupModel()._create_default_perms(g)
441 441 self.sa.add(perm_obj)
442 442
@@ -484,20 +484,20 b' class DbManage(object):'
484 484 # check proper dir
485 485 if not os.path.isdir(path):
486 486 path_ok = False
487 log.error('Given path %s is not a valid directory' % (path,))
487 log.error('Given path %s is not a valid directory', path)
488 488
489 489 elif not os.path.isabs(path):
490 490 path_ok = False
491 log.error('Given path %s is not an absolute path' % (path,))
491 log.error('Given path %s is not an absolute path', path)
492 492
493 493 # check if path is at least readable.
494 494 if not os.access(path, os.R_OK):
495 495 path_ok = False
496 log.error('Given path %s is not readable' % (path,))
496 log.error('Given path %s is not readable', path)
497 497
498 498 # check write access, warn user about non writeable paths
499 499 elif not os.access(path, os.W_OK) and path_ok:
500 log.warning('No write permission to given path %s' % (path,))
500 log.warning('No write permission to given path %s', path)
501 501
502 502 q = ('Given path %s is not writeable, do you want to '
503 503 'continue with read only mode ? [y/n]' % (path,))
@@ -573,7 +573,7 b' class DbManage(object):'
573 573
574 574 def create_user(self, username, password, email='', admin=False,
575 575 strict_creation_check=True, api_key=None):
576 log.info('creating user `%s`' % username)
576 log.info('creating user `%s`', username)
577 577 user = UserModel().create_or_update(
578 578 username, password, email, firstname=u'RhodeCode', lastname=u'Admin',
579 579 active=True, admin=admin, extern_type="rhodecode",
@@ -13,25 +13,25 b' log = logging.getLogger(__name__)'
13 13
14 14 def usage():
15 15 """Gives usage information."""
16 print """Usage: %(prog)s repository-to-migrate
16 print("""Usage: %(prog)s repository-to-migrate
17 17
18 18 Upgrade your repository to the new flat format.
19 19
20 20 NOTE: You should probably make a backup before running this.
21 """ % {'prog': sys.argv[0]}
21 """ % {'prog': sys.argv[0]})
22 22
23 23 sys.exit(1)
24 24
25 25
26 26 def delete_file(filepath):
27 27 """Deletes a file and prints a message."""
28 log.info('Deleting file: %s' % filepath)
28 log.info('Deleting file: %s', filepath)
29 29 os.remove(filepath)
30 30
31 31
32 32 def move_file(src, tgt):
33 33 """Moves a file and prints a message."""
34 log.info('Moving file %s to %s' % (src, tgt))
34 log.info('Moving file %s to %s', src, tgt)
35 35 if os.path.exists(tgt):
36 36 raise Exception(
37 37 'Cannot move file %s because target %s already exists' % \
@@ -41,13 +41,13 b' def move_file(src, tgt):'
41 41
42 42 def delete_directory(dirpath):
43 43 """Delete a directory and print a message."""
44 log.info('Deleting directory: %s' % dirpath)
44 log.info('Deleting directory: %s', dirpath)
45 45 os.rmdir(dirpath)
46 46
47 47
48 48 def migrate_repository(repos):
49 49 """Does the actual migration to the new repository format."""
50 log.info('Migrating repository at: %s to new format' % repos)
50 log.info('Migrating repository at: %s to new format', repos)
51 51 versions = '%s/versions' % repos
52 52 dirs = os.listdir(versions)
53 53 # Only use int's in list.
@@ -55,7 +55,7 b' def migrate_repository(repos):'
55 55 numdirs.sort() # Sort list.
56 56 for dirname in numdirs:
57 57 origdir = '%s/%s' % (versions, dirname)
58 log.info('Working on directory: %s' % origdir)
58 log.info('Working on directory: %s', origdir)
59 59 files = os.listdir(origdir)
60 60 files.sort()
61 61 for filename in files:
@@ -35,7 +35,7 b' class Pathed(KeyedInstance):'
35 35 """Try to initialize this object's parent, if it has one"""
36 36 parent_path = self.__class__._parent_path(path)
37 37 self.parent = self.__class__.parent(parent_path)
38 log.debug("Getting parent %r:%r" % (self.__class__.parent, parent_path))
38 log.debug("Getting parent %r:%r", self.__class__.parent, parent_path)
39 39 self.parent._init_child(path, self)
40 40
41 41 def _init_child(self, child, path):
@@ -73,14 +73,14 b' class Repository(pathed.Pathed):'
73 73 _versions = 'versions'
74 74
75 75 def __init__(self, path):
76 log.debug('Loading repository %s...' % path)
76 log.debug('Loading repository %s...', path)
77 77 self.verify(path)
78 78 super(Repository, self).__init__(path)
79 79 self.config = cfgparse.Config(os.path.join(self.path, self._config))
80 80 self.versions = version.Collection(os.path.join(self.path,
81 81 self._versions))
82 log.debug('Repository %s loaded successfully' % path)
83 log.debug('Config: %r' % self.config.to_dict())
82 log.debug('Repository %s loaded successfully', path)
83 log.debug('Config: %r', self.config.to_dict())
84 84
85 85 @classmethod
86 86 def verify(cls, path):
@@ -24,10 +24,10 b' class BaseScript(pathed.Pathed):'
24 24 """ # TODO: sphinxfy this and implement it correctly
25 25
26 26 def __init__(self, path):
27 log.debug('Loading script %s...' % path)
27 log.debug('Loading script %s...', path)
28 28 self.verify(path)
29 29 super(BaseScript, self).__init__(path)
30 log.debug('Script %s loaded successfully' % path)
30 log.debug('Script %s loaded successfully', path)
31 31
32 32 @classmethod
33 33 def verify(cls, path):
@@ -311,7 +311,7 b' class User(Base, BaseModel):'
311 311 self.last_login = datetime.datetime.now()
312 312 Session.add(self)
313 313 Session.commit()
314 log.debug('updated user %s lastlogin' % self.username)
314 log.debug('updated user %s lastlogin', self.username)
315 315
316 316 @classmethod
317 317 def create(cls, form_data):
@@ -656,7 +656,7 b' class Repository(Base, BaseModel):'
656 656
657 657 try:
658 658 alias = get_scm(repo_full_path)[0]
659 log.debug('Creating instance of %s repository' % alias)
659 log.debug('Creating instance of %s repository', alias)
660 660 backend = get_backend(alias)
661 661 except VCSError:
662 662 log.error(traceback.format_exc())
@@ -731,7 +731,7 b' class Group(Base, BaseModel):'
731 731 break
732 732 if cnt == parents_recursion_limit:
733 733 # this will prevent accidental infinit loops
734 log.error('group nested more than %s' %
734 log.error('group nested more than %s',
735 735 parents_recursion_limit)
736 736 break
737 737
@@ -1006,7 +1006,7 b' class CacheInvalidation(Base, BaseModel)'
1006 1006 :param key:
1007 1007 """
1008 1008
1009 log.debug('marking %s for invalidation' % key)
1009 log.debug('marking %s for invalidation', key)
1010 1010 inv_obj = Session.query(cls)\
1011 1011 .filter(cls.cache_key == key).scalar()
1012 1012 if inv_obj:
@@ -379,7 +379,7 b' class User(Base, BaseModel):'
379 379 """Update user lastlogin"""
380 380 self.last_login = datetime.datetime.now()
381 381 Session.add(self)
382 log.debug('updated user %s lastlogin' % self.username)
382 log.debug('updated user %s lastlogin', self.username)
383 383
384 384 def __json__(self):
385 385 return dict(
@@ -676,7 +676,7 b' class Repository(Base, BaseModel):'
676 676 repo_full_path = self.repo_full_path
677 677 try:
678 678 alias = get_scm(repo_full_path)[0]
679 log.debug('Creating instance of %s repository' % alias)
679 log.debug('Creating instance of %s repository', alias)
680 680 backend = get_backend(alias)
681 681 except VCSError:
682 682 log.error(traceback.format_exc())
@@ -760,8 +760,7 b' class RepoGroup(Base, BaseModel):'
760 760 break
761 761 if cnt == parents_recursion_limit:
762 762 # this will prevent accidental infinit loops
763 log.error('group nested more than %s' %
764 parents_recursion_limit)
763 log.error('group nested more than %s', parents_recursion_limit)
765 764 break
766 765
767 766 groups.insert(0, gr)
@@ -1095,8 +1094,7 b' class CacheInvalidation(Base, BaseModel)'
1095 1094
1096 1095 key, _prefix, _org_key = cls._get_key(key)
1097 1096 inv_objs = Session.query(cls).filter(cls.cache_args == _org_key).all()
1098 log.debug('marking %s key[s] %s for invalidation' % (len(inv_objs),
1099 _org_key))
1097 log.debug('marking %s key[s] %s for invalidation', len(inv_objs), _org_key)
1100 1098 try:
1101 1099 for inv_obj in inv_objs:
1102 1100 if inv_obj:
@@ -614,15 +614,13 b' class Repository(Base, BaseModel):'
614 614 if (cs_cache != self.changeset_cache or not self.changeset_cache):
615 615 _default = datetime.datetime.fromtimestamp(0)
616 616 last_change = cs_cache.get('date') or _default
617 log.debug('updated repo %s with new cs cache %s'
618 % (self.repo_name, cs_cache))
617 log.debug('updated repo %s with new cs cache %s', self.repo_name, cs_cache)
619 618 self.updated_on = last_change
620 619 self.changeset_cache = cs_cache
621 620 Session().add(self)
622 621 Session().commit()
623 622 else:
624 log.debug('Skipping repo:%s already with latest changes'
625 % self.repo_name)
623 log.debug('Skipping repo:%s already with latest changes', self.repo_name)
626 624
627 625 class RepoGroup(Base, BaseModel):
628 626 __tablename__ = 'groups'
@@ -2415,8 +2415,8 b' class RepoGroup(Base, BaseModel):'
2415 2415 break
2416 2416 if cnt == parents_recursion_limit:
2417 2417 # this will prevent accidental infinit loops
2418 log.error(('more than %s parents found for group %s, stopping '
2419 'recursive parent fetching' % (parents_recursion_limit, self)))
2418 log.error('more than %s parents found for group %s, stopping '
2419 'recursive parent fetching', parents_recursion_limit, self)
2420 2420 break
2421 2421
2422 2422 groups.insert(0, gr)
@@ -2481,8 +2481,8 b' class RepoGroup(Base, BaseModel):'
2481 2481 break
2482 2482 if cnt == parents_recursion_limit:
2483 2483 # this will prevent accidental infinit loops
2484 log.error(('more than %s parents found for group %s, stopping '
2485 'recursive parent fetching' % (parents_recursion_limit, self)))
2484 log.error('more than %s parents found for group %s, stopping '
2485 'recursive parent fetching', parents_recursion_limit, self)
2486 2486 break
2487 2487
2488 2488 groups.insert(0, gr)
@@ -2108,8 +2108,8 b' class RepoGroup(Base, BaseModel):'
2108 2108 break
2109 2109 if cnt == parents_recursion_limit:
2110 2110 # this will prevent accidental infinit loops
2111 log.error(('more than %s parents found for group %s, stopping '
2112 'recursive parent fetching' % (parents_recursion_limit, self)))
2111 log.error('more than %s parents found for group %s, stopping '
2112 'recursive parent fetching', parents_recursion_limit, self)
2113 2113 break
2114 2114
2115 2115 groups.insert(0, gr)
@@ -2100,8 +2100,8 b' class RepoGroup(Base, BaseModel):'
2100 2100 break
2101 2101 if cnt == parents_recursion_limit:
2102 2102 # this will prevent accidental infinit loops
2103 log.error(('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching' % (parents_recursion_limit, self)))
2103 log.error('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching', parents_recursion_limit, self)
2105 2105 break
2106 2106
2107 2107 groups.insert(0, gr)
@@ -2100,8 +2100,8 b' class RepoGroup(Base, BaseModel):'
2100 2100 break
2101 2101 if cnt == parents_recursion_limit:
2102 2102 # this will prevent accidental infinit loops
2103 log.error(('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching' % (parents_recursion_limit, self)))
2103 log.error('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching', parents_recursion_limit, self)
2105 2105 break
2106 2106
2107 2107 groups.insert(0, gr)
@@ -2104,8 +2104,8 b' class RepoGroup(Base, BaseModel):'
2104 2104 break
2105 2105 if cnt == parents_recursion_limit:
2106 2106 # this will prevent accidental infinit loops
2107 log.error(('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching' % (parents_recursion_limit, self)))
2107 log.error('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching', parents_recursion_limit, self)
2109 2109 break
2110 2110
2111 2111 groups.insert(0, gr)
@@ -2104,8 +2104,8 b' class RepoGroup(Base, BaseModel):'
2104 2104 break
2105 2105 if cnt == parents_recursion_limit:
2106 2106 # this will prevent accidental infinit loops
2107 log.error(('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching' % (parents_recursion_limit, self)))
2107 log.error('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching', parents_recursion_limit, self)
2109 2109 break
2110 2110
2111 2111 groups.insert(0, gr)
@@ -2154,8 +2154,8 b' class RepoGroup(Base, BaseModel):'
2154 2154 break
2155 2155 if cnt == parents_recursion_limit:
2156 2156 # this will prevent accidental infinit loops
2157 log.error(('more than %s parents found for group %s, stopping '
2158 'recursive parent fetching' % (parents_recursion_limit, self)))
2157 log.error('more than %s parents found for group %s, stopping '
2158 'recursive parent fetching', parents_recursion_limit, self)
2159 2159 break
2160 2160
2161 2161 groups.insert(0, gr)
@@ -2155,8 +2155,8 b' class RepoGroup(Base, BaseModel):'
2155 2155 break
2156 2156 if cnt == parents_recursion_limit:
2157 2157 # this will prevent accidental infinit loops
2158 log.error(('more than %s parents found for group %s, stopping '
2159 'recursive parent fetching' % (parents_recursion_limit, self)))
2158 log.error('more than %s parents found for group %s, stopping '
2159 'recursive parent fetching', parents_recursion_limit, self)
2160 2160 break
2161 2161
2162 2162 groups.insert(0, gr)
@@ -2352,8 +2352,8 b' class RepoGroup(Base, BaseModel):'
2352 2352 break
2353 2353 if cnt == parents_recursion_limit:
2354 2354 # this will prevent accidental infinit loops
2355 log.error(('more than %s parents found for group %s, stopping '
2356 'recursive parent fetching' % (parents_recursion_limit, self)))
2355 log.error('more than %s parents found for group %s, stopping '
2356 'recursive parent fetching', parents_recursion_limit, self)
2357 2357 break
2358 2358
2359 2359 groups.insert(0, gr)
@@ -74,7 +74,7 b' class User(Base):'
74 74 self.last_login = datetime.datetime.now()
75 75 session.add(self)
76 76 session.commit()
77 log.debug('updated user %s lastlogin' % self.username)
77 log.debug('updated user %s lastlogin', self.username)
78 78 except (DatabaseError,):
79 79 session.rollback()
80 80
@@ -33,7 +33,7 b' def upgrade(migrate_engine):'
33 33 old_cons = UniqueConstraint('user_id', 'repository_id', table=tbl)
34 34 else:
35 35 # sqlite doesn't support dropping constraints...
36 print """Please manually drop UniqueConstraint('user_id', 'repository_id')"""
36 print("""Please manually drop UniqueConstraint('user_id', 'repository_id')""")
37 37
38 38 if old_cons:
39 39 try:
@@ -41,7 +41,7 b' def upgrade(migrate_engine):'
41 41 except Exception as e:
42 42 # we don't care if this fails really... better to pass migration than
43 43 # leave this in intermidiate state
44 print 'Failed to remove Unique for user_id, repository_id reason %s' % e
44 print('Failed to remove Unique for user_id, repository_id reason %s' % e)
45 45
46 46
47 47 #==========================================================================
@@ -61,7 +61,7 b' def upgrade(migrate_engine):'
61 61 old_cons = UniqueConstraint('group_id', 'permission_id', table=tbl, name='group_to_perm_group_id_permission_id_key')
62 62 else:
63 63 # sqlite doesn't support dropping constraints...
64 print """Please manually drop UniqueConstraint('group_id', 'permission_id')"""
64 print("""Please manually drop UniqueConstraint('group_id', 'permission_id')""")
65 65
66 66 if old_cons:
67 67 try:
@@ -69,7 +69,7 b' def upgrade(migrate_engine):'
69 69 except Exception as e:
70 70 # we don't care if this fails really... better to pass migration than
71 71 # leave this in intermidiate state
72 print 'Failed to remove Unique for user_id, repository_id reason %s' % e
72 print('Failed to remove Unique for user_id, repository_id reason %s' % e)
73 73
74 74 return
75 75
@@ -80,7 +80,7 b' def fixups(models, _SESSION):'
80 80 new_perm = models.Permission()
81 81 new_perm.permission_name = p[0]
82 82 new_perm.permission_longname = p[0] #translation err with p[1]
83 print 'Creating new permission %s' % p[0]
83 print('Creating new permission %s' % p[0])
84 84 _SESSION().add(new_perm)
85 85
86 86 _SESSION().commit()
@@ -102,7 +102,7 b' def fixups(models, _SESSION):'
102 102 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
103 103 defined_perms_groups = map(
104 104 _get_group, (x.permission.permission_name for x in perms))
105 log.debug('GOT ALREADY DEFINED:%s' % perms)
105 log.debug('GOT ALREADY DEFINED:%s', perms)
106 106 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
107 107
108 108 # for every default permission that needs to be created, we check if
@@ -110,8 +110,7 b' def fixups(models, _SESSION):'
110 110 for perm_name in DEFAULT_PERMS:
111 111 gr = _get_group(perm_name)
112 112 if gr not in defined_perms_groups:
113 log.debug('GR:%s not found, creating permission %s'
114 % (gr, perm_name))
113 log.debug('GR:%s not found, creating permission %s', gr, perm_name)
115 114 new_perm = _make_perm(perm_name)
116 115 _SESSION().add(new_perm)
117 116 _SESSION().commit()
@@ -127,7 +126,7 b' def fixups(models, _SESSION):'
127 126 ('default_repo_type', 'hg')]:
128 127
129 128 if skip_existing and get_by_name(models.RhodeCodeSetting, k) is not None:
130 log.debug('Skipping option %s' % k)
129 log.debug('Skipping option %s', k)
131 130 continue
132 131 setting = models.RhodeCodeSetting(k, v)
133 132 _SESSION().add(setting)
@@ -44,6 +44,6 b' def fixups(models, _SESSION):'
44 44 notify('Upgrading repositories Caches')
45 45 repositories = models.Repository.getAll()
46 46 for repo in repositories:
47 print repo
47 print(repo)
48 48 repo.update_commit_cache()
49 49 _SESSION().commit()
@@ -99,7 +99,7 b' def fixups(models, _SESSION):'
99 99 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
100 100 defined_perms_groups = map(_get_group,
101 101 (x.permission.permission_name for x in perms))
102 log.debug('GOT ALREADY DEFINED:%s' % perms)
102 log.debug('GOT ALREADY DEFINED:%s', perms)
103 103 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
104 104
105 105 # for every default permission that needs to be created, we check if
@@ -107,8 +107,7 b' def fixups(models, _SESSION):'
107 107 for perm_name in DEFAULT_PERMS:
108 108 gr = _get_group(perm_name)
109 109 if gr not in defined_perms_groups:
110 log.debug('GR:%s not found, creating permission %s'
111 % (gr, perm_name))
110 log.debug('GR:%s not found, creating permission %s', gr, perm_name)
112 111 new_perm = _make_perm(perm_name)
113 112 _SESSION().add(new_perm)
114 113 _SESSION().commit()
@@ -73,7 +73,7 b' def fixups(models, _SESSION):'
73 73 repo_store_path = get_repos_location(models.RhodeCodeUi)
74 74 _store = os.path.join(repo_store_path, '.cache', 'largefiles')
75 75 notify('Setting largefiles usercache')
76 print _store
76 print(_store)
77 77
78 78 if not models.RhodeCodeUi.query().filter(
79 79 models.RhodeCodeUi.ui_key == 'usercache').scalar():
@@ -39,7 +39,7 b' def fixups(models, _SESSION):'
39 39 notify('fixing new schema for landing_rev')
40 40
41 41 for repo in models.Repository.get_all():
42 print u'repo %s old landing rev is: %s' % (repo, repo.landing_rev)
42 print(u'repo %s old landing rev is: %s' % (repo, repo.landing_rev))
43 43 _rev = repo.landing_rev[1]
44 44 _rev_type = 'rev' # default
45 45
@@ -58,13 +58,13 b' def fixups(models, _SESSION):'
58 58 elif _rev in known_bookmarks:
59 59 _rev_type = 'book'
60 60 except Exception as e:
61 print e
62 print 'continue...'
61 print(e)
62 print('continue...')
63 63 #we don't want any error to break the process
64 64 pass
65 65
66 66 _new_landing_rev = '%s:%s' % (_rev_type, _rev)
67 print u'setting to %s' % _new_landing_rev
67 print(u'setting to %s' % _new_landing_rev)
68 68 repo.landing_rev = _new_landing_rev
69 69 _SESSION().add(repo)
70 70 _SESSION().commit()
@@ -47,7 +47,7 b' def fixups(models, _SESSION):'
47 47 new_perm = models.Permission()
48 48 new_perm.permission_name = p[0]
49 49 new_perm.permission_longname = p[0] #translation err with p[1]
50 print 'Creating new permission %s' % p[0]
50 print('Creating new permission %s' % p[0])
51 51 _SESSION().add(new_perm)
52 52
53 53 _SESSION().commit()
@@ -60,6 +60,6 b' def fixups(models, _SESSION):'
60 60 new = models.UserToPerm()
61 61 new.user = user
62 62 new.permission = get_by_key(models.Permission, _def)
63 print 'Setting default to %s' % _def
63 print('Setting default to %s' % _def)
64 64 _SESSION().add(new)
65 65 _SESSION().commit()
@@ -38,7 +38,7 b' def downgrade(migrate_engine):'
38 38 def fixups(models, _SESSION):
39 39 notify('Setting default renderer to rst')
40 40 for cs_comment in models.ChangesetComment.get_all():
41 print 'comment_id %s renderer rst' % (cs_comment.comment_id)
41 print('comment_id %s renderer rst' % (cs_comment.comment_id))
42 42 cs_comment.renderer = 'rst'
43 43 _SESSION().add(cs_comment)
44 44 _SESSION().commit()
@@ -41,7 +41,16 b' log = logging.getLogger(__name__)'
41 41
42 42 # define max context, a file with more than this numbers of lines is unusable
43 43 # in browser anyway
44 MAX_CONTEXT = 1024 * 1014
44 MAX_CONTEXT = 20 * 1024
45 DEFAULT_CONTEXT = 3
46
47
48 def get_diff_context(request):
49 return MAX_CONTEXT if request.GET.get('fullcontext', '') == '1' else DEFAULT_CONTEXT
50
51
52 def get_diff_whitespace_flag(request):
53 return request.GET.get('ignorews', '') == '1'
45 54
46 55
47 56 class OPS(object):
@@ -446,7 +455,7 b' class DiffProcessor(object):'
446 455
447 456 for chunk in self._diff.chunks():
448 457 head = chunk.header
449 log.debug('parsing diff %r' % head)
458 log.debug('parsing diff %r', head)
450 459
451 460 raw_diff = chunk.raw
452 461 limited_diff = False
@@ -1134,10 +1143,23 b' class DiffLimitExceeded(Exception):'
1134 1143 pass
1135 1144
1136 1145
1146 # NOTE(marcink): if diffs.mako change, probably this
1147 # needs a bump to next version
1148 CURRENT_DIFF_VERSION = 'v4'
1149
1150
1151 def _cleanup_cache_file(cached_diff_file):
1152 # cleanup file to not store it "damaged"
1153 try:
1154 os.remove(cached_diff_file)
1155 except Exception:
1156 log.exception('Failed to cleanup path %s', cached_diff_file)
1157
1158
1137 1159 def cache_diff(cached_diff_file, diff, commits):
1138 1160
1139 1161 struct = {
1140 'version': 'v1',
1162 'version': CURRENT_DIFF_VERSION,
1141 1163 'diff': diff,
1142 1164 'commits': commits
1143 1165 }
@@ -1148,17 +1170,13 b' def cache_diff(cached_diff_file, diff, c'
1148 1170 log.debug('Saved diff cache under %s', cached_diff_file)
1149 1171 except Exception:
1150 1172 log.warn('Failed to save cache', exc_info=True)
1151 # cleanup file to not store it "damaged"
1152 try:
1153 os.remove(cached_diff_file)
1154 except Exception:
1155 log.exception('Failed to cleanup path %s', cached_diff_file)
1173 _cleanup_cache_file(cached_diff_file)
1156 1174
1157 1175
1158 1176 def load_cached_diff(cached_diff_file):
1159 1177
1160 1178 default_struct = {
1161 'version': 'v1',
1179 'version': CURRENT_DIFF_VERSION,
1162 1180 'diff': None,
1163 1181 'commits': None
1164 1182 }
@@ -1182,6 +1200,12 b' def load_cached_diff(cached_diff_file):'
1182 1200 # old version of data ?
1183 1201 data = default_struct
1184 1202
1203 # check version
1204 if data.get('version') != CURRENT_DIFF_VERSION:
1205 # purge cache
1206 _cleanup_cache_file(cached_diff_file)
1207 return default_struct
1208
1185 1209 return data
1186 1210
1187 1211
@@ -70,6 +70,10 b' class AttachedForksError(Exception):'
70 70 pass
71 71
72 72
73 class AttachedPullRequestsError(Exception):
74 pass
75
76
73 77 class RepoGroupAssignmentError(Exception):
74 78 pass
75 79
@@ -1249,15 +1249,18 b' class InitialsGravatar(object):'
1249 1249 """
1250 1250 generates the svg metadata for image
1251 1251 """
1252
1253 font_family = ','.join([
1254 'proximanovaregular',
1255 'Proxima Nova Regular',
1256 'Proxima Nova',
1257 'Arial',
1258 'Lucida Grande',
1252 fonts = [
1253 '-apple-system',
1254 'BlinkMacSystemFont',
1255 'Segoe UI',
1256 'Roboto',
1257 'Oxygen-Sans',
1258 'Ubuntu',
1259 'Cantarell',
1260 'Helvetica Neue',
1259 1261 'sans-serif'
1260 ])
1262 ]
1263 font_family = ','.join(fonts)
1261 1264 if svg_type:
1262 1265 return self.get_img_data_by_type(font_family, svg_type)
1263 1266
@@ -1712,14 +1715,14 b' def process_patterns(text_string, repo_n'
1712 1715 newtext = text_string
1713 1716
1714 1717 for uid, entry in active_entries.items():
1715 log.debug('found issue tracker entry with uid %s' % (uid,))
1718 log.debug('found issue tracker entry with uid %s', uid)
1716 1719
1717 1720 if not (entry['pat'] and entry['url']):
1718 1721 log.debug('skipping due to missing data')
1719 1722 continue
1720 1723
1721 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s'
1722 % (uid, entry['pat'], entry['url'], entry['pref']))
1724 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s',
1725 uid, entry['pat'], entry['url'], entry['pref'])
1723 1726
1724 1727 try:
1725 1728 pattern = re.compile(r'%s' % entry['pat'])
@@ -1741,7 +1744,7 b' def process_patterns(text_string, repo_n'
1741 1744 link_format=link_format)
1742 1745
1743 1746 newtext = pattern.sub(url_func, newtext)
1744 log.debug('processed prefix:uid `%s`' % (uid,))
1747 log.debug('processed prefix:uid `%s`', uid)
1745 1748
1746 1749 return newtext, issues_data
1747 1750
@@ -39,7 +39,21 b' from rhodecode.model.db import Repositor'
39 39 log = logging.getLogger(__name__)
40 40
41 41
42 HookResponse = collections.namedtuple('HookResponse', ('status', 'output'))
42 class HookResponse(object):
43 def __init__(self, status, output):
44 self.status = status
45 self.output = output
46
47 def __add__(self, other):
48 other_status = getattr(other, 'status', 0)
49 new_status = max(self.status, other_status)
50 other_output = getattr(other, 'output', '')
51 new_output = self.output + other_output
52
53 return HookResponse(new_status, new_output)
54
55 def __bool__(self):
56 return self.status == 0
43 57
44 58
45 59 def is_shadow_repo(extras):
@@ -110,6 +124,7 b' def pre_push(extras):'
110 124 else:
111 125 raise _http_ret
112 126
127 hook_response = ''
113 128 if not is_shadow_repo(extras):
114 129 if extras.commit_ids and extras.check_branch_perms:
115 130
@@ -152,11 +167,12 b' def pre_push(extras):'
152 167
153 168 # Propagate to external components. This is done after checking the
154 169 # lock, for consistent behavior.
155 pre_push_extension(repo_store_path=Repository.base_path(), **extras)
170 hook_response = pre_push_extension(
171 repo_store_path=Repository.base_path(), **extras)
156 172 events.trigger(events.RepoPrePushEvent(
157 173 repo_name=extras.repository, extras=extras))
158 174
159 return HookResponse(0, output)
175 return HookResponse(0, output) + hook_response
160 176
161 177
162 178 def pre_pull(extras):
@@ -182,12 +198,15 b' def pre_pull(extras):'
182 198
183 199 # Propagate to external components. This is done after checking the
184 200 # lock, for consistent behavior.
201 hook_response = ''
185 202 if not is_shadow_repo(extras):
186 pre_pull_extension(**extras)
203 extras.hook_type = extras.hook_type or 'pre_pull'
204 hook_response = pre_pull_extension(
205 repo_store_path=Repository.base_path(), **extras)
187 206 events.trigger(events.RepoPrePullEvent(
188 207 repo_name=extras.repository, extras=extras))
189 208
190 return HookResponse(0, output)
209 return HookResponse(0, output) + hook_response
191 210
192 211
193 212 def post_pull(extras):
@@ -198,16 +217,9 b' def post_pull(extras):'
198 217 ip_addr=extras.ip)
199 218 repo = audit_logger.RepoWrap(repo_name=extras.repository)
200 219 audit_logger.store(
201 'user.pull', action_data={
202 'user_agent': extras.user_agent},
220 'user.pull', action_data={'user_agent': extras.user_agent},
203 221 user=audit_user, repo=repo, commit=True)
204 222
205 # Propagate to external components.
206 if not is_shadow_repo(extras):
207 post_pull_extension(**extras)
208 events.trigger(events.RepoPullEvent(
209 repo_name=extras.repository, extras=extras))
210
211 223 output = ''
212 224 # make lock is a tri state False, True, None. We only make lock on True
213 225 if extras.make_lock is True and not is_shadow_repo(extras):
@@ -227,7 +239,16 b' def post_pull(extras):'
227 239 # 2xx Codes don't raise exceptions
228 240 output += _http_ret.title
229 241
230 return HookResponse(0, output)
242 # Propagate to external components.
243 hook_response = ''
244 if not is_shadow_repo(extras):
245 extras.hook_type = extras.hook_type or 'post_pull'
246 hook_response = post_pull_extension(
247 repo_store_path=Repository.base_path(), **extras)
248 events.trigger(events.RepoPullEvent(
249 repo_name=extras.repository, extras=extras))
250
251 return HookResponse(0, output) + hook_response
231 252
232 253
233 254 def post_push(extras):
@@ -245,16 +266,6 b' def post_push(extras):'
245 266 user=audit_user, repo=repo, commit=True)
246 267
247 268 # Propagate to external components.
248 if not is_shadow_repo(extras):
249 post_push_extension(
250 repo_store_path=Repository.base_path(),
251 pushed_revs=commit_ids,
252 **extras)
253 events.trigger(events.RepoPushEvent(
254 repo_name=extras.repository,
255 pushed_commit_ids=commit_ids,
256 extras=extras))
257
258 269 output = ''
259 270 # make lock is a tri state False, True, None. We only release lock on False
260 271 if extras.make_lock is False and not is_shadow_repo(extras):
@@ -285,8 +296,16 b' def post_push(extras):'
285 296 output += 'RhodeCode: open pull request link: {}\n'.format(
286 297 tmpl.format(ref_type='bookmark', ref_name=book_name))
287 298
299 hook_response = ''
300 if not is_shadow_repo(extras):
301 hook_response = post_push_extension(
302 repo_store_path=Repository.base_path(),
303 **extras)
304 events.trigger(events.RepoPushEvent(
305 repo_name=extras.repository, pushed_commit_ids=commit_ids, extras=extras))
306
288 307 output += 'RhodeCode: push completed\n'
289 return HookResponse(0, output)
308 return HookResponse(0, output) + hook_response
290 309
291 310
292 311 def _locked_by_explanation(repo_name, user_name, reason):
@@ -299,8 +318,10 b' def _locked_by_explanation(repo_name, us'
299 318 def check_allowed_create_user(user_dict, created_by, **kwargs):
300 319 # pre create hooks
301 320 if pre_create_user.is_active():
302 allowed, reason = pre_create_user(created_by=created_by, **user_dict)
321 hook_result = pre_create_user(created_by=created_by, **user_dict)
322 allowed = hook_result.status == 0
303 323 if not allowed:
324 reason = hook_result.output
304 325 raise UserCreationError(reason)
305 326
306 327
@@ -319,8 +340,15 b' class ExtensionCallback(object):'
319 340
320 341 def __call__(self, *args, **kwargs):
321 342 log.debug('Calling extension callback for %s', self._hook_name)
343 kwargs_to_pass = {}
344 for key in self._kwargs_keys:
345 try:
346 kwargs_to_pass[key] = kwargs[key]
347 except KeyError:
348 log.error('Failed to fetch %s key. Expected keys: %s',
349 key, self._kwargs_keys)
350 raise
322 351
323 kwargs_to_pass = dict((key, kwargs[key]) for key in self._kwargs_keys)
324 352 # backward compat for removed api_key for old hooks. THis was it works
325 353 # with older rcextensions that require api_key present
326 354 if self._hook_name in ['CREATE_USER_HOOK', 'DELETE_USER_HOOK']:
@@ -343,28 +371,28 b' pre_pull_extension = ExtensionCallback('
343 371 hook_name='PRE_PULL_HOOK',
344 372 kwargs_keys=(
345 373 'server_url', 'config', 'scm', 'username', 'ip', 'action',
346 'repository'))
374 'repository', 'hook_type', 'user_agent', 'repo_store_path',))
347 375
348 376
349 377 post_pull_extension = ExtensionCallback(
350 378 hook_name='PULL_HOOK',
351 379 kwargs_keys=(
352 380 'server_url', 'config', 'scm', 'username', 'ip', 'action',
353 'repository'))
381 'repository', 'hook_type', 'user_agent', 'repo_store_path',))
354 382
355 383
356 384 pre_push_extension = ExtensionCallback(
357 385 hook_name='PRE_PUSH_HOOK',
358 386 kwargs_keys=(
359 387 'server_url', 'config', 'scm', 'username', 'ip', 'action',
360 'repository', 'repo_store_path', 'commit_ids'))
388 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',))
361 389
362 390
363 391 post_push_extension = ExtensionCallback(
364 392 hook_name='PUSH_HOOK',
365 393 kwargs_keys=(
366 394 'server_url', 'config', 'scm', 'username', 'ip', 'action',
367 'repository', 'repo_store_path', 'pushed_revs'))
395 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',))
368 396
369 397
370 398 pre_create_user = ExtensionCallback(
@@ -245,7 +245,6 b' def prepare_callback_daemon(extras, prot'
245 245
246 246 # register txn_id
247 247 extras['txn_id'] = txn_id
248
249 248 log.debug('Prepared a callback daemon: %s at url `%s`',
250 249 callback_daemon.__class__.__name__, callback_daemon.hooks_uri)
251 250 return callback_daemon, extras
@@ -292,6 +291,9 b' class Hooks(object):'
292 291
293 292 try:
294 293 result = hook(extras)
294 if result is None:
295 raise Exception(
296 'Failed to obtain hook result from func: {}'.format(hook))
295 297 except HTTPBranchProtected as handled_error:
296 298 # Those special cases doesn't need error reporting. It's a case of
297 299 # locked repo or protected branch
@@ -47,7 +47,7 b' def _get_rc_scm_extras(username, repo_na'
47 47
48 48
49 49 def trigger_post_push_hook(
50 username, action, repo_name, repo_alias, commit_ids):
50 username, action, hook_type, repo_name, repo_alias, commit_ids):
51 51 """
52 52 Triggers push action hooks
53 53
@@ -59,6 +59,7 b' def trigger_post_push_hook('
59 59 """
60 60 extras = _get_rc_scm_extras(username, repo_name, repo_alias, action)
61 61 extras.commit_ids = commit_ids
62 extras.hook_type = hook_type
62 63 hooks_base.post_push(extras)
63 64
64 65
@@ -122,7 +122,7 b' class Search(BaseSearch):'
122 122 search_user, repo_name)
123 123 try:
124 124 query = qp.parse(safe_unicode(query))
125 log.debug('query: %s (%s)' % (query, repr(query)))
125 log.debug('query: %s (%s)', query, repr(query))
126 126
127 127 reverse, sortedby = False, None
128 128 if search_type == 'message':
@@ -217,8 +217,8 b' class Search(BaseSearch):'
217 217 'path': self.file_schema
218 218 }.get(cur_type, self.file_schema)
219 219
220 log.debug('IDX: %s' % index_name)
221 log.debug('SCHEMA: %s' % schema_defn)
220 log.debug('IDX: %s', index_name)
221 log.debug('SCHEMA: %s', schema_defn)
222 222 return search_type, index_name, schema_defn
223 223
224 224 def _init_searcher(self, index_name):
@@ -60,7 +60,9 b' class CustomHTMLTranslator(writers.html4'
60 60 refuri = node['refuri']
61 61 if ':' in refuri:
62 62 prefix, link = refuri.lstrip().split(':', 1)
63 if prefix == 'javascript':
63 prefix = prefix or ''
64
65 if prefix.lower() == 'javascript':
64 66 # we don't allow javascript type of refs...
65 67 node['refuri'] = 'javascript:alert("SandBoxedJavascript")'
66 68
@@ -434,12 +436,20 b' class MarkupRenderer(object):'
434 436 def preprocess(self, nb, resources):
435 437 sandbox_text = 'SandBoxed(IPython.core.display.Javascript object)'
436 438 for cell in nb['cells']:
437 if safe and 'outputs' in cell:
439 if not safe:
440 continue
441
442 if 'outputs' in cell:
438 443 for cell_output in cell['outputs']:
439 444 if 'data' in cell_output:
440 445 if 'application/javascript' in cell_output['data']:
441 446 cell_output['data']['text/plain'] = sandbox_text
442 447 cell_output['data'].pop('application/javascript', None)
448
449 if 'source' in cell and cell['cell_type'] == 'markdown':
450 # sanitize similar like in markdown
451 cell['source'] = cls.bleach_clean(cell['source'])
452
443 453 return nb, resources
444 454
445 455 def _sanitize_resources(resources):
@@ -67,7 +67,7 b' class LRUDictDebug(LRUDict):'
67 67 fmt = '\n'
68 68 for cnt, elem in enumerate(self.keys()):
69 69 fmt += '%s - %s\n' % (cnt+1, safe_str(elem))
70 log.debug('current LRU keys (%s):%s' % (elems_cnt, fmt))
70 log.debug('current LRU keys (%s):%s', elems_cnt, fmt)
71 71
72 72 def __getitem__(self, key):
73 73 self._report_keys()
@@ -44,10 +44,11 b' class RequestWrapperTween(object):'
44 44 finally:
45 45 end = time.time()
46 46 total = end - start
47 log.info('IP: %s Request to %s time: %.3fs [%s]' % (
47 log.info(
48 'IP: %s Request to %s time: %.3fs [%s]',
48 49 get_ip_addr(request.environ),
49 50 safe_str(get_access_path(request.environ)), total,
50 get_user_agent(request. environ),)
51 get_user_agent(request. environ)
51 52 )
52 53
53 54 return response
@@ -114,13 +114,17 b' class VcsHttpProxy(object):'
114 114 stream=True)
115 115
116 116 log.debug('http-app: got vcsserver response: %s', response)
117 if response.status_code >= 500:
118 log.error('Exception returned by vcsserver at: %s %s, %s',
119 url, response.status_code, response.content)
120
117 121 # Preserve the headers of the response, except hop_by_hop ones
118 122 response_headers = [
119 123 (h, v) for h, v in response.headers.items()
120 124 if not wsgiref.util.is_hop_by_hop(h)
121 125 ]
122 126
123 # Build status argument for start_reponse callable.
127 # Build status argument for start_response callable.
124 128 status = '{status_code} {reason_phrase}'.format(
125 129 status_code=response.status_code,
126 130 reason_phrase=response.reason)
@@ -59,7 +59,7 b' class DaemonLock(object):'
59 59 def _on_finalize(lock, debug):
60 60 if lock.held:
61 61 if debug:
62 print 'leck held finilazing and running lock.release()'
62 print('leck held finilazing and running lock.release()')
63 63 lock.release()
64 64
65 65 def lock(self):
@@ -69,7 +69,7 b' class DaemonLock(object):'
69 69 """
70 70 lockname = '%s' % (os.getpid())
71 71 if self.debug:
72 print 'running lock'
72 print('running lock')
73 73 self.trylock()
74 74 self.makelock(lockname, self.pidfile)
75 75 return True
@@ -77,7 +77,7 b' class DaemonLock(object):'
77 77 def trylock(self):
78 78 running_pid = False
79 79 if self.debug:
80 print 'checking for already running process'
80 print('checking for already running process')
81 81 try:
82 82 with open(self.pidfile, 'r') as f:
83 83 try:
@@ -97,13 +97,13 b' class DaemonLock(object):'
97 97 if exc.errno in (errno.ESRCH, errno.EPERM):
98 98 print ("Lock File is there but"
99 99 " the program is not running")
100 print "Removing lock file for the: %s" % running_pid
100 print("Removing lock file for the: %s" % running_pid)
101 101 self.release()
102 102 else:
103 103 raise
104 104 else:
105 print "You already have an instance of the program running"
106 print "It is running as process %s" % running_pid
105 print("You already have an instance of the program running")
106 print("It is running as process %s" % running_pid)
107 107 raise LockHeld()
108 108
109 109 except IOError as e:
@@ -114,21 +114,21 b' class DaemonLock(object):'
114 114 """releases the pid by removing the pidfile
115 115 """
116 116 if self.debug:
117 print 'trying to release the pidlock'
117 print('trying to release the pidlock')
118 118
119 119 if self.callbackfn:
120 120 #execute callback function on release
121 121 if self.debug:
122 print 'executing callback function %s' % self.callbackfn
122 print('executing callback function %s' % self.callbackfn)
123 123 self.callbackfn()
124 124 try:
125 125 if self.debug:
126 print 'removing pidfile %s' % self.pidfile
126 print('removing pidfile %s' % self.pidfile)
127 127 os.remove(self.pidfile)
128 128 self.held = False
129 129 except OSError as e:
130 130 if self.debug:
131 print 'removing pidfile failed %s' % e
131 print('removing pidfile failed %s' % e)
132 132 pass
133 133
134 134 def makelock(self, lockname, pidfile):
@@ -139,7 +139,7 b' class DaemonLock(object):'
139 139 :param pidfile: the file to write the pid in
140 140 """
141 141 if self.debug:
142 print 'creating a file %s and pid: %s' % (pidfile, lockname)
142 print('creating a file %s and pid: %s' % (pidfile, lockname))
143 143
144 144 dir_, file_ = os.path.split(pidfile)
145 145 if not os.path.isdir(dir_):
@@ -74,10 +74,17 b' def get_storage_size(storage_path):'
74 74 return sum(sizes)
75 75
76 76
77 def get_resource(resource_type):
78 try:
79 return resource.getrlimit(resource_type)
80 except Exception:
81 return 'NOT_SUPPORTED'
82
83
77 84 class SysInfoRes(object):
78 def __init__(self, value, state=STATE_OK_DEFAULT, human_value=None):
85 def __init__(self, value, state=None, human_value=None):
79 86 self.value = value
80 self.state = state
87 self.state = state or STATE_OK_DEFAULT
81 88 self.human_value = human_value or value
82 89
83 90 def __json__(self):
@@ -159,16 +166,16 b' def locale_info():'
159 166
160 167 def ulimit_info():
161 168 data = collections.OrderedDict([
162 ('cpu time (seconds)', resource.getrlimit(resource.RLIMIT_CPU)),
163 ('file size', resource.getrlimit(resource.RLIMIT_FSIZE)),
164 ('stack size', resource.getrlimit(resource.RLIMIT_STACK)),
165 ('core file size', resource.getrlimit(resource.RLIMIT_CORE)),
166 ('address space size', resource.getrlimit(resource.RLIMIT_AS)),
167 ('locked in mem size', resource.getrlimit(resource.RLIMIT_MEMLOCK)),
168 ('heap size', resource.getrlimit(resource.RLIMIT_DATA)),
169 ('rss size', resource.getrlimit(resource.RLIMIT_RSS)),
170 ('number of processes', resource.getrlimit(resource.RLIMIT_NPROC)),
171 ('open files', resource.getrlimit(resource.RLIMIT_NOFILE)),
169 ('cpu time (seconds)', get_resource(resource.RLIMIT_CPU)),
170 ('file size', get_resource(resource.RLIMIT_FSIZE)),
171 ('stack size', get_resource(resource.RLIMIT_STACK)),
172 ('core file size', get_resource(resource.RLIMIT_CORE)),
173 ('address space size', get_resource(resource.RLIMIT_AS)),
174 ('locked in mem size', get_resource(resource.RLIMIT_MEMLOCK)),
175 ('heap size', get_resource(resource.RLIMIT_DATA)),
176 ('rss size', get_resource(resource.RLIMIT_RSS)),
177 ('number of processes', get_resource(resource.RLIMIT_NPROC)),
178 ('open files', get_resource(resource.RLIMIT_NOFILE)),
172 179 ])
173 180
174 181 text = ', '.join('{}:{}'.format(k,v) for k,v in data.items())
@@ -49,13 +49,13 b' def user_log_filter(user_log, search_ter'
49 49 :param user_log:
50 50 :param search_term:
51 51 """
52 log.debug('Initial search term: %r' % search_term)
52 log.debug('Initial search term: %r', search_term)
53 53 qry = None
54 54 if search_term:
55 55 qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
56 56 qp.add_plugin(DateParserPlugin())
57 57 qry = qp.parse(safe_unicode(search_term))
58 log.debug('Filtering using parsed query %r' % qry)
58 log.debug('Filtering using parsed query %r', qry)
59 59
60 60 def wildcard_handler(col, wc_term):
61 61 if wc_term.startswith('*') and not wc_term.endswith('*'):
@@ -80,7 +80,7 b' def user_log_filter(user_log, search_ter'
80 80 field = getattr(UserLog, 'username')
81 81 else:
82 82 field = getattr(UserLog, field)
83 log.debug('filter field: %s val=>%s' % (field, val))
83 log.debug('filter field: %s val=>%s', field, val)
84 84
85 85 # sql filtering
86 86 if isinstance(term, query.Wildcard):
@@ -28,6 +28,7 b' import json'
28 28 import logging
29 29 import os
30 30 import re
31 import sys
31 32 import shutil
32 33 import tempfile
33 34 import traceback
@@ -43,7 +44,6 b' from mako import exceptions'
43 44 from pyramid.threadlocal import get_current_registry
44 45 from rhodecode.lib.request import Request
45 46
46 from rhodecode.lib.fakemod import create_module
47 47 from rhodecode.lib.vcs.backends.base import Config
48 48 from rhodecode.lib.vcs.exceptions import VCSError
49 49 from rhodecode.lib.vcs.utils.helpers import get_scm, get_scm_backend
@@ -291,8 +291,7 b' def is_valid_repo_group(repo_group_name,'
291 291
292 292 # check if it's not a repo
293 293 if is_valid_repo(repo_group_name, base_path):
294 log.debug('Repo called %s exist, it is not a valid '
295 'repo group' % repo_group_name)
294 log.debug('Repo called %s exist, it is not a valid repo group', repo_group_name)
296 295 return False
297 296
298 297 try:
@@ -632,21 +631,21 b' def load_rcextensions(root_path):'
632 631 import rhodecode
633 632 from rhodecode.config import conf
634 633
635 path = os.path.join(root_path, 'rcextensions', '__init__.py')
636 if os.path.isfile(path):
637 rcext = create_module('rc', path)
638 EXT = rhodecode.EXTENSIONS = rcext
639 log.debug('Found rcextensions now loading %s...', rcext)
634 path = os.path.join(root_path)
635 sys.path.append(path)
636 try:
637 rcextensions = __import__('rcextensions')
638 except ImportError:
639 log.warn('Unable to load rcextensions from %s', path)
640 rcextensions = None
641
642 if rcextensions:
643 log.debug('Found rcextensions module loaded %s...', rcextensions)
644 rhodecode.EXTENSIONS = rcextensions
640 645
641 646 # Additional mappings that are not present in the pygments lexers
642 conf.LANGUAGES_EXTENSIONS_MAP.update(getattr(EXT, 'EXTRA_MAPPINGS', {}))
643
644 # auto check if the module is not missing any data, set to default if is
645 # this will help autoupdate new feature of rcext module
646 #from rhodecode.config import rcextensions
647 #for k in dir(rcextensions):
648 # if not k.startswith('_') and not hasattr(EXT, k):
649 # setattr(EXT, k, getattr(rcextensions, k))
647 conf.LANGUAGES_EXTENSIONS_MAP.update(
648 getattr(rhodecode.EXTENSIONS, 'EXTRA_MAPPINGS', {}))
650 649
651 650
652 651 def get_custom_lexer(extension):
@@ -778,5 +777,5 b' def generate_platform_uuid():'
778 777 uuid_list = [platform.platform()]
779 778 return hashlib.sha256(':'.join(uuid_list)).hexdigest()
780 779 except Exception as e:
781 log.error('Failed to generate host uuid: %s' % e)
780 log.error('Failed to generate host uuid: %s', e)
782 781 return 'UNDEFINED'
@@ -821,6 +821,13 b' class BaseCommit(object):'
821 821 """
822 822 raise NotImplementedError
823 823
824 @LazyProperty
825 def first_parent(self):
826 """
827 Returns list of parent commits.
828 """
829 return self.parents[0] if self.parents else EmptyCommit()
830
824 831 @property
825 832 def merge(self):
826 833 """
@@ -1099,8 +1106,7 b' class BaseCommit(object):'
1099 1106 """
1100 1107 Returns a `Diff` object representing the change made by this commit.
1101 1108 """
1102 parent = (
1103 self.parents[0] if self.parents else self.repository.EMPTY_COMMIT)
1109 parent = self.first_parent
1104 1110 diff = self.repository.get_diff(
1105 1111 parent, self,
1106 1112 ignore_whitespace=ignore_whitespace,
@@ -58,13 +58,13 b' class GitRepository(BaseRepository):'
58 58 contact = BaseRepository.DEFAULT_CONTACT
59 59
60 60 def __init__(self, repo_path, config=None, create=False, src_url=None,
61 update_after_clone=False, with_wire=None, bare=False):
61 do_workspace_checkout=False, with_wire=None, bare=False):
62 62
63 63 self.path = safe_str(os.path.abspath(repo_path))
64 64 self.config = config if config else self.get_default_config()
65 65 self.with_wire = with_wire
66 66
67 self._init_repo(create, src_url, update_after_clone, bare)
67 self._init_repo(create, src_url, do_workspace_checkout, bare)
68 68
69 69 # caches
70 70 self._commit_ids = {}
@@ -145,24 +145,36 b' class GitRepository(BaseRepository):'
145 145 pass
146 146 return False
147 147
148 def _init_repo(self, create, src_url=None, update_after_clone=False,
148 def _init_repo(self, create, src_url=None, do_workspace_checkout=False,
149 149 bare=False):
150 150 if create and os.path.exists(self.path):
151 151 raise RepositoryError(
152 152 "Cannot create repository at %s, location already exist"
153 153 % self.path)
154 154
155 if bare and do_workspace_checkout:
156 raise RepositoryError("Cannot update a bare repository")
155 157 try:
156 if create and src_url:
158
159 if src_url:
160 # check URL before any actions
157 161 GitRepository.check_url(src_url, self.config)
158 self.clone(src_url, update_after_clone, bare)
159 elif create:
162
163 if create:
160 164 os.makedirs(self.path, mode=0755)
161 165
162 166 if bare:
163 167 self._remote.init_bare()
164 168 else:
165 169 self._remote.init()
170
171 if src_url and bare:
172 # bare repository only allows a fetch and checkout is not allowed
173 self.fetch(src_url, commit_ids=None)
174 elif src_url:
175 self.pull(src_url, commit_ids=None,
176 update_after=do_workspace_checkout)
177
166 178 else:
167 179 if not self._remote.assert_correct_path():
168 180 raise RepositoryError(
@@ -630,49 +642,27 b' class GitRepository(BaseRepository):'
630 642 """
631 643 return GitInMemoryCommit(self)
632 644
633 def clone(self, url, update_after_clone=True, bare=False):
645 def pull(self, url, commit_ids=None, update_after=False):
634 646 """
635 Tries to clone commits from external location.
636
637 :param update_after_clone: If set to ``False``, git won't checkout
638 working directory
639 :param bare: If set to ``True``, repository would be cloned into
640 *bare* git repository (no working directory at all).
641 """
642 # init_bare and init expect empty dir created to proceed
643 if not os.path.exists(self.path):
644 os.mkdir(self.path)
647 Pull changes from external location. Pull is different in GIT
648 that fetch since it's doing a checkout
645 649
646 if bare:
647 self._remote.init_bare()
648 else:
649 self._remote.init()
650
651 deferred = '^{}'
652 valid_refs = ('refs/heads', 'refs/tags', 'HEAD')
653
654 return self._remote.clone(
655 url, deferred, valid_refs, update_after_clone)
656
657 def pull(self, url, commit_ids=None):
650 :param commit_ids: Optional. Can be set to a list of commit ids
651 which shall be pulled from the other repository.
658 652 """
659 Tries to pull changes from external location. We use fetch here since
660 pull in get does merges and we want to be compatible with hg backend so
661 pull == fetch in this case
662 """
663 self.fetch(url, commit_ids=commit_ids)
653 refs = None
654 if commit_ids is not None:
655 remote_refs = self._remote.get_remote_refs(url)
656 refs = [ref for ref in remote_refs if remote_refs[ref] in commit_ids]
657 self._remote.pull(url, refs=refs, update_after=update_after)
658 self._remote.invalidate_vcs_cache()
664 659
665 660 def fetch(self, url, commit_ids=None):
666 661 """
667 Tries to fetch changes from external location.
662 Fetch all git objects from external location.
668 663 """
669 refs = None
670
671 if commit_ids is not None:
672 remote_refs = self._remote.get_remote_refs(url)
673 refs = [
674 ref for ref in remote_refs if remote_refs[ref] in commit_ids]
675 self._remote.fetch(url, refs=refs)
664 self._remote.sync_fetch(url, refs=commit_ids)
665 self._remote.invalidate_vcs_cache()
676 666
677 667 def push(self, url):
678 668 refs = None
@@ -778,7 +768,7 b' class GitRepository(BaseRepository):'
778 768
779 769 def _local_reset(self, branch_name):
780 770 branch_name = '{}'.format(branch_name)
781 cmd = ['reset', '--hard', branch_name]
771 cmd = ['reset', '--hard', branch_name, '--']
782 772 self.run_git_command(cmd, fail_on_stderr=False)
783 773
784 774 def _last_fetch_heads(self):
@@ -57,7 +57,7 b' class MercurialRepository(BaseRepository'
57 57 DEFAULT_BRANCH_NAME = 'default'
58 58
59 59 def __init__(self, repo_path, config=None, create=False, src_url=None,
60 update_after_clone=False, with_wire=None):
60 do_workspace_checkout=False, with_wire=None, bare=False):
61 61 """
62 62 Raises RepositoryError if repository could not be find at the given
63 63 ``repo_path``.
@@ -67,8 +67,9 b' class MercurialRepository(BaseRepository'
67 67 :param create=False: if set to True, would try to create repository if
68 68 it does not exist rather than raising exception
69 69 :param src_url=None: would try to clone repository from given location
70 :param update_after_clone=False: sets update of working copy after
70 :param do_workspace_checkout=False: sets update of working copy after
71 71 making a clone
72 :param bare: not used, compatible with other VCS
72 73 """
73 74
74 75 self.path = safe_str(os.path.abspath(repo_path))
@@ -79,7 +80,7 b' class MercurialRepository(BaseRepository'
79 80 default=[('extensions', 'largefiles', '1')])
80 81 self.with_wire = with_wire
81 82
82 self._init_repo(create, src_url, update_after_clone)
83 self._init_repo(create, src_url, do_workspace_checkout)
83 84
84 85 # caches
85 86 self._commit_ids = {}
@@ -328,7 +329,7 b' class MercurialRepository(BaseRepository'
328 329 def is_valid_repository(path):
329 330 return os.path.isdir(os.path.join(path, '.hg'))
330 331
331 def _init_repo(self, create, src_url=None, update_after_clone=False):
332 def _init_repo(self, create, src_url=None, do_workspace_checkout=False):
332 333 """
333 334 Function will check for mercurial repository in given path. If there
334 335 is no repository in that path it will raise an exception unless
@@ -337,7 +338,7 b' class MercurialRepository(BaseRepository'
337 338
338 339 If `src_url` is given, would try to clone repository from the
339 340 location at given clone_point. Additionally it'll make update to
340 working copy accordingly to `update_after_clone` flag.
341 working copy accordingly to `do_workspace_checkout` flag.
341 342 """
342 343 if create and os.path.exists(self.path):
343 344 raise RepositoryError(
@@ -348,7 +349,7 b' class MercurialRepository(BaseRepository'
348 349 url = str(self._get_url(src_url))
349 350 MercurialRepository.check_url(url, self.config)
350 351
351 self._remote.clone(url, self.path, update_after_clone)
352 self._remote.clone(url, self.path, do_workspace_checkout)
352 353
353 354 # Don't try to create if we've already cloned repo
354 355 create = False
@@ -538,7 +539,7 b' class MercurialRepository(BaseRepository'
538 539
539 540 def pull(self, url, commit_ids=None):
540 541 """
541 Tries to pull changes from external location.
542 Pull changes from external location.
542 543
543 544 :param commit_ids: Optional. Can be set to a list of commit ids
544 545 which shall be pulled from the other repository.
@@ -547,6 +548,12 b' class MercurialRepository(BaseRepository'
547 548 self._remote.pull(url, commit_ids=commit_ids)
548 549 self._remote.invalidate_vcs_cache()
549 550
551 def fetch(self, url, commit_ids=None):
552 """
553 Backward compatibility with GIT fetch==pull
554 """
555 return self.pull(url, commit_ids=commit_ids)
556
550 557 def push(self, url):
551 558 url = self._get_url(url)
552 559 self._remote.sync_push(url)
@@ -68,7 +68,7 b' class SubversionRepository(base.BaseRepo'
68 68 contact = base.BaseRepository.DEFAULT_CONTACT
69 69 description = base.BaseRepository.DEFAULT_DESCRIPTION
70 70
71 def __init__(self, repo_path, config=None, create=False, src_url=None,
71 def __init__(self, repo_path, config=None, create=False, src_url=None, bare=False,
72 72 **kwargs):
73 73 self.path = safe_str(os.path.abspath(repo_path))
74 74 self.config = config if config else self.get_default_config()
@@ -739,13 +739,18 b' class User(Base, BaseModel):'
739 739 plain_tokens = []
740 740 hash_tokens = []
741 741
742 for token in tokens_q.all():
743 # verify scope first
742 user_tokens = tokens_q.all()
743 log.debug('Found %s user tokens to check for authentication', len(user_tokens))
744 for token in user_tokens:
745 log.debug('AUTH_TOKEN: checking if user token with id `%s` matches',
746 token.user_api_key_id)
747 # verify scope first, since it's way faster than hash calculation of
748 # encrypted tokens
744 749 if token.repo_id:
745 750 # token has a scope, we need to verify it
746 751 if scope_repo_id != token.repo_id:
747 752 log.debug(
748 'Scope mismatch: token has a set repo scope: %s, '
753 'AUTH_TOKEN: scope mismatch, token has a set repo scope: %s, '
749 754 'and calling scope is:%s, skipping further checks',
750 755 token.repo, scope_repo_id)
751 756 # token has a scope, and it doesn't match, skip token
@@ -761,7 +766,7 b' class User(Base, BaseModel):'
761 766 return True
762 767
763 768 for hashed in hash_tokens:
764 # TODO(marcink): this is expensive to calculate, but most secure
769 # NOTE(marcink): this is expensive to calculate, but most secure
765 770 match = crypto_backend.hash_check(auth_token, hashed)
766 771 if match:
767 772 return True
@@ -938,7 +943,11 b' class User(Base, BaseModel):'
938 943
939 944 @classmethod
940 945 def get_first_super_admin(cls):
941 user = User.query().filter(User.admin == true()).first()
946 user = User.query()\
947 .filter(User.admin == true()) \
948 .order_by(User.user_id.asc()) \
949 .first()
950
942 951 if user is None:
943 952 raise Exception('FATAL: Missing administrative account!')
944 953 return user
@@ -1576,6 +1585,8 b' class Repository(Base, BaseModel):'
1576 1585 unique=False, default=None)
1577 1586 private = Column(
1578 1587 "private", Boolean(), nullable=True, unique=None, default=None)
1588 archived = Column(
1589 "archived", Boolean(), nullable=True, unique=None, default=None)
1579 1590 enable_statistics = Column(
1580 1591 "statistics", Boolean(), nullable=True, unique=None, default=True)
1581 1592 enable_downloads = Column(
@@ -1774,9 +1785,12 b' class Repository(Base, BaseModel):'
1774 1785
1775 1786 @classmethod
1776 1787 def get_all_repos(cls, user_id=Optional(None), group_id=Optional(None),
1777 case_insensitive=True):
1788 case_insensitive=True, archived=False):
1778 1789 q = Repository.query()
1779 1790
1791 if not archived:
1792 q = q.filter(Repository.archived.isnot(true()))
1793
1780 1794 if not isinstance(user_id, Optional):
1781 1795 q = q.filter(Repository.user_id == user_id)
1782 1796
@@ -1787,6 +1801,7 b' class Repository(Base, BaseModel):'
1787 1801 q = q.order_by(func.lower(Repository.repo_name))
1788 1802 else:
1789 1803 q = q.order_by(Repository.repo_name)
1804
1790 1805 return q.all()
1791 1806
1792 1807 @property
@@ -2536,8 +2551,8 b' class RepoGroup(Base, BaseModel):'
2536 2551 break
2537 2552 if cnt == parents_recursion_limit:
2538 2553 # this will prevent accidental infinit loops
2539 log.error(('more than %s parents found for group %s, stopping '
2540 'recursive parent fetching' % (parents_recursion_limit, self)))
2554 log.error('more than %s parents found for group %s, stopping '
2555 'recursive parent fetching', parents_recursion_limit, self)
2541 2556 break
2542 2557
2543 2558 groups.insert(0, gr)
@@ -73,7 +73,7 b' class PullRequestModel(BaseModel):'
73 73
74 74 cls = PullRequest
75 75
76 DIFF_CONTEXT = 3
76 DIFF_CONTEXT = diffs.DEFAULT_CONTEXT
77 77
78 78 MERGE_STATUS_MESSAGES = {
79 79 MergeFailureReason.NONE: lazy_ugettext(
@@ -590,6 +590,7 b' class PullRequestModel(BaseModel):'
590 590
591 591 def merge_repo(self, pull_request, user, extras):
592 592 log.debug("Merging pull request %s", pull_request.pull_request_id)
593 extras['user_agent'] = 'internal-merge'
593 594 merge_state = self._merge_pull_request(pull_request, user, extras)
594 595 if merge_state.executed:
595 596 log.debug(
@@ -876,19 +877,21 b' class PullRequestModel(BaseModel):'
876 877 diff_context = (
877 878 self.DIFF_CONTEXT +
878 879 CommentsModel.needed_extra_diff_context())
879
880 hide_whitespace_changes = False
880 881 source_repo = pull_request_version.source_repo
881 882 source_ref_id = pull_request_version.source_ref_parts.commit_id
882 883 target_ref_id = pull_request_version.target_ref_parts.commit_id
883 884 old_diff = self._get_diff_from_pr_or_version(
884 source_repo, source_ref_id, target_ref_id, context=diff_context)
885 source_repo, source_ref_id, target_ref_id,
886 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
885 887
886 888 source_repo = pull_request.source_repo
887 889 source_ref_id = pull_request.source_ref_parts.commit_id
888 890 target_ref_id = pull_request.target_ref_parts.commit_id
889 891
890 892 new_diff = self._get_diff_from_pr_or_version(
891 source_repo, source_ref_id, target_ref_id, context=diff_context)
893 source_repo, source_ref_id, target_ref_id,
894 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
892 895
893 896 old_diff_data = diffs.DiffProcessor(old_diff)
894 897 old_diff_data.prepare()
@@ -1487,12 +1490,17 b' class PullRequestModel(BaseModel):'
1487 1490 raise EmptyRepositoryError()
1488 1491 return groups, selected
1489 1492
1490 def get_diff(self, source_repo, source_ref_id, target_ref_id, context=DIFF_CONTEXT):
1493 def get_diff(self, source_repo, source_ref_id, target_ref_id,
1494 hide_whitespace_changes, diff_context):
1495
1491 1496 return self._get_diff_from_pr_or_version(
1492 source_repo, source_ref_id, target_ref_id, context=context)
1497 source_repo, source_ref_id, target_ref_id,
1498 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
1493 1499
1494 1500 def _get_diff_from_pr_or_version(
1495 self, source_repo, source_ref_id, target_ref_id, context):
1501 self, source_repo, source_ref_id, target_ref_id,
1502 hide_whitespace_changes, diff_context):
1503
1496 1504 target_commit = source_repo.get_commit(
1497 1505 commit_id=safe_str(target_ref_id))
1498 1506 source_commit = source_repo.get_commit(
@@ -1516,7 +1524,8 b' class PullRequestModel(BaseModel):'
1516 1524 safe_unicode(vcs_repo.path))
1517 1525
1518 1526 vcs_diff = vcs_repo.get_diff(
1519 commit1=target_commit, commit2=source_commit, context=context)
1527 commit1=target_commit, commit2=source_commit,
1528 ignore_whitespace=hide_whitespace_changes, context=diff_context)
1520 1529 return vcs_diff
1521 1530
1522 1531 def _is_merge_enabled(self, pull_request):
@@ -32,7 +32,7 b' from zope.cachedescriptors.property impo'
32 32 from rhodecode import events
33 33 from rhodecode.lib.auth import HasUserGroupPermissionAny
34 34 from rhodecode.lib.caching_query import FromCache
35 from rhodecode.lib.exceptions import AttachedForksError
35 from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError
36 36 from rhodecode.lib.hooks_base import log_delete_repository
37 37 from rhodecode.lib.user_log_filter import user_log_filter
38 38 from rhodecode.lib.utils import make_db_config
@@ -207,8 +207,8 b' class RepoModel(BaseModel):'
207 207 def quick_menu(repo_name):
208 208 return _render('quick_menu', repo_name)
209 209
210 def repo_lnk(name, rtype, rstate, private, fork_of):
211 return _render('repo_name', name, rtype, rstate, private, fork_of,
210 def repo_lnk(name, rtype, rstate, private, archived, fork_of):
211 return _render('repo_name', name, rtype, rstate, private, archived, fork_of,
212 212 short_name=not admin, admin=False)
213 213
214 214 def last_change(last_change):
@@ -246,8 +246,8 b' class RepoModel(BaseModel):'
246 246 row = {
247 247 "menu": quick_menu(repo.repo_name),
248 248
249 "name": repo_lnk(repo.repo_name, repo.repo_type,
250 repo.repo_state, repo.private, repo.fork),
249 "name": repo_lnk(repo.repo_name, repo.repo_type, repo.repo_state,
250 repo.private, repo.archived, repo.fork),
251 251 "name_raw": repo.repo_name.lower(),
252 252
253 253 "last_change": last_change(repo.last_db_change),
@@ -427,6 +427,7 b' class RepoModel(BaseModel):'
427 427 new_repo.group = repo_group
428 428 new_repo.description = description or repo_name
429 429 new_repo.private = private
430 new_repo.archived = False
430 431 new_repo.clone_uri = clone_uri
431 432 new_repo.landing_rev = landing_rev
432 433
@@ -608,7 +609,24 b' class RepoModel(BaseModel):'
608 609 from rhodecode.lib.celerylib import tasks, run_task
609 610 return run_task(tasks.create_repo_fork, form_data, cur_user)
610 611
611 def delete(self, repo, forks=None, fs_remove=True, cur_user=None):
612 def archive(self, repo):
613 """
614 Archive given repository. Set archive flag.
615
616 :param repo:
617 """
618 repo = self._get_repo(repo)
619 if repo:
620
621 try:
622 repo.archived = True
623 self.sa.add(repo)
624 self.sa.commit()
625 except Exception:
626 log.error(traceback.format_exc())
627 raise
628
629 def delete(self, repo, forks=None, pull_requests=None, fs_remove=True, cur_user=None):
612 630 """
613 631 Delete given repository, forks parameter defines what do do with
614 632 attached forks. Throws AttachedForksError if deleted repo has attached
@@ -616,6 +634,7 b' class RepoModel(BaseModel):'
616 634
617 635 :param repo:
618 636 :param forks: str 'delete' or 'detach'
637 :param pull_requests: str 'delete' or None
619 638 :param fs_remove: remove(archive) repo from filesystem
620 639 """
621 640 if not cur_user:
@@ -632,6 +651,12 b' class RepoModel(BaseModel):'
632 651 elif [f for f in repo.forks]:
633 652 raise AttachedForksError()
634 653
654 # check for pull requests
655 pr_sources = repo.pull_requests_source
656 pr_targets = repo.pull_requests_target
657 if pull_requests != 'delete' and (pr_sources or pr_targets):
658 raise AttachedPullRequestsError()
659
635 660 old_repo_dict = repo.get_dict()
636 661 events.trigger(events.RepoPreDeleteEvent(repo))
637 662 try:
@@ -23,12 +23,9 b' Scm model for RhodeCode'
23 23 """
24 24
25 25 import os.path
26 import re
27 import sys
28 26 import traceback
29 27 import logging
30 28 import cStringIO
31 import pkg_resources
32 29
33 30 from sqlalchemy import func
34 31 from zope.cachedescriptors.property import Lazy as LazyProperty
@@ -53,6 +50,7 b' from rhodecode.model.db import ('
53 50 Repository, CacheKey, UserFollowing, UserLog, User, RepoGroup,
54 51 PullRequest)
55 52 from rhodecode.model.settings import VcsSettingsModel
53 from rhodecode.model.validation_schema.validators import url_validator, InvalidCloneUrl
56 54
57 55 log = logging.getLogger(__name__)
58 56
@@ -379,29 +377,36 b' class ScmModel(BaseModel):'
379 377 self.sa.add(repo)
380 378 return repo
381 379
382 def pull_changes(self, repo, username, remote_uri=None):
380 def pull_changes(self, repo, username, remote_uri=None, validate_uri=True):
383 381 dbrepo = self._get_repo(repo)
384 382 remote_uri = remote_uri or dbrepo.clone_uri
385 383 if not remote_uri:
386 384 raise Exception("This repository doesn't have a clone uri")
387 385
388 386 repo = dbrepo.scm_instance(cache=False)
389 # TODO: marcink fix this an re-enable since we need common logic
390 # for hg/git remove hooks so we don't trigger them on fetching
391 # commits from remote
392 387 repo.config.clear_section('hooks')
393 388
389 try:
390 # NOTE(marcink): add extra validation so we skip invalid urls
391 # this is due this tasks can be executed via scheduler without
392 # proper validation of remote_uri
393 if validate_uri:
394 config = make_db_config(clear_session=False)
395 url_validator(remote_uri, dbrepo.repo_type, config)
396 except InvalidCloneUrl:
397 raise
398
394 399 repo_name = dbrepo.repo_name
395 400 try:
396 401 # TODO: we need to make sure those operations call proper hooks !
397 repo.pull(remote_uri)
402 repo.fetch(remote_uri)
398 403
399 404 self.mark_for_invalidation(repo_name)
400 405 except Exception:
401 406 log.error(traceback.format_exc())
402 407 raise
403 408
404 def push_changes(self, repo, username, remote_uri=None):
409 def push_changes(self, repo, username, remote_uri=None, validate_uri=True):
405 410 dbrepo = self._get_repo(repo)
406 411 remote_uri = remote_uri or dbrepo.push_uri
407 412 if not remote_uri:
@@ -411,6 +416,16 b' class ScmModel(BaseModel):'
411 416 repo.config.clear_section('hooks')
412 417
413 418 try:
419 # NOTE(marcink): add extra validation so we skip invalid urls
420 # this is due this tasks can be executed via scheduler without
421 # proper validation of remote_uri
422 if validate_uri:
423 config = make_db_config(clear_session=False)
424 url_validator(remote_uri, dbrepo.repo_type, config)
425 except InvalidCloneUrl:
426 raise
427
428 try:
414 429 repo.push(remote_uri)
415 430 except Exception:
416 431 log.error(traceback.format_exc())
@@ -450,8 +465,8 b' class ScmModel(BaseModel):'
450 465
451 466 # We trigger the post-push action
452 467 hooks_utils.trigger_post_push_hook(
453 username=user.username, action='push_local', repo_name=repo_name,
454 repo_alias=repo.alias, commit_ids=[tip.raw_id])
468 username=user.username, action='push_local', hook_type='post_push',
469 repo_name=repo_name, repo_alias=repo.alias, commit_ids=[tip.raw_id])
455 470 return tip
456 471
457 472 def _sanitize_path(self, f_path):
@@ -629,6 +644,7 b' class ScmModel(BaseModel):'
629 644 hooks_utils.trigger_post_push_hook(
630 645 username=user.username, action='push_local',
631 646 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
647 hook_type='post_push',
632 648 commit_ids=[tip.raw_id])
633 649 return tip
634 650
@@ -693,7 +709,7 b' class ScmModel(BaseModel):'
693 709
694 710 if trigger_push_hook:
695 711 hooks_utils.trigger_post_push_hook(
696 username=user.username, action='push_local',
712 username=user.username, action='push_local', hook_type='post_push',
697 713 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
698 714 commit_ids=[tip.raw_id])
699 715
@@ -753,7 +769,7 b' class ScmModel(BaseModel):'
753 769 self.mark_for_invalidation(repo.repo_name)
754 770 if trigger_push_hook:
755 771 hooks_utils.trigger_post_push_hook(
756 username=user.username, action='push_local',
772 username=user.username, action='push_local', hook_type='post_push',
757 773 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
758 774 commit_ids=[tip.raw_id])
759 775 return tip
@@ -241,8 +241,7 b' class SettingsModel(BaseModel):'
241 241 region.invalidate()
242 242
243 243 result = _get_all_settings('rhodecode_settings', key)
244 log.debug(
245 'Fetching app settings for key: %s took: %.3fs', key,
244 log.debug('Fetching app settings for key: %s took: %.3fs', key,
246 245 inv_context_manager.compute_time)
247 246
248 247 return result
@@ -300,11 +300,11 b' class UserModel(BaseModel):'
300 300
301 301 if updating_user_id:
302 302 log.debug('Checking for existing account in RhodeCode '
303 'database with user_id `%s` ' % (updating_user_id,))
303 'database with user_id `%s` ', updating_user_id)
304 304 user = User.get(updating_user_id)
305 305 else:
306 306 log.debug('Checking for existing account in RhodeCode '
307 'database with username `%s` ' % (username,))
307 'database with username `%s` ', username)
308 308 user = User.get_by_username(username, case_insensitive=True)
309 309
310 310 if user is None:
@@ -626,7 +626,7 b' class UserGroupModel(BaseModel):'
626 626 self.remove_user_from_group(gr, user)
627 627 else:
628 628 log.debug('Skipping removal from group %s since it is '
629 'not set to be automatically synchronized' % gr)
629 'not set to be automatically synchronized', gr)
630 630
631 631 # now we calculate in which groups user should be == groups params
632 632 owner = User.get_first_super_admin().username
@@ -647,7 +647,7 b' class UserGroupModel(BaseModel):'
647 647 UserGroupModel().add_user_to_group(existing_group, user)
648 648 else:
649 649 log.debug('Skipping addition to group %s since it is '
650 'not set to be automatically synchronized' % gr)
650 'not set to be automatically synchronized', gr)
651 651
652 652 def change_groups(self, user, groups):
653 653 """
@@ -12,7 +12,7 b''
12 12 body {
13 13 background:#eeeeee;
14 14 color: #323232;
15 font-family: "proximanovaregular","Proxima Nova Regular","Proxima Nova",sans-serif;
15 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
16 16 margin: 0 auto;
17 17 max-width: 1000px;
18 18 letter-spacing: .02em;
@@ -44,8 +44,6 b''
44 44
45 45 @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
46 46 @font-family-serif: Georgia, "Times New Roman", Times, serif;
47 //** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
48 @font-family-monospace: Consolas, "Liberation Mono", Menlo, Monaco, Courier, monospace;
49 47
50 48 @font-family-base: @font-family-sans-serif;
51 49
@@ -79,6 +79,7 b' div.diffblock {'
79 79 min-width: 5em;
80 80 margin: 0;
81 81 padding: @button-padding @button-padding @button-padding 0;
82 font-weight: @text-semibold-weight;
82 83 font-family: @text-semibold;
83 84 }
84 85
@@ -422,6 +423,7 b' div.codeblock {'
422 423 .author {
423 424 clear: both;
424 425 vertical-align: middle;
426 font-weight: @text-bold-weight;
425 427 font-family: @text-bold;
426 428 }
427 429
@@ -543,7 +545,7 b' div.search-code-body {'
543 545 border-right: 1px solid #ccc !important;
544 546 padding-right: 10px;
545 547 text-align: right;
546 font-family: "Lucida Console",Monaco,monospace;
548 font-family: @text-monospace;
547 549 span {
548 550 white-space: pre-wrap;
549 551 color: #666666;
@@ -571,7 +573,7 b' div.annotatediv { margin-left: 2px; marg'
571 573 .codehilite {
572 574 .hll { background-color: #ffffcc }
573 575 .c { color: #408080; font-style: italic } /* Comment */
574 .err, .codehilite .err { border: @border-thickness solid #FF0000 } /* Error */
576 .err, .codehilite .err { border: none } /* Error */
575 577 .k { color: #008000; font-weight: bold } /* Keyword */
576 578 .o { color: #666666 } /* Operator */
577 579 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
@@ -648,6 +650,7 b' pre.literal-block, .codehilite pre{'
648 650 @cb-text-padding: 5px;
649 651
650 652 @pill-padding: 2px 7px;
653 @pill-padding-small: 2px 2px 1px 2px;
651 654
652 655 input.filediff-collapse-state {
653 656 display: none;
@@ -667,7 +670,7 b' input.filediff-collapse-state {'
667 670 .filediff-menu {
668 671 display: none;
669 672 }
670 margin: 10px 0 0 0;
673
671 674 }
672 675
673 676 &+ .filediff { /* file diff is expanded */
@@ -689,10 +692,66 b' input.filediff-collapse-state {'
689 692 }
690 693 }
691 694 }
695
696 .filediffs .anchor {
697 display: block;
698 height: 40px;
699 margin-top: -40px;
700 visibility: hidden;
701 }
702
703 .filediffs .anchor:nth-of-type(1) {
704 display: block;
705 height: 80px;
706 margin-top: -80px;
707 visibility: hidden;
708 }
709
692 710 .cs_files {
693 711 clear: both;
694 712 }
695 713
714 #diff-file-sticky{
715 will-change: min-height;
716 }
717
718 .sidebar__inner{
719 transform: translate(0, 0); /* For browsers don't support translate3d. */
720 transform: translate3d(0, 0, 0);
721 will-change: position, transform;
722 height: 70px;
723 z-index: 30;
724 background-color: #fff;
725 padding: 5px 0px;
726 }
727
728 .sidebar__bar {
729 padding: 5px 0px 0px 0px
730 }
731
732 .fpath-placeholder {
733 clear: both;
734 visibility: hidden
735 }
736
737 .is-affixed {
738 .sidebar_inner_shadow {
739 position: fixed;
740 top: 75px;
741 right: -100%;
742 left: -100%;
743 z-index: 28;
744 display: block;
745 height: 5px;
746 content: "";
747 background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
748 border-top: 1px solid rgba(0, 0, 0, 0.15);
749 }
750 .fpath-placeholder {
751 visibility: visible !important;
752 }
753 }
754
696 755 .diffset-menu {
697 756 margin-bottom: 20px;
698 757 }
@@ -725,14 +784,27 b' input.filediff-collapse-state {'
725 784 }
726 785 }
727 786
787 .filelist {
788 .pill {
789 display: block;
790 float: left;
791 padding: @pill-padding-small;
792 }
793 }
794
728 795 .pill {
729 796 display: block;
730 797 float: left;
731 798 padding: @pill-padding;
732 799 }
800
733 801 .pill-group {
734 802 .pill {
735 803 opacity: .8;
804 margin-right: 3px;
805 font-size: 12px;
806 font-weight: normal;
807
736 808 &:first-child {
737 809 border-radius: @border-radius 0 0 @border-radius;
738 810 }
@@ -741,6 +813,7 b' input.filediff-collapse-state {'
741 813 }
742 814 &:only-child {
743 815 border-radius: @border-radius;
816 margin-right: 0;
744 817 }
745 818 }
746 819 }
@@ -815,6 +888,56 b' input.filediff-collapse-state {'
815 888 }
816 889 }
817 890
891 .filediff-collapse-button, .filediff-expand-button {
892 cursor: pointer;
893 }
894 .filediff-collapse-button {
895 display: inline;
896 }
897 .filediff-expand-button {
898 display: none;
899 }
900 .filediff-collapsed .filediff-collapse-button {
901 display: none;
902 }
903 .filediff-collapsed .filediff-expand-button {
904 display: inline;
905 }
906
907 /**** COMMENTS ****/
908
909 .filediff-menu {
910 .show-comment-button {
911 display: none;
912 }
913 }
914 &.hide-comments {
915 .inline-comments {
916 display: none;
917 }
918 .filediff-menu {
919 .show-comment-button {
920 display: inline;
921 }
922 .hide-comment-button {
923 display: none;
924 }
925 }
926 }
927
928 .hide-line-comments {
929 .inline-comments {
930 display: none;
931 }
932 }
933
934 /**** END COMMENTS ****/
935
936 }
937
938
939
940 .filediff, .filelist {
818 941 .pill {
819 942 &[op="name"] {
820 943 background: none;
@@ -868,53 +991,8 b' input.filediff-collapse-state {'
868 991 color: white;
869 992 }
870 993 }
871
872 .filediff-collapse-button, .filediff-expand-button {
873 cursor: pointer;
874 }
875 .filediff-collapse-button {
876 display: inline;
877 }
878 .filediff-expand-button {
879 display: none;
880 }
881 .filediff-collapsed .filediff-collapse-button {
882 display: none;
883 }
884 .filediff-collapsed .filediff-expand-button {
885 display: inline;
886 994 }
887 995
888 /**** COMMENTS ****/
889
890 .filediff-menu {
891 .show-comment-button {
892 display: none;
893 }
894 }
895 &.hide-comments {
896 .inline-comments {
897 display: none;
898 }
899 .filediff-menu {
900 .show-comment-button {
901 display: inline;
902 }
903 .hide-comment-button {
904 display: none;
905 }
906 }
907 }
908
909 .hide-line-comments {
910 .inline-comments {
911 display: none;
912 }
913 }
914
915 /**** END COMMENTS ****/
916
917 }
918 996
919 997 .filediff-outdated {
920 998 padding: 8px 0;
@@ -950,6 +1028,9 b' table.cb {'
950 1028 .cb-collapse {
951 1029 display: none;
952 1030 }
1031 .cb-hunk {
1032 display: none;
1033 }
953 1034 }
954 1035
955 1036 /* intentionally general selector since .cb-line-selected must override it
@@ -976,8 +1057,18 b' table.cb {'
976 1057 border-top: 1px solid #eee;
977 1058 }
978 1059
1060 &.cb-comment-info {
1061 border-top: 1px solid #eee;
1062 color: rgba(0, 0, 0, 0.3);
1063 background: #edf2f9;
1064
1065 td {
1066
1067 }
1068 }
1069
979 1070 &.cb-hunk {
980 font-family: @font-family-monospace;
1071 font-family: @text-monospace;
981 1072 color: rgba(0, 0, 0, 0.3);
982 1073
983 1074 td {
@@ -1009,11 +1100,22 b' table.cb {'
1009 1100 padding-right: @cb-line-code-padding;
1010 1101 display: block;
1011 1102 white-space: pre-wrap;
1012 font-family: @font-family-monospace;
1103 font-family: @text-monospace;
1013 1104 word-break: break-all;
1014 1105 .nonl {
1015 1106 color: @color5;
1016 1107 }
1108 .cb-action {
1109 &:before {
1110 content: " ";
1111 }
1112 &.cb-deletion:before {
1113 content: "- ";
1114 }
1115 &.cb-addition:before {
1116 content: "+ ";
1117 }
1118 }
1017 1119 }
1018 1120
1019 1121 &> button.cb-comment-box-opener {
@@ -1043,11 +1145,14 b' table.cb {'
1043 1145 &.cb-data {
1044 1146 text-align: right;
1045 1147 width: 30px;
1046 font-family: @font-family-monospace;
1148 font-family: @text-monospace;
1047 1149
1048 1150 .icon-comment {
1049 1151 cursor: pointer;
1050 1152 }
1153 &.cb-line-selected {
1154 background: @comment-highlight-color !important;
1155 }
1051 1156 &.cb-line-selected > div {
1052 1157 display: block;
1053 1158 background: @comment-highlight-color !important;
@@ -1062,13 +1167,15 b' table.cb {'
1062 1167 color: rgba(0, 0, 0, 0.3);
1063 1168 text-align: right;
1064 1169 border-right: 1px solid #eee;
1065 font-family: @font-family-monospace;
1170 font-family: @text-monospace;
1171 -webkit-user-select: none;
1172 -moz-user-select: none;
1066 1173 user-select: none;
1067 1174
1068 1175 a::before {
1069 1176 content: attr(data-line-no);
1070 1177 }
1071 &.cb-line-selected a {
1178 &.cb-line-selected {
1072 1179 background: @comment-highlight-color !important;
1073 1180 }
1074 1181
@@ -62,6 +62,7 b' tr.inline-comments div {'
62 62 line-height: .8em;
63 63
64 64 font-family: @text-italic;
65 font-style: italic;
65 66 background: #fff none;
66 67 color: @grey4;
67 68 border: 1px solid @grey4;
@@ -72,6 +73,8 b' tr.inline-comments div {'
72 73
73 74 &.todo {
74 75 color: @color5;
76 font-style: italic;
77 font-weight: @text-bold-italic-weight;
75 78 font-family: @text-bold-italic;
76 79 }
77 80
@@ -92,6 +95,7 b' tr.inline-comments div {'
92 95 color: @color1;
93 96 margin: 2px 8px;
94 97 font-family: @text-italic;
98 font-style: italic;
95 99 }
96 100 }
97 101
@@ -336,7 +340,7 b' div.comment-form {'
336 340 .comment-form textarea {
337 341 width: 100%;
338 342 height: 100px;
339 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
343 font-family: @text-monospace;
340 344 }
341 345
342 346 form.comment-form {
@@ -95,6 +95,7 b' div.diffblock.margined.comm tr {'
95 95
96 96 .compare-label {
97 97 clear: both;
98 font-weight: @text-semibold-weight;
98 99 font-family: @text-semibold;
99 100 }
100 101 }
@@ -180,7 +180,7 b' div.markdown-block table {'
180 180 margin: 3px 0px 13px 0px !important;
181 181 color: #424242 !important;
182 182 font-size: 13px !important;
183 font-family: "Helvetica" !important;
183 font-family: @text-regular;
184 184 font-weight: normal !important;
185 185 overflow: visible !important;
186 186 line-height: 140% !important;
@@ -256,7 +256,7 b' div.markdown-block code,'
256 256 div.markdown-block pre,
257 257 div.markdown-block #ws,
258 258 div.markdown-block #message {
259 font-family: Monaco;
259 font-family: @text-monospace;
260 260 font-size: 11px;
261 261 .border-radius(@border-radius);
262 262 background-color: white;
@@ -91,7 +91,7 b''
91 91 }
92 92
93 93 .input-monospace {
94 font-family: @font-family-monospace;
94 font-family: @text-monospace;
95 95 }
96 96
97 97 .fields {
@@ -5,7 +5,6 b''
5 5 @import 'helpers';
6 6 @import 'mixins';
7 7 @import 'rcicons';
8 @import 'fonts';
9 8 @import 'variables';
10 9 @import 'bootstrap-variables';
11 10 @import 'form-bootstrap';
@@ -35,11 +34,12 b''
35 34 width: 100%;
36 35 z-index: 101;
37 36 text-align: center;
38 font-family: @text-semibold;
39 37 font-size: 120%;
40 38 color: white;
41 39 background-color: @alert2;
42 40 padding: 5px 0 5px 0;
41 font-weight: @text-semibold-weight;
42 font-family: @text-semibold;
43 43 }
44 44
45 45 html {
@@ -161,8 +161,9 b' input.inline[type="file"] {'
161 161 }
162 162
163 163 .error-branding {
164 color: @grey4;
165 font-weight: @text-semibold-weight;
164 166 font-family: @text-semibold;
165 color: @grey4;
166 167 }
167 168
168 169 .error_message {
@@ -215,6 +216,7 b' input.inline[type="file"] {'
215 216
216 217 h4 {
217 218 margin: 0 0 @padding;
219 font-weight: @text-semibold-weight;
218 220 font-family: @text-semibold;
219 221 }
220 222 }
@@ -352,6 +354,7 b' ul.auth_plugins {'
352 354 display: block;
353 355 clear: both;
354 356 margin: @padding 0;
357 font-weight: @text-bold-weight;
355 358 font-family: @text-bold;
356 359 }
357 360
@@ -393,12 +396,13 b' ul.auth_plugins {'
393 396 #pr-title-input {
394 397 width: 72%;
395 398 font-size: 1em;
396 font-family: @text-bold;
397 399 margin: 0;
398 400 padding: 0 0 0 @padding/4;
399 401 line-height: 1.7em;
400 402 color: @text-color;
401 403 letter-spacing: .02em;
404 font-weight: @text-bold-weight;
405 font-family: @text-bold;
402 406 }
403 407
404 408 #pullrequest_title {
@@ -477,6 +481,7 b' ul.auth_plugins {'
477 481 border-width: 2px;
478 482 border-style: solid;
479 483 .border-radius(2px);
484 font-weight: @text-bold-weight;
480 485 font-family: @text-bold;
481 486
482 487 &.info { border-color: @alert4; background-color: @alert4-inner; }
@@ -618,11 +623,6 b' input::-moz-focus-inner { border:0; padd'
618 623 display: block;
619 624 }
620 625
621 //TODO: lisa: this should be in tables
622 .show_more_col {
623 width: 20px;
624 }
625
626 626 //FORMS
627 627
628 628 .medium-inline,
@@ -1546,19 +1546,15 b' table.integrations {'
1546 1546
1547 1547 .show_more {
1548 1548 display: inline-block;
1549 position: relative;
1549 width: 0;
1550 height: 0;
1550 1551 vertical-align: middle;
1551 width: 4px;
1552 height: @basefontsize;
1553
1554 &:after {
1555 content: "\00A0\25BE";
1556 display: inline-block;
1557 width:10px;
1558 line-height: 5px;
1559 font-size: 12px;
1560 cursor: pointer;
1561 }
1552 content: "";
1553 border: 4px solid;
1554 border-right-color: transparent;
1555 border-bottom-color: transparent;
1556 border-left-color: transparent;
1557 font-size: 0;
1562 1558 }
1563 1559
1564 1560 .journal_more .show_more {
@@ -1569,13 +1565,6 b' table.integrations {'
1569 1565 }
1570 1566 }
1571 1567
1572 .open .show_more:after,
1573 .select2-dropdown-open .show_more:after {
1574 .rotate(180deg);
1575 margin-left: 4px;
1576 }
1577
1578
1579 1568 .compare_view_commits .collapse_commit:after {
1580 1569 cursor: pointer;
1581 1570 content: "\00A0\25B4";
@@ -2215,6 +2204,7 b' h3.files_location{'
2215 2204 display: inline-block;
2216 2205
2217 2206 em{
2207 font-weight: @text-bold-weight;
2218 2208 font-family: @text-bold;
2219 2209 }
2220 2210 }
@@ -2250,7 +2240,6 b' h3.files_location{'
2250 2240
2251 2241 div.search-feedback-items {
2252 2242 display: inline-block;
2253 padding:0px 0px 0px 96px;
2254 2243 }
2255 2244
2256 2245 div.search-code-body {
@@ -2388,6 +2377,21 b' table.dataTable {'
2388 2377 }
2389 2378 }
2390 2379
2380 table.rctable {
2381 &.permissions {
2382
2383 th.td-owner {
2384 padding: 0;
2385 }
2386
2387 th {
2388 font-weight: normal;
2389 padding: 0 5px;
2390 }
2391
2392 }
2393 }
2394
2391 2395
2392 2396 // TODO: johbo: Fix for IE10, this avoids that we see a border
2393 2397 // and padding around checkboxes and radio boxes. Move to the right place,
@@ -2443,7 +2447,7 b' div.markup-form {'
2443 2447 .markup-form textarea {
2444 2448 width: 100%;
2445 2449 height: 100px;
2446 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
2450 font-family: @text-monospace;
2447 2451 }
2448 2452
2449 2453 form.markup-form {
@@ -119,11 +119,6 b''
119 119 &.has_select2 a {
120 120 display: block;
121 121 padding: 10px 0 2px;
122
123 .show_more {
124 margin-top: -4px;
125 padding-right: .5em;
126 }
127 122 }
128 123
129 124 .menulabel {
@@ -170,17 +165,13 b''
170 165
171 166 &:hover { color: @grey1; }
172 167 }
173
174 .show_more {
175 padding-left: .5em;
176 }
177 168 }
178 169
179 170 #quick_login_link {
180 171 display: inline-block;
181 172
182 173 .gravatar {
183 border: 1px solid @grey2;
174 border: 1px solid @grey5;
184 175 }
185 176
186 177 .gravatar-login {
@@ -205,6 +196,10 b''
205 196 &:hover #quick_login_link {
206 197 color: inherit;
207 198 }
199
200 .menu_link_user {
201 padding: 0 2px;
202 }
208 203 }
209 204
210 205 &:before { content: none; }
@@ -649,7 +644,7 b' ul#context-pages {'
649 644 border-bottom: 1px solid @grey4;
650 645 display: inline-block;
651 646 vertical-align: top;
652 margin-left: -5px;
647 margin-left: -7px;
653 648 background: @grey3;
654 649 }
655 650
@@ -673,10 +668,11 b' ul#context-pages {'
673 668 }
674 669
675 670 .main_filter_input {
676 padding: 6px;
671 padding: 5px;
677 672 min-width: 220px;
678 673 color: @nav-grey;
679 674 background: @grey3;
675 min-height: 18px;
680 676 }
681 677
682 678 .main_filter_input::placeholder {
@@ -90,6 +90,12 b''
90 90
91 91 .icon-more:before { content: '\e815'; } /* '' */
92 92
93 .icon-more-linked { cursor: pointer; color: @grey3 }
94 .icon-more-linked:before { content: '\e815'; } /* '' */
95
96 .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 8px }
97 .icon-expand-linked:before { content: '\e80e'; } /* '' */
98
93 99 .icon-git-inv:before { content: '\e80f'; } /* '' */
94 100 .icon-hg-inv:before { content: '\e810'; } /* '' */
95 101 .icon-svn-inv:before { content: '\e811'; } /* '' */
@@ -71,7 +71,7 b' div.readme_box table {'
71 71 margin: 3px 0px 13px 0px !important;
72 72 color: #424242 !important;
73 73 font-size: 13px !important;
74 font-family: "Helvetica" !important;
74 font-family: @text-regular;
75 75 font-weight: normal !important;
76 76 overflow: visible !important;
77 77 line-height: 140% !important;
@@ -136,7 +136,7 b' div.readme_box button {'
136 136
137 137 div.readme_box code,
138 138 div.readme_box pre {
139 font-family: Monaco;
139 font-family: @text-monospace;
140 140 font-size: 11px;
141 141 .border-radius(@border-radius);
142 142 background-color: white;
@@ -127,11 +127,11 b' select.select2{height:28px;visibility:hi'
127 127 &:after {
128 128 position: absolute;
129 129 content: "\00A0\25BE";
130 right: .6em;
130 right: .1em;
131 131 line-height: 1em;
132 top: 0.9em;
132 top: 0.4em;
133 133 width: 1em;
134 font-size: 1em;
134 font-size: 20px;
135 135 }
136 136 }
137 137 }
@@ -198,9 +198,10 b' select.select2{height:28px;visibility:hi'
198 198 &.select2-result-with-children {
199 199
200 200 .select2-result-label {
201 font-family: @text-semibold;
202 201 color: @rcdarkblue;
203 202 cursor: default;
203 font-weight: @text-semibold-weight;
204 font-family: @text-semibold;
204 205 }
205 206
206 207 ul.select2-result-sub li .select2-result-label {
@@ -62,6 +62,7 b''
62 62 height: 30px;
63 63 margin: 0;
64 64 padding: 0;
65 font-weight: @text-semibold-weight;
65 66 font-family: @text-semibold;
66 67 }
67 68
@@ -165,9 +166,15 b''
165 166 width: 25%;
166 167 margin: 0;
167 168 padding: 0;
169 font-weight: @text-semibold-weight;
168 170 font-family: @text-semibold;
169 171 }
170 172
173 .left-label-summary {
174 .left-label;
175 width: 150px;
176 }
177
171 178 .right-content { // similar to form fields
172 179 float: left;
173 180 display: block;
@@ -247,13 +254,19 b''
247 254 display: block;
248 255 width: 100%;
249 256 margin: 0;
250 padding: @space 0 @padding 0;
257 padding: @space 0 10px 0;
251 258 border-top: @border-thickness solid @border-default-color;
252 259
253 260 .stats {
254 261 float: left;
255 262 width: 50%;
256 263 }
264 .stats-filename {
265 font-size: 120%;
266 }
267 .stats-first-item {
268 padding: 0px 0px 0px 3px;
269 }
257 270
258 271 .buttons {
259 272 float: right;
@@ -65,13 +65,9 b' table.dataTable {'
65 65 background-color: @grey7;
66 66 }
67 67
68 .td-radio + .td-owner {
69 padding-left: 1em;
70 }
71
72
73 68 th {
74 69 text-align: left;
70 font-weight: @text-semibold-weight;
75 71 font-family: @text-semibold;
76 72 }
77 73
@@ -139,7 +135,7 b' table.dataTable {'
139 135 white-space: nowrap;
140 136 overflow: hidden;
141 137 text-overflow: ellipsis;
142 max-width: 450px;
138 max-width: 350px;
143 139 }
144 140 }
145 141
@@ -234,6 +230,8 b' table.dataTable {'
234 230 &.expand_commit {
235 231 padding-right: 0;
236 232 padding-left: 1em;
233 cursor: pointer;
234 width: 20px;
237 235 }
238 236 }
239 237
@@ -327,6 +325,7 b' table#repo_list_table {'
327 325 table.keyboard-mappings {
328 326 th {
329 327 text-align: left;
328 font-weight: @text-semibold-weight;
330 329 font-family: @text-semibold;
331 330 }
332 331 }
@@ -372,6 +371,7 b' table.keyboard-mappings {'
372 371 table.rctable.dl-settings {
373 372 td {
374 373 border: none;
374 vertical-align: baseline;
375 375 }
376 376 }
377 377
@@ -447,6 +447,8 b' table.trending_language_tbl {'
447 447
448 448 &.expand_commit {
449 449 padding-right: 0;
450 cursor: pointer;
451 width: 20px;
450 452 }
451 453 }
452 454 }
@@ -35,16 +35,16 b' h1, h2, h3, h4, h5, h6,'
35 35 }
36 36 }
37 37
38 h1, .h1 { font-size: 1.54em; font-family: @text-bold; }
39 h2, .h2 { font-size: 1.23em; font-family: @text-semibold; }
38 h1, .h1 { font-size: 1.54em; font-weight: @text-bold-weight; font-family: @text-bold; }
39 h2, .h2 { font-size: 1.23em; font-weight: @text-semibold-weight; font-family: @text-semibold; }
40 40 h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
41 h4, .h4 { font-size: 1em; font-family: @text-bold; }
42 h5, .h5 { font-size: 1em; font-family: @text-bold-italic; }
43 h6, .h6 { font-size: 1em; font-family: @text-bold-italic; }
41 h4, .h4 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
42 h5, .h5 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
43 h6, .h6 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
44 44
45 45 // Breadcrumbs
46 46 .breadcrumbs {
47 &:extend(h1);
47 font-size: @repo-title-fontsize;
48 48 margin: 0;
49 49 }
50 50
@@ -95,15 +95,19 b' img {'
95 95 }
96 96
97 97 strong {
98 font-weight: @text-bold-weight;
98 99 font-family: @text-bold;
99 100 }
100 101
101 102 em {
102 103 font-family: @text-italic;
104 font-style: italic;
103 105 }
104 106
105 107 strong em,
106 108 em strong {
109 font-style: italic;
110 font-weight: @text-bold-italic-weight;
107 111 font-family: @text-bold-italic;
108 112 }
109 113
@@ -384,6 +388,7 b' dd {'
384 388
385 389 dt {
386 390 margin: @textmargin 0 0 0;
391 font-weight: @text-bold-weight;
387 392 font-family: @text-bold;
388 393 }
389 394
@@ -53,16 +53,26 b''
53 53 @text-color: @grey2;
54 54 @repo-title-fontsize: 18px;
55 55
56 @text-regular: "proximanovaregular","Proxima Nova Regular", "Proxima Nova", sans-serif;
57 @text-italic: "proximanovaitalic","Proxima Nova Italic", "Proxima Nova", sans-serif;
58 @text-bold: "proximanovabold","Proxima Nova Bold", "Proxima Nova", sans-serif;
59 @text-semibold: "proximanovasemibold","Proxima Nova Semibold", "Proxima Nova", sans-serif;
60 @text-bold-italic: "proximanovabolditalic","Proxima Nova Bold Italic", "Proxima Nova", sans-serif;
61 @text-code: "Lucida Console", Menlo, Monaco, monospace;
56 @text-regular: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
57 @text-monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;
58
59 @text-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
60
61 @text-bold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
62 @text-bold-weight: 600;
63
64 @text-semibold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
65 @text-semibold-weight: 500;
66
67 @text-bold-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
68 @text-bold-italic-weight: 600;
69
70 @text-code: @text-monospace;
62 71 @text-light: @text-regular;
63 @text-light-italic: @text-italic;
72
73
64 74 // Used for .close buttons
65 @text-bootstrap: "Helvetica Neue", Helvetica, Arial, sans-serif;
75 @text-bootstrap: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
66 76
67 77 @panel-title: @basefontsize;
68 78 @panel-footer: @basefontsize;
@@ -150,6 +150,7 b' function registerRCRoutes() {'
150 150 pyroutes.register('repo_list_data', '/_repos', []);
151 151 pyroutes.register('goto_switcher_data', '/_goto_data', []);
152 152 pyroutes.register('markup_preview', '/_markup_preview', []);
153 pyroutes.register('store_user_session_value', '/_store_session_attr', []);
153 154 pyroutes.register('journal', '/_admin/journal', []);
154 155 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
155 156 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
@@ -227,6 +228,7 b' function registerRCRoutes() {'
227 228 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
228 229 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
229 230 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
231 pyroutes.register('edit_repo_advanced_archive', '/%(repo_name)s/settings/advanced/archive', ['repo_name']);
230 232 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
231 233 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
232 234 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
@@ -1,6 +1,81 b''
1 import {Polymer, html} from '@polymer/polymer/polymer-legacy';
2 import '@polymer/iron-ajax/iron-ajax.js';
3
4 const elemTemplate = html`
5 <iron-ajax
6 id="ajaxConnect"
7 url=""
8 handle-as="json"
9 method="post"
10 content-type="application/json"
11 loading="{{loadingConnect}}"
12 last-response="{{connectLastResponse}}"
13 on-response="_handleConnect"
14 on-error="_handleConnectError"
15 debounce-duration="100"></iron-ajax>
16
17 <iron-ajax
18 id="ajaxDisconnect"
19 url=""
20 handle-as="json"
21 method="post"
22 content-type="application/json"
23 loading="{{loadingDisconnect}}"
24 last-response="{{_disconnectLastResponse}}"
25 on-response="_handleDisconnect"
26 debounce-duration="100"></iron-ajax>
27
28 <iron-ajax
29 id="ajaxSubscribe"
30 url=""
31 handle-as="json"
32 method="post"
33 content-type="application/json"
34 loading="{{loadingSubscribe}}"
35 last-response="{{subscribeLastResponse}}"
36 on-response="_handleSubscribe"
37 debounce-duration="100"></iron-ajax>
38
39 <iron-ajax
40 id="ajaxUnsubscribe"
41 url=""
42 handle-as="json"
43 method="post"
44 content-type="application/json"
45 loading="{{loadingUnsubscribe}}"
46 last-response="{{unsubscribeLastResponse}}"
47 on-response="_handleUnsubscribe"
48 debounce-duration="100"></iron-ajax>
49
50 <iron-ajax
51 id="ajaxMessage"
52 url=""
53 handle-as="json"
54 method="post"
55 content-type="application/json"
56 loading="{{loadingMessage}}"
57 last-response="{{messageLastResponse}}"
58 on-response="_handleMessage"
59 on-error="_handleMessageError"
60 debounce-duration="100"></iron-ajax>
61
62 <iron-ajax
63 id="ajaxListen"
64 url=""
65 handle-as="text"
66 loading="{{loadingListen}}"
67 last-response="{{listenLastResponse}}"
68 on-request="_handleListenOpen"
69 on-error="_handleListenError"
70 on-response="_handleListenMessageEvent"
71 debounce-duration="100"></iron-ajax>
72 `
73
1 74 Polymer({
2 75 is: 'channelstream-connection',
3 76
77 _template: elemTemplate,
78
4 79 /**
5 80 * Fired when `channels` array changes.
6 81 *
@@ -1,9 +1,31 b''
1 ccLog = Logger.get('RhodeCodeApp');
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 import '../channelstream-connection/channelstream-connection.js';
3 import '../rhodecode-toast/rhodecode-toast.js';
4 import '../rhodecode-favicon/rhodecode-favicon.js';
5
6 var ccLog = Logger.get('RhodeCodeApp');
2 7 ccLog.setLevel(Logger.OFF);
3 8
4 var rhodeCodeApp = Polymer({
5 is: 'rhodecode-app',
6 attached: function () {
9 export class RhodecodeApp extends PolymerElement {
10
11 static get is() {
12 return 'rhodecode-app';
13 }
14
15 static get template(){
16 return html`
17 <channelstream-connection
18 id="channelstream-connection"
19 on-channelstream-listen-message="receivedMessage"
20 on-channelstream-connected="handleConnected"
21 on-channelstream-subscribed="handleSubscribed">
22 </channelstream-connection>
23 <rhodecode-favicon></rhodecode-favicon>
24 `
25 }
26
27 connectedCallback() {
28 super.connectedCallback();
7 29 ccLog.debug('rhodeCodeApp created');
8 30 $.Topic('/notifications').subscribe(this.handleNotifications.bind(this));
9 31 $.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this));
@@ -21,9 +43,9 b' var rhodeCodeApp = Polymer({'
21 43 $(document).ready(function () {
22 44 this.kickoffChannelstreamPlugin();
23 45 }.bind(this));
24 },
46 }
25 47
26 initPlugins: function(){
48 initPlugins() {
27 49 for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) {
28 50 var pluginDef = window.APPLICATION_PLUGINS[i];
29 51 if (pluginDef.component){
@@ -34,26 +56,27 b' var rhodeCodeApp = Polymer({'
34 56 }
35 57 }
36 58 }
37 },
59 }
60
38 61 /** proxy to channelstream connection */
39 getChannelStreamConnection: function () {
62 getChannelStreamConnection() {
40 63 return this.$['channelstream-connection'];
41 },
64 }
42 65
43 handleNotifications: function (data) {
66 handleNotifications(data) {
44 67 var elem = document.getElementById('notifications');
45 68 if(elem){
46 69 elem.handleNotification(data);
47 70 }
48 71
49 },
72 }
50 73
51 faviconUpdate: function (data) {
74 faviconUpdate(data) {
52 75 this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count;
53 },
76 }
54 77
55 78 /** opens connection to ws server */
56 kickoffChannelstreamPlugin: function (data) {
79 kickoffChannelstreamPlugin(data) {
57 80 ccLog.debug('kickoffChannelstreamPlugin');
58 81 var channels = ['broadcast'];
59 82 var addChannels = this.checkViewChannels();
@@ -74,9 +97,9 b' var rhodeCodeApp = Polymer({'
74 97 $.Topic('/connection_controller/subscribe').processPrepared();
75 98 channelstreamConnection.connect();
76 99 }
77 },
100 }
78 101
79 checkViewChannels: function () {
102 checkViewChannels() {
80 103 // subscribe to different channels data is sent.
81 104
82 105 var channels = [];
@@ -94,10 +117,10 b' var rhodeCodeApp = Polymer({'
94 117 }
95 118
96 119 return channels;
97 },
120 }
98 121
99 122 /** subscribes users from channels in channelstream */
100 subscribeToChannelTopic: function (channels) {
123 subscribeToChannelTopic(channels) {
101 124 var channelstreamConnection = this.getChannelStreamConnection();
102 125 var toSubscribe = channelstreamConnection.calculateSubscribe(channels);
103 126 ccLog.debug('subscribeToChannelTopic', toSubscribe);
@@ -113,10 +136,10 b' var rhodeCodeApp = Polymer({'
113 136 }
114 137 }
115 138 }
116 },
139 }
117 140
118 141 /** publish received messages into correct topic */
119 receivedMessage: function (event) {
142 receivedMessage(event) {
120 143 for (var i = 0; i < event.detail.length; i++) {
121 144 var message = event.detail[i];
122 145 if (message.message.topic) {
@@ -130,17 +153,18 b' var rhodeCodeApp = Polymer({'
130 153 ccLog.warn('unhandled message', message);
131 154 }
132 155 }
133 },
156 }
134 157
135 handleConnected: function (event) {
158 handleConnected(event) {
136 159 var channelstreamConnection = this.getChannelStreamConnection();
137 160 channelstreamConnection.set('channelsState',
138 161 event.detail.channels_info);
139 162 channelstreamConnection.set('userState', event.detail.state);
140 163 channelstreamConnection.set('channels', event.detail.channels);
141 164 this.propagageChannelsState();
142 },
143 handleSubscribed: function (event) {
165 }
166
167 handleSubscribed(event) {
144 168 var channelstreamConnection = this.getChannelStreamConnection();
145 169 var channelInfo = event.detail.channels_info;
146 170 var channelKeys = Object.keys(event.detail.channels_info);
@@ -150,9 +174,10 b' var rhodeCodeApp = Polymer({'
150 174 }
151 175 channelstreamConnection.set('channels', event.detail.channels);
152 176 this.propagageChannelsState();
153 },
177 }
178
154 179 /** propagates channel states on topics */
155 propagageChannelsState: function (event) {
180 propagageChannelsState(event) {
156 181 var channelstreamConnection = this.getChannelStreamConnection();
157 182 var channel_data = channelstreamConnection.channelsState;
158 183 var channels = channelstreamConnection.channels;
@@ -163,4 +188,7 b' var rhodeCodeApp = Polymer({'
163 188 );
164 189 }
165 190 }
166 });
191
192 }
193
194 customElements.define(RhodecodeApp.is, RhodecodeApp);
@@ -1,20 +1,33 b''
1 Polymer({
2 is: 'rhodecode-favicon',
3 properties: {
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2
3 export class RhodecodeFavicon extends PolymerElement {
4
5 static get is() {
6 return 'rhodecode-favicon';
7 }
8
9 static get properties() {
10 return {
4 11 favicon: Object,
5 12 counter: {
6 13 type: Number,
7 14 observer: '_handleCounter'
8 15 }
9 },
16 }
17 }
10 18
11 ready: function () {
19 connectedCallback() {
20 super.connectedCallback();
12 21 this.favicon = new Favico({
13 22 type: 'rectangle',
14 23 animation: 'none'
15 24 });
16 },
17 _handleCounter: function (newVal, oldVal) {
25 }
26
27 _handleCounter(newVal, oldVal) {
18 28 this.favicon.badge(this.counter);
19 29 }
20 });
30
31 }
32
33 customElements.define(RhodecodeFavicon.is, RhodecodeFavicon);
@@ -1,9 +1,128 b''
1 Polymer({
2 is: 'rhodecode-toast',
3 properties: {
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 import '@polymer/paper-toggle-button/paper-toggle-button.js';
3 import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
4 import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
5 import '../rhodecode-unsafe-html/rhodecode-unsafe-html.js';
6
7 export class RhodecodeToast extends mixinBehaviors([IronA11yKeysBehavior], PolymerElement) {
8
9 static get is() {
10 return 'rhodecode-toast';
11 }
12
13 static get template(){
14 return html`
15 <style include="shared-styles">
16 /* inset border for buttons - does not work in ie */
17 /* rounded borders */
18 /* rounded borders - bottom only */
19 /* rounded borders - top only */
20 /* text shadow */
21 /* centers text in a circle - input diameter of circle and color */
22 /* pill version of the circle */
23 .absolute-center {
24 margin: auto;
25 position: absolute;
26 top: 0;
27 left: 0;
28 bottom: 0;
29 right: 0;
30 }
31
32 .top-left-rounded-corner {
33 -webkit-border-top-left-radius: 2px;
34 -khtml-border-radius-topleft: 2px;
35 border-top-left-radius: 2px;
36 }
37
38 .top-right-rounded-corner {
39 -webkit-border-top-right-radius: 2px;
40 -khtml-border-radius-topright: 2px;
41 border-top-right-radius: 2px;
42 }
43
44 .bottom-left-rounded-corner {
45 -webkit-border-bottom-left-radius: 2px;
46 -khtml-border-radius-bottomleft: 2px;
47 border-bottom-left-radius: 2px;
48 }
49
50 .bottom-right-rounded-corner {
51 -webkit-border-bottom-right-radius: 2px;
52 -khtml-border-radius-bottomright: 2px;
53 border-bottom-right-radius: 2px;
54 }
55
56 .top-left-rounded-corner-mid {
57 -webkit-border-top-left-radius: 2px;
58 -khtml-border-radius-topleft: 2px;
59 border-top-left-radius: 2px;
60 }
61
62 .top-right-rounded-corner-mid {
63 -webkit-border-top-right-radius: 2px;
64 -khtml-border-radius-topright: 2px;
65 border-top-right-radius: 2px;
66 }
67
68 .bottom-left-rounded-corner-mid {
69 -webkit-border-bottom-left-radius: 2px;
70 -khtml-border-radius-bottomleft: 2px;
71 border-bottom-left-radius: 2px;
72 }
73
74 .bottom-right-rounded-corner-mid {
75 -webkit-border-bottom-right-radius: 2px;
76 -khtml-border-radius-bottomright: 2px;
77 border-bottom-right-radius: 2px;
78 }
79
80 .alert {
81 margin: 10px 0;
82 }
83
84 .toast-close {
85 margin: 0;
86 float: right;
87 cursor: pointer;
88 }
89
90 .toast-message-holder {
91 background: rgba(255, 255, 255, 0.25);
92 }
93
94 .toast-message-holder.fixed {
95 position: fixed;
96 padding: 10px 0;
97 margin-left: 10px;
98 margin-right: 10px;
99 top: 0;
100 left: 0;
101 right: 0;
102 z-index: 100;
103 }
104 </style>
105
106 <template is="dom-if" if="[[hasToasts]]">
107 <div class$="container toast-message-holder [[conditionalClass(isFixed)]]">
108 <template is="dom-repeat" items="[[toasts]]">
109 <div class$="alert alert-[[item.level]]">
110 <div on-click="dismissNotification" class="toast-close" index-pos="[[index]]">
111 <span>[[_gettext('Close')]]</span>
112 </div>
113 <rhodecode-unsafe-html text="[[item.message]]"></rhodecode-unsafe-html>
114 </div>
115 </template>
116 </div>
117 </template>
118 `
119 }
120
121 static get properties() {
122 return {
4 123 toasts: {
5 124 type: Array,
6 value: function(){
125 value() {
7 126 return []
8 127 }
9 128 },
@@ -17,40 +136,43 b' Polymer({'
17 136 },
18 137 keyEventTarget: {
19 138 type: Object,
20 value: function() {
139 value() {
21 140 return document.body;
22 141 }
23 142 }
24 },
25 behaviors: [
26 Polymer.IronA11yKeysBehavior
27 ],
28 observers: [
29 '_changedToasts(toasts.splices)'
30 ],
143 }
144 }
31 145
32 keyBindings: {
146 get keyBindings() {
147 return {
33 148 'esc:keyup': '_hideOnEsc'
34 },
149 }
150 }
35 151
36 _hideOnEsc: function (event) {
37 return this.dismissNotifications();
38 },
152 static get observers() {
153 return [
154 '_changedToasts(toasts.splices)'
155 ]
156 }
39 157
40 _computeHasToasts: function(){
158 _hideOnEsc(event) {
159 return this.dismissNotifications();
160 }
161
162 _computeHasToasts() {
41 163 return this.toasts.length > 0;
42 },
164 }
43 165
44 _debouncedCalc: function(){
166 _debouncedCalc() {
45 167 // calculate once in a while
46 168 this.debounce('debouncedCalc', this.toastInWindow, 25);
47 },
169 }
48 170
49 conditionalClass: function(){
171 conditionalClass() {
50 172 return this.isFixed ? 'fixed': '';
51 },
173 }
52 174
53 toastInWindow: function() {
175 toastInWindow() {
54 176 if (!this._headerNode){
55 177 return true
56 178 }
@@ -63,28 +185,33 b' Polymer({'
63 185 else{
64 186 this.isFixed = headerHeight <= scrollPosition;
65 187 }
66 },
188 }
67 189
68 attached: function(){
190 connectedCallback() {
191 super.connectedCallback();
69 192 this._headerNode = document.querySelector('.header', document);
70 193 this.listen(window,'scroll', '_debouncedCalc');
71 194 this.listen(window,'resize', '_debouncedCalc');
72 195 this._debouncedCalc();
73 },
74 _changedToasts: function(newValue, oldValue){
196 }
197
198 _changedToasts(newValue, oldValue) {
75 199 $.Topic('/favicon/update').publish({count: this.toasts.length});
76 },
77 dismissNotification: function(e) {
200 }
201
202 dismissNotification(e) {
78 203 $.Topic('/favicon/update').publish({count: this.toasts.length-1});
79 204 var idx = e.target.parentNode.indexPos
80 205 this.splice('toasts', idx, 1);
81 206
82 },
83 dismissNotifications: function(){
207 }
208
209 dismissNotifications() {
84 210 $.Topic('/favicon/update').publish({count: 0});
85 211 this.splice('toasts', 0);
86 },
87 handleNotification: function(data){
212 }
213
214 handleNotification(data) {
88 215 if (!templateContext.rhodecode_user.notification_status && !data.message.force) {
89 216 // do not act if notifications are disabled
90 217 return
@@ -93,6 +220,12 b' Polymer({'
93 220 level: data.message.level,
94 221 message: data.message.message
95 222 });
96 },
97 _gettext: _gettext
98 });
223 }
224
225 _gettext(x){
226 return _gettext(x)
227 }
228
229 }
230
231 customElements.define(RhodecodeToast.is, RhodecodeToast);
@@ -1,16 +1,57 b''
1 Polymer({
2 is: 'rhodecode-toggle',
3 properties: {
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 import '@polymer/paper-toggle-button/paper-toggle-button.js';
3 import '@polymer/paper-spinner/paper-spinner.js';
4 import '@polymer/paper-tooltip/paper-tooltip.js';
5
6 export class RhodecodeToggle extends PolymerElement {
7
8 static get is() {
9 return 'rhodecode-toggle';
10 }
11
12 static get template() {
13 return html`
14 <style include="shared-styles">
15 .rc-toggle {
16 float: left;
17 position: relative;
18 }
19
20 .rc-toggle paper-spinner {
21 position: absolute;
22 top: 0;
23 left: -30px;
24 width: 20px;
25 height: 20px;
26 }
27 </style>
28 <div class="rc-toggle">
29 <paper-toggle-button checked={{checked}}>[[labelStatus(checked)]]
30 </paper-toggle-button>
31 <paper-tooltip>[[tooltipText]]</paper-tooltip>
32 <template is="dom-if" if="[[shouldShow(noSpinner)]]">
33 <paper-spinner active=[[active]]></paper-spinner>
34 </template>
35 </div>
36 `;
37 }
38
39 static get properties() {
40 return {
4 41 noSpinner: { type: Boolean, value: false, reflectToAttribute:true},
5 42 tooltipText: { type: String, value: "Click to toggle", reflectToAttribute:true},
6 43 checked: { type: Boolean, value: false, reflectToAttribute:true},
7 44 active: { type: Boolean, value: false, reflectToAttribute:true, notify:true}
8 },
9 shouldShow: function(){
45 }
46 }
47
48 shouldShow() {
10 49 return !this.noSpinner
11 },
12 labelStatus: function(isActive){
50 }
51
52 labelStatus(isActive) {
13 53 return this.checked? 'Enabled' : "Disabled"
14 54 }
55 }
15 56
16 }); No newline at end of file
57 customElements.define(RhodecodeToggle.is, RhodecodeToggle);
@@ -1,12 +1,30 b''
1 Polymer({
2 is: 'rhodecode-unsafe-html',
3 properties: {
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2
3 export class RhodecodeUnsafeHtml extends PolymerElement {
4
5 static get is() {
6 return 'rhodecode-unsafe-html';
7 }
8
9 static get template() {
10 return html`
11 <style include="shared-styles"></style>
12 <slot></slot>
13 `;
14 }
15
16 static get properties() {
17 return {
4 18 text: {
5 19 type: String,
6 20 observer: '_handleText'
7 21 }
8 },
9 _handleText: function(newVal, oldVal){
22 }
23 }
24
25 _handleText(newVal, oldVal) {
10 26 this.innerHTML = this.text;
11 27 }
12 })
28 }
29
30 customElements.define(RhodecodeUnsafeHtml.is, RhodecodeUnsafeHtml);
@@ -295,24 +295,25 b' function scrollToElement(element, percen'
295 295 });
296 296
297 297 $('body').on('click', '.cb-lineno a', function(event) {
298
299 298 function sortNumber(a,b) {
300 299 return a - b;
301 300 }
302 301
303 302 var lineNo = $(this).data('lineNo');
303 var lineName = $(this).attr('name');
304
304 305 if (lineNo) {
306 var prevLine = $('.cb-line-selected a').data('lineNo');
305 307
306 308 // on shift, we do a range selection, if we got previous line
307 var prevLine = $('.cb-line-selected a').data('lineNo');
308 309 if (event.shiftKey && prevLine !== undefined) {
309 310 var prevLine = parseInt(prevLine);
310 311 var nextLine = parseInt(lineNo);
311 312 var pos = [prevLine, nextLine].sort(sortNumber);
312 313 var anchor = '#L{0}-{1}'.format(pos[0], pos[1]);
313 314
315 // single click
314 316 } else {
315
316 317 var nextLine = parseInt(lineNo);
317 318 var pos = [nextLine, nextLine];
318 319 var anchor = '#L{0}'.format(pos[0]);
@@ -323,11 +324,12 b' function scrollToElement(element, percen'
323 324 for (var i = pos[0]; i <= pos[1]; i++) {
324 325 range.push(i);
325 326 }
326 // clear selection
327 // clear old selected lines
327 328 $('.cb-line-selected').removeClass('cb-line-selected');
328 329
329 330 $.each(range, function (i, lineNo) {
330 331 var line_td = $('td.cb-lineno#L' + lineNo);
332
331 333 if (line_td.length) {
332 334 line_td.addClass('cb-line-selected'); // line number td
333 335 line_td.prev().addClass('cb-line-selected'); // line data
@@ -335,15 +337,20 b' function scrollToElement(element, percen'
335 337 }
336 338 });
337 339
338
339 } else {
340 if ($(this).attr('name') !== undefined) {
341 // clear selection
340 } else if (lineName !== undefined) { // lineName only occurs in diffs
341 // clear old selected lines
342 342 $('td.cb-line-selected').removeClass('cb-line-selected');
343 var aEl = $(this).closest('td');
344 aEl.addClass('cb-line-selected');
345 aEl.next('td').addClass('cb-line-selected');
343 var anchor = '#{0}'.format(lineName);
344 var diffmode = templateContext.session_attrs.diffmode || "sideside";
345
346 if (diffmode === "unified") {
347 $(this).closest('tr').find('td').addClass('cb-line-selected');
348 } else {
349 var activeTd = $(this).closest('td');
350 activeTd.addClass('cb-line-selected');
351 activeTd.next('td').addClass('cb-line-selected');
346 352 }
353
347 354 }
348 355
349 356 // Replace URL without jumping to it if browser supports.
@@ -364,7 +371,6 b' function scrollToElement(element, percen'
364 371
365 372 });
366 373
367
368 374 $('.collapse_file').on('click', function(e) {
369 375 e.stopPropagation();
370 376 if ($(e.target).is('a')) { return; }
@@ -553,3 +559,20 b' var feedLifetimeOptions = function(query'
553 559
554 560 query.callback(data);
555 561 };
562
563
564 var storeUserSessionAttr = function (key, val) {
565
566 var postData = {
567 'key': key,
568 'val': val,
569 'csrf_token': CSRF_TOKEN
570 };
571
572 var success = function(o) {
573 return true
574 };
575
576 ajaxPOST(pyroutes.url('store_user_session_value'), postData, success);
577 return false;
578 };
@@ -142,7 +142,8 b' var CommitsController = function () {'
142 142 })
143 143 };
144 144
145 this.expandCommit = function (node) {
145 this.expandCommit = function (node, reloadGraph) {
146 reloadGraph = reloadGraph || false;
146 147
147 148 var target_expand = $(node);
148 149 var cid = target_expand.data('commitId');
@@ -179,7 +180,10 b' var CommitsController = function () {'
179 180 });
180 181 target_expand.addClass('open');
181 182 }
183
184 if (reloadGraph) {
182 185 // redraw the graph
183 186 self.reloadGraph();
184 187 }
188 }
185 189 };
@@ -774,6 +774,13 b' var CommentsController = function() {'
774 774 // re trigger the linkification of next/prev navigation
775 775 linkifyComments($('.inline-comment-injected'));
776 776 timeagoActivate();
777
778 if (window.updateSticky !== undefined) {
779 // potentially our comments change the active window size, so we
780 // notify sticky elements
781 updateSticky()
782 }
783
777 784 commentForm.setActionButtonsDisabled(false);
778 785
779 786 };
@@ -40,10 +40,10 b' def make_web_build_callback(filename):'
40 40 stdout = ''.join(stdout)
41 41 stderr = ''.join(stderr)
42 42 if stdout:
43 print stdout
43 print(stdout)
44 44 if stderr:
45 45 print ('%s %s %s' % ('-' * 20, 'ERRORS', '-' * 20))
46 print stderr
46 print(stderr)
47 47
48 48
49 49 MAXFD = 1024
@@ -19,15 +19,14 b''
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20 import io
21 21 import re
22 import os
22 23 import datetime
23 24 import logging
24 25 import Queue
25 26 import subprocess32
26 import os
27 27
28 28
29 29 from dateutil.parser import parse
30 from pyramid.i18n import get_localizer
31 30 from pyramid.threadlocal import get_current_request
32 31 from pyramid.interfaces import IRoutesMapper
33 32 from pyramid.settings import asbool
@@ -39,7 +38,6 b' from rhodecode.config.jsroutes import ge'
39 38 from rhodecode.lib import auth
40 39 from rhodecode.lib.base import get_auth_user
41 40
42
43 41 import rhodecode
44 42
45 43
@@ -7,6 +7,8 b''
7 7 (_('Updated on'), h.format_date(c.rhodecode_db_repo.updated_on), '', ''),
8 8 (_('Cached Commit id'), lambda: h.link_to(c.rhodecode_db_repo.changeset_cache.get('short_id'), h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.rhodecode_db_repo.changeset_cache.get('raw_id'))), '', ''),
9 9 (_('Attached scoped tokens'), len(c.rhodecode_db_repo.scoped_tokens), '', [x.user for x in c.rhodecode_db_repo.scoped_tokens]),
10 (_('Pull requests source'), len(c.rhodecode_db_repo.pull_requests_source), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.source_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_source]),
11 (_('Pull requests target'), len(c.rhodecode_db_repo.pull_requests_target), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.target_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_target]),
10 12 ]
11 13 %>
12 14
@@ -96,7 +98,7 b''
96 98 <button class="btn btn-small" type="submit"
97 99 onclick="return confirm('${_('Confirm to lock repository.')}');">
98 100 <i class="icon-lock"></i>
99 ${_('Lock Repository')}
101 ${_('Lock repository')}
100 102 </button>
101 103 %endif
102 104 </div>
@@ -109,6 +111,35 b''
109 111 </div>
110 112 </div>
111 113
114
115 <div class="panel panel-warning">
116 <div class="panel-heading" id="advanced-archive">
117 <h3 class="panel-title">${_('Archive repository')} <a class="permalink" href="#advanced-archive"></a></h3>
118 </div>
119 <div class="panel-body">
120 ${h.secure_form(h.route_path('edit_repo_advanced_archive', repo_name=c.repo_name), request=request)}
121
122 <div style="margin: 0 0 20px 0" class="fake-space"></div>
123
124 <div class="field">
125 <button class="btn btn-small btn-danger" type="submit"
126 onclick="return confirm('${_('Confirm to archive this repository: %s') % c.repo_name}');">
127 <i class="icon-remove-sign"></i>
128 ${_('Archive this repository')}
129 </button>
130 </div>
131 <div class="field">
132 <span class="help-block">
133 ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.'
134 'It is hidden from the search results and dashboard. ')}
135 </span>
136 </div>
137
138 ${h.end_form()}
139 </div>
140 </div>
141
142
112 143 <div class="panel panel-danger">
113 144 <div class="panel-heading" id="advanced-delete">
114 145 <h3 class="panel-title">${_('Delete repository')} <a class="permalink" href="#advanced-delete"></a></h3>
@@ -131,6 +162,18 b''
131 162 %endif
132 163 </td>
133 164 </tr>
165 <% attached_prs = len(c.rhodecode_db_repo.pull_requests_source + c.rhodecode_db_repo.pull_requests_target) %>
166 % if c.rhodecode_db_repo.pull_requests_source or c.rhodecode_db_repo.pull_requests_target:
167 <tr>
168 <td>
169 ${_ungettext('This repository has %s attached pull request.', 'This repository has %s attached pull requests.', attached_prs) % attached_prs}
170 <br/>
171 ${_('Consider to archive this repository instead.')}
172 </td>
173 <td></td>
174 <td></td>
175 </tr>
176 % endif
134 177 </table>
135 178 <div style="margin: 0 0 20px 0" class="fake-space"></div>
136 179
@@ -138,7 +181,7 b''
138 181 <button class="btn btn-small btn-danger" type="submit"
139 182 onclick="return confirm('${_('Confirm to delete this repository: %s') % c.repo_name}');">
140 183 <i class="icon-remove-sign"></i>
141 ${_('Delete This Repository')}
184 ${_('Delete this repository')}
142 185 </button>
143 186 </div>
144 187 <div class="field">
@@ -67,8 +67,11 b''
67 67 <pre>
68 68 region: ${c.region.name}
69 69 backend: ${c.region.actual_backend.__class__}
70 % if c.rhodecode_user.is_admin:
70 71 store: ${c.region.actual_backend.get_store()}
71
72 % else:
73 store: ${c.region.actual_backend.get_store().__class__}
74 % endif
72 75
73 76 % if c.repo_keys:
74 77 ${len(c.repo_keys)} <a href="#showKeys" onclick="$('#show-keys').toggle()">${_('Show all')}</a>
@@ -118,7 +121,11 b' store: ${c.region.actual_backend.get_sto'
118 121 <table class="rctable edit_cache">
119 122 <tr>
120 123 <td>${_('Cached diff name')}:</td>
124 % if c.rhodecode_user.is_admin:
125 <td>${c.rhodecode_db_repo.cached_diffs_dir}</td>
126 % else:
121 127 <td>${c.rhodecode_db_repo.cached_diffs_relative_dir}</td>
128 % endif
122 129 </tr>
123 130 <tr>
124 131 <td>${_('Cached diff files')}:</td>
@@ -6,9 +6,7 b''
6 6 <%
7 7 elems = [
8 8 (_('Email prefix'), c.rhodecode_ini.get('email_prefix'), ''),
9 (_('RhodeCode email from'), c.rhodecode_ini.get('app_email_from'), ''),
10 (_('Error email from'), c.rhodecode_ini.get('error_email_from'), ''),
11 (_('Error email recipients'), c.rhodecode_ini.get('email_to'), ''),
9 (_('Email from'), c.rhodecode_ini.get('app_email_from'), ''),
12 10
13 11 (_('SMTP server'), c.rhodecode_ini.get('smtp_server'), ''),
14 12 (_('SMTP username'), c.rhodecode_ini.get('smtp_username'), ''),
@@ -17,7 +15,7 b''
17 15
18 16 (_('SMTP use TLS'), c.rhodecode_ini.get('smtp_use_tls'), ''),
19 17 (_('SMTP use SSL'), c.rhodecode_ini.get('smtp_use_ssl'), ''),
20 (_('SMTP auth'), c.rhodecode_ini.get('smtp_auth'), ''),
18
21 19 ]
22 20 %>
23 21 <dl class="dl-horizontal settings">
@@ -54,7 +52,3 b''
54 52 ${h.end_form()}
55 53 </div>
56 54 </div>
57
58
59
60
@@ -1,3 +1,11 b''
1 <%def name="show_license(license_data)">
2 % if isinstance(license_data, dict):
3 <a href="${license_data.get('url', "#noUrl")}">${license_data.get('spdxId') or license_data.get('fullName')}</a>
4 % else:
5 ${license_data}
6 % endif
7 </%def>
8
1 9 <div class="panel panel-default">
2 10 <div class="panel-heading">
3 11 <h3 class="panel-title">${_('Licenses of Third Party Packages')}</h3>
@@ -7,21 +15,26 b''
7 15 RhodeCode Enterprise uses various third party packages, many of them
8 16 provided by the open source community.
9 17 </p>
10
11 18 % if c.opensource_licenses:
12 19 <table class="rctable dl-settings">
13 20 <thead>
14 21 <th>Product</th>
15 22 <th>License</th>
16 23 </thead>
17 %for product, licenses in c.opensource_licenses.items():
24 % for lib in c.opensource_licenses:
18 25 <tr>
19 <td>${product}</td>
26 <td>${lib["name"]}</td>
20 27 <td>
21 ${h.literal(', '.join([
22 '<a href="%(link)s" title="%(name)s">%(name)s</a>' % {'link':link, 'name':name}
23 if link else name
24 for name,link in licenses.items()]))}
28 <ol>
29 % if isinstance(lib["license"], list):
30 % for license_data in lib["license"]:
31 <li>${show_license(license_data)}</li>
32 % endfor
33 % else:
34 <% license_data = lib["license"] %>
35 <li>${show_license(license_data)}</li>
36 % endif
37 </ol>
25 38 </td>
26 39 </tr>
27 40 %endfor
@@ -14,6 +14,7 b''
14 14 </div>
15 15 <div class="panel-body" id="app">
16 16 <h3>List of Gunicorn processes on this machine</h3>
17 <p>RhodeCode workers set: ${c.gunicorn_workers}</p>
17 18 <%
18 19 def get_name(proc):
19 20 cmd = ' '.join(proc.cmdline())
@@ -287,6 +287,11 b''
287 287 </div>
288 288 <div class="clear"></div>
289 289 </div>
290 % if c.rhodecode_db_repo.archived:
291 <div class="alert alert-warning text-center">
292 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
293 </div>
294 % endif
290 295 <!--- END CONTEXT BAR -->
291 296
292 297 </%def>
@@ -27,8 +27,9 b" c.template_context['default_user'] = {"
27 27 %>
28 28 <html xmlns="http://www.w3.org/1999/xhtml">
29 29 <head>
30 <script src="${h.asset('js/vendors/webcomponentsjs/webcomponents-lite.js', ver=c.rhodecode_version_hash)}"></script>
31 <link rel="import" href="${h.asset('js/rhodecode-components.html', ver=c.rhodecode_version_hash)}">
30
31 <script src="${h.asset('js/vendors/webcomponentsjs/custom-elements-es5-adapter.js', ver=c.rhodecode_version_hash)}"></script>
32 <script src="${h.asset('js/vendors/webcomponentsjs/webcomponents-bundle.js', ver=c.rhodecode_version_hash)}"></script>
32 33 <title>${self.title()}</title>
33 34 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
34 35
@@ -49,9 +50,6 b" c.template_context['default_user'] = {"
49 50 ## CSS definitions
50 51 <%def name="css()">
51 52 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
52 <!--[if lt IE 9]>
53 <link rel="stylesheet" type="text/css" href="${h.asset('css/ie.css', ver=c.rhodecode_version_hash)}" media="screen"/>
54 <![endif]-->
55 53 ## EXTRA FOR CSS
56 54 ${self.css_extra()}
57 55 </%def>
@@ -101,7 +99,7 b" c.template_context['default_user'] = {"
101 99 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode/routes.js', ver=c.rhodecode_version_hash)}"></script>
102 100 <script> var alertMessagePayloads = ${h.flash.json_alerts(request=request)|n}; </script>
103 101 ## avoide escaping the %N
104 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode-components.js', ver=c.rhodecode_version_hash)}"></script>
102 <script language="javascript" type="text/javascript" src="${h.asset('js/scripts.js', ver=c.rhodecode_version_hash)}"></script>
105 103 <script>CodeMirror.modeURL = "${h.asset('') + 'js/mode/%N/%N.js?ver='+c.rhodecode_version_hash}";</script>
106 104
107 105
@@ -142,16 +140,6 b" c.template_context['default_user'] = {"
142 140 ${_('Please enable JavaScript to use RhodeCode Enterprise')}
143 141 </div>
144 142 </noscript>
145 ## IE hacks
146 <!--[if IE 7]>
147 <script>$(document.body).addClass('ie7')</script>
148 <![endif]-->
149 <!--[if IE 8]>
150 <script>$(document.body).addClass('ie8')</script>
151 <![endif]-->
152 <!--[if IE 9]>
153 <script>$(document.body).addClass('ie9')</script>
154 <![endif]-->
155 143
156 144 ${next.body()}
157 145 %if c.post_code:
@@ -1,7 +1,6 b''
1 1 ## small box that displays changed/added/removed details fetched by AJAX
2 2 <%namespace name="base" file="/base/base.mako"/>
3 3
4
5 4 % if c.prev_page:
6 5 <tr>
7 6 <td colspan="9" class="load-more-commits">
@@ -80,14 +79,12 b''
80 79 % endif
81 80 % endif
82 81 </td>
83 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
84 <div class="show_more_col">
85 <i class="show_more"></i>&nbsp;
86 </div>
82 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this, true); return false">
83 <i class="icon-expand-linked"></i>&nbsp;
87 84 </td>
88 85 <td class="td-description mid">
89 86 <div class="log-container truncate-wrap">
90 <div class="message truncate" id="c-${commit.raw_id}">${urlify_commit_message(commit.message, c.repo_name)}</div>
87 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name)}</div>
91 88 </div>
92 89 </td>
93 90
@@ -150,10 +150,6 b''
150 150 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
151 151 ${_('Download Diff')}
152 152 </a>
153 |
154 ${c.ignorews_url(request)}
155 |
156 ${c.context_url(request)}
157 153 </div>
158 154 </div>
159 155 </div>
@@ -211,7 +207,7 b''
211 207 </div> <!-- end summary -->
212 208 <div class="cs_files">
213 209 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
214 ${cbdiffs.render_diffset_menu()}
210 ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id])}
215 211 ${cbdiffs.render_diffset(
216 212 c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
217 213 </div>
@@ -28,7 +28,7 b''
28 28
29 29 <div class="meta">
30 30 <div class="comment-type-label">
31 <div class="comment-label ${comment.comment_type or 'note'}" id="comment-label-${comment.comment_id}">
31 <div class="comment-label ${comment.comment_type or 'note'}" id="comment-label-${comment.comment_id}" title="line: ${comment.line_no}">
32 32 % if comment.comment_type == 'todo':
33 33 % if comment.resolved:
34 34 <div class="resolved tooltip" title="${_('Resolved by comment #{}').format(comment.resolved.comment_id)}">
@@ -3,9 +3,9 b''
3 3
4 4 <%def name="title()">
5 5 ${_('%s Commits') % c.repo_name} -
6 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}
6 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
7 7 ...
8 r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
8 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
9 9 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
10 10 %if c.rhodecode_name:
11 11 &middot; ${h.branding(c.rhodecode_name)}
@@ -14,9 +14,9 b''
14 14
15 15 <%def name="breadcrumbs_links()">
16 16 ${_('Commits')} -
17 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}
17 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
18 18 ...
19 r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
19 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
20 20 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
21 21 </%def>
22 22
@@ -43,7 +43,7 b''
43 43 <h4>
44 44 ${_('Commit Range')}
45 45 <code>
46 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
46 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
47 47 </code>
48 48 </h4>
49 49 </span>
@@ -54,7 +54,7 b''
54 54 ${_('Diff option')}:
55 55 </div>
56 56 <div class="right-content">
57 <div class="header-buttons">
57 <div class="btn btn-primary">
58 58 <a href="${h.route_path('repo_compare',
59 59 repo_name=c.repo_name,
60 60 source_ref_type='rev',
@@ -68,29 +68,6 b''
68 68 </div>
69 69 </div>
70 70
71 <%doc>
72 ##TODO(marcink): implement this and diff menus
73 <div class="fieldset">
74 <div class="left-label">
75 ${_('Diff options')}:
76 </div>
77 <div class="right-content">
78 <div class="diff-actions">
79 <a href="${h.route_path('repo_commit_raw',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
80 ${_('Raw Diff')}
81 </a>
82 |
83 <a href="${h.route_path('repo_commit_patch',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
84 ${_('Patch Diff')}
85 </a>
86 |
87 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id='?',_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
88 ${_('Download Diff')}
89 </a>
90 </div>
91 </div>
92 </div>
93 </%doc>
94 71 </div> <!-- end summary-detail -->
95 72
96 73 </div> <!-- end summary -->
This diff has been collapsed as it changes many lines, (590 lines changed) Show them Hide them
@@ -1,7 +1,7 b''
1 1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2 2
3 <%def name="diff_line_anchor(filename, line, type)"><%
4 return '%s_%s_%i' % (h.safeid(filename), type, line)
3 <%def name="diff_line_anchor(commit, filename, line, type)"><%
4 return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
5 5 %></%def>
6 6
7 7 <%def name="action_class(action)">
@@ -47,7 +47,7 b" return '%s_%s_%i' % (h.safeid(filename),"
47 47 deleted_files_comments=None,
48 48
49 49 # for cache purpose
50 inline_comments=None
50 inline_comments=None,
51 51
52 52 )">
53 53 %if use_comments:
@@ -83,7 +83,7 b" return '%s_%s_%i' % (h.safeid(filename),"
83 83 collapse_all = len(diffset.files) > collapse_when_files_over
84 84 %>
85 85
86 %if c.diffmode == 'sideside':
86 %if c.user_session_attrs["diffmode"] == 'sideside':
87 87 <style>
88 88 .wrapper {
89 89 max-width: 1600px !important;
@@ -116,19 +116,23 b' collapse_all = len(diffset.files) > coll'
116 116 </div>
117 117 %endif
118 118 <h2 class="clearinner">
119 ## invidual commit
119 120 %if commit:
120 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=commit.raw_id)}">${'r%s:%s' % (commit.revision,h.short_id(commit.raw_id))}</a> -
121 ${h.age_component(commit.date)} -
122 %endif
123
121 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a> -
122 ${h.age_component(commit.date)}
124 123 %if diffset.limited_diff:
125 ${_('The requested commit is too big and content was truncated.')}
126
124 - ${_('The requested commit is too big and content was truncated.')}
127 125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
128 126 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 ## compare diff, has no file-selector and we want to show stats anyway
129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 .format(num=diffset.changed_files, linesadd=diffset.lines_added, linesdel=diffset.lines_deleted)}
132 % endif
129 133 %else:
130 ${_ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted',
131 '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}}
134 ## pull requests/compare
135 ${_('File Changes')}
132 136 %endif
133 137
134 138 </h2>
@@ -141,6 +145,7 b' collapse_all = len(diffset.files) > coll'
141 145 %endif
142 146
143 147 <div class="filediffs">
148
144 149 ## initial value could be marked as False later on
145 150 <% over_lines_changed_limit = False %>
146 151 %for i, filediff in enumerate(diffset.files):
@@ -149,48 +154,45 b' collapse_all = len(diffset.files) > coll'
149 154 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
150 155 over_lines_changed_limit = lines_changed > lines_changed_limit
151 156 %>
152 <input ${collapse_all and 'checked' or ''} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
157 ## anchor with support of sticky header
158 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
159
160 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="updateSticky();">
153 161 <div
154 162 class="filediff"
155 163 data-f-path="${filediff.patch['filename']}"
156 id="a_${h.FID('', filediff.patch['filename'])}">
164 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
165 >
157 166 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
158 167 <div class="filediff-collapse-indicator"></div>
159 168 ${diff_ops(filediff)}
160 169 </label>
170
161 171 ${diff_menu(filediff, use_comments=use_comments)}
162 <table class="cb cb-diff-${c.diffmode} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
172 <table data-f-path="${filediff.patch['filename']}" data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}" class="code-visible-block cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
173
174 ## new/deleted/empty content case
163 175 %if not filediff.hunks:
164 %for op_id, op_text in filediff.patch['stats']['ops'].items():
165 <tr>
166 <td class="cb-text cb-${op_class(op_id)}" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
167 %if op_id == DEL_FILENODE:
168 ${_('File was deleted')}
169 %elif op_id == BIN_FILENODE:
170 ${_('Binary file hidden')}
171 %else:
172 ${op_text}
176 ## Comment container, on "fakes" hunk that contains all data to render comments
177 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
173 178 %endif
174 </td>
175 </tr>
176 %endfor
177 %endif
179
178 180 %if filediff.limited_diff:
179 181 <tr class="cb-warning cb-collapser">
180 <td class="cb-text" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
182 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
181 183 ${_('The requested commit is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
182 184 </td>
183 185 </tr>
184 186 %else:
185 187 %if over_lines_changed_limit:
186 188 <tr class="cb-warning cb-collapser">
187 <td class="cb-text" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
189 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
188 190 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
189 191 <a href="#" class="cb-expand"
190 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
192 onclick="$(this).closest('table').removeClass('cb-collapsed'); updateSticky(); return false;">${_('Show them')}
191 193 </a>
192 194 <a href="#" class="cb-collapse"
193 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
195 onclick="$(this).closest('table').addClass('cb-collapsed'); updateSticky(); return false;">${_('Hide them')}
194 196 </a>
195 197 </td>
196 198 </tr>
@@ -199,34 +201,38 b' collapse_all = len(diffset.files) > coll'
199 201
200 202 %for hunk in filediff.hunks:
201 203 <tr class="cb-hunk">
202 <td ${c.diffmode == 'unified' and 'colspan=3' or ''}>
204 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
203 205 ## TODO: dan: add ajax loading of more context here
204 206 ## <a href="#">
205 207 <i class="icon-more"></i>
206 208 ## </a>
207 209 </td>
208 <td ${c.diffmode == 'sideside' and 'colspan=5' or ''}>
210 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
209 211 @@
210 212 -${hunk.source_start},${hunk.source_length}
211 213 +${hunk.target_start},${hunk.target_length}
212 214 ${hunk.section_header}
213 215 </td>
214 216 </tr>
215 %if c.diffmode == 'unified':
216 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
217 %elif c.diffmode == 'sideside':
218 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
219 %else:
220 <tr class="cb-line">
221 <td>unknown diff mode</td>
217 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
218 % endfor
219
220 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
221
222 ## outdated comments that do not fit into currently displayed lines
223 % for lineno, comments in unmatched_comments.items():
224
225 %if c.user_session_attrs["diffmode"] == 'unified':
226 % if loop.index == 0:
227 <tr class="cb-hunk">
228 <td colspan="3"></td>
229 <td>
230 <div>
231 ${_('Unmatched inline comments below')}
232 </div>
233 </td>
222 234 </tr>
223 235 %endif
224 %endfor
225
226 ## outdated comments that do not fit into currently displayed lines
227 % for lineno, comments in filediff.left_comments.items():
228
229 %if c.diffmode == 'unified':
230 236 <tr class="cb-line">
231 237 <td class="cb-data cb-context"></td>
232 238 <td class="cb-lineno cb-context"></td>
@@ -235,7 +241,23 b' collapse_all = len(diffset.files) > coll'
235 241 ${inline_comments_container(comments, inline_comments)}
236 242 </td>
237 243 </tr>
238 %elif c.diffmode == 'sideside':
244 %elif c.user_session_attrs["diffmode"] == 'sideside':
245 % if loop.index == 0:
246 <tr class="cb-comment-info">
247 <td colspan="2"></td>
248 <td class="cb-line">
249 <div>
250 ${_('Unmatched inline comments below')}
251 </div>
252 </td>
253 <td colspan="2"></td>
254 <td class="cb-line">
255 <div>
256 ${_('Unmatched comments below')}
257 </div>
258 </td>
259 </tr>
260 % endif
239 261 <tr class="cb-line">
240 262 <td class="cb-data cb-context"></td>
241 263 <td class="cb-lineno cb-context"></td>
@@ -270,8 +292,8 b' collapse_all = len(diffset.files) > coll'
270 292 display_state = ''
271 293 %>
272 294 <div class="filediffs filediff-outdated" style="${display_state}">
273 <input ${collapse_all and 'checked' or ''} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox">
274 <div class="filediff" data-f-path="${filename}" id="a_${h.FID('', filename)}">
295 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
296 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
275 297 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
276 298 <div class="filediff-collapse-indicator"></div>
277 299 <span class="pill">
@@ -282,24 +304,24 b' collapse_all = len(diffset.files) > coll'
282 304 ## file op, doesn't need translation
283 305 <span class="pill" op="removed">removed in this version</span>
284 306 </span>
285 <a class="pill filediff-anchor" href="#a_${h.FID('', filename)}"></a>
307 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}"></a>
286 308 <span class="pill-group" style="float: right">
287 309 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
288 310 </span>
289 311 </label>
290 312
291 <table class="cb cb-diff-${c.diffmode} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
313 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
292 314 <tr>
293 % if c.diffmode == 'unified':
315 % if c.user_session_attrs["diffmode"] == 'unified':
294 316 <td></td>
295 317 %endif
296 318
297 319 <td></td>
298 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=5'}>
320 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
299 321 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
300 322 </td>
301 323 </tr>
302 %if c.diffmode == 'unified':
324 %if c.user_session_attrs["diffmode"] == 'unified':
303 325 <tr class="cb-line">
304 326 <td class="cb-data cb-context"></td>
305 327 <td class="cb-lineno cb-context"></td>
@@ -308,7 +330,7 b' collapse_all = len(diffset.files) > coll'
308 330 ${inline_comments_container(comments_dict['comments'], inline_comments)}
309 331 </td>
310 332 </tr>
311 %elif c.diffmode == 'sideside':
333 %elif c.user_session_attrs["diffmode"] == 'sideside':
312 334 <tr class="cb-line">
313 335 <td class="cb-data cb-context"></td>
314 336 <td class="cb-lineno cb-context"></td>
@@ -364,19 +386,16 b' from rhodecode.lib.diffs import NEW_FILE'
364 386 %endif
365 387 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
366 388 </span>
367 <span class="pill-group" style="float: left">
389 ## anchor link
390 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></a>
391
392 <span class="pill-group" style="float: right">
393
394 ## ops pills
368 395 %if filediff.limited_diff:
369 396 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
370 397 %endif
371 398
372 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
373 <span class="pill" op="renamed">renamed</span>
374 %endif
375
376 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
377 <span class="pill" op="copied">copied</span>
378 %endif
379
380 399 %if NEW_FILENODE in filediff.patch['stats']['ops']:
381 400 <span class="pill" op="created">created</span>
382 401 %if filediff['target_mode'].startswith('120'):
@@ -386,6 +405,14 b' from rhodecode.lib.diffs import NEW_FILE'
386 405 %endif
387 406 %endif
388 407
408 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
409 <span class="pill" op="renamed">renamed</span>
410 %endif
411
412 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
413 <span class="pill" op="copied">copied</span>
414 %endif
415
389 416 %if DEL_FILENODE in filediff.patch['stats']['ops']:
390 417 <span class="pill" op="removed">removed</span>
391 418 %endif
@@ -395,38 +422,35 b' from rhodecode.lib.diffs import NEW_FILE'
395 422 ${nice_mode(filediff['source_mode'])}${nice_mode(filediff['target_mode'])}
396 423 </span>
397 424 %endif
398 </span>
399 425
400 <a class="pill filediff-anchor" href="#a_${h.FID('', filediff.patch['filename'])}"></a>
401
402 <span class="pill-group" style="float: right">
403 426 %if BIN_FILENODE in filediff.patch['stats']['ops']:
404 427 <span class="pill" op="binary">binary</span>
405 428 %if MOD_FILENODE in filediff.patch['stats']['ops']:
406 429 <span class="pill" op="modified">modified</span>
407 430 %endif
408 431 %endif
409 %if filediff.patch['stats']['added']:
410 <span class="pill" op="added">+${filediff.patch['stats']['added']}</span>
411 %endif
412 %if filediff.patch['stats']['deleted']:
413 <span class="pill" op="deleted">-${filediff.patch['stats']['deleted']}</span>
414 %endif
432
433 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
434 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
435
415 436 </span>
416 437
417 438 </%def>
418 439
419 440 <%def name="nice_mode(filemode)">
420 ${filemode.startswith('100') and filemode[3:] or filemode}
441 ${(filemode.startswith('100') and filemode[3:] or filemode)}
421 442 </%def>
422 443
423 444 <%def name="diff_menu(filediff, use_comments=False)">
424 445 <div class="filediff-menu">
446
425 447 %if filediff.diffset.source_ref:
448
449 ## FILE BEFORE CHANGES
426 450 %if filediff.operation in ['D', 'M']:
427 451 <a
428 452 class="tooltip"
429 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
453 href="${h.route_path('repo_files',repo_name=filediff.diffset.target_repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
430 454 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
431 455 >
432 456 ${_('Show file before')}
@@ -434,11 +458,13 b' from rhodecode.lib.diffs import NEW_FILE'
434 458 %else:
435 459 <span
436 460 class="tooltip"
437 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
461 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
438 462 >
439 463 ${_('Show file before')}
440 464 </span> |
441 465 %endif
466
467 ## FILE AFTER CHANGES
442 468 %if filediff.operation in ['A', 'M']:
443 469 <a
444 470 class="tooltip"
@@ -446,47 +472,25 b' from rhodecode.lib.diffs import NEW_FILE'
446 472 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
447 473 >
448 474 ${_('Show file after')}
449 </a> |
475 </a>
450 476 %else:
451 477 <span
452 478 class="tooltip"
453 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
479 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
454 480 >
455 481 ${_('Show file after')}
456 </span> |
457 %endif
458 <a
459 class="tooltip"
460 title="${h.tooltip(_('Raw diff'))}"
461 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='raw'))}"
462 >
463 ${_('Raw diff')}
464 </a> |
465 <a
466 class="tooltip"
467 title="${h.tooltip(_('Download diff'))}"
468 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='download'))}"
469 >
470 ${_('Download diff')}
471 </a>
472 % if use_comments:
473 |
474 % endif
475
476 ## TODO: dan: refactor ignorews_url and context_url into the diff renderer same as diffmode=unified/sideside. Also use ajax to load more context (by clicking hunks)
477 %if hasattr(c, 'ignorews_url'):
478 ${c.ignorews_url(request, h.FID('', filediff.patch['filename']))}
479 %endif
480 %if hasattr(c, 'context_url'):
481 ${c.context_url(request, h.FID('', filediff.patch['filename']))}
482 </span>
482 483 %endif
483 484
484 485 %if use_comments:
486 |
485 487 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
486 488 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
487 489 </a>
488 490 %endif
491
489 492 %endif
493
490 494 </div>
491 495 </%def>
492 496
@@ -512,29 +516,31 b' from rhodecode.lib.diffs import NEW_FILE'
512 516 </%def>
513 517
514 518 <%!
515 def get_comments_for(comments, filename, line_version, line_number):
519 def get_comments_for(diff_type, comments, filename, line_version, line_number):
516 520 if hasattr(filename, 'unicode_path'):
517 521 filename = filename.unicode_path
518 522
519 523 if not isinstance(filename, basestring):
520 524 return None
521 525
522 line_key = '{}{}'.format(line_version, line_number)
526 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
527
523 528 if comments and filename in comments:
524 529 file_comments = comments[filename]
525 530 if line_key in file_comments:
526 return file_comments[line_key]
531 data = file_comments.pop(line_key)
532 return data
527 533 %>
528 534
529 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
530
535 <%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None)">
531 536 %for i, line in enumerate(hunk.sideside):
532 537 <%
533 538 old_line_anchor, new_line_anchor = None, None
539
534 540 if line.original.lineno:
535 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
541 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
536 542 if line.modified.lineno:
537 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
543 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
538 544 %>
539 545
540 546 <tr class="cb-line">
@@ -542,16 +548,17 b' def get_comments_for(comments, filename,'
542 548 data-line-no="${line.original.lineno}"
543 549 >
544 550 <div>
545 <% loc = None %>
551
552 <% line_old_comments = None %>
546 553 %if line.original.get_comment_args:
547 <% loc = get_comments_for(inline_comments, *line.original.get_comment_args) %>
554 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
548 555 %endif
549 %if loc:
550 <% has_outdated = any([x.outdated for x in loc]) %>
556 %if line_old_comments:
557 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
551 558 % if has_outdated:
552 <i title="${_('comments including outdated')}:${len(loc)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
559 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
553 560 % else:
554 <i title="${_('comments')}: ${len(loc)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
561 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
555 562 % endif
556 563 %endif
557 564 </div>
@@ -572,10 +579,10 b' def get_comments_for(comments, filename,'
572 579 %if use_comments and line.original.lineno:
573 580 ${render_add_comment_button()}
574 581 %endif
575 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
582 <span class="cb-code"><span class="cb-action ${action_class(line.original.action)}"></span>${line.original.content or '' | n}</span>
576 583
577 %if use_comments and line.original.lineno and loc:
578 ${inline_comments_container(loc, inline_comments)}
584 %if use_comments and line.original.lineno and line_old_comments:
585 ${inline_comments_container(line_old_comments, inline_comments)}
579 586 %endif
580 587
581 588 </td>
@@ -585,16 +592,16 b' def get_comments_for(comments, filename,'
585 592 <div>
586 593
587 594 %if line.modified.get_comment_args:
588 <% lmc = get_comments_for(inline_comments, *line.modified.get_comment_args) %>
595 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
589 596 %else:
590 <% lmc = None%>
597 <% line_new_comments = None%>
591 598 %endif
592 %if lmc:
593 <% has_outdated = any([x.outdated for x in lmc]) %>
599 %if line_new_comments:
600 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
594 601 % if has_outdated:
595 <i title="${_('comments including outdated')}:${len(lmc)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
602 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
596 603 % else:
597 <i title="${_('comments')}: ${len(lmc)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
604 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
598 605 % endif
599 606 %endif
600 607 </div>
@@ -615,9 +622,9 b' def get_comments_for(comments, filename,'
615 622 %if use_comments and line.modified.lineno:
616 623 ${render_add_comment_button()}
617 624 %endif
618 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
619 %if use_comments and line.modified.lineno and lmc:
620 ${inline_comments_container(lmc, inline_comments)}
625 <span class="cb-code"><span class="cb-action ${action_class(line.modified.action)}"></span>${line.modified.content or '' | n}</span>
626 %if use_comments and line.modified.lineno and line_new_comments:
627 ${inline_comments_container(line_new_comments, inline_comments)}
621 628 %endif
622 629 </td>
623 630 </tr>
@@ -625,21 +632,22 b' def get_comments_for(comments, filename,'
625 632 </%def>
626 633
627 634
628 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
635 <%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None)">
629 636 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
637
630 638 <%
631 639 old_line_anchor, new_line_anchor = None, None
632 640 if old_line_no:
633 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
641 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
634 642 if new_line_no:
635 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
643 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
636 644 %>
637 645 <tr class="cb-line">
638 646 <td class="cb-data ${action_class(action)}">
639 647 <div>
640 648
641 649 %if comments_args:
642 <% comments = get_comments_for(inline_comments, *comments_args) %>
650 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
643 651 %else:
644 652 <% comments = None%>
645 653 %endif
@@ -675,12 +683,12 b' def get_comments_for(comments, filename,'
675 683 %endif
676 684 </td>
677 685 <td class="cb-content ${action_class(action)}"
678 data-line-no="${new_line_no and 'n' or 'o'}${new_line_no or old_line_no}"
686 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
679 687 >
680 688 %if use_comments:
681 689 ${render_add_comment_button()}
682 690 %endif
683 <span class="cb-code">${action} ${content or '' | n}</span>
691 <span class="cb-code"><span class="cb-action ${action_class(action)}"></span> ${content or '' | n}</span>
684 692 %if use_comments and comments:
685 693 ${inline_comments_container(comments, inline_comments)}
686 694 %endif
@@ -689,47 +697,327 b' def get_comments_for(comments, filename,'
689 697 %endfor
690 698 </%def>
691 699
700
701 <%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments)">
702 % if diff_mode == 'unified':
703 ${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
704 % elif diff_mode == 'sideside':
705 ${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
706 % else:
707 <tr class="cb-line">
708 <td>unknown diff mode</td>
709 </tr>
710 % endif
711 </%def>file changes
712
713
692 714 <%def name="render_add_comment_button()">
693 715 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
694 716 <span><i class="icon-comment"></i></span>
695 717 </button>
696 718 </%def>
697 719
698 <%def name="render_diffset_menu()">
720 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
699 721
700 <div class="diffset-menu clearinner">
722 <div id="diff-file-sticky" class="diffset-menu clearinner">
723 ## auto adjustable
724 <div class="sidebar__inner">
725 <div class="sidebar__bar">
701 726 <div class="pull-right">
702 727 <div class="btn-group">
703 728
729 ## DIFF OPTIONS via Select2
730 <div class="pull-left">
731 ${h.hidden('diff_menu')}
732 </div>
733
704 734 <a
705 class="btn ${c.diffmode == 'sideside' and 'btn-primary'} tooltip"
735 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
706 736 title="${h.tooltip(_('View side by side'))}"
707 737 href="${h.current_route_path(request, diffmode='sideside')}">
708 738 <span>${_('Side by Side')}</span>
709 739 </a>
740
710 741 <a
711 class="btn ${c.diffmode == 'unified' and 'btn-primary'} tooltip"
742 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
712 743 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
713 744 <span>${_('Unified')}</span>
714 745 </a>
746
747 % if range_diff_on is True:
748 <a
749 title="${_('Turn off: Show the diff as commit range')}"
750 class="btn btn-primary"
751 href="${h.current_route_path(request, **{"range-diff":"0"})}">
752 <span>${_('Range Diff')}</span>
753 </a>
754 % elif range_diff_on is False:
755 <a
756 title="${_('Show the diff as commit range')}"
757 class="btn"
758 href="${h.current_route_path(request, **{"range-diff":"1"})}">
759 <span>${_('Range Diff')}</span>
760 </a>
761 % endif
715 762 </div>
716 763 </div>
717
718 764 <div class="pull-left">
719 765 <div class="btn-group">
766 <div class="pull-left">
767 ${h.hidden('file_filter')}
768 </div>
769 <a
770 class="btn"
771 href="#"
772 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); updateSticky(); return false">${_('Expand All Files')}</a>
720 773 <a
721 774 class="btn"
722 775 href="#"
723 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); return false">${_('Expand All Files')}</a>
724 <a
725 class="btn"
726 href="#"
727 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); return false">${_('Collapse All Files')}</a>
728 <a
729 class="btn"
730 href="#"
731 onclick="return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
776 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); updateSticky(); return false">${_('Collapse All Files')}</a>
732 777 </div>
733 778 </div>
734 779 </div>
780 <div class="fpath-placeholder">
781 <i class="icon-file-text"></i>
782 <strong class="fpath-placeholder-text">
783 Context file:
784 </strong>
785 </div>
786 <div class="sidebar_inner_shadow"></div>
787 </div>
788 </div>
789
790 % if diffset:
791
792 %if diffset.limited_diff:
793 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
794 %else:
795 <% file_placeholder = _ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}%>
796 %endif
797 ## case on range-diff placeholder needs to be updated
798 % if range_diff_on is True:
799 <% file_placeholder = _('Disabled on range diff') %>
800 % endif
801
802 <script>
803
804 var feedFilesOptions = function (query, initialData) {
805 var data = {results: []};
806 var isQuery = typeof query.term !== 'undefined';
807
808 var section = _gettext('Changed files');
809 var filteredData = [];
810
811 //filter results
812 $.each(initialData.results, function (idx, value) {
813
814 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
815 filteredData.push({
816 'id': this.id,
817 'text': this.text,
818 "ops": this.ops,
819 })
820 }
821
822 });
823
824 data.results = filteredData;
825
826 query.callback(data);
827 };
828
829 var formatFileResult = function(result, container, query, escapeMarkup) {
830 return function(data, escapeMarkup) {
831 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
832 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
833 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
834 '<span class="pill" op="added">{0}</span>' +
835 '<span class="pill" op="deleted">{1}</span>' +
836 '</span>'
837 ;
838 var added = data['ops']['added'];
839 if (added === 0) {
840 // don't show +0
841 added = 0;
842 } else {
843 added = '+' + added;
844 }
845
846 var deleted = -1*data['ops']['deleted'];
847
848 tmpl += pill.format(added, deleted);
849 return container.format(tmpl);
850
851 }(result, escapeMarkup);
852 };
853
854 var preloadFileFilterData = {
855 results: [
856 % for filediff in diffset.files:
857 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
858 text:"${filediff.patch['filename']}",
859 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
860 % endfor
861 ]
862 };
863
864 $(document).ready(function () {
865
866 var fileFilter = $("#file_filter").select2({
867 'dropdownAutoWidth': true,
868 'width': 'auto',
869 'placeholder': "${file_placeholder}",
870 containerCssClass: "drop-menu",
871 dropdownCssClass: "drop-menu-dropdown",
872 data: preloadFileFilterData,
873 query: function(query) {
874 feedFilesOptions(query, preloadFileFilterData);
875 },
876 formatResult: formatFileResult
877 });
878
879 % if range_diff_on is True:
880 fileFilter.select2("enable", false);
881 % endif
882
883 $("#file_filter").on('click', function (e) {
884 e.preventDefault();
885 var selected = $('#file_filter').select2('data');
886 var idSelector = "#"+selected.id;
887 window.location.hash = idSelector;
888 // expand the container if we quick-select the field
889 $(idSelector).next().prop('checked', false);
890 updateSticky()
891 });
892
893 var contextPrefix = _gettext('Context file: ');
894 ## sticky sidebar
895 var sidebarElement = document.getElementById('diff-file-sticky');
896 sidebar = new StickySidebar(sidebarElement, {
897 topSpacing: 0,
898 bottomSpacing: 0,
899 innerWrapperSelector: '.sidebar__inner'
900 });
901 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
902 // reset our file so it's not holding new value
903 $('.fpath-placeholder-text').html(contextPrefix)
904 });
905
906 updateSticky = function () {
907 sidebar.updateSticky();
908 Waypoint.refreshAll();
909 };
910
911 var animateText = $.debounce(100, function(fPath, anchorId) {
912 // animate setting the text
913 var callback = function () {
914 $('.fpath-placeholder-text').animate({'opacity': 1.00}, 200)
915 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
916 };
917 $('.fpath-placeholder-text').animate({'opacity': 0.15}, 200, callback);
918 });
919
920 ## dynamic file waypoints
921 var setFPathInfo = function(fPath, anchorId){
922 animateText(fPath, anchorId)
923 };
924
925 var codeBlock = $('.filediff');
926 // forward waypoint
927 codeBlock.waypoint(
928 function(direction) {
929 if (direction === "down"){
930 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
931 }
932 }, {
933 offset: 70,
934 context: '.fpath-placeholder'
935 }
936 );
937
938 // backward waypoint
939 codeBlock.waypoint(
940 function(direction) {
941 if (direction === "up"){
942 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
943 }
944 }, {
945 offset: function () {
946 return -this.element.clientHeight + 90
947 },
948 context: '.fpath-placeholder'
949 }
950 );
951
952 var preloadDiffMenuData = {
953 results: [
954 ## Wide diff mode
955 {
956 id: 1,
957 text: _gettext('Toggle Wide Mode diff'),
958 action: function () {
959 updateSticky();
960 Rhodecode.comments.toggleWideMode(this);
961 return null;
962 },
963 url: null,
964 },
965
966 ## Whitespace change
967 % if request.GET.get('ignorews', '') == '1':
968 {
969 id: 2,
970 text: _gettext('Show whitespace changes'),
971 action: function () {},
972 url: "${h.current_route_path(request, ignorews=0)|n}"
973 },
974 % else:
975 {
976 id: 2,
977 text: _gettext('Hide whitespace changes'),
978 action: function () {},
979 url: "${h.current_route_path(request, ignorews=1)|n}"
980 },
981 % endif
982
983 ## FULL CONTEXT
984 % if request.GET.get('fullcontext', '') == '1':
985 {
986 id: 3,
987 text: _gettext('Hide full context diff'),
988 action: function () {},
989 url: "${h.current_route_path(request, fullcontext=0)|n}"
990 },
991 % else:
992 {
993 id: 3,
994 text: _gettext('Show full context diff'),
995 action: function () {},
996 url: "${h.current_route_path(request, fullcontext=1)|n}"
997 },
998 % endif
999
1000 ]
1001 };
1002
1003 $("#diff_menu").select2({
1004 minimumResultsForSearch: -1,
1005 containerCssClass: "drop-menu",
1006 dropdownCssClass: "drop-menu-dropdown",
1007 dropdownAutoWidth: true,
1008 data: preloadDiffMenuData,
1009 placeholder: "${_('Diff Options')}",
1010 });
1011 $("#diff_menu").on('select2-selecting', function (e) {
1012 e.choice.action();
1013 if (e.choice.url !== null) {
1014 window.location = e.choice.url
1015 }
1016 });
1017
1018 });
1019
1020 </script>
1021 % endif
1022
735 1023 </%def>
@@ -9,7 +9,7 b''
9 9 %>
10 10 <tr class="cb-line cb-line-fresh ${'cb-annotate' if show_annotation else ''}"
11 11 %if annotation:
12 data-revision="${annotation.revision}"
12 data-revision="${annotation.idx}"
13 13 %endif
14 14 >
15 15
@@ -28,11 +28,11 b''
28 28 </td>
29 29 <td
30 30 class="cb-annotate-revision"
31 data-revision="${annotation.revision}"
32 onclick="$('[data-revision=${annotation.revision}]').toggleClass('cb-line-fresh')"
31 data-revision="${annotation.idx}"
32 onclick="$('[data-revision=${annotation.idx}]').toggleClass('cb-line-fresh')"
33 33 style="background: ${bgcolor}">
34 34 <a class="cb-annotate" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=annotation.raw_id)}">
35 r${annotation.revision}
35 r${annotation.idx}
36 36 </a>
37 37 </td>
38 38 % else:
@@ -40,8 +40,8 b''
40 40 <td class="cb-annotate-message-spacer"></td>
41 41 <td
42 42 class="cb-annotate-revision"
43 data-revision="${annotation.revision}"
44 onclick="$('[data-revision=${annotation.revision}]').toggleClass('cb-line-fresh')"
43 data-revision="${annotation.idx}"
44 onclick="$('[data-revision=${annotation.idx}]').toggleClass('cb-line-fresh')"
45 45 style="background: ${bgcolor}">
46 46 </td>
47 47 % endif
@@ -40,28 +40,17 b''
40 40 <td class="td-hash">
41 41 <code>
42 42 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
43 r${commit.revision}:${h.short_id(commit.raw_id)}
43 r${commit.idx}:${h.short_id(commit.raw_id)}
44 44 </a>
45 45 ${h.hidden('revisions',commit.raw_id)}
46 46 </code>
47 47 </td>
48 <td class="expand_commit"
49 data-commit-id="${commit.raw_id}"
50 title="${_( 'Expand commit message')}"
51 >
52 <div class="show_more_col">
53 <i class="show_more"></i>
54 </div>
48 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
49 <i class="icon-expand-linked"></i>
55 50 </td>
56 51 <td class="mid td-description">
57 52 <div class="log-container truncate-wrap">
58 <div
59 id="c-${commit.raw_id}"
60 class="message truncate"
61 data-message-raw="${commit.message}"
62 >
63 ${urlify_commit_message(commit.message, c.repo_name)}
64 </div>
53 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name)}</div>
65 54 </div>
66 55 </td>
67 56 </tr>
@@ -85,31 +74,7 b''
85 74 </div>
86 75
87 76 <script>
88 $('.expand_commit').on('click',function(e){
89 var target_expand = $(this);
90 var cid = target_expand.data('commitId');
91
92 // ## TODO: dan: extract styles into css, and just toggleClass('open') here
93 if (target_expand.hasClass('open')){
94 $('#c-'+cid).css({
95 'height': '1.5em',
96 'white-space': 'nowrap',
97 'text-overflow': 'ellipsis',
98 'overflow':'hidden'
99 });
100 target_expand.removeClass('open');
101 }
102 else {
103 $('#c-'+cid).css({
104 'height': 'auto',
105 'white-space': 'pre-line',
106 'text-overflow': 'initial',
107 'overflow':'visible'
108 });
109 target_expand.addClass('open');
110 }
111 });
112
77 commitsController = new CommitsController();
113 78 $('.compare_select').on('click',function(e){
114 79 var cid = $(this).attr('commit_id');
115 80 $('#row-'+cid).toggleClass('hl', !$('#row-'+cid).hasClass('hl'));
@@ -48,7 +48,7 b''
48 48
49 49 % if c.commit_ranges:
50 50 <code>
51 r${c.source_commit.revision}:${h.short_id(c.source_commit.raw_id)}...r${c.target_commit.revision}:${h.short_id(c.target_commit.raw_id)}
51 r${c.source_commit.idx}:${h.short_id(c.source_commit.raw_id)}...r${c.target_commit.idx}:${h.short_id(c.target_commit.raw_id)}
52 52 </code>
53 53 % endif
54 54 </h4>
@@ -129,30 +129,6 b''
129 129 </div>
130 130 </div>
131 131
132 <%doc>
133 ##TODO(marcink): implement this and diff menus
134 <div class="fieldset">
135 <div class="left-label">
136 ${_('Diff options')}:
137 </div>
138 <div class="right-content">
139 <div class="diff-actions">
140 <a href="${h.route_path('repo_commit_raw',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
141 ${_('Raw Diff')}
142 </a>
143 |
144 <a href="${h.route_path('repo_commit_patch',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
145 ${_('Patch Diff')}
146 </a>
147 |
148 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id='?',_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
149 ${_('Download Diff')}
150 </a>
151 </div>
152 </div>
153 </div>
154 </%doc>
155
156 132 ## commit status form
157 133 <div class="fieldset" id="compare_changeset_status" style="display: none; margin-bottom: -80px;">
158 134 <div class="left-label">
@@ -322,7 +298,7 b''
322 298 <div style="padding:0 10px 10px 0px" class="pull-left"></div>
323 299 ## commit compare generated below
324 300 <%include file="compare_commits.mako"/>
325 ${cbdiffs.render_diffset_menu()}
301 ${cbdiffs.render_diffset_menu(c.diffset)}
326 302 ${cbdiffs.render_diffset(c.diffset)}
327 303 </div>
328 304 % endif
@@ -330,4 +306,4 b''
330 306 </div>
331 307 </div>
332 308
333 </%def> No newline at end of file
309 </%def>
@@ -66,7 +66,7 b''
66 66 </div>
67 67 </%def>
68 68
69 <%def name="repo_name(name,rtype,rstate,private,fork_of,short_name=False,admin=False)">
69 <%def name="repo_name(name,rtype,rstate,private,archived,fork_of,short_name=False,admin=False)">
70 70 <%
71 71 def get_name(name,short_name=short_name):
72 72 if short_name:
@@ -105,6 +105,7 b''
105 105 (${_('creating...')})
106 106 </span>
107 107 %endif
108
108 109 </div>
109 110 </%def>
110 111
@@ -25,6 +25,13 b''
25 25 <span style="font-weight:bold;font-size:12px;padding:.2em;${color_scheme.get(tag_type, color_scheme['default'])}">${text}</span>
26 26 </%def>
27 27
28 ## Constants
29 <%
30 text_regular = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;"
31 text_monospace = "'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;"
32
33 %>
34
28 35 ## headers we additionally can set for email
29 36 <%def name="headers()" filter="n,trim"></%def>
30 37
@@ -47,7 +54,7 b''
47 54 <style type="text/css">
48 55 /* Based on The MailChimp Reset INLINE: Yes. */
49 56 #outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
50 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
57 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0; font-family: ${text_regular|n}}
51 58 /* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
52 59 .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
53 60 .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
@@ -124,8 +131,12 b''
124 131 </tr>
125 132 </table>
126 133 <!-- End of wrapper table -->
127 <p><a style="margin-top:15px;margin-left:1%;font-family:sans-serif;font-weight:100;font-size:11px;color:#666666;text-decoration:none;" href="${instance_url}">
134
135 <div style="clear: both"></div>
136 <p>
137 <a style="margin-top:15px;margin-left:1%;font-weight:100;font-size:11px;color:#666666;text-decoration:none;font-family:${text_monospace} " href="${instance_url}">
128 138 ${self.plaintext_footer()}
129 </a></p>
139 </a>
140 </p>
130 141 </body>
131 142 </html>
@@ -18,12 +18,12 b' data = {'
18 18 ${_('[mention]') if mention else ''} \
19 19
20 20 % if comment_file:
21 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s` (file: `%(comment_file)s`)') % data} ${_('in the %(repo_name)s repository') % data |n}
21 ${_('{user} left a {comment_type} on file `{comment_file}` in commit `{commit_id}`').format(**data)} ${_('in the {repo_name} repository').format(**data) |n}
22 22 % else:
23 23 % if status_change:
24 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s` (status: %(status)s)') % data |n} ${_('in the %(repo_name)s repository') % data |n}
24 ${_('[status: {status}] {user} left a {comment_type} on commit `{commit_id}`').format(**data) |n} ${_('in the {repo_name} repository').format(**data) |n}
25 25 % else:
26 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s`') % data |n} ${_('in the %(repo_name)s repository') % data |n}
26 ${_('{user} left a {comment_type} on commit `{commit_id}`').format(**data) |n} ${_('in the {repo_name} repository').format(**data) |n}
27 27 % endif
28 28 % endif
29 29
@@ -49,7 +49,7 b' data = {'
49 49 * ${_('Commit')}: ${h.show_id(commit)}
50 50
51 51 %if comment_file:
52 * ${_('File: %(comment_file)s on line %(comment_line)s') % data}
52 * ${_('File: {comment_file} on line {comment_line}').format(**data)}
53 53 %endif
54 54
55 55 ---
@@ -79,9 +79,9 b' data = {'
79 79 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
80 80
81 81 % if comment_file:
82 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)') % data}</a> ${_('in the %(repo)s repository') % data |n}</h4>
82 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on file `{comment_file}` in commit `{commit_id}`').format(**data)}</a> ${_('in the {repo} repository').format(**data) |n}</h4>
83 83 % else:
84 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on commit `%(commit_id)s`') % data |n}</a> ${_('in the %(repo)s repository') % data |n}</h4>
84 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on commit `{commit_id}`').format(**data) |n}</a> ${_('in the {repo} repository').format(**data) |n}</h4>
85 85 % endif
86 86 </td></tr>
87 87
@@ -89,16 +89,19 b' data = {'
89 89 <tr><td style="padding-right:20px;">${_('Description')}</td><td style="white-space:pre-wrap">${h.urlify_commit_message(commit.message, repo_name)}</td></tr>
90 90
91 91 % if status_change:
92 <tr><td style="padding-right:20px;">${_('Status')}</td>
93 <td>${_('The commit status was changed to')}: ${base.status_text(status_change, tag_type=status_change_type)}</td>
92 <tr>
93 <td style="padding-right:20px;">${_('Status')}</td>
94 <td>
95 ${_('The commit status was changed to')}: ${base.status_text(status_change, tag_type=status_change_type)}
96 </td>
94 97 </tr>
95 98 % endif
96 99 <tr>
97 100 <td style="padding-right:20px;">
98 101 % if comment_type == 'todo':
99 ${(_('TODO comment on line: %(comment_line)s') if comment_file else _('TODO comment')) % data}
102 ${(_('TODO comment on line: {comment_line}') if comment_file else _('TODO comment')).format(**data)}
100 103 % else:
101 ${(_('Note comment on line: %(comment_line)s') if comment_file else _('Note comment')) % data}
104 ${(_('Note comment on line: {comment_line}') if comment_file else _('Note comment')).format(**data)}
102 105 % endif
103 106 </td>
104 107 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td></tr>
@@ -16,15 +16,15 b' data = {'
16 16 }
17 17 %>
18 18
19 ${_('[mention]') if mention else ''} \
19 ${(_('[mention]') if mention else '')} \
20 20
21 21 % if comment_file:
22 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s" (file: `%(comment_file)s`)') % data |n}
22 ${_('{user} left a {comment_type} on file `{comment_file}` in pull request #{pr_id} "{pr_title}"').format(**data) |n}
23 23 % else:
24 24 % if status_change:
25 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s" (status: %(status)s)') % data |n}
25 ${_('[status: {status}] {user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}
26 26 % else:
27 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s"') % data |n}
27 ${_('{user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}
28 28 % endif
29 29 % endif
30 30 </%def>
@@ -49,15 +49,15 b' data = {'
49 49 * ${_('Source repository')}: ${pr_source_repo_url}
50 50
51 51 %if comment_file:
52 * ${_('File: %(comment_file)s on line %(comment_line)s') % {'comment_file': comment_file, 'comment_line': comment_line}}
52 * ${_('File: {comment_file} on line {comment_line}').format(comment_file=comment_file, comment_line=comment_line)}
53 53 %endif
54 54
55 55 ---
56 56
57 57 %if status_change and not closing_pr:
58 ${_('%(user)s submitted pull request #%(pr_id)s status: *%(status)s*') % data}
58 ${_('{user} submitted pull request #{pr_id} status: *{status}*').format(**data)}
59 59 %elif status_change and closing_pr:
60 ${_('%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*') % data}
60 ${_('{user} submitted pull request #{pr_id} status: *{status} and closed*').format(**data)}
61 61 %endif
62 62
63 63 ${comment_body|n}
@@ -81,9 +81,9 b' data = {'
81 81 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
82 82
83 83 % if comment_file:
84 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on pull request #%(pr_id)s "%(pr_title)s" (file:`%(comment_file)s`)') % data |n}</a></h4>
84 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on file `{comment_file}` in pull request #{pr_id} "{pr_title}"').format(**data) |n}</a></h4>
85 85 % else:
86 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on pull request #%(pr_id)s "%(pr_title)s"') % data |n}</a></h4>
86 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}</a></h4>
87 87 % endif
88 88
89 89 </td></tr>
@@ -104,9 +104,9 b' data = {'
104 104 <tr>
105 105 <td style="padding-right:20px;">
106 106 % if comment_type == 'todo':
107 ${(_('TODO comment on line: %(comment_line)s') if comment_file else _('TODO comment')) % data}
107 ${(_('TODO comment on line: {comment_line}') if comment_file else _('TODO comment')).format(**data)}
108 108 % else:
109 ${(_('Note comment on line: %(comment_line)s') if comment_file else _('Note comment')) % data}
109 ${(_('Note comment on line: {comment_line}') if comment_file else _('Note comment')).format(**data)}
110 110 % endif
111 111 </td>
112 112 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td>
@@ -13,9 +13,6 b''
13 13 %endif
14 14
15 15 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
16 <!--[if IE]>
17 <link rel="stylesheet" type="text/css" href="${h.asset('css/ie.css')}" media="screen"/>
18 <![endif]-->
19 16 <style>body { background:#eeeeee; }</style>
20 17 <script type="text/javascript">
21 18 // register templateContext to pass template variables to JS
@@ -8,7 +8,7 b''
8 8 <div class="info_box_elem previous">
9 9 <a id="prev_commit_link" data-commit-id="${c.prev_commit.raw_id}" class="pjax-link ${'disabled' if c.url_prev == '#' else ''}" href="${c.url_prev}" title="${_('Previous commit')}"><i class="icon-left"></i></a>
10 10 </div>
11 <div class="info_box_elem">${h.text('at_rev',value=c.commit.revision)}</div>
11 <div class="info_box_elem">${h.text('at_rev',value=c.commit.idx)}</div>
12 12 <div class="info_box_elem next">
13 13 <a id="next_commit_link" data-commit-id="${c.next_commit.raw_id}" class="pjax-link ${'disabled' if c.url_next == '#' else ''}" href="${c.url_next}" title="${_('Next commit')}"><i class="icon-right"></i></a>
14 14 </div>
@@ -59,7 +59,7 b''
59 59 <td class="td-hash" data-attr-name="commit_id">
60 60 % if c.full_load:
61 61 <div class="tooltip" title="${h.tooltip(node.last_commit.message)}">
62 <pre data-commit-id="${node.last_commit.raw_id}">r${node.last_commit.revision}:${node.last_commit.short_id}</pre>
62 <pre data-commit-id="${node.last_commit.raw_id}">r${node.last_commit.idx}:${node.last_commit.short_id}</pre>
63 63 </div>
64 64 % endif
65 65 </td>
@@ -3,20 +3,24 b''
3 3 <div id="codeblock" class="codeblock">
4 4 <div class="codeblock-header">
5 5 <div class="stats">
6 <span>
6 <span class="stats-filename">
7 7 <strong>
8 8 <i class="icon-file-text"></i>
9 9 ${c.file.unicode_path_safe}
10 10 </strong>
11 11 </span>
12 <span class="item last"><i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.f_path}" title="${_('Copy the full path')}"></i></span>
13 <br/>
14
12 15 % if c.lf_node:
13 16 <span title="${_('This file is a pointer to large binary file')}"> | ${_('LargeFile')} ${h.format_byte_size_binary(c.lf_node.size)} </span>
14 17 % endif
15 <span> | ${c.file.lines()[0]} ${_ungettext('line', 'lines', c.file.lines()[0])}</span>
18
19 <span class="stats-first-item">${c.file.lines()[0]} ${_ungettext('line', 'lines', c.file.lines()[0])}</span>
16 20 <span> | ${h.format_byte_size_binary(c.file.size)}</span>
17 21 <span> | ${c.file.mimetype} </span>
18 22 <span> | ${h.get_lexer_for_filenode(c.file).__class__.__name__}</span>
19 <span class="item last"> | <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.f_path}" title="${_('Copy the full path')}"></i></span>
23
20 24 </div>
21 25 <div class="buttons">
22 26 <a id="file_history_overview" href="#">
@@ -50,13 +50,13 b''
50 50 <!-- end box / title -->
51 51 <div class="table">
52 52 <div id="groups_list_wrap">
53 <table id="group_list_table" class="display"></table>
53 <table id="group_list_table" class="display" style="width: 100%"></table>
54 54 </div>
55 55 </div>
56 56
57 57 <div class="table">
58 58 <div id="repos_list_wrap">
59 <table id="repo_list_table" class="display"></table>
59 <table id="repo_list_table" class="display" style="width: 100%"></table>
60 60 </div>
61 61 </div>
62 62
@@ -511,21 +511,17 b''
511 511 <td class="td-hash">
512 512 <code>
513 513 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
514 r${commit.revision}:${h.short_id(commit.raw_id)}
514 r${commit.idx}:${h.short_id(commit.raw_id)}
515 515 </a>
516 516 ${h.hidden('revisions', commit.raw_id)}
517 517 </code>
518 518 </td>
519 <td class="expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}">
520 <div class="show_more_col">
521 <i class="show_more"></i>
522 </div>
519 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
520 <i class="icon-expand-linked"></i>
523 521 </td>
524 522 <td class="mid td-description">
525 523 <div class="log-container truncate-wrap">
526 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">
527 ${h.urlify_commit_message(commit.message, c.repo_name)}
528 </div>
524 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name)}</div>
529 525 </div>
530 526 </td>
531 527 </tr>
@@ -534,32 +530,6 b''
534 530 </table>
535 531 </div>
536 532
537 <script>
538 $('.expand_commit').on('click',function(e){
539 var target_expand = $(this);
540 var cid = target_expand.data('commitId');
541
542 if (target_expand.hasClass('open')){
543 $('#c-'+cid).css({
544 'height': '1.5em',
545 'white-space': 'nowrap',
546 'text-overflow': 'ellipsis',
547 'overflow':'hidden'
548 });
549 target_expand.removeClass('open');
550 }
551 else {
552 $('#c-'+cid).css({
553 'height': 'auto',
554 'white-space': 'pre-line',
555 'text-overflow': 'initial',
556 'overflow':'visible'
557 });
558 target_expand.addClass('open');
559 }
560 });
561 </script>
562
563 533 % endif
564 534
565 535 % else:
@@ -568,13 +538,28 b''
568 538
569 539 <div class="cs_files">
570 540 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
571 ${cbdiffs.render_diffset_menu()}
541
542 ${cbdiffs.render_diffset_menu(c.diffset, range_diff_on=c.range_diff_on)}
543
544 % if c.range_diff_on:
545 % for commit in c.commit_ranges:
546 ${cbdiffs.render_diffset(
547 c.changes[commit.raw_id],
548 commit=commit, use_comments=True,
549 collapse_when_files_over=5,
550 disable_new_comments=True,
551 deleted_files_comments=c.deleted_files_comments,
552 inline_comments=c.inline_comments)}
553 % endfor
554 % else:
572 555 ${cbdiffs.render_diffset(
573 556 c.diffset, use_comments=True,
574 557 collapse_when_files_over=30,
575 558 disable_new_comments=not c.allowed_to_comment,
576 559 deleted_files_comments=c.deleted_files_comments,
577 560 inline_comments=c.inline_comments)}
561 % endif
562
578 563 </div>
579 564 % else:
580 565 ## skipping commits we need to clear the view for missing commits
@@ -641,6 +626,7 b''
641 626 versionController.init();
642 627
643 628 reviewersController = new ReviewersController();
629 commitsController = new CommitsController();
644 630
645 631 $(function(){
646 632
@@ -57,8 +57,7 b''
57 57 %endif
58 58 <div class="form search-form">
59 59 <div class="fields">
60 <label for="q">${_('Search item')}:</label>
61 ${h.text('q', c.cur_query)}
60 ${h.text('q', c.cur_query, placeholder="Enter query...")}
62 61
63 62 ${h.select('type',c.search_type,[('content',_('File contents')), ('commit',_('Commit messages')), ('path',_('File names')),],id='id_search_type')}
64 63 <input type="submit" value="${_('Search')}" class="btn"/>
@@ -34,8 +34,8 b''
34 34 h.route_path('repo_commit',repo_name=entry['repository'],commit_id=entry['commit_id']))}
35 35 </td>
36 36 <td class="td-message expand_commit search open" data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="t-${h.md5_safe(entry['repository'])+entry['commit_id']}" title="${_('Expand commit message')}">
37 <div class="show_more_col">
38 <i class="show_more"></i>&nbsp;
37 <div>
38 <i class="icon-expand-linked"></i>&nbsp;
39 39 </div>
40 40 </td>
41 41 <td data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="c-${h.md5_safe(entry['repository'])+entry['commit_id']}" class="message td-description open">
@@ -84,7 +84,56 b''
84 84 </div>
85 85
86 86 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
87 <div class="left-label">
87 <div class="left-label-summary">
88 ${_('Information')}:
89 </div>
90 <div class="right-content">
91 <div class="commit-info">
92 <div class="tags">
93 <% commit_rev = c.rhodecode_db_repo.changeset_cache.get('revision') %>
94 % if c.rhodecode_repo:
95 ${refs_counters(
96 c.rhodecode_repo.branches,
97 c.rhodecode_repo.branches_closed,
98 c.rhodecode_repo.tags,
99 c.rhodecode_repo.bookmarks)}
100 % else:
101 ## missing requirements can make c.rhodecode_repo None
102 ${refs_counters([], [], [], [])}
103 % endif
104
105 ## commits
106 <span class="tag">
107 % if commit_rev == -1:
108 ${_ungettext('%(num)s Commit', '%(num)s Commits', 0) % {'num': 0}},
109 % else:
110 <a href="${h.route_path('repo_changelog', repo_name=c.repo_name)}">
111 ${_ungettext('%(num)s Commit', '%(num)s Commits', commit_rev) % {'num': commit_rev}}</a>,
112 % endif
113 </span>
114
115 ## forks
116 <span class="tag">
117 <a title="${_('Number of Repository Forks')}" href="${h.route_path('repo_forks_show_all', repo_name=c.repo_name)}">
118 ${c.repository_forks} ${_ungettext('Fork', 'Forks', c.repository_forks)}</a>,
119 </span>
120
121 ## repo size
122 % if commit_rev == -1:
123 <span class="stats-bullet">0 B</span>
124 % else:
125 <span class="stats-bullet" id="repo_size_container">
126 ${_('Calculating Repository Size...')}
127 </span>
128 % endif
129
130 </div>
131 </div>
132 </div>
133 </div>
134
135 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
136 <div class="left-label-summary">
88 137 ${_('Description')}:
89 138 </div>
90 139 <div class="right-content">
@@ -95,95 +144,23 b''
95 144 </div>
96 145 </div>
97 146
98 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
99 <div class="left-label">
100 ${_('Information')}:
101 </div>
102 <div class="right-content">
103
104 <div class="repo-size">
105 <% commit_rev = c.rhodecode_db_repo.changeset_cache.get('revision') %>
106
107 ## commits
108 % if commit_rev == -1:
109 ${_ungettext('%(num)s Commit', '%(num)s Commits', 0) % {'num': 0}},
110 % else:
111 <a href="${h.route_path('repo_changelog', repo_name=c.repo_name)}">
112 ${_ungettext('%(num)s Commit', '%(num)s Commits', commit_rev) % {'num': commit_rev}}</a>,
113 % endif
114
115 ## forks
116 <a title="${_('Number of Repository Forks')}" href="${h.route_path('repo_forks_show_all', repo_name=c.repo_name)}">
117 ${c.repository_forks} ${_ungettext('Fork', 'Forks', c.repository_forks)}</a>,
118
119 ## repo size
120 % if commit_rev == -1:
121 <span class="stats-bullet">0 B</span>
122 % else:
123 <span class="stats-bullet" id="repo_size_container">
124 ${_('Calculating Repository Size...')}
125 </span>
126 % endif
127 </div>
128
129 <div class="commit-info">
130 <div class="tags">
131 % if c.rhodecode_repo:
132 ${refs_counters(
133 c.rhodecode_repo.branches,
134 c.rhodecode_repo.branches_closed,
135 c.rhodecode_repo.tags,
136 c.rhodecode_repo.bookmarks)}
137 % else:
138 ## missing requirements can make c.rhodecode_repo None
139 ${refs_counters([], [], [], [])}
140 % endif
141 </div>
142 </div>
143
144 </div>
145 </div>
146
147 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
148 <div class="left-label">
149 ${_('Statistics')}:
150 </div>
151 <div class="right-content">
152 <div class="input ${summary(c.show_stats)} statistics">
153 % if c.show_stats:
154 <div id="lang_stats" class="enabled">
155 ${_('Calculating Code Statistics...')}
156 </div>
157 % else:
158 <span class="disabled">
159 ${_('Statistics are disabled for this repository')}
160 </span>
161 % if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
162 , ${h.link_to(_('enable statistics'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_statistics'))}
163 % endif
164 % endif
165 </div>
166
167 </div>
168 </div>
169
170 147 % if show_downloads:
171 148 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
172 <div class="left-label">
149 <div class="left-label-summary">
173 150 ${_('Downloads')}:
174 151 </div>
175 152 <div class="right-content">
176 153 <div class="input ${summary(c.show_stats)} downloads">
177 % if c.rhodecode_repo and len(c.rhodecode_repo.revisions) == 0:
154 % if c.rhodecode_repo and len(c.rhodecode_repo.commit_ids) == 0:
178 155 <span class="disabled">
179 156 ${_('There are no downloads yet')}
180 157 </span>
181 158 % elif not c.enable_downloads:
182 159 <span class="disabled">
183 ${_('Downloads are disabled for this repository')}
160 ${_('Downloads are disabled for this repository')}.
184 161 </span>
185 162 % if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
186 , ${h.link_to(_('enable downloads'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_downloads'))}
163 ${h.link_to(_('Enable downloads'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_downloads'))}
187 164 % endif
188 165 % else:
189 166 <span class="enabled">
@@ -199,6 +176,30 b''
199 176 </div>
200 177 % endif
201 178
179 ## Statistics
180 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
181 <div class="left-label-summary">
182 ${_('Statistics')}:
183 </div>
184 <div class="right-content">
185 <div class="input ${summary(c.show_stats)} statistics">
186 % if c.show_stats:
187 <div id="lang_stats" class="enabled">
188 ${_('Calculating Code Statistics...')}
189 </div>
190 % else:
191 <span class="disabled">
192 ${_('Statistics are disabled for this repository')}.
193 </span>
194 % if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
195 ${h.link_to(_('Enable statistics'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_statistics'))}
196 % endif
197 % endif
198 </div>
199
200 </div>
201 </div>
202
202 203 </div><!--end summary-detail-->
203 204 </%def>
204 205
@@ -60,15 +60,25 b''
60 60
61 61 <script type="text/javascript">
62 62 $(document).ready(function(){
63 $('#clone_option').on('change', function(e) {
64 var selected = $(this).val();
63
64 var showCloneField = function(clone_url_format){
65 65 $.each(['http', 'http_id', 'ssh'], function (idx, val) {
66 if(val === selected){
66 if(val === clone_url_format){
67 67 $('#clone_option_' + val).show();
68 $('#clone_option').val(val)
68 69 } else {
69 70 $('#clone_option_' + val).hide();
70 71 }
71 72 });
73 };
74 // default taken from session
75 showCloneField(templateContext.session_attrs.clone_url_format);
76
77 $('#clone_option').on('change', function(e) {
78 var selected = $(this).val();
79
80 storeUserSessionAttr('rc_user_session_attr.clone_url_format', selected);
81 showCloneField(selected)
72 82 });
73 83
74 84 var initialCommitData = {
@@ -45,7 +45,10 b''
45 45 %endif
46 46 </td>
47 47 <td class="td-commit">
48 <pre><a href="${h.route_path('repo_commit', repo_name=c.repo_name, commit_id=cs.raw_id)}">${h.show_id(cs)}</a></pre>
48 <code>
49 <a href="${h.route_path('repo_commit', repo_name=c.repo_name, commit_id=cs.raw_id)}">${h.show_id(cs)}</a>
50 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${cs.raw_id}" title="${_('Copy the full commit id')}"></i>
51 </code>
49 52 </td>
50 53
51 54 <td class="td-description mid">
@@ -236,7 +236,7 b' def no_newline_id_generator(test_name):'
236 236 nicer output of progress of test
237 237 """
238 238 org_name = test_name
239 test_name = test_name\
239 test_name = safe_str(test_name)\
240 240 .replace('\n', '_N') \
241 241 .replace('\r', '_N') \
242 242 .replace('\t', '_T') \
@@ -99,8 +99,8 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
99 99 'extern_type': extern_type,
100 100 }
101 101
102 log.debug('EXTERNAL user: \n%s' % formatted_json(user_attrs))
103 log.info('user `%s` authenticated correctly' % user_attrs['username'])
102 log.debug('EXTERNAL user: \n%s', formatted_json(user_attrs))
103 log.info('user `%s` authenticated correctly', user_attrs['username'])
104 104
105 105 return user_attrs
106 106
@@ -34,7 +34,7 b' def _get_dbs_from_metafunc(metafunc):'
34 34 if hasattr(metafunc.function, 'dbs'):
35 35 # Supported backends by this test function, created from
36 36 # pytest.mark.dbs
37 backends = metafunc.function.dbs.args
37 backends = metafunc.definition.get_closest_marker('dbs').args
38 38 else:
39 39 backends = metafunc.config.getoption('--dbs')
40 40 return backends
@@ -42,11 +42,13 b' def scm_extras(user_regular, repo_stub):'
42 42 'repository': repo_stub.repo_name,
43 43 'scm': repo_stub.scm_instance().alias,
44 44 'config': '',
45 'repo_store': '',
45 46 'server_url': 'http://example.com',
46 47 'make_lock': None,
47 'user-agent': 'some-client',
48 'user_agent': 'some-client',
48 49 'locked_by': [None],
49 50 'commit_ids': ['a' * 40] * 3,
51 'hook_type': 'scm_extras_test',
50 52 'is_shadow_repo': False,
51 53 })
52 54 return extras
@@ -53,7 +53,7 b' class TestINI(object):'
53 53 data. Example usage::
54 54
55 55 with TestINI('test.ini', [{'section':{'key':val'}]) as new_test_ini_path:
56 print 'paster server %s' % new_test_ini
56 print('paster server %s' % new_test_ini)
57 57 """
58 58
59 59 def __init__(self, ini_file_path, ini_params, new_file_prefix='DEFAULT',
@@ -226,7 +226,7 b' class Fixture(object):'
226 226 return r
227 227
228 228 def destroy_repo(self, repo_name, **kwargs):
229 RepoModel().delete(repo_name, **kwargs)
229 RepoModel().delete(repo_name, pull_requests='delete', **kwargs)
230 230 Session().commit()
231 231
232 232 def destroy_repo_on_filesystem(self, repo_name):
@@ -43,6 +43,7 b' def repo_push_event(backend, user_regula'
43 43 'repository': repo.repo_name,
44 44 'scm': repo.scm_instance().alias,
45 45 'config': '',
46 'repo_store': '',
46 47 'server_url': 'http://example.com',
47 48 'make_lock': None,
48 49 'locked_by': [None],
@@ -194,7 +194,7 b' class TestSimpleSvnApp(object):'
194 194 ]
195 195 request_mock.assert_called_once_with(
196 196 self.environment['REQUEST_METHOD'], expected_url,
197 data=self.data, headers=expected_request_headers)
197 data=self.data, headers=expected_request_headers, stream=False)
198 198 response_mock.iter_content.assert_called_once_with(chunk_size=1024)
199 199 args, _ = start_response.call_args
200 200 assert args[0] == '200 OK'
@@ -33,7 +33,7 b' class TestTokenizeString(object):'
33 33 import this
34 34
35 35 var = 6
36 print "this"
36 print("this")
37 37
38 38 '''
39 39
@@ -58,10 +58,11 b' class TestTokenizeString(object):'
58 58 ('', u'\n'),
59 59 ('', u' '),
60 60 ('k', u'print'),
61 ('', u' '),
61 ('p', u'('),
62 62 ('s2', u'"'),
63 63 ('s2', u'this'),
64 64 ('s2', u'"'),
65 ('p', u')'),
65 66 ('', u'\n'),
66 67 ('', u'\n'),
67 68 ('', u' ')
@@ -73,7 +74,7 b' class TestTokenizeString(object):'
73 74
74 75 assert tokens == [
75 76 ('',
76 u'\n import this\n\n var = 6\n print "this"\n\n ')
77 u'\n import this\n\n var = 6\n print("this")\n\n ')
77 78 ]
78 79
79 80
@@ -38,6 +38,7 b' def test_post_push_truncates_commits(use'
38 38 'user_agent': 'some-client',
39 39 'locked_by': [None],
40 40 'commit_ids': ['abcde12345' * 4] * 30000,
41 'hook_type': 'large_push_test_type',
41 42 'is_shadow_repo': False,
42 43 }
43 44 extras = utils2.AttributeDict(extras)
@@ -70,11 +71,13 b' def hook_extras(user_regular, repo_stub)'
70 71 'repository': repo_stub.repo_name,
71 72 'scm': '',
72 73 'config': '',
74 'repo_store': '',
73 75 'server_url': 'http://example.com',
74 76 'make_lock': None,
75 77 'user_agent': 'some-client',
76 78 'locked_by': [None],
77 79 'commit_ids': [],
80 'hook_type': 'test_type',
78 81 'is_shadow_repo': False,
79 82 })
80 83 return extras
@@ -91,7 +94,12 b' def test_hooks_propagate(func, extension'
91 94 Tests that our hook code propagates to rhodecode extensions and triggers
92 95 the appropriate event.
93 96 """
94 extension_mock = mock.Mock()
97 class ExtensionMock(mock.Mock):
98 @property
99 def output(self):
100 return 'MOCK'
101
102 extension_mock = ExtensionMock()
95 103 events_mock = mock.Mock()
96 104 patches = {
97 105 'Repository': mock.Mock(),
@@ -561,7 +561,7 b' def test_get_repo_by_id(test, expected):'
561 561
562 562
563 563 def test_invalidation_context(baseapp):
564 repo_id = 999
564 repo_id = 9999
565 565
566 566 cache_namespace_uid = 'cache_repo_instance.{}_{}'.format(
567 567 repo_id, CacheKey.CACHE_TYPE_README)
@@ -302,7 +302,7 b' class TestPasswordChanged(object):'
302 302 assert result is True
303 303
304 304
305 class TestReadOpensourceLicenses(object):
305 class TestReadOpenSourceLicenses(object):
306 306 def test_success(self):
307 307 utils._license_cache = None
308 308 json_data = '''
@@ -343,10 +343,14 b' class TestReadOpensourceLicenses(object)'
343 343 def test_licenses_file_contains_no_unknown_licenses(self):
344 344 utils._license_cache = None
345 345 result = utils.read_opensource_licenses()
346 license_names = []
347 for licenses in result.values():
348 license_names.extend(licenses.keys())
349 assert 'UNKNOWN' not in license_names
346
347 for license_data in result:
348 if isinstance(license_data["license"], list):
349 for lic_data in license_data["license"]:
350 assert 'UNKNOWN' not in lic_data["fullName"]
351 else:
352 full_name = license_data.get("fullName") or license_data
353 assert 'UNKNOWN' not in full_name
350 354
351 355
352 356 class TestMakeDbConfig(object):
@@ -90,7 +90,7 b' def execute(*popenargs, **kwargs):'
90 90 cmd = kwargs.get("args")
91 91 if cmd is None:
92 92 cmd = popenargs[0]
93 print cmd, output, error
93 print('{} {} {} '.format(cmd, output, error))
94 94 raise subprocess32.CalledProcessError(retcode, cmd, output=output)
95 95 return output
96 96
@@ -125,14 +125,14 b' class TestPerformanceBase(object):'
125 125 try:
126 126 self.test()
127 127 except Exception as error:
128 print error
128 print(error)
129 129 finally:
130 130 self.cleanup()
131 131
132 print 'Clone time :', self.clone_time
133 print 'Push time :', mean(self.push_times)
134 print 'Pull time :', mean(self.pull_times)
135 print 'Empty pull time:', mean(self.empty_pull_times)
132 print('Clone time :{}'.format(self.clone_time))
133 print('Push time :{}'.format(mean(self.push_times)))
134 print('Pull time :{}'.format(mean(self.pull_times)))
135 print('Empty pull time:{}'.format(mean(self.empty_pull_times)))
136 136
137 137 return {
138 138 'clone': self.clone_time,
@@ -163,10 +163,10 b' class TestPerformanceBase(object):'
163 163 self.orig_repo, commits[self.skip_commits - 1], 'upstream')
164 164 commits = commits[self.skip_commits:self.max_commits]
165 165
166 print 'Working with %d commits' % len(commits)
167 for i in xrange(self.n_commits - 1, len(commits), self.n_commits):
166 print('Working with %d commits' % len(commits))
167 for i in range(self.n_commits - 1, len(commits), self.n_commits):
168 168 commit = commits[i]
169 print 'Processing commit %s (%d)' % (commit, i + 1)
169 print('Processing commit %s (%d)' % (commit, i + 1))
170 170 self.push_times.append(
171 171 self.push(self.orig_repo, commit, 'upstream'))
172 172 self.check_remote_last_commit_is(commit, upstream_url)
@@ -402,7 +402,7 b' def main(argv):'
402 402 '--api-key', dest='api_key', action='store', required=True,
403 403 help='The api key of RhodeCode')
404 404 options = parser.parse_args(argv[1:])
405 print options
405 print(options)
406 406
407 407 test_config = {
408 408 'python': {
@@ -452,9 +452,9 b' def main(argv):'
452 452 test_config[test_name]['limit'],
453 453 test_config[test_name].get('skip', 0),
454 454 api_key)
455 print '*' * 80
456 print 'Running performance test: %s with size %d' % (test_name, size)
457 print '*' * 80
455 print('*' * 80)
456 print('Running performance test: %s with size %d' % (test_name, size))
457 print('*' * 80)
458 458 results[test_name][size] = test.run()
459 459 pprint.pprint(dict(results))
460 460
@@ -51,7 +51,7 b' def profile():'
51 51 try:
52 52 process = psutil.Process(config.pid)
53 53 except psutil.NoSuchProcess:
54 print "Process {pid} does not exist!".format(pid=config.pid)
54 print("Process {pid} does not exist!".format(pid=config.pid))
55 55 sys.exit(1)
56 56
57 57 while True:
@@ -105,7 +105,7 b' def process_stats(process):'
105 105
106 106 def dump_stats(stats):
107 107 for sample in stats:
108 print json.dumps(sample)
108 print(json.dumps(sample))
109 109
110 110
111 111 class AppenlightClient():
@@ -43,7 +43,7 b' RC_WEBSITE = "http://localhost:5001/"'
43 43
44 44 def get_file(prefix):
45 45 out_file = None
46 for i in xrange(100):
46 for i in range(100):
47 47 file_path = "%s_profile%.3d.csv" % (prefix, i)
48 48 if os.path.exists(file_path):
49 49 continue
@@ -54,15 +54,15 b' def get_file(prefix):'
54 54
55 55
56 56 def dump_system():
57 print "System Overview..."
58 print "\nCPU Count: %d (%d real)" % \
59 (psutil.cpu_count(), psutil.cpu_count(logical=False))
60 print "\nDisk:"
61 print psutil.disk_usage(os.sep)
62 print "\nMemory:"
63 print psutil.virtual_memory()
64 print "\nMemory (swap):"
65 print psutil.swap_memory()
57 print("System Overview...")
58 print("\nCPU Count: %d (%d real)" %
59 (psutil.cpu_count(), psutil.cpu_count(logical=False)))
60 print("\nDisk:")
61 print(psutil.disk_usage(os.sep))
62 print("\nMemory:")
63 print(psutil.virtual_memory())
64 print("\nMemory (swap):")
65 print(psutil.swap_memory())
66 66
67 67
68 68 def count_dulwich_fds(proc):
@@ -97,30 +97,30 b' def dump_process(pid, out_file):'
97 97 # Open output files
98 98 vcs_out = get_file("vcs")
99 99 if vcs_out is None:
100 print "Unable to enumerate output file for VCS"
100 print("Unable to enumerate output file for VCS")
101 101 sys.exit(1)
102 102 rc_out = get_file("rc")
103 103 if rc_out is None:
104 print "Unable to enumerate output file for RC"
104 print("Unable to enumerate output file for RC")
105 105 sys.exit(1)
106 106
107 107 # Show system information
108 108 dump_system()
109 109
110 print "\nStarting VCS..."
110 print("\nStarting VCS...")
111 111 vcs = psutil.Popen(["vcsserver"])
112 112 time.sleep(1)
113 113 if not vcs.is_running():
114 print "VCS - Failed to start"
114 print("VCS - Failed to start")
115 115 sys.exit(1)
116 print "VCS - Ok"
116 print("VCS - Ok")
117 117
118 print "\nStarting RhodeCode..."
118 print("\nStarting RhodeCode...")
119 119 rc = psutil.Popen("RC_VCSSERVER_TEST_DISABLE=1 paster serve test.ini",
120 120 shell=True, stdin=subprocess32.PIPE)
121 121 time.sleep(1)
122 122 if not rc.is_running():
123 print "RC - Failed to start"
123 print("RC - Failed to start")
124 124 vcs.terminate()
125 125 sys.exit(1)
126 126
@@ -132,19 +132,19 b' time.sleep(4)'
132 132 try:
133 133 urllib.urlopen(RC_WEBSITE)
134 134 except IOError:
135 print "RC - Website not started"
135 print("RC - Website not started")
136 136 vcs.terminate()
137 137 sys.exit(1)
138 print "RC - Ok"
138 print("RC - Ok")
139 139
140 print "\nProfiling...\n%s\n" % ("-"*80)
140 print("\nProfiling...\n%s\n" % ("-"*80))
141 141 while True:
142 142 try:
143 143 dump_process(vcs, vcs_out)
144 144 dump_process(rc, rc_out)
145 145 time.sleep(PROFILING_INTERVAL)
146 146 except Exception:
147 print traceback.format_exc()
147 print(traceback.format_exc())
148 148 break
149 149
150 150 # Finalize the profiling
@@ -56,14 +56,14 b' svn_pages = ['
56 56
57 57 repeat = 10
58 58
59 print "Repeating each URL x%d\n" % repeat
59 print("Repeating each URL x%d\n" % repeat)
60 60 for page in pages:
61 61 url = "http://%s/%s" % (server, page)
62 print url
62 print(url)
63 63
64 64 stmt = "urllib2.urlopen('%s', timeout=120)" % url
65 65 t = timeit.Timer(stmt=stmt, setup="import urllib2")
66 66
67 67 result = t.repeat(repeat=repeat, number=1)
68 print "\t%.3f (min) - %.3f (max) - %.3f (avg)\n" % \
69 (min(result), max(result), sum(result)/len(result))
68 print("\t%.3f (min) - %.3f (max) - %.3f (avg)\n" %
69 (min(result), max(result), sum(result)/len(result)))
@@ -49,7 +49,7 b' class TestIssueTrackerSettingsModel(obje'
49 49 model = IssueTrackerSettingsModel()
50 50 with pytest.raises(Exception) as exc_info:
51 51 model.get_repo_settings(cache=True)
52 assert exc_info.value.message == 'Repository is not specified'
52 assert str(exc_info.value) == 'Repository is not specified'
53 53
54 54 def test_get_repo_settings(self, repo_stub):
55 55 model = IssueTrackerSettingsModel(repo=repo_stub.repo_name)
@@ -491,7 +491,7 b' class TestDeleteUiValue(object):'
491 491 model = SettingsModel()
492 492 with pytest.raises(SettingNotFound) as exc_info:
493 493 model.delete_ui(id_)
494 assert exc_info.value.message == 'Setting `{}` is not found'.format(id_)
494 assert str(exc_info.value) == 'Setting `{}` is not found'.format(id_)
495 495
496 496 def test_delete_ui_when_repo_is_not_set(self, settings_util):
497 497 model = SettingsModel()
@@ -53,7 +53,7 b' class TestInheritGlobalSettingsProperty('
53 53 model = VcsSettingsModel()
54 54 with pytest.raises(Exception) as exc_info:
55 55 model.inherit_global_settings
56 assert exc_info.value.message == 'Repository is not specified'
56 assert str(exc_info.value) == 'Repository is not specified'
57 57
58 58 def test_true_is_returned_when_value_is_not_found(self, repo_stub):
59 59 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -81,7 +81,7 b' class TestInheritGlobalSettingsProperty('
81 81 model = VcsSettingsModel()
82 82 with pytest.raises(Exception) as exc_info:
83 83 model.inherit_global_settings = False
84 assert exc_info.value.message == 'Repository is not specified'
84 assert str(exc_info.value) == 'Repository is not specified'
85 85
86 86
87 87 class TestVcsSettingsModel(object):
@@ -114,7 +114,7 b' class TestVcsSettingsModel(object):'
114 114 model = VcsSettingsModel()
115 115 with pytest.raises(Exception) as exc_info:
116 116 model.get_repo_svn_branch_patterns()
117 assert exc_info.value.message == 'Repository is not specified'
117 assert str(exc_info.value) == 'Repository is not specified'
118 118
119 119 def test_global_svn_tag_patterns(self):
120 120 model = VcsSettingsModel()
@@ -144,7 +144,7 b' class TestVcsSettingsModel(object):'
144 144 model = VcsSettingsModel()
145 145 with pytest.raises(Exception) as exc_info:
146 146 model.get_repo_svn_tag_patterns()
147 assert exc_info.value.message == 'Repository is not specified'
147 assert str(exc_info.value) == 'Repository is not specified'
148 148
149 149 def test_get_global_settings(self):
150 150 expected_result = {'test': 'test'}
@@ -277,9 +277,8 b' class TestCreateOrUpdateRepoHookSettings'
277 277
278 278 with pytest.raises(ValueError) as exc_info:
279 279 model.create_or_update_repo_hook_settings(data)
280 assert (
281 exc_info.value.message ==
282 'The given data does not contain {} key'.format(deleted_key))
280 msg = 'The given data does not contain {} key'.format(deleted_key)
281 assert str(exc_info.value) == msg
283 282
284 283 def test_update_when_repo_object_found(self, repo_stub, settings_util):
285 284 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -310,9 +309,8 b' class TestUpdateGlobalHookSettings(objec'
310 309
311 310 with pytest.raises(ValueError) as exc_info:
312 311 model.update_global_hook_settings(data)
313 assert (
314 exc_info.value.message ==
315 'The given data does not contain {} key'.format(deleted_key))
312 msg = 'The given data does not contain {} key'.format(deleted_key)
313 assert str(exc_info.value) == msg
316 314
317 315 def test_update_global_hook_settings(self, settings_util):
318 316 model = VcsSettingsModel()
@@ -342,7 +340,7 b' class TestCreateOrUpdateRepoGeneralSetti'
342 340 model = VcsSettingsModel()
343 341 with pytest.raises(Exception) as exc_info:
344 342 model.create_or_update_repo_pr_settings(GENERAL_FORM_DATA)
345 assert exc_info.value.message == 'Repository is not specified'
343 assert str(exc_info.value) == 'Repository is not specified'
346 344
347 345
348 346 class TestCreateOrUpdatGlobalGeneralSettings(object):
@@ -382,9 +380,9 b' class TestCreateOrUpdateGeneralSettings('
382 380
383 381 with pytest.raises(ValueError) as exc_info:
384 382 model._create_or_update_general_settings(model.repo_settings, data)
385 assert (
386 exc_info.value.message ==
387 'The given data does not contain {} key'.format(deleted_key))
383
384 msg = 'The given data does not contain {} key'.format(deleted_key)
385 assert str(exc_info.value) == msg
388 386
389 387 def test_update_when_repo_setting_found(self, repo_stub, settings_util):
390 388 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -411,7 +409,7 b' class TestCreateRepoSvnSettings(object):'
411 409 model = VcsSettingsModel()
412 410 with pytest.raises(Exception) as exc_info:
413 411 model.create_repo_svn_settings(SVN_FORM_DATA)
414 assert exc_info.value.message == 'Repository is not specified'
412 assert str(exc_info.value) == 'Repository is not specified'
415 413
416 414
417 415 class TestCreateSvnSettings(object):
@@ -550,13 +548,13 b' class TestCreateOrUpdateRepoHgSettings(o'
550 548 model.create_or_update_repo_hg_settings(data)
551 549 expected_message = 'The given data does not contain {} key'.format(
552 550 field_to_remove)
553 assert exc_info.value.message == expected_message
551 assert str(exc_info.value) == expected_message
554 552
555 553 def test_create_raises_exception_when_repository_not_specified(self):
556 554 model = VcsSettingsModel()
557 555 with pytest.raises(Exception) as exc_info:
558 556 model.create_or_update_repo_hg_settings(self.FORM_DATA)
559 assert exc_info.value.message == 'Repository is not specified'
557 assert str(exc_info.value) == 'Repository is not specified'
560 558
561 559
562 560 class TestUpdateGlobalSslSetting(object):
@@ -613,7 +611,7 b' class TestCreateOrUpdateGlobalHgSettings'
613 611 model.create_or_update_global_hg_settings(data)
614 612 expected_message = 'The given data does not contain {} key'.format(
615 613 field_to_remove)
616 assert exc_info.value.message == expected_message
614 assert str(exc_info.value) == expected_message
617 615
618 616
619 617 class TestCreateOrUpdateGlobalGitSettings(object):
@@ -659,7 +657,7 b' class TestDeleteRepoSvnPattern(object):'
659 657 model = VcsSettingsModel()
660 658 with pytest.raises(Exception) as exc_info:
661 659 model.delete_repo_svn_pattern(123)
662 assert exc_info.value.message == 'Repository is not specified'
660 assert str(exc_info.value) == 'Repository is not specified'
663 661
664 662
665 663 class TestDeleteGlobalSvnPattern(object):
@@ -783,7 +781,7 b' class TestGetRepoUiSettings(object):'
783 781 model = VcsSettingsModel()
784 782 with pytest.raises(Exception) as exc_info:
785 783 model.get_repo_ui_settings()
786 assert exc_info.value.message == 'Repository is not specified'
784 assert str(exc_info.value) == 'Repository is not specified'
787 785
788 786
789 787 class TestGetRepoGeneralSettings(object):
@@ -809,7 +807,7 b' class TestGetRepoGeneralSettings(object)'
809 807 model = VcsSettingsModel()
810 808 with pytest.raises(Exception) as exc_info:
811 809 model.get_repo_general_settings()
812 assert exc_info.value.message == 'Repository is not specified'
810 assert str(exc_info.value) == 'Repository is not specified'
813 811
814 812
815 813 class TestGetGlobalGeneralSettings(object):
@@ -994,7 +992,7 b' class TestCreateOrUpdateRepoSettings(obj'
994 992 model = VcsSettingsModel()
995 993 with pytest.raises(Exception) as exc_info:
996 994 model.create_or_update_repo_settings(data=self.FORM_DATA)
997 assert exc_info.value.message == 'Repository is not specified'
995 assert str(exc_info.value) == 'Repository is not specified'
998 996
999 997 def test_only_svn_settings_are_updated_when_type_is_svn(self, backend_svn):
1000 998 repo = backend_svn.create_repo()
@@ -373,7 +373,8 b' class TestPullRequestModel(object):'
373 373 source_ref_id = pull_request.source_ref_parts.commit_id
374 374 target_ref_id = pull_request.target_ref_parts.commit_id
375 375 diff = PullRequestModel()._get_diff_from_pr_or_version(
376 source_repo, source_ref_id, target_ref_id, context=6)
376 source_repo, source_ref_id, target_ref_id,
377 hide_whitespace_changes=False, diff_context=6)
377 378 assert 'file_1' in diff.raw
378 379
379 380 def test_generate_title_returns_unicode(self):
@@ -393,6 +394,7 b' class TestIntegrationMerge(object):'
393 394 def test_merge_triggers_push_hooks(
394 395 self, pr_util, user_admin, capture_rcextensions, merge_extras,
395 396 extra_config):
397
396 398 pull_request = pr_util.create_pull_request(
397 399 approved=True, mergeable=True)
398 400 # TODO: johbo: Needed for sqlite, try to find an automatic way for it
@@ -404,8 +406,8 b' class TestIntegrationMerge(object):'
404 406 pull_request, user_admin, extras=merge_extras)
405 407
406 408 assert merge_state.executed
407 assert 'pre_push' in capture_rcextensions
408 assert 'post_push' in capture_rcextensions
409 assert '_pre_push_hook' in capture_rcextensions
410 assert '_push_hook' in capture_rcextensions
409 411
410 412 def test_merge_can_be_rejected_by_pre_push_hook(
411 413 self, pr_util, user_admin, capture_rcextensions, merge_extras):
@@ -471,6 +473,7 b' def merge_extras(user_regular):'
471 473 'repository': 'fake_target_repo_name',
472 474 'scm': 'git',
473 475 'config': 'fake_config_ini_path',
476 'repo_store': '',
474 477 'make_lock': None,
475 478 'locked_by': [None, None, None],
476 479 'server_url': 'http://test.example.com:5000',
@@ -60,7 +60,8 b' class TestGetDiffForPrOrVersion(object):'
60 60 source_ref_id = pr_or_version.source_ref_parts.commit_id
61 61 target_ref_id = pr_or_version.target_ref_parts.commit_id
62 62 diff = PullRequestModel()._get_diff_from_pr_or_version(
63 source_repo, source_ref_id, target_ref_id, context=6)
63 source_repo, source_ref_id, target_ref_id,
64 hide_whitespace_changes=False, diff_context=6)
64 65 assert 'file_b' in diff.raw
65 66
66 67 def assert_commit_cannot_be_accessed(
@@ -106,7 +106,7 b' def test_strip_with_multiple_heads(backe'
106 106 model.strip(repo, commit_ids['b'], branch=None)
107 107
108 108 vcs_repo = repo.scm_instance()
109 rest_commit_ids = [c.raw_id for c in vcs_repo.get_changesets()]
109 rest_commit_ids = [c.raw_id for c in vcs_repo.get_commits()]
110 110 assert len(rest_commit_ids) == 4
111 111 assert commit_ids['b'] not in rest_commit_ids
112 112
@@ -124,7 +124,7 b' def test_strip_with_single_heads(backend'
124 124 model.strip(repo, commit_ids['b'], branch=None)
125 125
126 126 vcs_repo = repo.scm_instance()
127 rest_commit_ids = [c.raw_id for c in vcs_repo.get_changesets()]
127 rest_commit_ids = [c.raw_id for c in vcs_repo.get_commits()]
128 128 assert len(rest_commit_ids) == 2
129 129 assert commit_ids['b'] not in rest_commit_ids
130 130
@@ -139,7 +139,7 b' def get_backends_from_metafunc(metafunc)'
139 139 if hasattr(metafunc.function, 'backends'):
140 140 # Supported backends by this test function, created from
141 141 # pytest.mark.backends
142 backends = metafunc.function.backends.args
142 backends = metafunc.definition.get_closest_marker('backends').args
143 143 elif hasattr(metafunc.cls, 'backend_alias'):
144 144 # Support class attribute "backend_alias", this is mainly
145 145 # for legacy reasons for tests not yet using pytest.mark.backends
@@ -154,10 +154,11 b' def activate_example_rcextensions(reques'
154 154 """
155 155 Patch in an example rcextensions module which verifies passed in kwargs.
156 156 """
157 from rhodecode.tests.other import example_rcextensions
157 from rhodecode.config import rcextensions
158 158
159 159 old_extensions = rhodecode.EXTENSIONS
160 rhodecode.EXTENSIONS = example_rcextensions
160 rhodecode.EXTENSIONS = rcextensions
161 rhodecode.EXTENSIONS.calls = collections.defaultdict(list)
161 162
162 163 @request.addfinalizer
163 164 def cleanup():
@@ -182,8 +183,14 b' def http_environ_session():'
182 183 """
183 184 Allow to use "http_environ" in session scope.
184 185 """
185 return http_environ(
186 http_host_stub=http_host_stub())
186 return plain_http_environ()
187
188
189 def plain_http_host_stub():
190 """
191 Value of HTTP_HOST in the test run.
192 """
193 return 'example.com:80'
187 194
188 195
189 196 @pytest.fixture
@@ -191,7 +198,14 b' def http_host_stub():'
191 198 """
192 199 Value of HTTP_HOST in the test run.
193 200 """
194 return 'example.com:80'
201 return plain_http_host_stub()
202
203
204 def plain_http_host_only_stub():
205 """
206 Value of HTTP_HOST in the test run.
207 """
208 return plain_http_host_stub().split(':')[0]
195 209
196 210
197 211 @pytest.fixture
@@ -199,11 +213,10 b' def http_host_only_stub():'
199 213 """
200 214 Value of HTTP_HOST in the test run.
201 215 """
202 return http_host_stub().split(':')[0]
216 return plain_http_host_only_stub()
203 217
204 218
205 @pytest.fixture
206 def http_environ(http_host_stub):
219 def plain_http_environ():
207 220 """
208 221 HTTP extra environ keys.
209 222
@@ -212,14 +225,26 b' def http_environ(http_host_stub):'
212 225 to override this for a specific test case.
213 226 """
214 227 return {
215 'SERVER_NAME': http_host_only_stub(),
216 'SERVER_PORT': http_host_stub.split(':')[1],
217 'HTTP_HOST': http_host_stub,
228 'SERVER_NAME': plain_http_host_only_stub(),
229 'SERVER_PORT': plain_http_host_stub().split(':')[1],
230 'HTTP_HOST': plain_http_host_stub(),
218 231 'HTTP_USER_AGENT': 'rc-test-agent',
219 232 'REQUEST_METHOD': 'GET'
220 233 }
221 234
222 235
236 @pytest.fixture
237 def http_environ():
238 """
239 HTTP extra environ keys.
240
241 User by the test application and as well for setting up the pylons
242 environment. In the case of the fixture "app" it should be possible
243 to override this for a specific test case.
244 """
245 return plain_http_environ()
246
247
223 248 @pytest.fixture(scope='session')
224 249 def baseapp(ini_config, vcsserver, http_environ_session):
225 250 from rhodecode.lib.pyramid_utils import get_app_config
@@ -423,18 +448,7 b' class TestRepoContainer(object):'
423 448 self._fixture.destroy_repo(repo_name)
424 449
425 450
426 @pytest.fixture
427 def backend(request, backend_alias, baseapp, test_repo):
428 """
429 Parametrized fixture which represents a single backend implementation.
430
431 It respects the option `--backends` to focus the test run on specific
432 backend implementations.
433
434 It also supports `pytest.mark.xfail_backends` to mark tests as failing
435 for specific backends. This is intended as a utility for incremental
436 development of a new backend implementation.
437 """
451 def backend_base(request, backend_alias, baseapp, test_repo):
438 452 if backend_alias not in request.config.getoption('--backends'):
439 453 pytest.skip("Backend %s not selected." % (backend_alias, ))
440 454
@@ -452,18 +466,33 b' def backend(request, backend_alias, base'
452 466
453 467
454 468 @pytest.fixture
469 def backend(request, backend_alias, baseapp, test_repo):
470 """
471 Parametrized fixture which represents a single backend implementation.
472
473 It respects the option `--backends` to focus the test run on specific
474 backend implementations.
475
476 It also supports `pytest.mark.xfail_backends` to mark tests as failing
477 for specific backends. This is intended as a utility for incremental
478 development of a new backend implementation.
479 """
480 return backend_base(request, backend_alias, baseapp, test_repo)
481
482
483 @pytest.fixture
455 484 def backend_git(request, baseapp, test_repo):
456 return backend(request, 'git', baseapp, test_repo)
485 return backend_base(request, 'git', baseapp, test_repo)
457 486
458 487
459 488 @pytest.fixture
460 489 def backend_hg(request, baseapp, test_repo):
461 return backend(request, 'hg', baseapp, test_repo)
490 return backend_base(request, 'hg', baseapp, test_repo)
462 491
463 492
464 493 @pytest.fixture
465 494 def backend_svn(request, baseapp, test_repo):
466 return backend(request, 'svn', baseapp, test_repo)
495 return backend_base(request, 'svn', baseapp, test_repo)
467 496
468 497
469 498 @pytest.fixture
@@ -581,7 +610,7 b' class Backend(object):'
581 610
582 611 def create_repo(
583 612 self, commits=None, number_of_commits=0, heads=None,
584 name_suffix=u'', **kwargs):
613 name_suffix=u'', bare=False, **kwargs):
585 614 """
586 615 Create a repository and record it for later cleanup.
587 616
@@ -591,16 +620,17 b' class Backend(object):'
591 620 commits will be added to the new repository.
592 621 :param heads: Optional. Can be set to a sequence of of commit
593 622 names which shall be pulled in from the master repository.
594
623 :param name_suffix: adds special suffix to generated repo name
624 :param bare: set a repo as bare (no checkout)
595 625 """
596 626 self.repo_name = self._next_repo_name() + name_suffix
597 627 repo = self._fixture.create_repo(
598 self.repo_name, repo_type=self.alias, **kwargs)
628 self.repo_name, repo_type=self.alias, bare=bare, **kwargs)
599 629 self._cleanup_repos.append(repo.repo_name)
600 630
601 631 commits = commits or [
602 632 {'message': 'Commit %s of %s' % (x, self.repo_name)}
603 for x in xrange(number_of_commits)]
633 for x in range(number_of_commits)]
604 634 self._add_commits_to_repo(repo.scm_instance(), commits)
605 635 if heads:
606 636 self.pull_heads(repo, heads)
@@ -674,17 +704,7 b' class Backend(object):'
674 704 repo.set_refs(ref_name, refs[ref_name])
675 705
676 706
677 @pytest.fixture
678 def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo):
679 """
680 Parametrized fixture which represents a single vcs backend implementation.
681
682 See the fixture `backend` for more details. This one implements the same
683 concept, but on vcs level. So it does not provide model instances etc.
684
685 Parameters are generated dynamically, see :func:`pytest_generate_tests`
686 for how this works.
687 """
707 def vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo):
688 708 if backend_alias not in request.config.getoption('--backends'):
689 709 pytest.skip("Backend %s not selected." % (backend_alias, ))
690 710
@@ -703,31 +723,32 b' def vcsbackend(request, backend_alias, t'
703 723
704 724
705 725 @pytest.fixture
726 def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo):
727 """
728 Parametrized fixture which represents a single vcs backend implementation.
729
730 See the fixture `backend` for more details. This one implements the same
731 concept, but on vcs level. So it does not provide model instances etc.
732
733 Parameters are generated dynamically, see :func:`pytest_generate_tests`
734 for how this works.
735 """
736 return vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo)
737
738
739 @pytest.fixture
706 740 def vcsbackend_git(request, tests_tmp_path, baseapp, test_repo):
707 return vcsbackend(request, 'git', tests_tmp_path, baseapp, test_repo)
741 return vcsbackend_base(request, 'git', tests_tmp_path, baseapp, test_repo)
708 742
709 743
710 744 @pytest.fixture
711 745 def vcsbackend_hg(request, tests_tmp_path, baseapp, test_repo):
712 return vcsbackend(request, 'hg', tests_tmp_path, baseapp, test_repo)
746 return vcsbackend_base(request, 'hg', tests_tmp_path, baseapp, test_repo)
713 747
714 748
715 749 @pytest.fixture
716 750 def vcsbackend_svn(request, tests_tmp_path, baseapp, test_repo):
717 return vcsbackend(request, 'svn', tests_tmp_path, baseapp, test_repo)
718
719
720 @pytest.fixture
721 def vcsbackend_random(vcsbackend_git):
722 """
723 Use this to express that your tests need "a vcsbackend".
724
725 The fixture `vcsbackend` would run the test multiple times for each
726 available vcs backend which is a pure waste of time if the test is
727 independent of the vcs backend type.
728 """
729 # TODO: johbo: Change this to pick a random backend
730 return vcsbackend_git
751 return vcsbackend_base(request, 'svn', tests_tmp_path, baseapp, test_repo)
731 752
732 753
733 754 @pytest.fixture
@@ -773,14 +794,15 b' class VcsBackend(object):'
773 794 """
774 795 return get_backend(self.alias)
775 796
776 def create_repo(self, commits=None, number_of_commits=0, _clone_repo=None):
797 def create_repo(self, commits=None, number_of_commits=0, _clone_repo=None,
798 bare=False):
777 799 repo_name = self._next_repo_name()
778 800 self._repo_path = get_new_dir(repo_name)
779 801 repo_class = get_backend(self.alias)
780 802 src_url = None
781 803 if _clone_repo:
782 804 src_url = _clone_repo.path
783 repo = repo_class(self._repo_path, create=True, src_url=src_url)
805 repo = repo_class(self._repo_path, create=True, src_url=src_url, bare=bare)
784 806 self._cleanup_repos.append(repo)
785 807
786 808 commits = commits or [
@@ -1158,13 +1180,13 b' class UserUtility(object):'
1158 1180 return repo_group
1159 1181
1160 1182 def create_repo(self, owner=TEST_USER_ADMIN_LOGIN, parent=None,
1161 auto_cleanup=True, repo_type='hg'):
1183 auto_cleanup=True, repo_type='hg', bare=False):
1162 1184 repo_name = "{prefix}_repository_{count}".format(
1163 1185 prefix=self._test_name,
1164 1186 count=len(self.repos_ids))
1165 1187
1166 1188 repository = self.fixture.create_repo(
1167 repo_name, cur_user=owner, repo_group=parent, repo_type=repo_type)
1189 repo_name, cur_user=owner, repo_group=parent, repo_type=repo_type, bare=bare)
1168 1190 if auto_cleanup:
1169 1191 self.repos_ids.append(repository.repo_id)
1170 1192 return repository
@@ -25,21 +25,12 b' debug = true'
25 25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 26 #email_to = admin@localhost
27 27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
32 #error_message =
33
34
35 28 #smtp_server = mail.server.com
36 29 #smtp_username =
37 30 #smtp_password =
38 31 #smtp_port =
39 32 #smtp_use_tls = false
40 33 #smtp_use_ssl = true
41 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
42 #smtp_auth =
43 34
44 35 [server:main]
45 36 ## COMMON ##
@@ -61,7 +61,7 b' class Command(object):'
61 61 """
62 62
63 63 command = cmd + ' ' + ' '.join(args)
64 log.debug('Executing %s' % command)
64 log.debug('Executing %s', command)
65 65 if DEBUG:
66 66 print(command)
67 67 p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
@@ -56,7 +56,7 b' if len(sys.argv) == 2:'
56 56 if not BASE_URI.endswith('/'):
57 57 BASE_URI += '/'
58 58
59 print 'Crawling @ %s' % BASE_URI
59 print('Crawling @ %s' % BASE_URI)
60 60 BASE_URI += '%s'
61 61 PROJECT_PATH = jn('/', 'home', 'marcink', 'repos')
62 62 PROJECTS = [
@@ -104,16 +104,16 b' def test_changelog_walk(proj, pages=100)'
104 104 size = len(f.read())
105 105 e = time.time() - s
106 106 total_time += e
107 print 'visited %s size:%s req:%s ms' % (full_uri, size, e)
107 print('visited %s size:%s req:%s ms' % (full_uri, size, e))
108 108
109 print 'total_time', total_time
110 print 'average on req', total_time / float(pages)
109 print('total_time {}'.format(total_time))
110 print('average on req {}'.format(total_time / float(pages)))
111 111
112 112
113 113 def test_commit_walk(proj, limit=None):
114 114 repo, proj = _get_repo(proj)
115 115
116 print 'processing', jn(PROJECT_PATH, proj)
116 print('processing', jn(PROJECT_PATH, proj))
117 117 total_time = 0
118 118
119 119 cnt = 0
@@ -124,22 +124,22 b' def test_commit_walk(proj, limit=None):'
124 124 break
125 125
126 126 full_uri = (BASE_URI % raw_cs)
127 print '%s visiting %s\%s' % (cnt, full_uri, i)
127 print('%s visiting %s\%s' % (cnt, full_uri, i))
128 128 s = time.time()
129 129 f = o.open(full_uri)
130 130 size = len(f.read())
131 131 e = time.time() - s
132 132 total_time += e
133 print '%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e)
133 print('%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e))
134 134
135 print 'total_time', total_time
136 print 'average on req', total_time / float(cnt)
135 print('total_time {}'.format(total_time))
136 print('average on req {}'.format(total_time / float(cnt)))
137 137
138 138
139 139 def test_files_walk(proj, limit=100):
140 140 repo, proj = _get_repo(proj)
141 141
142 print 'processing', jn(PROJECT_PATH, proj)
142 print('processing {}'.format(jn(PROJECT_PATH, proj)))
143 143 total_time = 0
144 144
145 145 paths_ = OrderedSet([''])
@@ -166,22 +166,22 b' def test_files_walk(proj, limit=100):'
166 166
167 167 file_path = '/'.join((proj, 'files', 'tip', f))
168 168 full_uri = (BASE_URI % file_path)
169 print '%s visiting %s' % (cnt, full_uri)
169 print('%s visiting %s' % (cnt, full_uri))
170 170 s = time.time()
171 171 f = o.open(full_uri)
172 172 size = len(f.read())
173 173 e = time.time() - s
174 174 total_time += e
175 print '%s visited OK size:%s req:%s ms' % (cnt, size, e)
175 print('%s visited OK size:%s req:%s ms' % (cnt, size, e))
176 176
177 print 'total_time', total_time
178 print 'average on req', total_time / float(cnt)
177 print('total_time {}'.format(total_time))
178 print('average on req {}'.format(total_time / float(cnt)))
179 179
180 180 if __name__ == '__main__':
181 181 for path in PROJECTS:
182 182 repo = vcs.get_repo(jn(PROJECT_PATH, path))
183 183 for i in range(PASES):
184 print 'PASS %s/%s' % (i, PASES)
184 print('PASS %s/%s' % (i, PASES))
185 185 test_changelog_walk(repo, pages=80)
186 186 test_commit_walk(repo, limit=100)
187 187 test_files_walk(repo, limit=100)
@@ -156,7 +156,7 b' def set_anonymous_access(enabled):'
156 156 def check_xfail_backends(node, backend_alias):
157 157 # Using "xfail_backends" here intentionally, since this marks work
158 158 # which is "to be done" soon.
159 skip_marker = node.get_marker('xfail_backends')
159 skip_marker = node.get_closest_marker('xfail_backends')
160 160 if skip_marker and backend_alias in skip_marker.args:
161 161 msg = "Support for backend %s to be developed." % (backend_alias, )
162 162 msg = skip_marker.kwargs.get('reason', msg)
@@ -166,7 +166,7 b' def check_xfail_backends(node, backend_a'
166 166 def check_skip_backends(node, backend_alias):
167 167 # Using "skip_backends" here intentionally, since this marks work which is
168 168 # not supported.
169 skip_marker = node.get_marker('skip_backends')
169 skip_marker = node.get_closest_marker('skip_backends')
170 170 if skip_marker and backend_alias in skip_marker.args:
171 171 msg = "Feature not supported for backend %s." % (backend_alias, )
172 172 msg = skip_marker.kwargs.get('reason', msg)
@@ -94,7 +94,7 b' class TestGitRepository:'
94 94 repo = GitRepository(TEST_GIT_REPO)
95 95 repo_clone = GitRepository(
96 96 TEST_GIT_REPO_CLONE,
97 src_url=TEST_GIT_REPO, create=True, update_after_clone=True)
97 src_url=TEST_GIT_REPO, create=True, do_workspace_checkout=True)
98 98 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
99 99 # Checking hashes of commits should be enough
100 100 for commit in repo.get_commits():
@@ -111,7 +111,7 b' class TestGitRepository:'
111 111 clone_path = TEST_GIT_REPO_CLONE + '_with_update'
112 112 repo_clone = GitRepository(
113 113 clone_path,
114 create=True, src_url=TEST_GIT_REPO, update_after_clone=True)
114 create=True, src_url=TEST_GIT_REPO, do_workspace_checkout=True)
115 115 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
116 116
117 117 # check if current workdir was updated
@@ -123,7 +123,7 b' class TestGitRepository:'
123 123 clone_path = TEST_GIT_REPO_CLONE + '_without_update'
124 124 repo_clone = GitRepository(
125 125 clone_path,
126 create=True, src_url=TEST_GIT_REPO, update_after_clone=False)
126 create=True, src_url=TEST_GIT_REPO, do_workspace_checkout=False)
127 127 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
128 128 # check if current workdir was *NOT* updated
129 129 fpath = os.path.join(clone_path, 'MANIFEST.in')
@@ -153,7 +153,7 b' class TestGitRepository:'
153 153 # Note: This is a git specific part of the API, it's only implemented
154 154 # by the git backend.
155 155 source_repo = vcsbackend_git.repo
156 target_repo = vcsbackend_git.create_repo()
156 target_repo = vcsbackend_git.create_repo(bare=True)
157 157 target_repo.fetch(source_repo.path)
158 158 # Note: Get a fresh instance, avoids caching trouble
159 159 target_repo = vcsbackend_git.backend(target_repo.path)
@@ -162,8 +162,7 b' class TestGitRepository:'
162 162 def test_commit_ids(self):
163 163 # there are 112 commits (by now)
164 164 # so we can assume they would be available from now on
165 subset = set([
166 'c1214f7e79e02fc37156ff215cd71275450cffc3',
165 subset = {'c1214f7e79e02fc37156ff215cd71275450cffc3',
167 166 '38b5fe81f109cb111f549bfe9bb6b267e10bc557',
168 167 'fa6600f6848800641328adbf7811fd2372c02ab2',
169 168 '102607b09cdd60e2793929c4f90478be29f85a17',
@@ -187,7 +186,7 b' class TestGitRepository:'
187 186 'f5ea29fc42ef67a2a5a7aecff10e1566699acd68',
188 187 '27d48942240f5b91dfda77accd2caac94708cc7d',
189 188 '622f0eb0bafd619d2560c26f80f09e3b0b0d78af',
190 'e686b958768ee96af8029fe19c6050b1a8dd3b2b'])
189 'e686b958768ee96af8029fe19c6050b1a8dd3b2b'}
191 190 assert subset.issubset(set(self.repo.commit_ids))
192 191
193 192 def test_slicing(self):
@@ -281,12 +280,12 b' TODO: To be written...'
281 280
282 281 new_branch = 'new_branch'
283 282 assert repo_clone._current_branch() == 'master'
284 assert set(repo_clone.branches) == set(('master',))
283 assert set(repo_clone.branches) == {'master'}
285 284 repo_clone._checkout(new_branch, create=True)
286 285
287 286 # Branches is a lazy property so we need to recrete the Repo object.
288 287 repo_clone = GitRepository(repo_clone.path)
289 assert set(repo_clone.branches) == set(('master', new_branch))
288 assert set(repo_clone.branches) == {'master', new_branch}
290 289 assert repo_clone._current_branch() == new_branch
291 290
292 291 def test_checkout(self):
@@ -1171,7 +1170,7 b' class TestGitRegression(BackendTestMixin'
1171 1170 assert paths == expected_paths
1172 1171
1173 1172
1174 class TestDiscoverGitVersion:
1173 class TestDiscoverGitVersion(object):
1175 1174
1176 1175 def test_returns_git_version(self, baseapp):
1177 1176 version = discover_git_version()
@@ -122,7 +122,7 b' class TestMercurialRepository:'
122 122 repo = MercurialRepository(TEST_HG_REPO)
123 123 repo_clone = MercurialRepository(
124 124 TEST_HG_REPO_CLONE + '_w_update',
125 src_url=TEST_HG_REPO, update_after_clone=True)
125 src_url=TEST_HG_REPO, do_workspace_checkout=True)
126 126 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
127 127
128 128 # check if current workdir was updated
@@ -133,7 +133,7 b' class TestMercurialRepository:'
133 133 repo = MercurialRepository(TEST_HG_REPO)
134 134 repo_clone = MercurialRepository(
135 135 TEST_HG_REPO_CLONE + '_wo_update',
136 src_url=TEST_HG_REPO, update_after_clone=False)
136 src_url=TEST_HG_REPO, do_workspace_checkout=False)
137 137 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
138 138 assert not os.path.isfile(
139 139 os.path.join(TEST_HG_REPO_CLONE + '_wo_update', 'MANIFEST.in'))
@@ -57,7 +57,7 b' class Command(object):'
57 57
58 58 command = cmd + ' ' + ' '.join(args)
59 59 if DEBUG:
60 log.debug('*** CMD %s ***' % (command,))
60 log.debug('*** CMD %s ***', command)
61 61
62 62 env = dict(os.environ)
63 63 # Delete coverage variables, as they make the test fail for Mercurial
@@ -69,8 +69,8 b' class Command(object):'
69 69 cwd=self.cwd, env=env)
70 70 stdout, stderr = self.process.communicate()
71 71 if DEBUG:
72 log.debug('STDOUT:%s' % (stdout,))
73 log.debug('STDERR:%s' % (stderr,))
72 log.debug('STDOUT:%s', stdout)
73 log.debug('STDERR:%s', stderr)
74 74 return stdout, stderr
75 75
76 76 def assert_returncode_success(self):
@@ -25,10 +25,13 b' import pytest'
25 25 from rhodecode.lib.vcs.backends.git.repository import GitRepository
26 26 from rhodecode.lib.vcs.backends.hg.repository import MercurialRepository
27 27 from rhodecode.lib.vcs.nodes import FileNode
28 from rhodecode.model.db import Repository
28 29 from rhodecode.model.meta import Session
30 from rhodecode.tests import GIT_REPO, HG_REPO
29 31
30 32 from rhodecode.tests.vcs_operations import (
31 Command, _check_proper_clone, _check_proper_git_push, _check_proper_hg_push)
33 Command, _check_proper_clone, _check_proper_git_push, _check_proper_hg_push,
34 _add_files_and_push)
32 35
33 36
34 37 @pytest.mark.usefixtures("disable_locking")
@@ -242,3 +245,37 b' class TestVCSOperationsSpecial(object):'
242 245 assert 'remote: RhodeCode: open pull request link: {}'.format(ref) in stdout
243 246 assert 'remote: RhodeCode: push completed' in stdout
244 247 assert 'exporting bookmark feature2' in stdout
248
249 def test_push_is_forbidden_on_archived_repo_hg(self, backend_hg, rc_web_server, tmpdir):
250 empty_repo = backend_hg.create_repo()
251 repo_name = empty_repo.repo_name
252
253 repo = Repository.get_by_repo_name(repo_name)
254 repo.archived = True
255 Session().commit()
256
257 clone_url = rc_web_server.repo_clone_url(repo_name)
258 stdout, stderr = Command('/tmp').execute(
259 'hg clone', clone_url, tmpdir.strpath)
260
261 stdout, stderr = _add_files_and_push(
262 'hg', tmpdir.strpath, clone_url=clone_url)
263
264 assert 'abort: HTTP Error 403: Forbidden' in stderr
265
266 def test_push_is_forbidden_on_archived_repo_git(self, backend_git, rc_web_server, tmpdir):
267 empty_repo = backend_git.create_repo()
268 repo_name = empty_repo.repo_name
269
270 repo = Repository.get_by_repo_name(repo_name)
271 repo.archived = True
272 Session().commit()
273
274 clone_url = rc_web_server.repo_clone_url(repo_name)
275 stdout, stderr = Command('/tmp').execute(
276 'git clone', clone_url, tmpdir.strpath)
277
278 stdout, stderr = _add_files_and_push(
279 'git', tmpdir.strpath, clone_url=clone_url)
280
281 assert "The requested URL returned error: 403" in stderr
@@ -20,6 +20,7 b''
20 20
21 21
22 22 import logging
23 from pyramid.httpexceptions import HTTPException, HTTPBadRequest
23 24
24 25 from rhodecode.lib.middleware.vcs import (
25 26 detect_vcs_request, VCS_TYPE_KEY, VCS_TYPE_SKIP)
@@ -56,6 +57,53 b' def vcs_detection_tween_factory(handler,'
56 57 return vcs_detection_tween
57 58
58 59
60 def junk_encoding_detector(request):
61 """
62 Detect bad encoded GET params, and fail immediately with BadRequest
63 """
64
65 try:
66 request.GET.get("", None)
67 except UnicodeDecodeError:
68 raise HTTPBadRequest("Invalid bytes in query string.")
69
70
71 def bad_url_data_detector(request):
72 """
73 Detect invalid bytes in a path.
74 """
75 try:
76 request.path_info
77 except UnicodeDecodeError:
78 raise HTTPBadRequest("Invalid bytes in URL.")
79
80
81 def junk_form_data_detector(request):
82 """
83 Detect bad encoded POST params, and fail immediately with BadRequest
84 """
85
86 if request.method == "POST":
87 try:
88 request.POST.get("", None)
89 except ValueError:
90 raise HTTPBadRequest("Invalid bytes in form data.")
91
92
93 def sanity_check_factory(handler, registry):
94 def sanity_check(request):
95 try:
96 junk_encoding_detector(request)
97 bad_url_data_detector(request)
98 junk_form_data_detector(request)
99 except HTTPException as exc:
100 return exc
101
102 return handler(request)
103
104 return sanity_check
105
106
59 107 def includeme(config):
60 108 config.add_subscriber('rhodecode.subscribers.add_renderer_globals',
61 109 'pyramid.events.BeforeRender')
@@ -65,5 +113,5 b' def includeme(config):'
65 113 'pyramid.events.NewRequest')
66 114 config.add_subscriber('rhodecode.subscribers.add_request_user_context',
67 115 'pyramid.events.ContextFound')
68
116 config.add_tween('rhodecode.tweens.sanity_check_factory')
69 117 config.add_tween('rhodecode.tweens.vcs_detection_tween_factory')
@@ -14,7 +14,6 b' let'
14 14
15 15 enterprise-ce = import ./default.nix {
16 16 inherit
17 pkgs
18 17 pythonPackages
19 18 doCheck;
20 19 };
@@ -51,7 +50,9 b' let'
51 50 nixFile = "${path}/default.nix";
52 51
53 52 derivate = import "${nixFile}" {
54 inherit doCheck pkgs pythonPackages;
53 inherit
54 doCheck
55 pythonPackages;
55 56 };
56 57 in
57 58 pkgs.lib.lists.optionals doIt (
@@ -93,7 +94,7 b' in enterprise-ce.override (attrs: {'
93 94 export PS1="\n\[\033[1;32m\][CE-shell:\w]$\[\033[0m\] "
94 95
95 96 echo "Building frontend assets"
96 ${enterprise-ce.linkNodeAndBowerPackages}
97 ${enterprise-ce.linkNodePackages}
97 98
98 99 # Setup a temporary directory.
99 100 tmp_path=$(mktemp -d)
@@ -1,17 +0,0 b''
1 {
2 "name": "rhodecode-elements",
3 "description": "User interface for elements for rhodecode",
4 "main": "index.html",
5 "dependencies": {
6 "webcomponentsjs": "^1.2.3",
7 "polymer": "Polymer/polymer#^2.6.0",
8 "paper-button": "PolymerElements/paper-button#^2.1.2",
9 "paper-spinner": "PolymerElements/paper-spinner#^2.1.0",
10 "paper-tooltip": "PolymerElements/paper-tooltip#^2.1.1",
11 "paper-toast": "PolymerElements/paper-toast#^2.1.2",
12 "paper-toggle-button": "PolymerElements/paper-toggle-button#^2.1.1",
13 "iron-ajax": "PolymerElements/iron-ajax#^2.1.3",
14 "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^2.2.0",
15 "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^2.1.2"
16 }
17 }
@@ -1,150 +0,0 b''
1 .. _config-ext:
2
3 Configure |RCX|
4 ---------------
5
6 To get the the built in plugins and extensions working the way you want them
7 to, you have to configure them to work with your services. An overview of
8 what needs to be done is:
9
10 * :ref:`config-rcx-plugin` to carry out your desired actions once its hook is
11 triggered. There are default actions built in, but you may wish to alter
12 those.
13 * :ref:`config-rcx-hook` to execute actions for the plugin, when certain
14 actions are carried out with |RCE|.
15
16 .. _config-rcx-plugin:
17
18 Tweak a Default Plugin
19 ^^^^^^^^^^^^^^^^^^^^^^
20
21 Each of the default plugins comes with a standard configuration, but you may
22 wish to change those settings. In this example, the Redmine plugin watches
23 for the words defined in the ``HASH_REGEX`` variable and takes actions if one
24 of those words is used in conjunction with a ``#{number}``, which matches a
25 ticket number in Redmine. You can configure this to work differently based on
26 the `Redmine documentation`_.
27
28 .. code-block:: python
29 :emphasize-lines: 3-5, 37
30
31 import re
32
33 HASH_REGEX = re.compile(
34 r"(?:fix|fixes|fixing|close|closes|closing)\s*#([0-9]+)\b",
35 re.IGNORECASE)
36
37
38 def link_to_commit(repo_url, commit_id):
39 rev_url = '%s/changeset/%s' % (repo_url, commit_id)
40 return '"%s":%s' % (commit_id[:6], rev_url)
41
42
43 def run(*args, **kwargs):
44 issues = kwargs['RM_ISSUES']
45 if not issues:
46 return 0
47
48 # repo extra fields can control this, they should be propagated with
49 # extract repo fields
50 tracker_url = kwargs.get('redmine_tracker_url') or kwargs['RM_URL']
51 project_id = kwargs.get('redmine_project_id') or kwargs['RM_PROJECT']
52 api_key = kwargs.get('redmine_api_key') or kwargs['RM_APIKEY']
53
54 if project_id:
55 from redmine import Redmine
56 remote_redmine = Redmine(tracker_url, key=api_key)
57 project = remote_redmine.project.get(project_id)
58 repo_url = '%(server_url)s/%(repository)s' % kwargs
59 # for each fetched issue id make a redmine api call
60 for _id, details in issues.items():
61 commits = ', '.join([link_to_commit(repo_url,
62 x['raw_id'],)
63 for x in details])
64 issue = project.issues.get(int(_id))
65 if issue:
66 issue.notes = 'Issue resolved by %s' % (commits,)
67 issue.status_id = 3 # Resolved
68 issue.save()
69
70
71 .. _config-rcx-hook:
72
73 Configure a Hook
74 ^^^^^^^^^^^^^^^^
75
76 To configure the default hooks in the
77 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file,
78 use the following steps.
79
80 1. Configure the connection details, either in the file or import from a
81 dictionary. For these connection scenarios the following details need to
82 be configured.
83
84 * **REDMINE_URL** = '<redmine-url>'
85 * **REDMINE_API_KEY** = '<secret>'
86 * **SLACK_API_URL** = '<slack-url>?token=<secret>'
87 * **SLACK_API_KEY** = '<secret>'
88
89 2. You will also need to configure other variables, such as the
90 **SLACK_ROOM** or **RM_PROJECT** (Redmine Project). These set where the
91 commit message is posted. Various hooks can take different variables and
92 they are documented in the file.
93
94 3. Inside each hook you can then configure it to carry out actions
95 per service. In this example, the push hook is pushing to the Redmine and
96 Slack plugins on each push if the hook criteria are matched.
97
98 .. code-block:: python
99 :emphasize-lines: 21-29, 37-44
100
101 def _push_hook(*args, **kwargs):
102 kwargs['commit_ids'] = kwargs['pushed_revs']
103
104 call = load_extension('extra_fields.py')
105 if call:
106 repo_extra_fields = call(**kwargs)
107 # now update if we have extra fields, they have precedence
108 # this way users can store any configuration inside
109 # the database per repo
110 for key, data in repo_extra_fields.items():
111 kwargs[key] = data['field_value']
112
113 # fetch pushed commits
114 call = load_extension('extract_commits.py')
115 extracted_commits = {}
116 if call:
117 extracted_commits = call(**kwargs)
118 # store the commits for the next call chain
119 kwargs['COMMITS'] = extracted_commits
120
121 # slack !
122 call = load_extension('slack.py')
123 if call:
124 kwargs['INCOMING_WEBHOOK_URL'] = SLACK_API_URL
125 kwargs['SLACK_TOKEN'] = SLACK_API_KEY
126 kwargs['SLACK_ROOM'] = '#slack-channel'
127 kwargs['SLACK_FROM'] = 'Slack-Message-Poster'
128 kwargs['SLACK_FROM_ICON_EMOJI'] = ':slack-emoji:'
129 call(**kwargs)
130
131 # fetch issues from given commits
132 call = load_extension('extract_issues.py')
133 issues = {}
134 if call:
135 issues = call(**kwargs)
136
137 # redmine smart commits
138 call = load_extension('redmine_smart_commits.py')
139 if call:
140 kwargs['RM_URL'] = REDMINE_URL
141 kwargs['RM_APIKEY'] = REDMINE_API_KEY
142 kwargs['RM_PROJECT'] = None # uses extra_fields from repo
143 kwargs['RM_ISSUES'] = issues
144 call(**kwargs)
145
146 return 0
147 PUSH_HOOK = _push_hook
148
149
150 .. _Redmine documentation: http://www.redmine.org/projects/redmine/wiki/Rest_api
This diff has been collapsed as it changes many lines, (823 lines changed) Show them Hide them
@@ -1,823 +0,0 b''
1 """
2 rcextensions module.
3
4 """
5
6
7 import os
8 import imp
9 import string
10 import functools
11
12 here = os.path.dirname(os.path.abspath(__file__))
13 registered_extensions = dict()
14
15 class DotDict(dict):
16
17 def __contains__(self, k):
18 try:
19 return dict.__contains__(self, k) or hasattr(self, k)
20 except:
21 return False
22
23 # only called if k not found in normal places
24 def __getattr__(self, k):
25 try:
26 return object.__getattribute__(self, k)
27 except AttributeError:
28 try:
29 return self[k]
30 except KeyError:
31 raise AttributeError(k)
32
33 def __setattr__(self, k, v):
34 try:
35 object.__getattribute__(self, k)
36 except AttributeError:
37 try:
38 self[k] = v
39 except:
40 raise AttributeError(k)
41 else:
42 object.__setattr__(self, k, v)
43
44 def __delattr__(self, k):
45 try:
46 object.__getattribute__(self, k)
47 except AttributeError:
48 try:
49 del self[k]
50 except KeyError:
51 raise AttributeError(k)
52 else:
53 object.__delattr__(self, k)
54
55 def toDict(self):
56 return unserialize(self)
57
58 def __repr__(self):
59 keys = list(self.iterkeys())
60 keys.sort()
61 args = ', '.join(['%s=%r' % (key, self[key]) for key in keys])
62 return '%s(%s)' % (self.__class__.__name__, args)
63
64 @staticmethod
65 def fromDict(d):
66 return serialize(d)
67
68
69 def serialize(x):
70 if isinstance(x, dict):
71 return DotDict((k, serialize(v)) for k, v in x.iteritems())
72 elif isinstance(x, (list, tuple)):
73 return type(x)(serialize(v) for v in x)
74 else:
75 return x
76
77
78 def unserialize(x):
79 if isinstance(x, dict):
80 return dict((k, unserialize(v)) for k, v in x.iteritems())
81 elif isinstance(x, (list, tuple)):
82 return type(x)(unserialize(v) for v in x)
83 else:
84 return x
85
86
87 def load_extension(filename, async=False):
88 """
89 use to load extensions inside rcextension folder.
90 for example::
91
92 callback = load_extension('email.py', async=False)
93 if callback:
94 callback('foobar')
95
96 put file named email.py inside rcextensions folder to load it. Changing
97 async=True will make the call of the plugin async, it's useful for
98 blocking calls like sending an email or notification with APIs.
99 """
100 mod = ''.join(filename.split('.')[:-1])
101 loaded = imp.load_source(mod, os.path.join(here, filename))
102
103 callback = getattr(loaded, 'run', None)
104 if not callback:
105 raise Exception('Plugin missing `run` method')
106 if async:
107 # modify callback so it's actually an async call
108 def _async_callback(*args, **kwargs):
109 import threading
110 thr = threading.Thread(target=callback, args=args, kwargs=kwargs)
111 thr.start()
112 if kwargs.get('_async_block'):
113 del kwargs['_async_block']
114 thr.join()
115
116 return _async_callback
117 return callback
118
119
120 def _verify_kwargs(expected_parameters, kwargs):
121 """
122 Verify that exactly `expected_parameters` are passed in as `kwargs`.
123 """
124 expected_parameters = set(expected_parameters)
125 kwargs_keys = set(kwargs.keys())
126 if kwargs_keys != expected_parameters:
127 missing_kwargs = expected_parameters - kwargs_keys
128 unexpected_kwargs = kwargs_keys - expected_parameters
129 raise AssertionError(
130 "Missing parameters: %r, unexpected parameters: %s" %
131 (missing_kwargs, unexpected_kwargs))
132
133
134 def verify_kwargs(required_args):
135 """
136 decorator to verify extension calls arguments.
137
138 :param required_args:
139 """
140 def wrap(func):
141 def wrapper(*args, **kwargs):
142 _verify_kwargs(required_args, kwargs)
143 return func(*args, **kwargs)
144 return wrapper
145 return wrap
146
147
148 def register(name=None):
149 def wrap(func):
150 @functools.wraps(func)
151 def wrapper(*args, **kwargs):
152 # register load_extensions in kwargs, so we can chain plugins
153 kwargs['_load_extension'] = load_extension
154 # append this path for us to use added plugins or modules
155 import sys
156 _cur_path = os.path.dirname(os.path.abspath(__file__))
157 if _cur_path not in sys.path:
158 sys.path.append(_cur_path)
159
160 registered_extensions[func.__name__] = func
161 return func(*args, **kwargs)
162 return wrapper
163 return wrap
164
165 # =============================================================================
166 # END OF UTILITY FUNCTIONS HERE
167 # =============================================================================
168
169 # Additional mappings that are not present in the pygments lexers
170 # used for building stats
171 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
172 # more than one name for extension
173 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
174 # build by pygments
175 EXTRA_MAPPINGS = {}
176
177 # additional lexer definitions for custom files it's overrides pygments lexers,
178 # and uses defined name of lexer to colorize the files. Format is {'ext':
179 # 'lexer_name'} List of lexers can be printed running:
180 # >> python -c "import pprint;from pygments import lexers;
181 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
182
183 EXTRA_LEXERS = {}
184
185
186 CONFIG = DotDict(
187 slack=DotDict(
188 api_key='api-key',
189 api_url='slack-incoming-hook-url',
190 default_room='#slack-channel',
191 default_plugin_config={},
192 ),
193 redmine=DotDict(
194 api_key='api-key',
195 default_tracker_url='https://redmine.tracker.url',
196 default_project_id=None,
197 default_status_resolved_id=3
198 ),
199 )
200
201 # slack conf
202 CONFIG.slack.default_plugin_config = {
203 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url,
204 'SLACK_TOKEN': CONFIG.slack.api_key,
205 'SLACK_ROOM': CONFIG.slack.default_room,
206 'SLACK_FROM': 'RhodeCode',
207 'SLACK_FROM_ICON_EMOJI': ':rhodecode:',
208 }
209
210 # redmine smart_pr configuration
211 def configure_redmine_smart_pr(issues, kwargs):
212 kwargs['REDMINE_ISSUES'] = issues
213 kwargs['redmine_tracker_url'] = kwargs.pop(
214 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url
215 kwargs['redmine_api_key'] = kwargs.pop(
216 'redmine_api_key', '') or CONFIG.redmine.api_key
217 kwargs['redmine_project_id'] = kwargs.pop(
218 'redmine_project_id', '') or CONFIG.redmine.default_project_id
219
220
221 @register('CREATE_REPO_HOOK')
222 @verify_kwargs(
223 ['_load_extension', 'repo_name', 'repo_type', 'description', 'private',
224 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
225 'clone_uri', 'fork_id', 'group_id', 'created_by'])
226 def _create_repo_hook(*args, **kwargs):
227 """
228 POST CREATE REPOSITORY HOOK. This function will be executed after
229 each repository is created. kwargs available:
230
231 :param repo_name:
232 :param repo_type:
233 :param description:
234 :param private:
235 :param created_on:
236 :param enable_downloads:
237 :param repo_id:
238 :param user_id:
239 :param enable_statistics:
240 :param clone_uri:
241 :param fork_id:
242 :param group_id:
243 :param created_by:
244 """
245 return 0
246 CREATE_REPO_HOOK = _create_repo_hook
247
248
249 @register('CREATE_REPO_GROUP_HOOK')
250 @verify_kwargs(
251 ['_load_extension', 'group_name', 'group_parent_id', 'group_description',
252 'group_id', 'user_id', 'created_by', 'created_on', 'enable_locking'])
253 def _create_repo_group_hook(*args, **kwargs):
254 """
255 POST CREATE REPOSITORY GROUP HOOK, this function will be
256 executed after each repository group is created. kwargs available:
257
258 :param group_name:
259 :param group_parent_id:
260 :param group_description:
261 :param group_id:
262 :param user_id:
263 :param created_by:
264 :param created_on:
265 :param enable_locking:
266 """
267 return 0
268 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
269
270
271 @register('PRE_CREATE_USER_HOOK')
272 @verify_kwargs(
273 ['_load_extension', 'username', 'password', 'email', 'firstname',
274 'lastname', 'active', 'admin', 'created_by'])
275 def _pre_create_user_hook(*args, **kwargs):
276 """
277 PRE CREATE USER HOOK, this function will be executed before each
278 user is created, it returns a tuple of bool, reason.
279 If bool is False the user creation will be stopped and reason
280 will be displayed to the user. kwargs available:
281
282 :param username:
283 :param password:
284 :param email:
285 :param firstname:
286 :param lastname:
287 :param active:
288 :param admin:
289 :param created_by:
290 """
291
292 reason = 'allowed'
293 return True, reason
294 PRE_CREATE_USER_HOOK = _pre_create_user_hook
295
296
297 @register('CREATE_USER_HOOK')
298 @verify_kwargs(
299 ['_load_extension', 'username', 'full_name_or_username', 'full_contact',
300 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname',
301 'ip_addresses', 'extern_type', 'extern_name', 'email', 'api_key',
302 'api_keys', 'last_login', 'full_name', 'active', 'password', 'emails',
303 'inherit_default_permissions', 'created_by', 'created_on'])
304 def _create_user_hook(*args, **kwargs):
305 """
306 POST CREATE USER HOOK, this function will be executed after each user is created
307 kwargs available:
308
309 :param username:
310 :param full_name_or_username:
311 :param full_contact:
312 :param user_id:
313 :param name:
314 :param firstname:
315 :param short_contact:
316 :param admin:
317 :param lastname:
318 :param ip_addresses:
319 :param extern_type:
320 :param extern_name:
321 :param email:
322 :param api_key:
323 :param api_keys:
324 :param last_login:
325 :param full_name:
326 :param active:
327 :param password:
328 :param emails:
329 :param inherit_default_permissions:
330 :param created_by:
331 :param created_on:
332 """
333 return 0
334 CREATE_USER_HOOK = _create_user_hook
335
336
337 @register('DELETE_REPO_HOOK')
338 @verify_kwargs(
339 ['_load_extension', 'repo_name', 'repo_type', 'description', 'private',
340 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
341 'clone_uri', 'fork_id', 'group_id', 'deleted_by', 'deleted_on'])
342 def _delete_repo_hook(*args, **kwargs):
343 """
344 POST DELETE REPOSITORY HOOK, this function will be executed after
345 each repository deletion kwargs available:
346
347 :param repo_name:
348 :param repo_type:
349 :param description:
350 :param private:
351 :param created_on:
352 :param enable_downloads:
353 :param repo_id:
354 :param user_id:
355 :param enable_statistics:
356 :param clone_uri:
357 :param fork_id:
358 :param group_id:
359 :param deleted_by:
360 :param deleted_on:
361 """
362 return 0
363 DELETE_REPO_HOOK = _delete_repo_hook
364
365
366 @register('DELETE_USER_HOOK')
367 @verify_kwargs(
368 ['_load_extension', 'username', 'full_name_or_username', 'full_contact',
369 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname',
370 'ip_addresses', 'email', 'api_key', 'last_login', 'full_name', 'active',
371 'password', 'emails', 'inherit_default_permissions', 'deleted_by'
372 ])
373 def _delete_user_hook(*args, **kwargs):
374 """
375 POST DELETE USER HOOK, this function will be executed after each
376 user is deleted kwargs available:
377
378 :param username:
379 :param full_name_or_username:
380 :param full_contact:
381 :param user_id:
382 :param name:
383 :param firstname:
384 :param short_contact:
385 :param admin:
386 :param lastname:
387 :param ip_addresses:
388 :param ldap_dn:
389 :param email:
390 :param api_key:
391 :param last_login:
392 :param full_name:
393 :param active:
394 :param password:
395 :param emails:
396 :param inherit_default_permissions:
397 :param deleted_by:
398 """
399 return 0
400 DELETE_USER_HOOK = _delete_user_hook
401
402
403 @register('PRE_PUSH_HOOK')
404 @verify_kwargs(
405 ['_load_extension', 'server_url', 'config', 'scm', 'username',
406 'ip', 'action', 'repository', 'repo_store_path'])
407 def _pre_push_hook(*args, **kwargs):
408 """
409 Post push hook
410 kwargs available:
411
412 :param server_url: url of instance that triggered this hook
413 :param config: path to .ini config used
414 :param scm: type of VS 'git' or 'hg'
415 :param username: name of user who pushed
416 :param ip: ip of who pushed
417 :param action: push
418 :param repository: repository name
419 :param repo_store_path: full path to where repositories are stored
420 """
421 return 0
422 PRE_PUSH_HOOK = _pre_push_hook
423
424
425 @register('PUSH_HOOK')
426 @verify_kwargs(
427 ['_load_extension', 'server_url', 'config', 'scm', 'username',
428 'ip', 'action', 'repository', 'repo_store_path', 'pushed_revs'])
429 def _push_hook(*args, **kwargs):
430 """
431 POST PUSH HOOK, this function will be executed after each push it's
432 executed after the build-in hook that RhodeCode uses for logging pushes
433 kwargs available:
434
435 :param server_url: url of instance that triggered this hook
436 :param config: path to .ini config used
437 :param scm: type of VS 'git' or 'hg'
438 :param username: name of user who pushed
439 :param ip: ip of who pushed
440 :param action: push
441 :param repository: repository name
442 :param repo_store_path: full path to where repositories are stored
443 :param pushed_revs: list of pushed commit ids
444 """
445 # backward compat
446 kwargs['commit_ids'] = kwargs['pushed_revs']
447
448 # fetch extra fields from repository
449 call = load_extension('extra_fields.py')
450 _extra_fields = {}
451 if call:
452 repo_extra_fields = call(**kwargs)
453 # now update if we have extra fields, they have precedence
454 # this way users can store any configuration inside the database per
455 # repo
456 for key, data in repo_extra_fields.items():
457 kwargs[key] = data['field_value']
458 _extra_fields[key] = data['field_value']
459
460 # fetch pushed commits, from commit_ids list
461 call = load_extension('extract_commits.py')
462 extracted_commits = {}
463 if call:
464 extracted_commits = call(**kwargs)
465 # store the commits for the next call chain
466 kwargs['COMMITS'] = extracted_commits
467
468 # slack !
469 call = load_extension('slack_push_notify.py')
470 if call:
471 kwargs.update(CONFIG.slack.default_plugin_config)
472 call(**kwargs)
473
474 # fetch redmine issues from given commits
475 call = load_extension('extract_redmine_issues.py')
476 issues = {}
477 if call:
478 issues = call(**kwargs)
479
480 # redmine smart commits
481 call = load_extension('redmine_smart_commits.py')
482 if call:
483 kwargs['REDMINE_ISSUES'] = issues
484
485 kwargs['redmine_tracker_url'] = kwargs.pop(
486 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url
487 kwargs['redmine_api_key'] = kwargs.pop(
488 'redmine_api_key', '') or CONFIG.redmine.api_key
489 kwargs['redmine_status_resolved_id'] = kwargs.pop(
490 'redmine_status_resolved_id', '') or CONFIG.redmine.default_status_resolved_id
491 kwargs['redmine_project_id'] = kwargs.pop(
492 'redmine_project_id', '') or CONFIG.redmine.default_project_id
493 call(**kwargs)
494
495 return 0
496 PUSH_HOOK = _push_hook
497
498
499 @register('PRE_PULL_HOOK')
500 @verify_kwargs(
501 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
502 'action', 'repository'])
503 def _pre_pull_hook(*args, **kwargs):
504 """
505 Post pull hook
506 kwargs available::
507
508 :param server_url: url of instance that triggered this hook
509 :param config: path to .ini config used
510 :param scm: type of VS 'git' or 'hg'
511 :param username: name of user who pulled
512 :param ip: ip of who pulled
513 :param action: pull
514 :param repository: repository name
515 """
516 return 0
517 PRE_PULL_HOOK = _pre_pull_hook
518
519
520 @register('PULL_HOOK')
521 @verify_kwargs(
522 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
523 'action', 'repository'])
524 def _pull_hook(*args, **kwargs):
525 """
526 POST PULL HOOK, this function will be executed after each push it's
527 executed after the build-in hook that RhodeCode uses for logging pulls
528
529 kwargs available:
530
531 :param server_url: url of instance that triggered this hook
532 :param config: path to .ini config used
533 :param scm: type of VS 'git' or 'hg'
534 :param username: name of user who pulled
535 :param ip: ip of who pulled
536 :param action: pull
537 :param repository: repository name
538 """
539 return 0
540 PULL_HOOK = _pull_hook
541
542
543 # =============================================================================
544 # PULL REQUEST RELATED HOOKS
545 # =============================================================================
546 @register('CREATE_PULL_REQUEST')
547 @verify_kwargs(
548 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
549 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
550 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
551 'mergeable', 'source', 'target', 'author', 'reviewers'])
552 def _create_pull_request_hook(*args, **kwargs):
553 """
554
555 """
556 # extract extra fields and default reviewers from target
557 kwargs['REPOSITORY'] = kwargs['target']['repository']
558
559 call = load_extension('extra_fields.py')
560 if call:
561 repo_extra_fields = call(**kwargs)
562 # now update if we have extra fields, they have precedence
563 # this way users can store any configuration inside the database per
564 # repo
565 for key, data in repo_extra_fields.items():
566 kwargs[key] = data['field_value']
567
568 call = load_extension('default_reviewers.py')
569 if call:
570 # read default_reviewers key propagated from extra fields
571 kwargs['default_reviewers'] = map(string.strip, kwargs.pop(
572 'default_reviewers', '').split(','))
573 call(**kwargs)
574
575 # extract below from source repo as commits are there
576 kwargs['REPOSITORY'] = kwargs['source']['repository']
577
578 # # fetch pushed commits, from commit_ids list
579 # call = load_extension('extract_commits.py')
580 # extracted_commits = {}
581 # if call:
582 # extracted_commits = call(**kwargs)
583 # # store the commits for the next call chain
584 # kwargs['COMMITS'] = extracted_commits
585 #
586 # # fetch issues from given commits
587 # call = load_extension('extract_redmine_issues.py')
588 # issues = {}
589 # if call:
590 # issues = call(**kwargs)
591 #
592 # # redmine smart pr update
593 # call = load_extension('redmine_pr_flow.py')
594 # if call:
595 # # updates kwargs on the fly
596 # configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
597 # call(**kwargs)
598 #
599 # # slack notification on merging PR
600 # call = load_extension('slack_message.py')
601 # if call:
602 # kwargs.update(CONFIG.slack.default_plugin_config)
603 # kwargs['SLACK_ROOM'] = '#develop'
604 # kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was created.' % (
605 # kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
606 #
607 # call(**kwargs)
608
609 return 0
610 CREATE_PULL_REQUEST = _create_pull_request_hook
611
612
613 @register('REVIEW_PULL_REQUEST')
614 @verify_kwargs(
615 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
616 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
617 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
618 'mergeable', 'source', 'target', 'author', 'reviewers'])
619 def _review_pull_request_hook(*args, **kwargs):
620 """
621
622 """
623 # extract extra fields and default reviewers from target
624 kwargs['REPOSITORY'] = kwargs['target']['repository']
625
626 # fetch extra fields
627 call = load_extension('extra_fields.py')
628 if call:
629 repo_extra_fields = call(**kwargs)
630 # now update if we have extra fields, they have precedence
631 # this way users can store any configuration inside the database per
632 # repo
633 for key, data in repo_extra_fields.items():
634 kwargs[key] = data['field_value']
635
636 # extract below from source repo as commits are there
637 kwargs['REPOSITORY'] = kwargs['source']['repository']
638
639 # fetch pushed commits, from commit_ids list
640 call = load_extension('extract_commits.py')
641 extracted_commits = {}
642 if call:
643 extracted_commits = call(**kwargs)
644 # store the commits for the next call chain
645 kwargs['COMMITS'] = extracted_commits
646
647 # fetch issues from given commits
648 call = load_extension('extract_redmine_issues.py')
649 issues = {}
650 if call:
651 issues = call(**kwargs)
652
653 # redmine smart pr update
654 call = load_extension('redmine_pr_flow.py')
655 if call:
656 # updates kwargs on the fly
657 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
658 call(**kwargs)
659
660 return 0
661 REVIEW_PULL_REQUEST = _review_pull_request_hook
662
663
664 @register('UPDATE_PULL_REQUEST')
665 @verify_kwargs(
666 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
667 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
668 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
669 'mergeable', 'source', 'target', 'author', 'reviewers'])
670 def _update_pull_request_hook(*args, **kwargs):
671 """
672
673 """
674 # extract extra fields and default reviewers from target
675 kwargs['REPOSITORY'] = kwargs['target']['repository']
676
677 # fetch extra fields
678 call = load_extension('extra_fields.py')
679 if call:
680 repo_extra_fields = call(**kwargs)
681 # now update if we have extra fields, they have precedence
682 # this way users can store any configuration inside the database per
683 # repo
684 for key, data in repo_extra_fields.items():
685 kwargs[key] = data['field_value']
686
687 # extract below from source repo as commits are there
688 kwargs['REPOSITORY'] = kwargs['source']['repository']
689
690 # fetch pushed commits, from commit_ids list
691 call = load_extension('extract_commits.py')
692 extracted_commits = {}
693 if call:
694 extracted_commits = call(**kwargs)
695 # store the commits for the next call chain
696 kwargs['COMMITS'] = extracted_commits
697
698 # fetch issues from given commits
699 call = load_extension('extract_redmine_issues.py')
700 issues = {}
701 if call:
702 issues = call(**kwargs)
703
704 # redmine smart pr updated
705 call = load_extension('redmine_pr_flow.py')
706 if call:
707 # updates kwargs on the fly
708 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
709 call(**kwargs)
710
711 return 0
712 UPDATE_PULL_REQUEST = _update_pull_request_hook
713
714
715 @register('MERGE_PULL_REQUEST')
716 @verify_kwargs(
717 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
718 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
719 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
720 'mergeable', 'source', 'target', 'author', 'reviewers'])
721 def _merge_pull_request_hook(*args, **kwargs):
722 """
723
724 """
725 # extract extra fields and default reviewers from target
726 kwargs['REPOSITORY'] = kwargs['target']['repository']
727
728 # fetch extra fields
729 call = load_extension('extra_fields.py')
730 if call:
731 repo_extra_fields = call(**kwargs)
732 # now update if we have extra fields, they have precedence
733 # this way users can store any configuration inside the database per
734 # repo
735 for key, data in repo_extra_fields.items():
736 kwargs[key] = data['field_value']
737
738 # extract below from source repo as commits are there
739 kwargs['REPOSITORY'] = kwargs['source']['repository']
740
741 # fetch pushed commits, from commit_ids list
742 call = load_extension('extract_commits.py')
743 extracted_commits = {}
744 if call:
745 extracted_commits = call(**kwargs)
746 # store the commits for the next call chain
747 kwargs['COMMITS'] = extracted_commits
748
749 # fetch issues from given commits
750 call = load_extension('extract_redmine_issues.py')
751 issues = {}
752 if call:
753 issues = call(**kwargs)
754
755 # redmine smart pr update
756 call = load_extension('redmine_pr_flow.py')
757 if call:
758 # updates kwargs on the fly
759 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
760 call(**kwargs)
761
762 # slack notification on merging PR
763 call = load_extension('slack_message.py')
764 if call:
765 kwargs.update(CONFIG.slack.default_plugin_config)
766 kwargs['SLACK_ROOM'] = '#develop'
767 kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % (
768 kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
769 call(**kwargs)
770
771 return 0
772 MERGE_PULL_REQUEST = _merge_pull_request_hook
773
774
775 @register('CLOSE_PULL_REQUEST')
776 @verify_kwargs(
777 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
778 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
779 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
780 'mergeable', 'source', 'target', 'author', 'reviewers'])
781 def _close_pull_request_hook(*args, **kwargs):
782 """
783
784 """
785 # extract extra fields and default reviewers from target
786 kwargs['REPOSITORY'] = kwargs['target']['repository']
787
788 # fetch extra fields
789 call = load_extension('extra_fields.py')
790 if call:
791 repo_extra_fields = call(**kwargs)
792 # now update if we have extra fields, they have precedence
793 # this way users can store any configuration inside the database per
794 # repo
795 for key, data in repo_extra_fields.items():
796 kwargs[key] = data['field_value']
797
798 # extract below from source repo as commits are there
799 kwargs['REPOSITORY'] = kwargs['source']['repository']
800
801 # fetch pushed commits, from commit_ids list
802 call = load_extension('extract_commits.py')
803 extracted_commits = {}
804 if call:
805 extracted_commits = call(**kwargs)
806 # store the commits for the next call chain
807 kwargs['COMMITS'] = extracted_commits
808
809 # fetch issues from given commits
810 call = load_extension('extract_redmine_issues.py')
811 issues = {}
812 if call:
813 issues = call(**kwargs)
814
815 # redmine smart pr update
816 call = load_extension('redmine_pr_flow.py')
817 if call:
818 # updates kwargs on the fly
819 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
820 call(**kwargs)
821
822 return 0
823 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -1,59 +0,0 b''
1 .. _dev-plug:
2
3 Developing Plugins/Extensions
4 -----------------------------
5
6 An Extension or a Plugin is simply a |PY| module with a ``run`` method that
7 expects a number of parameters, depending on which event it is listening
8 for. To get an extension working, use the following steps:
9
10 1. Create an extension or plugin using the below example.
11 2. Save the plugin inside the
12 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` folder.
13 3. Add a hook to the
14 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init__.py` file.
15 For more information, see :ref:`event-listener`.
16 4. Restart your |RCM| instance.
17
18 Extension example
19 ^^^^^^^^^^^^^^^^^
20
21 In the following example, the ``run`` method listens for a push to a |repo|
22 and parses the commit.
23
24 .. code-block:: python
25
26 def run(*args, **kwargs):
27
28 revs = kwargs.get('pushed_revs')
29 if not revs:
30 return 0
31
32 from rhodecode.lib.utils2 import extract_mentioned_users
33 from rhodecode.model.db import Repository
34
35 repo = Repository.get_by_repo_name(kwargs['repository'])
36 changesets = []
37 reviewers = []
38
39 # reviewer fields from extra_fields, users can store their custom
40 # reviewers inside the extra fields to pre-define a set of people who
41 # will get notifications about changesets
42 field_key = kwargs.get('reviewers_extra_field')
43 if field_key:
44 for xfield in repo.extra_fields:
45 if xfield.field_key == field_key:
46 reviewers.extend(xfield.field_value.split())
47
48 vcs_repo = repo.scm_instance_no_cache()
49 for rev in kwargs['pushed_revs']:
50 cs = vcs_repo.get_changeset(rev) # or get_commit. See API doc
51 cs_data = cs.__json__()
52 cs_data['mentions'] = extract_mentioned_users(cs_data['message'])
53 cs_data['reviewers'] = reviewers
54 # optionally add more logic to parse the commits, like reading extra
55 # fields of repository to read managers of reviewers
56 changesets.append(cs_data)
57
58 return changesets
59 No newline at end of file
@@ -1,19 +0,0 b''
1 .. _int-full-blown:
2
3 Extensions Extended Example
4 ---------------------------
5
6 This example
7 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file
8 has been highlighted to show a Redmine integration in full. To extend your
9 |RCE| instances, use the below example to integrate with other
10 applications.
11
12 This example file also contains a Slack integration, but it is not
13 highlighted.
14
15
16 .. literalinclude:: example-ext.py
17 :language: python
18 :emphasize-lines: 186,193-198,210-218,474-496,648-660,749-760,810-822
19 :linenos:
@@ -1,86 +0,0 b''
1 .. _hooks:
2
3 Hooks
4 -----
5
6 Within |RCM| there are two types of supported hooks.
7
8 * **Internal built-in hooks**: The internal |hg| or |git| hooks are
9 triggered by different VCS operations, like push, pull,
10 or clone and are non-configurable, but you can add your own VCS hooks,
11 see :ref:`custom-hooks`.
12 * **User defined hooks**: User defined hooks centre around the lifecycle of
13 certain actions such are |repo| creation, user creation etc. The actions
14 these hooks trigger can be rejected based on the API permissions of the
15 user calling them.
16
17 Those custom hooks can be called using |RCT|, see :ref:`rc-tools`. To create
18 a custom hook, see the :ref:`event-listener` section.
19
20 .. _event-listener:
21
22 Making your Extension listen for Events
23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
24
25 To create a hook to work with a plugin or extension,
26 you need configure a listener in the
27 :file:`/home/{user}/{instance-id}/rcextensions/__init__.py` file,
28 and use the ``load_extension`` method.
29
30 Use the following example to create your extensions.
31 In this example:
32
33 * The hook is calling the ``('my_post_push_extension.py')`` extension.
34 * The hook is listening to |RCM| for pushes to |repos|.
35 * This highlighted code is the hook, and configured in the ``__init__.py`` file.
36 * It is inserted into the ``def _pushhook(*args, **kwargs)`` section,
37 if it is not in the default ``__ini__.py`` file, use the below
38 non-highlighted section to create it.
39
40 .. code-block:: python
41 :emphasize-lines: 23-38
42
43 # ==========================================================================
44 # POST PUSH HOOK
45 # ==========================================================================
46
47 # this function will be executed after each push is executed after the
48 # build-in hook that RhodeCode uses for logging pushes
49 def _pushhook(*args, **kwargs):
50 """
51 Post push hook
52 kwargs available:
53
54 :param server_url: url of instance that triggered this hook
55 :param config: path to .ini config used
56 :param scm: type of VS 'git' or 'hg'
57 :param username: name of user who pushed
58 :param ip: ip of who pushed
59 :param action: push
60 :param repository: repository name
61 :param repo_store_path: full path to where repositories are stored
62 :param pushed_revs: list of pushed revisions
63 """
64
65 # Your hook code goes in here
66 call = load_extension('my_post_push_extension.py')
67 if call:
68 # extra arguments in kwargs
69 call_kwargs = dict()
70 call_kwargs.update(kwargs)
71 my_kw = {
72 'reviewers_extra_field': 'reviewers',
73 # defines if we have a comma
74 # separated list of reviewers
75 # in this repo stored in extra_fields
76 }
77 call_kwargs.update(my_kw) # pass in hook args
78 parsed_revs = call(**call_kwargs)
79 # returns list of dicts with changesets data
80
81 # Default code
82 return 0
83 PUSH_HOOK = _pushhook
84
85 Once your plugin and hook are configured, restart your instance of |RCM| and
86 your event listener will triggered as soon as a user pushes to a |repo|.
@@ -1,55 +0,0 b''
1 .. _install-rcx:
2
3 Install |RCX|
4 -------------
5
6 To install |RCX|, you need to have |RCT| installed. See the :ref:`install-tools`
7 and :ref:`tools-cli` sections. Use the ``--plugins`` option with
8 the ``rhodecode-extensions`` argument.
9
10 Upgrading |RCX|
11 ^^^^^^^^^^^^^^^
12
13 .. important::
14
15 You should back up any plugins or extensions that you have created before
16 continuing.
17
18 To upgrade your |RCX|, use the following example:
19
20 1. From inside the |RCT| virtualenv, upgrade to the latest version:
21
22 .. code-block:: bash
23
24 (venv)$ pip install -U https://my.rhodecode.com/dl/rhodecode-tools/latest
25 Downloading/unpacking https://my.rhodecode.com/dl/rhodecode-tools/latest
26 Downloading latest (143kB): 143kB downloaded
27 Running setup.py (path:/tmp/pip-9qYsxf-build/setup.py) egg_info
28 for package from https://my.rhodecode.com/dl/rhodecode-tools/latest
29
30 2. Once |RCT| are upgraded to the latest version, you can install the latest
31 extensions using the following example:
32
33 .. code-block:: bash
34
35 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
36 --ini-file=rhodecode.ini --plugins
37
38 Extension file already exists, do you want to overwrite it? [y/N]: y
39 Writen new extensions file to rcextensions
40 Copied hipchat_push_notify.py plugin to rcextensions
41 Copied jira_pr_flow.py plugin to rcextensions
42 Copied default_reviewers.py plugin to rcextensions
43 Copied extract_commits.py plugin to rcextensions
44 Copied extract_issues.py plugin to rcextensions
45 Copied redmine_pr_flow.py plugin to rcextensions
46 Copied extra_fields.py plugin to rcextensions
47 Copied jira_smart_commits.py plugin to rcextensions
48 Copied http_notify.py plugin to rcextensions
49 Copied slack_push_notify.py plugin to rcextensions
50 Copied slack_message.py plugin to rcextensions
51 Copied extract_jira_issues.py plugin to rcextensions
52 Copied extract_redmine_issues.py plugin to rcextensions
53 Copied redmine_smart_commits.py plugin to rcextensions
54 Copied send_mail.py plugin to rcextensions
55
@@ -1,151 +0,0 b''
1 .. _slack-int:
2
3 Integrate Slack
4 ===============
5
6 To integrate |RCE| and Slack, you need to configure some things on the Slack
7 side of the integration, and some things on the |RCE| side.
8
9 On the Slack side you need to allow incoming webhooks, see their
10 documentation on this, `Slack Webhooks`_. You will also need to get an
11 Authorization Token from Slack that will allow |RCE| to post to your account.
12
13 On the |RCE| side, this is an overview of what you need to do:
14
15 1. Configure the built-in Slack extensions to post to the correct Slack URL.
16 2. Set your Slack authentication details in the |RCX| :file:`__init.py__` file.
17 3. Configure the different hooks in the :file:`__init.py__` file to extract
18 whatever information you want from |RCE|, and then using the Slack extensions
19 post that information to your Slack channel.
20
21 .. hint::
22
23 The below examples should help you to get started. Once you have your
24 integration up and running, there is a more detailed Slack integration in
25 the :ref:`int-full-blown` section.
26
27 Configure Built-in Extensions
28 -----------------------------
29
30 |RCE| comes with 3 Slack extensions: ``slack_message.py``,
31 ``slack_push_notify.py``, and ``slack.py``. The default
32 location is :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions`.
33
34 To enable these to post to your Slack account, configure each of
35 these files with the following Slack details.
36
37 .. code-block:: python
38
39 BASE_URL = 'https://your.slack.com/api/link'
40 INCOMING_WEBHOOK_URL = 'https://hooks.slack.com/services/your/hook/link'
41 API_VERSION = 1
42
43 Configure |RCE| to Post to Slack
44 --------------------------------
45
46 In the |RCX| :file:`__init.py__` file, configure your Slack authentication
47 details. The default location is
48 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions`
49
50 .. code-block:: python
51
52 CONFIG = DotDict(
53 slack=DotDict(
54 api_key='api-key',
55 api_url='slack-incoming-hook-url',
56 default_room='#slack-channel',
57 default_plugin_config={},
58 ),
59 )
60
61 # slack conf
62 CONFIG.slack.default_plugin_config = {
63 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url,
64 'SLACK_TOKEN': CONFIG.slack.api_key,
65 'SLACK_ROOM': CONFIG.slack.default_room,
66 'SLACK_FROM': 'RhodeCode',
67 'SLACK_FROM_ICON_EMOJI': ':rhodecode:',
68 }
69
70 Add Push Notifications to Slack
71 -------------------------------
72
73 To add notification to Slack when someone pushes to |RCE|, configure the push
74 hook to extract the commits pushed, and then call the built-in
75 ``slack_push_notify.py`` extension to post them into your chosen Slack
76 channel. To do this, add the following code to the push hook section of the
77 :file:`__init.py__` file
78
79 .. code-block:: python
80 :emphasize-lines: 10-16,18-22
81
82 def _push_hook(*args, **kwargs):
83 """
84 POST PUSH HOOK, this function will be executed after each push, it's
85 executed after the build-in hook that RhodeCode uses for logging pushes
86 kwargs available:
87 """
88 # backward compat
89 kwargs['commit_ids'] = kwargs['pushed_revs']
90
91 # fetch pushed commits, from commit_ids list
92 call = load_extension('extract_commits.py')
93 extracted_commits = {}
94 if call:
95 extracted_commits = call(**kwargs)
96 # store the commits for the next call chain
97 kwargs['COMMITS'] = extracted_commits
98
99 # slack !
100 call = load_extension('slack_push_notify.py')
101 if call:
102 kwargs.update(CONFIG.slack.default_plugin_config)
103 call(**kwargs)
104 return 0
105 PUSH_HOOK = _push_hook
106
107
108 Add Pull Request Notifications to Slack
109 ---------------------------------------
110
111 To add |pr| notifications to Slack, use the following example. This example
112 shows a merged |pr| notification. You can add similar notifications to the
113 following hooks in the :file:`__init.py__` file, and for those examples see
114 the :ref:`int-full-blown` section:
115
116 * ``_create_pull_request_hook``
117 * ``_review_pull_request_hook``
118 * ``_update_pull_request_hook``
119 * ``_close_pull_request_hook``
120
121 .. code-block:: python
122 :emphasize-lines: 5-23
123
124 def _merge_pull_request_hook(*args, **kwargs):
125 """
126
127 """
128 # extract below from source repo as commits are there
129 kwargs['REPOSITORY'] = kwargs['source']['repository']
130
131 # fetch pushed commits, from commit_ids list
132 call = load_extension('extract_commits.py')
133 extracted_commits = {}
134 if call:
135 extracted_commits = call(**kwargs)
136 # store the commits for the next call chain
137 kwargs['COMMITS'] = extracted_commits
138
139 # slack notification on merging PR
140 call = load_extension('slack_message.py')
141 if call:
142 kwargs.update(CONFIG.slack.default_plugin_config)
143 kwargs['SLACK_ROOM'] = '#develop'
144 kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % (
145 kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
146 call(**kwargs)
147
148 return 0
149 MERGE_PULL_REQUEST = _merge_pull_request_hook
150
151 .. _Slack Webhooks: https://api.slack.com/incoming-webhooks
@@ -1,53 +0,0 b''
1 .. _rc-ext:
2
3 |RCX|
4 -----
5
6 |RCX| add additional functionality for push/pull/create/delete |repo| hooks.
7 These hooks can be used to send signals to build-bots such as `Jenkins`_. It
8 also adds built in plugin and extension support. Once installed, you will see
9 a :file:`rcextensions` folder in the instance directory, for example:
10 :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
11
12 Built-in Plugins
13 ^^^^^^^^^^^^^^^^
14
15 * A number of `Jira`_ plugins, enabling you to integrate with that issue
16 tracker: ``extract_jira_issues.py``, ``jira_pr_flow.py``,
17 ``jira_smart_commits.py``
18 * A number of `Redmine`_ plugins, enabling you to integrate with that issue
19 tracker: ``extract_redmine_issues.py``, ``redmine_pr_flow.py``,
20 ``redmine_smart_commits.py``.
21 * ``hipchat.py`` and ``hipchat_push.py`` enable you to integrate with
22 `HipChat`_ and set channel or user notifications.
23 * ``slack.py``, ``slack_message.py``, and ``slack_push_notify.py`` enable
24 you to integrate with `Slack`_ and set channel or user notifications.
25
26 Built-in Extensions
27 ^^^^^^^^^^^^^^^^^^^
28
29 * ``commit_parser.py``: Enables you to parse commit messages,
30 and set a list of users to get notifications about change sets.
31 * ``default_reviewers.py``: Enables you to add default reviewers to a |pr|.
32 * ``extra_fields.py``: Returns a list of extra fields added to a |repo|.
33 * ``http_notify``: Enables you to send data over a web hook.
34 * ``mail.py`` : This extension uses the |RCE| mail configuration from the
35 instance :file:`rhodecode.ini` file to send email.
36 * ``push_post.py``: Enables you to set up push based actions such as
37 automated Jenkins builds.
38
39 Event Listeners
40 ^^^^^^^^^^^^^^^
41
42 To enable the extensions to listen to the different events that they are
43 configured for, you need to also set up an event listener (hook). Event
44 listeners are configured in the
45 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.__.py` file.
46
47 For more details, see the example hook in :ref:`event-listener`.
48
49 .. _Jenkins: http://jenkins-ci.org/
50 .. _HipChat: https://www.hipchat.com/
51 .. _Slack: https://slack.com/
52 .. _Redmine: http://www.redmine.org/
53 .. _Jira: https://www.atlassian.com/software/jira
@@ -1,30 +0,0 b''
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
2 { fetchbower, buildEnv }:
3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
4 (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267")
5 (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1")
7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45")
8 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#2.1.1" "PolymerElements/paper-tooltip#^2.1.1" "0ja9vz4xps7dxfx6kmrwq0gifbjsyc3pk9l3hd5233ss72ghlvgb")
9 (fetchbower "paper-toast" "PolymerElements/paper-toast#2.1.2" "PolymerElements/paper-toast#^2.1.2" "0mkj9ayjx2l9hvrz4kw3yjbgrs9w873k05ywv94nh92mzpjkxn04")
10 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#2.1.1" "PolymerElements/paper-toggle-button#^2.1.1" "1rl5ar3ny6r3v9hr8s68v8b3zh5yl52pikhi4b9iv9grv29g5999")
11 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#2.1.3" "PolymerElements/iron-ajax#^2.1.3" "187zb6lkv18yapl292qhn611mbl4i2bqs2dimlwmdjaln285nc1l")
12 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#2.2.0" "PolymerElements/iron-autogrow-textarea#^2.2.0" "1cx7g49m20z08x25z24g2pvv6m6dwfbkga3nsw0rpi3jk7xhznqw")
13 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#2.1.2" "PolymerElements/iron-a11y-keys#^2.1.2" "0zdn3bzfrk88iwahmmzvcjn3m90zga1l8dx42b365n8if0n0zapj")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.3.5" "webcomponents/shadycss#^v1.1.0" "1xp07d6jlmc3ywg4cdp2nijwi0vrbzw468242xz0s6zx5z2n2wzf")
15 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk")
16 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#2.1.1" "PolymerElements/paper-behaviors#1 - 2" "0wzyznmy1q64jsm6lck0xma92lg2hz9h9m05r68iy20iyrvbjld7")
17 (fetchbower "paper-styles" "PolymerElements/paper-styles#2.1.0" "PolymerElements/paper-styles#1 - 2" "0xzsd7pvjsk7lgcmvx4q0dvps40q3mymkx26zgs8ns91s1ssfqbx")
18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#2.1.0" "PolymerElements/iron-a11y-announcer#1 - 2" "1hvmw76im8y3pxmg1yfnlkzap429q9i4v1z42y7m8lz0996jmxrz")
19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#2.3.4" "PolymerElements/iron-overlay-behavior#1 - 2" "0hk2fxhfz7kg27349qz1c87vq6nfdcnjr9az3q95ak3rigsb71wg")
20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#2.2.1" "PolymerElements/iron-fit-behavior#1 - 2" "0v89am4r2fncr7m9k0f2xqh5bvgn2dqjjc7p515ix4grk89whbs3")
21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#2.1.1" "PolymerElements/iron-checked-element-behavior#1 - 2" "00gpvnb7anspadw59av7lca6p03qlx59dgnhw3lqf5v223dsh0l3")
22 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#2.1.1" "PolymerElements/iron-behaviors#1 - 2" "0c71l1il76jg8gvyh8bwlqraif53gfnz5700vpg35qyr1biwbr1w")
23 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#2.1.0" "PolymerElements/iron-validatable-behavior#1 - 2" "1j65zv7hcxdcyyanzhp2wap3bnx7cz8ghd44m12fad2206jj6ysi")
24 (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#2.1.1" "PolymerElements/iron-a11y-keys-behavior#1 - 2" "0jsw7wvh4wzcjqdbvxyha99h1ph61lykyyyvdb6hm8m8w40bhs9b")
25 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#2.1.1" "PolymerElements/paper-ripple#1 - 2" "0sam6w83nxf9mss79j6hjfsx0288pf4hwr1bw5xclzgpddcjmrm5")
26 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s")
27 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#2.1.1" "PolymerElements/iron-resizable-behavior#1 - 2" "0169rg6kby0ypfiwbkin46ywaszwj7r91yn081yqd96l1115aqnk")
28 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#2.1.3" "PolymerElements/iron-form-element-behavior#1 - 2" "1c83kkfqvb5pdlvrhad3l7b11i244a8lykc8kzfnb9ya0xrln0cn")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40")
30 ]; }
@@ -1,33 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import imp
22
23
24 def create_module(name, path):
25 """
26 Returns module created *on the fly*. Returned module would have name same
27 as given ``name`` and would contain code read from file at the given
28 ``path`` (it may also be a zip or package containing *__main__* module).
29 """
30 module = imp.new_module(name)
31 module.__file__ = path
32 execfile(path, module.__dict__)
33 return module
1 NO CONTENT: file was removed
@@ -1,13 +0,0 b''
1
2
3 class InvalidMessage(RuntimeError):
4 """
5 Raised if message is missing vital headers, such
6 as recipients or sender address.
7 """
8
9
10 class BadHeaders(RuntimeError):
11 """
12 Raised if message contains newlines in headers.
13 """
@@ -1,188 +0,0 b''
1 from rhodecode.lib.rcmail.response import MailResponse
2
3 from rhodecode.lib.rcmail.exceptions import BadHeaders
4 from rhodecode.lib.rcmail.exceptions import InvalidMessage
5
6
7 class Attachment(object):
8 """
9 Encapsulates file attachment information.
10
11 :param filename: filename of attachment
12 :param content_type: file mimetype
13 :param data: the raw file data, either as string or file obj
14 :param disposition: content-disposition (if any)
15 """
16
17 def __init__(self,
18 filename=None,
19 content_type=None,
20 data=None,
21 disposition=None):
22
23 self.filename = filename
24 self.content_type = content_type
25 self.disposition = disposition or 'attachment'
26 self._data = data
27
28 @property
29 def data(self):
30 if isinstance(self._data, basestring):
31 return self._data
32 self._data = self._data.read()
33 return self._data
34
35
36 class Message(object):
37 """
38 Encapsulates an email message.
39
40 :param subject: email subject header
41 :param recipients: list of email addresses
42 :param body: plain text message
43 :param html: HTML message
44 :param sender: email sender address
45 :param cc: CC list
46 :param bcc: BCC list
47 :param extra_headers: dict of extra email headers
48 :param attachments: list of Attachment instances
49 :param recipients_separator: alternative separator for any of
50 'From', 'To', 'Delivered-To', 'Cc', 'Bcc' fields
51 """
52
53 def __init__(self,
54 subject=None,
55 recipients=None,
56 body=None,
57 html=None,
58 sender=None,
59 cc=None,
60 bcc=None,
61 extra_headers=None,
62 attachments=None,
63 recipients_separator="; "):
64
65 self.subject = subject or ''
66 self.sender = sender
67 self.body = body
68 self.html = html
69
70 self.recipients = recipients or []
71 self.attachments = attachments or []
72 self.cc = cc or []
73 self.bcc = bcc or []
74 self.extra_headers = extra_headers or {}
75
76 self.recipients_separator = recipients_separator
77
78 @property
79 def send_to(self):
80 return set(self.recipients) | set(self.bcc or ()) | set(self.cc or ())
81
82 def to_message(self):
83 """
84 Returns raw email.Message instance.Validates message first.
85 """
86
87 self.validate()
88
89 return self.get_response().to_message()
90
91 def get_response(self):
92 """
93 Creates a Lamson MailResponse instance
94 """
95
96 response = MailResponse(Subject=self.subject,
97 To=self.recipients,
98 From=self.sender,
99 Body=self.body,
100 Html=self.html,
101 separator=self.recipients_separator)
102
103 if self.cc:
104 response.base['Cc'] = self.cc
105
106 for attachment in self.attachments:
107
108 response.attach(attachment.filename,
109 attachment.content_type,
110 attachment.data,
111 attachment.disposition)
112
113 response.update(self.extra_headers)
114
115 return response
116
117 def _get_headers(self):
118 headers = [self.subject, self.sender]
119 headers += list(self.send_to)
120 headers += self.extra_headers.values()
121 return headers
122
123 def is_bad_headers(self):
124 """
125 Checks for bad headers i.e. newlines in subject, sender or recipients.
126 """
127
128 headers = self._get_headers()
129
130 for val in headers:
131 for c in '\r\n':
132 if c in val:
133 return True
134 return False
135
136 def validate(self):
137 """
138 Checks if message is valid and raises appropriate exception.
139 """
140
141 if not self.recipients:
142 raise InvalidMessage("No recipients have been added")
143
144 if not self.body and not self.html:
145 raise InvalidMessage("No body has been set")
146
147 if not self.sender:
148 raise InvalidMessage("No sender address has been set")
149
150 if self.is_bad_headers():
151 headers = self._get_headers()
152 raise BadHeaders(headers)
153
154 def add_recipient(self, recipient):
155 """
156 Adds another recipient to the message.
157
158 :param recipient: email address of recipient.
159 """
160
161 self.recipients.append(recipient)
162
163 def add_cc(self, recipient):
164 """
165 Adds an email address to the CC list.
166
167 :param recipient: email address of recipient.
168 """
169
170 self.cc.append(recipient)
171
172 def add_bcc(self, recipient):
173 """
174 Adds an email address to the BCC list.
175
176 :param recipient: email address of recipient.
177 """
178
179 self.bcc.append(recipient)
180
181 def attach(self, attachment):
182 """
183 Adds an attachment to the message.
184
185 :param attachment: an **Attachment** instance.
186 """
187
188 self.attachments.append(attachment)
@@ -1,454 +0,0 b''
1 # The code in this module is entirely lifted from the Lamson project
2 # (http://lamsonproject.org/). Its copyright is:
3
4 # Copyright (c) 2008, Zed A. Shaw
5 # All rights reserved.
6
7 # It is provided under this license:
8
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions are met:
11
12 # * Redistributions of source code must retain the above copyright notice, this
13 # list of conditions and the following disclaimer.
14
15 # * Redistributions in binary form must reproduce the above copyright notice,
16 # this list of conditions and the following disclaimer in the documentation
17 # and/or other materials provided with the distribution.
18
19 # * Neither the name of the Zed A. Shaw nor the names of its contributors may
20 # be used to endorse or promote products derived from this software without
21 # specific prior written permission.
22
23 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28 # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 # POSSIBILITY OF SUCH DAMAGE.
35
36 import os
37 import mimetypes
38 import string
39 from email import encoders
40 from email.charset import Charset
41 from email.utils import parseaddr
42 from email.mime.base import MIMEBase
43
44 ADDRESS_HEADERS_WHITELIST = ['From', 'To', 'Delivered-To', 'Cc']
45 DEFAULT_ENCODING = "utf-8"
46 VALUE_IS_EMAIL_ADDRESS = lambda v: '@' in v
47
48
49 def normalize_header(header):
50 return string.capwords(header.lower(), '-')
51
52
53 class EncodingError(Exception):
54 """Thrown when there is an encoding error."""
55 pass
56
57
58 class MailBase(object):
59 """MailBase is used as the basis of lamson.mail and contains the basics of
60 encoding an email. You actually can do all your email processing with this
61 class, but it's more raw.
62 """
63 def __init__(self, items=()):
64 self.headers = dict(items)
65 self.parts = []
66 self.body = None
67 self.content_encoding = {'Content-Type': (None, {}),
68 'Content-Disposition': (None, {}),
69 'Content-Transfer-Encoding': (None, {})}
70
71 def __getitem__(self, key):
72 return self.headers.get(normalize_header(key), None)
73
74 def __len__(self):
75 return len(self.headers)
76
77 def __iter__(self):
78 return iter(self.headers)
79
80 def __contains__(self, key):
81 return normalize_header(key) in self.headers
82
83 def __setitem__(self, key, value):
84 self.headers[normalize_header(key)] = value
85
86 def __delitem__(self, key):
87 del self.headers[normalize_header(key)]
88
89 def __nonzero__(self):
90 return self.body is not None or len(self.headers) > 0 or len(self.parts) > 0
91
92 def keys(self):
93 """Returns the sorted keys."""
94 return sorted(self.headers.keys())
95
96 def attach_file(self, filename, data, ctype, disposition):
97 """
98 A file attachment is a raw attachment with a disposition that
99 indicates the file name.
100 """
101 assert filename, "You can't attach a file without a filename."
102 ctype = ctype.lower()
103
104 part = MailBase()
105 part.body = data
106 part.content_encoding['Content-Type'] = (ctype, {'name': filename})
107 part.content_encoding['Content-Disposition'] = (disposition,
108 {'filename': filename})
109 self.parts.append(part)
110
111 def attach_text(self, data, ctype):
112 """
113 This attaches a simpler text encoded part, which doesn't have a
114 filename.
115 """
116 ctype = ctype.lower()
117
118 part = MailBase()
119 part.body = data
120 part.content_encoding['Content-Type'] = (ctype, {})
121 self.parts.append(part)
122
123 def walk(self):
124 for p in self.parts:
125 yield p
126 for x in p.walk():
127 yield x
128
129
130 class MailResponse(object):
131 """
132 You are given MailResponse objects from the lamson.view methods, and
133 whenever you want to generate an email to send to someone. It has the
134 same basic functionality as MailRequest, but it is designed to be written
135 to, rather than read from (although you can do both).
136
137 You can easily set a Body or Html during creation or after by passing it
138 as __init__ parameters, or by setting those attributes.
139
140 You can initially set the From, To, and Subject, but they are headers so
141 use the dict notation to change them: msg['From'] = 'joe@test.com'.
142
143 The message is not fully crafted until right when you convert it with
144 MailResponse.to_message. This lets you change it and work with it, then
145 send it out when it's ready.
146 """
147 def __init__(self, To=None, From=None, Subject=None, Body=None, Html=None,
148 separator="; "):
149 self.Body = Body
150 self.Html = Html
151 self.base = MailBase([('To', To), ('From', From), ('Subject', Subject)])
152 self.multipart = self.Body and self.Html
153 self.attachments = []
154 self.separator = separator
155
156 def __contains__(self, key):
157 return self.base.__contains__(key)
158
159 def __getitem__(self, key):
160 return self.base.__getitem__(key)
161
162 def __setitem__(self, key, val):
163 return self.base.__setitem__(key, val)
164
165 def __delitem__(self, name):
166 del self.base[name]
167
168 def attach(self, filename=None, content_type=None, data=None,
169 disposition=None):
170 """
171
172 Simplifies attaching files from disk or data as files. To attach
173 simple text simple give data and a content_type. To attach a file,
174 give the data/content_type/filename/disposition combination.
175
176 For convenience, if you don't give data and only a filename, then it
177 will read that file's contents when you call to_message() later. If
178 you give data and filename then it will assume you've filled data
179 with what the file's contents are and filename is just the name to
180 use.
181 """
182
183 assert filename or data, ("You must give a filename or some data to "
184 "attach.")
185 assert data or os.path.exists(filename), ("File doesn't exist, and no "
186 "data given.")
187
188 self.multipart = True
189
190 if filename and not content_type:
191 content_type, encoding = mimetypes.guess_type(filename)
192
193 assert content_type, ("No content type given, and couldn't guess "
194 "from the filename: %r" % filename)
195
196 self.attachments.append({'filename': filename,
197 'content_type': content_type,
198 'data': data,
199 'disposition': disposition,})
200
201 def attach_part(self, part):
202 """
203 Attaches a raw MailBase part from a MailRequest (or anywhere)
204 so that you can copy it over.
205 """
206 self.multipart = True
207
208 self.attachments.append({'filename': None,
209 'content_type': None,
210 'data': None,
211 'disposition': None,
212 'part': part,
213 })
214
215 def attach_all_parts(self, mail_request):
216 """
217 Used for copying the attachment parts of a mail.MailRequest
218 object for mailing lists that need to maintain attachments.
219 """
220 for part in mail_request.all_parts():
221 self.attach_part(part)
222
223 self.base.content_encoding = mail_request.base.content_encoding.copy()
224
225 def clear(self):
226 """
227 Clears out the attachments so you can redo them. Use this to keep the
228 headers for a series of different messages with different attachments.
229 """
230 del self.attachments[:]
231 del self.base.parts[:]
232 self.multipart = False
233
234 def update(self, message):
235 """
236 Used to easily set a bunch of heading from another dict
237 like object.
238 """
239 for k in message.keys():
240 self.base[k] = message[k]
241
242 def __str__(self):
243 """
244 Converts to a string.
245 """
246 return self.to_message().as_string()
247
248 def _encode_attachment(self, filename=None, content_type=None, data=None,
249 disposition=None, part=None):
250 """
251 Used internally to take the attachments mentioned in self.attachments
252 and do the actual encoding in a lazy way when you call to_message.
253 """
254 if part:
255 self.base.parts.append(part)
256 elif filename:
257 if not data:
258 with open(filename) as f:
259 data = f.read()
260
261 self.base.attach_file(filename, data, content_type,
262 disposition or 'attachment')
263 else:
264 self.base.attach_text(data, content_type)
265
266 ctype = self.base.content_encoding['Content-Type'][0]
267
268 if ctype and not ctype.startswith('multipart'):
269 self.base.content_encoding['Content-Type'] = ('multipart/mixed', {})
270
271 def to_message(self):
272 """
273 Figures out all the required steps to finally craft the
274 message you need and return it. The resulting message
275 is also available as a self.base attribute.
276
277 What is returned is a Python email API message you can
278 use with those APIs. The self.base attribute is the raw
279 lamson.encoding.MailBase.
280 """
281 del self.base.parts[:]
282
283 if self.Body and self.Html:
284 self.multipart = True
285 self.base.content_encoding['Content-Type'] = (
286 'multipart/alternative', {})
287
288 if self.multipart:
289 self.base.body = None
290 if self.Body:
291 self.base.attach_text(self.Body, 'text/plain')
292
293 if self.Html:
294 self.base.attach_text(self.Html, 'text/html')
295
296 for args in self.attachments:
297 self._encode_attachment(**args)
298
299 elif self.Body:
300 self.base.body = self.Body
301 self.base.content_encoding['Content-Type'] = ('text/plain', {})
302
303 elif self.Html:
304 self.base.body = self.Html
305 self.base.content_encoding['Content-Type'] = ('text/html', {})
306
307 return to_message(self.base, separator=self.separator)
308
309 def all_parts(self):
310 """
311 Returns all the encoded parts. Only useful for debugging
312 or inspecting after calling to_message().
313 """
314 return self.base.parts
315
316 def keys(self):
317 return self.base.keys()
318
319
320 def to_message(mail, separator="; "):
321 """
322 Given a MailBase message, this will construct a MIMEPart
323 that is canonicalized for use with the Python email API.
324 """
325 ctype, params = mail.content_encoding['Content-Type']
326
327 if not ctype:
328 if mail.parts:
329 ctype = 'multipart/mixed'
330 else:
331 ctype = 'text/plain'
332 else:
333 if mail.parts:
334 assert ctype.startswith(("multipart", "message")), \
335 "Content type should be multipart or message, not %r" % ctype
336
337 # adjust the content type according to what it should be now
338 mail.content_encoding['Content-Type'] = (ctype, params)
339
340 try:
341 out = MIMEPart(ctype, **params)
342 except TypeError as exc: # pragma: no cover
343 raise EncodingError("Content-Type malformed, not allowed: %r; "
344 "%r (Python ERROR: %s" %
345 (ctype, params, exc.message))
346
347 for k in mail.keys():
348 if k in ADDRESS_HEADERS_WHITELIST:
349 out[k.encode('ascii')] = header_to_mime_encoding(
350 mail[k],
351 not_email=False,
352 separator=separator
353 )
354 else:
355 out[k.encode('ascii')] = header_to_mime_encoding(
356 mail[k],
357 not_email=True
358 )
359
360 out.extract_payload(mail)
361
362 # go through the children
363 for part in mail.parts:
364 out.attach(to_message(part))
365
366 return out
367
368
369 class MIMEPart(MIMEBase):
370 """
371 A reimplementation of nearly everything in email.mime to be more useful
372 for actually attaching things. Rather than one class for every type of
373 thing you'd encode, there's just this one, and it figures out how to
374 encode what you ask it.
375 """
376 def __init__(self, type, **params):
377 self.maintype, self.subtype = type.split('/')
378 MIMEBase.__init__(self, self.maintype, self.subtype, **params)
379
380 def add_text(self, content):
381 # this is text, so encode it in canonical form
382 try:
383 encoded = content.encode('ascii')
384 charset = 'ascii'
385 except UnicodeError:
386 encoded = content.encode('utf-8')
387 charset = 'utf-8'
388
389 self.set_payload(encoded, charset=charset)
390
391 def extract_payload(self, mail):
392 if mail.body is None:
393 return # only None, '' is still ok
394
395 ctype, ctype_params = mail.content_encoding['Content-Type']
396 cdisp, cdisp_params = mail.content_encoding['Content-Disposition']
397
398 assert ctype, ("Extract payload requires that mail.content_encoding "
399 "have a valid Content-Type.")
400
401 if ctype.startswith("text/"):
402 self.add_text(mail.body)
403 else:
404 if cdisp:
405 # replicate the content-disposition settings
406 self.add_header('Content-Disposition', cdisp, **cdisp_params)
407
408 self.set_payload(mail.body)
409 encoders.encode_base64(self)
410
411 def __repr__(self):
412 return "<MIMEPart '%s/%s': %r, %r, multipart=%r>" % (
413 self.subtype,
414 self.maintype,
415 self['Content-Type'],
416 self['Content-Disposition'],
417 self.is_multipart())
418
419
420 def header_to_mime_encoding(value, not_email=False, separator=", "):
421 if not value:
422 return ""
423
424 encoder = Charset(DEFAULT_ENCODING)
425 if type(value) == list:
426 return separator.join(properly_encode_header(
427 v, encoder, not_email) for v in value)
428 else:
429 return properly_encode_header(value, encoder, not_email)
430
431
432 def properly_encode_header(value, encoder, not_email):
433 """
434 The only thing special (weird) about this function is that it tries
435 to do a fast check to see if the header value has an email address in
436 it. Since random headers could have an email address, and email addresses
437 have weird special formatting rules, we have to check for it.
438
439 Normally this works fine, but in Librelist, we need to "obfuscate" email
440 addresses by changing the '@' to '-AT-'. This is where
441 VALUE_IS_EMAIL_ADDRESS exists. It's a simple lambda returning True/False
442 to check if a header value has an email address. If you need to make this
443 check different, then change this.
444 """
445 try:
446 return value.encode("ascii")
447 except UnicodeEncodeError:
448 if not not_email and VALUE_IS_EMAIL_ADDRESS(value):
449 # this could have an email address, make sure we don't screw it up
450 name, address = parseaddr(value)
451 return '"%s" <%s>' % (
452 encoder.header_encode(name.encode("utf-8")), address)
453
454 return encoder.header_encode(value.encode("utf-8"))
@@ -1,120 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2013-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Simple smtp mailer used in RhodeCode
23 """
24
25 import time
26 import logging
27 import socket
28 from email.utils import formatdate
29
30 from rhodecode.lib.rcmail.message import Message
31 from rhodecode.lib.rcmail.utils import DNS_NAME
32
33 log = logging.getLogger(__name__)
34
35
36 class SmtpMailer(object):
37 """
38 SMTP mailer class
39
40 mailer = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth
41 mail_port, ssl, tls)
42 mailer.send(recipients, subject, body, attachment_files)
43
44 :param recipients might be a list of string or single string
45 :param attachment_files is a dict of {filename:location}
46 it tries to guess the mimetype and attach the file
47
48 """
49
50 def __init__(self, mail_from, user, passwd, mail_server, smtp_auth=None,
51 mail_port=None, ssl=False, tls=False, debug=False):
52
53 self.mail_from = mail_from
54 self.mail_server = mail_server
55 self.mail_port = mail_port
56 self.user = user
57 self.passwd = passwd
58 self.ssl = ssl
59 self.tls = tls
60 self.debug = debug
61 self.auth = smtp_auth
62
63 def _get_smptlib(self):
64 # patch the output
65 import smtplib
66
67 class StderrLogger(object):
68
69 def write(self, message):
70 log.debug(message)
71
72 org_stderr = smtplib.stderr
73 smtplib.stderr = StderrLogger()
74 return smtplib
75
76 def send(self, recipients=None, subject='', body='', html='',
77 attachment_files=None):
78 recipients = recipients or []
79 if isinstance(recipients, basestring):
80 recipients = [recipients]
81 headers = {
82 'Date': formatdate(time.time())
83 }
84 msg = Message(subject, recipients, body, html, self.mail_from,
85 recipients_separator=", ", extra_headers=headers)
86 raw_msg = msg.to_message()
87
88 # patched smtplib without stderr
89 smtplib = self._get_smptlib()
90 if self.ssl:
91 smtp_serv = smtplib.SMTP_SSL(self.mail_server, self.mail_port,
92 local_hostname=DNS_NAME.get_fqdn())
93 else:
94 smtp_serv = smtplib.SMTP(self.mail_server, self.mail_port,
95 local_hostname=DNS_NAME.get_fqdn())
96
97 if self.tls:
98 smtp_serv.ehlo()
99 smtp_serv.starttls()
100
101 if self.debug:
102 smtp_serv.set_debuglevel(1)
103
104 smtp_serv.ehlo()
105 if self.auth:
106 smtp_serv.esmtp_features["auth"] = self.auth
107
108 # if server requires authorization you must provide login and password
109 # but only if we have them
110 if self.user and self.passwd:
111 smtp_serv.login(self.user, self.passwd)
112
113 smtp_serv.sendmail(msg.sender, msg.send_to, raw_msg.as_string())
114 log.info('email sent to: %s' % recipients)
115
116 try:
117 smtp_serv.quit()
118 except socket.sslerror:
119 # sslerror is raised in tls connections on closing sometimes
120 smtp_serv.close()
@@ -1,39 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Email message and email sending related helper functions.
23 """
24
25 import socket
26
27
28 # Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of
29 # seconds, which slows down the restart of the server.
30 class CachedDnsName(object):
31 def __str__(self):
32 return self.get_fqdn()
33
34 def get_fqdn(self):
35 if not hasattr(self, '_fqdn'):
36 self._fqdn = socket.getfqdn()
37 return self._fqdn
38
39 DNS_NAME = CachedDnsName()
@@ -1,51 +0,0 b''
1
2 @font-face {
3 font-family: 'proximanovaregular';
4 src: url('../fonts/ProximaNova/ProximaNova-Regular.eot'); /* IE9 Compat Modes */
5 src: url('../fonts/ProximaNova/ProximaNova-Regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
6 url('../fonts/ProximaNova/ProximaNova-Regular.woff') format('woff'), /* Modern Browsers */
7 url('../fonts/ProximaNova/ProximaNova-Regular.ttf') format('truetype');
8 font-style: normal;
9 font-weight: normal;
10 text-rendering: optimizeLegibility;
11 }
12 @font-face {
13 font-family: 'proximanovaitalic';
14 src: url('../fonts/ProximaNova/ProximaNova-Italic.eot'); /* IE9 Compat Modes */
15 src: url('../fonts/ProximaNova/ProximaNova-Italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
16 url('../fonts/ProximaNova/ProximaNova-Italic.woff') format('woff'), /* Modern Browsers */
17 url('../fonts/ProximaNova/ProximaNova-Italic.ttf') format('truetype');
18 font-style: italic;
19 font-weight: normal;
20 text-rendering: optimizeLegibility;
21 }
22 @font-face {
23 font-family: 'proximanovasemibold';
24 src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot'); /* IE9 Compat Modes */
25 src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
26 url('../fonts/ProximaNova/ProximaNova-Semibold.woff') format('woff'), /* Modern Browsers */
27 url('../fonts/ProximaNova/ProximaNova-Semibold.ttf') format('truetype');
28 font-style: normal;
29 font-weight: bold;
30 text-rendering: optimizeLegibility;
31 }
32 @font-face {
33 font-family: 'proximanovabold';
34 src: url('../fonts/ProximaNova/ProximaNova-Bold.eot'); /* IE9 Compat Modes */
35 src: url('../fonts/ProximaNova/ProximaNova-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
36 url('../fonts/ProximaNova/ProximaNova-Bold.woff') format('woff'), /* Modern Browsers */
37 url('../fonts/ProximaNova/ProximaNova-Bold.ttf') format('truetype');
38 font-style: normal;
39 font-weight: bold;
40 text-rendering: optimizeLegibility;
41 }
42 @font-face {
43 font-family: 'proximanovabolditalic';
44 src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot'); /* IE9 Compat Modes */
45 src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
46 url('../fonts/ProximaNova/ProximaNova-BoldItalic.woff') format('woff'), /* Modern Browsers */
47 url('../fonts/ProximaNova/ProximaNova-BoldItalic.ttf') format('truetype');
48 font-style: italic;
49 font-weight: bold;
50 text-rendering: optimizeLegibility;
51 } No newline at end of file
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
@@ -1,106 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <link rel="import" href="../../../../../../bower_components/iron-ajax/iron-ajax.html">
3
4 <!--
5
6 `<channelstream-connection>` allows you to connect and interact with channelstream server
7 abstracting websocket/long-polling connections from you.
8
9 In typical use, just slap some `<channelstream-connection>` at the top of your body:
10
11 <body>
12 <channelstream-connection
13 username="{{user.username}}"
14 connect-url="http://127.0.0.1:8000/demo/connect"
15 disconnect-url="http://127.0.0.1:8000/disconnect"
16 subscribe-url="http://127.0.0.1:8000/demo/subscribe"
17 message-url="http://127.0.0.1:8000/demo/message"
18 long-poll-url="http://127.0.0.1:8000/listen"
19 websocket-url="http://127.0.0.1:8000/ws"
20 channels-url='["channel1", "channel2"]' />
21
22 Then you can do `channelstreamElem.connect()` to kick off your connection.
23 This element also handles automatic reconnections.
24
25 ## Default handlers
26
27 By default element has a listener attached that will fire `startListening()` handler on `channelstream-connected` event.
28
29 By default element has a listener attached that will fire `retryConnection()` handler on `channelstream-connect-error` event,
30 this handler will forever try to re-establish connection to the server incrementing intervals between retries up to 1 minute.
31
32 -->
33 <dom-module id="channelstream-connection">
34 <template>
35
36 <iron-ajax
37 id="ajaxConnect"
38 url=""
39 handle-as="json"
40 method="post"
41 content-type="application/json"
42 loading="{{loadingConnect}}"
43 last-response="{{connectLastResponse}}"
44 on-response="_handleConnect"
45 on-error="_handleConnectError"
46 debounce-duration="100"></iron-ajax>
47
48 <iron-ajax
49 id="ajaxDisconnect"
50 url=""
51 handle-as="json"
52 method="post"
53 content-type="application/json"
54 loading="{{loadingDisconnect}}"
55 last-response="{{_disconnectLastResponse}}"
56 on-response="_handleDisconnect"
57 debounce-duration="100"></iron-ajax>
58
59 <iron-ajax
60 id="ajaxSubscribe"
61 url=""
62 handle-as="json"
63 method="post"
64 content-type="application/json"
65 loading="{{loadingSubscribe}}"
66 last-response="{{subscribeLastResponse}}"
67 on-response="_handleSubscribe"
68 debounce-duration="100"></iron-ajax>
69
70 <iron-ajax
71 id="ajaxUnsubscribe"
72 url=""
73 handle-as="json"
74 method="post"
75 content-type="application/json"
76 loading="{{loadingUnsubscribe}}"
77 last-response="{{unsubscribeLastResponse}}"
78 on-response="_handleUnsubscribe"
79 debounce-duration="100"></iron-ajax>
80
81 <iron-ajax
82 id="ajaxMessage"
83 url=""
84 handle-as="json"
85 method="post"
86 content-type="application/json"
87 loading="{{loadingMessage}}"
88 last-response="{{messageLastResponse}}"
89 on-response="_handleMessage"
90 on-error="_handleMessageError"
91 debounce-duration="100"></iron-ajax>
92
93 <iron-ajax
94 id="ajaxListen"
95 url=""
96 handle-as="text"
97 loading="{{loadingListen}}"
98 last-response="{{listenLastResponse}}"
99 on-request="_handleListenOpen"
100 on-error="_handleListenError"
101 on-response="_handleListenMessageEvent"
102 debounce-duration="100"></iron-ajax>
103
104 </template>
105 <script src="channelstream-connection.js"></script>
106 </dom-module>
@@ -1,17 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <link rel="import" href="../channelstream-connection/channelstream-connection.html">
3 <link rel="import" href="../rhodecode-toast/rhodecode-toast.html">
4 <link rel="import" href="../rhodecode-favicon/rhodecode-favicon.html">
5
6 <dom-module id="rhodecode-app">
7 <template>
8 <channelstream-connection
9 id="channelstream-connection"
10 on-channelstream-listen-message="receivedMessage"
11 on-channelstream-connected="handleConnected"
12 on-channelstream-subscribed="handleSubscribed">
13 </channelstream-connection>
14 <rhodecode-favicon></rhodecode-favicon>
15 </template>
16 <script src="rhodecode-app.js"></script>
17 </dom-module>
@@ -1,7 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2
3 <dom-module id="rhodecode-favicon">
4 <template>
5 </template>
6 <script src="rhodecode-favicon.js"></script>
7 </dom-module>
@@ -1,7 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <dom-module id="rhodecode-legacy-js">
3 <template>
4 <script src="../../../scripts.js"></script>
5 </template>
6 <script src="rhodecode-legacy-js.js"></script>
7 </dom-module>
@@ -1,3 +0,0 b''
1 Polymer({
2 is: 'rhodecode-legacy-js',
3 });
@@ -1,23 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/paper-button/paper-button.html">
2 <link rel="import" href="../../../../../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
3 <link rel="import" href="../rhodecode-unsafe-html/rhodecode-unsafe-html.html">
4 <dom-module id="rhodecode-toast">
5 <template>
6 <style include="shared-styles"></style>
7 <link rel="stylesheet" href="rhodecode-toast.css">
8 <template is="dom-if" if="[[hasToasts]]">
9 <div class$="container toast-message-holder [[conditionalClass(isFixed)]]">
10 <template is="dom-repeat" items="[[toasts]]">
11 <div class$="alert alert-[[item.level]]">
12 <div on-tap="dismissNotification" class="toast-close" index-pos="[[index]]">
13 <span>[[_gettext('Close')]]</span>
14 </div>
15 <rhodecode-unsafe-html text="[[item.message]]"></rhodecode-unsafe-html>
16 </div>
17 </template>
18 </div>
19 </template>
20 </template>
21
22 <script src="rhodecode-toast.js"></script>
23 </dom-module>
@@ -1,21 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/paper-toggle-button/paper-toggle-button.html">
2 <link rel="import" href="../../../../../../bower_components/paper-spinner/paper-spinner.html">
3 <link rel="import" href="../../../../../../bower_components/paper-tooltip/paper-tooltip.html">
4
5 <dom-module id="rhodecode-toggle">
6
7 <style include="shared-styles"></style>
8 <link rel="stylesheet" href="rhodecode-toggle.css">
9
10 <template>
11 <div class="rc-toggle">
12 <paper-toggle-button checked={{checked}}>[[labelStatus(checked)]]</paper-toggle-button>
13 <paper-tooltip>[[tooltipText]]</paper-tooltip>
14 <template is="dom-if" if="[[shouldShow(noSpinner)]]">
15 <paper-spinner active=[[active]]></paper-spinner>
16 </template>
17 </div>
18 </template>
19
20 <script src="rhodecode-toggle.js"></script>
21 </dom-module> No newline at end of file
@@ -1,9 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2
3 <dom-module id="rhodecode-unsafe-html">
4 <template>
5 <style include="shared-styles"></style>
6 <slot></slot>
7 </template>
8 <script src="rhodecode-unsafe-html.js"></script>
9 </dom-module>
@@ -1,3 +0,0 b''
1 <dom-module id="root-styles">
2 <template>
3 <style>
@@ -1,3 +0,0 b''
1 </style>
2 </template>
3 </dom-module>
@@ -1,9 +0,0 b''
1 <!-- required for stamped out templates that might use common elements -->
2 <link rel="import" href="rhodecode-legacy-js/rhodecode-legacy-js.html">
3 <link rel="import" href="../../../../../bower_components/iron-ajax/iron-ajax.html">
4 <link rel="import" href="shared-styles.html">
5 <link rel="import" href="channelstream-connection/channelstream-connection.html">
6 <link rel="import" href="rhodecode-toast/rhodecode-toast.html">
7 <link rel="import" href="rhodecode-toggle/rhodecode-toggle.html">
8 <link rel="import" href="rhodecode-unsafe-html/rhodecode-unsafe-html.html">
9 <link rel="import" href="rhodecode-app/rhodecode-app.html">
@@ -1,5 +0,0 b''
1 <dom-module id="shared-styles">
2 <template>
3 <link rel="stylesheet" href="../../../css/style-polymer.css">
4 </template>
5 </dom-module>
@@ -1,230 +0,0 b''
1 /**
2 @license @nocompile
3 Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
4 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 Code distributed by Google as part of the polymer project is also
8 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 (function(){/*
11
12 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
13 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
14 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
15 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
16 Code distributed by Google as part of the polymer project is also
17 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
18 */
19 'use strict';var p,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ea="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function ha(){ha=function(){};ea.Symbol||(ea.Symbol=ia)}var ia=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
20 function ja(){ha();var a=ea.Symbol.iterator;a||(a=ea.Symbol.iterator=ea.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ka(this)}});ja=function(){}}function ka(a){var b=0;return la(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function la(a){ja();a={next:a};a[ea.Symbol.iterator]=function(){return this};return a}function ma(a){ja();var b=a[Symbol.iterator];return b?b.call(a):ka(a)}
21 function na(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
22 (function(){if(!function(){var a=document.createEvent("Event");a.initEvent("foo",!0,!0);a.preventDefault();return a.defaultPrevented}()){var a=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(a.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var b=/Trident/.test(navigator.userAgent);if(!window.CustomEvent||b&&"function"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");
23 c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;if(!window.Event||b&&"function"!==typeof window.Event){var c=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent("Event");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(c)for(var d in c)window.Event[d]=c[d];window.Event.prototype=c.prototype}if(!window.MouseEvent||b&&"function"!==typeof window.MouseEvent){b=window.MouseEvent;window.MouseEvent=function(a,
24 b){b=b||{};var c=document.createEvent("MouseEvent");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(b)for(d in b)window.MouseEvent[d]=b[d];window.MouseEvent.prototype=b.prototype}Array.from||(Array.from=function(a){return[].slice.call(a)});Object.assign||(Object.assign=function(a,b){for(var c=[].slice.call(arguments,1),d=0,e;d<c.length;d++)if(e=c[d])for(var f=
25 a,m=e,n=Object.getOwnPropertyNames(m),t=0;t<n.length;t++)e=n[t],f[e]=m[e];return a})})(window.WebComponents);(function(){function a(){}function b(a,b){if(!a.childNodes.length)return[];switch(a.nodeType){case Node.DOCUMENT_NODE:return ya.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return qb.call(a,b);default:return ba.call(a,b)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function a(a,b){if(a instanceof DocumentFragment)for(var d;d=a.firstChild;)c.call(this,d,b);else c.call(this,
26 a,b);return a}e=!0;var b=Node.prototype.cloneNode;Node.prototype.cloneNode=function(a){a=b.call(this,a);this instanceof DocumentFragment&&(a.__proto__=DocumentFragment.prototype);return a};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},
27 configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var c=Node.prototype.insertBefore;Node.prototype.insertBefore=a;var d=Node.prototype.appendChild;Node.prototype.appendChild=function(b){b instanceof DocumentFragment?a.call(this,b,null):d.call(this,b);return b};var f=Node.prototype.removeChild,h=Node.prototype.replaceChild;Node.prototype.replaceChild=function(b,c){b instanceof DocumentFragment?(a.call(this,b,c),f.call(this,c)):h.call(this,b,c);return c};Document.prototype.createDocumentFragment=
28 function(){var a=this.createElement("df");a.__proto__=DocumentFragment.prototype;return a};var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){b=g.call(this,a,b||!1);a instanceof DocumentFragment&&(b.__proto__=DocumentFragment.prototype);return b}}();var f=Node.prototype.cloneNode,h=Document.prototype.createElement,g=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,n=DOMParser.prototype.parseFromString,
29 t=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),C=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes"),ba=Element.prototype.querySelectorAll,ya=Document.prototype.querySelectorAll,qb=DocumentFragment.prototype.querySelectorAll,rb=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||
30 0===a.content.firstChild.content.childNodes.length||d}}();if(c){var V=document.implementation.createHTMLDocument("template"),D=!0,ca=document.createElement("style");ca.textContent="template{display:none;}";var oa=document.head;oa.insertBefore(ca,oa.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var za=!document.createElement("div").hasOwnProperty("innerHTML");a.I=function(b){if(!b.content&&b.namespaceURI===document.documentElement.namespaceURI){b.content=V.createDocumentFragment();
31 for(var c;c=b.firstChild;)l.call(b.content,c);if(za)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.a(this,b)},D)try{T(b),da(b)}catch(Gh){D=!1}a.C(b.content)}};var fa={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},T=function(b){Object.defineProperty(b,"innerHTML",{get:function(){return sb(this)},set:function(b){var c=fa[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(b)||["",""])[1].toLowerCase()];if(c)for(var d=
32 0;d<c.length;d++)b="<"+c[d]+">"+b+"</"+c[d]+">";V.body.innerHTML=b;for(a.C(V);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=V.body;if(c)for(d=0;d<c.length;d++)b=b.lastChild;for(;b.firstChild;)l.call(this.content,b.firstChild)},configurable:!0})},da=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){V.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();V.body.firstChild;)l.call(a,
33 V.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};T(a.prototype);da(a.prototype);a.C=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)a.I(f)};document.addEventListener("DOMContentLoaded",function(){a.C(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.I(b);return b};DOMParser.prototype.parseFromString=
34 function(){var b=n.apply(this,arguments);a.C(b);return b};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return sb(this)},set:function(b){t.set.call(this,b);a.C(this)},configurable:!0,enumerable:!0});var sf=/[&\u00A0"]/g,Kc=/[&\u00A0<>]/g,Lc=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};ca=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var tf=ca("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),
35 uf=ca("style script xmp iframe noembed noframes plaintext noscript".split(" ")),sb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):C.get.call(a),e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var T=g.localName,m="<"+T,da=g.attributes,n=0;k=da[n];n++)m+=" "+k.name+'="'+k.value.replace(sf,Lc)+'"';m+=">";g=tf[T]?m:m+sb(g,l)+"</"+T+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&uf[k.localName]?g:g.replace(Kc,Lc);
36 break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||rb){a.a=function(a,b){var c=f.call(a,!1);this.I&&this.I(c);b&&(l.call(c.content,f.call(a.content,!0)),tb(c.content,a.content));return c};var tb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e<f;e++)g=d[e],h=c[e],a&&a.I&&a.I(g),m.call(h.parentNode,vf.call(g,!0),h)}},vf=Node.prototype.cloneNode=
37 function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=wf.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?c=a.a(this,b):c=f.call(this,b);b&&tb(c,this);return c},wf=Document.prototype.importNode=function(c,d){d=d||!1;if("template"===c.localName)return a.a(c,d);var e=g.call(this,c,d);if(d){tb(e,c);c=b(e,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
38 for(var f,k=0;k<c.length;k++){f=c[k];d=h.call(document,"script");d.textContent=f.textContent;for(var l=f.attributes,T=0,da;T<l.length;T++)da=l[T],d.setAttribute(da.name,da.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var pa;Array.isArray?pa=Array.isArray:pa=function(a){return"[object Array]"===Object.prototype.toString.call(a)};var qa=pa;var ra=0,sa,ta="undefined"!==typeof window?window:void 0,ua=ta||{},va=ua.MutationObserver||ua.WebKitMutationObserver,wa="undefined"!==typeof Uint8ClampedArray&&"undefined"!==typeof importScripts&&"undefined"!==typeof MessageChannel;function xa(){return"undefined"!==typeof sa?function(){sa(Aa)}:Ba()}function Ca(){var a=0,b=new va(Aa),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}
39 function Da(){var a=new MessageChannel;a.port1.onmessage=Aa;return function(){return a.port2.postMessage(0)}}function Ba(){var a=setTimeout;return function(){return a(Aa,1)}}var Ea=Array(1E3);function Aa(){for(var a=0;a<ra;a+=2)(0,Ea[a])(Ea[a+1]),Ea[a]=void 0,Ea[a+1]=void 0;ra=0}var Fa,Ga;
40 if("undefined"===typeof self&&"undefined"!==typeof process&&"[object process]"==={}.toString.call(process))Ga=function(){return process.vb(Aa)};else{var Ha;if(va)Ha=Ca();else{var Ia;if(wa)Ia=Da();else{var Ja;if(void 0===ta&&"function"===typeof require)try{var Ka=require("vertx");sa=Ka.xb||Ka.wb;Ja=xa()}catch(a){Ja=Ba()}else Ja=Ba();Ia=Ja}Ha=Ia}Ga=Ha}Fa=Ga;function La(a,b){Ea[ra]=a;Ea[ra+1]=b;ra+=2;2===ra&&Fa()};function Ma(a,b){var c=this,d=new this.constructor(Na);void 0===d[Oa]&&Pa(d);var e=c.h;if(e){var f=arguments[e-1];La(function(){return Qa(e,d,f,c.f)})}else Ra(c,d,a,b);return d};function Sa(a){if(a&&"object"===typeof a&&a.constructor===this)return a;var b=new this(Na);Ta(b,a);return b};var Oa=Math.random().toString(36).substring(16);function Na(){}var Va=new Ua;function Wa(a){try{return a.then}catch(b){return Va.error=b,Va}}function Xa(a,b,c,d){try{a.call(b,c,d)}catch(e){return e}}function Ya(a,b,c){La(function(a){var d=!1,f=Xa(c,b,function(c){d||(d=!0,b!==c?Ta(a,c):q(a,c))},function(b){d||(d=!0,r(a,b))});!d&&f&&(d=!0,r(a,f))},a)}function Za(a,b){1===b.h?q(a,b.f):2===b.h?r(a,b.f):Ra(b,void 0,function(b){return Ta(a,b)},function(b){return r(a,b)})}
41 function $a(a,b,c){b.constructor===a.constructor&&c===Ma&&b.constructor.resolve===Sa?Za(a,b):c===Va?(r(a,Va.error),Va.error=null):void 0===c?q(a,b):"function"===typeof c?Ya(a,b,c):q(a,b)}function Ta(a,b){if(a===b)r(a,new TypeError("You cannot resolve a promise with itself"));else{var c=typeof b;null===b||"object"!==c&&"function"!==c?q(a,b):$a(a,b,Wa(b))}}function ab(a){a.va&&a.va(a.f);bb(a)}function q(a,b){void 0===a.h&&(a.f=b,a.h=1,0!==a.M.length&&La(bb,a))}
42 function r(a,b){void 0===a.h&&(a.h=2,a.f=b,La(ab,a))}function Ra(a,b,c,d){var e=a.M,f=e.length;a.va=null;e[f]=b;e[f+1]=c;e[f+2]=d;0===f&&a.h&&La(bb,a)}function bb(a){var b=a.M,c=a.h;if(0!==b.length){for(var d,e,f=a.f,h=0;h<b.length;h+=3)d=b[h],e=b[h+c],d?Qa(c,d,e,f):e(f);a.M.length=0}}function Ua(){this.error=null}var cb=new Ua;
43 function Qa(a,b,c,d){var e="function"===typeof c;if(e){try{var f=c(d)}catch(l){cb.error=l,f=cb}if(f===cb){var h=!0;var g=f.error;f.error=null}else var k=!0;if(b===f){r(b,new TypeError("A promises callback cannot return that same promise."));return}}else f=d,k=!0;void 0===b.h&&(e&&k?Ta(b,f):h?r(b,g):1===a?q(b,f):2===a&&r(b,f))}function db(a,b){try{b(function(b){Ta(a,b)},function(b){r(a,b)})}catch(c){r(a,c)}}var eb=0;function Pa(a){a[Oa]=eb++;a.h=void 0;a.f=void 0;a.M=[]};function fb(a,b){this.Ka=a;this.F=new a(Na);this.F[Oa]||Pa(this.F);if(qa(b))if(this.V=this.length=b.length,this.f=Array(this.length),0===this.length)q(this.F,this.f);else{this.length=this.length||0;for(a=0;void 0===this.h&&a<b.length;a++)gb(this,b[a],a);0===this.V&&q(this.F,this.f)}else r(this.F,Error("Array Methods must be provided an Array"))}
44 function gb(a,b,c){var d=a.Ka,e=d.resolve;e===Sa?(e=Wa(b),e===Ma&&void 0!==b.h?hb(a,b.h,c,b.f):"function"!==typeof e?(a.V--,a.f[c]=b):d===u?(d=new d(Na),$a(d,b,e),ib(a,d,c)):ib(a,new d(function(a){return a(b)}),c)):ib(a,e(b),c)}function hb(a,b,c,d){var e=a.F;void 0===e.h&&(a.V--,2===b?r(e,d):a.f[c]=d);0===a.V&&q(e,a.f)}function ib(a,b,c){Ra(b,void 0,function(b){return hb(a,1,c,b)},function(b){return hb(a,2,c,b)})};function jb(a){return(new fb(this,a)).F};function kb(a){var b=this;return qa(a)?new b(function(c,d){for(var e=a.length,f=0;f<e;f++)b.resolve(a[f]).then(c,d)}):new b(function(a,b){return b(new TypeError("You must pass an array to race."))})};function lb(a){var b=new this(Na);r(b,a);return b};function u(a){this[Oa]=eb++;this.f=this.h=void 0;this.M=[];if(Na!==a){if("function"!==typeof a)throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(this instanceof u)db(this,a);else throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");}}u.prototype={constructor:u,then:Ma,a:function(a){return this.then(null,a)}};/*
45
46 Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
47 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
48 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
49 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
50 Code distributed by Google as part of the polymer project is also
51 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
52 */
53 window.Promise||(window.Promise=u,u.prototype["catch"]=u.prototype.a,u.prototype.then=u.prototype.then,u.all=jb,u.race=kb,u.resolve=Sa,u.reject=lb);(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(C)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
54 c=b.length;c?n(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
55 c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);oa&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Va(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){n(m(a,"template"),function(a){n(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'),
56 function(a){var b=document.createElement("script");n(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):ba}function n(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var t=document.createElement("link"),C="import"in t,ba=t.querySelectorAll("*"),ya=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
57 {get:function(){return ya||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var qb=/(url\()([^)]*)(\))/g,rb=/(@import[\s]+(?!url\())([^;]*)(;)/g,V=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,D={Pa:function(a,b){a.href&&a.setAttribute("href",D.ba(a.getAttribute("href"),b));a.src&&a.setAttribute("src",D.ba(a.getAttribute("src"),b));if("style"===a.localName){var c=D.za(a.textContent,b,qb);a.textContent=D.za(c,b,rb)}},za:function(a,b,c){return a.replace(c,
58 function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=D.ba(a,b));return c+"'"+a+"'"+e})},ba:function(a,b){if(void 0===D.ha){D.ha=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";D.ha="http://a/c%20d"===c.href}catch(Kc){}}if(D.ha)return(new URL(a,b)).href;c=D.Ha;c||(c=document.implementation.createHTMLDocument("temp"),D.Ha=c,c.ra=c.createElement("base"),c.head.appendChild(c.ra),c.qa=c.createElement("a"));c.ra.href=b;c.qa.href=a;return c.qa.href||a}},ca={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
59 a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,ca.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},oa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
60 k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.o(a)})};k.prototype.o=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",ca.load(c,function(a,d){a=b.Wa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.J()},function(){b.a[c]=null;b.b--;b.J()})};k.prototype.Wa=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(V,function(a,b,c){return-1===
61 a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=D.ba(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]');
62 var d=0;n(c,function(a){h(a);D.Pa(a,b);a.setAttribute("import-dependency","");if("script"===a.localName&&!a.src&&a.textContent){if("module"===a.type)throw Error("Inline module scripts are not supported in HTML Imports.");a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n")));a.textContent="";d++}});return a};k.prototype.J=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&
63 b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.Ta()))};this.Ya(function(){c=!0;d()});this.Xa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Xa=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");
64 n(f.attributes,function(a){return g.setAttribute(a.name,a.value)});ya=g;f.parentNode.replaceChild(g,f);h(g,function(){ya=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ya=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=oa&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");n(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&
65 a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.Ta=function(){var a=this,b=m(document,"link[rel=import]");n(b,function(b){return a.i(b)},!0)};k.prototype.i=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState=
66 "complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Va=function(a){var b=this;n(a,function(a){return n(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.o(a):b.loadImports(a))})})};var za=null;if(C)t=m(document,"link[rel=import]"),n(t,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),t=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",t,!0),document.addEventListener("error",
67 t,!0);else{var fa=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!fa||fa.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:fa&&fa.get?fa.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){za=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",
68 {cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=C;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){za&&za.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
69
70 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
71 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
72 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
73 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
74 Code distributed by Google as part of the polymer project is also
75 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
76 */
77 window.WebComponents=window.WebComponents||{flags:{}};var mb=document.querySelector('script[src*="webcomponents-lite.js"]'),nb=/wc-(.+)/,v={};if(!v.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(nb))&&(v[b[1]]=a[1]||!0)});if(mb)for(var ob=0,pb;pb=mb.attributes[ob];ob++)"src"!==pb.name&&(v[pb.name]=pb.value||!0);if(v.log&&v.log.split){var ub=v.log.split(",");v.log={};ub.forEach(function(a){v.log[a]=!0})}else v.log={}}
78 window.WebComponents.flags=v;var vb=v.shadydom;vb&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=vb);var wb=v.register||v.ce;wb&&window.customElements&&(window.customElements.forcePolyfill=wb);/*
79
80 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
81 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
82 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
83 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
84 Code distributed by Google as part of the polymer project is also
85 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
86 */
87 function xb(){this.ya=this.root=null;this.Z=!1;this.D=this.U=this.la=this.assignedSlot=this.assignedNodes=this.K=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.N=void 0;this.Da=this.ta=!1;this.S={}}xb.prototype.toJSON=function(){return{}};function w(a){a.fa||(a.fa=new xb);return a.fa}function x(a){return a&&a.fa};var y=window.ShadyDOM||{};y.Ra=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var yb=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");y.w=!!(yb&&yb.configurable&&yb.get);y.na=y.force||!y.Ra;var zb=navigator.userAgent.match("Trident"),Ab=navigator.userAgent.match("Edge");void 0===y.Ba&&(y.Ba=y.w&&(zb||Ab));function Bb(a){return(a=x(a))&&void 0!==a.firstChild}function z(a){return"ShadyRoot"===a.La}function Cb(a){a=a.getRootNode();if(z(a))return a}
88 var Db=Element.prototype,Eb=Db.matches||Db.matchesSelector||Db.mozMatchesSelector||Db.msMatchesSelector||Db.oMatchesSelector||Db.webkitMatchesSelector;function Fb(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function Gb(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Fb(a,c[d]);return a}function Hb(a,b){for(var c in b)a[c]=b[c]}
89 var Ib=document.createTextNode(""),Jb=0,Kb=[];(new MutationObserver(function(){for(;Kb.length;)try{Kb.shift()()}catch(a){throw Ib.textContent=Jb++,a;}})).observe(Ib,{characterData:!0});function Lb(a){Kb.push(a);Ib.textContent=Jb++}var Mb=!!document.contains;function Nb(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1}
90 function Ob(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute("id")||c.getAttribute("name");d&&"length"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(b){return a[b]};a.namedItem=function(b){if("length"!==b&&isNaN(b)&&a[b])return a[b];for(var c=ma(a),d=c.next();!d.done;d=c.next())if(d=d.value,(d.getAttribute("id")||d.getAttribute("name"))==b)return d;return null};return a};var Pb=[],Qb;function Rb(a){Qb||(Qb=!0,Lb(Sb));Pb.push(a)}function Sb(){Qb=!1;for(var a=!!Pb.length;Pb.length;)Pb.shift()();return a}Sb.list=Pb;function Tb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.Y=new Set}function Ub(a){a.a||(a.a=!0,Lb(function(){Vb(a)}))}function Vb(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.Y.forEach(function(a){a(b)})}}Tb.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
91 function Wb(a,b){var c=w(a);c.K||(c.K=new Tb);c.K.Y.add(b);var d=c.K;return{Ia:b,H:d,Ma:a,takeRecords:function(){return d.takeRecords()}}}function Xb(a){var b=a&&a.H;b&&(b.Y.delete(a.Ia),b.Y.size||(w(a.Ma).K=null))}
92 function Yb(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var A={},Zb=Element.prototype.insertBefore,$b=Element.prototype.replaceChild,ac=Element.prototype.removeChild,bc=Element.prototype.setAttribute,cc=Element.prototype.removeAttribute,dc=Element.prototype.cloneNode,ec=Document.prototype.importNode,fc=Element.prototype.addEventListener,gc=Element.prototype.removeEventListener,hc=Window.prototype.addEventListener,ic=Window.prototype.removeEventListener,jc=Element.prototype.dispatchEvent,kc=Node.prototype.contains||HTMLElement.prototype.contains,lc=Document.prototype.getElementById,
93 mc=Element.prototype.querySelector,nc=DocumentFragment.prototype.querySelector,oc=Document.prototype.querySelector,pc=Element.prototype.querySelectorAll,qc=DocumentFragment.prototype.querySelectorAll,rc=Document.prototype.querySelectorAll;A.appendChild=Element.prototype.appendChild;A.insertBefore=Zb;A.replaceChild=$b;A.removeChild=ac;A.setAttribute=bc;A.removeAttribute=cc;A.cloneNode=dc;A.importNode=ec;A.addEventListener=fc;A.removeEventListener=gc;A.fb=hc;A.gb=ic;A.dispatchEvent=jc;A.contains=kc;
94 A.getElementById=lc;A.pb=mc;A.sb=nc;A.nb=oc;A.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return mc.call(this,a);case Node.DOCUMENT_NODE:return oc.call(this,a);default:return nc.call(this,a)}};A.qb=pc;A.tb=qc;A.ob=rc;A.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return pc.call(this,a);case Node.DOCUMENT_NODE:return rc.call(this,a);default:return qc.call(this,a)}};var sc=/[&\u00A0"]/g,tc=/[&\u00A0<>]/g;function uc(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function vc(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var wc=vc("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),xc=vc("style script xmp iframe noembed noframes plaintext noscript".split(" "));
95 function yc(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,n="<"+m,t=g.attributes,C=0;k=t[C];C++)n+=" "+k.name+'="'+k.value.replace(sc,uc)+'"';n+=">";g=wc[m]?n:n+yc(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&xc[k.localName]?g:g.replace(tc,uc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
96 Error("not implemented");}}c+=g}return c};var B={},E=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),F=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function zc(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b}B.parentNode=function(a){E.currentNode=a;return E.parentNode()};B.firstChild=function(a){E.currentNode=a;return E.firstChild()};B.lastChild=function(a){E.currentNode=a;return E.lastChild()};B.previousSibling=function(a){E.currentNode=a;return E.previousSibling()};
97 B.nextSibling=function(a){E.currentNode=a;return E.nextSibling()};B.childNodes=zc;B.parentElement=function(a){F.currentNode=a;return F.parentNode()};B.firstElementChild=function(a){F.currentNode=a;return F.firstChild()};B.lastElementChild=function(a){F.currentNode=a;return F.lastChild()};B.previousElementSibling=function(a){F.currentNode=a;return F.previousSibling()};B.nextElementSibling=function(a){F.currentNode=a;return F.nextSibling()};
98 B.children=function(a){var b=[];F.currentNode=a;for(a=F.firstChild();a;)b.push(a),a=F.nextSibling();return Ob(b)};B.innerHTML=function(a){return yc(a,function(a){return zc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var G={},Ac=y.w,Bc=[Node.prototype,Element.prototype,HTMLElement.prototype];function H(a){var b;a:{for(b=0;b<Bc.length;b++){var c=Bc[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
99 var I=Ac?{parentNode:H("parentNode"),firstChild:H("firstChild"),lastChild:H("lastChild"),previousSibling:H("previousSibling"),nextSibling:H("nextSibling"),childNodes:H("childNodes"),parentElement:H("parentElement"),previousElementSibling:H("previousElementSibling"),nextElementSibling:H("nextElementSibling"),innerHTML:H("innerHTML"),textContent:H("textContent"),firstElementChild:H("firstElementChild"),lastElementChild:H("lastElementChild"),children:H("children")}:{},Cc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
100 "firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Dc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};G.xa=I;G.rb=Cc;G.mb=Dc;G.parentNode=function(a){return I.parentNode.get.call(a)};
101 G.firstChild=function(a){return I.firstChild.get.call(a)};G.lastChild=function(a){return I.lastChild.get.call(a)};G.previousSibling=function(a){return I.previousSibling.get.call(a)};G.nextSibling=function(a){return I.nextSibling.get.call(a)};G.childNodes=function(a){return Array.prototype.slice.call(I.childNodes.get.call(a))};G.parentElement=function(a){return I.parentElement.get.call(a)};G.previousElementSibling=function(a){return I.previousElementSibling.get.call(a)};G.nextElementSibling=function(a){return I.nextElementSibling.get.call(a)};
102 G.innerHTML=function(a){return I.innerHTML.get.call(a)};G.textContent=function(a){return I.textContent.get.call(a)};G.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.children.get.call(a);case Node.DOCUMENT_NODE:return Dc.children.get.call(a);default:return I.children.get.call(a)}};
103 G.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.firstElementChild.get.call(a);default:return I.firstElementChild.get.call(a)}};G.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.lastElementChild.get.call(a);default:return I.lastElementChild.get.call(a)}};var J=y.Ba?G:B;function Ec(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
104 var Fc=y.w,Gc=document.implementation.createHTMLDocument("inert"),Hc=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),Ic=Hc&&Hc.get,Jc=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),Mc={parentElement:{get:function(){var a=x(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:J.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=x(this);a=a&&a.parentNode;return void 0!==a?a:J.parentNode(this)},configurable:!0},
105 nextSibling:{get:function(){var a=x(this);a=a&&a.nextSibling;return void 0!==a?a:J.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=x(this);a=a&&a.previousSibling;return void 0!==a?a:J.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=x(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
106 x(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.previousElementSibling(this)},configurable:!0}},Nc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},Oc={childNodes:{get:function(){if(Bb(this)){var a=x(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
107 J.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=x(this);a=a&&a.firstChild;return void 0!==a?a:J.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=x(this);a=a&&a.lastChild;return void 0!==a?a:J.lastChild(this)},configurable:!0},textContent:{get:function(){if(Bb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
108 a.push(d.textContent);return a.join("")}return J.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Bb(this)&&Fc){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Ec(this);G.xa.textContent.set.call(this,a)}else Ec(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
109 x(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=x(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.lastElementChild(this)},configurable:!0},children:{get:function(){return Bb(this)?Ob(Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE})):
110 J.children(this)},configurable:!0},innerHTML:{get:function(){return Bb(this)?yc("template"===this.localName?this.content:this):J.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Ec(b);var c=this.localName||"div";c=this.namespaceURI&&this.namespaceURI!==Gc.namespaceURI?Gc.createElementNS(this.namespaceURI,c):Gc.createElement(c);Fc?G.xa.innerHTML.set.call(c,a):c.innerHTML=a;for(a="template"===this.localName?c.content:c;a.firstChild;)b.appendChild(a.firstChild)},configurable:!0}},
111 Pc={shadowRoot:{get:function(){var a=x(this);return a&&a.ya||null},configurable:!0}},Qc={activeElement:{get:function(){var a=Jc&&Jc.get?Jc.get.call(document):y.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!z(this);if(this===document||b&&this.host!==a&&A.contains.call(this.host,a)){for(b=Cb(a);b&&b!==this;)a=b.host,b=Cb(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
112 function K(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function Rc(a){K(a,Mc);K(a,Nc);K(a,Oc);K(a,Qc)}
113 function Sc(){var a=Tc.prototype;a.__proto__=DocumentFragment.prototype;K(a,Mc,!0);K(a,Oc,!0);K(a,Qc,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
114 configurable:!0})})}var Uc=y.w?function(){}:function(a){var b=w(a);b.ta||(b.ta=!0,K(a,Mc,!0),K(a,Nc,!0))},Vc=y.w?function(){}:function(a){w(a).Da||(K(a,Oc,!0),K(a,Pc,!0))};var Wc=J.childNodes;function Xc(a,b,c){Uc(a);c=c||null;var d=w(a),e=w(b),f=c?w(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=x(d.previousSibling))f.nextSibling=a;if(f=x(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
115 function Yc(a){var b=w(a);if(void 0===b.firstChild){b.childNodes=null;var c=Wc(a);b.firstChild=c[0]||null;b.lastChild=c[c.length-1]||null;Vc(a);for(b=0;b<c.length;b++){var d=c[b],e=w(d);e.parentNode=a;e.nextSibling=c[b+1]||null;e.previousSibling=c[b-1]||null;Uc(d)}}};var Zc=J.parentNode;
116 function $c(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=x(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Zc(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&ad(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=Cb(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
117 (h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.a=h.a||[],h.g=h.g||[],h.j=h.j||{},h.a.push.apply(h.a,[].concat(d instanceof Array?d:na(ma(d)))))}("slot"===a.localName||f)&&(e=e||Cb(a))&&bd(e);if(Bb(a)){e=c;Vc(a);f=w(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Xc(f[h],a,e);e=w(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Xc(b,a,e);e=x(a);if(cd(a)){bd(e.root);
118 var g=!0}else e.root&&(g=!0)}g||(g=z(a)?a.host:a,c?(c=dd(c),A.insertBefore.call(g,b,c)):A.appendChild.call(g,b));ed(a,b);return b}
119 function ad(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=Cb(b),d=x(a);if(Bb(a)){var e=w(b),f=w(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(w(h).nextSibling=g);g&&(w(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(cd(a)){bd(d.root);var k=!0}}fd(b);if(c){(e=a&&"slot"===a.localName)&&
120 (k=!0);if(c.g){gd(c);f=c.j;for(ba in f)for(h=f[ba],g=0;g<h.length;g++){var l=h[g];if(Nb(b,l)){h.splice(g,1);var m=c.g.indexOf(l);0<=m&&c.g.splice(m,1);g--;m=x(l);if(l=m.D)for(var n=0;n<l.length;n++){var t=l[n],C=hd(t);C&&A.removeChild.call(C,t)}m.D=[];m.assignedNodes=[];m=!0}}var ba=m}else ba=void 0;(ba||e)&&bd(c)}k||(k=z(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Zc(b))&&A.removeChild.call(k,b));ed(a,null,b);return b}
121 function fd(a){var b=x(a);if(b&&void 0!==b.N){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)fd(e)}if(a=x(a))a.N=void 0}function dd(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=x(a))&&b.D)&&b.length?b[0]:dd(a.nextSibling));return b}function cd(a){return(a=(a=x(a))&&a.root)&&id(a)}
122 function jd(a,b){if("slot"===b)a=a.parentNode,cd(a)&&bd(x(a).root);else if("slot"===a.localName&&"name"===b&&(b=Cb(a))){if(b.g){gd(b);var c=a.Ga,d=kd(a);if(d!==c){c=b.j[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.j[d]||(b.j[d]=[]);c.push(a);1<c.length&&(b.j[d]=ld(c))}}bd(b)}}function ed(a,b,c){if(a=(a=x(a))&&a.K)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ub(a)}
123 function md(a){if(a&&a.nodeType){var b=w(a),c=b.N;void 0===c&&(z(a)?(c=a,b.N=c):(c=(c=a.parentNode)?md(c):a,A.contains.call(document.documentElement,a)&&(b.N=c)));return c}}function nd(a,b,c){var d=[];od(a.childNodes,b,c,d);return d}function od(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,n=k(g);n&&m.push(g);l&&l(n)?g=n:(od(g.childNodes,k,l,m),g=void 0)}if(g)break}}var pd=null;
124 function qd(a,b,c){pd||(pd=window.ShadyCSS&&window.ShadyCSS.ScopingShim);pd&&"class"===b?pd.setElementClass(a,c):(A.setAttribute.call(a,b,c),jd(a,b))}function rd(a,b){if(a.ownerDocument!==document||"template"===a.localName)return A.importNode.call(document,a,b);var c=A.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=rd(a[b],!0),c.appendChild(d)}return c};var sd="__eventWrappers"+Date.now(),td=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),ud={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,
125 pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},vd={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};
126 function wd(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}function xd(a,b){if(!z)return a;a=wd(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!z(f)||-1<h)return d}
127 var yd={get composed(){void 0===this.R&&(td?this.R=td(this):!1!==this.isTrusted&&(this.R=ud[this.type]));return this.R||!1},composedPath:function(){this.sa||(this.sa=wd(this.__target,this.composed));return this.sa},get target(){return xd(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.ea)return null;this.ua||(this.ua=wd(this.ea,!0));return xd(this.currentTarget,this.ua)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.da=
128 !0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.da=this.Ca=!0}};function zd(a){function b(b,d){b=new a(b,d);b.R=d&&!!d.composed;return b}Hb(b,a);b.prototype=a.prototype;return b}var Ad={focus:!0,blur:!0};function Bd(a){return a.__target!==a.target||a.ea!==a.relatedTarget}function Cd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!Bd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.Ca);d++);}
129 function Dd(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];Cd(a,d,"capture");if(a.da)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=x(d);f=f&&f.root;if(0===c||f&&f===e)if(Cd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.da)break}}
130 function Ed(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,n=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===n)return h}return-1}
131 function Fd(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){var e=this instanceof Window?A.fb:A.addEventListener;if(vd[a])return e.call(this,a,b,c);if(c&&"object"===typeof c){var f=!!c.capture;var h=!!c.once;var g=!!c.passive}else f=!!c,g=h=!1;var k=c&&c.ga||this,l=b[sd];if(l){if(-1<Ed(l,k,a,f,h,g))return}else b[sd]=[];l=function(e){h&&this.removeEventListener(a,b,c);e.__target||Gd(e);if(k!==this){var f=Object.getOwnPropertyDescriptor(e,
132 "currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return k},configurable:!0})}e.__previousCurrentTarget=e.currentTarget;if(!z(k)||-1!=e.composedPath().indexOf(k))if(e.composed||-1<e.composedPath().indexOf(k))if(Bd(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===k||k instanceof Window){var g="function"===d?b.call(k,e):b.handleEvent&&b.handleEvent(e);k!==this&&
133 (f?(Object.defineProperty(e,"currentTarget",f),f=null):delete e.currentTarget);return g}};b[sd].push({node:k,type:a,capture:f,once:h,passive:g,hb:l});Ad[a]?(this.__handlers=this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][f?"capture":"bubble"].push(l)):e.call(this,a,l,c)}}}
134 function Hd(a,b,c){if(b){var d=this instanceof Window?A.gb:A.removeEventListener;if(vd[a])return d.call(this,a,b,c);if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.ga||this,k=void 0;var l=null;try{l=b[sd]}catch(m){}l&&(f=Ed(l,g,a,e,f,h),-1<f&&(k=l.splice(f,1)[0].hb,l.length||(b[sd]=void 0)));d.call(this,a,k||b,c);k&&Ad[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][e?"capture":"bubble"],k=a.indexOf(k),-1<k&&a.splice(k,1))}}
135 function Id(){for(var a in Ad)window.addEventListener(a,function(a){a.__target||(Gd(a),Dd(a))},!0)}function Gd(a){a.__target=a.target;a.ea=a.relatedTarget;if(y.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.jb=b;Fb(c,yd);b.__patchProto=c}a.__proto__=b.__patchProto}else Fb(a,yd)}var Jd=zd(window.Event),Kd=zd(window.CustomEvent),Ld=zd(window.MouseEvent);
136 function Md(){window.Event=Jd;window.CustomEvent=Kd;window.MouseEvent=Ld;Id();if(!td&&Object.getOwnPropertyDescriptor(Event.prototype,"isTrusted")){var a=function(){var a=new MouseEvent("click",{bubbles:!0,cancelable:!0,composed:!0});this.dispatchEvent(a)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}};function Nd(a,b){return{index:a,O:[],X:b}}
137 function Od(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&Pd(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=Nd(e,0);f<d;)b.O.push(c[f++]);return[b]}if(f==d)return[Nd(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
138 b[l-1][m-1];else{var n=b[l-1][m]+1,t=b[l][m-1]+1;b[l][m]=n<t?n:t}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],n=l<m?l<g?l:g:m<g?m:g,n==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):n==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=Nd(e,0));b.X++;e++;b.O.push(c[f]);f++;break;case 2:b||(b=Nd(e,0));
139 b.X++;e++;break;case 3:b||(b=Nd(e,0)),b.O.push(c[f]),f++}b&&k.push(b);return k}function Pd(a,b){return a===b};var hd=J.parentNode,Qd=J.childNodes,Rd={},Sd=y.deferConnectionCallbacks&&"loading"===document.readyState,Td;function Ud(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}
140 function Tc(a,b,c){if(a!==Rd)throw new TypeError("Illegal constructor");this.La="ShadyRoot";this.host=b;this.c=c&&c.mode;Yc(b);a=w(b);a.root=this;a.ya="closed"!==this.c?this:null;a=w(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;a.childNodes=[];this.b=this.W=!1;this.a=this.j=this.g=null;bd(this)}function bd(a){a.W||(a.W=!0,Rb(function(){return Vd(a)}))}
141 function Vd(a){for(var b;a;){a.W&&(b=a);a:{var c=a;a=c.host.getRootNode();if(z(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
142 Tc.prototype._renderRoot=function(){var a=Sd;Sd=!0;this.W=!1;if(this.g){gd(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=x(c),e=d.assignedNodes;d.assignedNodes=[];d.D=[];if(d.la=e)for(d=0;d<e.length;d++){var f=x(e[d]);f.U=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(c=this.host.firstChild;c;c=c.nextSibling)Wd(this,c);for(b=0;b<this.g.length;b++){c=this.g[b];e=x(c);if(!e.assignedNodes.length)for(d=c.firstChild;d;d=d.nextSibling)Wd(this,d,c);(d=(d=x(c.parentNode))&&d.root)&&
143 id(d)&&d._renderRoot();Xd(this,e.D,e.assignedNodes);if(d=e.la){for(f=0;f<d.length;f++)x(d[f]).U=null;e.la=null;d.length>e.assignedNodes.length&&(e.Z=!0)}e.Z&&(e.Z=!1,Yd(this,c))}b=this.g;c=[];for(e=0;e<b.length;e++)d=b[e].parentNode,(f=x(d))&&f.root||!(0>c.indexOf(d))||c.push(d);for(b=0;b<c.length;b++){e=c[b];d=e===this?this.host:e;f=[];e=e.childNodes;for(var h=0;h<e.length;h++){var g=e[h];if("slot"==g.localName){g=x(g).D;for(var k=0;k<g.length;k++)f.push(g[k])}else f.push(g)}e=void 0;h=Qd(d);g=Od(f,
144 f.length,h,h.length);for(var l=k=0;k<g.length&&(e=g[k]);k++){for(var m=0,n;m<e.O.length&&(n=e.O[m]);m++)hd(n)===d&&A.removeChild.call(d,n),h.splice(e.index+l,1);l-=e.X}for(l=0;l<g.length&&(e=g[l]);l++)for(k=h[e.index],m=e.index;m<e.index+e.X;m++)n=f[m],A.insertBefore.call(d,n,k),h.splice(m,0,n)}}if(!this.b)for(n=this.host.childNodes,c=0,b=n.length;c<b;c++)e=n[c],d=x(e),hd(e)!==this.host||"slot"!==e.localName&&d.assignedSlot||A.removeChild.call(this.host,e);this.b=!0;Sd=a;Td&&Td()};
145 function Wd(a,b,c){var d=w(b),e=d.U;d.U=null;c||(c=(a=a.j[b.slot||"__catchall"])&&a[0]);c?(w(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(w(d.assignedSlot).Z=!0)}function Xd(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=x(e).assignedNodes;f&&f.length&&Xd(a,b,f)}else b.push(c[d])}function Yd(a,b){A.dispatchEvent.call(b,new Event("slotchange"));b=x(b);b.assignedSlot&&Yd(a,b.assignedSlot)}
146 function gd(a){if(a.a&&a.a.length){for(var b=a.a,c,d=0;d<b.length;d++){var e=b[d];Yc(e);Yc(e.parentNode);var f=kd(e);a.j[f]?(c=c||{},c[f]=!0,a.j[f].push(e)):a.j[f]=[e];a.g.push(e)}if(c)for(var h in c)a.j[h]=ld(a.j[h]);a.a=[]}}function kd(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Ga=b}function ld(a){return a.sort(function(a,c){a=Ud(a);for(var b=Ud(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}
147 function id(a){gd(a);return!(!a.g||!a.g.length)}
148 if(window.customElements&&y.na){var Zd=new Map;Td=function(){var a=Array.from(Zd);Zd.clear();a=ma(a);for(var b=a.next();!b.done;b=a.next()){b=ma(b.value);var c=b.next().value;b.next().value?c.Ea():c.Fa()}};Sd&&document.addEventListener("readystatechange",function(){Sd=!1;Td()},{once:!0});var $d=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.Ea=function(){Sd?Zd.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.Fa=
149 function(){Sd?this.isConnected||Zd.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},define=window.customElements.define;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;define.call(window.customElements,a,$d(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d}})};function ae(a){var b=a.getRootNode();z(b)&&Vd(b);return(a=x(a))&&a.assignedSlot||null}
150 var be={addEventListener:Fd.bind(window),removeEventListener:Hd.bind(window)},ce={addEventListener:Fd,removeEventListener:Hd,appendChild:function(a){return $c(this,a)},insertBefore:function(a,b){return $c(this,a,b)},removeChild:function(a){return ad(this,a)},replaceChild:function(a,b){$c(this,a,b);ad(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=A.cloneNode.call(this,a);else if(b=A.cloneNode.call(this,!1),a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=this.childNodes;for(var c=
151 0,d;c<a.length;c++)d=a[c].cloneNode(!0),b.appendChild(d)}return b},getRootNode:function(){return md(this)},contains:function(a){return Nb(this,a)},dispatchEvent:function(a){Sb();return A.dispatchEvent.call(this,a)}};
152 Object.defineProperties(ce,{isConnected:{get:function(){if(Ic&&Ic.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(Mb){if(A.contains.call(a,this))return!0}else if(a.documentElement&&A.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(z(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
153 var de={get assignedSlot(){return ae(this)}},ee={querySelector:function(a){return nd(this,function(b){return Eb.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(A.querySelectorAll.call(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return nd(this,function(b){return Eb.call(b,a)})}},fe={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();z(b)&&Vd(b);return(b=x(this))?
154 (a&&a.flatten?b.D:b.assignedNodes)||[]:[]}}},ge=Gb({setAttribute:function(a,b){qd(this,a,b)},removeAttribute:function(a){A.removeAttribute.call(this,a);jd(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Tc(Rd,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){qd(this,"slot",a)},get assignedSlot(){return ae(this)}},ee,fe);Object.defineProperties(ge,Pc);
155 var he=Gb({importNode:function(a,b){return rd(a,b)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},ee);Object.defineProperties(he,{_activeElement:Qc.activeElement});
156 for(var ie=HTMLElement.prototype.blur,je={blur:function(){var a=x(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():ie.call(this)}},ke={},le=ma(Object.getOwnPropertyNames(Document.prototype)),me=le.next();!me.done;ke={u:ke.u},me=le.next())ke.u=me.value,"on"===ke.u.substring(0,2)&&Object.defineProperty(je,ke.u,{set:function(a){return function(b){var c=w(this),d=a.u.substring(2);c.S[a.u]&&this.removeEventListener(d,c.S[a.u]);this.addEventListener(d,b,{});c.S[a.u]=b}}(ke),get:function(a){return function(){var b=
157 x(this);return b&&b.S[a.u]}}(ke),configurable:!0});var ne={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
158 function L(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(y.na){var ShadyDOM={inUse:y.na,patch:function(a){Vc(a);Uc(a);return a},isShadyRoot:z,enqueue:Rb,flush:Sb,settings:y,filterMutations:Yb,observeChildren:Wb,unobserveChildren:Xb,nativeMethods:A,nativeTree:J,deferConnectionCallbacks:y.deferConnectionCallbacks};window.ShadyDOM=ShadyDOM;Md();var oe=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;L(Tc.prototype,ne);L(window.Node.prototype,ce);L(window.Window.prototype,be);L(window.Text.prototype,de);L(window.DocumentFragment.prototype,
159 ee);L(window.Element.prototype,ge);L(window.Document.prototype,he);window.HTMLSlotElement&&L(window.HTMLSlotElement.prototype,fe);L(oe.prototype,je);y.w&&(Rc(window.Node.prototype),Rc(window.Text.prototype),Rc(window.DocumentFragment.prototype),Rc(window.Element.prototype),Rc(oe.prototype),Rc(window.Document.prototype),window.HTMLSlotElement&&Rc(window.HTMLSlotElement.prototype));Sc();window.ShadowRoot=Tc};var pe=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function qe(a){var b=pe.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function M(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
160 function re(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
161 function se(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)se(d,b,c);d=re(a,e);continue}else if("template"===f){d=re(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)se(e,b,c)}d=d.firstChild?d.firstChild:re(a,d)}}function N(a,b,c){a[b]=c};function te(){this.a=new Map;this.o=new Map;this.i=[];this.c=!1}function ue(a,b,c){a.a.set(b,c);a.o.set(c.constructor,c)}function ve(a,b){a.c=!0;a.i.push(b)}function we(a,b){a.c&&se(b,function(b){return a.b(b)})}te.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.i.length;b++)this.i[b](a)}};function O(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):xe(a,d)}}
162 function P(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
163 function Q(a,b,c){c=void 0===c?{}:c;var d=c.eb||new Set,e=c.ca||function(b){return xe(a,b)},f=[];se(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);Q(a,c,{eb:f,ca:e})}})}else f.push(b)},d);
164 if(a.c)for(b=0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
165 function xe(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
166 f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}M(b)&&a.connectedCallback(b)}}}te.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};te.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
167 te.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function ye(a){var b=document;this.l=a;this.a=b;this.H=void 0;Q(this.l,this.a);"loading"===this.a.readyState&&(this.H=new MutationObserver(this.b.bind(this)),this.H.observe(this.a,{childList:!0,subtree:!0}))}function ze(a){a.H&&a.H.disconnect()}ye.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||ze(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)Q(this.l,c[d])};function Ae(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}Ae.prototype.resolve=function(a){if(this.a)throw Error("Already resolved.");this.a=a;this.b&&this.b(a)};function R(a){this.ia=!1;this.l=a;this.ma=new Map;this.ja=function(a){return a()};this.T=!1;this.ka=[];this.Ja=new ye(a)}p=R.prototype;
168 p.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!qe(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.l.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.ia)throw Error("A custom element is already being defined.");this.ia=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
169 return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.ia=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};ue(this.l,a,b);this.ka.push(b);
170 this.T||(this.T=!0,this.ja(function(){return Be(c)}))};p.ca=function(a){Q(this.l,a)};
171 function Be(a){if(!1!==a.T){a.T=!1;for(var b=a.ka,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);Q(a.l,document,{ca:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.l.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)xe(a.l,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)xe(a.l,f[h]);(e=a.ma.get(e))&&e.resolve(void 0)}}}p.get=function(a){if(a=this.l.a.get(a))return a.constructor};
172 p.whenDefined=function(a){if(!qe(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ma.get(a);if(b)return b.c;b=new Ae;this.ma.set(a,b);this.l.a.get(a)&&!this.ka.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.c};p.Za=function(a){ze(this.Ja);var b=this.ja;this.ja=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=R;R.prototype.define=R.prototype.define;R.prototype.upgrade=R.prototype.ca;
173 R.prototype.get=R.prototype.get;R.prototype.whenDefined=R.prototype.whenDefined;R.prototype.polyfillWrapFlushCallback=R.prototype.Za;var Ce=window.Document.prototype.createElement,De=window.Document.prototype.createElementNS,Ee=window.Document.prototype.importNode,Fe=window.Document.prototype.prepend,Ge=window.Document.prototype.append,He=window.DocumentFragment.prototype.prepend,Ie=window.DocumentFragment.prototype.append,Je=window.Node.prototype.cloneNode,Ke=window.Node.prototype.appendChild,Le=window.Node.prototype.insertBefore,Me=window.Node.prototype.removeChild,Ne=window.Node.prototype.replaceChild,Oe=Object.getOwnPropertyDescriptor(window.Node.prototype,
174 "textContent"),Pe=window.Element.prototype.attachShadow,Qe=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),Re=window.Element.prototype.getAttribute,Se=window.Element.prototype.setAttribute,Te=window.Element.prototype.removeAttribute,Ue=window.Element.prototype.getAttributeNS,Ve=window.Element.prototype.setAttributeNS,We=window.Element.prototype.removeAttributeNS,Xe=window.Element.prototype.insertAdjacentElement,Ye=window.Element.prototype.insertAdjacentHTML,Ze=window.Element.prototype.prepend,
175 $e=window.Element.prototype.append,af=window.Element.prototype.before,bf=window.Element.prototype.after,cf=window.Element.prototype.replaceWith,df=window.Element.prototype.remove,ef=window.HTMLElement,ff=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),gf=window.HTMLElement.prototype.insertAdjacentElement,hf=window.HTMLElement.prototype.insertAdjacentHTML;var jf=new function(){};function kf(){var a=lf;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.o.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=Ce.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===jf)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
176 e[d]=jf;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=ef.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function mf(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&M(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)P(a,f[d]);if(M(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&O(a,f)}}void 0!==c.aa&&(b.prepend=d(c.aa));void 0!==c.append&&(b.append=d(c.append))};function nf(){var a=lf;N(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=Ce.call(this,b);a.b(b);return b});N(Document.prototype,"importNode",function(b,c){b=Ee.call(this,b,c);this.__CE_hasRegistry?Q(a,b):we(a,b);return b});N(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=De.call(this,b,c);a.b(b);return b});
177 mf(a,Document.prototype,{aa:Fe,append:Ge})};function of(){var a=lf;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&M(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)P(a,c[b])}}})}N(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
178 b=Le.call(this,b,d);if(M(this))for(d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);d=Le.call(this,b,d);c&&P(a,b);M(this)&&O(a,b);return d});N(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ke.call(this,b);if(M(this))for(var e=0;e<c.length;e++)O(a,c[e]);return b}c=M(b);e=Ke.call(this,b);c&&P(a,b);M(this)&&O(a,b);return e});N(Node.prototype,"cloneNode",function(b){b=Je.call(this,b);this.ownerDocument.__CE_hasRegistry?Q(a,b):
179 we(a,b);return b});N(Node.prototype,"removeChild",function(b){var c=M(b),e=Me.call(this,b);c&&P(a,b);return e});N(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ne.call(this,b,d);if(M(this))for(P(a,d),d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);var f=Ne.call(this,b,d),h=M(this);h&&P(a,d);c&&P(a,b);h&&O(a,b);return f});Oe&&Oe.get?b(Node.prototype,Oe):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
180 [],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)Me.call(this,this.firstChild);Ke.call(this,document.createTextNode(a))}})})};function pf(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&M(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)P(a,g[d]);if(M(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&O(a,g)}}void 0!==af&&(b.before=c(af));void 0!==af&&(b.after=c(bf));void 0!==
181 cf&&N(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&M(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=M(this);cf.apply(this,c);for(c=0;c<h.length;c++)P(a,h[c]);if(g)for(P(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&O(a,h)});void 0!==df&&N(b,"remove",function(){var b=M(this);df.call(this);b&&P(a,this)})};function qf(){var a=lf;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;M(this)&&(e=[],se(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&a.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?Q(a,this):we(a,this);return b}})}function c(b,c){N(b,"insertAdjacentElement",function(b,d){var e=M(d);b=c.call(this,b,d);e&&P(a,d);M(b)&&O(a,
182 d);return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)Q(a,d[c])}N(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
183 a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}Pe&&N(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=Pe.call(this,a)});Qe&&Qe.get?b(Element.prototype,Qe):ff&&ff.get?b(HTMLElement.prototype,ff):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return Je.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
184 this,d=De.call(document,this.namespaceURI,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)Me.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)Ke.call(c,a.childNodes[0])}})});N(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return Se.call(this,b,c);var d=Re.call(this,b);Se.call(this,b,c);c=Re.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});N(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return Ve.call(this,b,c,
185 d);var e=Ue.call(this,b,c);Ve.call(this,b,c,d);d=Ue.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});N(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return Te.call(this,b);var c=Re.call(this,b);Te.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});N(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return We.call(this,b,c);var d=Ue.call(this,b,c);We.call(this,b,c);var e=Ue.call(this,b,c);d!==e&&a.attributeChangedCallback(this,
186 c,d,e,b)});gf?c(HTMLElement.prototype,gf):Xe?c(Element.prototype,Xe):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");hf?d(HTMLElement.prototype,hf):Ye?d(Element.prototype,Ye):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");mf(a,Element.prototype,{aa:Ze,append:$e});pf(a)};var rf=window.customElements;if(!rf||rf.forcePolyfill||"function"!=typeof rf.define||"function"!=typeof rf.get){var lf=new te;kf();nf();mf(lf,DocumentFragment.prototype,{aa:He,append:Ie});of();qf();document.__CE_hasRegistry=!0;var customElements=new R(lf);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function xf(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
187 function yf(a){a=a.replace(zf,"").replace(Af,"");var b=Bf,c=a,d=new xf;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new xf;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
188 function Bf(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Cf(c),c=c.replace(Df," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=Ef:c.match(Ff)&&(a.type=Gf,a.keyframesName=a.selector.split(Df).pop()):a.type=0===c.indexOf("--")?Hf:If);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Bf(f,
189 b);return a}function Cf(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
190 function Jf(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=Jf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(Kf,"").replace(Lf,""),b=b.replace(Mf,"").replace(Nf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
191 var If=1,Gf=7,Ef=4,Hf=1E3,zf=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Af=/@import[^;]*;/gim,Kf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,Lf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,Mf=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,Nf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Ff=/^@[^\s]*keyframes/,Df=/\s+/g;var S=!(window.ShadyDOM&&window.ShadyDOM.inUse),Of;function Pf(a){Of=a&&a.shimcssproperties?!1:S||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?Of=window.ShadyCSS.nativeCss:window.ShadyCSS?(Pf(window.ShadyCSS),window.ShadyCSS=void 0):Pf(window.WebComponents&&window.WebComponents.flags);var U=Of;var Qf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,Rf=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,Sf=/(--[\w-]+)\s*([:,;)]|$)/gi,Tf=/(animation\s*:)|(animation-name\s*:)/,Uf=/@media\s(.*)/,Vf=/\{[^}]*\}/g;var Wf=new Set;function Xf(a,b){if(!a)return"";"string"===typeof a&&(a=yf(a));b&&Yf(a,b);return Jf(a,U)}function Zf(a){!a.__cssRules&&a.textContent&&(a.__cssRules=yf(a.textContent));return a.__cssRules||null}function $f(a){return!!a.parent&&a.parent.type===Gf}function Yf(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Ef){var h=a.selector.match(Uf);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===If?b(a):c&&f===Gf?c(a):f===Hf&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)Yf(g,b,c,d)}}}
192 function ag(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;bg(e,c,d);return e}var cg=null;function bg(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);cg?a.compareDocumentPosition(cg)===Node.DOCUMENT_POSITION_PRECEDING&&(cg=a):cg=a}
193 function dg(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=dg(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function eg(a,b){S?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
194 function fg(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,P:c}};function gg(){}function hg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"")})}function ig(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);if(b="template"===b.localName?(b.content||b.kb||b).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)ig(a,b[d],c)}
195 function jg(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(kg);c?d&&(b=d.replace("style-scope","").replace(b,""),eg(a,b)):eg(a,(d?d+" ":"")+"style-scope "+b)}}function lg(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:ig(d,a,function(a){jg(a,b,!0);jg(a,c)})}function mg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"",!0)})}
196 function ng(a,b,c){var d=W,e=a.__cssBuild;S||"shady"===e?b=Xf(b,c):(a=fg(a),b=og(d,b,a.is,a.P,c)+"\n\n");return b.trim()}function og(a,b,c,d,e){var f=pg(c,d);c=c?qg+c:"";return Xf(b,function(b){b.c||(b.selector=b.s=rg(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function pg(a,b){return b?"[is="+a+"]":a}function rg(a,b,c,d,e){var f=b.selector.split(sg);if(!$f(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join(sg)}
197 function tg(a){return a.replace(ug,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}gg.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=ug.test(a);e&&(a=a.replace(ug,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=tg(a));a=a.replace(vg,wg+" $1");a=a.replace(xg,function(a,e,g){d||(a=yg(g,e,b,c),d=d||a.stop,e=a.Oa,g=a.value);return e+g});e&&(a=tg(a));return a};
198 function yg(a,b,c,d){var e=a.indexOf(zg);0<=a.indexOf(wg)?a=Ag(a,d):0!==e&&(a=c?Bg(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Cg,function(a,b){return" > "+b}))}a=a.replace(Dg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Oa:b,stop:f}}function Bg(a,b){a=a.split(Eg);a[0]+=b;return a.join(Eg)}
199 function Ag(a,b){var c=a.match(Fg);return(c=c&&c[2].trim()||"")?c[0].match(Gg)?a.replace(Fg,function(a,c,f){return b+f}):c.split(Gg)[0]===b?c:Hg:a.replace(wg,b)}function Ig(a){a.selector===Jg&&(a.selector="html")}gg.prototype.c=function(a){return a.match(zg)?this.b(a,Kg):Bg(a.trim(),Kg)};ea.Object.defineProperties(gg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
200 var ug=/:(nth[-\w]+)\(([^)]+)\)/,Kg=":not(.style-scope)",sg=",",xg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gg=/[[.:#*]/,wg=":host",Jg=":root",zg="::slotted",vg=new RegExp("^("+zg+")"),Fg=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Dg=/(.*):dir\((?:(ltr|rtl))\)/,qg=".",Eg=":",kg="class",Hg="should_not_match",W=new gg;function Lg(a,b,c,d){this.B=a||null;this.b=b||null;this.oa=c||[];this.L=null;this.P=d||"";this.a=this.v=this.G=null}function X(a){return a?a.__styleInfo:null}function Mg(a,b){return a.__styleInfo=b}Lg.prototype.c=function(){return this.B};Lg.prototype._getStyleRules=Lg.prototype.c;function Ng(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Og=navigator.userAgent.match("Trident");function Pg(){}function Qg(a){var b={},c=[],d=0;Yf(a,function(a){Rg(a);a.index=d++;a=a.m.cssText;for(var c;c=Sf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
201 function Rg(a){if(!a.m){var b={},c={};Sg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(Vf,"").replace(Qf,"");a.m=b}}function Sg(a,b){var c=a.m;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=Qf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
202 function Tg(a,b,c){b&&(b=0<=b.indexOf(";")?Ug(a,b,c):dg(b,function(b,e,f,h){if(!e)return b+h;(e=Tg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Tg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
203 function Ug(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){Rf.lastIndex=0;if(f=Rf.exec(e))e=Tg(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Tg(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
204 function Vg(a,b){var c={},d=[];Yf(a,function(a){a.m||Rg(a);var e=a.s||a.parsedSelector;b&&a.m.A&&e&&Ng.call(b,e)&&(Sg(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{A:c,key:d}}
205 function Wg(a,b,c,d){b.m||Rg(b);if(b.m.A){var e=fg(a);a=e.is;e=e.P;e=a?pg(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.s||(b.s=rg(W,b,W.b,a?qg+a:"",e)),c=b.s||e),d({ab:c,Ua:g,ub:h})}}
206 function Xg(a,b){var c={},d={},e=b&&b.__cssBuild;Yf(b,function(b){Wg(a,b,e,function(e){Ng.call(a.lb||a,e.ab)&&(e.Ua?Sg(b,c):Sg(b,d))})},null,!0);return{$a:d,Sa:c}}
207 function Yg(a,b,c,d){var e=fg(b),f=pg(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).B;var g=Zg(e,d);return ng(b,e,function(b){var e="";b.m||Rg(b);b.m.cssText&&(e=Ug(a,b.m.cssText,c));b.cssText=e;if(!S&&!$f(b)&&b.cssText){var k=e=b.cssText;null==b.wa&&(b.wa=Tf.test(e));if(b.wa)if(null==b.$){b.$=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.$.push(n))}else{for(n=0;n<b.$.length;++n)k=g[b.$[n]],e=k(e);k=e}b.cssText=k;b.s=b.s||b.selector;e="."+
208 d;n=b.s.split(",");k=0;for(var t=n.length,C;k<t&&(C=n[k]);k++)n[k]=C.match(h)?C.replace(f,e):e+" "+C;b.selector=n.join(",")}})}function Zg(a,b){a=a.b;var c={};if(!S&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.s=f.s||f.selector;f.selector=f.s.replace(f.keyframesName,f.a);c[e.keyframesName]=$g(e)}return c}function $g(a){return function(b){return b.replace(a.i,a.a)}}
209 function ah(a,b){var c=bh,d=Zf(a);a.textContent=Xf(d,function(a){var d=a.cssText=a.parsedCssText;a.m&&a.m.cssText&&(d=d.replace(Kf,"").replace(Lf,""),a.cssText=Ug(c,d,b))})}ea.Object.defineProperties(Pg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var bh=new Pg;var ch={},dh=window.customElements;if(dh&&!S){var eh=dh.define;dh.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(cg?cg.nextSibling:null)||e.firstChild);cg=d;ch[a]=d;eh.call(dh,a,b,c)}};function fh(){this.cache={}}fh.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,v:d});100<e.length&&e.shift();this.cache[a]=e};fh.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.A[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function gh(){}
210 function hh(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(W.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)mg(e,h);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(f=
211 f.host))for(f=fg(f).is,f!==h&&lg(e,h,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)if(h=e[f],g=h.getRootNode().host)g=fg(g).is,jg(h,g)}}}}
212 if(!S){var ih=new MutationObserver(hh),jh=function(a){ih.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)jh(document);else{var kh=function(){jh(document.body)};window.HTMLImports?window.HTMLImports.whenReady(kh):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){kh();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else kh()})}gh=function(){hh(ih.takeRecords())}}
213 var lh=gh;var mh={};var nh=Promise.resolve();function oh(a){if(a=mh[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function ph(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function qh(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,nh.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var rh=new fh;function Y(){this.J={};this.c=document.documentElement;var a=new xf;a.rules=[];this.i=Mg(this.c,new Lg(a));this.o=!1;this.b=this.a=null}p=Y.prototype;p.pa=function(){lh()};p.Qa=function(a){return Zf(a)};p.cb=function(a){return Xf(a)};p.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
214 p.prepareTemplateStyles=function(a,b,c){if(!a.o){a.o=!0;a.name=b;a.extends=c;mh[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!S){var k=g.textContent;Wf.has(k)||(Wf.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,
215 ib:d};sh(this);f=Rf.test(e)||Qf.test(e);Rf.lastIndex=0;Qf.lastIndex=0;e=yf(e);f&&U&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.J=d;d=[];U||(d=Qg(a._styleAst));if(!d.length||U)e=S?a.content:null,b=ch[b],f=ng(c,a._styleAst),b=f.length?ag(f,c.is,e,b):void 0,a.a=b;a.i=d}};p.prepareTemplateDom=function(a,b){S||a.c||(a.c=!0,hg(a.content,b))};
216 function th(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.Aa(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.o)&&a.flushCustomStyles()})})}function sh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=oh);th(a)}
217 p.flushCustomStyles=function(){sh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(U)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&U&&this.a){var d=Zf(c);sh(this);this.a.transformRules(d);c.textContent=Xf(d)}}else for(uh(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&ah(c,this.i.G);this.b.enqueued=!1;this.o&&!U&&this.styleDocument()}}};
218 p.styleElement=function(a,b){var c=fg(a).is,d=X(a);if(!d){var e=fg(a);d=e.is;e=e.P;var f=ch[d];d=mh[d];if(d){var h=d._styleAst;var g=d.i}d=Mg(a,new Lg(h,f,g,e))}a!==this.c&&(this.o=!0);b&&(d.L=d.L||{},Object.assign(d.L,b));if(U){if(d.L){b=d.L;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=mh[c])||a===this.c)&&k&&k.a&&!ph(k)){if(ph(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)sh(this),this.a&&this.a.transformRules(k._styleAst,c),k.a.textContent=
219 ng(a,d.B),qh(k);S&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=ng(a,d.B));d.B=k._styleAst}}else if(this.pa(),uh(this,a,d),d.oa&&d.oa.length){c=d;k=fg(a).is;d=(b=rh.fetch(k,c.G,c.oa))?b.styleElement:null;h=c.v;(g=b&&b.v)||(g=this.J[k]=(this.J[k]||0)+1,g=k+"-"+g);c.v=g;g=c.v;e=bh;e=d?d.textContent||"":Yg(e,a,c.G,g);f=X(a);var l=f.a;l&&!S&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=ag(e,g,a.shadowRoot,f.b)):d?d.parentNode||
220 (Og&&-1<e.indexOf("@media")&&(d.textContent=e),bg(d,null,f.b)):e&&(d=ag(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;S||(d=c.v,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&eg(a,f));b||rh.store(k,c.G,g,c.v)}};function vh(a,b){return(b=b.getRootNode().host)?X(b)?b:vh(a,b):a.c}
221 function uh(a,b,c){a=vh(a,b);var d=X(a);a=Object.create(d.G||null);var e=Xg(b,c.B);b=Vg(d.B,b).A;Object.assign(a,e.Sa,b,e.$a);b=c.L;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=bh;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Tg(f,a[d],a);c.G=a}p.styleDocument=function(a){this.styleSubtree(this.c,a)};
222 p.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};p.Aa=function(a){var b=this,c=Zf(a);Yf(c,function(a){if(S)Ig(a);else{var c=W;a.selector=a.parsedSelector;Ig(a);a.selector=a.s=rg(c,a,c.c,void 0,void 0)}U&&(sh(b),b.a&&b.a.transformRule(a))});U?a.textContent=Xf(c):this.i.B.rules.push(c)};
223 p.getComputedStyleValue=function(a,b){var c;U||(c=(X(a)||X(vh(this,a))).G[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};p.bb=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);U||(c=X(a))&&c.v&&b.push(bh.a,c.v);eg(a,b.join(" "))};p.Na=function(a){return X(a)};Y.prototype.flush=Y.prototype.pa;
224 Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.bb;Y.prototype._styleInfoForNode=Y.prototype.Na;Y.prototype.transformCustomStyleForDocument=Y.prototype.Aa;Y.prototype.getStyleAst=Y.prototype.Qa;Y.prototype.styleAstToString=Y.prototype.cb;
225 Y.prototype.flushCustomStyles=Y.prototype.flushCustomStyles;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return S}},nativeCss:{get:function(){return U}}});var Z=new Y,wh,xh;window.ShadyCSS&&(wh=window.ShadyCSS.ApplyShim,xh=window.ShadyCSS.CustomStyleInterface);
226 window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},
227 getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:U,nativeShadow:S};wh&&(window.ShadyCSS.ApplyShim=wh);xh&&(window.ShadyCSS.CustomStyleInterface=xh);var yh=window.customElements,zh=window.HTMLImports,Ah=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(yh&&yh.polyfillWrapFlushCallback){var Bh,Ch=function(){if(Bh){Ah.C&&Ah.C(window.document);var a=Bh;Bh=null;a();return!0}},Dh=zh.whenReady;yh.polyfillWrapFlushCallback(function(a){Bh=a;Dh(Ch)});zh.whenReady=function(a){Dh(function(){Ch()?zh.whenReady(a):a()})}}
228 zh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var Eh=document.createElement("style");Eh.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Fh=document.querySelector("head");Fh.insertBefore(Eh,Fh.firstChild);}).call(this);
229
230 //# sourceMappingURL=webcomponents-lite.js.map
@@ -1,12 +0,0 b''
1 /**
2 * @license
3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 * Code distributed by Google as part of the polymer project is also
8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 // @version 0.7.22
11 !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents-lite.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,o=e.split("=");o[0]&&(t=o[0].match(/wc-(.+)/))&&(n[t[1]]=o[1]||!0)}),t)for(var o,r=0;o=t.attributes[r];r++)"src"!==o.name&&(n[o.name]=o.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function o(e){return""==e&&n.call(this),e.toLowerCase()}function r(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",l=0,u="",w=!1,_=!1,g=[];e:for(;(e[l-1]!=p||0==l)&&!this._isInvalid;){var b=e[l];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}u="",d="no scheme";continue}u+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))u+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}u="",l=0,d="no scheme";continue}if(this._scheme=u,u="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[l+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[l+1],E=e[l+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),u+="%40"),w=!0;for(var L=0;L<u.length;L++){var N=u[L];if(" "!=N&&"\n"!=N&&"\r"!=N)if(":"!=N||null!==this._password){var M=r(N);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}u=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){l-=u.length,u="",d="host";continue}u+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=u.length||!m.test(u[0])||":"!=u[1]&&"|"!=u[1]?0==u.length?d="relative path start":(this._host=o.call(this,u),u="",d="relative path start"):d="relative path";continue}" "==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):u+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=o.call(this,u),u="",d="relative path start",a)break e;continue}" "!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),u+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=o.call(this,u),u="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))u+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=u){var T=parseInt(u,10);T!=h[this._scheme]&&(this._port=T+""),u=""}if(a)break e;d="relative path start";continue}" "==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))" "!=b&&"\n"!=b&&"\r"!=b&&(u+=r(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[u.toLowerCase()])&&(u=O),".."==u?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==u&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=u&&("file"==this._scheme&&0==this._path.length&&2==u.length&&m.test(u[0])&&"|"==u[1]&&(u=u[0]+":"),this._path.push(u)),u="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}l++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var l=new URL("b","http://a");l.pathname="c%20d",d="http://a/c%20d"===l.href}catch(u){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function l(e){return L?L:(L=c(E),L.oldValue=e,L)}function u(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new d("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?l(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=d("characterData",o),a=e.prevValue;i(o,function(e){return e.characterData?e.characterDataOldValue?l(a):r:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,r=d("childList",e.target.parentNode);r.addedNodes=s,r.removedNodes=c,r.previousSibling=f,r.nextSibling=p,i(e.relatedNode,function(e){return e.childList?r:void 0})}u()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(u,e)}var n="undefined"==typeof HTMLTemplateElement;/Trident/.test(navigator.userAgent)&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}();var o=function(){if(!n){var e=document.createElement("template"),t=document.createElement("template");t.content.appendChild(document.createElement("div")),e.content.appendChild(t);var o=e.cloneNode(!0);return 0===o.content.childNodes.length||0===o.content.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(e.cloneNode=function(e){return i.cloneNode(this,e)},s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0})}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;a>o&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var l=document.createElement;document.createElement=function(){"use strict";var e=l.apply(document,arguments);return"template"===e.localName&&i.decorate(e),e};var u=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e,!1);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){if(t.querySelectorAll)for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;c>s;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(window.HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:l,errorImports:u})}function o(e){r(e),l.push(this),c++,n()}function i(e){u.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,l=[],u=[];if(d)for(var h,f=0;d>f&&(h=s[f]);f++)a(h)?(l.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return u?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var l="import",u=Boolean(l in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";u&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;o>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=l,e.useNative=u,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===l}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,l=e.IMPORT_LINK_TYPE,u="link[rel="+l+"]",h={documentSelectors:u,importsSelectors:[u,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(-1==e.textContent.indexOf("@import"))r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;a>i&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=u}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,l=e.Observer,u=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new l,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;c>s&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;o>n&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e)}):s(e)}function s(e){
12 e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function u(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=u(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),l(c.__name,c),c.ctor=u(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<y.length;t++)if(e===y[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return _(N(e.tag),e)}function d(e){return e?E[e.toLowerCase()]:void 0}function l(e,t){E[e]=t}function u(e){return function(){return c(e)}}function h(e,t,n){return e===L?f(t,n):M(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=N(e),e.indexOf("-")>=0&&g(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),w=e.upgradeAll,_=e.upgradeWithDefinition,g=e.implementPrototype,b=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],E={},L="http://www.w3.org/1999/xhtml",N=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||b?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=E,e["instanceof"]=m,e.reservedTagList=y,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents); No newline at end of file
@@ -1,14 +0,0 b''
1 /**
2 * @license
3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 * Code distributed by Google as part of the polymer project is also
8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 // @version 0.7.22
11 !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&-1!==d.attributeFilter.indexOf(o.name))&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
12 querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;f>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){
13 return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n ",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if(" "!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}" "==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}" "!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}" "==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))" "!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==v||(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),c++,n()}function i(e){d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];
14 if(l)for(var p,h=0;l>h&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(T(e.tag),e)}function l(e){return e?_[e.toLowerCase()]:void 0}function u(e,t){_[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===S?h(t,n):M(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=T(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents); No newline at end of file
This diff has been collapsed as it changes many lines, (521 lines changed) Show them Hide them
@@ -1,521 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Reference example of the rcextensions module.
23
24 This module is also used during integration tests to verify that all showed
25 examples are valid.
26 """
27
28 import collections
29 import os
30 import imp
31
32 here = os.path.dirname(os.path.abspath(__file__))
33
34
35 def load_extension(filename, async=False):
36 """
37 use to load extensions inside rcextension folder.
38 for example::
39
40 callback = load_extension('email.py', async=False)
41 if callback:
42 callback('foobar')
43
44 put file named email.py inside rcextensions folder to load it. Changing
45 async=True will make the call of the plugin async, it's useful for
46 blocking calls like sending an email or notification with APIs.
47 """
48 mod = ''.join(filename.split('.')[:-1])
49 loaded = imp.load_source(mod, os.path.join(here, filename))
50
51 callback = getattr(loaded, 'run', None)
52 if not callback:
53 raise Exception('Plugin missing `run` method')
54 if async:
55 # modify callback so it's actually an async call
56 def _async_callback(*args, **kwargs):
57 import threading
58 thr = threading.Thread(target=callback, args=args, kwargs=kwargs)
59 thr.start()
60 if kwargs.get('_async_block'):
61 del kwargs['_async_block']
62 thr.join()
63
64 return _async_callback
65 return callback
66
67
68 # Additional mappings that are not present in the pygments lexers
69 # used for building stats
70 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
71 # more than one name for extension
72 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
73 # build by pygments
74 EXTRA_MAPPINGS = {}
75
76 # additional lexer definitions for custom files it's overrides pygments lexers,
77 # and uses defined name of lexer to colorize the files. Format is {'ext':
78 # 'lexer_name'} List of lexers can be printed running:
79 # >> python -c "import pprint;from pygments import lexers;
80 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
81
82 EXTRA_LEXERS = {}
83
84
85 calls = collections.defaultdict(list)
86
87
88 def log_call(name):
89 def wrap(f):
90 def wrapper(*args, **kwargs):
91 calls[name].append((args, kwargs))
92 return f(*args, **kwargs)
93 return wrapper
94 return wrap
95
96
97 # =============================================================================
98 # POST CREATE REPOSITORY HOOK
99 # =============================================================================
100 # this function will be executed after each repository is created
101
102
103 def _crrepohook(*args, **kwargs):
104 """
105 Post create repository HOOK
106 kwargs available:
107 :param repo_name:
108 :param repo_type:
109 :param description:
110 :param private:
111 :param created_on:
112 :param enable_downloads:
113 :param repo_id:
114 :param user_id:
115 :param enable_statistics:
116 :param clone_uri:
117 :param fork_id:
118 :param group_id:
119 :param created_by:
120 """
121
122 expected_parameters = (
123 'repo_name', 'repo_type', 'description', 'private', 'created_on',
124 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
125 'clone_uri', 'fork_id', 'group_id', 'created_by')
126 _verify_kwargs(expected_parameters, kwargs)
127
128 return 0
129
130 CREATE_REPO_HOOK = _crrepohook
131
132
133 # =============================================================================
134 # POST CREATE REPOSITORY GROUP HOOK
135 # =============================================================================
136 # this function will be executed after each repository group is created
137
138
139 def _crrepogrouphook(*args, **kwargs):
140 """
141 Post create repository group HOOK
142 kwargs available:
143
144 :param group_name:
145 :param group_parent_id:
146 :param group_description:
147 :param group_id:
148 :param user_id:
149 :param created_by:
150 :param created_on:
151 :param enable_locking:
152 """
153
154 expected_parameters = (
155 'group_name', 'group_parent_id', 'group_description',
156 'group_id', 'user_id', 'created_by', 'created_on',
157 'enable_locking')
158 _verify_kwargs(expected_parameters, kwargs)
159
160 return 0
161
162 CREATE_REPO_GROUP_HOOK = _crrepogrouphook
163
164 # =============================================================================
165 # PRE CREATE USER HOOK
166 # =============================================================================
167 # this function will be executed before each user is created
168
169
170 def _pre_cruserhook(*args, **kwargs):
171 """
172 Pre create user HOOK, it returns a tuple of bool, reason.
173 If bool is False the user creation will be stopped and reason
174 will be displayed to the user.
175 kwargs available:
176 :param username:
177 :param password:
178 :param email:
179 :param firstname:
180 :param lastname:
181 :param active:
182 :param admin:
183 :param created_by:
184 """
185
186 expected_parameters = (
187 'username', 'password', 'email', 'firstname', 'lastname', 'active',
188 'admin', 'created_by')
189 _verify_kwargs(expected_parameters, kwargs)
190
191 reason = 'allowed'
192 return True, reason
193 PRE_CREATE_USER_HOOK = _pre_cruserhook
194
195 # =============================================================================
196 # POST CREATE USER HOOK
197 # =============================================================================
198 # this function will be executed after each user is created
199
200
201 def _cruserhook(*args, **kwargs):
202 """
203 Post create user HOOK
204 kwargs available:
205 :param username:
206 :param full_name_or_username:
207 :param full_contact:
208 :param user_id:
209 :param name:
210 :param firstname:
211 :param short_contact:
212 :param admin:
213 :param lastname:
214 :param ip_addresses:
215 :param extern_type:
216 :param extern_name:
217 :param email:
218 :param api_key:
219 :parma api_keys:
220 :param last_login:
221 :param full_name:
222 :param active:
223 :param password:
224 :param emails:
225 :param inherit_default_permissions:
226 :param created_by:
227 :param created_on:
228 """
229
230 expected_parameters = (
231 'username', 'full_name_or_username', 'full_contact', 'user_id',
232 'name', 'firstname', 'short_contact', 'admin', 'lastname',
233 'ip_addresses', 'extern_type', 'extern_name',
234 'email', 'api_key', 'api_keys', 'last_login',
235 'full_name', 'active', 'password', 'emails',
236 'inherit_default_permissions', 'created_by', 'created_on')
237 _verify_kwargs(expected_parameters, kwargs)
238
239 return 0
240 CREATE_USER_HOOK = _cruserhook
241
242
243 # =============================================================================
244 # POST DELETE REPOSITORY HOOK
245 # =============================================================================
246 # this function will be executed after each repository deletion
247
248
249 def _dlrepohook(*args, **kwargs):
250 """
251 Post delete repository HOOK
252 kwargs available:
253 :param repo_name:
254 :param repo_type:
255 :param description:
256 :param private:
257 :param created_on:
258 :param enable_downloads:
259 :param repo_id:
260 :param user_id:
261 :param enable_statistics:
262 :param clone_uri:
263 :param fork_id:
264 :param group_id:
265 :param deleted_by:
266 :param deleted_on:
267 """
268
269 expected_parameters = (
270 'repo_name', 'repo_type', 'description', 'private', 'created_on',
271 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
272 'clone_uri', 'fork_id', 'group_id', 'deleted_by', 'deleted_on')
273 _verify_kwargs(expected_parameters, kwargs)
274
275 return 0
276 DELETE_REPO_HOOK = _dlrepohook
277
278
279 # =============================================================================
280 # POST DELETE USER HOOK
281 # =============================================================================
282 # this function will be executed after each user is deleted
283
284
285 def _dluserhook(*args, **kwargs):
286 """
287 Post delete user HOOK
288 kwargs available:
289 :param username:
290 :param full_name_or_username:
291 :param full_contact:
292 :param user_id:
293 :param name:
294 :param firstname:
295 :param short_contact:
296 :param admin:
297 :param lastname:
298 :param ip_addresses:
299 :param ldap_dn:
300 :param email:
301 :param api_key:
302 :param last_login:
303 :param full_name:
304 :param active:
305 :param password:
306 :param emails:
307 :param inherit_default_permissions:
308 :param deleted_by:
309 """
310
311 expected_parameters = (
312 'username', 'full_name_or_username', 'full_contact', 'user_id',
313 'name', 'firstname', 'short_contact', 'admin', 'lastname',
314 'ip_addresses',
315 # TODO: johbo: Check what's the status with the ldap_dn parameter
316 # 'ldap_dn',
317 'email', 'api_key', 'last_login',
318 'full_name', 'active', 'password', 'emails',
319 'inherit_default_permissions', 'deleted_by')
320 _verify_kwargs(expected_parameters, kwargs)
321
322 return 0
323 DELETE_USER_HOOK = _dluserhook
324
325
326 # =============================================================================
327 # PRE PUSH HOOK
328 # =============================================================================
329
330
331 # this function will be executed after each push it's executed after the
332 # build-in hook that RhodeCode uses for logging pushes
333 @log_call('pre_push')
334 def _prepushhook(*args, **kwargs):
335 """
336 Pre push hook
337 kwargs available:
338
339 :param server_url: url of instance that triggered this hook
340 :param config: path to .ini config used
341 :param scm: type of VS 'git' or 'hg'
342 :param username: name of user who pushed
343 :param ip: ip of who pushed
344 :param action: push
345 :param repository: repository name
346 :param repo_store_path: full path to where repositories are stored
347 :param commit_ids: list of pushed commit ids
348 """
349
350 expected_parameters = (
351 'server_url', 'config', 'scm', 'username', 'ip', 'action',
352 'repository', 'repo_store_path', 'commit_ids')
353 _verify_kwargs(expected_parameters, kwargs)
354
355 return 0
356 PRE_PUSH_HOOK = _prepushhook
357
358
359 # =============================================================================
360 # POST PUSH HOOK
361 # =============================================================================
362
363
364 # this function will be executed after each push it's executed after the
365 # build-in hook that RhodeCode uses for logging pushes
366 @log_call('post_push')
367 def _pushhook(*args, **kwargs):
368 """
369 Post push hook
370 kwargs available:
371
372 :param server_url: url of instance that triggered this hook
373 :param config: path to .ini config used
374 :param scm: type of VS 'git' or 'hg'
375 :param username: name of user who pushed
376 :param ip: ip of who pushed
377 :param action: push
378 :param repository: repository name
379 :param repo_store_path: full path to where repositories are stored
380 :param pushed_revs: list of pushed revisions
381 """
382
383 expected_parameters = (
384 'server_url', 'config', 'scm', 'username', 'ip', 'action',
385 'repository', 'repo_store_path', 'pushed_revs')
386 _verify_kwargs(expected_parameters, kwargs)
387
388 return 0
389 PUSH_HOOK = _pushhook
390
391
392 # =============================================================================
393 # PRE PULL HOOK
394 # =============================================================================
395
396 # this function will be executed after each push it's executed after the
397 # build-in hook that RhodeCode uses for logging pulls
398 def _prepullhook(*args, **kwargs):
399 """
400 Post pull hook
401 kwargs available::
402
403 :param server_url: url of instance that triggered this hook
404 :param config: path to .ini config used
405 :param scm: type of VS 'git' or 'hg'
406 :param username: name of user who pulled
407 :param ip: ip of who pulled
408 :param action: pull
409 :param repository: repository name
410 """
411
412 expected_parameters = (
413 'server_url', 'config', 'scm', 'username', 'ip', 'action',
414 'repository')
415 _verify_kwargs(expected_parameters, kwargs)
416
417 return 0
418 PRE_PULL_HOOK = _prepullhook
419
420
421
422 # =============================================================================
423 # POST PULL HOOK
424 # =============================================================================
425
426 # this function will be executed after each push it's executed after the
427 # build-in hook that RhodeCode uses for logging pulls
428 def _pullhook(*args, **kwargs):
429 """
430 Post pull hook
431 kwargs available::
432
433 :param server_url: url of instance that triggered this hook
434 :param config: path to .ini config used
435 :param scm: type of VS 'git' or 'hg'
436 :param username: name of user who pulled
437 :param ip: ip of who pulled
438 :param action: pull
439 :param repository: repository name
440 """
441
442 expected_parameters = (
443 'server_url', 'config', 'scm', 'username', 'ip', 'action',
444 'repository')
445 _verify_kwargs(expected_parameters, kwargs)
446
447 return 0
448 PULL_HOOK = _pullhook
449
450
451 # =============================================================================
452 # PULL REQUEST RELATED HOOKS
453 # =============================================================================
454
455 def _create_pull_request_hook(*args, **kwargs):
456 expected_parameters = (
457 'server_url', 'config', 'scm', 'username', 'ip', 'action',
458 'repository', 'pull_request_id', 'url', 'title', 'description',
459 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
460 'mergeable', 'source', 'target', 'author', 'reviewers')
461 _verify_kwargs(expected_parameters, kwargs)
462 return 0
463 CREATE_PULL_REQUEST = _create_pull_request_hook
464
465
466 def _merge_pull_request_hook(*args, **kwargs):
467 expected_parameters = (
468 'server_url', 'config', 'scm', 'username', 'ip', 'action',
469 'repository', 'pull_request_id', 'url', 'title', 'description',
470 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
471 'mergeable', 'source', 'target', 'author', 'reviewers')
472 _verify_kwargs(expected_parameters, kwargs)
473 return 0
474 MERGE_PULL_REQUEST = _merge_pull_request_hook
475
476
477 def _close_pull_request_hook(*args, **kwargs):
478 expected_parameters = (
479 'server_url', 'config', 'scm', 'username', 'ip', 'action',
480 'repository', 'pull_request_id', 'url', 'title', 'description',
481 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
482 'mergeable', 'source', 'target', 'author', 'reviewers')
483 _verify_kwargs(expected_parameters, kwargs)
484 return 0
485 CLOSE_PULL_REQUEST = _close_pull_request_hook
486
487
488 def _review_pull_request_hook(*args, **kwargs):
489 expected_parameters = (
490 'server_url', 'config', 'scm', 'username', 'ip', 'action',
491 'repository', 'pull_request_id', 'url', 'title', 'description',
492 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
493 'mergeable', 'source', 'target', 'author', 'reviewers')
494 _verify_kwargs(expected_parameters, kwargs)
495 return 0
496 REVIEW_PULL_REQUEST = _review_pull_request_hook
497
498
499 def _update_pull_request_hook(*args, **kwargs):
500 expected_parameters = (
501 'server_url', 'config', 'scm', 'username', 'ip', 'action',
502 'repository', 'pull_request_id', 'url', 'title', 'description',
503 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
504 'mergeable', 'source', 'target', 'author', 'reviewers')
505 _verify_kwargs(expected_parameters, kwargs)
506 return 0
507 UPDATE_PULL_REQUEST = _update_pull_request_hook
508
509
510 def _verify_kwargs(expected_parameters, kwargs):
511 """
512 Verify that exactly `expected_parameters` are passed in as `kwargs`.
513 """
514 expected_parameters = set(expected_parameters)
515 kwargs_keys = set(kwargs.keys())
516 if kwargs_keys != expected_parameters:
517 missing_kwargs = expected_parameters - kwargs_keys
518 unexpected_kwargs = kwargs_keys - expected_parameters
519 raise AssertionError(
520 "rcextensions: Missing parameters: %r, unexpected parameters: %s" %
521 (missing_kwargs, unexpected_kwargs))
General Comments 0
You need to be logged in to leave comments. Login now