From a8fc561c01e6a98e262f07d7f60d79779d43fe83 Mon Sep 17 00:00:00 2001 From: Xiao Gui <xgui3783@gmail.com> Date: Wed, 6 Sep 2023 14:37:05 +0200 Subject: [PATCH] refactor: port to python for backend --- .github/workflows/ci.yml | 4 +- Dockerfile | 48 +- backend/.gitignore | 3 + backend/app/_store.py | 142 + backend/app/app.py | 50 + backend/app/auth.py | 67 + backend/app/bkwdcompat.py | 248 + backend/app/config.py | 39 + backend/app/const.py | 21 + backend/app/dev_banner.py | 22 + backend/app/index_html.py | 45 + backend/app/logger.py | 42 + backend/app/plugin.py | 80 + backend/app/quickstart.py | 55 + backend/app/sane_url.py | 152 + backend/app/sxplr_iam.py | 6 + backend/app/user.py | 63 + backend/app/util.py | 54 + {deploy => backend/app}/well-known/robot.txt | 0 .../app}/well-known/security.txt | 0 backend/requirements.txt | 12 + check_all.sh | 47 - deploy/.gitignore | 3 - deploy/README.md | 18 - deploy/api-test/Jenkinsfile | 58 - .../api-test/datasets/mouse.2015.e2e-spec.js | 13 - .../api-test/datasets/mouse.2017.e2e-spec.js | 13 - .../api-test/datasets/rat.v1_01.e2e-spec.js | 13 - deploy/api-test/datasets/rat.v2.e2e-spec.js | 13 - deploy/api-test/datasets/rat.v3.e2e-spec.js | 13 - deploy/api-test/datasets/ratMouse.util.js | 77 - deploy/api-test/datasets/util.js | 15 - deploy/app.js | 228 - deploy/app.spec.js | 90 - deploy/auth/hbp-oidc-v2.js | 81 - deploy/auth/index.js | 38 - deploy/auth/index.spec.js | 109 - deploy/auth/oidc.js | 52 - deploy/auth/spec-helper.js | 66 - deploy/auth/util.js | 26 - deploy/auth/util.spec.js | 151 - deploy/bkwdCompat/index.js | 24 - deploy/bkwdCompat/ngLinks.json | 705 --- deploy/bkwdCompat/urlState.js | 287 - deploy/bkwdCompat/urlState.spec.js | 18 - deploy/catchError.js | 13 - deploy/constants.js | 21 - deploy/csp/index.js | 147 - deploy/csp/index.spec.js | 109 - deploy/devBanner/index.js | 29 - deploy/logging/index.js | 35 - deploy/lruStore/index.js | 164 - deploy/package-lock.json | 5133 ----------------- deploy/package.json | 44 - deploy/plugins/index.js | 84 - deploy/quickstart/index.js | 58 - deploy/saneUrl/depcObjStore.js | 26 - deploy/saneUrl/index.js | 134 - deploy/saneUrl/index.spec.js | 327 -- deploy/saneUrl/store.js | 100 - deploy/saneUrl/util.js | 70 - deploy/saneUrl/util.spec.js | 206 - deploy/server.js | 90 - deploy/server.spec.js | 112 - deploy/user/index.js | 86 - deploy/user/index.spec.js | 245 - deploy/user/store.js | 68 - deploy/util/streamHandleError.js | 4 - deploy_env.md | 67 +- e2e/screenshots/gen.js | 1 + netlify.toml | 7 - src/util/fn.ts | 3 - 72 files changed, 1126 insertions(+), 9568 deletions(-) create mode 100644 backend/.gitignore create mode 100644 backend/app/_store.py create mode 100644 backend/app/app.py create mode 100644 backend/app/auth.py create mode 100644 backend/app/bkwdcompat.py create mode 100644 backend/app/config.py create mode 100644 backend/app/const.py create mode 100644 backend/app/dev_banner.py create mode 100644 backend/app/index_html.py create mode 100644 backend/app/logger.py create mode 100644 backend/app/plugin.py create mode 100644 backend/app/quickstart.py create mode 100644 backend/app/sane_url.py create mode 100644 backend/app/sxplr_iam.py create mode 100644 backend/app/user.py create mode 100644 backend/app/util.py rename {deploy => backend/app}/well-known/robot.txt (100%) rename {deploy => backend/app}/well-known/security.txt (100%) create mode 100644 backend/requirements.txt delete mode 100755 check_all.sh delete mode 100644 deploy/.gitignore delete mode 100644 deploy/README.md delete mode 100644 deploy/api-test/Jenkinsfile delete mode 100644 deploy/api-test/datasets/mouse.2015.e2e-spec.js delete mode 100644 deploy/api-test/datasets/mouse.2017.e2e-spec.js delete mode 100644 deploy/api-test/datasets/rat.v1_01.e2e-spec.js delete mode 100644 deploy/api-test/datasets/rat.v2.e2e-spec.js delete mode 100644 deploy/api-test/datasets/rat.v3.e2e-spec.js delete mode 100644 deploy/api-test/datasets/ratMouse.util.js delete mode 100644 deploy/api-test/datasets/util.js delete mode 100644 deploy/app.js delete mode 100644 deploy/app.spec.js delete mode 100644 deploy/auth/hbp-oidc-v2.js delete mode 100644 deploy/auth/index.js delete mode 100644 deploy/auth/index.spec.js delete mode 100644 deploy/auth/oidc.js delete mode 100644 deploy/auth/spec-helper.js delete mode 100644 deploy/auth/util.js delete mode 100644 deploy/auth/util.spec.js delete mode 100644 deploy/bkwdCompat/index.js delete mode 100644 deploy/bkwdCompat/ngLinks.json delete mode 100644 deploy/bkwdCompat/urlState.js delete mode 100644 deploy/bkwdCompat/urlState.spec.js delete mode 100644 deploy/catchError.js delete mode 100644 deploy/constants.js delete mode 100644 deploy/csp/index.js delete mode 100644 deploy/csp/index.spec.js delete mode 100644 deploy/devBanner/index.js delete mode 100644 deploy/logging/index.js delete mode 100644 deploy/lruStore/index.js delete mode 100644 deploy/package-lock.json delete mode 100644 deploy/package.json delete mode 100644 deploy/plugins/index.js delete mode 100644 deploy/quickstart/index.js delete mode 100644 deploy/saneUrl/depcObjStore.js delete mode 100644 deploy/saneUrl/index.js delete mode 100644 deploy/saneUrl/index.spec.js delete mode 100644 deploy/saneUrl/store.js delete mode 100644 deploy/saneUrl/util.js delete mode 100644 deploy/saneUrl/util.spec.js delete mode 100644 deploy/server.js delete mode 100644 deploy/server.spec.js delete mode 100644 deploy/user/index.js delete mode 100644 deploy/user/index.spec.js delete mode 100644 deploy/user/store.js delete mode 100644 deploy/util/streamHandleError.js delete mode 100644 netlify.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25a2cd761..1b17f4974 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,5 @@ jobs: with: node-version: 16.x - run: | - cd deploy - npm i - npm run test + echo "busybody" diff --git a/Dockerfile b/Dockerfile index a6277e7b7..26aa7f570 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,48 +40,28 @@ RUN node ./src/environments/parseEnv.js RUN npm run build RUN node third_party/matomo/processMatomo.js -# RUN npm run build-storybook - -# gzipping container -FROM ubuntu:22.04 as compressor -RUN apt upgrade -y && apt update && apt install brotli - -RUN mkdir /iv -COPY --from=builder /iv/dist/aot /iv -# COPY --from=builder /iv/storybook-static /iv/storybook-static - -# Remove duplicated assets. Use symlink instead. -# WORKDIR /iv/storybook-static -RUN rm -rf ./assets -RUN ln -s ../assets ./assets - -WORKDIR /iv - -RUN for f in $(find . -type f); do gzip < $f > $f.gz && brotli < $f > $f.br; done # prod container -FROM node:16-alpine +FROM python:3.10-alpine + +RUN adduser --disabled-password nonroot -ENV NODE_ENV=production +# Needed for the requirement as git, otherwise, not needed +RUN apk update +RUN apk add git curl -RUN apk --no-cache add ca-certificates RUN mkdir /iv-app WORKDIR /iv-app -# Copy common folder -COPY --from=builder /iv/common /common - -# Copy the express server -COPY --from=builder /iv/deploy . +# Copy the fastapi server +COPY --from=builder /iv/backend . +RUN pip install -r requirements.txt +COPY --from=builder /iv/dist/aot /iv/backend/public -# Copy built siibra explorer -COPY --from=compressor /iv ./public +ENV PATH_TO_PUBLIC=/iv/backend/public -RUN chown -R node:node /iv-app - -USER node -RUN npm i +RUN chown -R nonroot:nonroot /iv-app +USER nonroot EXPOSE 8080 -ENV PORT 8080 -ENTRYPOINT [ "node", "server.js" ] +ENTRYPOINT uvicorn app.app:app --host 0.0.0.0 --port 8080 diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 000000000..2fb9ba976 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,3 @@ +venv +__pycache__ +.env diff --git a/backend/app/_store.py b/backend/app/_store.py new file mode 100644 index 000000000..63ddd248d --- /dev/null +++ b/backend/app/_store.py @@ -0,0 +1,142 @@ +from abc import ABC, abstractmethod +from ebrains_drive import BucketApiClient +from io import StringIO +import requests +from .logger import logger + +class Store(ABC): + @abstractmethod + def set(self, key: str, value: str): ... + + @abstractmethod + def get(self, key: str): ... + + @abstractmethod + def delete(self, key: str): ... + + def is_healthy(self) -> bool: + raise NotImplementedError + +class FallbackStore(Store): + _mem = {} + def set(self, key: str, value: str): + self._mem[key] = value + + def get(self, key: str): + return self._mem.get(key) + + def delete(self, key: str): + self._mem.pop(key, None) + + def is_healthy(self) -> bool: + return True + + _instance: 'FallbackStore' = None + @classmethod + def Ephemeral(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + +class RedisEphStore(Store): + + _persistent_store: "RedisEphStore" = None + _ephemeral_store: "RedisEphStore" = None + + def __init__(self, host: str="localhost", port: int=6379, username: str=None, password: str=None, expiry_s: int=60*60*24) -> None: + super().__init__() + from redis import Redis + self._redis = Redis(host, port, password=password, username=username) + self.expiry_s = expiry_s + + def set(self, key: str, value: str): + self._redis.set(key, value, ex=self.expiry_s) + + def delete(self, key: str): + self._redis.delete(key) + + def get(self, key: str): + return self._redis.get(key) + + def is_healthy(self) -> bool: + try: + self._redis.ping() + return True + except Exception as e: + logger.error(f"redis store is not healthy! {str(e)}") + return False + + @classmethod + def Persistent(cls): + from .config import REDIS_ADDR, REDIS_PASSWORD, REDIS_PORT, REDIS_USERNAME + if cls._persistent_store is None: + cls._persistent_store = cls(REDIS_ADDR, REDIS_PORT, REDIS_USERNAME, REDIS_PASSWORD, expiry_s=None) + return cls._persistent_store + + @classmethod + def Ephemeral(cls): + from .config import REDIS_ADDR, REDIS_PASSWORD, REDIS_PORT, REDIS_USERNAME + if cls._ephemeral_store is None: + _store = cls(REDIS_ADDR, REDIS_PORT, REDIS_USERNAME, REDIS_PASSWORD) + if not _store.is_healthy(): + logger.warn(f"ephstore is not healthy, fall back to mem store instead.") + return FallbackStore.Ephemeral() + cls._ephemeral_store = _store + return cls._ephemeral_store + + @classmethod + def Get(cls, key: str): + store = cls.Persistent() + return store.get(key) + +class DataproxyStore(Store): + + class NotFound(Exception): ... + class GenericException(Exception): ... + + ENDPOINT = "https://data-proxy.ebrains.eu/api/v1/buckets/{bucket_name}/{object_name}" + + def __init__(self, token: str, bucket_name: str): + super().__init__() + self.token = token + self.bucket_name = bucket_name + + + def update_token(self, token: str): + self.token = token + + + def _get_bucket(self): + client = BucketApiClient(token=self.token) + return client.buckets.get_bucket(self.bucket_name) + + + def delete(self, key: str): + bucket = self._get_bucket() + file = bucket.get_file(key) + file.delete() + + + def set(self, key: str, value: str): + bucket = self._get_bucket() + + sio = StringIO() + sio.write(value) + sio.seek(0) + bucket.upload(sio, key) + + + def get(self, key: str): + try: + resp = requests.get(DataproxyStore.ENDPOINT.format(bucket_name=self.bucket_name, object_name=key)) + resp.raise_for_status() + return resp.content.decode("utf-8") + except DataproxyStore.NotFound as e: + raise e from e + except requests.exceptions.HTTPError as e: + if e.response.status_code == 404: + raise DataproxyStore.NotFound(str(e)) from e + raise DataproxyStore.GenericException(str(e)) from e + except Exception as e: + raise DataproxyStore.GenericException(str(e)) from e diff --git a/backend/app/app.py b/backend/app/app.py new file mode 100644 index 000000000..ca7dfcaac --- /dev/null +++ b/backend/app/app.py @@ -0,0 +1,50 @@ +from pathlib import Path +from fastapi import FastAPI, Request +from fastapi.responses import RedirectResponse +from fastapi.staticfiles import StaticFiles +from starlette.middleware.sessions import SessionMiddleware + +from app.quickstart import router as quickstart_router +from app.sane_url import router as saneurl_router, vip_routes +from app.config import HOST_PATHNAME, SESSION_SECRET, PATH_TO_PUBLIC +from app.dev_banner import router as devbanner_router +from app.index_html import router as index_router +from app.plugin import router as plugin_router +from app.auth import router as auth_router +from app.user import router as user_router +from app.config import HOST_PATHNAME + +app = FastAPI() + +app.add_middleware(SessionMiddleware, secret_key=SESSION_SECRET) + +for vip_route in vip_routes: + @app.get(f"/{vip_route}") + async def get_vip_route(request: Request): + *_, vip = request.url.path.split("/") + return RedirectResponse(f"{HOST_PATHNAME}/go/{vip}") + +app.include_router(quickstart_router, prefix="/quickstart") +app.include_router(saneurl_router, prefix="/saneUrl") +app.include_router(saneurl_router, prefix="/go") +app.include_router(plugin_router, prefix="/plugins") +app.include_router(user_router, prefix="/user") + +app.include_router(auth_router) +app.include_router(devbanner_router) +app.include_router(index_router) + +app.mount("/.well-known", StaticFiles(directory=Path(__file__).parent / "well-known"), name="well-known") +app.mount("/", StaticFiles(directory=Path(PATH_TO_PUBLIC)), name="static") + +# if HOST_PATHNAME is defined, mount on a specific route +# this may be necessary, if the reverse proxy is not under our control +# and/or we cannot easily strip the route path + +if HOST_PATHNAME: + assert HOST_PATHNAME[0] == "/", f"HOST_PATHNAME, if defined, must start with /: {HOST_PATHNAME!r}" + assert HOST_PATHNAME[-1] != "/", f"HOST_PATHNAME, if defined, must not end with /: {HOST_PATHNAME!r}" + + _app = app + app = FastAPI() + app.mount(HOST_PATHNAME, _app) diff --git a/backend/app/auth.py b/backend/app/auth.py new file mode 100644 index 000000000..fc3fed6a8 --- /dev/null +++ b/backend/app/auth.py @@ -0,0 +1,67 @@ +from authlib.integrations.starlette_client import OAuth +from authlib.integrations.requests_client.oauth2_session import OAuth2Session +from authlib.oauth2.auth import OAuth2Token +from fastapi import APIRouter, Request +from fastapi.responses import RedirectResponse +from uuid import uuid4 +import json + +from .const import EBRAINS_IAM_DISCOVERY_URL, SCOPES, PROFILE_KEY +from .config import HBP_CLIENTID_V2, HBP_CLIENTSECRET_V2, HOST_PATHNAME, HOSTNAME +from ._store import RedisEphStore + +_store = RedisEphStore.Ephemeral() + +oauth = OAuth() + +oauth.register( + name="ebrains", + server_metadata_url=f"{EBRAINS_IAM_DISCOVERY_URL}/.well-known/openid-configuration", + client_id=HBP_CLIENTID_V2, + client_secret=HBP_CLIENTSECRET_V2, + client_kwargs={ + "scope": " ".join(SCOPES), + }, +) + +def process_ebrains_user(resp): + userinfo = resp.get("userinfo") + given_name = userinfo.get("given_name") + family_name = userinfo.get("family_name") + return { + 'id': f'hbp-oidc-v2:{userinfo.get("sub")}', + 'name': f'{given_name} {family_name}', + 'type': 'hbp-oidc-v2', + 'idToken': resp.get("id_token"), + 'accessToken': resp.get("access_token"), + } + +router = APIRouter() + +redirect_uri = HOSTNAME.rstrip("/") + HOST_PATHNAME + "/hbp-oidc-v2/cb" + +@router.get("/hbp-oidc-v2/auth") +async def login_via_ebrains(request: Request, state: str = None): + kwargs = {} + if state: + kwargs["state"] = state + return await oauth.ebrains.authorize_redirect(request, redirect_uri=redirect_uri, **kwargs) + +@router.get("/hbp-oidc-v2/cb") +async def ebrains_callback(request: Request): + if PROFILE_KEY not in request.session: + request.session[PROFILE_KEY] = str(uuid4()) + token: OAuth2Token = await oauth.ebrains.authorize_access_token(request) + _store.set( + request.session[PROFILE_KEY], + json.dumps(process_ebrains_user(token)) + ) + redirect = HOST_PATHNAME if HOST_PATHNAME else "/" + return RedirectResponse(redirect) + +@router.get("/logout") +def logout(request: Request): + _store.delete( + request.session.pop(PROFILE_KEY, None) + ) + return RedirectResponse(HOST_PATHNAME) diff --git a/backend/app/bkwdcompat.py b/backend/app/bkwdcompat.py new file mode 100644 index 000000000..e977c92cc --- /dev/null +++ b/backend/app/bkwdcompat.py @@ -0,0 +1,248 @@ +import re +from enum import Enum +from urllib.parse import urlencode, quote_plus +from starlette.requests import Request +from starlette.responses import Response, RedirectResponse +from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint +import json + +from .util import encode_number, separator +from .logger import logger +from .config import HOST_PATHNAME +from .const import ERROR_KEY, COOKIE_KWARGS + +waxholm_obj = { + "aId": 'minds/core/parcellationatlas/v1.0.0/522b368e-49a3-49fa-88d3-0870a307974a', + "id": 'minds/core/referencespace/v1.0.0/d5717c4a-0fa1-46e6-918c-b8003069ade8', + "parc": { + 'Waxholm Space rat brain atlas v3': { + "id": 'minds/core/parcellationatlas/v1.0.0/ebb923ba-b4d5-4b82-8088-fa9215c2e1fe' + }, + 'Whole Brain (v2.0)': { + "id": 'minds/core/parcellationatlas/v1.0.0/2449a7f0-6dd0-4b5a-8f1e-aec0db03679d' + }, + 'Waxholm Space rat brain atlas v2': { + "id": 'minds/core/parcellationatlas/v1.0.0/2449a7f0-6dd0-4b5a-8f1e-aec0db03679d' + }, + 'Waxholm Space rat brain atlas v1': { + "id": 'minds/core/parcellationatlas/v1.0.0/11017b35-7056-4593-baad-3934d211daba' + }, + } +} + +allen_obj = { + "aId": 'juelich/iav/atlas/v1.0.0/2', + "id": 'minds/core/referencespace/v1.0.0/265d32a0-3d84-40a5-926f-bf89f68212b9', + "parc": { + 'Allen Mouse Common Coordinate Framework v3 2017': { + "id": 'minds/core/parcellationatlas/v1.0.0/05655b58-3b6f-49db-b285-64b5a0276f83' + }, + 'Allen Mouse Brain Atlas': { + "id": 'minds/core/parcellationatlas/v1.0.0/39a1384b-8413-4d27-af8d-22432225401f' + }, + 'Allen Mouse Common Coordinate Framework v3 2015': { + "id": 'minds/core/parcellationatlas/v1.0.0/39a1384b-8413-4d27-af8d-22432225401f' + }, + } +} + +template_map = { + 'Big Brain (Histology)': { + "aId": 'juelich/iav/atlas/v1.0.0/1', + "id": 'minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588', + "parc": { + 'Cytoarchitectonic Maps - v2.4': { + "id": 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290', + }, + 'Cytoarchitectonic Maps': { + "id": 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290', + }, + 'Cortical Layers Segmentation': { + "id": 'juelich/iav/atlas/v1.0.0/3' + }, + 'Grey/White matter': { + "id": 'juelich/iav/atlas/v1.0.0/4' + } + } + }, + 'MNI 152 ICBM 2009c Nonlinear Asymmetric': { + "aId": 'juelich/iav/atlas/v1.0.0/1', + "id": 'minds/core/referencespace/v1.0.0/dafcffc5-4826-4bf1-8ff6-46b8a31ff8e2', + "parc": { + 'Cytoarchitectonic Maps - v2.5.1': { + # redirect julich brain v251 to v290 + "id": 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290' + }, + 'Short Fiber Bundles - HCP': { + "id": 'juelich/iav/atlas/v1.0.0/79cbeaa4ee96d5d3dfe2876e9f74b3dc3d3ffb84304fb9b965b1776563a1069c' + }, + 'Cytoarchitectonic maps - v1.18': { + "id": 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579' + }, + 'Long Bundle': { + "id": 'juelich/iav/atlas/v1.0.0/5' + }, + 'fibre bundle short': { + "id": 'juelich/iav/atlas/v1.0.0/6' + }, + 'DiFuMo Atlas (64 dimensions)': { + "id": 'minds/core/parcellationatlas/v1.0.0/d80fbab2-ce7f-4901-a3a2-3c8ef8a3b721' + }, + 'DiFuMo Atlas (128 dimensions)': { + "id": 'minds/core/parcellationatlas/v1.0.0/73f41e04-b7ee-4301-a828-4b298ad05ab8' + }, + 'DiFuMo Atlas (256 dimensions)': { + "id": 'minds/core/parcellationatlas/v1.0.0/141d510f-0342-4f94-ace7-c97d5f160235' + }, + 'DiFuMo Atlas (512 dimensions)': { + "id": 'minds/core/parcellationatlas/v1.0.0/63b5794f-79a4-4464-8dc1-b32e170f3d16' + }, + 'DiFuMo Atlas (1024 dimensions)': { + "id": 'minds/core/parcellationatlas/v1.0.0/12fca5c5-b02c-46ce-ab9f-f12babf4c7e1' + }, + }, + }, + 'MNI Colin 27': { + "aId": 'juelich/iav/atlas/v1.0.0/1', + "id": 'minds/core/referencespace/v1.0.0/7f39f7be-445b-47c0-9791-e971c0b6d992', + "parc": { + 'Cytoarchitectonic Maps - v1.18': { + "id": 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579' + } + } + }, + 'Waxholm Space rat brain MRI/DTI': waxholm_obj, + 'Waxholm Rat V2.0': waxholm_obj, + 'Allen Mouse Common Coordinate Framework v3': allen_obj, + 'Allen Mouse': allen_obj +} + +def encode_id(_id: str): + return re.sub(r'/\//', ':', _id) + +class WarningStrings(Enum, str): + PREVIEW_DSF_PARSE_ERROR="Preview dataset files cannot be processed properly." + REGION_SELECT_ERROR="Region selected cannot be processed properly." + TEMPLATE_ERROR="Template not found." + +class BkwdCompatMW(BaseHTTPMiddleware): + async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: + standalone_volumes = request.query_params.get("standaloneVolumes") + nifti_layers = request.query_params.get("niftiLayers") + plugin_states = request.query_params.get("pluginStates") + previewing_dataset_files = request.query_params.get("previewingDatasetFiles") + template_selected = request.query_params.get("templateSelected") + parcellation_selected = request.query_params.get("parcellationSelected") + regions_selected = request.query_params.get("regionsSelected") + c_regions_selected = request.query_params.get("cRegionsSelected") + navigation = request.query_params.get("navigation") + c_navigation = request.query_params.get("cNavigation") + + if not any([ + standalone_volumes, + nifti_layers, + plugin_states, + previewing_dataset_files, + template_selected, + parcellation_selected, + regions_selected, + c_regions_selected, + navigation, + c_navigation, + ]): + return await super().dispatch(request, call_next) + + redirect_url = f"{HOST_PATHNAME or ''}/#" + + if regions_selected: + logger.warn(f"regionSelected deprecated, but was used to access {regions_selected}") + if nifti_layers: + logger.warn(f"niftiLayers deprecated, but was used to access {nifti_layers}") + if previewing_dataset_files: + logger.warn(f"previewing_dataset_files deprecated, but was used to access {previewing_dataset_files}") + + new_search_param = {} + + nav = "" + r = "" + + if navigation: + try: + _o, _po, _pz, _p, _z = navigation.split("__") + o = map(float, _o.split("_")) + po = map(float, _po.split("_")) + pz = int(_pz) + p = map(float, _p.split("_")) + z = int(_z) + + v = f"{separator}{separator}".join([ + separator.join([encode_number(_val, True) for _val in o]), + separator.join([encode_number(_val, True) for _val in po]), + encode_number(round(pz)), + separator.join([encode_number(round(_val)) for _val in p]), + encode_number(z) + ]) + nav = f"/@:{v}" + except Exception as e: + logger.error(f"bkwds parsing navigation error, {str(e)}") + + if c_navigation: + nav = f"/@:${c_navigation}" + + plugins = [p for p in (plugin_states or "").split("__") if p] + if len(plugins) > 0: + new_search_param["pl", json.dumps(plugins)] + + if c_regions_selected: + logger.warn(f"cRegionSelected is deprecated, but used for {c_regions_selected}") + # see util.py get_hash + + if standalone_volumes: + new_search_param["standaloneVolumes"] = standalone_volumes + if nav: + redirect_url = redirect_url + nav + if len(new_search_param) > 0: + redirect_url = redirect_url + f"?{urlencode(new_search_param)}" + return RedirectResponse(redirect_url) + + if not template_selected: + resp = RedirectResponse(redirect_url) + resp.set_cookie(ERROR_KEY, "template_selected is required, but not defined", **COOKIE_KWARGS) + return resp + + error_msg = "" + _tmpl = template_map.get(template_selected) + if not _tmpl: + resp = RedirectResponse(template_selected) + resp.set_cookie(ERROR_KEY, f"Template with id {template_selected} not found.", **COOKIE_KWARGS) + return resp + + _tmpl_id = _tmpl.get("id") + _atlas_id = _tmpl.get("aId") + + redirect_url += f"/a:{quote_plus(_atlas_id)}/t:{quote_plus(_tmpl_id)}" + + _parcs = _tmpl.get("parc") + + if parcellation_selected in _parcs: + parc_id = _parcs[parcellation_selected].get("id") + else: + error_msg += f"parcellation with id {parcellation_selected} cannot be found" + parc_id = list(_parcs.values())[0].get("id") + + redirect_url += f"/p:{quote_plus(parc_id)}" + + if r and parcellation_selected != "Cytoarchitectonic Maps - v2.5.1": + redirect_url += r + + if nav: + redirect_url += nav + + if len(new_search_param) > 0: + redirect_url += urlencode(new_search_param) + + resp = RedirectResponse(redirect_url) + if len(error_msg) > 0: + resp.set_cookie(ERROR_KEY, error_msg, **COOKIE_KWARGS) + + return resp \ No newline at end of file diff --git a/backend/app/config.py b/backend/app/config.py new file mode 100644 index 000000000..7c5423fb2 --- /dev/null +++ b/backend/app/config.py @@ -0,0 +1,39 @@ +import os + +SESSION_SECRET = os.getenv("SESSION_SECRET", "hey joline, remind me to set a more secure session secret") + +HOST_PATHNAME = os.getenv("HOST_PATHNAME", "") +PORT = os.getenv("PORT") + +HOSTNAME = os.getenv("HOSTNAME", "http://localhost:3000") + +OVERWRITE_API_ENDPOINT = os.getenv("OVERWRITE_API_ENDPOINT") + +LOCAL_CDN = os.getenv("LOCAL_CDN") + +HBP_CLIENTID_V2 = os.getenv("HBP_CLIENTID_V2", "no hbp id") +HBP_CLIENTSECRET_V2 = os.getenv("HBP_CLIENTSECRET_V2", "no hbp client secret") + +HBP_DISCOVERY_URL = "https://iam.ebrains.eu/auth/realms/hbp" + +BUILD_TEXT = os.getenv("BUILD_TEXT", "") + +# REDIS env var + +REDIS_PROTO = os.getenv("REDIS_PROTO") +REDIS_ADDR = os.getenv("REDIS_ADDR") or os.getenv("REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PROTO") or "localhost" +REDIS_PORT = os.getenv("REDIS_PORT") or os.getenv("REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PORT") or "6379" +REDIS_USERNAME = os.getenv("REDIS_USERNAME") +REDIS_PASSWORD = os.getenv("REDIS_PASSWORD") + +V2_7_PLUGIN_URLS = os.getenv("V2_7_PLUGIN_URLS", "") +V2_7_STAGING_PLUGIN_URLS = os.getenv("V2_7_STAGING_PLUGIN_URLS", "") + +SXPLR_EBRAINS_IAM_SA_CLIENT_ID = os.getenv("SXPLR_EBRAINS_IAM_SA_CLIENT_ID") +SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET = os.getenv("SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET") + +SXPLR_BUCKET_NAME = os.getenv("SXPLR_BUCKET_NAME", "interactive-atlas-viewer") + +LOGGER_DIR = os.getenv("LOGGER_DIR") + +PATH_TO_PUBLIC = os.getenv("PATH_TO_PUBLIC", "../dist/aot") \ No newline at end of file diff --git a/backend/app/const.py b/backend/app/const.py new file mode 100644 index 000000000..9948b8e47 --- /dev/null +++ b/backend/app/const.py @@ -0,0 +1,21 @@ +PROFILE_KEY = "sxplr-session-uuid" +ERROR_KEY = "sxplr-error" + +COOKIE_KWARGS = { + "httponly": True, + "samesite": "strict", +} + +EBRAINS_IAM_DISCOVERY_URL = "https://iam.ebrains.eu/auth/realms/hbp" + +SCOPES = [ + 'openid', + 'email', + 'profile', + 'collab.drive', + "team" +] + +DATA_ERROR_ATTR = "data-error" + +OVERWRITE_SAPI_ENDPOINT_ATTR = "x-sapi-base-url" diff --git a/backend/app/dev_banner.py b/backend/app/dev_banner.py new file mode 100644 index 000000000..101e3e22e --- /dev/null +++ b/backend/app/dev_banner.py @@ -0,0 +1,22 @@ +from fastapi.routing import APIRouter +from fastapi.responses import PlainTextResponse +from .config import BUILD_TEXT +from .logger import main_logger + +router = APIRouter() + +main_logger.info(f"BUILD_TEXT: {BUILD_TEXT}") + +css_string = "body::after {{ content: '{BUILD_TEXT}' }}".format( + BUILD_TEXT="dev build" if BUILD_TEXT is None else BUILD_TEXT +) + +@router.get("/version.css") +def build_text(): + return PlainTextResponse( + css_string, + headers={ + "content-type": "text/css; charset=UTF-8", + "cache-control": "public, max-age={age_seconds}".format(age_seconds=60*60*24) + }, + ) diff --git a/backend/app/index_html.py b/backend/app/index_html.py new file mode 100644 index 000000000..903ec1547 --- /dev/null +++ b/backend/app/index_html.py @@ -0,0 +1,45 @@ +from fastapi import APIRouter, Request +from pathlib import Path +from fastapi.responses import Response +from typing import Dict +from .const import ERROR_KEY, DATA_ERROR_ATTR, OVERWRITE_SAPI_ENDPOINT_ATTR, COOKIE_KWARGS +from .config import PATH_TO_PUBLIC, OVERWRITE_API_ENDPOINT + +path_to_index = Path(PATH_TO_PUBLIC) / "index.html" +index_html: str = None + +router = APIRouter() + +def _monkey_sanitize(value: str): + return value.replace('"', ""e;") + +@router.get("/") +@router.get("/index.html") +async def get_index_html(request: Request): + + global index_html + if index_html is None: + with open(path_to_index, "r") as fp: + index_html = fp.read() + + # TODO: LOCAL_CDN not yet ported over + error = None + attributes_to_append: Dict[str, str] = {} + if ERROR_KEY in request.session: + error = request.session[ERROR_KEY] + attributes_to_append[DATA_ERROR_ATTR] = error + + if OVERWRITE_API_ENDPOINT: + attributes_to_append[OVERWRITE_SAPI_ENDPOINT_ATTR] = OVERWRITE_API_ENDPOINT + + + attr_string = " ".join([f"{key}={_monkey_sanitize(value)}" for key, value in attributes_to_append.items()]) + + resp_string = index_html.replace("<atlas-viewer>", f"<atlas-viewer {attr_string}>") + + resp = Response(resp_string, headers={ + "content-type": "text/html; charset=utf-8" + }) + if ERROR_KEY in request.session: + resp.delete_cookie(ERROR_KEY, **COOKIE_KWARGS) + return resp diff --git a/backend/app/logger.py b/backend/app/logger.py new file mode 100644 index 000000000..478cf6b8c --- /dev/null +++ b/backend/app/logger.py @@ -0,0 +1,42 @@ +import logging +from logging.handlers import TimedRotatingFileHandler +from .config import LOGGER_DIR + +main_logger = logging.getLogger(__name__) +main_logger.setLevel(logging.INFO) + +logger = logging.getLogger(__name__ + ".info") +access_logger = logging.getLogger(__name__ + ".access_log") +ch = logging.StreamHandler() + +formatter = logging.Formatter("[%(name)s:%(levelname)s] %(message)s") +ch.setFormatter(formatter) +logger.addHandler(ch) +logger.setLevel("INFO") + + +log_dir = LOGGER_DIR + +if log_dir: + log_dir += "" if log_dir.endswith("/") else "/" + +if log_dir: + import socket + filename = log_dir + f"{socket.gethostname()}.access.log" + access_log_handler = TimedRotatingFileHandler(filename, when="d", encoding="utf-8") +else: + access_log_handler = logging.StreamHandler() + +access_format = logging.Formatter("%(asctime)s - %(resp_status)s - %(process_time_ms)sms - %(hit_cache)s - %(message)s") +access_log_handler.setFormatter(access_format) +access_log_handler.setLevel(logging.INFO) +access_logger.addHandler(access_log_handler) + + +if log_dir: + import socket + filename = log_dir + f"{socket.gethostname()}.general.log" + warn_fh = TimedRotatingFileHandler(filename, when="d", encoding="utf-8") + warn_fh.setLevel(logging.INFO) + warn_fh.setFormatter(formatter) + logger.addHandler(warn_fh) diff --git a/backend/app/plugin.py b/backend/app/plugin.py new file mode 100644 index 000000000..73187bbee --- /dev/null +++ b/backend/app/plugin.py @@ -0,0 +1,80 @@ +from typing import List +from fastapi import APIRouter +from fastapi.responses import JSONResponse +import json +import requests +import re +from urllib.parse import urlparse +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor +from .config import V2_7_PLUGIN_URLS, V2_7_STAGING_PLUGIN_URLS +from .logger import logger +from ._store import RedisEphStore + +router = APIRouter() +_redisstore = RedisEphStore.Persistent() + +PLUGINS: List[str] = [] +try: + PLUGINS = [ + v + for v in [*V2_7_PLUGIN_URLS.split(";"), *V2_7_STAGING_PLUGIN_URLS.split(";")] + if v # remove empty strings + ] +except Exception as e: + logger.error(f"failed to parse plugins correctly: {str(e)}") + + +def _get_key(url: str): + return f"plugin:manifest-cache:{url}" + +def _get_manifest(url: str): + + key = _get_key(url) + try: + stored_manifest = _redisstore.get(key) + try: + if stored_manifest: + return json.loads(stored_manifest) + except: + # If parsing json fails, fall back to fetch manifest + pass + + resp = requests.get(url) + resp.raise_for_status() + manifest_json = resp.json() + + sxplr_flag = manifest_json.get("siibra-explorer") + iframe_url = manifest_json.get("iframeUrl") + + if not sxplr_flag: + logger.warn(f"plugin mainfest at {url} does not have siibra-explorer flag set") + return None + + replace_obj = {} + if not re.match(r"https:", iframe_url): + parsed_url = urlparse(url) + if iframe_url[0] == "/": + new_name = iframe_url + else: + new_name = str(Path(parsed_url.path).with_name(iframe_url)) + replace_obj["iframeUrl"] = parsed_url._replace(path=new_name).geturl() + return_obj = { **manifest_json, **replace_obj } + _redisstore.set(key, json.dumps(return_obj)) + return return_obj + + except Exception as e: + logger.error(f"Error retrieving: {url}") + + +@router.get("/manifests") +def plugin_manifests(): + with ThreadPoolExecutor() as ex: + returned_obj = ex.map( + _get_manifest, + PLUGINS + ) + returned_obj = [v for v in returned_obj if v] + return JSONResponse(returned_obj, headers={ + "cache-control": "public, max-age={age_seconds}".format(age_seconds=60*60*24) + }) diff --git a/backend/app/quickstart.py b/backend/app/quickstart.py new file mode 100644 index 000000000..d8c346dbb --- /dev/null +++ b/backend/app/quickstart.py @@ -0,0 +1,55 @@ +from fastapi.routing import APIRouter +from fastapi.responses import HTMLResponse +from pathlib import Path +from markdown import markdown +import json + +helper_content: str = None +markdown_content: str = None + +router = APIRouter() + + +@router.get("") +@router.get("/") +async def quickstart(): + global helper_content + global markdown_content + if not helper_content: + path_to_helper = Path(__file__).parent / ".." / ".." / "common/helpOnePager.md" + with open(path_to_helper, "r") as fp: + helper_content = fp.read() + markdown_content = markdown(helper_content, extensions=["markdown.extensions.admonition", "markdown.extensions.codehilite", "markdown.extensions.tables"]) + + html_response = """ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> + <script src="https://unpkg.com/dompurify@latest/dist/purify.min.js"></script> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Siibra Explorer Quickstart</title> + <style> + .padded { padding: 1.5rem; } + </style> +</head> +<body class="padded"> + +</body> +<script> +(() => { + const markdown = """+ json.dumps(helper_content) + """ + const dirty = """ + json.dumps(markdown_content) + """ + const clean = DOMPurify.sanitize(dirty) + document.body.innerHTML = clean +})() +</script> +</html> +""" + return HTMLResponse(html_response) + + +__all__ = [ + "router" +] diff --git a/backend/app/sane_url.py b/backend/app/sane_url.py new file mode 100644 index 000000000..2842ed9ab --- /dev/null +++ b/backend/app/sane_url.py @@ -0,0 +1,152 @@ +from fastapi import APIRouter, Request +from fastapi.responses import Response, JSONResponse, RedirectResponse +from fastapi.exceptions import HTTPException +from authlib.integrations.requests_client import OAuth2Session +import requests +import json +from typing import Union, Dict, Optional +import time +from io import StringIO +from pydantic import BaseModel + +from .config import SXPLR_EBRAINS_IAM_SA_CLIENT_ID, SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET, SXPLR_BUCKET_NAME, HOST_PATHNAME +from .const import EBRAINS_IAM_DISCOVERY_URL +from ._store import DataproxyStore + +router = APIRouter() + +endpoint = "https://data-proxy.ebrains.eu/api/v1/buckets/{bucket_name}/{object_name}" + +vip_routes = [ + "human", + "monkey", + "rat", + "mouse" +] + + +class SaneUrlDPStore(DataproxyStore): + class AlreadyExists(Exception): ... + + @staticmethod + def GetTimeMs() -> int: + return round(time.time()*1e3) + + @staticmethod + def TransformKeyToObjName(key: str): + return f"saneUrl/{key}.json" + + def __init__(self, expiry_s=3 * 24 * 60 * 60): + + resp = requests.get(f"{EBRAINS_IAM_DISCOVERY_URL}/.well-known/openid-configuration") + resp.raise_for_status() + resp_json = resp.json() + assert "token_endpoint" in resp_json, f"authorization_endpoint must be in openid configuration" + self._token_endpoint: str = resp_json["token_endpoint"] + + scopes=["openid", "team", "roles", "group"] + oauth2_session = OAuth2Session(SXPLR_EBRAINS_IAM_SA_CLIENT_ID, + SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET, + scope=" ".join(scopes)) + self.session = oauth2_session + self.expiry_s: float = None + self.token: str = None + self._refresh_token() + + super().__init__(self.token, SXPLR_BUCKET_NAME) + + def _refresh_token(self): + token_dict = self.session.fetch_token(self._token_endpoint, grant_type="client_credentials") + self.expiry_s = token_dict.get("expires_at") + self.token = token_dict.get("access_token") + + def _get_bucket(self): + token_expired = self.expiry_s - time.time() > 30 + if token_expired: + self._refresh_token() + + self.update_token(self.token) + return super()._get_bucket() + + def _prepare_aux(self, request: Optional[Request]=None): + return { + "userId": None, + "expiry": SaneUrlDPStore.GetTimeMs() + (self.expiry_s * 1e3) + } + + def get(self, key: str): + try: + object_name = SaneUrlDPStore.TransformKeyToObjName(key) + resp = super().get(object_name) + resp_content = json.loads(resp) + expiry = resp_content.get("expiry") + if expiry is not None and SaneUrlDPStore.GetTimeMs() > expiry: + self.delete(key) + raise SaneUrlDPStore.NotFound("expired") + return resp_content.get("value") + except SaneUrlDPStore.NotFound as e: + raise e from e + except requests.exceptions.HTTPError as e: + if e.response.status_code == 404: + raise SaneUrlDPStore.NotFound(str(e)) from e + raise SaneUrlDPStore.GenericException(str(e)) from e + except Exception as e: + raise SaneUrlDPStore.GenericException(str(e)) from e + + def set(self, key: str, value: Union[str, Dict], request: Optional[Request]=None): + + object_name = SaneUrlDPStore.TransformKeyToObjName(key) + try: + super().get(object_name) + raise SaneUrlDPStore.AlreadyExists + except SaneUrlDPStore.NotFound as e: + pass + + bucket = self._get_bucket() + + sio = StringIO() + json.dump({ + "value": value, + **self._prepare_aux(request) + }, fp=sio) + sio.seek(0) + bucket.upload(sio, object_name) + + def delete(self, key: str): + object_name = SaneUrlDPStore.TransformKeyToObjName(key) + content = super().get(object_name) + + curr = SaneUrlDPStore.GetTimeMs() + super().set(f"deleted/{object_name}.{curr}", content) + + super().delete(object_name) + +data_proxy_store = SaneUrlDPStore() + +@router.get("/{short_id:str}") +async def get_short(short_id:str, request: Request): + try: + resp = data_proxy_store.get(short_id) + accept = request.headers.get("Accept") + if "text/html" in accept: + hashed_path = resp.get("hashPath") + return RedirectResponse(f"{HOST_PATHNAME}/#{hashed_path}") + return JSONResponse(resp) + except DataproxyStore.NotFound as e: + raise HTTPException(404, str(e)) + except DataproxyStore.GeneralException as e: + raise HTTPException(500, str(e)) + + +class SaneUrlModel(BaseModel): + ver: str + hashPath: str # camel case for backwards compat + + +@router.post("/{short_id: str}") +async def post_short(short_id: str, saneurl: SaneUrlModel): + try: + data_proxy_store.set(short_id, saneurl.model_dump_json()) + return Response(status_code=201) + except Exception as e: + raise HTTPException(500, str(e)) diff --git a/backend/app/sxplr_iam.py b/backend/app/sxplr_iam.py new file mode 100644 index 000000000..0d496ea51 --- /dev/null +++ b/backend/app/sxplr_iam.py @@ -0,0 +1,6 @@ +from authlib.integrations.starlette_client import OAuth +from authlib.integrations.requests_client.oauth2_session import OAuth2Session +from authlib.oauth2.auth import OAuth2Token + +from .const import PROFILE_KEY + diff --git a/backend/app/user.py b/backend/app/user.py new file mode 100644 index 000000000..dc5789038 --- /dev/null +++ b/backend/app/user.py @@ -0,0 +1,63 @@ +from typing import Any, Coroutine +from starlette.requests import Request +from starlette.responses import Response +from fastapi import FastAPI, APIRouter +from functools import wraps +from inspect import iscoroutine + +import json +from .const import PROFILE_KEY +from .auth import _store + +def is_authenticated(fn): + + class NotAuthenticatedEx(Exception): ... + + def check_auth(request: Request): + if PROFILE_KEY not in request.session: + raise NotAuthenticatedEx + + profile_uuid = request.session[PROFILE_KEY] + user = _store.get(profile_uuid) + if not user: + raise NotAuthenticatedEx + + request.state.user = json.loads(user) + + @wraps(fn) + async def async_wrapper(*args, request: Request, **kwargs): + try: + check_auth(request) + except NotAuthenticatedEx: + return Response("Not authenticated", 401) + return await fn(*args, request=request, **kwargs) + + @wraps(fn) + def sync_wrapper(*args, request: Request, **kwargs): + try: + check_auth(request) + except NotAuthenticatedEx: + return Response("Not authenticated", 401) + return fn(*args, request=request, **kwargs) + return async_wrapper if iscoroutine(fn) else sync_wrapper + + +router = APIRouter() + +@router.get("/foo") +@is_authenticated +def foo(request: Request): + return "foo" + +@router.get("") +@router.get("/") +@is_authenticated +def get_user(request: Request): + try: + user = request.state.user + if user: + return Response(json.dumps(user), 200) + else: + return Response(None, 401) + except: + return Response(None, 500) diff --git a/backend/app/util.py b/backend/app/util.py new file mode 100644 index 000000000..1265bcc5f --- /dev/null +++ b/backend/app/util.py @@ -0,0 +1,54 @@ +import math +import struct + +cipher = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-' +separator = '.' +neg = '~' +def encode_number(n, float_flag=False): + if float_flag: + b=struct.pack('f', n) + new_n=struct.unpack('i',b) + return encode_int(new_n[0]) + else: + return encode_int(n) + +def encode_int(n): + if not isinstance(n, int): + raise ValueError('Cannot encode int') + + residual=None + result='' + if n < 0: + result += neg + residual = n * -1 + else: + residual = n + + while True: + result = cipher[residual % 64] + result + residual = math.floor(residual / 64) + + if residual == 0: + break + return result + +# get_hash may not have to be implemented +# CON: add numpy dependency +# PRO: might need to support hashing region name for selected region +# +# def get_hash(full_string: str): +# return_val=0 +# with np.errstate(over="ignore"): +# for char in full_string: +# # overflowing is expected and in fact the whole reason why convert number to int32 + +# # in windows, int32((0 - min_int32) << 5), rather than overflow to wraper around, raises OverflowError +# shifted_5 = int32( +# (return_val - min_int32) if return_val > max_int32 else return_val +# << 5) + +# return_val = int32(shifted_5 - return_val + ord(char)) +# return_val = return_val & return_val +# hex_val = hex(return_val) +# return hex_val[3:] + diff --git a/deploy/well-known/robot.txt b/backend/app/well-known/robot.txt similarity index 100% rename from deploy/well-known/robot.txt rename to backend/app/well-known/robot.txt diff --git a/deploy/well-known/security.txt b/backend/app/well-known/security.txt similarity index 100% rename from deploy/well-known/security.txt rename to backend/app/well-known/security.txt diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 000000000..c321ab821 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,12 @@ +fastapi +markdown +authlib +uvicorn[standard] # required as a asgi +itsdangerous # required for starlette session middleware +httpx # required for async uvicorn +redis + +# cherrypicks https://github.com/HumanBrainProject/ebrains-drive/pull/20 and https://github.com/HumanBrainProject/ebrains-drive/pull/22 +# once both merged and published, use ebrains-drive instead +git+https://github.com/xgui3783/ebrains-drive.git@tmp_fixDeleteUseIO + diff --git a/check_all.sh b/check_all.sh deleted file mode 100755 index 108ea83b2..000000000 --- a/check_all.sh +++ /dev/null @@ -1,47 +0,0 @@ -#! /bin/bash - -echo 'Running all tests ...' - -echo 'Running linter ...' - -# check lint -npm run lint &> check_all_lint.log || exit - -echo 'Linter complete.' - -echo 'Running unit tests ...' -# unit test -NODE_ENV=test npm run test &> check_all_test.log || exit -echo 'Unit tests complete.' - -echo 'Running server tests ...' -cd deploy -npm run test &> check_all_deploy_test.log || exit -echo 'Server test complete.' - -cd .. - -echo 'Building and running e2e tests ...' -echo 'Building ...' -# e2e tests -npm run build-aot &> check_all_build_aot.log || exit -echo 'Build complete.' - -echo 'Spinning up node server ...' -# run node server -cd deploy -node server.js &> check_all_deploy_server.log & -NDOE_SERVER_PID=$! - -# run e2e test - -echo 'Running e2e tests ...' -cd .. -npm run e2e &> check_all_e2e.log || kill "$NDOE_SERVER_PID" && exit -echo 'e2e tests complete.' - -echo 'Killing server.js pid $NDOE_SERVER_PID' - -kill "$NDOE_SERVER_PID" - -echo 'All runs complete.' diff --git a/deploy/.gitignore b/deploy/.gitignore deleted file mode 100644 index 20d4182a3..000000000 --- a/deploy/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.env -res/* -raw diff --git a/deploy/README.md b/deploy/README.md deleted file mode 100644 index 0985ca15d..000000000 --- a/deploy/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Deployment - -Latest stable version of siibra explorer is continously deployed to the following URL: - -- <https://interactive-viewer.apps.hbp.eu/> -- <https://atlases.ebrains.eu/viewer/> - -## Dependency monitoring - -Siibra explorer interacts with a number of other ebrains services. Monitoring these services contributes to the stability of the webapplication. - -### Probability & continuous maps availability - -[](https://github.com/FZJ-INM1-BDA/iav-dep-test/actions?query=workflow%3A%22Monitoring+KG+Dataset+Preview+Service%22) - -### Misc - -[](https://github.com/FZJ-INM1-BDA/iav-dep-test/actions?query=workflow%3A%22Monitoring+IAV+dependency+services%22) \ No newline at end of file diff --git a/deploy/api-test/Jenkinsfile b/deploy/api-test/Jenkinsfile deleted file mode 100644 index 9273d9aaa..000000000 --- a/deploy/api-test/Jenkinsfile +++ /dev/null @@ -1,58 +0,0 @@ -pipeline { - agent { - node { - label 'nodejs' - } - } - - environment { - SERVICE_ACCOUNT_CRED = credentials('SERVICE_ACCOUNT_CRED') - WAXHOLM_RAT_GOOGLE_SHEET_ID = credentials('WAXHOLM_RAT_GOOGLE_SHEET_ID') - HUMAN_GOOGLE_SHEET_ID = credentials('HUMAN_GOOGLE_SHEET_ID') - ATLAS_URL = 'https://interactive-viewer-next.apps-dev.hbp.eu/' - } - - stages { - stage('Build') { - steps { - echo 'Building...' - sh 'node --version' - sh 'cd deploy && npm install' - } - } - stage('Test available datasets') { - parallel { - stage('rat - v1.01') { - steps { - sh 'cd deploy && npm run mocha-env -- ./api-test/**/rat.v1_01.spec.js --timeout 60000' - } - } - stage('rat - v2') { - steps { - sh 'cd deploy && npm run mocha-env -- ./api-test/**/rat.v2.spec.js --timeout 60000' - } - } - stage('rat - v3') { - steps { - sh 'cd deploy && npm run mocha-env -- ./api-test/**/rat.v3.spec.js --timeout 60000' - } - } - stage('mouse - 2015') { - steps { - sh 'cd deploy && npm run mocha-env -- ./api-test/**/mouse.2015.spec.js --timeout 60000' - } - } - stage('mouse - 2017') { - steps { - sh 'cd deploy && npm run mocha-env -- ./api-test/**/mouse.2017.spec.js --timeout 60000' - } - } - stage('human') { - steps { - sh 'cd deploy && echo NYI' - } - } - } - } - } -} diff --git a/deploy/api-test/datasets/mouse.2015.e2e-spec.js b/deploy/api-test/datasets/mouse.2015.e2e-spec.js deleted file mode 100644 index 5897893e3..000000000 --- a/deploy/api-test/datasets/mouse.2015.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const atlas = 'Allen Mouse Common Coordinate Framework v3 2015' -const referenceSpace = 'Allen Mouse Common Coordinate Framework v3' -const wildCard = 'both (Waxholm/ Allen)' - -const { getAllenWaxholmTest } = require('./ratMouse.util') - -const ATLAS_URL = process.env.ATLAS_URL || 'https://interactive-viewer.apps.hbp.eu/' - -getAllenWaxholmTest({ - atlas, - referenceSpace, - wildCard -})(ATLAS_URL) \ No newline at end of file diff --git a/deploy/api-test/datasets/mouse.2017.e2e-spec.js b/deploy/api-test/datasets/mouse.2017.e2e-spec.js deleted file mode 100644 index f865228aa..000000000 --- a/deploy/api-test/datasets/mouse.2017.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const atlas = 'Allen Mouse Common Coordinate Framework v3 2017' -const referenceSpace = 'Allen Mouse Common Coordinate Framework v3' -const wildCard = 'both (Waxholm/ Allen)' - -const { getAllenWaxholmTest } = require('./ratMouse.util') - -const ATLAS_URL = process.env.ATLAS_URL || 'https://interactive-viewer.apps.hbp.eu/' - -getAllenWaxholmTest({ - atlas, - referenceSpace, - wildCard -})(ATLAS_URL) \ No newline at end of file diff --git a/deploy/api-test/datasets/rat.v1_01.e2e-spec.js b/deploy/api-test/datasets/rat.v1_01.e2e-spec.js deleted file mode 100644 index b29838257..000000000 --- a/deploy/api-test/datasets/rat.v1_01.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const atlas = 'Waxholm Space rat brain atlas v1.01' -const referenceSpace = 'Waxholm Space rat brain MRI/DTI' -const wildCard = 'both (Waxholm/ Allen)' - -const { getAllenWaxholmTest } = require('./ratMouse.util') - -const ATLAS_URL = process.env.ATLAS_URL || 'https://interactive-viewer.apps.hbp.eu/' - -getAllenWaxholmTest({ - atlas, - referenceSpace, - wildCard -})(ATLAS_URL) \ No newline at end of file diff --git a/deploy/api-test/datasets/rat.v2.e2e-spec.js b/deploy/api-test/datasets/rat.v2.e2e-spec.js deleted file mode 100644 index aa44965ff..000000000 --- a/deploy/api-test/datasets/rat.v2.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const atlas = 'Waxholm Space rat brain atlas v2' -const referenceSpace = 'Waxholm Space rat brain MRI/DTI' -const wildCard = 'both (Waxholm/ Allen)' - -const { getAllenWaxholmTest } = require('./ratMouse.util') - -const ATLAS_URL = process.env.ATLAS_URL || 'https://interactive-viewer.apps.hbp.eu/' - -getAllenWaxholmTest({ - atlas, - referenceSpace, - wildCard -})(ATLAS_URL) \ No newline at end of file diff --git a/deploy/api-test/datasets/rat.v3.e2e-spec.js b/deploy/api-test/datasets/rat.v3.e2e-spec.js deleted file mode 100644 index f7ee3b033..000000000 --- a/deploy/api-test/datasets/rat.v3.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -const atlas = 'Waxholm Space rat brain atlas v3' -const referenceSpace = 'Waxholm Space rat brain MRI/DTI' -const wildCard = 'both (Waxholm/ Allen)' - -const { getAllenWaxholmTest } = require('./ratMouse.util') - -const ATLAS_URL = process.env.ATLAS_URL || 'https://interactive-viewer.apps.hbp.eu/' - -getAllenWaxholmTest({ - atlas, - referenceSpace, - wildCard -})(ATLAS_URL) \ No newline at end of file diff --git a/deploy/api-test/datasets/ratMouse.util.js b/deploy/api-test/datasets/ratMouse.util.js deleted file mode 100644 index dc9508add..000000000 --- a/deploy/api-test/datasets/ratMouse.util.js +++ /dev/null @@ -1,77 +0,0 @@ -const { setupAuth, getInfo, getGetRowsFn } = require('./util') - -const { GoogleSpreadsheet } = require('google-spreadsheet') -const WAXHOLM_RAT_GOOGLE_SHEET_ID = process.env.WAXHOLM_RAT_GOOGLE_SHEET_ID -if (!WAXHOLM_RAT_GOOGLE_SHEET_ID) throw new Error(`env var WAXHOLM_RAT_GOOGLE_SHEET_ID is undefined`) - -const doc = new GoogleSpreadsheet(WAXHOLM_RAT_GOOGLE_SHEET_ID) - -// TODO for backward compatiblity with what must be node v 0.0.1 -// OKD jenkins nodejs slave runs on nodejs that does not support generator function -// swap request for got as soon as this is rectified -// const got = require('got') -require('tls').DEFAULT_ECDH_CURVE = 'auto' -const request = require('request') -const { expect } = require('chai') -const { URL } = require('url') - -const getWaxholmAllenDatasetsPr = new Promise( async (rs, rj) => { - await setupAuth(doc) - const worksheet = doc.sheetsByIndex.find(({ title }) => title === 'Dataset level') - if (!worksheet) rj(`worksheet 'Dataset level' not found!`) - - const rows = await worksheet.getRows({ offset: 1 }) - const filteredrows = rows.filter(r => r['Public or curated?'] === 'public') - - rs(filteredrows) -}) - -const getWaxholmAllenDatasets = () => getWaxholmAllenDatasetsPr - -const getAllenWaxholmTest = ({ - atlas, - referenceSpace, - wildCard - }) => ATLAS_URL => describe(referenceSpace, () => { - let spreadsheetExpectedDatasets = [] - before(async () => { - spreadsheetExpectedDatasets = (await getWaxholmAllenDatasets()) - .filter(r => r['Reference Atlas'] === atlas || r['Reference Atlas'] === wildCard) - .map(r => r['Dataset name']) - }) - describe(atlas, () => { - describe(`testing ${ATLAS_URL}`, () => { - - let fetchedDatasets = [] - before(async () => { - const getUrl = new URL(`${ATLAS_URL.replace(/\/$/, '')}/datasets/templateNameParcellationName/${encodeURIComponent(referenceSpace)}/${encodeURIComponent(atlas)}`) - // const resp = await got(getUrl) - const resp = await (new Promise((rs, rj) => { - request(getUrl, {}, (err, resp, body) => { - if (err) rj(err) - rs(resp) - }) - })) - expect(resp.statusCode).to.equal(200) - fetchedDatasets = JSON.parse(resp.body).map(({ name }) => name) - }) - - it(`number of fetched === number of expected`, () => { - expect(fetchedDatasets.length).to.eq(spreadsheetExpectedDatasets.length) - }) - - it('expect fetched === expected. + = expected, but not fetched; - = fetched, but not expected', () => { - expect( - fetchedDatasets.sort() - ).to.have.members( - spreadsheetExpectedDatasets.sort() - ) - }) - }) - }) - }) - -module.exports = { - getWaxholmAllenDatasets, - getAllenWaxholmTest -} diff --git a/deploy/api-test/datasets/util.js b/deploy/api-test/datasets/util.js deleted file mode 100644 index adbe35c24..000000000 --- a/deploy/api-test/datasets/util.js +++ /dev/null @@ -1,15 +0,0 @@ - -const fs = require('fs') -const SERVICE_ACCOUNT_CRED = JSON.parse( - process.env.SERVICE_ACCOUNT_CRED || - (process.env.SERVICE_ACCOUNT_CRED_PATH && fs.readFileSync(process.env.SERVICE_ACCOUNT_CRED_PATH, 'utf-8')) || - '{}') - -const setupAuth = async doc => { - await doc.useServiceAccountAuth(SERVICE_ACCOUNT_CRED) - await doc.loadInfo() -} - -module.exports = { - setupAuth -} \ No newline at end of file diff --git a/deploy/app.js b/deploy/app.js deleted file mode 100644 index bc3444df3..000000000 --- a/deploy/app.js +++ /dev/null @@ -1,228 +0,0 @@ -const path = require('path') -const express = require('express') -const app = express.Router() -const session = require('express-session') -const crypto = require('crypto') -const cookieParser = require('cookie-parser') -const bkwdMdl = require('./bkwdCompat')() -const { CONST } = require("../common/constants") - -if (process.env.NODE_ENV !== 'production') { - app.use(require('cors')()) -} - -app.use('/quickstart', require('./quickstart')) - -const hash = string => crypto.createHash('sha256').update(string).digest('hex') - -app.use((req, resp, next) => { - if (/main\.bundle\.js$/.test(req.originalUrl)){ - const xForwardedFor = req.headers['x-forwarded-for'] - const ip = req.socket.remoteAddress - console.log({ - type: 'visitorLog', - method: 'main.bundle.js', - xForwardedFor: xForwardedFor && xForwardedFor.replace(/\ /g, '').split(',').map(hash), - ip: hash(ip) - }) - } - if (/favicon/.test(req.originalUrl)) { - resp.setHeader(`Cache-Control`, `public, max-age=604800, immutable`) - } - next() -}) - -/** - * configure Auth - * async function, but can start server without - */ - -let authReady - -const _ = (async () => { - -/** - * load env first, then load other modules - */ - - const { configureAuth, ready } = require('./auth') - authReady = ready - const store = await (async () => { - - const { USE_DEFAULT_MEMORY_STORE } = process.env - if (!!USE_DEFAULT_MEMORY_STORE) { - console.warn(`USE_DEFAULT_MEMORY_STORE is set to true, memleak expected. Do NOT use in prod.`) - return null - } - - const { _initPr, redisURL, StoreType } = require('./lruStore') - await _initPr - console.log('StoreType', redisURL, StoreType) - if (!!redisURL) { - const redis = require('redis') - const RedisStore = require('connect-redis')(session) - const client = redis.createClient({ - url: redisURL - }) - return new RedisStore({ - client - }) - } - - /** - * memorystore (or perhaps lru-cache itself) does not properly close when server shuts - * this causes problems during tests - * So when testing app.js, set USE_DEFAULT_MEMORY_STORE to true - * see app.spec.js - */ - const MemoryStore = require('memorystore')(session) - return new MemoryStore({ - checkPeriod: 86400000 - }) - - })() - - const SESSIONSECRET = process.env.SESSIONSECRET || 'this is not really a random session secret' - - /** - * passport application of oidc requires session - */ - app.use(session({ - secret: SESSIONSECRET, - resave: true, - saveUninitialized: false, - store - })) - - await configureAuth(app) - - app.use('/user', require('./user')) - - /** - * saneUrl end points - */ - const { router: saneUrlRouter, vipRoutes } = require('./saneUrl') - app.use('/saneUrl', saneUrlRouter) - app.use('/go', saneUrlRouter) - - const HOST_PATHNAME = process.env.HOST_PATHNAME || '' - - for (const route of vipRoutes) { - app.get(`/${route}`, (req, res) => res.redirect(`${HOST_PATHNAME}/go/${route}`)) - } -})() - -const PUBLIC_PATH = process.env.NODE_ENV === 'production' - ? path.join(__dirname, 'public') - : path.join(__dirname, '..', 'dist', 'aot') - -/** - * well known path - */ -app.use('/.well-known', express.static(path.join(__dirname, 'well-known'))) - -app.use((_req, res, next) => { - res.setHeader('Referrer-Policy', 'origin-when-cross-origin') - next() -}) - -/** - * show dev banner - * n.b., must be before express.static() call - */ -app.use(require('./devBanner')) - -/** - * populate nonce token - */ -const { indexTemplate } = require('./constants') -app.get('/', (req, res, next) => { - - /** - * configure CSP - */ - if (process.env.DISABLE_CSP && process.env.DISABLE_CSP === 'true') { - console.warn(`DISABLE_CSP is set to true, csp will not be enabled`) - next() - } else { - const { bootstrapReportViolation, middelware } = require('./csp') - bootstrapReportViolation(app) - middelware(req, res, next) - } - -}, bkwdMdl, cookieParser(), async (req, res) => { - res.setHeader('Content-Type', 'text/html') - - let returnIndex = indexTemplate - - if (!!process.env.LOCAL_CDN) { - const CDN_ARRAY = [ - 'https://stackpath.bootstrapcdn.com', - 'https://use.fontawesome.com', - 'https://unpkg.com' - ] - - const regexString = CDN_ARRAY.join('|').replace(/\/|\./g, s => `\\${s}`) - const regex = new RegExp(regexString, 'gm') - returnIndex = returnIndex.replace(regex, process.env.LOCAL_CDN) - } - const iavError = req.cookies && req.cookies['iav-error'] - - const attributeToAppend = {} - - if (iavError) { - res.clearCookie('iav-error', { httpOnly: true, sameSite: 'strict' }) - attributeToAppend[CONST.DATA_ERROR_ATTR] = iavError - } - - if (!!process.env.OVERWRITE_API_ENDPOING) { - attributeToAppend[CONST.OVERWRITE_SAPI_ENDPOINT_ATTR] = process.env.OVERWRITE_API_ENDPOING - } - - const attr = Object.entries(attributeToAppend).map(([key, value]) => `${key}="${value.replace(/"/g, '"')}"`).join(" ") - - const returnTemplate = returnIndex - .replace(/\$\$NONCE\$\$/g, res.locals.nonce) - .replace('<atlas-viewer>', `<atlas-viewer ${attr}>`) - - res.status(200).send(returnTemplate) -}) - -app.get('/ready', async (req, res) => { - const authIsReady = authReady ? await authReady() : false - - const allReady = [ - authIsReady, - /** - * add other ready endpoints here - * call sig is await fn(): boolean - */ - ].every(f => !!f) - if (allReady) return res.status(200).end() - else return res.status(500).end() -}) - -/** - * only use compression for production - * this allows locally built aot to be served without errors - */ -const { compressionMiddleware } = require('nomiseco') - -app.use(compressionMiddleware, express.static(PUBLIC_PATH)) - -const jsonMiddleware = (req, res, next) => { - if (!res.get('Content-Type')) res.set('Content-Type', 'application/json') - next() -} - -/** - * resources endpoints - */ -const pluginRouter = require('./plugins') - -app.use('/plugins', jsonMiddleware, pluginRouter) - -const catchError = require('./catchError') -app.use(catchError) - -module.exports = app diff --git a/deploy/app.spec.js b/deploy/app.spec.js deleted file mode 100644 index 867241d71..000000000 --- a/deploy/app.spec.js +++ /dev/null @@ -1,90 +0,0 @@ -const { expect, assert } = require('chai') -const express = require('express') -const got = require('got') -const sinon = require('sinon') - -let server -const PORT=12345 - -/** - * TODO - * user module import results in error. fix error then reimport - */ - -describe('authentication', () => { - - /** - * memorystore (or perhaps lru-cache itself) does not properly close when server.close() - * use default memory store for tests - */ - process.env['USE_DEFAULT_MEMORY_STORE'] = true - - const fakeFunctionObj = { - fakeAuthConfigureAuth: sinon.stub().callsFake((req, res, next) => next()), - fakeAuthReady: async () => true, - fakeUserRouterFn: sinon.stub().callsFake((req, res, next) => res.status(200).send()) - } - - before(async () => { - const auth = require('./auth') - const authConfigureAuthStub = sinon.stub(auth, 'configureAuth') - const authIsReadyStub = sinon.stub(auth, 'ready') - - require.cache[require.resolve('./saneUrl')] = { - exports: { - router: (req, res, next) => next(), - ready: async () => true - } - } - - // require.cache[require.resolve('./user')] = { - // exports: fakeFunctionObj.fakeUserRouterFn - // } - - require.cache[require.resolve('./constants')] = { - exports: { - indexTemplate: `` - } - } - - authConfigureAuthStub.callsFake(app => { - app.use(fakeFunctionObj.fakeAuthConfigureAuth) - return Promise.resolve() - }) - - const expressApp = express() - const app = require('./app') - expressApp.use(app) - server = expressApp.listen(PORT) - }) - - after(() => { - delete require.cache[require.resolve('./saneUrl')] - // delete require.cache[require.resolve('./user')] - delete require.cache[require.resolve('./constants')] - server.close() - }) - // it('> auth middleware is called', async () => { - // await got(`http://localhost:${PORT}/user`) - // assert( - // fakeFunctionObj.fakeAuthConfigureAuth.called, - // 'auth middleware should be called' - // ) - // }) - - // it('> user middleware called', async () => { - // await got(`http://localhost:${PORT}/user`) - // assert( - // fakeFunctionObj.fakeUserRouterFn.called, - // 'user middleware is called' - // ) - // }) - - // it('fakeAuthConfigureAuth is called before user router', async () => { - // await got(`http://localhost:${PORT}/user`) - // assert( - // fakeFunctionObj.fakeAuthConfigureAuth.calledBefore(fakeFunctionObj.fakeUserRouterFn), - // 'fakeAuthConfigureAuth is called before user router' - // ) - // }) -}) diff --git a/deploy/auth/hbp-oidc-v2.js b/deploy/auth/hbp-oidc-v2.js deleted file mode 100644 index d54274808..000000000 --- a/deploy/auth/hbp-oidc-v2.js +++ /dev/null @@ -1,81 +0,0 @@ -const passport = require('passport') -const { configureAuth } = require('./oidc') - -const HOSTNAME = process.env.HOSTNAME || 'http://localhost:3000' -const HOST_PATHNAME = process.env.HOST_PATHNAME || '' -const clientId = process.env.HBP_CLIENTID_V2 || 'no hbp id' -const clientSecret = process.env.HBP_CLIENTSECRET_V2 || 'no hbp client secret' -const discoveryUrl = 'https://iam.ebrains.eu/auth/realms/hbp' -const redirectUri = `${HOSTNAME}${HOST_PATHNAME}/hbp-oidc-v2/cb` -const cb = (tokenset, {sub, given_name, family_name, ...rest}, done) => { - return done(null, { - id: `hbp-oidc-v2:${sub}`, - name: `${given_name} ${family_name}`, - type: `hbp-oidc-v2`, - tokenset, - rest - }) -} - -const { - __DEBUG__ -} = process.env - -let oidcStrategy, client, pr - -const userScope = [ - 'openid', - 'email', - 'profile', - 'collab.drive' -] - -const adminScope = [ - 'offline_access', - 'group', - 'team' -] - -const memoizedInit = () => { - if (pr) return pr - pr = (async () => { - if (client) { - return - } - const re = await configureAuth({ - clientId, - clientSecret, - discoveryUrl, - redirectUri, - cb, - scope: [ - ...userScope, - ...(__DEBUG__ ? adminScope : []), - ].join(' '), - clientConfig: { - redirect_uris: [ redirectUri ], - response_types: [ 'code' ] - } - }) - oidcStrategy = re.oidcStrategy - client = re.client - })() - return pr -} - -module.exports = { - bootstrapApp: async (app) => { - try { - await memoizedInit() - passport.use('hbp-oidc-v2', oidcStrategy) - app.get('/hbp-oidc-v2/auth', passport.authenticate('hbp-oidc-v2')) - app.get('/hbp-oidc-v2/cb', passport.authenticate('hbp-oidc-v2', { - successRedirect: `${HOST_PATHNAME}/`, - failureRedirect: `${HOST_PATHNAME}/` - })) - return { client } - } catch (e) { - console.error('oidcv2 auth error', e) - } - }, -} diff --git a/deploy/auth/index.js b/deploy/auth/index.js deleted file mode 100644 index 62b41fa21..000000000 --- a/deploy/auth/index.js +++ /dev/null @@ -1,38 +0,0 @@ -const HOST_PATHNAME = process.env.HOST_PATHNAME || '' -const { retry } = require('../../common/util') - -let isReady = false - -/** - * using async function. Maybe in the future, we want to introduce async checks - */ -const ready = async () => isReady - -const configureAuth = async (app) => { - console.log('configure Auth') - const { bootstrapApp: boostrapOidcV2 } = require('./hbp-oidc-v2') - - const { initPassportJs, objStoreDb } = require('./util') - - initPassportJs(app) - - await retry(async () => { - await boostrapOidcV2(app) - }, { timeout: 1000, retries: 3 }) - isReady = true - - app.get('/logout', (req, res) => { - if (req.user && req.user.id) objStoreDb.delete(req.user.id) - req.logout(err => { - if (!!err) { - console.log(`err during logout: ${err.toString()}`) - } - res.redirect(`${HOST_PATHNAME}/`) - }) - }) -} - -module.exports = { - configureAuth, - ready -} \ No newline at end of file diff --git a/deploy/auth/index.spec.js b/deploy/auth/index.spec.js deleted file mode 100644 index 8e33c30bd..000000000 --- a/deploy/auth/index.spec.js +++ /dev/null @@ -1,109 +0,0 @@ -const sinon = require('sinon') -const { assert, expect } = require('chai') -const initPassportJsStub = sinon.stub() -const hbpOidcV2Stub = sinon.stub() - -const appGetStub = sinon.stub() - -describe('auth/index.js', () => { - before(() => { - require.cache[require.resolve('./util')] = { - exports: { initPassportJs: initPassportJsStub, objStoreDb: new Map() } - } - require.cache[require.resolve('./hbp-oidc-v2')] = { - exports: { - bootstrapApp: hbpOidcV2Stub - } - } - }) - - beforeEach(() => { - delete require.cache[require.resolve('./index.js')] - hbpOidcV2Stub.returns({}) - hbpOidcV2Stub.resetHistory() - }) - - describe('#configureAuth', () => { - - it('> calls necessary dependencies', async () => { - const { configureAuth } = require('./index.js') - const dummyObj = { get: appGetStub } - await configureAuth(dummyObj) - - assert( - hbpOidcV2Stub.called, - 'hbpOidcV2 called' - ) - - assert( - initPassportJsStub.called, - 'initPassportJs called' - ) - }) - - it('> retries up to three times', async () => { - - const { configureAuth } = require('./index.js') - const dummyObj = { get: appGetStub } - - hbpOidcV2Stub.throws(`throw error`) - - try { - - await (() => new Promise((rs, rj) => { - configureAuth(dummyObj) - .then(rs) - .catch(rj) - }))() - - assert( - false, - 'configureAuth should not resolve' - ) - - } catch (e) { - - assert( - hbpOidcV2Stub.calledThrice, - 'hbpOidcv2 called thrice' - ) - - } - }) - }) - describe('#ready', () => { - it('> if everything resolves correctly ready should return true', async () => { - - const { configureAuth, ready } = require('./index.js') - const dummyObj = { get: appGetStub } - - await configureAuth(dummyObj) - - const isReady = await ready() - - expect(isReady).to.equal(true) - }) - - it('> if oidc fails, ready fn returns false', async () => { - - const { configureAuth, ready } = require('./index.js') - const dummyObj = { get: appGetStub } - - hbpOidcV2Stub.throws(`throw error`) - - try { - await (() => new Promise((rs, rj) => { - configureAuth(dummyObj) - .then(rs) - .catch(rj) - }))() - - } catch (e) { - - } - - const isReady = await ready() - expect(isReady).to.equal(false) - }) - }) -}) diff --git a/deploy/auth/oidc.js b/deploy/auth/oidc.js deleted file mode 100644 index c55a09bd4..000000000 --- a/deploy/auth/oidc.js +++ /dev/null @@ -1,52 +0,0 @@ -const { Issuer, Strategy } = require('openid-client') - -const defaultCb = (tokenset, {id, ...rest}, done) => { - return done(null, { - id: id || Date.now(), - ...rest - }) -} - -exports.jwtDecode = input => { - if (!input) throw new Error(`jwtDecode must have an input!`) - const payload = input.split('.')[1] - if (!payload) { - throw new Error(`jwt token does not have enough components`) - } - return JSON.parse(Buffer.from(payload, 'base64').toString()) -} - -exports.configureAuth = async ({ discoveryUrl, clientId, clientSecret, redirectUri, clientConfig = {}, cb = defaultCb, scope = 'openid' }) => { - if (!discoveryUrl) - throw new Error('discoveryUrl must be defined!') - - if (!clientId) - throw new Error('clientId must be defined!') - - if (!clientSecret) - throw new Error('clientSecret must be defined!') - - if (!redirectUri) - throw new Error('redirectUri must be defined!') - - const issuer = await Issuer.discover(discoveryUrl) - - const client = new issuer.Client({ - client_id: clientId, - client_secret: clientSecret, - ...clientConfig - }) - - const oidcStrategy = new Strategy({ - client, - params: { - scope - }, - }, cb) - - return { - oidcStrategy, - issuer, - client - } -} \ No newline at end of file diff --git a/deploy/auth/spec-helper.js b/deploy/auth/spec-helper.js deleted file mode 100644 index c82c98a32..000000000 --- a/deploy/auth/spec-helper.js +++ /dev/null @@ -1,66 +0,0 @@ - -const crypto = require('crypto') -const { stub, spy } = require('sinon') - -class OIDCStub{ - - setupOIDCStub({ rejects, client: _client } = {}) { - - // delete require cache, so it can be imported again - // in case env are rewritten - - delete require.cache[require.resolve('./oidc')] - const OIDC = require('./oidc') - - this.jwtDecodeReturn = { exp: Math.floor( (Date.now() / 1e3) * 60 * 60 ) } - this.configureAuthStub = stub(OIDC, 'configureAuth') - this.jwtDecodeStub = stub(OIDC, 'jwtDecode').returns(this.jwtDecodeStub) - this.refresh = (...arg) => { - const { - access_token, - refresh_token, - id_token, - } = this - return { - access_token, - refresh_token, - id_token - } - } - - this.access_token = crypto.randomBytes(16).toString('hex') - this.refresh_token = crypto.randomBytes(16).toString('hex') - this.id_token = crypto.randomBytes(16).toString('hex') - - const { refresh } = this - const client = _client || { refresh } - - if (rejects) { - this.configureAuthStub.rejects() - } else { - this.configureAuthStub.resolves({ client }) - } - - this.refreshSpy = client && client.refresh && spy(client, 'refresh') - - const { access_token, id_token, refreshSpy, refresh_token, configureAuthStub, cleanup, jwtDecodeReturn, jwtDecodeStub } = this - return { - access_token, - refresh_token, - id_token, - configureAuthStub, - refreshSpy, - jwtDecodeReturn, - jwtDecodeStub, - cleanup: cleanup.bind(this) - } - } - - cleanup(){ - const { configureAuthStub, refreshSpy } = this - configureAuthStub && configureAuthStub.resetHistory() - refreshSpy && refreshSpy.resetHistory() - } -} - -exports.OIDCStub = OIDCStub diff --git a/deploy/auth/util.js b/deploy/auth/util.js deleted file mode 100644 index 91421d162..000000000 --- a/deploy/auth/util.js +++ /dev/null @@ -1,26 +0,0 @@ -const objStoreDb = new Map() - -const initPassportJs = app => { - console.log('init passport js') - const passport = require('passport') - - app.use(passport.initialize()) - app.use(passport.session()) - - passport.serializeUser((user, done) => { - const { tokenset, rest } = user - objStoreDb.set(user.id, user) - done(null, user.id) - }) - - passport.deserializeUser((id, done) => { - const user = objStoreDb.get(id) - if (user) return done(null, user) - else return done(null, false) - }) -} - -module.exports = { - initPassportJs, - objStoreDb, -} diff --git a/deploy/auth/util.spec.js b/deploy/auth/util.spec.js deleted file mode 100644 index 0dff0d61e..000000000 --- a/deploy/auth/util.spec.js +++ /dev/null @@ -1,151 +0,0 @@ -const chai = require('chai') -const { OIDCStub } = require('./spec-helper') -chai.use(require('chai-as-promised')) -const { stub, spy } = require('sinon') -const { expect, assert, should } = require('chai') - -should() - -const crypto = require('crypto') - -describe('mocha.js', () => { - it('mocha works properly', () => { - assert(true) - }) -}) - -describe('chai-as-promised.js', () => { - it('resolving promise is resolved', () => { - - return Promise.resolve(2 + 2).should.eventually.equal(4) - - }) - it('rejecting promise is rejected', () => { - return Promise.reject('no reason').should.be.rejected - }) -}) - -const oidcStubInstance = new OIDCStub() -const setupOIDCStub = oidcStubInstance.setupOIDCStub.bind(oidcStubInstance) - -describe('util.js', async () => { - - describe('> if configureAuth throws', () => { - - let cleanup - before(() => { - const obj = setupOIDCStub({ rejects: true }) - cleanup = obj.cleanup - }) - - after(() => cleanup()) - - it('> calling util throws', async () => { - const util = require('./util') - try { - await util() - assert(false, 'Util funciton should throw/reject') - } catch (e) { - assert(true) - } - }) - }) - - describe('> if configureauth does not return object', () => { - let cleanup - before(() => { - const obj = setupOIDCStub({ - client: 42 - }) - cleanup = obj.cleanup - }) - - after(() => { - cleanup() - }) - - it('> calling util throws', () => { - try { - require('./util')() - assert(false, 'if configure auth does not return object, calling util throw throw') - } catch (e) { - assert(true) - } - }) - }) - - const env = { - HOSTNAME : 'http://localhost:3333', - HOST_PATHNAME : '/testpath', - HBP_CLIENTID : crypto.randomBytes(16).toString('hex'), - HBP_CLIENTSECRET : crypto.randomBytes(16).toString('hex'), - REFRESH_TOKEN : crypto.randomBytes(16).toString('hex'), - } - - describe('> if env var is provided', () => { - - const tmp = {} - let cleanup - let oidcStub - before(() => { - - delete require.cache[require.resolve('./util')] - - for (const key in env) { - tmp[key] = process.env[key] - process.env[key] = env[key] - } - try { - - const obj = setupOIDCStub() - cleanup = obj.cleanup - - oidcStub = obj - } catch (e) { - console.log(e) - } - }) - - after(() => { - for (const key in env) { - process.env[key] = tmp[key] - } - cleanup() - }) - - }) - - describe('> if refresh token is missing', () => { - - const noRefreshEnv = { - ...env, - REFRESH_TOKEN: null - } - const tmp = {} - let cleanup - before(() => { - - delete require.cache[require.resolve('./util')] - - for (const key in noRefreshEnv) { - tmp[key] = process.env[key] - process.env[key] = noRefreshEnv[key] - } - try { - - const obj = setupOIDCStub() - cleanup = obj.cleanup - } catch (e) { - console.log(e) - } - }) - - after(() => { - for (const key in noRefreshEnv) { - process.env[key] = tmp[key] - } - cleanup() - }) - - }) -}) diff --git a/deploy/bkwdCompat/index.js b/deploy/bkwdCompat/index.js deleted file mode 100644 index bd1c6d9fc..000000000 --- a/deploy/bkwdCompat/index.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = () =>{ - const urlState = require('./urlState') - return (req, res, next) => { - const query = req.query || {} - - let errorMessage = `` - const redir = urlState(query, err => { - errorMessage += err - }) - if (errorMessage !== '') { - res.cookie( - `iav-error`, - errorMessage, - { - httpOnly: true, - sameSite: 'strict', - maxAge: 1e3 * 30 - } - ) - } - if (redir) return res.redirect(redir) - next() - } -} diff --git a/deploy/bkwdCompat/ngLinks.json b/deploy/bkwdCompat/ngLinks.json deleted file mode 100644 index 68909f4cd..000000000 --- a/deploy/bkwdCompat/ngLinks.json +++ /dev/null @@ -1,705 +0,0 @@ -[ - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22D%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..11SkX%7E.7gJ8%7E.jul_%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2254%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MqM.26Pd8%7E.4qaI%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22Z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..VsYi%7E.4PMQx%7E.3AKQY..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Eodw%7E.o4bm.k5Ii%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__49095056.24218857_-8144216.081099838_30427371.198444664__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-PrC_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F8VI%7E.oD3y.jwZC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221m%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..JEVh%7E.1SwCV.fBI6%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZUOO%7E.ni50.pm0m%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3K4.1w6ta%7E.HD1..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ERGS%7E.nxOi.kGEi%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221m%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..DdeY%7E.nbr0.kciC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Yr.1w6Je%7E.CqH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1QVh.26PTm%7E.4dte%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZPje%7E.k-EW.aB2C%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1US2.26O_W%7E.4Mco%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__42371717.17171717_2476767.676767677_-39825252.52525252__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IT-MT_2.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xm.1w6aq%7E.E-t..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0.._Is8~.3aur6~.2HVsr~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3g1go%7E.1UQMR%7E.1WpNX..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..28BoF%7E.1Cmwa%7E.2xRKp..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__35704140.66067894_14382478.307200491_5407444.055411786__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Op-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1TQy~.1lJnu~.2_Ap..16de", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2217%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3D5Fm%7E.1gtcf.qaP_..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Ahku.2zQH0%7E.2fvZq..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MGE.26Pd8%7E.4sKo%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HV-C.2qgk4%7E.2alb4..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2230%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..YggE%7E.jwia.qLYK%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZAsO%7E.nn8S.q7Pe%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1QVh.26PTm%7E.4dte%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZPW_%7E.nk3a.ps5q%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1P-z.26PWu%7E.4fkO%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2218%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Nwh.26Pd8%7E.4n0K%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22i%22%7D", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..29D.1w60u%7E.AfP..3q90", - "parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&templateSelected=MNI+Colin+27&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-8600000_-60400000_-26300000__200000®ionsSelected=251&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FJuBrain%2Fv2.2c%2FPMaps%2FCerebellum_Ninterp.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2215%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3Cyo2%7E.qSUh.u8iu..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221n%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BBwc%7E.nkwG.hPrG%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__19455161.915305838_-35445751.45308608_-9003182.950456694__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FCingulum_Temporal_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..X5dD%7E.2Vnjq.1Uykm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__45152357.49472204_-43779380.71780436_12545742.434904993__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_MT-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2230%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..E2CO%7E.nnMW.kRQK%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1V12k%7E.1Rafk%7E.i8ka%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2214%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2rVY9%7E.2V0N5%7E.2fk1M..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AX2W.2zcYy%7E.2fqkS..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224f%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1P-z.26PWu%7E.4fkO%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Tf8.26P6K%7E.4QYM%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__22396467.333475202_30278782.719727606_33071823.79229623__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_RMF-SF_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__35781514.5451747_24855086.96321377_2943897.1833153665__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Tr-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xm.1w6aq%7E.E-t..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6mG.1w9sC%7E.gS4..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZUOO%7E.ni50.pm0m%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221S%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3LcF0%7E.35JHr%7E.2S1oD..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..29NWG.2qeA0%7E.2mtZa..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bh0m%7E.nyLe.hCkC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1TEZ.26PB0%7E.4SUu%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AN0M%7E.1xeqK%7E.AlJC..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..0.1w4W0%7E.0..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Tf8.26P6K%7E.4QYM%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__20204555.010511562_-18738822.70497547_12101681.850035042__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FCorticoSpinalTract_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22v%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..335oh%7E.1NytF%7E.17UrZ..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2256%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1k_.1w5k8%7E.8V7..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3K4.1w6ta%7E.HD1..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..XCQ3~.3OOwB~.1uR2-~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224Z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AOuM%7E.1xbHm%7E.Asek..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YaQE%7E.j9T0.sS28%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..31quy%7E.O-Sl%7E.6FB-..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..29GIW.2qnDi%7E.2mzMG..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Ao_y.2zGW0%7E.2fzIu..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2219%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HKgC.2qwM4%7E.2adEi..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZOpM%7E.l0Hi.aD_U%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4hO%7E.Fq70.a7rq%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HFZe.2r028%7E.2aZzK..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221Q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2iOlI%7E.I45Y%7E.po6i..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..7EQ.1wAOa%7E.lFP..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2219%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..533.1w8DW%7E.SRV..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B\"jubrain+mni152+v18+left\"%3A\"U\"%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..335JG~.RmCa~.9xvN..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4hO%7E.Fq70.a7rq%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2214%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..E2CO%7E.nnMW.kRQK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B\"jubrain+colin+v18+right\"%3A\"U\"%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3L8Du.ACUF~.CuB..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZAsO%7E.nn8S.q7Pe%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__42957534.246575326_24265753.424657524_24589954.337899536__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs2_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_022d278402aab813fcb610330f53c4e7.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-10742512.128243_-5019457.920269981_25404450.537861213__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FCingulum_Long_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2220%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHl0.2r5J8%7E.2SHoC..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2214%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..E2CO%7E.nnMW.kRQK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..0.1w4W0%7E.0..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__35508261.35936913_-18041119.03867817_14042621.104018018__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_SM-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3K4.1w6ta%7E.HD1..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-43877177.177177176_19509609.609609604_24809609.609609604__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs4_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_57c4832619f167ab18995996c02d8295.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9yuf%7E.26OmS%7E.3Ngp..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221T%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2f_6l%7E.Dh6k.2QAOP..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps&navigation=0_0_0_1__0.7809706330299377_0.11322952806949615_-0.15641532838344574_-0.5939680933952332__1922235.5293810747__3187941_-50436480_3430986__350000®ionsSelected=v1%231", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1FHD2%7E.1Q12N%7E.3v05K..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1OT1.26Pba%7E.4lCs%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..FIyd%7E.oH9J.jrG8%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bqe4%7E.o0HC.h8RC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222w%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HN6S.2qtNS%7E.2aeuy..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RwH.26PKO%7E.4YF0%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__8990859.4242488_-48760138.68459761_30669993.696154654__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IC-PrCu_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HPSS.2qqLi%7E.2agZC..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1U30.26P3C%7E.4ObC%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Q_Z.26PQe%7E.4c0G%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZZIz%7E.nfVO.pffm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1UqM.26Ovq%7E.4Kdm%7E..3q90", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2317&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-3723402.984494186_-33064127.136934616_32569711.99852508__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__30645299.14529915_-26158119.658119664_39324786.324786335__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PrC-SP_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-36661740.006718166_9149311.387302637_28015787.705744028__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-Op_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..FIyd%7E.oH9J.jrG8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__51195404.63603091_-14323302.155347705_2863155.754371688__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_ST-TT_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=DiFuMo+Atlas+%28128+dimensions%29", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221Y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..Wb5l%7E.2NMIB%7E.3OeH2..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..pAuP~.3SYJE~.1vwl0~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Sd.1w4qK%7E.26b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5gX.1w8nS%7E.X2B..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4hO%7E.Fq70.a7rq%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2219%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..r2hg.3YhlF~.2C-PV~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YaQE%7E.j9T0.sS28%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2220%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CFOu%7E.oAn4.gxpO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2254%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MqM.26Pd8%7E.4qaI%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-28928541.42602122_15938569.778431177_31573243.72571668__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Op-SF_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3hh.1w78m%7E.JQm..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZAsO%7E.nn8S.q7Pe%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4Ol.1w7h8%7E.Nu_..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1LhX.26Pba%7E.4u4W%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-10029072.082835525_-53669653.524492234_28416367.980884105__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IC-PrCu_0.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2316&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-13546343.062011965_-38230308.814068206_26252295.549827665__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%225I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..acOg%7E.jAXm.bhQy%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4hO%7E.Fq70.a7rq%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3Gd1S%7E.149OK%7E.LUnD..2-zd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3hh.1w78m%7E.JQm..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-23101959.038290292_-23612644.701691896_-317453.25022260845__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FFornix_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9zzE%7E.26MH4%7E.3RIH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__34410498.05201644_26975097.399178684_-5295303.7801411__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Or-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZNsu%7E.l1JK.aGyo%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-39920863.30935252_26585131.89448443_23833812.949640274__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs1_l_N10_nlin2Stdcolin27_2.2_publicDOI_2fbed54a956057637fdba19857b48e9f.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RwH.26PKO%7E.4YF0%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..aaCg%7E.jCXu.bnus%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..KSQz%7E.11xk-.nMpo..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__11734325.873867199_-77620214.53671166_15244220.454965785__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Cu-Li_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..7EQ.1wAOa%7E.lFP..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221f%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1znYa%7E.1O6-R%7E.2dbjG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-37078878.59349014_24973271.560940832_1607151.3423615992__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Tr-Ins_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-38807749.35113089_5194846.125324428_-19637931.034482762__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_ST-Ins_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%225K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..acOg%7E.jAXm.bhQy%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-55690767.97385621_-50960375.81699346_-12476715.686274514__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IT-MT_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..XCQ3%7E.3OOwB%7E.1uR2-%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__30586217.364905894_14720400.728597432_36013661.20218578__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CMF-RMF_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5gX.1w8nS%7E.X2B..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..OW6m%7E.3brPV.BdkD%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AZqe.2zZaK%7E.2frx0..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZOpM%7E.l0Hi.aD_U%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1RaEp%7E.S06b%7E.21uJB%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-22082652.546646506_-21001765.00252144_14490317.700453863__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FCorticoSpinalTract_Left.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2230%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BMdc%7E.nple.hLS0%7E..45jd", - "templateSelected=MNI%20Colin%2027&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2n9GK~.2oRG~.dIrs~..2kDL&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FArea-TI2_l_N10_nlin2Stdcolin27_5.1_publicDOI_45fbfa8808ec4de620328650b134bdc3.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RSj.26PNW%7E.4a86%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221L%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1DZJJ%7E.3a7Lv%7E.3kH3-..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2218%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Nwh.26Pd8%7E.4n0K%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221x%22%7D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-45744868.5232442_7059968.933762342_21897869.743703544__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Op-PrC_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D4LA%7E.GT4Q.aPm4%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-6385010.26694046_-10154346.338124573_35074264.202600956__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CAC-PrCu_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-12409806.728704363_-46228704.36649965_32741231.20973514__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoCi-PrCu_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..7EQ.1wAOa%7E.lFP..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-12056009.31723991_-7192894.092022866_35409882.92948544__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FCingulum_Short_Left.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F8VI%7E.oD3y.jwZC%7E..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Grey%2FWhite+matter&cNavigation=0.0.0.-W000.._eCwg.2-FUe3._-s_W.2_evlu..7LIx..1uaTK.Bq5o~.lKmo~..NBW&previewingDatasetFiles=%5B%7B%22datasetId%22%3A%22minds%2Fcore%2Fdataset%2Fv1.0.0%2Fb08a7dbc-7c75-4ce7-905b-690b2b1e8957%22%2C%22filename%22%3A%22Overlay+of+data+modalities%22%7D%5D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1VBr.26Or8%7E.4Ido%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Vx.1w9b0%7E.e45..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__36737729.44624403_-37269211.784667596_-9835616.227055386__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FInferiorLongitudinal_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..euQE.3QFtb~.1xcbg~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5ND.1w8WG%7E.Ukc..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1UqM.26Ovq%7E.4Kdm%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221P%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6TGB.3JtxN~.1sq5b~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1US2.26O_W%7E.4Mco%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HV-C.2qgk4%7E.2alb4..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__8399457.111834958_-3368566.7752442956_24279858.84907709__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FCingulum_Long_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2aFnh%7E.4M-6A%7E.7xbF..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-36588069.812837295_-23393788.035365716_54053335.62980823__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-PrC_2.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5y-.1w92e%7E.ZNK..3q90", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2318&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-5344587.965411705_-43655930.97799518_24702722.09890703__295893.7198067633", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-44373029.77232924_23361646.234676003_24951838.87915936__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs2_l_N10_nlin2Stdcolin27_2.2_publicDOI_5ca6ef9bbc75f8785f3ca7701919d6d2.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-39093195.26627219_-65965976.33136095_4747041.420118347__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-IT_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..35jwK%7E.Ld2w%7E.DK6y..2-zd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-27356803.1704095_-1168295.904887721_52813077.93923381__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-SF_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZZIz%7E.nfVO.pffm%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZZIz%7E.nfVO.pffm%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Sd.1w4qK%7E.26b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5gX.1w8nS%7E.X2B..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-30273969.319271334_38103787.15244487_12995565.675934792__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Tr-SF_0.nii", - "https://interactive-viewer.apps.hbp.eu/?templateSelected=Waxholm+Space+rat+brain+MRI%2FDTI&parcellationSelected=Waxholm+Space+rat+brain+atlas+v3&cNavigation=0.0.0.-W000..2-8Bnd.2_tvb9._yymE._tYzz..1Sjt..Ecv%7E.Lqll%7E.33ix..9fo&cRegionsSelected=%7B%22v3%22%3A%2213.a.b.19.6.c.q.x.1.1L.Y.1K.r.s.y.z._.1G.-.Z.18.v.f.g.1J.1C.k.14.15.2I.7.1E.1F.2C.2D.21.22.2T.10.11.12.1D.1S.A.1i.1j.1k.1m.1n.1o.1p.2N.2O.2P.1V.1W.1X.1Y.1Z.1a.U.V.W.3.1I.e.d.2J.2K.2L.2M.2a.1T.1H.m.h.2E.2F.2H.1U.o.t.2.17.p.w.4.5.1A.1B.u.l.2U.2V.2W.1x.1_.1-.20.23.24.25.26.27.28.29.2A.2B.2Z.X.1z.j.16.1t.1u.1v.1w.2Y%22%7D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1O_e.26Pa0%7E.4jP4%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__12386666.666666672_23929122.807017535_-20468421.05263158__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_LOF-MOF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__10317942.486836776_48647428.10854596_-3121911.7051437944__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_RAC-SF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__9941482.805374086_-4659681.99186492_35097929.24935289__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FCingulum_Short_Right.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D3uo%7E.GT_m.aV30%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1QVh.26PTm%7E.4dte%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-33746170.921198666_6706659.267480582_-22055382.907880127__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_LOF-ST_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37122810.153736144_22599392.205934912_10842867.357883453__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Op-Tr_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-47643968.64734021_-57403521.41086969_12415566.826119527__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FArcuate_Posterior_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__4427358.49056603_-13966981.132075474_33288679.245283023__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CAC-PrCu_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1TEZ.26PB0%7E.4SUu%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1VBr.26Or8%7E.4Ido%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..WAQu%7E.1mQ2-%7E.1uh1d..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2KTfX%7E.1Pzv3%7E.32bEt..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224Z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AOuM%7E.1xbHm%7E.Asek..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CFOu%7E.oAn4.gxpO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SN7.26PHG%7E.4WKq%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-41579978.38422048_13575925.425560653_30199000.270197242__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifj1_l_N10_nlin2Stdcolin27_2.2_publicDOI_cb45fad7eaa1423aa4dd807529a3f689.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221s%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AN0M%7E.1xeqK%7E.AlJC..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__35988653.00146411_-30185944.363103956_39836749.63396779__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-SP_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..DdeY%7E.nbr0.kciC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ud.1w58e%7E.4E8..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__13205807.680101559_-29051570.929863527_44830688.67026341__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoCi-PrCu_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1V9sm%7E.F4Mm%7E.1WU96%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ERGS%7E.nxOi.kGEi%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6-m.1wA7O%7E.irG..3q90", - "parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&templateSelected=MNI+Colin+27&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-27800000_-11000000_-10900000__200000®ionsSelected=18&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FJuBrain%2Fv2.2c%2FPMaps%2FAmygdala_AStr.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9_-e%7E.26Jni%7E.3UtA..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4kK.1w7yK%7E.Q9b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2254%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1KA.1w5RO%7E.6Lw..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__30558414.858925268_-78159010.35020559_13526229.9730611__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_LO-SP_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4Ol.1w7h8%7E.Nu_..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F8VI%7E.oD3y.jwZC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4Ol.1w7h8%7E.Nu_..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221s%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9yuf%7E.26OmS%7E.3Ngp..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2aQPO%7E.41tbP%7E.xbRD%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22O%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1-FVe%7E.1XEM6%7E.ajpB..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YUwW%7E.jAMq.sZim%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3K4.1w6ta%7E.HD1..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Q_Z.26PQe%7E.4c0G%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__36690610.56952284_2248973.832734734_43190225.75679836__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CMF-PrC_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-23256396.701205328_23880207.231972933_38552865.2992176__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_RMF-SF_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2q9i0%7E.18W1K%7E.W5Ov..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2257%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HRjm.2qnDi%7E.2aiDS..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5ND.1w8WG%7E.Ukc..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HPSS.2qqLi%7E.2agZC..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2230%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BMdc%7E.nple.hLS0%7E..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%235&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-11860943.840244282_-3841070.8089927398_6062769.611936631__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..DdeY%7E.nbr0.kciC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-28154889.85214655_51133454.070423365_6508966.213407755__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_RMF-SF_0.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%232&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-9255503.675448196_27432071.93513858_43445688.65496198__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-14133600_5746400_38749600__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoCi-SF_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..C6ou%7E.o7U8.g-_a%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-38142764.93369323_13186656.495716482_6789050.580917731__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Op-Ins_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221w%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..23NGr%7E.5OTEV%7E.PIyY..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..29GIW.2qnDi%7E.2mzMG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2256%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1NNu.26Pd8%7E.4ooi%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4Rm%7E.FqUI.aApq%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CFOu%7E.oAn4.gxpO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1xoL5%7E.32COZ%7E.2v2sZ..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Dr3w%7E.nhsy.kX3G%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RSj.26PNW%7E.4a86%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=DiFuMo+Atlas+%281024+dimensions%29", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224f%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3hh.1w78m%7E.JQm..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-54779380.41779167_-44430368.05456871_5921912.746909201__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_MT-ST_0.nii", - "templateSelected=MNI%20152%20ICBM%202009c%20Nonlinear%20Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2jbzh.2Rif.nV4g~..2kDL&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FArea-TI2_r_N10_nlin2MNI152ASYM2009C_5.1_publicDOI_6d04657cb03e80a480d2332fd88ce368.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1O_e.26Pa0%7E.4jP4%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-6586523.335081279_15699265.862611443_27273466.177241743__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoCi-RAC_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-43868606.701940045_19458994.708994716_26839506.172839493__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs4_l_N10_nlin2Stdcolin27_2.2_publicDOI_9c0d663426f3c3fe44dc19c2e4c524f7.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1O_e.26Pa0%7E.4jP4%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ed94%7E.o06G.kAl8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-29274193.54838711_-114097.96893668175_-22296893.66786141__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_MOF-ST_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__41281305.506216675_14571492.007104814_28173845.470692724__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifj1_r_N10_nlin2Stdcolin27_2.2_publicDOI_c09b6c65860aecdd6c7243bf89270e75.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BzuQ%7E.o3_i.h4BK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Xcr6~.3TrSY~.1y6gL~..ndB", - "templateSelected=MNI%20152%20ICBM%202009c%20Nonlinear%20Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2oPBr~.98Qh~.eb7c~..2kDL&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FArea-TI2_l_N10_nlin2MNI152ASYM2009C_5.1_publicDOI_0d90b238155bc15ca0ec39ca312475a7.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHl0.2r5J8%7E.2SHoC..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-56748493.68318756_-21383576.287657917_27466569.484936833__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Tf8.26P6K%7E.4QYM%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__39397584.5410628_-60459903.38164252_1968599.033816427__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IP-IT_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..b89c.3VDfZ~.1xOx2~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-42369622.98621491_20625726.623484462_29724381.33200465__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs3_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_163dfd8bdc1ea401267827a07fe3c938.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..280PJ%7E.1QPbi%7E.1BBlo..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%225J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YUwW%7E.jAMq.sZim%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2254%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1KA.1w5RO%7E.6Lw..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2LfW4%7E.1k5sq%7E.jhaT..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D46o%7E.GTX0.aSQO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-45311270.683734_-61189509.83453013_15697315.017171413__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-MT_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D46o%7E.GTX0.aSQO%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5y-.1w92e%7E.ZNK..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Dr3w%7E.nhsy.kX3G%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..533.1w8DW%7E.SRV..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-35232426.650366746_26462408.31295845_-5745721.271393642__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Or-Ins_0.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps&cNavigation=0.0.0.-W000.._YYCk.2-DuEy.-5_Ew.2_VOZ4..4a_0..1GeRe%7E.DrL4%7E.RjPd%7E..Lv_", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2218%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2REFz%7E.1AMpx%7E.HfJx%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1LhX.26Pba%7E.4u4W%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-41744720.49689442_20211801.24223602_31307453.41614905__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs3_l_N10_nlin2Stdcolin27_2.2_publicDOI_a6839437711ba9eb50fd17baf7c6a562.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__26920246.789221868_16882976.580206513_32365927.977839336__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Op-SF_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZKgq%7E.nlUC.pxu8%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-14041584.806810752_-23498690.242305174_43994433.52979699__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoCi-PrCu_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..29NWG.2qeA0%7E.2mtZa..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bqe4%7E.o0HC.h8RC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2257%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HRjm.2qnDi%7E.2aiDS..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2256%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1NNu.26Pd8%7E.4ooi%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__51600571.42857143_-24701142.85714285_-19193714.285714284__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IT-MT_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%229%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9zzE%7E.26MH4%7E.3RIH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__27924207.93018402_41440428.76114589_-12625023.714665145__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_LOF-RMF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre+Bundle+Atlas+-+Long+Bundle", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3gjm9%7E.2CrNs%7E.2GrZ-..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Ahku.2zQH0%7E.2fvZq..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4Rm%7E.FqUI.aApq%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224f%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1P-z.26PWu%7E.4fkO%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22v%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZFpa%7E.nmPa.q1VW%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__53615750.83170816_-19381495.927497998_27881209.131581962__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2212%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..pAuP%7E.3SYJE%7E.1vwl0%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BMdc%7E.nple.hLS0%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1P-z.26PWu%7E.4fkO%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2UKBH%7E.ojTW%7E.18kYZ..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Yr.1w6Je%7E.CqH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__27362756.892230585_38169373.433583945_14147719.298245624__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Tr-SF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YaQE%7E.j9T0.sS28%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..abJm%7E.jBZO.bkf2%7E..2Ul9", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%237&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__3479937.1036163364_2702958.4989095596_3819372.2349505564__295893.7198067633", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%231&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-10496193.61330948_13643679.341296235_42286811.995786324__295893.7198067633 ", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-37961341.0330446_15978825.794032723_38445139.55726659__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-RMF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1TEZ.26PB0%7E.4SUu%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AkEG.2zN4K%7E.2fwny..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2255%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1NNu.26Pd8%7E.4ooi%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Eu.1w9Jq%7E.bip..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Sd.1w4qK%7E.26b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%222V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZOpM%7E.l0Hi.aD_U%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4Ol.1w7h8%7E.Nu_..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-33746524.06417113_-21555080.213903755_11583957.219251335__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_SM-Ins_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-40688555.85831063_26974659.40054497_22290917.347865567__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs1_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_77901443edc477e83f2bb6b47a363873.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221m%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BBwc%7E.nkwG.hPrG%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-35109855.33453888_33661618.44484627_-12595840.867992766__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_LOF-Or_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1PVg.26PYS%7E.4ha2%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ed94%7E.o06G.kAl8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22C%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2iiQ0%7E.1ZJOg%7E.3ZbYl..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__29495619.238842756_-25190334.945696816_57033266.40503785__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-PrC_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ezks%7E.o8wK.j-vO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-34393372.462704815_-57501467.35143067_38250550.256786495__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-SP_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YaQE%7E.j9T0.sS28%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2220%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2255%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1KA.1w5RO%7E.6Lw..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22N%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2hIab%7E.4QhvG%7E.1scqJ..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AZqe.2zZaK%7E.2frx0..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__32097179.28902629_-17118817.61978361_-6205660.741885617__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FInferiorFrontoOccipital_Right.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Yr.1w6Je%7E.CqH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-44546301.22405535_23441458.22245875_22606971.79350719__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs2_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_3b1bdcf898eaa037f9cfed73620493e0.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZUOO%7E.ni50.pm0m%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZNsu%7E.l1JK.aGyo%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1UqM.26Ovq%7E.4Kdm%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2257%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..38tgy%7E.2GAnW%7E.1PP8o..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-24634940.15412362_-27893015.24840139_60979258.8949008__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-PrC_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MqM.26Pd8%7E.4qaI%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZZIz%7E.nfVO.pffm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%225K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..acOg%7E.jAXm.bhQy%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5ND.1w8WG%7E.Ukc..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37928011.20448181_-924089.6358543336_11330812.324929968__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PrC-Ins_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..EEyo%7E.nsUe.kLoy%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..abJm%7E.jBZO.bkf2%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2213%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..uQp7%7E.h1QE%7E.1BE7q%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224f%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3hh.1w78m%7E.JQm..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-41312500_-48958333.33333333_34979166.66666667__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2bqCu%7E.2qj3o%7E.16Y0P%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221s%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..b1MU%7E.1GCBj.1HelW%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHl0.2r5J8%7E.2SHoC..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%229%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ANz8%7E.1xd2G%7E.Ao-c..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre+Bundle+Atlas+-+Short+Bundle", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..12Tsg%7E.5hzZ%7E.1HNX0%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1w2X6%7E.2sRK1%7E.uijU%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..24C3m.2-gDW%7E.2qdoa..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221O%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..IqNM%7E.nseY.mlhR%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-46412228.05701426_-33472564.569713846_41822902.154109955__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-SM_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RSj.26PNW%7E.4a86%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F8VI%7E.oD3y.jwZC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2n3_-%7E.4lUyM%7E.1Xzb%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZOpM%7E.l0Hi.aD_U%7E..2Ul9", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2325&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__8584702.92136917_6170347.792104806_-11790982.216547377__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221n%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Dr3w%7E.nhsy.kX3G%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221v%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..28C12%7E.2nvp1%7E.3oIdM..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__7623812.754409775_-4527815.468113974_32416214.382632285__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CAC-PoCi_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-41680974.997759655_-24691818.26328525_32234115.960211486__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FArcuate_Anterior_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22M%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1gs7J%7E.1f0yF%7E.ijVE%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__27903280.22492972_-64708153.70196813_39108997.18837863__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IP-SP_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RwH.26PKO%7E.4YF0%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1U30.26P3C%7E.4ObC%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Ao_y.2zGW0%7E.2fzIu..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22M%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PL0q.2r45W%7E.2SKKa..45jd", - "https://interactive-viewer.apps.hbp.eu/?templateSelected=Waxholm+Space+rat+brain+MRI%2FDTI&parcellationSelected=Waxholm+Space+rat+brain+atlas+v1&cNavigation=0.0.0.-W000..2-8Bnd.2_tvb9._yymE._tYzz..1Sjt..Ecv%7E.Lqll%7E.33ix..9fo&cRegionsSelected=%7B%22v1_01%22%3A%2213.a.b.19.6.c.q.x.1.1L.Y.1K.r.s.y.z._.1G.-.Z.18.v.f.g.1J.1C.k.14.15.7.1E.1F.2.10.11.12.1D.1M.1N.1O.1P.1Q.1R.1S.A.E.F.H.U.V.W.3.1I.e.d.1T.1H.m.h.n.1U.o.t.2.17.p.w.4.5.1A.1B.u.l.X.j.16.i%22%7D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-41752255.71126896_13437607.986177772_29191111.53772317__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifj1_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_51cf544971b79d4b9a10fe5b9da00576.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6-m.1wA7O%7E.irG..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-47487080.81363387_-14342908.191313908_-799752.6113249063__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_ST-TT_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HFZe.2r028%7E.2aZzK..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Eu.1w9Jq%7E.bip..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__47412703.19084889_-15053080.473610282_25047662.05097331__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PrC-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1cEIQ%7E.2DcET.1xt_G..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2315&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-5671180.552151227_-44793672.67154157_21692004.396585546__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Ysl2%7E.1tZHm%7E.37bdV..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3qQpu%7E.kmhV%7E.3PFE..2-zd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-42829457.36434109_-17871834.625322998_43969509.04392764__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-PrC_3.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1U30.26P3C%7E.4ObC%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SpG.26PE8%7E.4UQK%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0.._PbS~.3T7dn~.2Dwe7~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xm.1w6aq%7E.E-t..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..42a.1w7Py%7E.LfS..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221i%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YUwW%7E.jAMq.sZim%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6-m.1wA7O%7E.irG..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__39031433.0339711_19421124.560718477_32263959.39086294__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs3_r_N10_nlin2Stdcolin27_2.2_publicDOI_634ba65855c32e73a6d9848f6512f62a.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZPW_%7E.nk3a.ps5q%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2255%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1KA.1w5RO%7E.6Lw..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2EA40%7E.19jJ7%7E.NY9L..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224Z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9_-e%7E.26Jni%7E.3UtA..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__41907881.163606375_23001341.035692185_27392098.205075294__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs4_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_0d57128ee2cd1878ec1c0b36a390ea82.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1nY_1%7E.44E3r%7E.lckg%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..0.1w4W0%7E.0..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%222u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CNhW%7E.oDtW.gtfm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-43345287.59528759_8643970.893970907_29156964.65696466__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifj2_l_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_0c3fa7a162ff6d09b5d7127d68750969.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Sd.1w4qK%7E.26b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ANz8%7E.1xd2G%7E.Ao-c..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D46o%7E.GTX0.aSQO%7E..45jd", - "https://interactive-viewer.apps.hbp.eu/?templateSelected=Waxholm+Space+rat+brain+MRI%2FDTI&parcellationSelected=Waxholm+Space+rat+brain+atlas+v2&cNavigation=0.0.0.-W000..2-8Bnd.2_tvb9._yymE._tYzz..1Sjt..Ecv%7E.Lqll%7E.33ix..9fo&cRegionsSelected=%7B%22undefined%22%3A%2213.a.b.19.6.c.q.x.1.1L.Y.1K.r.s.y.z._.1G.-.Z.18.v.f.g.1J.1C.k.14.15.7.1E.1F.10.11.12.1D.1S.A.1V.1W.1X.1Y.1Z.1a.1i.1j.1k.1m.1n.1o.1p.U.V.W.3.1I.e.d.1T.1H.m.h.n.1U.o.t.2.17.p.w.4.5.1A.1B.u.l.j.16%22%7D", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..C6ou%7E.o7U8.g-_a%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Eu.1w9Jq%7E.bip..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Q_Z.26PQe%7E.4c0G%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__42442095.58823532_19733455.88235292_27535539.21568626__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs4_r_N10_nlin2Stdcolin27_2.2_publicDOI_9dc7b73fc32e0ace1895b041827fa134.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-14299421.661409035_49790220.82018927_8868296.529968455__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_RAC-SF_1.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D4LA%7E.GT4Q.aPm4%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-39311320.75471698_-78719569.21021873_10634079.145099342__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-LO_1.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%233&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-8973603.851892563_28973428.94347216_35691249.925134525__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__4658634.538152605_19629852.744310558_25204819.27710843__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoCi-RAC_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__24132739.93808049_11329979.36016512_49375773.993808046__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CMF-SF_1.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Vx.1w9b0%7E.e45..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-31881756.75675676_-17624577.702702716_44101773.64864865__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-PoC_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CNhW%7E.oDtW.gtfm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-31499165.41478885_34825154.39826405_-13381488.900016688__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_LOF-RMF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ezks%7E.o8wK.j-vO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RSj.26PNW%7E.4a86%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1US2.26O_W%7E.4Mco%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%222t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BzuQ%7E.o3_i.h4BK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AN0M%7E.1xeqK%7E.AlJC..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1PVg.26PYS%7E.4ha2%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ERGS%7E.nxOi.kGEi%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..7EQ.1wAOa%7E.lFP..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..D2fB%7E.GK37.Wq-x%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ud.1w58e%7E.4E8..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SN7.26PHG%7E.4WKq%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MGE.26Pd8%7E.4sKo%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9_-e%7E.26Jni%7E.3UtA..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2214%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BX14%7E.nuAS.hH4K%7E..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%238&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__4800238.025729925_8859988.56810579_-24872710.402861338__295893.7198067633", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..nF8F.3cAJG~.2DEmU~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Vx.1w9b0%7E.e45..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%221P%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..7QTa.3G7yR~.1olaD~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2221%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221m%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..DdeY%7E.nbr0.kciC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2ArGG.2zD8O%7E.2f_a8..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xm.1w6aq%7E.E-t..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1CKBK%7E.59_Yv%7E.drVe%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BX14%7E.nuAS.hH4K%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2219%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..vunb%7E.2172V%7E.2c-Jb..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BX14%7E.nuAS.hH4K%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..dcWK%7E.5DmVI%7E.D4nR..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1hxCH%7E.1h5II%7E.m6h7%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1OT1.26Pba%7E.4lCs%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZPW_%7E.nk3a.ps5q%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-43229665.07177034_8982057.416267931_30257655.50239235__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifj2_l_N10_nlin2Stdcolin27_2.2_publicDOI_86b9e91d54b288198f3604075196534f.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Q_Z.26PQe%7E.4c0G%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xm.1w6aq%7E.E-t..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=DiFuMo+Atlas+%28512+dimensions%29", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..YPRG%7E.jAnO.sg_O%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%225H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..YEPK%7E.jAF0.suUS%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221b%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..15nlV%7E.3s8_i.9Dyq%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AX2W.2zcYy%7E.2fqkS..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..0.1w4W0%7E.0..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__35559980.33431661_-19616027.531956732_46307112.42215666__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-PrC_2.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1OT1.26Pba%7E.4lCs%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221s%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9yuf%7E.26OmS%7E.3Ngp..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%225H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..YEPK%7E.jAF0.suUS%7E..2Ul9 ", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37380591.209646046_27002333.72228703_24475884.869700506__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs1_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_144113cffdeb98e2b16d713a6b7502e4.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1eWeV%7E.4oetO%7E.mQGR%7E..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%236&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__19474749.851130597_7932494.322090598_3511322.3418121324__295893.7198067633", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ZUOO%7E.ni50.pm0m%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221s%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..AN0M%7E.1xeqK%7E.AlJC..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bh0m%7E.nyLe.hCkC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..Fo8S%7E.3HLDu%7E.1ojWn%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3HHdv%7E.135pg%7E.OL9S%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223a%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AkEG.2zN4K%7E.2fwny..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2319&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-3219409.8119737757_-35998463.674534306_32696398.317760143__295893.7198067633", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%234&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__4363383.768074982_836825.2022554543_4887116.718596431__295893.7198067633", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2ArGG.2zD8O%7E.2f_a8..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bqe4%7E.o0HC.h8RC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..533.1w8DW%7E.SRV..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1QVh.26PTm%7E.4dte%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__43888619.854721546_-48794188.861985475_9509685.230024219__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IP-MT_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37914141.41414142_-29843344.155844152_19024981.96248196__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FArcuate_Right.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2256%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1k_.1w5k8%7E.8V7..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__26134653.343202576_51316308.90698248_5655378.731803611__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_RMF-SF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2xW7y%7E.LS11%7E.Dixo%7E..2-zd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__24057215.222756192_-1166969.7363294065_54117093.12897779__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CMF-SF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..abJm%7E.jBZO.bkf2%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D3uo%7E.GT_m.aV30%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5y-.1w92e%7E.ZNK..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2219%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AfAq.2zTQa%7E.2fuLi..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HTuq.2qk10%7E.2ajvG..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5gX.1w8nS%7E.X2B..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-28838432.91296257_-70497725.8631383_34441148.09454897__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_IP-SP_0.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2320&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-4399436.577488743_-36706103.55586253_15113373.95551695__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__44162968.51574212_8570464.767616183_17187931.034482762__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Op-PrC_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%223j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HFZe.2r028%7E.2aZzK..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ERGS%7E.nxOi.kGEi%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SN7.26PHG%7E.4WKq%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4Rm%7E.FqUI.aApq%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%225J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..YUwW%7E.jAMq.sZim%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4kK.1w7yK%7E.Q9b..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..0.1w4W0~.16de..16de", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bqe4%7E.o0HC.h8RC%7E..45jd", - "templateSelected=Big+Brain+(Histology)&parcellationSelected=Grey%2FWhite+matter", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221P%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D8jS~.3MdtH~.1qixc~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SN7.26PHG%7E.4WKq%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22M%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HaUi.2we4K%7E.2WuOm..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1VBr.26Or8%7E.4Ido%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2218%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1k_.1w5k8%7E.8V7..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..r7Tj%7E.5TEyU%7E.1LmLK..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2218%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1k_.1w5k8%7E.8V7..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..F4Rm%7E.FqUI.aApq%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223E%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BMdc%7E.nple.hLS0%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Vx.1w9b0%7E.e45..3q90", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2321&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-4455614.161381434_-44097378.663157195_28855803.473491605__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-39672754.94672755_-43623033.992897004_44527904.616945714__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_SP-SM_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..42a.1w7Py%7E.LfS..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6Eu.1w9Jq%7E.bip..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-29944625.61143861_51949767.96688825_-8936974.789915964__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_LOF-RMF_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223K%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ed94%7E.o06G.kAl8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..EEyo%7E.nsUe.kLoy%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22Q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2pLGe%7E.65Ez%7E.hYbG%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CNhW%7E.oDtW.gtfm%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Jjic.3P2WY~.1w7Ew~..ndB", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22COLIN_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..pOEl~.3Zn9C~.1zLqf~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..121mv%7E.2dIqq%7E.458ts..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2255%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1KA.1w5RO%7E.6Lw..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ud.1w58e%7E.4E8..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BzuQ%7E.o3_i.h4BK%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221x%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1LhX.26Pba%7E.4u4W%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224H%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..29D.1w60u%7E.AfP..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__40553953.93783218_17772990.819777727_27986390.72314383__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifj1_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_00c617b20263b7e98ba4f25e5cf11a1f.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2OQwQ%7E.Wbw6.ZQ1X..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__24284226.397587553_20110020.876826733_-18368754.349338897__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FUncinate_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%225I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..acOg%7E.jAXm.bhQy%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B\"jubrain+mni152+v18+right\"%3A\"U\"%7D", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22v%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZFpa%7E.nmPa.q1VW%7E..2Ul9", - "templateSelected=Big+Brain+(Histology)&parcellationSelected=BigBrain+Cortical+Layers+Segmentation", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..35qFY%7E.HhhV.G-rv..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__52163167.76007497_-36042361.76194939_4731490.159325197__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_MT-ST_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..EEyo%7E.nsUe.kLoy%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__27661747.73289366_-39409810.38746908_53495383.34707339__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoC-SP_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ezks%7E.o8wK.j-vO%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%222%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..D46o%7E.GTX0.aSQO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%229%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9zzE%7E.26MH4%7E.3RIH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221P%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..A4Nm%7E.4ZMQ3%7E.28yjn..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__42928774.92877495_-43420702.754036084_40598290.59829061__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IP-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222w%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HN6S.2qtNS%7E.2aeuy..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ANz8%7E.1xd2G%7E.Ao-c..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__20714547.118023783_-21787282.708142728_572735.5901189446__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FFornix_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%229%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..15OEx%7E.5J3Wp%7E.1YIjw..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZKgq%7E.nlUC.pxu8%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-44802912.62135923_-48078640.77669904_12375728.155339807__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_MT-SM_0.nii", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2324&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-3185950.235648434_3919066.7112473394_-8346900.275603936__295893.7198067633", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..246Ye.2-q7u%7E.2qikC..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..246Ye.2-q7u%7E.2qikC..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__44008083.140877604_21172055.427251726_25098922.247882992__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs2_r_N10_nlin2Stdcolin27_2.2_publicDOI_fa175bc55a78d67a6b90011fecd7ade5.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__38368191.721132874_-73057734.20479304_5811546.840958595__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_IP-LO_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CNhW%7E.oDtW.gtfm%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__24786320.897785872_2593114.9529875815_-21704124.962086745__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_MOF-ST_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1iNg0~.1fJc4~.mE5f~..1HTs&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%222-%22%7D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HRjm.2qnDi%7E.2aiDS..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bh0m%7E.nyLe.hCkC%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZPW_%7E.nk3a.ps5q%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221g%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1U30.26P3C%7E.4ObC%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ezks%7E.o8wK.j-vO%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224I%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1OT1.26Pba%7E.4lCs%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221T%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2f_6l%7E.Dh6k.2QAOP..45jd", - "parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&templateSelected=MNI+Colin+27&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-40700000_-39100000_56100000__200000®ionsSelected=252&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FJuBrain%2Fv2.2c%2FPMaps%2FPSC_2.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..533.1w8DW%7E.SRV..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%228%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6mG.1w9sC%7E.gS4..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37153098.262898624_-43050427.79362199_44651283.38086596__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_SP-SM_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224Z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9_-e%7E.26Jni%7E.3UtA..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..aaCg%7E.jCXu.bnus%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221D%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2FlIz%7E.2_6f2%7E.2Simj..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_RIGHT_NG_SPLIT_HEMISPHERE%22%3A%22U%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..OB2R.3JyT0~.1vffG~..ndB", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2323&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-11566855.850716649_15797100.302998856_42172031.472206146__295893.7198067633 ", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__25822927.71632065_54094332.47461736_-10567889.074102134__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_LOF-RMF_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=DiFuMo+Atlas+%2864+dimensions%29", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2220%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHl0.2r5J8%7E.2SHoC..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHlS.2r5Je%7E.2SHo4..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%22V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..24C3m.2-gDW%7E.2qdoa..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22A%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1VBr.26Or8%7E.4Ido%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SpG.26PE8%7E.4UQK%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-35829796.26485569_-4098684.2105263323_48480263.157894745__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-PrC_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9zzE%7E.26MH4%7E.3RIH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22J%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3PZB5%7E.Qp1i%7E.yV1M%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=DiFuMo+Atlas+%28256+dimensions%29", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..42a.1w7Py%7E.LfS..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HWqK.2wfeK%7E.2Ws-i..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221o%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZNsu%7E.l1JK.aGyo%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1TW9c%7E.1Jm-n%7E.hnJd%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-42389209.75609756_-27466634.146341458_16691570.73170732__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FArcuate_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%2210%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2vSzF%7E.1ljXk%7E.wdlp%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22R%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3Lg4Z%7E.1ajgd%7E.2KaGh..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-37988939.74065599_-14141495.041952714_11507932.875667438__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1eq5c~.1ZSV4~.gHn1~..1HmA&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%222-%22%7D", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1RwH.26PKO%7E.4YF0%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22M%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HaUi.2we4K%7E.2WuOm..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1PVg.26PYS%7E.4ha2%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6mG.1w9sC%7E.gS4..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__12109082.813891366_-41632680.3205699_36048530.72128227__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_PoCi-PrCu_2.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%2214%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BX14%7E.nuAS.hH4K%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__30726322.48682058_-6315488.093073979_49600163.606616974__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_CMF-PrC_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22M%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PL0q.2r45W%7E.2SKKa..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1UqM.26Ovq%7E.4Kdm%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%221t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..9yuf%7E.26OmS%7E.3Ngp..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..U-.1w1ri~.2Fq5..16de", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-45323691.4600551_-19717630.85399449_27943526.170798898__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PrC-SM_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224X%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4kK.1w7yK%7E.Q9b..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221C%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2w5Vj%7E.3irqF%7E.2P_Gr..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW.._PbS%7E.3T7dn%7E.2Dwe7%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%2226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SpG.26PE8%7E.4UQK%7E..3q90", - "templateSelected=MNI%20Colin%2027&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2qFHc.3WhR.l89T~..2kDL&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FArea-TI2_r_N10_nlin2Stdcolin27_5.1_publicDOI_42dd664fb5c8690e7c149fcb0d821a0e.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1O_e.26Pa0%7E.4jP4%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-52795703.51401337_-10398563.095746204_27672428.51045668__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PoC-PrC_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2257%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2Amey.2zJqW%7E.2fy1e..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%221n%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BBwc%7E.nkwG.hPrG%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37929057.88876277_23993757.09421113_24460272.417707145__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifs1_r_N10_nlin2Stdcolin27_2.2_publicDOI_baf7f7a7c7d00a2044f409b92b78b926.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221_%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..42a.1w7Py%7E.LfS..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%22k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Ed94%7E.o06G.kAl8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__37914141.41414142_-29843344.155844152_19024981.96248196__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FArcuate_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222t%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Eodw%7E.o4bm.k5Ii%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221u%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..3FnSS%7E.1mjIQ%7E.aEu0..2-zd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221r%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..e7-N%7E.4_5ES%7E.Anmr..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%22B%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..3cWaf%7E.dyXQ%7E.y16D..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__31924155.28396836_-60861610.35226457_-9854421.279654935__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_Fu-LO_1.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%223h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2AfAq.2zTQa%7E.2fuLi..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221n%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Dr3w%7E.nhsy.kX3G%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221m%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BBwc%7E.nkwG.hPrG%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221P%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Fo8S~.3HLDu~.1ojWn~..ndB", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2PHlS.2r5Je%7E.2SHo4..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__44707371.225577265_9416370.633510947_27168590.882178783__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Fcolin27%2Fpmaps%2FIFS_ifj2_r_N10_nlin2Stdcolin27_2.2_publicDOI_346dca14e393e290b70807d4e30cd835.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__43590116.62151018_12108670.043585807_26892390.15196137__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifj2_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_a988cbde839a0399e767be7ef02cc95c.nii.gz", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%222V%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..abJm%7E.jBZO.bkf2%7E..2Ul9", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1Tf8.26P6K%7E.4QYM%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-42624840.388959825_3251006.777330339_37158579.70729791__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_CMF-PrC_1.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-34248274.94692144_-21216427.813163474_-6111199.5753715485__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FInferiorFrontoOccipital_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-42343003.412969284_-2070753.4786033034_10107771.068521932__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PrC-Ins_0.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5y-.1w92e%7E.ZNK..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221y%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..1I-0R%7E.22bix.1CyL8%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223j%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HFZe.2r028%7E.2aZzK..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+Maps+-+v2.5.1&cRegionsSelected=%7B%22MNI152_V25_LEFT_NG_SPLIT_HEMISPHERE%22%3A%221d%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..QaW_%7E.27wgv.sU35%7E..45jd", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps®ionsSelected=interpolated%2322&navigation=0_0_0_1__0.3140767216682434_-0.7418519854545593_0.4988985061645508_-0.3195493221282959__1922235.5293810747__-9349145.390744817_27783956.655307576_38734626.88870795__295893.7198067633", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-26408504.835110337_-10505207.041904286_54935159.93057278__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_PrC-SF_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-39192168.637784176_-42631349.96016914_-8671180.832158834__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FInferiorLongitudinal_Left.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6-m.1wA7O%7E.irG..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%229%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ANz8%7E.1xd2G%7E.Ao-c..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Short+Fiber+Bundles+-+HCP", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%224%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MGE.26Pd8%7E.4sKo%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223h%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2HKgC.2qwM4%7E.2adEi..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%224W%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..4kK.1w7yK%7E.Q9b..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%2226%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..5ND.1w8WG%7E.Ukc..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223G%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1TEZ.26PB0%7E.4SUu%7E..3q90", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..ud.1w58e%7E.4E8..3q90", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps&cRegionsSelected=%7B%22v5%22%3A%221%22%7D&cNavigation=0.0.0.-W000..-GHSG.2_0PIA.zn_OK.2-8mTZ..7LIx..r15q%7E.2X38a%7E.Gx92%7E..jZZ", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223l%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1US2.26O_W%7E.4Mco%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__39308927.09196353_-22777996.40983154_32738193.869096935__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fright-hemisphere%2FProbability_Maps%2FArcuate_Anterior_Right.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2227%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1SpG.26PE8%7E.4UQK%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__30727572.31783229_7292200.659099221_-24747345.294763826__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fright-hemisphere%2FProbability_Maps%2Frh_LOF-ST_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-20803546.879296124_-36580285.94995877_-10145861.974154532__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FCingulum_Temporal_Left.nii", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..6mG.1w9sC%7E.gS4..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=JuBrain+Cytoarchitectonic+Atlas&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__38875694.35035902_22074041.45779705_32925552.093212306__1071975.4977029096&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.eu%2Fprecomputed%2FJuBrain%2F17%2Ficbm152casym%2Fpmaps%2FIFS_ifs3_r_N10_nlin2MNI152ASYM2009C_2.2_publicDOI_e664da66c465b00af07d0d53e6300b17.nii.gz", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%222-%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..Bh0m%7E.nyLe.hCkC%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+left%22%3A%225%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MqM.26Pd8%7E.4qaI%7E..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%2230%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..E2CO%7E.nnMW.kRQK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%22k%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..BzuQ%7E.o3_i.h4BK%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+left%22%3A%221p%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..ZNsu%7E.l1JK.aGyo%7E..2Ul9", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%223e%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..CFOu%7E.oAn4.gxpO%7E..45jd", - "templateSelected=MNI+Colin+27&parcellationSelected=Cytoarchitectonic+Maps+-+v1.18&cRegionsSelected=%7B%22jubrain+colin+v18+right%22%3A%224c%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..2Yr.1w6Je%7E.CqH..3q90", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Long%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-29901044.899648257_15264845.851438016_-17445944.547899857__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FDWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2FUncinate_Left.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%221q%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..YPRG%7E.jAnO.sg_O%7E..2Ul9", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps&navigation=0_0_0_1__0.7989629507064819_0.09687352180480957_-0.0713578313589096_-0.5892213582992554__1922235.5293810747__311768_-54882876_4142912__350000®ionsSelected=v2%231", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Fibre%20Bundle%20Atlas%20-%20Short%20Bundle&navigation=0_0_0_1__-0.2753947079181671_0.6631333827972412_-0.6360703706741333_0.2825356423854828__3000000__-40639583.333333336_-76233333.33333334_-11417708.333333336__484084&niftiLayers=https%3A%2F%2Fneuroglancer.humanbrainproject.org%2Fprecomputed%2FFiber_Bundle%2FSWM_atlas%2Fleft-hemisphere%2FProbability_Maps%2Flh_Fu-LO_0.nii", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%22z%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..EEyo%7E.nsUe.kLoy%7E..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%224F%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..DMVW..2HRjm.2qnDi%7E.2aiDS..45jd", - "templateSelected=MNI+152+ICBM+2009c+Nonlinear+Asymmetric&parcellationSelected=Cytoarchitectonic+maps+-+v1.18&cRegionsSelected=%7B%22jubrain+mni152+v18+right%22%3A%223%22%7D&cNavigation=0.0.0.-W000..2_ZG29.-ASCS.2-8jM2._aAY3..BSR0..1MGE.26Pd8%7E.4sKo%7E..3q90", - "templateSelected=Big+Brain+%28Histology%29&parcellationSelected=Cytoarchitectonic+Maps&cRegionsSelected=%7B%22v3v%22%3A%221%22%7D&cNavigation=0.0.0.-W000..-DAqw.2_PGSc._ShZn.2-8GXE..7LIx..Echz.3Dv8q%7E.7gwp%7E..jZZ" -] diff --git a/deploy/bkwdCompat/urlState.js b/deploy/bkwdCompat/urlState.js deleted file mode 100644 index 14b765d34..000000000 --- a/deploy/bkwdCompat/urlState.js +++ /dev/null @@ -1,287 +0,0 @@ -// this module is suppose to rewrite state stored in query param -// and convert it to path based url -const { sxplrNumB64Enc } = require("../../common/util") - -const { - encodeNumber, - separator -} = sxplrNumB64Enc - -const waxolmObj = { - aId: 'minds/core/parcellationatlas/v1.0.0/522b368e-49a3-49fa-88d3-0870a307974a', - id: 'minds/core/referencespace/v1.0.0/d5717c4a-0fa1-46e6-918c-b8003069ade8', - parc: { - 'Waxholm Space rat brain atlas v3': { - id: 'minds/core/parcellationatlas/v1.0.0/ebb923ba-b4d5-4b82-8088-fa9215c2e1fe' - }, - 'Whole Brain (v2.0)': { - id: 'minds/core/parcellationatlas/v1.0.0/2449a7f0-6dd0-4b5a-8f1e-aec0db03679d' - }, - 'Waxholm Space rat brain atlas v2': { - id: 'minds/core/parcellationatlas/v1.0.0/2449a7f0-6dd0-4b5a-8f1e-aec0db03679d' - }, - 'Waxholm Space rat brain atlas v1': { - id: 'minds/core/parcellationatlas/v1.0.0/11017b35-7056-4593-baad-3934d211daba' - }, - } -} - -const allenObj = { - aId: 'juelich/iav/atlas/v1.0.0/2', - id: 'minds/core/referencespace/v1.0.0/265d32a0-3d84-40a5-926f-bf89f68212b9', - parc: { - 'Allen Mouse Common Coordinate Framework v3 2017': { - id: 'minds/core/parcellationatlas/v1.0.0/05655b58-3b6f-49db-b285-64b5a0276f83' - }, - 'Allen Mouse Brain Atlas': { - id: 'minds/core/parcellationatlas/v1.0.0/39a1384b-8413-4d27-af8d-22432225401f' - }, - 'Allen Mouse Common Coordinate Framework v3 2015': { - id: 'minds/core/parcellationatlas/v1.0.0/39a1384b-8413-4d27-af8d-22432225401f' - }, - } -} - -const templateMap = { - 'Big Brain (Histology)': { - aId: 'juelich/iav/atlas/v1.0.0/1', - id: 'minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588', - parc: { - 'Cytoarchitectonic Maps - v2.4': { - id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290', - }, - 'Cytoarchitectonic Maps': { - id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290', - }, - 'Cortical Layers Segmentation': { - id: 'juelich/iav/atlas/v1.0.0/3' - }, - 'Grey/White matter': { - id: 'juelich/iav/atlas/v1.0.0/4' - } - } - }, - 'MNI 152 ICBM 2009c Nonlinear Asymmetric': { - aId: 'juelich/iav/atlas/v1.0.0/1', - id: 'minds/core/referencespace/v1.0.0/dafcffc5-4826-4bf1-8ff6-46b8a31ff8e2', - parc: { - 'Cytoarchitectonic Maps - v2.5.1': { - // redirect julich brain v251 to v290 - id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290' - }, - 'Short Fiber Bundles - HCP': { - id: 'juelich/iav/atlas/v1.0.0/79cbeaa4ee96d5d3dfe2876e9f74b3dc3d3ffb84304fb9b965b1776563a1069c' - }, - 'Cytoarchitectonic maps - v1.18': { - id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579' - }, - 'Long Bundle': { - id: 'juelich/iav/atlas/v1.0.0/5' - }, - 'fibre bundle short': { - id: 'juelich/iav/atlas/v1.0.0/6' - }, - 'DiFuMo Atlas (64 dimensions)': { - id: 'minds/core/parcellationatlas/v1.0.0/d80fbab2-ce7f-4901-a3a2-3c8ef8a3b721' - }, - 'DiFuMo Atlas (128 dimensions)': { - id: 'minds/core/parcellationatlas/v1.0.0/73f41e04-b7ee-4301-a828-4b298ad05ab8' - }, - 'DiFuMo Atlas (256 dimensions)': { - id: 'minds/core/parcellationatlas/v1.0.0/141d510f-0342-4f94-ace7-c97d5f160235' - }, - 'DiFuMo Atlas (512 dimensions)': { - id: 'minds/core/parcellationatlas/v1.0.0/63b5794f-79a4-4464-8dc1-b32e170f3d16' - }, - 'DiFuMo Atlas (1024 dimensions)': { - id: 'minds/core/parcellationatlas/v1.0.0/12fca5c5-b02c-46ce-ab9f-f12babf4c7e1' - }, - }, - }, - 'MNI Colin 27': { - aId: 'juelich/iav/atlas/v1.0.0/1', - id: 'minds/core/referencespace/v1.0.0/7f39f7be-445b-47c0-9791-e971c0b6d992', - parc: { - 'Cytoarchitectonic Maps - v1.18': { - id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579' - } - } - }, - 'Waxholm Space rat brain MRI/DTI': waxolmObj, - 'Waxholm Rat V2.0': waxolmObj, - 'Allen Mouse Common Coordinate Framework v3': allenObj, - 'Allen Mouse': allenObj -} - -const encodeId = id => id.replace(/\//g, ':') - -const WARNING_STRINGS = { - PREVIEW_DSF_PARSE_ERROR: 'Preview dataset files cannot be processed properly.', - REGION_SELECT_ERROR: 'Region selected cannot be processed properly.', - TEMPLATE_ERROR: 'Template not found.', -} -const pliPreviewUrl = `/a:juelich:iav:atlas:v1.0.0:1/t:minds:core:referencespace:v1.0.0:a1655b99-82f1-420f-a3c2-fe80fd4c8588/p:juelich:iav:atlas:v1.0.0:4/@:0.2-4Fk_.-KlpS.0.._eCwg.2-FUe3._-s_W.2_evlu..7LIy..1WNl8.6Tjd~.bTYu~..Zdk/f:b08a7dbc-7c75-4ce7-905b-690b2b1e8957--d3ca8fe622051466a5cde547a11111ca` -module.exports = (query, _warningCb) => { - - const HOST_PATHNAME = process.env.HOST_PATHNAME || '' - let redirectUrl = `${HOST_PATHNAME}/#` - - const { - standaloneVolumes, - niftiLayers, // deprecating - check if anyone calls this url - pluginStates, - previewingDatasetFiles, - - templateSelected, - parcellationSelected, - regionsSelected, // deprecating - check if any one calls this url - cRegionsSelected, - - navigation, - cNavigation, - } = query || {} - - if (Object.keys(query).length === 0) return null - - /** - * nb: it is absolutely imperative that warningCb are not called with dynamic data. - * Since it is injected as param in - */ - const warningCb = arg => { - if (!_warningCb) return - if (Object.values(WARNING_STRINGS).includes(arg)) _warningCb(arg) - } - - if (regionsSelected) console.warn(`regionSelected has been deprecated`) - if (niftiLayers) console.warn(`nifitlayers has been deprecated`) - - // pluginStates from query param were separated by __ - // convert to uri component encoded JSON array - // to avoid potentially issues (e.g. url containing __, which is very possible) - - const plugins = pluginStates && pluginStates.split('__') - const searchParam = new URLSearchParams() - - - // common search param & path - let nav, dsp, r - if (navigation) { - try { - - const [ - _o, _po, _pz, _p, _z - ] = navigation.split("__") - const o = _o.split("_").map(v => Number(v)) - const po = _po.split("_").map(v => Number(v)) - const pz = Number(_pz) - const p = _p.split("_").map(v => Number(v)) - const z = Number(_z) - const v = [ - o.map(n => encodeNumber(n, {float: true})).join(separator), - po.map(n => encodeNumber(n, {float: true})).join(separator), - encodeNumber(Math.floor(pz)), - Array.from(p).map(v => Math.floor(v)).map(n => encodeNumber(n)).join(separator), - encodeNumber(Math.floor(z)), - ].join(`${separator}${separator}`) - - nav = `/@:${encodeURI(v)}` - } catch (e) { - console.warn(`Parsing navigation param error`, e) - } - } - if (cNavigation) nav = `/@:${encodeURI(cNavigation)}` - if (previewingDatasetFiles) { - try { - const parsedDsp = JSON.parse(previewingDatasetFiles) - if (Array.isArray(parsedDsp)) { - if (parsedDsp.length === 1) { - const { datasetId, filename } = parsedDsp[0] - if (datasetId === "minds/core/dataset/v1.0.0/b08a7dbc-7c75-4ce7-905b-690b2b1e8957") { - /** - * if preview pli link, return hardcoded link - */ - return `${HOST_PATHNAME}/#${pliPreviewUrl}` - } else { - /** - * TODO deprecate dsp - */ - dsp = `/dsp:${encodeId(datasetId)}::${encodeURI(filename)}` - } - } else { - searchParam.set(`previewingDatasetFiles`, previewingDatasetFiles) - } - } - } catch (_e) { - warningCb(WARNING_STRINGS.PREVIEW_DSF_PARSE_ERROR) - // parsing preview dataset error - // ignore preview dataset query param - } - } - if (plugins && plugins.length > 0) { - searchParam.set(`pl`, JSON.stringify(plugins)) - } - if (niftiLayers) searchParam.set(`niftiLayers`, niftiLayers) - if (cRegionsSelected) { - try { - (() => { - const parsedRS = JSON.parse(cRegionsSelected) - if (Object.keys(parsedRS).length > 1) { - searchParam.set('cRegionsSelected', cRegionsSelected) - return - } - for (const ngId in parsedRS) { - const encodedIdArr = parsedRS[ngId] - const encodedRArr = encodedIdArr.split(separator) - if (encodedRArr.length > 0) { - if (encodedRArr.length > 1) { - searchParam.set('cRegionsSelected', cRegionsSelected) - return - } - if (!!encodedRArr[0]) { - r = `/r:${encodeURI(ngId)}::${encodeURI(encodedRArr[0])}` - } - } - } - })() - } catch (e) { - warningCb(WARNING_STRINGS.REGION_SELECT_ERROR) - // parsing cregions selected error - // ignore region selected and move on - } - } - if (standaloneVolumes) { - searchParam.set('standaloneVolumes', standaloneVolumes) - if (nav) redirectUrl += nav - if (dsp) redirectUrl += dsp - if (Array.from(searchParam.keys()).length > 0) redirectUrl += `/?${searchParam.toString()}` - return redirectUrl - } - - if (templateSelected) { - if (templateMap[templateSelected]) { - - const { id: t, aId: a, parc } = templateMap[templateSelected] - redirectUrl += `/a:${encodeId(a)}/t:${encodeId(t)}` - if (!parc[parcellationSelected]) { - warningCb(`Parcelation not found, using default.`) - } - const { id: p } = parc[parcellationSelected] || {} - if (p) redirectUrl += `/p:${encodeId(p)}` - if (r && parcellationSelected !== 'Cytoarchitectonic Maps - v2.5.1') redirectUrl += r - if (nav) redirectUrl += nav - if (dsp) redirectUrl += dsp - - if (Array.from(searchParam.keys()).length > 0) redirectUrl += `?${searchParam.toString()}` - - return redirectUrl - } else { - warningCb(WARNING_STRINGS.TEMPLATE_ERROR) - } - } - - if (Array.from(searchParam.keys()).length > 0) { - redirectUrl += `/?${searchParam.toString()}` - return redirectUrl - } - return `${redirectUrl}/` -} diff --git a/deploy/bkwdCompat/urlState.spec.js b/deploy/bkwdCompat/urlState.spec.js deleted file mode 100644 index 225bf252f..000000000 --- a/deploy/bkwdCompat/urlState.spec.js +++ /dev/null @@ -1,18 +0,0 @@ -const { assert } = require('chai') -const url = require('url') -const arr = require('./ngLinks.json') -const parseUrlState = require('./urlState') - -describe('> urlState.js', () => { - it('> works', () => { - for (const item of arr) { - const parsed = url.parse(`/?${item}`, true) - const out = parseUrlState(parsed.query) - - assert( - true, - 'should not result in parsing error' - ) - } - }) -}) diff --git a/deploy/catchError.js b/deploy/catchError.js deleted file mode 100644 index cba45cc58..000000000 --- a/deploy/catchError.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = (raw, req, res, next) => { - /** - * probably use more elaborate logging? - */ - const { code, error, trace } = raw - console.error('Catching error', { - code, - error, - trace, - raw - }) - res.status(code || 500).end() -} \ No newline at end of file diff --git a/deploy/constants.js b/deploy/constants.js deleted file mode 100644 index 05090af3f..000000000 --- a/deploy/constants.js +++ /dev/null @@ -1,21 +0,0 @@ -const fs = require('fs') -const path = require('path') - -const PUBLIC_PATH = process.env.NODE_ENV === 'production' - ? path.join(__dirname, 'public') - : path.join(__dirname, '..', 'dist', 'aot') - -let indexTemplate -try { - - indexTemplate = fs.readFileSync( - path.join(PUBLIC_PATH, 'index.html'), - 'utf-8' - ) - -} catch (e) { - console.error(`index.html cannot be read. maybe run 'npm run build-aot' at root dir first?`) -} -module.exports = { - indexTemplate -} diff --git a/deploy/csp/index.js b/deploy/csp/index.js deleted file mode 100644 index a875bb535..000000000 --- a/deploy/csp/index.js +++ /dev/null @@ -1,147 +0,0 @@ -const csp = require('helmet-csp') -const bodyParser = require('body-parser') - -let WHITE_LIST_SRC, CSP_CONNECT_SRC, SCRIPT_SRC - -// TODO bandaid solution -// OKD/nginx reverse proxy seems to strip csp header -// without it, testSafari.js will trigger no unsafe eval csp -const reportOnly = true || process.env.NODE_ENV !== 'production' - -const CSP_REPORT_URI = process.env.CSP_REPORT_URI - -try { - WHITE_LIST_SRC = JSON.parse(process.env.WHITE_LIST_SRC || '[]') -} catch (e) { - console.warn(`parsing WHITE_LIST_SRC error ${process.env.WHITE_LIST_SRC}`, e) - WHITE_LIST_SRC = [] -} - -try { - SCRIPT_SRC = JSON.parse(process.env.SCRIPT_SRC || '[]') -} catch (e) { - console.warn(`parsing SCRIPT_SRC error ${process.env.SCRIPT_SRC}`, e) - SCRIPT_SRC = [] -} - -try { - CSP_CONNECT_SRC = JSON.parse(process.env.CSP_CONNECT_SRC || '[]') -} catch (e) { - console.warn(`parsing CSP_CONNECT_SRC error ${process.env.CSP_CONNECT_SRC}`, e) - CSP_CONNECT_SRC = [] -} - -const defaultAllowedSites = [ - "'self'", - 'stats.humanbrainproject.eu', - 'stats-dev.humanbrainproject.eu' -] - -const connectSrc = [ - "'self'", - - // needed by ad hoc generation of URL resources - "blob:", - - // siibra-api endpoints - 'siibra-api-latest.apps-dev.hbp.eu', - 'siibra-api-rc.apps.hbp.eu', - 'siibra-api-stable.apps.hbp.eu', - 'siibra-api-ns.apps.hbp.eu', - 'siibra-api-stable.apps.jsc.hbp.eu', - - // chunk servers - 'neuroglancer.humanbrainproject.org', - 'neuroglancer.humanbrainproject.eu', - '1um.brainatlas.eu', - 'object.cscs.ch', - - // required for dataset previews - - // spatial transform - "hbp-spatial-backend.apps.hbp.eu", - - // injected by env var - ...CSP_CONNECT_SRC -] - -module.exports = { - middelware: (req, res, next) => { - - const permittedCsp = (req.session && req.session.permittedCsp) || {} - const userConnectSrc = [] - const userScriptSrc = [] - for (const key in permittedCsp) { - userConnectSrc.push( - ...(permittedCsp[key]['connect-src'] || []), - ...(permittedCsp[key]['connectSrc'] || []) - ) - userScriptSrc.push( - ...(permittedCsp[key]['script-src'] || []), - ...(permittedCsp[key]['scriptSrc'] || []) - ) - } - csp({ - directives: { - defaultSrc: [ - ...defaultAllowedSites, - ...WHITE_LIST_SRC - ], - styleSrc: [ - ...defaultAllowedSites, - 'stackpath.bootstrapcdn.com/bootstrap/4.3.1/', - 'use.fontawesome.com/releases/v5.8.1/', - "'unsafe-inline'", // required for angular [style.xxx] bindings - ...WHITE_LIST_SRC - ], - fontSrc: [ - "'self'", - 'use.fontawesome.com/releases/v5.8.1/', - ...WHITE_LIST_SRC - ], - connectSrc: [ - ...userConnectSrc, - ...defaultAllowedSites, - ...connectSrc, - ...WHITE_LIST_SRC - ], - imgSrc: [ - "'self'", - ], - scriptSrc:[ - "'self'", - ...userScriptSrc, - 'unpkg.com/kg-dataset-previewer@1.2.0/', // preview component - 'https://unpkg.com/d3@6.2.0/', // required for preview component - "https://cdn.plot.ly/", // required for plotly - 'https://unpkg.com/mathjax@3.1.2/', // math jax - 'https://unpkg.com/three-surfer@0.0.13/dist/bundle.js', // for threeSurfer (freesurfer support in browser) - 'https://unpkg.com/ng-layer-tune@0.0.21/dist/ng-layer-tune/', // needed for ng layer control - 'https://unpkg.com/hbp-connectivity-component@0.6.6/', // needed for connectivity component - (req, res) => res.locals.nonce ? `'nonce-${res.locals.nonce}'` : null, - ...SCRIPT_SRC, - ...WHITE_LIST_SRC, - ...defaultAllowedSites - ], - frameSrc: [ - "*" - ], - reportUri: CSP_REPORT_URI || '/report-violation' - }, - reportOnly - })(req, res, next) - - }, - bootstrapReportViolation: app => { - app.post('/report-violation', bodyParser.json({ - type: ['json', 'application/csp-report'] - }), (req, res) => { - if (req.body) { - console.warn(`CSP Violation: `, req.body) - } else { - console.warn(`CSP Violation: no data received!`) - } - res.status(204).end() - }) - } -} diff --git a/deploy/csp/index.spec.js b/deploy/csp/index.spec.js deleted file mode 100644 index 93a478e25..000000000 --- a/deploy/csp/index.spec.js +++ /dev/null @@ -1,109 +0,0 @@ -const express = require('express') -const app = express() -const { middelware: cspMiddleware } = require('./index') -const got = require('got') -const { expect, assert } = require('chai') - -const checkBaseFn = async (rules = []) => { - - const resp = await got(`http://localhost:1234/`) - const stringifiedHeader = JSON.stringify(resp.headers) - - /** - * expect stats.humanbrainproject.eu and neuroglancer.humanbrainproject.eu to be present - */ - assert( - /stats\.humanbrainproject\.eu/.test(stringifiedHeader), - 'stats.humanbrainproject.eu present in header' - ) - - assert( - /neuroglancer\.humanbrainproject\.eu/.test(stringifiedHeader), - 'neuroglancer.humanbrainproject.eu present in header' - ) - - assert( - /content-security-policy/.test(stringifiedHeader), - 'content-security-policy present in header' - ) - - for (const rule of rules) { - assert( - rule.test(stringifiedHeader), - `${rule.toString()} present in header` - ) - } -} - -describe('> csp/index.js', () => { - let server, permittedCsp - const middleware = (req, res, next) => { - if (!!permittedCsp) { - req.session = { permittedCsp } - } - next() - } - before(done => { - app.use(middleware) - app.use(cspMiddleware) - app.get('/', (req, res) => { - res.status(200).send('OK') - }) - server = app.listen(1234, () => console.log(`app listening`)) - setTimeout(() => { - done() - }, 1000); - }) - - it('> should work when session is unset', async () => { - await checkBaseFn() - }) - - describe('> if session and permittedCsp are both set', () => { - describe('> if permittedCsp is malformed', () => { - describe('> if permittedCsp is set to string', () => { - before(() => { - permittedCsp = 'hello world' - }) - it('> base csp should work', async () => { - await checkBaseFn() - }) - }) - - describe('> if permittedCsp is number', () => { - before(() => { - permittedCsp = 420 - }) - it('> base csp should work', async () => { - await checkBaseFn() - }) - }) - }) - - describe('> if premittedCsp defines', () => { - - before(() => { - permittedCsp = { - 'foo-bar': { - 'connect-src': [ - 'connect.int.dev' - ], - 'script-src': [ - 'script.int.dev' - ] - } - } - }) - - it('> csp should include permittedCsp should work', async () => { - await checkBaseFn([ - /connect\.int\.dev/, - /script\.int\.dev/, - ]) - }) - }) - }) - after(done => { - server.close(done) - }) -}) \ No newline at end of file diff --git a/deploy/devBanner/index.js b/deploy/devBanner/index.js deleted file mode 100644 index c7ca44241..000000000 --- a/deploy/devBanner/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const express = require('express') -const router = express.Router() - -console.log(`BUILD_TEXT: ${process.env.BUILD_TEXT}`) - -/** - * build flag - */ -const BUILD_TEXT = process.env.BUILD_TEXT || '' -const versionCss = ` /* overwritten */ -body::after -{ - content: '${BUILD_TEXT}'; -} -` -const buildTextIsDefined = typeof process.env.BUILD_TEXT !== 'undefined' - -/** - * bypass if env var not defined - * i.e. in order to show nothing, must EXPLICITLY set envvar BUILD_TEXT as empty string - */ -router.get('/version.css', (req, res, next) => { - console.log(`runtime BUILD_TEXT: ${process.env.BUILD_TEXT}`) - if (!buildTextIsDefined) return next() - res.setHeader('Content-Type', 'text/css; charset=UTF-8') - res.status(200).send(versionCss) -}) - -module.exports = router \ No newline at end of file diff --git a/deploy/logging/index.js b/deploy/logging/index.js deleted file mode 100644 index a92365d60..000000000 --- a/deploy/logging/index.js +++ /dev/null @@ -1,35 +0,0 @@ -const got = require('got') -const qs = require('querystring') - -class Logger { - constructor(name, { protocol = 'http', host = 'localhost', port = '24224', username = '', password = '' } = {}){ - this.name = qs.escape(name) - this.protocol = protocol - this.host = host - this.port = port - this.username = username - this.password = password - } - - async emit(logLevel, message, callback){ - const { - name, - protocol, - host, - port, - username, - password - } = this - - const auth = username !== '' ? `${username}:${password}@` : '' - const url = `${protocol}://${auth}${host}:${port}/${name}.${qs.escape(logLevel)}` - const formData = { - json: JSON.stringify(message) - } - await got.post(url, { - formData - }) - } -} - -module.exports = Logger \ No newline at end of file diff --git a/deploy/lruStore/index.js b/deploy/lruStore/index.js deleted file mode 100644 index 474f23d5e..000000000 --- a/deploy/lruStore/index.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Cache to allow for in memory response while data fetching/processing occur - */ - -const { - REDIS_PROTO, - REDIS_ADDR, - REDIS_PORT, - - REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PROTO, - REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_ADDR, - REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PORT, - - REDIS_USERNAME, - REDIS_PASSWORD, - -} = process.env - -const redisProto = REDIS_PROTO || REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PROTO || 'redis' -const redisAddr = REDIS_ADDR || REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_ADDR || null -const redisPort = REDIS_PORT || REDIS_RATE_LIMITING_DB_EPHEMERAL_PORT_6379_TCP_PORT || 6379 - -const userPass = (() => { - let returnString = '' - if (REDIS_USERNAME) { - returnString += REDIS_USERNAME - } - if (REDIS_PASSWORD) { - returnString += `:${REDIS_PASSWORD}` - } - return returnString === '' - ? '' - : `${returnString}@` -})() - -const _redisURL = redisAddr && `${redisProto || ''}://${userPass}${redisAddr}:${redisPort}` - -const crypto = require('crypto') - -let authKey - -const getAuthKey = () => { - crypto.randomBytes(128, (err, buf) => { - if (err) { - console.error(`generating random bytes error`, err) - return - } - authKey = buf.toString('base64') - console.log(`clear store key: ${authKey}`) - }) -} - -getAuthKey() - -const ensureString = val => { - if (typeof val !== 'string') throw new Error(`both key and val must be string`) -} - -class ExportObj { - constructor(){ - this.StoreType = null - this.redisURL = null - this.store = null - this._rs = null - this._rj = null - - this._initPr = new Promise((rs, rj) => { - this._rs = rs - this._rj = rj - }) - } -} - -const exportObj = new ExportObj() - -const setupLru = () => { - - const LRU = require('lru-cache') - const lruStore = new LRU({ - max: 1024 * 1024 * 1024, // 1gb - length: (n, key) => n.length, - maxAge: Infinity, // never expires - }) - - exportObj.store = { - /** - * maxage in milli seconds - */ - set: async (key, val, { maxAge } = {}) => { - ensureString(key) - ensureString(val) - lruStore.set(key, val, ...( maxAge ? [ maxAge ] : [] )) - }, - get: async (key) => { - ensureString(key) - return lruStore.get(key) - }, - clear: async auth => { - if (auth !== authKey) { - getAuthKey() - throw new Error(`unauthorized`) - } - lruStore.reset() - } - } - - exportObj.StoreType = `lru-cache` - console.log(`using lru-cache`) - exportObj._rs() -} - -if (_redisURL) { - const redis = require('redis') - const { promisify } = require('util') - const client = redis.createClient({ - url: _redisURL - }) - - client.on('ready', () => { - - const asyncGet = promisify(client.get).bind(client) - const asyncSet = promisify(client.set).bind(client) - const asyncDel = promisify(client.del).bind(client) - - const keys = [] - - /** - * maxage in milli seconds - */ - exportObj.store = { - set: async (key, val, { maxAge } = {}) => { - ensureString(key) - ensureString(val) - asyncSet(key, val, ...( maxAge ? [ 'PX', maxAge ] : [] )) - keys.push(key) - }, - get: async (key) => { - ensureString(key) - return asyncGet(key) - }, - clear: async auth => { - if (auth !== authKey) { - getAuthKey() - throw new Error(`unauthorized`) - } - await asyncDel(keys.splice(0)) - } - } - - exportObj.StoreType = `redis` - exportObj.redisURL = _redisURL - console.log(`using redis`) - exportObj._rs() - }).on('error', () => { - console.warn(`setting up Redis error, fallback to setupLru`) - setupLru() - client.quit() - }) - -} else { - setupLru() -} - -module.exports = exportObj \ No newline at end of file diff --git a/deploy/package-lock.json b/deploy/package-lock.json deleted file mode 100644 index 56645a229..000000000 --- a/deploy/package-lock.json +++ /dev/null @@ -1,5133 +0,0 @@ -{ - "name": "deploy", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "deploy", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "body-parser": "^1.19.0", - "connect-redis": "^5.0.0", - "cookie-parser": "^1.4.5", - "express": "^4.16.4", - "express-rate-limit": "^5.5.1", - "express-session": "^1.15.6", - "got": "^11.8.5", - "hbp-seafile": "^0.3.0", - "helmet-csp": "^3.4.0", - "lru-cache": "^5.1.1", - "memorystore": "^1.6.1", - "nomiseco": "0.0.2", - "openid-client": "^4.4.0", - "passport": "^0.6.0", - "rate-limit-redis": "^2.1.0", - "redis": "^3.1.2", - "showdown": "^2.0.0", - "through2": "^3.0.1" - }, - "devDependencies": { - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "cookie": "^0.4.0", - "cors": "^2.8.5", - "dotenv": "^6.2.0", - "mocha": "^10.1.0", - "nock": "^12.0.3", - "sinon": "^8.0.2" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/formatio": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz", - "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^4.2.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.1.tgz", - "integrity": "sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/got": { - "version": "9.6.12", - "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz", - "integrity": "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/got/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect-redis": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-5.1.0.tgz", - "integrity": "sha512-Cosy8gGUdkBPEYG84svgkzIGzspKBb98NUX4Nfc5eTJOF0A++41ZV15rPwWW0n5nU/FusNgNzuMeXhLVEQF80Q==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", - "dependencies": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-rate-limit": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz", - "integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==" - }, - "node_modules/express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", - "dependencies": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "on-headers": "~1.0.1", - "parseurl": "~1.3.2", - "uid-safe": "~2.1.5", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/got/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/got/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hbp-seafile": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/hbp-seafile/-/hbp-seafile-0.3.0.tgz", - "integrity": "sha512-IEuQInjQbq0xUdULHsySTtfrbcIcZjCsPbw3SZMAE8gDqZwYvKevZQmvUT4KvbtC4inoA/aLASVXw4b1wZXQmQ==", - "dependencies": { - "@types/got": "^9.6.12", - "got": "^12.6.0" - } - }, - "node_modules/hbp-seafile/node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/hbp-seafile/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/hbp-seafile/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hbp-seafile/node_modules/got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/hbp-seafile/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/hbp-seafile/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hbp-seafile/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/hbp-seafile/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/helmet-csp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-3.4.0.tgz", - "integrity": "sha512-a+YgzWw6dajqhQfb6ktxil0FsQuWTKzrLSUfy55dxS8fuvl1jidTIMPZ2udN15mjjcpBPgTHNHGF5tyWKYyR8w==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memorystore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.1.tgz", - "integrity": "sha512-rYRjVukgBR9sptGI3IfpAjZc4SkupddhAenUhPTGprnqM8Qh863PxfXxXWlfvHpMIAkJCok28Bm7ZlOKB4U+MA==", - "dependencies": { - "debug": "3.1.0", - "lru-cache": "^4.0.3" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/memorystore/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/memorystore/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/memorystore/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nise": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.1.tgz", - "integrity": "sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/nock": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", - "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.13", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">= 10.13" - } - }, - "node_modules/nock/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nock/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nomiseco": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nomiseco/-/nomiseco-0.0.2.tgz", - "integrity": "sha512-p+Tj/ylnWVEY/YUQ7wMJlxWBXY7wmR72VOhAEEhftcfzQH/jF5vG8S9cimK1G85qehGXIFYG8a24CUk3C1Ukbw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", - "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openid-client": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.6.0.tgz", - "integrity": "sha512-MzXjC83Lzh3GuYVHsBaUCcIjZ1bGYHlYSK1rfCLCtBMZn5GBq++b83x4Blcg3kpAI1QveRGNMIRYBq6OP1uiKg==", - "dependencies": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.4", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "engines": { - "node": "^10.19.0 || >=12.0.0 < 13 || >=13.7.0 < 14 || >= 14.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/openid-client/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/openid-client/node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/openid-client/node_modules/got/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/openid-client/node_modules/got/node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/openid-client/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openid-client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rate-limit-redis": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rate-limit-redis/-/rate-limit-redis-2.1.0.tgz", - "integrity": "sha512-6SAsTCzY0v6UCIKLOLLYqR2XzFmgdtF7jWXlSPq2FrNIZk8tZ7xwBvyGW7GFMCe5I4S9lYNdrSJ9E84rz3/CpA==", - "dependencies": { - "defaults": "^1.0.3", - "redis": "^3.0.2" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/showdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.0.0.tgz", - "integrity": "sha512-Gz0wkh/EBFbEH+Nb85nyRSrcRvPecgt8c6fk/ICaOQ2dVsWCvZU5jfViPtBIyLXVYooICO0WTl7vLsoPaIH09w==", - "dependencies": { - "yargs": "^17.2.1" - }, - "bin": { - "showdown": "bin/showdown.js" - } - }, - "node_modules/showdown/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/showdown/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sinon": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.2.tgz", - "integrity": "sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/samsam": "^4.2.1", - "diff": "^4.0.1", - "lolex": "^5.1.2", - "nise": "^3.0.1", - "supports-color": "^7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dependencies": { - "readable-stream": "2 || 3" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz", - "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^4.2.0" - } - }, - "@sinonjs/samsam": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.1.tgz", - "integrity": "sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/got": { - "version": "9.6.12", - "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz", - "integrity": "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==", - "requires": { - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - }, - "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" - }, - "cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "requires": { - "lowercase-keys": "^3.0.0" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect-redis": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-5.1.0.tgz", - "integrity": "sha512-Cosy8gGUdkBPEYG84svgkzIGzspKBb98NUX4Nfc5eTJOF0A++41ZV15rPwWW0n5nU/FusNgNzuMeXhLVEQF80Q==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", - "requires": { - "cookie": "0.4.0", - "cookie-signature": "1.0.6" - }, - "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - } - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "express-rate-limit": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz", - "integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==" - }, - "express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "on-headers": "~1.0.1", - "parseurl": "~1.3.2", - "uid-safe": "~2.1.5", - "utils-merge": "1.0.1" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==" - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hbp-seafile": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/hbp-seafile/-/hbp-seafile-0.3.0.tgz", - "integrity": "sha512-IEuQInjQbq0xUdULHsySTtfrbcIcZjCsPbw3SZMAE8gDqZwYvKevZQmvUT4KvbtC4inoA/aLASVXw4b1wZXQmQ==", - "requires": { - "@types/got": "^9.6.12", - "got": "^12.6.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==" - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "requires": { - "lowercase-keys": "^3.0.0" - } - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "helmet-csp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-3.4.0.tgz", - "integrity": "sha512-a+YgzWw6dajqhQfb6ktxil0FsQuWTKzrLSUfy55dxS8fuvl1jidTIMPZ2udN15mjjcpBPgTHNHGF5tyWKYyR8w==" - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", - "requires": { - "@panva/asn1.js": "^1.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memorystore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.1.tgz", - "integrity": "sha512-rYRjVukgBR9sptGI3IfpAjZc4SkupddhAenUhPTGprnqM8Qh863PxfXxXWlfvHpMIAkJCok28Bm7ZlOKB4U+MA==", - "requires": { - "debug": "3.1.0", - "lru-cache": "^4.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - } - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "nise": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.1.tgz", - "integrity": "sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "nock": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", - "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.13", - "propagate": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "nomiseco": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nomiseco/-/nomiseco-0.0.2.tgz", - "integrity": "sha512-p+Tj/ylnWVEY/YUQ7wMJlxWBXY7wmR72VOhAEEhftcfzQH/jF5vG8S9cimK1G85qehGXIFYG8a24CUk3C1Ukbw==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-hash": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", - "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "openid-client": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.6.0.tgz", - "integrity": "sha512-MzXjC83Lzh3GuYVHsBaUCcIjZ1bGYHlYSK1rfCLCtBMZn5GBq++b83x4Blcg3kpAI1QveRGNMIRYBq6OP1uiKg==", - "requires": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.4", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "rate-limit-redis": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rate-limit-redis/-/rate-limit-redis-2.1.0.tgz", - "integrity": "sha512-6SAsTCzY0v6UCIKLOLLYqR2XzFmgdtF7jWXlSPq2FrNIZk8tZ7xwBvyGW7GFMCe5I4S9lYNdrSJ9E84rz3/CpA==", - "requires": { - "defaults": "^1.0.3", - "redis": "^3.0.2" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "showdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.0.0.tgz", - "integrity": "sha512-Gz0wkh/EBFbEH+Nb85nyRSrcRvPecgt8c6fk/ICaOQ2dVsWCvZU5jfViPtBIyLXVYooICO0WTl7vLsoPaIH09w==", - "requires": { - "yargs": "^17.2.1" - }, - "dependencies": { - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" - } - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "sinon": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.2.tgz", - "integrity": "sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/samsam": "^4.2.1", - "diff": "^4.0.1", - "lolex": "^5.1.2", - "nise": "^3.0.1", - "supports-color": "^7.1.0" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "requires": { - "readable-stream": "2 || 3" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/deploy/package.json b/deploy/package.json deleted file mode 100644 index d423c8404..000000000 --- a/deploy/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "deploy", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node server.js", - "test": "node -r dotenv/config ./node_modules/.bin/mocha './**/*.spec.js' --exclude 'node_modules/*' --timeout 60000 --exit", - "mocha": "mocha" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "body-parser": "^1.19.0", - "connect-redis": "^5.0.0", - "cookie-parser": "^1.4.5", - "express": "^4.16.4", - "express-rate-limit": "^5.5.1", - "express-session": "^1.15.6", - "got": "^11.8.5", - "hbp-seafile": "^0.3.0", - "helmet-csp": "^3.4.0", - "lru-cache": "^5.1.1", - "memorystore": "^1.6.1", - "nomiseco": "0.0.2", - "openid-client": "^4.4.0", - "passport": "^0.6.0", - "rate-limit-redis": "^2.1.0", - "redis": "^3.1.2", - "showdown": "^2.0.0", - "through2": "^3.0.1" - }, - "devDependencies": { - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "cookie": "^0.4.0", - "cors": "^2.8.5", - "dotenv": "^6.2.0", - "mocha": "^10.1.0", - "nock": "^12.0.3", - "sinon": "^8.0.2" - } -} diff --git a/deploy/plugins/index.js b/deploy/plugins/index.js deleted file mode 100644 index 028a0158d..000000000 --- a/deploy/plugins/index.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * TODO - * how to discover plugins? - */ - -const express = require('express') -const lruStore = require('../lruStore') -const { race } = require("../../common/util") -const got = require('got') -const { URL } = require('url') -const path = require("path") -const router = express.Router() -const V2_7_DEV_PLUGINS = (() => { - try { - return JSON.parse( - process.env.V2_7_DEV_PLUGINS || `[]` - ) - } catch (e) { - console.warn(`Parsing DEV_PLUGINS failed: ${e}`) - return [] - } -})() -const V2_7_PLUGIN_URLS = (process.env.V2_7_PLUGIN_URLS && process.env.V2_7_PLUGIN_URLS.split(';')) || [] -const V2_7_STAGING_PLUGIN_URLS = (process.env.V2_7_STAGING_PLUGIN_URLS && process.env.V2_7_STAGING_PLUGIN_URLS.split(';')) || [] - -router.get('', (_req, res) => { - return res.status(200).json([ - ...V2_7_PLUGIN_URLS, - ...V2_7_STAGING_PLUGIN_URLS - ]) -}) - -const getKey = url => `plugin:manifest-cache:${url}` - -router.get('/manifests', async (_req, res) => { - - const allManifests = await Promise.all( - [...V2_7_PLUGIN_URLS, ...V2_7_STAGING_PLUGIN_URLS].map(async url => { - try { - return await race( - async () => { - const key = getKey(url) - - await lruStore._initPr - const { store } = lruStore - - try { - const storedManifest = await store.get(key) - if (storedManifest) return JSON.parse(storedManifest) - else throw `not found` - } catch (e) { - const resp = await got(url) - const json = JSON.parse(resp.body) - - const { iframeUrl, 'siibra-explorer': flag } = json - if (!flag) return null - if (!iframeUrl) return null - const u = new URL(url) - - let replaceObj = {} - if (!/^https?:\/\//.test(iframeUrl)) { - u.pathname = path.resolve(path.dirname(u.pathname), iframeUrl) - replaceObj['iframeUrl'] = u.toString() - } - const returnObj = {...json, ...replaceObj} - await store.set(key, JSON.stringify(returnObj), { maxAge: 1000 * 60 * 60 }) - return returnObj - } - }, - { timeout: 1000 } - ) - } catch (e) { - console.error(`fetching manifest error: ${e}`) - return null - } - }) - ) - - res.status(200).json( - [...V2_7_DEV_PLUGINS, ...allManifests.filter(v => !!v)] - ) -}) - -module.exports = router \ No newline at end of file diff --git a/deploy/quickstart/index.js b/deploy/quickstart/index.js deleted file mode 100644 index efe8aa944..000000000 --- a/deploy/quickstart/index.js +++ /dev/null @@ -1,58 +0,0 @@ -const fs = require('fs') -const { promisify } = require('util') -const path = require('path') -const router = require('express').Router() -const showdown = require('showdown') - -const { retry } = require('../../common/util') -const asyncReadfile = promisify(fs.readFile) -const mdConverter = new showdown.Converter({ - tables: true -}) - -let renderedHtml = `` -const getQuickStartMdPr = (async () => { - await retry(async () => { - const mdData = await asyncReadfile( - path.resolve(__dirname, '../../common/helpOnePager.md'), - 'utf-8' - ) - - renderedHtml = ` -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> - <script src="https://unpkg.com/dompurify@latest/dist/purify.min.js"></script> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Siibra Explorer Quickstart</title> - <style> - .padded { padding: 1.5rem; } - </style> -</head> -<body class="padded"> - -</body> -<script> -(() => { - const dirty = \`${mdConverter.makeHtml(mdData).replace(/\`/g, '\\`')}\` - const clean = DOMPurify.sanitize(dirty) - document.body.innerHTML = clean -})() -</script> -</html> -` - }, { - retries: 3, - timeout: 1000 - }) -})() - - -router.get('', async (_req, res) => { - await getQuickStartMdPr - res.status(200).send(renderedHtml) -}) - -module.exports = router diff --git a/deploy/saneUrl/depcObjStore.js b/deploy/saneUrl/depcObjStore.js deleted file mode 100644 index f6c3d3e7a..000000000 --- a/deploy/saneUrl/depcObjStore.js +++ /dev/null @@ -1,26 +0,0 @@ -const got = require('got') -const { NotFoundError } = require('./store') - -const { OBJ_STORAGE_ROOT_URL } = process.env - -class Store { - - get(id) { - if (!OBJ_STORAGE_ROOT_URL){ - return Promise.reject( - new NotFoundError() - ) - } - return got(`${OBJ_STORAGE_ROOT_URL}/${id}`).text() - } - - async del(id){ - // noop - } - - async set(id, val){ - throw new Error(`Object store is deprecated. Please use seafile storage instead`) - } -} - -exports.Store = Store diff --git a/deploy/saneUrl/index.js b/deploy/saneUrl/index.js deleted file mode 100644 index 582113e0c..000000000 --- a/deploy/saneUrl/index.js +++ /dev/null @@ -1,134 +0,0 @@ -const express = require('express') -const router = express.Router() -const { GitlabSnippetStore: Store, NotFoundError } = require('./store') -const { Store: DepcStore } = require('./depcObjStore') -const RateLimit = require('express-rate-limit') -const RedisStore = require('rate-limit-redis') -const lruStore = require('../lruStore') -const { ProxyStore, NotExactlyPromiseAny } = require('./util') - -let store -try { - store = new Store() -} catch (e) { - console.error(`Failed to new store.`, e) -} -const depStore = new DepcStore() - -const proxyStore = new ProxyStore(store) - -const { - HOSTNAME, - HOST_PATHNAME, - DISABLE_LIMITER, -} = process.env - -function limiterMiddleware(){ - let limiter - return async (req, res, next) => { - if (DISABLE_LIMITER) return next() - if (limiter) return limiter(req, res, next) - await lruStore._initPr - const { redisURL } = lruStore - limiter = new RateLimit({ - windowMs: 1e3 * 5, - max: 5, - store: redisURL ? new RedisStore({ redisURL }) : null - }) - return limiter(req, res, next) - } -} - - -const acceptHtmlProg = /text\/html/i - -const REAL_HOSTNAME = `${HOSTNAME}${HOST_PATHNAME || ''}/` - -router.get('/:name', async (req, res) => { - const { name } = req.params - const { headers } = req - - const redirectFlag = acceptHtmlProg.test(headers['accept']) - - try { - - const json = await NotExactlyPromiseAny([ - ProxyStore.StaticGet(depStore, req, name), - proxyStore.get(req, name) - ]) - - const { queryString, hashPath, ...rest } = json - - const xtraRoutes = [] - for (const key in rest) { - if (/^x-/.test(key)) xtraRoutes.push(`${key}:${name}`) - } - - if (redirectFlag) { - if (queryString) return res.redirect(`${REAL_HOSTNAME}?${queryString}`) - if (hashPath) { - let redirectUrl = `${REAL_HOSTNAME}#${hashPath}` - if (xtraRoutes.length > 0) { - redirectUrl += `/${xtraRoutes.join('/')}` - } - return res.redirect(redirectUrl) - } - } else { - return res.status(200).send(json) - } - } catch (e) { - const notFoundFlag = e instanceof NotFoundError - if (redirectFlag) { - - const REAL_HOSTNAME = `${HOSTNAME}${HOST_PATHNAME || ''}/` - - res.cookie( - 'iav-error', - notFoundFlag ? `${name} - - not found` : `error while fetching ${name}.`, - { - httpOnly: true, - sameSite: "strict", - maxAge: 1e3 * 30 - } - ) - return res.redirect(REAL_HOSTNAME) - } - if (notFoundFlag) return res.status(404).end() - else return res.status(500).send(e.toString()) - } -}) - -router.post('/:name', - limiterMiddleware(), - express.json(), - async (req, res) => { - if (/bot/i.test(req.headers['user-agent'])) return res.status(201).end() - if (req.headers['x-noop']) return res.status(201).end() - const { name } = req.params - try { - await proxyStore.set(req, name, req.body) - res.status(201).end() - } catch (e) { - console.log(e.body) - res.status(500).send(e.toString()) - } - } -) - -router.use((_, res) => { - res.status(405).send('Not implemneted') -}) - -const ready = async () => { - return await store.healthCheck() -} - -const vipRoutes = ["human", "monkey", "rat", "mouse"] - -module.exports = { - router, - ready, - vipRoutes, -} diff --git a/deploy/saneUrl/index.spec.js b/deploy/saneUrl/index.spec.js deleted file mode 100644 index 3b9a66ec1..000000000 --- a/deploy/saneUrl/index.spec.js +++ /dev/null @@ -1,327 +0,0 @@ -const sinon = require('sinon') -const got = require('got') -const cookie = require('cookie') -const { expect } = require('chai') -const express = require('express') - -let NotFoundError -const userStore = require('../user/store') - -class StubStore { - async set(key, val) { - - } - async get(key) { - - } -} - -class StubNotFoundError extends Error{} - -const savedUserDataPayload = { - otherData: 'not relevant data', - savedCustomLinks: [ - '111222', - '333444' - ] -} - -const readUserDataStub = sinon - .stub(userStore, 'readUserData') - .returns(Promise.resolve(savedUserDataPayload)) - -const saveUserDataStub = sinon - .stub(userStore, 'saveUserData') - .returns(Promise.resolve()) - - -describe('> saneUrl/index.js', () => { - const name = `nameme`, - payload = { - ver: '0.0.1', - queryString: 'test_test' - } - - let DepObjStub, - depcGetStub, - SaneUrlStoreObjStub, - getStub, - setStub - - before(() => { - const SaneUrlStore = require('./store') - const DepcStore = require('./depcObjStore') - NotFoundError = SaneUrlStore.NotFoundError - - getStub = sinon.stub() - setStub = sinon.stub() - class StubbedStoreObj { - constructor(){ - this.get = getStub - this.set = setStub - } - } - depcGetStub = sinon.stub() - class DepcStubbedObj { - constructor() { - this.get = depcGetStub - } - } - DepObjStub = sinon.stub(DepcStore, 'Store').value(DepcStubbedObj) - SaneUrlStoreObjStub = sinon.stub(SaneUrlStore, 'Store').value(StubbedStoreObj) - }) - after(() => { - SaneUrlStoreObjStub.restore() - DepObjStub.restore() - }) - - beforeEach(() => { - depcGetStub.callsFake(async () => { - throw new NotFoundError() - }) - }) - - afterEach(() => { - depcGetStub.resetHistory() - depcGetStub.resetBehavior() - getStub.resetHistory() - getStub.resetBehavior() - setStub.resetHistory() - setStub.resetBehavior() - }) - - before(() => { - getStub = sinon.stub(StubStore.prototype, 'get') - setStub = sinon.stub(StubStore.prototype, 'set') - require.cache[require.resolve('../lruStore')] = { - exports: { - redisURL: null - } - } - - let server, user - before(() => { - const { router } = require('./index') - const app = express() - app.use('', (req, res, next) => { - req.user = user - next() - }, router) - - server = app.listen(50000) - }) - after(() => { - console.log('closing server') - - server.close() - }) - - describe('> works', () => { - - const body = { - ...payload - } - - beforeEach(() => { - setStub.returns(Promise.resolve()) - getStub.returns(Promise.resolve(JSON.stringify(body))) - }) - afterEach(() => { - setStub.resetHistory() - setStub.resetBehavior() - getStub.resetHistory() - getStub.resetBehavior() - }) - - it('> works', async () => { - const { body: respBody } = await got(`http://localhost:50000/${name}`) - expect(getStub.calledWith(name)).to.be.true - expect(respBody).to.equal(JSON.stringify(body)) - }) - }) - - describe('> expired', () => { - beforeEach(() => { - const body = { - ...payload, - expiry: Date.now() - 1e3 * 60 - } - - getStub.returns(Promise.resolve(JSON.stringify(body))) - }) - - it('> get on expired returns 404', async () => { - - const { statusCode } = await got(`http://localhost:50000/${name}`, { - throwHttpErrors: false - }) - expect(statusCode).to.equal(404) - expect(getStub.calledWith(name)).to.be.true - }) - it('> get on expired with txt html header sets cookie and redirect', async () => { - - const { statusCode, headers } = await got(`http://localhost:50000/${name}`, { - headers: { - 'accept': 'text/html' - }, - followRedirect: false - }) - expect(statusCode).to.be.greaterThan(300) - expect(statusCode).to.be.lessThan(303) - - expect(getStub.calledWith(name)).to.be.true - - const c = cookie.parse(...headers['set-cookie']) - expect(!!c['iav-error']).to.be.true - }) - }) - - describe('> set', () => { - - describe('> error', () => { - describe('> entry exists', () => { - beforeEach(() => { - getStub.returns(Promise.resolve('{}')) - }) - - it('> returns 409 conflict', async () => { - const { statusCode } = await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload), - throwHttpErrors: false - }) - - expect(statusCode).to.equal(409) - expect(getStub.called).to.be.true - expect(setStub.called).to.be.false - }) - }) - - describe('> other error', () => { - beforeEach(() => { - getStub.callsFake(async () => { - throw new Error(`other errors`) - }) - }) - it('> returns 500', async () => { - const { statusCode } = await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload), - throwHttpErrors: false - }) - - expect(statusCode).to.equal(500) - expect(getStub.called).to.be.true - expect(setStub.called).to.be.false - }) - }) - }) - - describe('> success', () => { - beforeEach(() => { - getStub.callsFake(async () => { - throw new NotFoundError() - }) - }) - it('> checks if the name is available', async () => { - await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload) - }) - - const [ storedName, _ ] = setStub.args[0] - - expect(storedName).to.equal(name) - expect(getStub.called).to.be.true - expect(setStub.called).to.be.true - }) - - describe('> anony user', () => { - beforeEach(() => { - user = null - }) - - it('> set with anonymous user has user undefined and expiry as defined', async () => { - - await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload) - }) - - expect(setStub.called).to.be.true - const [ _, storedContent] = setStub.args[0] - const { userId, expiry } = JSON.parse(storedContent) - expect(!!userId).to.be.false - expect(!!expiry).to.be.true - - // there will be some discrepencies, but the server lag should not exceed 5 seconds - expect( 1e3 * 60 * 60 * 72 - expiry + Date.now() ).to.be.lessThan(1e3 * 5) - }) - }) - - describe('> authenticated user', () => { - beforeEach(() => { - user = { - id: 'test/1', - name: 'hello world' - } - }) - it('> userId set, expiry unset', async () => { - - await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload) - }) - - expect(setStub.called).to.be.true - const [ _, storedContent] = setStub.args[0] - const { userId, expiry } = JSON.parse(storedContent) - expect(!!userId).to.be.true - expect(!!expiry).to.be.false - - expect( userId ).to.equal('test/1') - }) - it('> readUserDataset saveUserDataset data stubs called', async () => { - - await got(`http://localhost:50000/${name}`, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify(payload) - }) - - expect(readUserDataStub.called).to.be.true - expect(readUserDataStub.calledWith(user)).to.be.true - - expect(saveUserDataStub.called).to.be.true - expect(saveUserDataStub.calledWith(user, { - ...savedUserDataPayload, - savedCustomLinks: [ - ...savedUserDataPayload.savedCustomLinks, - name - ] - })).to.be.true - }) - }) - - }) - }) - }) -}) - diff --git a/deploy/saneUrl/store.js b/deploy/saneUrl/store.js deleted file mode 100644 index 39b39223a..000000000 --- a/deploy/saneUrl/store.js +++ /dev/null @@ -1,100 +0,0 @@ -const got = require('got') - -const apiPath = '/api/v4' -const saneUrlVer = `0.0.1` -const titlePrefix = `[saneUrl]` - -const { - __DEBUG__, - GITLAB_ENDPOINT, - GITLAB_PROJECT_ID, - GITLAB_TOKEN -} = process.env - -class NotFoundError extends Error{} - -class NotImplemented extends Error{} - -class GitlabSnippetStore { - constructor(){ - - if ( - GITLAB_ENDPOINT - && GITLAB_PROJECT_ID - && GITLAB_TOKEN - ) { - this.url = `${GITLAB_ENDPOINT}${apiPath}/projects/${GITLAB_PROJECT_ID}/snippets` - this.token = GITLAB_TOKEN - return - } - throw new NotImplemented('Gitlab snippet key value store cannot be configured') - } - - _promiseRequest(...arg) { - return got(...arg).text() - } - - _request({ addPath = '', method = 'GET', headers = {}, opt = {} } = {}) { - return got(`${this.url}${addPath}?per_page=1000`, { - method, - headers: { - 'PRIVATE-TOKEN': this.token, - ...headers - }, - ...opt - }).text() - } - - async get(id) { - const list = JSON.parse(await this._request()) - const found = list.find(item => item.title === `${titlePrefix}${id}`) - if (!found) throw new NotFoundError() - const payloadObj = found.files.find(f => f.path === 'payload') - if (!payloadObj) { - console.error(`id found, but payload not found... this is strange. Check id: ${id}`) - throw new NotFoundError() - } - if (!payloadObj.raw_url) { - throw new Error(`payloadObj.raw_url not found!`) - } - return await this._promiseRequest(payloadObj.raw_url) - } - - async set(id, value) { - return await this._request({ - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - opt: { - json: { - title: `${titlePrefix}${id}`, - description: `Created programmatically. v${saneUrlVer}`, - visibility: 'public', - files: [{ - file_path: 'payload', - content: value - }] - } - } - }) - } - - async del(id) { - return await this._request({ - addPath: `/${id}`, - method: 'DELETE', - }) - } - - async dispose(){ - - } - - async healthCheck(){ - return true - } -} - -exports.GitlabSnippetStore = GitlabSnippetStore -exports.NotFoundError = NotFoundError diff --git a/deploy/saneUrl/util.js b/deploy/saneUrl/util.js deleted file mode 100644 index 12fce0a38..000000000 --- a/deploy/saneUrl/util.js +++ /dev/null @@ -1,70 +0,0 @@ -const { NotFoundError } = require('./store') - -class ProxyStore { - static async StaticGet(store, req, name) { - if (!store) throw new Error(`store is falsy`) - const payload = JSON.parse(await store.get(name)) - const { expiry, value, ...rest } = payload - if (expiry && (Date.now() > expiry)) { - await store.del(name) - throw new NotFoundError('Expired') - } - // backwards compatibility for depcObjStore . - // when depcObjStore is fully removed, || rest can also be removed - return value || rest - } - - constructor(store){ - this.store = store - } - async get(req, name) { - return await ProxyStore.StaticGet(this.store, req, name) - } - - async set(req, name, value) { - if (!this.store) throw new Error(`store is falsy`) - const supplementary = req.user - ? { - userId: req.user.id, - expiry: null - } - : { - userId: null, - expiry: Date.now() + 1000 * 60 * 60 * 72 - } - - const fullPayload = { - value, - ...supplementary - } - return await this.store.set(name, JSON.stringify(fullPayload)) - } -} - -const NotExactlyPromiseAny = async arg => { - const errs = [] - let resolvedFlag = false - return await new Promise((rs, rj) => { - let totalCounter = 0 - for (const pr of arg) { - totalCounter ++ - pr.then(val => { - if (!resolvedFlag) { - resolvedFlag = true - rs(val) - } - }).catch(e => { - errs.push(e) - totalCounter -- - if (totalCounter <= 0) { - rj(new NotFoundError(errs)) - } - }) - } - }) -} - -module.exports = { - ProxyStore, - NotExactlyPromiseAny -} diff --git a/deploy/saneUrl/util.spec.js b/deploy/saneUrl/util.spec.js deleted file mode 100644 index f19d8cc92..000000000 --- a/deploy/saneUrl/util.spec.js +++ /dev/null @@ -1,206 +0,0 @@ -const { ProxyStore, NotExactlyPromiseAny } = require('./util') -const { expect, assert } = require('chai') -const sinon = require('sinon') -const { NotFoundError } = require('./store') - -const _name = 'foo-bar' -const _stringValue = 'hello world' -const _objValue = { - 'foo': 'bar' -} -const _req = {} - -describe('> saneUrl/util.js', () => { - describe('> ProxyStore', () => { - let store = { - set: sinon.stub(), - get: sinon.stub(), - del: sinon.stub(), - } - beforeEach(() => { - store.set.returns(Promise.resolve()) - store.get.returns(Promise.resolve('{}')) - store.del.returns(Promise.resolve()) - }) - afterEach(() => { - store.set.resetHistory() - store.get.resetHistory() - store.del.resetHistory() - }) - describe('> StaticGet', () => { - it('> should call store.get', () => { - ProxyStore.StaticGet(store, _req, _name) - assert(store.get.called, 'called') - assert(store.get.calledWith(_name), 'called with right param') - }) - describe('> if not hit', () => { - const err = new NotFoundError('not found') - beforeEach(() => { - store.get.rejects(err) - }) - it('should throw same error', async () => { - try{ - await ProxyStore.StaticGet(store, _req, _name) - assert(false, 'Should throw') - } catch (e) { - assert(e instanceof NotFoundError) - } - }) - }) - describe('> if hit', () => { - describe('> if expired', () => { - beforeEach(() => { - store.get.returns( - Promise.resolve( - JSON.stringify({ - expiry: Date.now() - 1000 - }) - ) - ) - }) - it('> should call store.del', async () => { - try { - await ProxyStore.StaticGet(store, _req, _name) - } catch (e) { - - } - assert(store.del.called, 'store.del should be called') - }) - it('> should throw NotFoundError', async () => { - try { - await ProxyStore.StaticGet(store, _req, _name) - assert(false, 'expect throw') - } catch (e) { - assert(e instanceof NotFoundError, 'throws NotFoundError') - } - }) - }) - describe('> if not expired', () => { - it('> should return .value, if exists', async () => { - store.get.returns( - Promise.resolve( - JSON.stringify({ - value: _objValue, - others: _stringValue - }) - ) - ) - const returnObj = await ProxyStore.StaticGet(store, _req, _name) - expect(returnObj).to.deep.equal(_objValue) - }) - it('> should return ...rest if .value does not exist', async () => { - store.get.returns( - Promise.resolve( - JSON.stringify({ - others: _stringValue - }) - ) - ) - const returnObj = await ProxyStore.StaticGet(store, _req, _name) - expect(returnObj).to.deep.equal({ - others: _stringValue - }) - }) - }) - }) - - }) - - describe('> get', () => { - let staticGetStub - beforeEach(() => { - staticGetStub = sinon.stub(ProxyStore, 'StaticGet') - staticGetStub.returns(Promise.resolve()) - }) - afterEach(() => { - staticGetStub.restore() - }) - it('> proxies calls to StaticGet', async () => { - const store = {} - const proxyStore = new ProxyStore(store) - await proxyStore.get(_req, _name) - assert(staticGetStub.called) - assert(staticGetStub.calledWith(store, _req, _name)) - }) - }) - - describe('> set', () => { - let proxyStore - beforeEach(() => { - proxyStore = new ProxyStore(store) - store.set.returns(Promise.resolve()) - }) - - describe('> no user', () => { - it('> sets expiry some time in the future', async () => { - await proxyStore.set(_req, _name, _objValue) - assert(store.set.called) - - const [ name, stringifiedJson ] = store.set.args[0] - assert(name === _name, 'name is correct') - const payload = JSON.parse(stringifiedJson) - expect(payload.value).to.deep.equal(_objValue, 'payload is correct') - assert(!!payload.expiry, 'expiry exists') - assert((payload.expiry - Date.now()) > 1000 * 60 * 60 * 24, 'expiry is at least 24 hrs in the future') - - assert(!payload.userId, 'userId does not exist') - }) - }) - describe('> yes user', () => { - let __req = { - ..._req, - user: { - id: 'foo-bar-2' - } - } - it('> does not set expiry, but sets userId', async () => { - await proxyStore.set(__req, _name, _objValue) - assert(store.set.called) - - const [ name, stringifiedJson ] = store.set.args[0] - assert(name === _name, 'name is correct') - const payload = JSON.parse(stringifiedJson) - expect(payload.value).to.deep.equal(_objValue, 'payload is correct') - assert(!payload.expiry, 'expiry does not exist') - - assert(payload.userId, 'userId exists') - assert(payload.userId === 'foo-bar-2', 'user-id matches') - }) - }) - }) - }) - - describe('> NotExactlyPromiseAny', () => { - describe('> nothing resolves', () => { - it('> throws not found error', async () => { - try { - await NotExactlyPromiseAny([ - (async () => { - throw new Error(`not here`) - })(), - new Promise((rs, rj) => setTimeout(rj, 100)), - new Promise((rs, rj) => rj('uhoh')) - ]) - assert(false, 'expected to throw') - } catch (e) { - assert(e instanceof NotFoundError, 'expect to throw not found error') - } - }) - }) - describe('> something resolves', () => { - it('> returns the first to resolve', async () => { - try { - - const result = await NotExactlyPromiseAny([ - new Promise((rs, rj) => rj('uhoh')), - new Promise(rs => setTimeout(() => rs('hello world'), 100)), - Promise.resolve('foo-bar') - ]) - assert(result == 'foo-bar', 'expecting first to resolve') - } catch (e) { - assert(false, 'not expecting to throw') - } - }) - }) - }) -}) diff --git a/deploy/server.js b/deploy/server.js deleted file mode 100644 index f628ffe75..000000000 --- a/deploy/server.js +++ /dev/null @@ -1,90 +0,0 @@ -if (process.env.NODE_ENV !== 'production') { - require('dotenv').config() - process.on('unhandledRejection', (err, p) => { - console.log({err, p}) - }) -} - -if (process.env.FLUENT_HOST) { - const Logger = require('./logging') - const os = require('os') - - const name = process.env.IAV_NAME || 'IAV' - const stage = os.hostname() || 'unknown-host' - - const protocol = process.env.FLUENT_PROTOCOL || 'http' - const host = process.env.FLUENT_HOST || 'localhost' - const port = process.env.FLUENT_PORT || 24224 - - const prefix = `${name}.${stage}` - - const log = new Logger(prefix, { - protocol, - host, - port - }) - - const handleRequestCallback = (err, resp, body) => { - if (err) { - process.stderr.write(`fluentD logging failed\n`) - process.stderr.write(err.toString()) - process.stderr.write('\n') - } - - if (resp && resp.statusCode >= 400) { - process.stderr.write(`fluentD logging responded error\n`) - process.stderr.write(resp.toString()) - process.stderr.write('\n') - } - } - - const emitInfo = message => log.emit('info', { message }, handleRequestCallback) - - const emitWarn = message => log.emit('warn', { message }, handleRequestCallback) - - const emitError = message => log.emit('error', { message }, handleRequestCallback) - - console.log('starting fluentd logging') - - console.log = function () { - emitInfo([...arguments]) - } - console.warn = function () { - emitWarn([...arguments]) - } - console.error = function () { - emitError([...arguments]) - } -} - -const server = require('express')() - -const PORT = process.env.PORT || 3000 - -// e.g. HOST_PATHNAME=/viewer -// n.b. leading slash is important -// n.b. no trailing slash is important -const HOST_PATHNAME = process.env.HOST_PATHNAME || '' - -if(HOST_PATHNAME !== '') { - if (HOST_PATHNAME.slice(0,1) !== '/') throw new Error(`HOST_PATHNAME, if defined and non-empty, should start with a leading slash. HOST_PATHNAME: ${HOST_PATHNAME}`) - if (HOST_PATHNAME.slice(-1) === '/') throw new Error(`HOST_PATHNAME, if defined and non-emtpy, should NOT end with a slash. HOST_PATHNAME: ${HOST_PATHNAME}`) -} - -server.set('strict routing', true) -server.set('trust proxy', 1) - -server.disable('x-powered-by') - -if (HOST_PATHNAME && HOST_PATHNAME !== '') { - server.get(HOST_PATHNAME, (_req, res) => { - res.redirect(`${HOST_PATHNAME}/`) - }) -} - -if (process.env.NODE_ENV !== 'test') { - const app = require('./app') - server.use(`${HOST_PATHNAME}/`, app) -} - -server.listen(PORT, () => console.log(`listening on port ${PORT}`)) diff --git a/deploy/server.spec.js b/deploy/server.spec.js deleted file mode 100644 index 6e8e36df8..000000000 --- a/deploy/server.spec.js +++ /dev/null @@ -1,112 +0,0 @@ -const { spawn } = require("child_process") -const { expect, assert } = require('chai') -const path = require('path') -const got = require('got') - -const PORT = process.env.PORT || 3000 - -describe('> server.js', () => { - const cwdPath = path.join(__dirname) - - describe('> HOST_PATHNAME env var parsed correctly', () => { - - it('> throws if HOST_PATHNAME does not start with a leading hash', done => { - const childProcess = spawn('node', ['server.js'], { - cwd: cwdPath, - env: { - ...process.env, - NODE_ENV: 'test', - HOST_PATHNAME: 'viewer' - } - }) - - const timedKillSig = setTimeout(() => { - childProcess.kill() - }, 500) - - childProcess.on('exit', (code) => { - childProcess.kill() - clearTimeout(timedKillSig) - expect(code).to.be.greaterThan(0) - done() - }) - }) - - it('> throws if HOST_PATHNAME ends with slash', done => { - - const childProcess = spawn('node', ['server.js'], { - cwd: cwdPath, - env: { - ...process.env, - NODE_ENV: 'test', - HOST_PATHNAME: '/viewer/' - } - }) - - const timedKillSig = setTimeout(() => { - childProcess.kill(0) - }, 500) - - childProcess.on('exit', (code) => { - clearTimeout(timedKillSig) - expect(code).to.be.greaterThan(0) - done() - }) - }) - - it('> does not throw if HOST_PATHNAME leads with slash, but does not end with slash', done => { - - const childProcess = spawn('node', ['server.js'], { - cwd: cwdPath, - stdio: 'inherit', - env: { - ...process.env, - NODE_ENV: 'test', - PORT, - HOST_PATHNAME: '/viewer' - } - }) - - const timedKillSig = setTimeout(() => { - console.log('killing on timeout') - childProcess.kill() - }, 500) - - childProcess.on('exit', (code, signal) => { - clearTimeout(timedKillSig) - expect(signal).to.equal('SIGTERM') - done() - }) - }) - }) - - - describe('> redirection', () => { - let childProcess - before(done => { - const cwdPath = path.join(__dirname) - childProcess = spawn('node', ['server.js'], { - cwd: cwdPath, - env: { - ...process.env, - NODE_ENV: 'test', - PORT, - HOST_PATHNAME: '/viewer' - } - }) - setTimeout(done, 1000) - }) - - it('> redirects as expected', async () => { - const { statusCode } = await got(`http://localhost:${PORT}/viewer`, { - followRedirect: false - }) - expect(statusCode).to.be.greaterThan(300) - expect(statusCode).to.be.lessThan(303) - }) - - after(() => { - childProcess.kill() - }) - }) -}) diff --git a/deploy/user/index.js b/deploy/user/index.js deleted file mode 100644 index dd8a0ab79..000000000 --- a/deploy/user/index.js +++ /dev/null @@ -1,86 +0,0 @@ -const express = require('express') -const bodyParser = require('body-parser') -const router = express.Router() -const { readUserData, saveUserData } = require('./store') - -const loggedInOnlyMiddleware = (req, res, next) => { - const { user } = req - if (!user) { - return res.status(200).json({ - error: true, - message: 'Not logged in' - }) - } - return next() -} - -router.get('', loggedInOnlyMiddleware, (req, res) => { - return res.status(200).send(JSON.stringify(req.user)) -}) - -router.get('/config', loggedInOnlyMiddleware, async (req, res) => { - const { user } = req - try{ - const data = await readUserData(user) - res.status(200).json(data) - } catch (e){ - console.error(e) - res.status(500).send(e.toString()) - } -}) - -router.get('/pluginPermissions', async (req, res) => { - const { user } = req - /** - * only using session to store user csp for now - * in future, if use is logged in, look for **signed** config file, and verify the signature - */ - const permittedCsp = req.session.permittedCsp || {} - res.status(200).json(permittedCsp) -}) - -router.post('/pluginPermissions', bodyParser.json(), async (req, res) => { - const { user, body } = req - /** - * only using session to store user csp for now - * in future, if use is logged in, **signed** config file, and store in user space - */ - - const newPermittedCsp = req.session.permittedCsp || {} - for (const key in body) { - newPermittedCsp[key] = body[key] - } - req.session.permittedCsp = newPermittedCsp - res.status(200).json({ ok: true }) -}) - -router.delete('/pluginPermissions/:pluginKey', async (req, res) => { - const { user, params } = req - const { pluginKey } = params - /** - * only using session to store user csp for now - * in future, if use is logged in, **signed** config file, and store in user space - */ - const newPermission = {} - const permittedCsp = req.session.permittedCsp || {} - for (const key in permittedCsp) { - if (pluginKey !== key) { - newPermission[key] = permittedCsp[key] - } - } - req.session.permittedCsp = newPermission - res.status(200).json({ ok: true }) -}) - -router.post('/config', loggedInOnlyMiddleware, bodyParser.json(), async (req, res) => { - const { user, body } = req - try { - await saveUserData(user, body) - res.status(200).end() - } catch (e) { - console.error(e) - res.status(500).send(e.toString()) - } -}) - -module.exports = router \ No newline at end of file diff --git a/deploy/user/index.spec.js b/deploy/user/index.spec.js deleted file mode 100644 index 73cb58bbd..000000000 --- a/deploy/user/index.spec.js +++ /dev/null @@ -1,245 +0,0 @@ -const router = require('./index') -const app = require('express')() -const sinon = require('sinon') -const { stub, spy } = require('sinon') -const { default: got } = require('got/dist/source') -const { expect, assert } = require('chai') - -const sessionObj = { - permittedCspVal: {}, - get permittedCsp(){ - return this.permittedCspVal - }, - set permittedCsp(val) { - - } -} - -let userObj = null - -const permittedCspSpy = spy(sessionObj, 'permittedCsp', ['get', 'set']) - -const middleware = (req, res, next) => { - req.session = sessionObj - req.user = userObj - next() -} - -describe('> user/index.js', () => { - let server - - before(done => { - app.use(middleware) - app.use(router) - server = app.listen(1234) - setTimeout(() => { - done() - }, 1000); - }) - - afterEach(() => { - permittedCspSpy.get.resetHistory() - permittedCspSpy.set.resetHistory() - sessionObj.permittedCspVal = {} - userObj = null - }) - - after(done => server.close(() => done())) - - describe('> GET ', () => { - describe('> user undefined', () => { - it('> should return 200, but error in resp', async () => { - const { body, statusCode } = await got.get('http://localhost:1234') - try { - assert( - statusCode < 400, - 'expect the response to be OK' - ) - const { error } = JSON.parse(body) - assert( - !!error, - 'expect error is truthy' - ) - } catch (e) { - assert( - false, - `expect no error, but got ${e.toString()}` - ) - } - }) - }) - - describe('> user defined', () => { - const user = { - foo: 'bar' - } - beforeEach(() => { - userObj = user - }) - it('> should return 200, and user obj in resp', async () => { - - const { body, statusCode } = await got.get('http://localhost:1234') - try { - assert( - statusCode < 400, - 'expect the response to be ok' - ) - const gotUser = JSON.parse(body) - expect( - gotUser - ).to.deep.equal(user) - } catch (e) { - assert( - false, - `expect no error, but got ${e.toString()}` - ) - } - }) - }) - }) - - describe('> GET /pluginPermissions', () => { - it('> getter called, setter not called', async () => { - await got.get('http://localhost:1234/pluginPermissions') - - assert( - permittedCspSpy.get.calledOnce, - `permittedCsp getter accessed once` - ) - - assert( - permittedCspSpy.set.notCalled, - `permittedCsp setter not called` - ) - }) - it('> if no value present, returns {}', async () => { - sessionObj.permittedCspVal = null - const { body } = await got.get('http://localhost:1234/pluginPermissions') - expect(JSON.parse(body)).to.deep.equal({}) - }) - - it('> if value present, return value', async () => { - const val = { - 'hot-dog': { - 'weatherman': 'tolerable' - } - } - sessionObj.permittedCspVal = val - - const { body } = await got.get('http://localhost:1234/pluginPermissions') - expect(JSON.parse(body)).to.deep.equal(val) - }) - }) - - describe('> POST /pluginPermissions', () => { - it('> getter called once, then setter called once', async () => { - const jsonPayload = { - 'hotdog-world': 420 - } - await got.post('http://localhost:1234/pluginPermissions', { - json: jsonPayload - }) - assert( - permittedCspSpy.get.calledOnce, - `permittedCsp getter called once` - ) - assert( - permittedCspSpy.set.calledOnce, - `permittedCsp setter called once` - ) - - assert( - permittedCspSpy.get.calledBefore(permittedCspSpy.set), - `getter called before setter` - ) - - assert( - permittedCspSpy.set.calledWith(jsonPayload), - `setter called with payload` - ) - }) - - it('> if sessio obj exists, will set with merged obj', async () => { - const prevVal = { - 'foo-bar': [ - 123, - 'fuzz-buzz' - ], - 'hot-dog-world': 'baz' - } - sessionObj.permittedCspVal = prevVal - - const jsonPayload = { - 'hot-dog-world': [ - 'fussball' - ] - } - - await got.post('http://localhost:1234/pluginPermissions', { - json: jsonPayload - }) - assert( - permittedCspSpy.set.calledWith({ - ...prevVal, - ...jsonPayload, - }), - 'setter called with merged payload' - ) - }) - }) - - describe('> DELETE /pluginPermissions/:pluginId', () => { - const prevVal = { - 'foo': 'bar', - 'buzz': 'lightyear' - } - beforeEach(() => { - sessionObj.permittedCspVal = prevVal - }) - - it('> getter and setter gets called once and in correct order', async () => { - - await got.delete(`http://localhost:1234/pluginPermissions/foolish`) - - assert( - permittedCspSpy.get.calledOnce, - 'getter called once' - ) - - assert( - permittedCspSpy.set.calledOnce, - 'setter called once' - ) - - assert( - permittedCspSpy.get.calledBefore(permittedCspSpy.set), - 'getter called before setter' - ) - }) - - it('> if attempts at delete non existent key, still returns ok', async () => { - - const { body } = await got.delete(`http://localhost:1234/pluginPermissions/foolish`) - const json = JSON.parse(body) - expect(json).to.deep.equal({ ok: true }) - - assert( - permittedCspSpy.set.calledWith(prevVal), - 'permittedCsp setter called with the prev value (nothing changed)' - ) - }) - - it('> if attempts at delete exisiting key, returns ok, and value is set', async () => { - - const { body } = await got.delete(`http://localhost:1234/pluginPermissions/foo`) - const json = JSON.parse(body) - expect(json).to.deep.equal({ ok: true }) - - const { foo, ...rest } = prevVal - assert( - permittedCspSpy.set.calledWith(rest), - 'permittedCsp setter called with the prev value, less the deleted key' - ) - }) - }) -}) \ No newline at end of file diff --git a/deploy/user/store.js b/deploy/user/store.js deleted file mode 100644 index 03f476279..000000000 --- a/deploy/user/store.js +++ /dev/null @@ -1,68 +0,0 @@ -const { Readable } = require('stream') - -const IAV_DIR_NAME = `interactive-atlas-viewer` -const IAV_DIRECTORY = `/${IAV_DIR_NAME}/` -const IAV_FILENAME = 'data.json' - -const getNewSeafilehandle = async ({ accessToken }) => { - const { Seafile } = await import("hbp-seafile") - const seafileHandle = new Seafile({ accessToken }) - await seafileHandle.init() - return seafileHandle -} - -const saveUserData = async (user, data) => { - const { access_token } = user && user.tokenset || {} - if (!access_token) throw new Error(`user or user.tokenset not set can only save logged in user data`) - - let handle = await getNewSeafilehandle({ accessToken: access_token }) - - const s = await handle.ls() - const found = s.find(({ type, name }) => type === 'dir' && name === IAV_DIR_NAME) - - // if dir exists, check permission. throw if no writable or readable permission - if (found && !/w/.test(found.permission) && !/r/.test(found.permission)){ - throw new Error(`Writing to file not permitted. Current permission: ${found.permission}`) - } - - // create new dir if does not exist. Should have rw permission - if (!found) { - await handle.mkdir({ dir: IAV_DIR_NAME }) - } - - const fileLs = await handle.ls({ dir: IAV_DIRECTORY }) - const fileFound = fileLs.find(({ type, name }) => type === 'file' && name === IAV_FILENAME ) - - const rStream = new Readable() - rStream.path = IAV_FILENAME - rStream.push(JSON.stringify(data)) - rStream.push(null) - - if(!fileFound) { - return handle.uploadFile({ readStream: rStream, filename: `${IAV_FILENAME}` }, { dir: IAV_DIRECTORY }) - } - - if (fileFound && !/w/.test(fileFound.permission)) { - return new Error('file permission cannot be written') - } - - return handle.updateFile({ dir: IAV_DIRECTORY, replaceFilepath: `${IAV_DIRECTORY}${IAV_FILENAME}` }, { readStream: rStream, filename: IAV_FILENAME }) -} - -const readUserData = async (user) => { - const { access_token } = user && user.tokenset || {} - if (!access_token) throw new Error(`user or user.tokenset not set can only save logged in user data`) - - let handle = await getNewSeafilehandle({ accessToken: access_token }) - try { - const r = await handle.readFile({ dir: `${IAV_DIRECTORY}${IAV_FILENAME}` }) - return JSON.parse(r) - }catch(e){ - return {} - } -} - -module.exports = { - saveUserData, - readUserData -} diff --git a/deploy/util/streamHandleError.js b/deploy/util/streamHandleError.js deleted file mode 100644 index bd24374e7..000000000 --- a/deploy/util/streamHandleError.js +++ /dev/null @@ -1,4 +0,0 @@ -exports.getHandleErrorFn = (req, res) => err => { - console.error('getHandleErrorFn', err) - res.status(501).send(err.toString()) -} \ No newline at end of file diff --git a/deploy_env.md b/deploy_env.md index 1926d4bb3..8c2b1a3d8 100644 --- a/deploy_env.md +++ b/deploy_env.md @@ -4,17 +4,12 @@ | name | description | default | example | | --- | --- | --- | --- | -| `PORT` | port to listen on | 3000 | -| `HOST_PATHNAME` | pathname to listen on, restrictions: leading slash, no trailing slash | `''` | `/viewer` | | `SESSIONSECRET` | session secret for cookie session | -| `NODE_ENV` | determines where the built viewer will be served from | | `production` | -| ~~`PRECOMPUTED_SERVER`~~ _deprecated_, use `LOCAL_CDN` instead. | redirect data uri to another server. Useful for offline demos | | `http://localhost:8080/precomputed/` | -| `LOCAL_CDN` | rewrite cdns to local server. useful for offlnie demo | | `http://localhost:7080/` | -| `PLUGIN_URLS` | semi colon separated urls to be returned when user queries plugins | `''` -| `STAGING_PLUGIN_URLS` | semi colon separated urls to be returned when user queries plugins | `''` -| `USE_LOGO` | possible values are `hbp`, `ebrains`, `fzj` | `hbp` | `ebrains` | -| `__DEBUG__` | debug flag | +| `V2_7_PLUGIN_URLS` | semi colon separated urls to be returned when user queries plugins | `''` +| `V2_7_STAGING_PLUGIN_URLS` | semi colon separated urls to be returned when user queries plugins | `''` | `BUILD_TEXT` | overlay text at bottom right of the viewer. set to `''` to hide. | | +| `OVERWRITE_API_ENDPOINT` | overwrite build time siibra-api endpoint | +| `PATH_TO_PUBLIC` | path to built frontend | `../dist/aot` | ##### ebrains user authentication @@ -22,45 +17,16 @@ | name | description | default | example | | --- | --- | --- | --- | | `HOSTNAME` | -| `HBP_CLIENTID` | `{HOSTNAME}{HOST_PATHNAME}/hbp-oidc/cb` | -| `HBP_CLIENTSECRET` | -| `HBP_CLIENTID_V2` | `{HOSTNAME}{HOST_PATHNAME}/hbp-oidc-v2/cb` +| `HOST_PATHNAME` | pathname to listen on, restrictions: leading slash, no trailing slash | `''` | `/viewer` | +| `HBP_CLIENTID_V2` | | `HBP_CLIENTSECRET_V2` | -##### Querying ebrains knowledge graph - -| name | description | default | example | -| --- | --- | --- | --- | -| `REFRESH_TOKEN` | -| `ACCESS_TOKEN` | **nb** as access tokens are usually short lived, this should only be set for development purposes -| `KG_ROOT` | | `https://kg.humanbrainproject.eu/query` | -| `KG_SEARCH_VOCAB` | | `https://schema.hbp.eu/myQuery/` | -| `KG_DATASET_SEARCH_QUERY_NAME` | | `interactiveViewerKgQuery-v0_3` | -| `KG_DATASET_SEARCH_PATH` | | `/minds/core/dataset/v1.0.0` | -| `KG_SEARCH_SIZE` | | `1000` | -| `KG_SPATIAL_DATASET_SEARCH_QUERY_NAME` | | `iav-spatial-query-v2` | -| `KG_SPATIAL_DATASET_SEARCH_PATH` | | `/neuroglancer/seeg/coordinate/v1.0.0` | ##### Logging | name | description | default | example | | --- | --- | --- | --- | -| `FLUENT_PROTOCOL` | protocol for fluent logging | `http` | -| `FLUENT_HOST` | host for fluent logging | `localhost` | -| `FLUENT_PORT` | port for fluent logging | 24224 | -| `IAV_NAME` | application name to be logged | `IAV` | - -##### CSP - -| name | description | default | example | -| --- | --- | --- | --- | -| `DISABLE_CSP` | disable csp | | `true` | -| `CSP_REPORT_URI` | report uri for csp violations | `/report-violation` | -| `NODE_ENV` | set to `production` to disable [`reportOnly`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only) | `null` | -| `SCRIPT_SRC` | `JSON.stringify`'ed array of allowed scriptSrc | `[]` | -| `CSP_CONNECT_SRC` | `JSON.stringify`'ed array of allowed dataSrc | `[]` | -| `WHITE_LIST_SRC` | `JSON.stringify`'ed array of allowed src | `[]` | -| `PROXY_HOSTNAME_WHITELIST` | +| `LOGGER_DIR` | Path (if any) to store the time rotated log files | | ##### Rate limiting @@ -76,20 +42,5 @@ | name | description | default | example | | --- | --- | --- | --- | -| `OBJ_STORAGE_AUTH_URL` | -| `OBJ_STORAGE_IDP_NAME` | -| `OBJ_STORAGE_IDP_PROTO` | -| `OBJ_STORAGE_IDP_URL` | -| `OBJ_STORAGE_USERNAME` | -| `OBJ_STORAGE_PASSWORD` | -| `OBJ_STORAGE_PROJECT_ID` | -| `OBJ_STORAGE_ROOT_URL` | - -##### Test deploy denvironments - -| name | description | default | example | -| --- | --- | --- | --- | -| `SERVICE_ACCOUNT_CRED` | -| `SERVICE_ACCOUNT_CRED_PATH` | -| `WAXHOLM_RAT_GOOGLE_SHEET_ID` | -| `SKIP_RETRY_TEST` | retry tests contains some timeouts, which may slow down tests | +| `SXPLR_EBRAINS_IAM_SA_CLIENT_ID` | client id used for service to service communication with data-proxy | +| `SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET` | client secret used for service to service communication with data-proxy | \ No newline at end of file diff --git a/e2e/screenshots/gen.js b/e2e/screenshots/gen.js index 9bd57e9f1..00533c07e 100644 --- a/e2e/screenshots/gen.js +++ b/e2e/screenshots/gen.js @@ -8,6 +8,7 @@ describe('> generating screenshot', () => { const cwdPath = path.join(__dirname, '../../deploy/') beforeAll(done => { + throw "Need to reimplement. backend is rewritten from node to python" childProcess = spawn('node', ['server.js'], { cwd: cwdPath, env: { diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index a13f3209d..000000000 --- a/netlify.toml +++ /dev/null @@ -1,7 +0,0 @@ -# toml netfliy: https://docs.netlify.com/configure-builds/file-based-configuration/#sample-file - -[build] - publish="dist/aot/" - command="cp deploy/util/* functions/nehubaConfig/ && cp -R src/res/ext functions/templates/json && cp -R src/res/ext functions/nehubaConfig/json && npm run build-aot" - functions="functions" - environment={ BACKEND_URL=".netlify/functions/" } \ No newline at end of file diff --git a/src/util/fn.ts b/src/util/fn.ts index c7edd341b..45a4f4be5 100644 --- a/src/util/fn.ts +++ b/src/util/fn.ts @@ -1,9 +1,6 @@ import { interval, Observable, of } from 'rxjs' import { filter, mapTo, take } from 'rxjs/operators' -export function getDebug() { - return (window as any).__DEBUG__ -} // eslint-disable-next-line @typescript-eslint/no-empty-function export function noop(){} -- GitLab