datex-studio-cli 0.5.2__tar.gz → 0.5.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/PKG-INFO +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/pyproject.toml +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/__init__.py +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/auth.py +32 -0
- datex_studio_cli-0.5.4/src/dxs/core/auth/browser_pages.py +72 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/msal_client.py +22 -2
- datex_studio_cli-0.5.4/src/dxs/core/auth/pages/error.html +234 -0
- datex_studio_cli-0.5.4/src/dxs/core/auth/pages/success.html +217 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/onboarding.py +126 -2
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/quartermaster/client.py +16 -4
- datex_studio_cli-0.5.4/src/dxs/core/quartermaster/tenants.py +57 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/404/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/404.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/capture/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/capture/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.dockerignore +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/actionlint.yaml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/build-image.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/ci.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/promote-prod.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/release.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.gitignore +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/CONTEXT.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/README.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/.env.example +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/Dockerfile +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/README.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/apply-local-cache.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/collector-config.yaml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/docker-compose.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/local-test-settings.json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/remote-settings.json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/report-creator.skill +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/analyze_corpus.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/check_wheel_completeness.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/datadog_errors.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/generate_rdlx_schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/wavelength_query.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/__main__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/cli.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/branch.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/branch_commit_guard.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/cascade.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/configuration.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm_delivery.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm_time.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/datasource.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/devops.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/document.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/endpoint.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/env.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/explore.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/function.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/init.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/marketplace.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/_common.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/create.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/data.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/pack.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/odata.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/organization.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/proxy.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/reference.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/release_notes.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/repo.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/add_cmds.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/batch.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/create.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/data.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/dataset.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/edit.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/schema_cmds.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/reset.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/servicepack.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/skills.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/source.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/studio.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/telemetry.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/user.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/validation_report.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/context.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/agent_browser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/app_config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/endpoints.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/metadata_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/reference_graph.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/replacements.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/datex_tenant.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/decorators.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/tenants.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/token_cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_shape.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/parsers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/resolver.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/type_def_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/flow_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/parsers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/helpers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/html.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/metadata_cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/pagination.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/resolvers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/time_entry.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/edmx_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/metadata.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/graph.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/csv_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/formatter.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/json_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/redaction.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/yaml_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/quartermaster/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/release_notes.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/responses.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/frontmatter.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/installer.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/layout.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/lock.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/resolver.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/staleness.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/identity.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/recorder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/scrubber.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/sender.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/models/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/manifest.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/mocks.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/scaffold.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/serve_lock.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/py.typed +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/datasource_binding.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/engine.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/field_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/manifest.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/preview_arjs.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/svg_renderer.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/validate_arjs.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/wrapper.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/click_options.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/clipboard.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/errors.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/filtering.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/image.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/paths.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/resolvers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/responses.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/restricted.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/sorting.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/update_check.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/versioning.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/app.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/design.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/proxy_app.py +0 -0
- {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.4/src/dxs/web/static/_next/static/CAvN0dC1A3kKCmq1ZHlgY}/_buildManifest.js +0 -0
- {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.4/src/dxs/web/static/_next/static/CAvN0dC1A3kKCmq1ZHlgY}/_ssgManifest.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/538-b06224e65f71c9a1.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/_not-found/page-e3c660196c244183.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/design/page-689cd5b9e1d9a74e.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/layout-cec86f90e385371d.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/page-f0380b0f29983264.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/main-app-694cf3568b6c9fa9.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/render-cli.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/report-preview.html +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/report-validate.html +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: datex-studio-cli
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.4
|
|
4
4
|
Summary: CLI for Datex Studio low-code platform, designed for LLM-based AI agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/datex/datex-studio-cli
|
|
6
6
|
Project-URL: Documentation, https://github.com/datex/datex-studio-cli
|
|
@@ -32,14 +32,38 @@ from dxs.core.auth.token_cache import CachedIdentity, get_identity_override
|
|
|
32
32
|
from dxs.core.footprint import get_footprint_token
|
|
33
33
|
from dxs.core.onboarding import (
|
|
34
34
|
LoginPresenter,
|
|
35
|
+
apply_sign_in_tenant_hint,
|
|
35
36
|
human_present,
|
|
36
37
|
map_login_failure,
|
|
38
|
+
missing_service_principal_tenant,
|
|
37
39
|
)
|
|
40
|
+
from dxs.core.quartermaster.tenants import lookup_sign_in_tenant
|
|
38
41
|
from dxs.utils.errors import AuthenticationError, DxsError, ValidationError
|
|
39
42
|
from dxs.utils.responses import list_response, single
|
|
40
43
|
from dxs.utils.restricted import restrict_in_restricted_mode
|
|
41
44
|
|
|
42
45
|
|
|
46
|
+
def _sharpen_missing_service_principal(
|
|
47
|
+
mapped: AuthenticationError, tenant_id: str | None, raw_error: str
|
|
48
|
+
) -> AuthenticationError:
|
|
49
|
+
"""Ask Quartermaster which tenant the org actually signs in against.
|
|
50
|
+
|
|
51
|
+
Only for DXS-AUTH-030, only after the login already failed, and only ever
|
|
52
|
+
additive: any problem reaching the service leaves the mapped notice as-is.
|
|
53
|
+
The tenant comes from the caller when it resolved one, and otherwise out of
|
|
54
|
+
Entra's own error text — a blank-prompt or org-name login never had one.
|
|
55
|
+
"""
|
|
56
|
+
requested = tenant_id or missing_service_principal_tenant(raw_error)
|
|
57
|
+
if not requested:
|
|
58
|
+
return mapped
|
|
59
|
+
try:
|
|
60
|
+
return apply_sign_in_tenant_hint(
|
|
61
|
+
mapped, requested_tenant=requested, sign_in=lookup_sign_in_tenant(requested)
|
|
62
|
+
)
|
|
63
|
+
except Exception: # noqa: BLE001 - never worsen a diagnosed failure
|
|
64
|
+
return mapped
|
|
65
|
+
|
|
66
|
+
|
|
43
67
|
def _reject_tenant_override(ctx: DxsContext, command: str) -> None:
|
|
44
68
|
"""Block --tenant on identity-management commands.
|
|
45
69
|
|
|
@@ -319,6 +343,10 @@ def run_standard_login(
|
|
|
319
343
|
on_additional_consent_needed=consent_cb,
|
|
320
344
|
consent_outcomes=outcomes,
|
|
321
345
|
login_hint=upn,
|
|
346
|
+
# The success page shows the org chip only when the caller knew
|
|
347
|
+
# the org before the browser opened (login <ORG> / switch <ORG>);
|
|
348
|
+
# bare logins discover the org only after this returns.
|
|
349
|
+
org_name=organization_name,
|
|
322
350
|
)
|
|
323
351
|
else:
|
|
324
352
|
ctx.log("Initiating device code authentication...")
|
|
@@ -333,6 +361,10 @@ def run_standard_login(
|
|
|
333
361
|
mapped = map_login_failure(
|
|
334
362
|
e, external=tenant_scoped, tenant_id=tenant_id, domain=domain, upn=upn
|
|
335
363
|
)
|
|
364
|
+
if mapped.code == "DXS-AUTH-030":
|
|
365
|
+
mapped = _sharpen_missing_service_principal(
|
|
366
|
+
mapped, tenant_id, f"{e.message} {e.details}"
|
|
367
|
+
)
|
|
336
368
|
if mapped is e:
|
|
337
369
|
raise
|
|
338
370
|
raise mapped from e
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""HTML pages served in the browser after the PKCE login redirect.
|
|
2
|
+
|
|
3
|
+
The pages themselves are designer-authored files in ``pages/`` (shipped as
|
|
4
|
+
package data). MSAL's local redirect server (``msal.oauth2cli.authcode``)
|
|
5
|
+
renders them via ``string.Template.safe_substitute`` and serves each exactly
|
|
6
|
+
once from a one-shot HTTP server, which imposes rules any replacement page
|
|
7
|
+
must keep (pinned by ``tests/test_auth_browser_pages.py``):
|
|
8
|
+
|
|
9
|
+
- The first character must be ``<`` — the server labels the response
|
|
10
|
+
``text/html`` only when the body starts with ``<``.
|
|
11
|
+
- ``<meta charset="utf-8">`` is required — the server sends no charset header,
|
|
12
|
+
and the body is UTF-8 encoded.
|
|
13
|
+
- Everything inline (CSS, script, favicon and logos as data URIs): the server
|
|
14
|
+
is gone after the page is sent, so a second request can never be served.
|
|
15
|
+
- ``$name`` is a substitution slot; a literal dollar sign must be written
|
|
16
|
+
``$$``, and JS ``${...}`` template literals are banned (they collide with
|
|
17
|
+
the braced slot syntax). Page scripts write ``\\u0024`` instead of a raw
|
|
18
|
+
dollar for the same reason.
|
|
19
|
+
- Slots may sit only in element text, never in JS string literals: MSAL
|
|
20
|
+
escapes values for HTML only, so a backslash or newline in Entra's error
|
|
21
|
+
text would break out of a JS literal. Scripts read the substituted values
|
|
22
|
+
back from the DOM.
|
|
23
|
+
- The success redirect carries only auth artifacts (``code``/``state``) — no
|
|
24
|
+
identity — so the success page must never render its substitution input.
|
|
25
|
+
Its one declared slot, ``$org``, is never present in the auth response;
|
|
26
|
+
it is reserved for engineering-side injection, and the page's script
|
|
27
|
+
removes the org chip while the token is unfilled.
|
|
28
|
+
- ``safe_substitute`` leaves an unfilled slot as its literal token text, so
|
|
29
|
+
the pages' scripts hide any slot whose text still starts with a dollar.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import html
|
|
33
|
+
from importlib.resources import files
|
|
34
|
+
from string import Template
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _load_page(name: str) -> str:
|
|
38
|
+
return files("dxs.core.auth").joinpath("pages").joinpath(name).read_text(encoding="utf-8")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
SUCCESS_PAGE_HTML = _load_page("success.html")
|
|
42
|
+
ERROR_PAGE_HTML = _load_page("error.html")
|
|
43
|
+
|
|
44
|
+
# The success page bakes in an "Access approved" copy variant for the staff
|
|
45
|
+
# consent round, switched by this marker in its script. The replace is
|
|
46
|
+
# deliberately silent on a miss — a redesigned page without the marker must
|
|
47
|
+
# not break logins — and the variant test is what turns a missing marker into
|
|
48
|
+
# a CI failure instead of quietly serving sign-in copy.
|
|
49
|
+
CONSENT_SUCCESS_PAGE_HTML = SUCCESS_PAGE_HTML.replace(
|
|
50
|
+
'var VARIANT = "signin";', 'var VARIANT = "approved";'
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def success_page(org: str | None = None, *, approved: bool = False) -> str:
|
|
55
|
+
"""The success page, with the org context chip filled in when known.
|
|
56
|
+
|
|
57
|
+
``org`` is the organization display name a login command resolved before
|
|
58
|
+
opening the browser (the ``dxs auth login <ORG>`` / ``switch <ORG>``
|
|
59
|
+
paths); ``None`` or blank leaves the ``$org`` token in place, which the
|
|
60
|
+
page's own script treats as "unknown" and removes the chip. The value is
|
|
61
|
+
HTML-escaped here because MSAL escapes only what *it* substitutes.
|
|
62
|
+
Substitution is single-pass, so a dollar sign inside the name lands
|
|
63
|
+
literally — the page then hides a chip whose text starts with one, per
|
|
64
|
+
the unset-token convention, rather than rendering it.
|
|
65
|
+
|
|
66
|
+
``approved`` selects the staff consent round's "Access approved" copy.
|
|
67
|
+
"""
|
|
68
|
+
base = CONSENT_SUCCESS_PAGE_HTML if approved else SUCCESS_PAGE_HTML
|
|
69
|
+
name = (org or "").strip()
|
|
70
|
+
if not name:
|
|
71
|
+
return base
|
|
72
|
+
return Template(base).safe_substitute(org=html.escape(name))
|
|
@@ -8,6 +8,7 @@ from typing import Any, cast
|
|
|
8
8
|
|
|
9
9
|
import msal
|
|
10
10
|
|
|
11
|
+
from dxs.core.auth.browser_pages import ERROR_PAGE_HTML, success_page
|
|
11
12
|
from dxs.utils.config import get_settings
|
|
12
13
|
from dxs.utils.errors import AuthenticationError
|
|
13
14
|
|
|
@@ -309,6 +310,7 @@ class MSALClient:
|
|
|
309
310
|
on_additional_consent_needed: Callable[[str, list[str]], None] | None = None,
|
|
310
311
|
consent_outcomes: list[ConsentOutcome] | None = None,
|
|
311
312
|
login_hint: str | None = None,
|
|
313
|
+
org_name: str | None = None,
|
|
312
314
|
) -> dict[str, Any]:
|
|
313
315
|
"""Authenticate with multiple resources via the system browser (PKCE).
|
|
314
316
|
|
|
@@ -330,6 +332,10 @@ class MSALClient:
|
|
|
330
332
|
primary round only, since the consent rounds that follow ride the
|
|
331
333
|
session that round established.
|
|
332
334
|
|
|
335
|
+
``org_name`` is the organization display name, when the caller resolved
|
|
336
|
+
one before opening the browser; it fills the context chip on the
|
|
337
|
+
post-redirect success pages (primary and consent rounds alike).
|
|
338
|
+
|
|
333
339
|
Raises:
|
|
334
340
|
AuthenticationError: If the primary authentication fails.
|
|
335
341
|
"""
|
|
@@ -341,6 +347,7 @@ class MSALClient:
|
|
|
341
347
|
scopes=primary_scopes,
|
|
342
348
|
extra_scopes_to_consent=extra_to_consent,
|
|
343
349
|
login_hint=login_hint,
|
|
350
|
+
org_name=org_name,
|
|
344
351
|
)
|
|
345
352
|
|
|
346
353
|
if callable(additional_scope_sets):
|
|
@@ -354,6 +361,7 @@ class MSALClient:
|
|
|
354
361
|
on_device_code=None,
|
|
355
362
|
on_additional_consent_needed=on_additional_consent_needed,
|
|
356
363
|
interactive=True,
|
|
364
|
+
org_name=org_name,
|
|
357
365
|
)
|
|
358
366
|
if not outcome.ok:
|
|
359
367
|
logger.warning(
|
|
@@ -373,6 +381,7 @@ class MSALClient:
|
|
|
373
381
|
on_device_code: Callable[[dict[str, Any]], None] | None,
|
|
374
382
|
on_additional_consent_needed: Callable[[str, list[str]], None] | None,
|
|
375
383
|
interactive: bool = False,
|
|
384
|
+
org_name: str | None = None,
|
|
376
385
|
) -> ConsentOutcome:
|
|
377
386
|
"""Acquire one additional resource's token, reporting how it went.
|
|
378
387
|
|
|
@@ -417,7 +426,7 @@ class MSALClient:
|
|
|
417
426
|
# Consent needed - run a consent flow for this resource
|
|
418
427
|
if interactive:
|
|
419
428
|
consent = self._acquire_consent_for_resource_interactive(
|
|
420
|
-
scope_set, on_additional_consent_needed
|
|
429
|
+
scope_set, on_additional_consent_needed, org_name=org_name
|
|
421
430
|
)
|
|
422
431
|
else:
|
|
423
432
|
consent = self._acquire_consent_for_resource(
|
|
@@ -438,6 +447,7 @@ class MSALClient:
|
|
|
438
447
|
self,
|
|
439
448
|
scopes: list[str],
|
|
440
449
|
on_additional_consent_needed: Callable[[str, list[str]], None] | None = None,
|
|
450
|
+
org_name: str | None = None,
|
|
441
451
|
) -> dict[str, Any]:
|
|
442
452
|
"""Browser consent round for one resource (the interactive-flow sibling
|
|
443
453
|
of :meth:`_acquire_consent_for_resource`).
|
|
@@ -450,7 +460,11 @@ class MSALClient:
|
|
|
450
460
|
on_additional_consent_needed(resource_name, scopes)
|
|
451
461
|
|
|
452
462
|
try:
|
|
453
|
-
result = self._app.acquire_token_interactive(
|
|
463
|
+
result = self._app.acquire_token_interactive(
|
|
464
|
+
scopes=scopes,
|
|
465
|
+
success_template=success_page(org_name, approved=True),
|
|
466
|
+
error_template=ERROR_PAGE_HTML,
|
|
467
|
+
)
|
|
454
468
|
except Exception as e:
|
|
455
469
|
logger.debug("Interactive flow failed for resource consent: %s", e)
|
|
456
470
|
return {"error": "exception", "error_description": str(e)}
|
|
@@ -523,6 +537,7 @@ class MSALClient:
|
|
|
523
537
|
scopes: list[str],
|
|
524
538
|
extra_scopes_to_consent: list[str] | None = None,
|
|
525
539
|
login_hint: str | None = None,
|
|
540
|
+
org_name: str | None = None,
|
|
526
541
|
) -> dict[str, Any]:
|
|
527
542
|
"""Authenticate interactively via browser with multi-resource consent.
|
|
528
543
|
|
|
@@ -539,6 +554,9 @@ class MSALClient:
|
|
|
539
554
|
which on a machine with several tenants is rarely who was asked
|
|
540
555
|
for. It is only a hint — the caller still has to verify the
|
|
541
556
|
account that comes back.
|
|
557
|
+
org_name: Organization display name, when the caller resolved one
|
|
558
|
+
before opening the browser; shown on the post-redirect success
|
|
559
|
+
page's context chip.
|
|
542
560
|
|
|
543
561
|
Returns:
|
|
544
562
|
Token response containing access_token, refresh_token, etc.
|
|
@@ -551,6 +569,8 @@ class MSALClient:
|
|
|
551
569
|
scopes=scopes,
|
|
552
570
|
extra_scopes_to_consent=extra_scopes_to_consent,
|
|
553
571
|
login_hint=login_hint,
|
|
572
|
+
success_template=success_page(org_name),
|
|
573
|
+
error_template=ERROR_PAGE_HTML,
|
|
554
574
|
)
|
|
555
575
|
except Exception as e:
|
|
556
576
|
raise AuthenticationError(
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<meta name="robots" content="noindex">
|
|
7
|
+
<title>Sign-in didn't complete · Datex Studio CLI</title>
|
|
8
|
+
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2064%22%3E%3Crect%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2214%22%20fill%3D%22%235B09AF%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%225%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.95%22%3E%3Cpath%20d%3D%22M20%2022l10%2010-10%2010%22%2F%3E%3Cpath%20d%3D%22M36%2022l10%2010-10%2010%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
|
|
9
|
+
<style>
|
|
10
|
+
*,*::before,*::after{box-sizing:border-box}
|
|
11
|
+
html,body{height:100%}
|
|
12
|
+
:root{
|
|
13
|
+
--bg:#F5F7F9; --grid:rgba(91,9,175,.10);
|
|
14
|
+
--card:#FFFFFF; --bd:#DCE2EC; --sh:0 1px 2px rgba(59,70,79,.04),0 18px 40px -18px rgba(59,70,79,.22);
|
|
15
|
+
--tx:#22292F; --bo:#3B464F; --mu:#5B6A75; --su:#74828D;
|
|
16
|
+
--brand:#5B09AF; --brand-h:#410880; --lav:#B3A7FE; --lav-soft:#E9E4FF;
|
|
17
|
+
--chip:#FFFFFF; --tbg:#22292F; --tbd:rgba(255,255,255,.10); --tmu:#9AA6B1; --tp:#B3A7FE;
|
|
18
|
+
--hair:#DCE2EC; --sunken:#F5F7F9;
|
|
19
|
+
}
|
|
20
|
+
@media (prefers-color-scheme:dark){
|
|
21
|
+
html:not([data-theme="light"]){
|
|
22
|
+
--bg:#12161A; --grid:rgba(179,167,254,.12);
|
|
23
|
+
--card:#1B2126; --bd:rgba(255,255,255,.09); --sh:0 24px 60px -24px rgba(0,0,0,.7);
|
|
24
|
+
--tx:#FFFFFF; --bo:#EDF1F6; --mu:#9AA6B1; --su:#74828D;
|
|
25
|
+
--brand:#8B3FDD; --brand-h:#7423C9; --lav-soft:rgba(179,167,254,.14);
|
|
26
|
+
--chip:#232A31; --tbg:#12161A; --tbd:rgba(255,255,255,.08);
|
|
27
|
+
--hair:rgba(255,255,255,.09); --sunken:rgba(255,255,255,.04);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
html[data-theme="dark"]{
|
|
31
|
+
--bg:#12161A; --grid:rgba(179,167,254,.12);
|
|
32
|
+
--card:#1B2126; --bd:rgba(255,255,255,.09); --sh:0 24px 60px -24px rgba(0,0,0,.7);
|
|
33
|
+
--tx:#FFFFFF; --bo:#EDF1F6; --mu:#9AA6B1; --su:#74828D;
|
|
34
|
+
--brand:#8B3FDD; --brand-h:#7423C9; --lav-soft:rgba(179,167,254,.14);
|
|
35
|
+
--chip:#232A31; --tbg:#12161A; --tbd:rgba(255,255,255,.08);
|
|
36
|
+
--hair:rgba(255,255,255,.09); --sunken:rgba(255,255,255,.04);
|
|
37
|
+
}
|
|
38
|
+
body{
|
|
39
|
+
margin:0;padding:28px;background:var(--bg);color:var(--tx);
|
|
40
|
+
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
|
41
|
+
-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
|
|
42
|
+
display:grid;place-items:center;
|
|
43
|
+
}
|
|
44
|
+
body::before{
|
|
45
|
+
content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
|
|
46
|
+
background-image:repeating-linear-gradient(135deg,var(--grid) 0 1px,transparent 1px 15px);
|
|
47
|
+
-webkit-mask-image:radial-gradient(130% 80% at 50% -10%,#000 0%,transparent 72%);
|
|
48
|
+
mask-image:radial-gradient(130% 80% at 50% -10%,#000 0%,transparent 72%);
|
|
49
|
+
}
|
|
50
|
+
.card{
|
|
51
|
+
position:relative;z-index:1;width:100%;max-width:560px;background:var(--card);
|
|
52
|
+
border:1px solid var(--bd);border-radius:20px;box-shadow:var(--sh);
|
|
53
|
+
padding:40px 40px 32px;overflow:hidden;
|
|
54
|
+
animation:rise .5s cubic-bezier(.4,0,.2,1) both;
|
|
55
|
+
}
|
|
56
|
+
.lockup{display:flex;align-items:center;gap:13px;margin:0 0 34px}
|
|
57
|
+
.lockup img{height:19px;width:auto;display:block}
|
|
58
|
+
.m-d{display:none}
|
|
59
|
+
@media (prefers-color-scheme:dark){html:not([data-theme="light"]) .m-l{display:none}html:not([data-theme="light"]) .m-d{display:block}}
|
|
60
|
+
html[data-theme="dark"] .m-l{display:none}
|
|
61
|
+
html[data-theme="dark"] .m-d{display:block}
|
|
62
|
+
.lockup .rule{width:1px;height:15px;background:var(--bd)}
|
|
63
|
+
.kicker{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--mu)}
|
|
64
|
+
.glyph{
|
|
65
|
+
width:54px;height:54px;border-radius:50%;background:var(--chip);
|
|
66
|
+
border:1.5px solid var(--lav);display:grid;place-items:center;margin-bottom:26px;
|
|
67
|
+
animation:pop .45s cubic-bezier(.4,0,.2,1) .12s both;
|
|
68
|
+
}
|
|
69
|
+
.glyph.calm{border-color:var(--bd)}
|
|
70
|
+
.glyph.warn{border-color:#EFB52F;background:var(--chip)}
|
|
71
|
+
.glyph svg{width:25px;height:25px;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;fill:none}
|
|
72
|
+
.glyph svg path{stroke:var(--brand)}
|
|
73
|
+
.glyph.calm svg path{stroke:var(--su)}
|
|
74
|
+
.glyph.warn svg path{stroke:#C68F1B}
|
|
75
|
+
@media (prefers-color-scheme:dark){html:not([data-theme="light"]) .glyph.warn svg path{stroke:#EFB52F}}
|
|
76
|
+
html[data-theme="dark"] .glyph.warn svg path{stroke:#EFB52F}
|
|
77
|
+
.draw{stroke-dasharray:34;stroke-dashoffset:34;animation:draw .42s cubic-bezier(.4,0,.2,1) .34s both}
|
|
78
|
+
.org{
|
|
79
|
+
display:inline-block;margin:0 0 14px;padding:5px 11px;border-radius:999px;
|
|
80
|
+
background:var(--lav-soft);color:var(--brand);font-size:12px;font-weight:700;letter-spacing:.02em;
|
|
81
|
+
}
|
|
82
|
+
h1{margin:0;font-size:clamp(27px,3.6vw,33px);line-height:1.14;letter-spacing:-.021em;font-weight:800;color:var(--tx)}
|
|
83
|
+
.lede{margin:14px 0 0;font-size:16px;line-height:1.62;color:var(--mu);max-width:44ch;text-wrap:pretty}
|
|
84
|
+
.term{
|
|
85
|
+
margin-top:28px;border-radius:12px;background:var(--tbg);border:1px solid var(--tbd);
|
|
86
|
+
padding:14px 16px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
|
|
87
|
+
font-size:13px;line-height:1.95;color:var(--tmu);overflow-x:auto;
|
|
88
|
+
}
|
|
89
|
+
.term .row{white-space:nowrap}
|
|
90
|
+
.term .p{color:var(--tp)}
|
|
91
|
+
.term .ok{color:#3FC589}
|
|
92
|
+
.term .cmd{color:#EDF1F6}
|
|
93
|
+
.caret{display:inline-block;width:7px;height:14px;background:#B3A7FE;vertical-align:-2px;animation:blink 1.1s steps(1,end) 1s infinite}
|
|
94
|
+
.code{
|
|
95
|
+
display:inline-flex;align-items:center;gap:8px;margin-top:24px;padding:6px 11px;border-radius:8px;
|
|
96
|
+
background:var(--sunken);border:1px solid var(--bd);
|
|
97
|
+
font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:var(--bo);
|
|
98
|
+
}
|
|
99
|
+
.code b{font-family:inherit;font-weight:400;color:var(--su)}
|
|
100
|
+
details{margin-top:18px;border-top:1px solid var(--hair);padding-top:16px}
|
|
101
|
+
summary{
|
|
102
|
+
cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;
|
|
103
|
+
font-size:13px;font-weight:600;color:var(--mu);width:max-content;
|
|
104
|
+
}
|
|
105
|
+
summary::-webkit-details-marker{display:none}
|
|
106
|
+
summary svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s cubic-bezier(.4,0,.2,1)}
|
|
107
|
+
details[open] summary svg{transform:rotate(90deg)}
|
|
108
|
+
summary:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav-soft);border-radius:6px}
|
|
109
|
+
.detail{
|
|
110
|
+
margin:12px 0 0;padding:12px 14px;border-radius:10px;background:var(--sunken);border:1px solid var(--bd);
|
|
111
|
+
font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.65;
|
|
112
|
+
color:var(--mu);white-space:pre-wrap;word-break:break-word;
|
|
113
|
+
}
|
|
114
|
+
.foot{margin:26px 0 0;padding-top:18px;border-top:1px solid var(--hair);font-size:13px;line-height:1.6;color:var(--su)}
|
|
115
|
+
.foot b{color:var(--mu);font-weight:600}
|
|
116
|
+
.stagger>*{animation:rise .5s cubic-bezier(.4,0,.2,1) both}
|
|
117
|
+
.stagger>*:nth-child(1){animation-delay:.10s}
|
|
118
|
+
.stagger>*:nth-child(2){animation-delay:.17s}
|
|
119
|
+
.stagger>*:nth-child(3){animation-delay:.24s}
|
|
120
|
+
.stagger>*:nth-child(4){animation-delay:.31s}
|
|
121
|
+
.stagger>*:nth-child(5){animation-delay:.38s}
|
|
122
|
+
.btnrow{display:flex;align-items:center;gap:20px;margin-top:28px;flex-wrap:wrap}
|
|
123
|
+
.btn{
|
|
124
|
+
display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 20px;border-radius:10px;
|
|
125
|
+
background:var(--brand);color:#fff;text-decoration:none;font-size:14.5px;font-weight:600;
|
|
126
|
+
box-shadow:0 6px 18px -6px rgba(91,9,175,.55);transition:background .16s cubic-bezier(.4,0,.2,1),box-shadow .16s,transform .12s;
|
|
127
|
+
}
|
|
128
|
+
.btn:hover{background:var(--brand-h);box-shadow:0 10px 24px -8px rgba(91,9,175,.6)}
|
|
129
|
+
.btn:active{transform:translateY(1px)}
|
|
130
|
+
.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav)}
|
|
131
|
+
.btn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
|
|
132
|
+
.ghost{font-size:14px;font-weight:600;color:var(--mu);text-decoration:none;border-bottom:1px solid transparent;transition:color .16s,border-color .16s}
|
|
133
|
+
.ghost:hover{color:var(--brand);border-color:var(--lav)}
|
|
134
|
+
.ghost:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav-soft);border-radius:4px}
|
|
135
|
+
a{color:var(--brand)}
|
|
136
|
+
a:hover{color:var(--brand-h)}
|
|
137
|
+
.band{
|
|
138
|
+
margin:-40px -40px 30px;height:96px;position:relative;overflow:hidden;
|
|
139
|
+
background:linear-gradient(115deg,#410880 0%,#5B09AF 52%,#7423C9 100%);
|
|
140
|
+
display:flex;align-items:center;padding:0 40px;
|
|
141
|
+
}
|
|
142
|
+
.band::after{
|
|
143
|
+
content:"";position:absolute;inset:0;
|
|
144
|
+
background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.30) 0 1px,transparent 1px 15px);
|
|
145
|
+
opacity:.55;
|
|
146
|
+
}
|
|
147
|
+
.band img{height:22px;width:auto;position:relative;z-index:1;display:block}
|
|
148
|
+
@keyframes rise{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
|
|
149
|
+
@keyframes pop{from{opacity:0;transform:scale(.86)}to{opacity:1;transform:none}}
|
|
150
|
+
@keyframes draw{to{stroke-dashoffset:0}}
|
|
151
|
+
@keyframes blink{50%{opacity:0}}
|
|
152
|
+
@media (prefers-reduced-motion:reduce){
|
|
153
|
+
*{animation:none!important;transition:none!important}
|
|
154
|
+
.draw{stroke-dashoffset:0}
|
|
155
|
+
}
|
|
156
|
+
@media (max-width:560px){
|
|
157
|
+
body{padding:16px}
|
|
158
|
+
.card{padding:30px 24px 24px;border-radius:16px}
|
|
159
|
+
.band{margin:-30px -24px 24px;padding:0 24px;height:82px}
|
|
160
|
+
}
|
|
161
|
+
</style>
|
|
162
|
+
</head>
|
|
163
|
+
<body>
|
|
164
|
+
<main class="card">
|
|
165
|
+
<div class="lockup">
|
|
166
|
+
<img class="m-l" src="data:image/png;base64,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" alt="Datex">
|
|
167
|
+
<img class="m-d" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAACGCAYAAACSX/68AAAQAElEQVR4AeydCZx0NZXo+3Ob547jiooLKuKGoIjIMriLCOKC6BtRBNkVQYQZUEQRR0RZfOAGoiAgqMgoCgI6OqPoCAqIMIogIKOijLiC+/a9//+jqqe6+1bVTW5y61Z1+pfTuZWbnJycJOdkOcm91Vz5KxwoHCgcKBwoHOgAB4pC6kAlFBIKBwoHCgcKB+bmikIqrWB2OVBKVjhQODBVHCgKaaqqqxBbOFA4UDgwuxwoCml267aUrHCgcGB2OTCTJSsKaSartRSqcKBwoHBg+jhQFNL01VmhuHCgcKBwYCY5UBTSTFZreKFKisKBwoHCgUlzoCikSddAyb9woHCgcKBwYBUHikJaxYbyr3CgcGB2OVBKNi0cKAppWmqq0Fk4UDhQODDjHCgKKaKCV65cuRpwb+ChwDoV8CjC7gPcEyg8juBxSVI4UDiw/DhQhOWIOkeZPBw4E/gKcDnw/ZUrV/6MJNcBVwGXAhdUwNcJ8/3V+DeS7sfAVcAlwBeBQwkvrnCgcKBwoHBggANFIQ0wo+JxXcKeC2wMPBp4EHB34K7AXYA7ArevgDsQdmfAOH+PvzrwMGA94CmAuPCKKxwoHCgcKBzoc6AopD4nqn0VSfWbZqE/bZa8pC4cyMSBgrZwYIIcKAppNPPvO/p19NufR6csCQsHCgcKB2aUA0Uhja7Y+49+HfX2b6S6HiiucKBwoHCgcGCAA5kV0kBOU/a4cuXKFZDs/g9eUvdXsGnsgFdc4UDhQOFA4UCfA0Uh9Tmx1FchrbY0uHGIM6SfNMZSEBQOFA4UDswYB4pCGl6h8iaXQipLdsP5PjVvCqGFA4UDaTmg0E2LcXawOUPSbDt1iX4DwpuB4goHCgcKBwoHBjhQFNIAMxY9/h9+e5YIL6m7CWzuI+EVNy0cYE/x1sCDgbWAxwEbAbeeFvoLnYUDYRyYTOyikIbzfQ1e5RA4vwav+0h4xU0DB1A89pPdoPXKHlyM/2ngdkBxhQOFA4k4YEdLhGrm0GjyXRTSzFVrVIG2IdU7gdsCffcrHsrAAiYUVziQigNFIQ3npNcE5VBIP1+xYsVyW7IbzuWOv2F2tCkkngB4RRTevPsFT0UhwYTiCgdScaAopOGczDVD+p/hWZY3XeIAymgd6DkH8G5CvAXOGVIZWCxgSflRONCMA0UhDeefl6gOfxv/piikeN61lrKnjD5Phl6gi7fEOdMtM6QlbFmGAaXIyThQFNJwVua4pcHcfuy/At3lAMpobaj7GHAvoMqtJPAaoLjCgcKBhBwoCmk4M3MoJAVZuaVhOM8n/gZl5N7hhyFEpYRX6ZwZXVv5pgQWDhQORHOgKKThrMuxZPcHsnPvAW+YK+GT4gDK6J7k/UFgA2CUc2Dx/VERyrvCgcKBcA4UhVTBMwTTbQjOcUuDCql8egLmds1R5xouODN6ag3aVEjlgtwajCpRCgdCOFAUUjW3NPH1pobqt/GhvyOpn0DHK64rHEAZOQA5BXo2B+o4l+zKRxbrcGpRnPKzcGAUB4pCquaOCkmofhsf+keSliU7mNAVhzLyrNn7oGdrwPsL8cY6Z7rOksZGLBEKBwoH6nOgKKRqXt2J4GHmvryKdpoKl7Mr0exLmxBl5Mxof7DuCIT0BQcWzpJIVlzhQOFAKg6EdMJUeabDkw+TyijHkl0x+c5XZ0GYUUa2/VeR6E2Az3i1XVFItVlVIhYO1OdAaEesj3m6Yz4Y8usu3xC1truxdswSMRsHUEbW7cvI4FBg8H46ftZyKqSyZFeLVSVS4UB9DhSFVM2rtaqDG4eWjfDGLGyGoKeMtgTL0UDsPuHPVqxYkVshQV5xhQPLiwNFIVXX98OqgxuHFgu7xixsjGBDMJwINDHrL4ebYWBxhQOpOVAUUjVHPa1f/aZZ6A3NkpfUTTjA7GhN0v8r0PQWjrIXCBOLKxyI5sCQhEUhLWIMQkue5LilwZzKDEkuTACo1/uQ7X8C+niN3H83Sl0SFw4UDlRyQOFb+WIZB8oTrexysKAopBxcHYNzQBnde0zUuq9/UDdiiVc4UDhQnwMK3/qxl0dMeZJDIf0Z9nXSqAGBfSvg1sBtBuC2A8++M47WaRSja244PZRBJeTN3VpODo9Y/4316Mf56qeY8pjw0Lrvtw3bxe0IE/ph9pkpL2UhvwscmImGROe4E3B/4BHAk4FtgZ2BvYHXAm8FDgb8LezI8zbAZsDawP2AvsWVJ/dzKCSFmObCrdc7ZVsBrAY8CHgcsAUgD/bFfxsEfQj4BHBuD87DvxDo//4sz97zdjTxDwReATwdeDhwd6CTigq6VoPuDwD/AKRyKqSZvY8Qnt0NsF6fhb8r8FYYdzzwGeBzwCXAt3rwH/i2kZOI907gNcBWgH3q7/FbbRfkd19gzUxg32ldXlIW+22uMon3weShzKMqJ+9aZ3DTIsM8R2g2vM153h9wk9q9gYvAbUf5d3xHxMfhHwUcCbwBOAjwt+CNzqfz2w5lGtN+FVyGGbeJBRZoK51C7E+VbxIFQr8j2b/DVzmrmBUo7we9PPka/sXAN4CzAXnwTvwDgO2B5wFP64EXjK7XezbsmTxvB7waOATwk95+vO6bPF8AnE2ebwLM8y74E29X0OBlqe+CNk288ZI5b9q4PfjXSACrJ6MqAhH0217ujL8x4OBEpWN9Wq8qGtuO/WEH0HvP31PwHw34aQ5hY55tHy/F3xf4f8CngUsB8ZwB3t2ARwK3Iyy324MMbOMqzdRgv9kM/K05eHZnMjsZSF2WPj55dSD4aykk6LG9rIuvXDkL/yrgQuD1gIPcxnU8ccEBM0Y6Curo/o74jwJeT2SVj2v45/Dswcbn4z8GcGkm5pCjTHSjWwG8DXjsgF4pw2NSp4VdshkSvJAvLqU5En0Mv3eFWs2Zr8D/IaASUqAYbkdSgGhdlrLOnVU+lLyeDbwZME9Nok+AnqcBdwVaHSVDwxx5Wn+2DRVt6vwVEl8hH9tgU5BfoGrPwRvbjfWiIrF9+KFBy+PgROXtGTzrtQlRf0dij07YN70n8Nv8VnDtTv4OJlO2QVDPuyN4cln8rvip4R7g/Aj05zJ4Av3/OvKRR85On0No6rL08SmT9lmxYsXYgTL0KCMdbDhYcVD/EOj6JaD83Af/LOC3xHNwE93nLDR4uucomNrYRrAf1Hkh6X/h/wuwPlBLoxOvS87DlI0UEjxRmDhDtHG8nMJdCTjzugxf4eLtA6n2SkAZ5ZyZSNu/kdoG75KpYfxszTnr27O13KYgo17bUZg6qLPNWD87Q7rfgMLL7tYlh/cCPwI+AT33BqIFFziWOASrAtK6z3XPoDPafaC7DbnpZb/O+JLyaIBpv+Z5M3imz+NwR3kdXFhvzyDWQaS5A/AI4InAeoBy2knBTbx3cOMMKoruNhgLjfUdhXfUb8EtmCPQw0jtiBdvqp3COboA8MXZn0uKzn40O3Y25CglDGe7sb0P8HCy/G/o/xfA3/zM48CvwnZZ0eXZqA6Rh7LJYe3xRGFxJlTYnxx1T3JAZ704c7oWetx7Sq0QHcW7jA/6LM7LeJ+UBXMPKXXmqoPL4rnknrfV74QicTbZy7Xagxb3YV3a84OU9yaNS/ZLIhPuLPhevDgJcODhMi+PYa4zComCO/J/CeS7n+P6tZXedOkAdJ1xLmU1IcYbyN3bcWnSaXITXG2mVQA5gnJkfgn17Ga5YTlo+L8gdd8oV0cG/fQ4eP1wqD0V0EBlK/y2Z6pkOdRJi/uSl0KnS3lJ6gzB+BdydF/kZvwcTpn5HmhWUCfHD14VtMYjLqslxw9Cr7w6Ej5pxMTPse4MYshTDYN+A32DcDO/fwR8CVgDnH8FXCZ3O+VdhD2QtEFO5gYlSB0Zol2aezJ4vwycDDi1nzhd0JHaOeVtglPLv2lSRFVlfQSBNnAtspLNlmhDzozc/zgW/JMc/ZP95B38uAPwDihxlcFBXpcHdveFTgcRn4Tmu/HcxPXTfo8H94IVvjwmd+uA0a0EvHSO8tsnXHrPuez+KSh26wNvtIMeZbGKaD8UjQNqB5LKIcF9o9eCQQvcjfAvI35fbrt14CzMQSiv6rs+gvopEsakAGpQK0CrL+8YSzJKSkhiSlSNluwgxMaAN/XOxmxDdoM41SjQAY2m684ip55BsQWgPzm40/LN/SGt3pyZxqJrM50DLTfvz6cMj22aMcLTPSTbg/vOTdFVpbcvOqtTZlW9Dw6j3Mri15BQa1e8LM5ltb3gz+9qYldxOdM8rSL+yeA5HtiFd4IzxhfwPEeYR1ycgWnsZFBtkAm1I6eKKPMBlxA0RXZj1el7KvRdxGMH0TCji7RNgibbnY33dNpBI6VEeq0jT6EQLnXgLU8HHxxd70TpPcrgcrdCk59T46T3UVCrUvJ8oL/5GecQir8lpebo+jwmd87mDuvxPQXyZ4HE/Rn7Bo/JncYLu8IX96DrIncmeBppxikwjRnE6WBTX/AIgUcjgu4FzVV4CaoEKtAzPu/hpRuPWq3w2E2XkCrPrvymIT7XcVVsDdF0KvnToUaLK4Upj2GOtmRj98yZyz5hiWcoNnxQEHgGyM3kaV9l0KzeZaVNKVcjpUQVO0OyfeRautuEPPYGGjnKqXGS5vHOFBvhGpJYufFqFMtXh7wfFmy/9Jxm1fsNoVsTb5X+R4mgFbGH53lc5a5a9X9uzkFG73G816pCogD3g6QvArsB095xKEJtpzJx6ls7QUVEFZq3BFS8mtogBY7nYfajbQTt/RDfJQJHYZqkTisDGgtK+KAA17LMZZMgHnaYadatQi5ImC0uDwJY/qowrlv8LtFv5acHiqMHRNSfSkiLOrcvEpG1AI088KaNqmW3BRErfiijh63sfIH45wOuTjgLdX+Yn/POMH84AdGvBTK0VsSmkWD848HhoSp9HpeVc4Qybto7jiFuEnrodVy8aXuvUvJQ7RPqEk5bckagEYy3BtRN1sV4juCj6YIPjmA9XKv1ZSCezkd39eQUyqhyiiYWpeRA8I0gGHv4kzgxzrNdZ0KnwjsmvbNaZ1oxaeuk0WT7VfDBVZo68QfjyLP7DwYMPLs6ocWvB+4N1ixcvw/37D0E7Z23opCoLPeLNAXsE9mjddl4KiOhSYFtUI5ImuDoalrboaa0jvZH0khbUhlpFjvtyshyXu6/GIAPjjy/TtrHAbPq3MN4L2V10NKkjM62NJxqgmNUWvcxXboaFWfBO8sE7E6gFmlNyweaSudZr+egjFyhqYwwJtBVmS2GxLkRvIKH89279D5RLV370bW8cyDuzTr9sLG+gmBspCYRYLrKyCnjclVGss9Ks3J8jgIq3/SOhp2CR+HoeCIF6wtH0UhbUhnZlmzsuTrxKBJSv7NdBOOED84a3BvxwOss8GEYDyybVmcvGhahTjh9x8GcZ5P+p078iDgulR5BvYSYa2tS7aF/l+wishybREu3WodfR2ByOc77KR8wIo6vVFz6Xk2mH9VDWwAAEABJREFUL6icLoH3QbfTpFJIErAEqCCtfbxRwBO8S94vowBvVlChNC2yI+qgCm6aYcvpvYjTGymWZEtbsuN6M/mLl7yc3gDPywRR3+OD5rhedhqUdkoje4bqbZS7kUk/gvE7lP/tQC7n0p1fFbCdjsyDsrgc+XEijV0RIE6Mc6/5YBJqcYkX7eSXS557jcFgfkZZtbxH+bzeTatBb20wvDZkU0gQ5dqi15UMas3ahM1YRC+wTDGz8Q4yzxLMGHvmi+MZlGHr6Y7S/pGYjprxpt45gg06LE2fsuwek9CAoU0G2HYdUA2CYW3RsCYZeYec5ecx2jk49tbuaARjEm7Le69Fwqt21KFHXN7NW68HwsviXEV4L0q4UR2R/vdQp/WfvH8uz840PewqDC4DKpMM84owj3FoQHEF6Y8hTZDLopBgujMiT/BOYplOptnZXT/1nJN7VzLI6aejEq8l8ioVN+H8gqsbd40qrgbHr6Vy7Mw1og6PAg5pPZoYobgsn3xxam2ZfwwO+aOitIO6F6HvEpJ88VS21jU2OtMSvRXnJr0Nvyoz6RKq3uUNy4NdfvfPb9TNQYMgbzGP3UCvm4/tzPMqHrBVIDlCdund/QTBZTQPcXqo3dsg7G8524mK6HUQ32hwS/+xTYvH8oEuubNeDkH+rZopLMZOuPJWqz/P4C1+neq3ffkNlNW+2xgneFQ07r9piu/h5bcTdijQnxV5EPYGftsuzVtzb+W/13gF5y+DghONSgDTvXpezRiynjoKZZ13Clsbm1NE7+9ySvxQmLQRsAXwj8DLgBcDzwY2BBx1aYaupYg3Byick1RiBcF22IrgqCDPb1nWqsQKBcugRZ43H19NJEdjTp8dHNhQLPMDKP9DAHm0Ab639uqvzbN8cTYiD43viFxFpVFGqCIk+2C3CW1IxbQgIXRZx5o3e8BvHOQSOHbCcXnXff8ZymQ9LSjnsB/wxH6lAsi1zGPWLgc7gLMPPQj6ngHsARwDfBY4rwfS/m6edwc2JaFmzy6n2kb4mcVpxDFyj7FmripQP9pYM3pwNI8hvIH6UokuTux3xTz8ujg81W/b00uoE/t+KpwqHPeDbBf2P++yewjl8xMmXlHl97S8ud0Bv8rIGeAToMEl0mAakiskKHgl4NQVL7tTSMmoJ5LTfWDC9sA1wJ8AhTPBwx1xjPcrfA8VeubBD1cNTxD3RjqSKSRodZajccMgNSohD715w66bpSofFe1axN8T+DzwS+D3gGWWb4PpFzwT5y/AHwDT+CG/RxJBBaVFkMuG/MzmtJ4bNhJ2FGa5xoEXiuYgULzj8q7zXkXvzCOExrcQWcMPvOTO9iA9DkS0yrqOuq89+CDuHwGNBjyL4vmU5AT2EPohOA1bej/DPei0P2oGnqxPVlBhP1T5zL9CgDvQsy/lkLnm42DJAUToKoJp64AzZPeG3ON1oCv/+qBpt8vpR4LoHvBYxcRjuEvKHJjeX1IIpyQshY1Kobw+hXcGdDG+o7swLAtjy2hHYQtD0/xKOmKBJC+OdBrtjRcuoaxO+TcBPgx8G/gN8GdAPhG9mQPP34CbAAWy5w9cAlWINUNcndpNYY1hlrwlf28TVviNBBLmOmR4PTSMzLvmewcFtQU+/cpRtx9arBp1U9xGTgH2NOh2JvRT/Og2Q1o/b+EeipckNyJqSGLr1cHRkNf1gqHT/ujMXyFeL1FYLGezWt05W/CDkfr2HWeSYZjqxbYvqmSDTKzrob4lFjxTBnimybK516ulq3dIuufrGcI7E+d1QCM5nEwh0WnsLH6xMZdQv4Uzc3OeAN6RH1tS+EvxUzmXiYaNzJvkYQdPOqug3FcClt/rQM7h2X2hJjTWTkteztAcAbofVztdQETbpCOxgCRLojrSXxKYIMCRYAI09VHQrzQpdmTtZnH9hPViupf6ZOr0S/Wij48FLq2y/CZVMpyLclXhLQoK/wmdLn03tUIblbGzRb/CaxxvoVdo+5wDNB47gjLVHuTEEkEeK4HLgAuBCwD9i/CVy7Fo59PZ+ed/NHxwk9ObhhuiGZlcM9mnU/gTgdTr1Y7McyhT6Ww0ahjJkQm8hPeWx69ZLlknTkRO9P4jAtw2ralwIlLm0djZW1dI5L4ZUDljJLyJczS9LXXprKYJniVpwamxhgdFb1zysnnAVtSxM47mmObmvMIsV53aDl8BrX4s0k+A+DsFzYtxaEiwMzx32X7xu6n7nYRJMN1r7jUM0MokFxO8ZmVTGH9Bpgxs5M6SUqN3RjETjWWQMdSDhhXOiBXUg69SPLvHEovHmbrLr7Hph6VzWSTpTHdYRv1w+pVt0nX51P3KGfUrqMPkyqhPO7iv59kZQur2obm0hjmgb+agUUtT985S09gnzPrzPFDq+uvjl8e7UQ73cvphU+0nUUhwwD2NXMskoJ/zYKnr3LlOWpuHSlU/NThazLVWnZrWUHxnkUATcrykzqv9YxHmUkgOKhTksXTFpHN93utzYtIOS6PwdUTtasOwOKnCtfDUfDwVPvE4aExp3OGgyuMh4h4DnXrtKsXeKCPvB+0UYU2IaayQGMW5tq31lYKgCS3D0roBuTWM/+mwCInCtY5KhGoBGhWSwmxB4Cz86NXJZRnK4qn3WLS2aZdfY9MPS2cd5hwQLciXfuUsz6+Spu5XrjBoELMgvxw/aB8erHR/IzV6LWKT4IRG9z5cVtNkOgnOFpC4L+1tHWe0kFerWdh5ozOk09hZPDXeRICMyt9lkoNpNMO+yTEqbei7JqPyUXn5nRDLMSrONL/LtY8UyxOXRxTmsemHpfNsk2eMhr1PHa7Fqp+PTolXBbED/anNGbt37rmPmrIcjS3tFhGjxe5xi8K6/NPzQIdTjyqmLtMZTFsjhURuHtJ7PX4u50lxr2fPhX8Qby6lOuyTEYN5T/OzVlVdon8tiHGghJfUud/Q5sDCcx2pZ3rfQIhFnxGJ5KY3UqRe6vRMTyQ5S5PBEwX74bxxTwav087rpnaBZgcXnSY0hrimCskbAFyyi8l7XBpHVQfB+LZGc56vGUdT6Hsb+qwrJDduQ/mSM75ndnIoJPcx3X/JSfsq3Kw8aNSRxLx5FcJb/km7107d8qul/73+61mnlDneHx4lVdbQ6V6Xhlkp6UyNyxm65y5zb1+kprs2vmiFRINwc3FPcsrR+UE75zdMPIjlcxtwn0yZtLF5nIn0WmiTrefXym18JC/1zdEmHZkq1MdT0DyG1/FU3ofWALXGJ7nOBi0la2FI6pmHy7I5jJA+A9lfBLroNGLw3KE3/neRviQ0RSskcndGkfPckfdntblEkkMhKcBc6oFd3XAMJG4LOMLcAH9LYCfgAMCr84/H/yDwKeCsRXASv33vB9O8QPJ1/Pbs2frdKNk8FZ5hyqGQfsIo2hnvfEYZH1LPjiT1cuhPvXQm3jqQekTvHqGzyDp5144DfzRs8NC3M5Ha6VqIqBx5P/R5X1wL2U0uiyYKyeW6JulHlVoroNaWuhCsCrAcZuuOaoRRZc3yjjLdGrg78GhgG+AtgCfTtVp0+UlrK0eEXjTpxZia7nsPobdgbA1R3uw7CFpS+t6vXHpvmWvu3gGYQ5F7dgsSwhzlsx61ltQPSzw+divCnDJ4V1tqYwZLN0nzYC1NpSEVWL+5ZI9Ld0dBaJuDYbIb6T7P238CZt5FVSqdxnRR14vX5OjxjAYGBHnNVPHRvDLIO5riMVSn1DLLUVf128Sh1MttAG/fdbDgCW4PPjrFP52svOvKU/8KPOvPTk1wJ13shq3X7OTa02xFIVEbWtelVvKarF9J21htEkCZXN7HS+acITnwSIawjwi54yz4rfxubUBMXqPcdbz00mhlCY+z7RRMMSX0tLRr9TFpx6VxNNX2QbVcCkmlKowrc6P3CJnbA94f5m3lXtfiDegeHuyawUHdcsYumbi3YF3WzSckXq4rZhbT8AwCFLh4yZx8OQFsKtVJwL7kndrFyq6xdKCUnB15rVD2vjuGGA27toOe1s6/jaEn++vYSvWiwFwjUS9MTb3mPI6RCrEcMyQbtDAu/+D3KKAVwNqAX4d001gLqseAyHJ0efYDiWNdLM8UvDk2u51hxCrJsYXtR6Aurben9H8n9u3rziAnAeadsjjWR+5rnBwUn5iS6EBc7htpNOadg4FJpzd6cEPpdZoclz32uagxg9Pm/u82/FwK6UZGN8nLQh243+UXHL2t2X0dD/UqzNrgVRt5uM8Vk4/C1rqMSTsqjbP2qH2tUUgr3km/dVvxqgQNcMA+lXUJi36rQvAeOpe9B7Ju7dGPnJ4CHZa1tUwnnVGwQoJgR6Guc/OY3Lnf0qapd78AHoqN4UU//TA/6VQbReQegFeGeF3Pc8k0x+3koJ248zqXGCLuRKIc9ahCiqUJkmo7Tb39uGLtBMs0ospCWZG1+CiDn5CBBjxtKwUNjt5I/lmVLmVrwYVlEdN5FYK5zp64LOJ5ibBSNI+tQmqOZSmGJAoJRXQrYEPQ21C9GSPXcilZdMLZDmII8eaQHDNFZ0eu58fQFJLGy1Qd8IWkWY5x21iy6/P1Ezy4J4vXinNGthXKqGs3oLRS+BiFpDJynyIHgdeA1MaG16rLNSptvBGOIlJA+e0hD+w9vFWuTCYzR6OOTGNyd4YUk25cmhsQEG2MVjeAEOsbr7gRHLAuWtlnpt61+NQoI/uMjPKqhLSo0/CEn8vPxSgkv4SY2gqoz/mraQBauPR/t+WnNrOVbpcVGs32esrI6/E975Pjo3PS2UUYtmE9jtZcM0cHSuPyTvHeQ70p8Mw6jjYPKcvLK/nnjeB42ZwDsWORf54VzJZJ1xHHKKSHUKgcyyIqIs2WQd+eQ+hbFo0CUmfqTM9DdlF4ocu6OZbEmnP7zOOycHZMP/4XU1iX7GLSjUvT1oWk7iGNo6W8n5uLnUHH8s426Xkg/Vgc49Iphzan3y+ngecSnsQIugcuwZImwBmFNwOnwVYfi7O9HEt2KiTXg+tT0otJo7Rx+iXL7QmKqSOSTa2z02vGHlSAHs+8ziooXc3I360Zr2m0HCbrTWnqYnpnLG3StR6ZeY7LfsljJjc352c1Ds2GfQoQxwi75HdI9fikQnIU0vvZmuetwTkEgTO+YIWEYLVOdqb03qmlGTCPy855kWlMoXMppOxr+tS7txnk2puN4WWX07Q1QJijXjTD9w45bzjJzRP7/g7k6bZI7rw6iV8G1CYMRikgc63TOzKO3TuoXYaKiG4i5zi78kfWg2PKo9GIZxCcuVWQmzzITVvp/DaYzwU8DOjHyrw+RXD/6kOEe/u636fyg3zeBqHlmXXGq6ROC7uYg7GOXpN+J2egVJZ14GeWRwdG9q8syGcMaSsKCXnnAMH236aC0Ir5NPKe1ltWGjW1IIVETsZ3JMdjcqcVSw4BN45QG10Os2/ProzLe8F7GqHK/sMEKpzwmrihaeWxe1snEeMVgKbGbqavw/MWgCjZj7QAABAASURBVJer7oYy9RyEsDdhOwF+MO6Z+N4G4ajxBTyrzPCSOvePYr+BlWsPpg2FpABqaxCStMJaRqYlWurvKy0pAn1RWachg+f9lrzPHGBffCU0OMjKnFW30Mv0EIocwSnAQ9LUjeuSncKybvxU8e4HohwV70gf1EFOoe96dVCimpFdQvTGZ292WBuFo3nph/EvAW4G/gas7MMgzn5YzzeegwfrK7T9DKId9qzAcf9t2Pth4blmuubXhkIynwLjOeByrjP68TGbxXgeyfcBcrRx0I50yiNXJ5bDMY8FjAhltgop1+hdRWdFLCCwhR/3JY8c+SpYQV3PMRrS0m//erGDY6lAXk6qDVAqJwApDnmuDj6VAF5SFztDcoaRo226fxSzhJiUKQXZPAcupf3+dv5Xhgf6oisG7wd1rtUgUI91Lt0dCi3LatYcqpDGcrFBBJVdDsUwjiSXeXLkGzpD8nMeLoWNozf0vSayzohOpSPHzDyG5bcGL3IopJ9H0umh2BwCxOVNZ5cUdyqdRyneDOWzAkdSlmwOBaDZ9efI4J7ApJ3Lha6aTJqO1vIPVUguqblUk4NAafGzFjlwj8LpodgcCsmlhVH5zr+jEyhI3ZOZD0v0oDDdGAHvB/kSoZxHI9/mfyR8iD2Bn0shybupVkjU/8EzBBclbGsLUNEPXaVxb9WzlgveTeiHMtEPazponhAJ7WZrgUNydISd65JJaXlsCDGJ4t5zLhGiRWhqKyTSrQVsDKR0LjO9BkGUawM4h6m85Y9VSJrlqtjFkRJUSLb7lDircLmMGmvMUYWvhIVzwD2jbUiWY4AK2ijnqokXKkclnrZEKoEQmh0pKuhC0tSN65KdFl9146eKl8PCTtoUZPp14DlEcnSGl8x9HkxnA7mcxiA5cLvEGINX0/3UgsQVgR+h1PVjaApJozKyf4WkqRPXpdU68ZZ1HGZHW8EAb/bG65x7UY++zhGWmqAghUTHtMOE7o3UpVlhsg6MVzHVTZMiXq614hCFtBEFsfx4SZzLqhovKOSSIBxEQh1Ja45PSCv4Y2dIqw3SmOhZetqw6Jqjb2lCn2Ow9yDqa1ltjIfWPfzRmu29pNMwBq9zzn2tI6FTv3PEpSQoSCH1Mo4dwfaSj/S8OqPtRpFj6UmrNq3FRhbWlzQyLcPsEP5MBX7g7kupkFXgkeYcnUOB7KHbiizHBmmlODZSRATLGpEsKkmSz5UsytkBV5klLWJK/yf9z7N/H+B31/dpPPR9NPQ6GITc2XQxCin4OpwA1mnq6MHLgCTxUalcrcRskPFIqlO6z1bX7FthkVopallVN//qEowOda+mawopNQ/lgJ2/zQFSjsGeinpdC1NgIQfo/8q/dxG6KdB1J63bQaSHZvFm01nIoJIR2YsNXRLiMblzue4QGoqCIDnyCoQqI4VrxatGQSEKSUGqhVijDBcl9jMefjNmUXCyn84acikkz/3EEKrgjUk3Ko3tcI0W22MOAxTLsE2LZRjFz6698waSl3WNqBH0KKvOoC414BkRbXpfxSikyyhuTmGntdna5NGGy6WQtJiqe7pfK5rUa/yxQr0uzzXAsHPUjV83nvsowXs2dFBnurmMLLzHTPx1y9Aknl8EzmHR92yIshx4xckB2szj8Q8HHATjTY1z6W5n6I+R3Z0vZEyhrqBUwUKDNHWdwu4NMNxReN00sfH8fk4OwfpLNqnrKm2XKWPpH5ZOHg57lyLcT5DEtJ1xeV8P3zQkGBdv8XsVhjdHLA4P/F0Z/YmE5mgjoF3ivLzW/cclLxoGaPBxAH0qR501JK395PDBwcunydn+j5fcKSNzfbnAGe8hUNza1gZ5teZiGqgd5sLMFHo6eVsajszPmZXKIIfwDtmczvE5j7XgnUI6F+88wJyjbn4cSbAzTIVMZPKRyVwK9HqpkZESvXSgF/wtqJp5e/DaMzY1o89mNPqFfd4LjHPVqXW4C9w7AIgZXJFsrHOJ/22Upc39zbFEpYgQrJAYwWr6/e8pMh+BQ2Hnte9PGxEnxSsPpKbAsxhHiELK0Whd9tS6ajFdqX7LN+soFb4+nlhh7LJLDjP0Pl1e69R/zub3+talmTJQeGmltSGCLEfdZSI7HVrK7arL68H4VCCHc7lVRfRVkHsG0CVYHrO4zcHq/ZR49dw0xApWSL1CaVLsPknvZxbPg46n0oieDShwcmTiJYo58N4QgDTWzHlUFiqjneBbLsHjHl8O3CGKfLD8GtnkbI+vhpdtXSfzMQrmoA8vuVNpfwGsm1Ge2L5P8ulzlNf2+iIo3w/wGS+587thJzKw8NZ8rVxfQw45BpygnbP+DqRcuWSYebQOFiomUz/mdnFMwsA0CtYzSXM4jM9h1ZWrMkOUTKwQhi0jndegJP+UBfVgm1Gwjcw88mXskp0HgEMOIoeS520e76DsOdrgYlr+g4CQAQ3Rg5wzJS8P3a+l8gwljvxXALcF7go8Hsg18JQG+8L7eLD94iV3ysR/QhnZFvvIne16Y0r/d2rfZeojMvMtNc0j8UVVDkx3ROrJ5pHIE710f2AvcP0AxjvqT7nBrMUKqJM715HrIlX4eCC0bvy68dzIPgueuSlfN02deAqNu8zViRkeJ/YcjkLgmvDsglI8n9inw0+VE495HH3LQ83n5sE+j9U+dSi/LqM8LwRyzRjIYqkjvzsALscfwVuPkXg7x3/y/EIguSMvV1tOBnEuIwYtareg7hbcYsNvl/D8COZN5J3LbQniLHwDb+suSiH1qPwifojgJXq0s8N4XudYMFxLA/sI4FLe6vi1y0DcWwP3ANYFnE67OQ/K5C5k1qNCytVgtTz7N8p6GJBKkMpvN4aTMw2EIRfSEv0W1+v4V9/yK9t/26Bf1P0uvDwF2Ai4FyA/lmRK+B2B+wHrA3sBDg4uxq8zyzoRhAozvGzO8tj+TyOHq6DrYGBNIKkxDPjuBjwS2AH4OPBf5GebPwf/tYCrFO7tCPvw3gEPwWkc+CyP/Mxl9u5gUiMsb9ZfQjRt00GWS3m5lu5WDS4oZ64+uaRMOQMqO1PNDF2W8quGNaMniSa9ClkbwGfA6JT4W1TGOcBJgJu2TmEH4TjCPwpoUrsqPum+DnhCWyXHY3IXoqjtnI4QkxPRQ6hFjuvm34QHpwFbA8GzTNK4vKLw2B28OfjmYeIFI0zyCXHXhkSOjKsQt+wvJb37qN/CvxzenA+cB5wLfBnwpgzfCV8jzlGAF+h6yt6zb/wc6WyfOZd6BjNXoKmY3kigdKs0bSf/TDk2AWw/vBrtiOdA70n4uwPHAGcCLuvLAz8Z8UEwuIfzKHxnKubL4wLnbf/yd0Fg7A/yt768KdtzWD7XRVU3nkrmOCKfjeLxmcdKp5l2zhtu7JfvobzKx0oCpiUwugC9CnDkUevOtgwMcSSlyfSjwa3FiSeu9+TZvZNB2JmwFwMuERhXc087Q44GSjarXG0FAx8dCV++KlW+f5bVK4peQhanAz+k8SpEHem7N+J+gofttiP85YAjVc+tHMXzx4DzSWOH+g6+hwlznBS3HXmkgCyi3FWkcikZrxXnyNtvQnn/orfUP5NcnwV4DY37FRpBOCs1nvzn1Zxtdn0fRgFtwjNsLme5FDkqasp30qiyVGnaTt4Gcg0gbqD+XS53ee8ingdB5XUdYS4z2j7c/zqGdK8G/Ljc4/Btd84Kxc/Pkc4jGPblkZHqvIQm89uauMoE64DH5E5r4wOor5Htjve/IOf3ALmMVSzrtuDXuhZvel20QuoV2RGt026Fai9o2XvOeEIFq6PhUSOslExVGTsKVYg60nf29A4ycKTnOrtnNBSGCqS9CbehG9fLJ51ZKVQJTu7stN7UEIvYGVLIzDQ2nybpFBwKyTo4vkwkVwHwJuKUDS6jOfhQqXgQ09sNBkGF4yFp9ytVOsZv0j7kzy4okyY4+szywmLbsnT1w1L6GtG8CmXjzL4OXo+xOFusEzcmjrw/Ft45CIpJ34k0NrpoQqgMhahCLKe9fTR9E0roUuYCBV2DDtfTTVcj6sxGcZQdqsgHmSH/XOoaDOvis/spYwUufcvZ0T9TAGeOeMvGqUg8jBxdYISy1rkfBUGufRXb6V7U0XfJo5YjrrNeDUlCZUMt/L1I7pPtQfkbyfUerol4jQmH0U5Dd4B6BQLesnduzNv4QhihEcSnQhLMYNxraEsjlz5GlbmXVrPeUdG68E6LL5emxtJCmTTUcMnJPjY2/oxEcITvUmhUcRDG8tYZvvtRUThqJDqMOF49hBfkPMLiMmhQosDI+xPfmSve9LnGCski9zrOvjyHCmKSzJzzLI2j29oFg38KYvfj6k7/a+OeooguuTUl9ysgyH2xLFk0ci4hhexpaAXnvl+jTPMlzoJZI4tgxCgjl/y0nnUpOjh9zQTnEe8w+qyrQzzWd6RRLniTg/29fsKwmJ4z89ymijksZQdiJ1FIvXKcgu++A96ydr+g4QU3Vjjm/YDykMdl6VJcRqn5fO4O37RyNBxwvb8WHtqSs6Mdiew5Hbxl4dyziimoZvlvImFKuQa6eedKxg7USZO9Tg2Yjp7HmOfBPd9X5UGdF2uyiqOS1PpujjudzUt1t7HXtrAbLEaPf64xe25h8NVyeXZ5qlFZ4aEDATeytQZshKtLiSmXAtCLUbV27BJpuWh5KLOdsftsg5kTX6tGLfw0whh8lerZw68voC4a9U/Su4cknTn3BuXdvvDEOydTlb8VPMkUktTCbDvOwTy/E3BkhxfkZiFytKUX/NNyx9GwjXYWeBFSBjt8SPzKuPDQZRF5qJFEZZxpDKRcCkKXorS+U/FOYzHq0qxFZ23ZhOB1eeoEkHseBy+5s00p1zxTlgK5H2J8O4hy1qPnNT3SUZuP0DNxl5xYOo5K6UBK5q26OS+8JItOuqZ7GJqAu5GtJU8nC5iJKC+jTIKaNvgNELl018X2J01RAw7K5W0AnqlzTymnMIN9E3V+tLKWbEIZeYxBk+pcZ3Dks8YIR8F/nxszpofHYxYaQDXGNwKBZ7o8jDwiSrde1ar0UJJhuMYNzpL8Bot3jCWpyFA6JhDfZcvoGZL0wjtnll6R5PmgZEJa3B2HJDOkgTJ+gGfNprtjKAJBuGiFRNo52ofn3Lbn2f3a1DwDbSecxgljCUEZKb/8NIiH330emyYigns+njeyX0Ykr05CPTqD1yLO2Vd1pOahzhy9vcZzYs2xtYAhVyXacbyCXYsUL/f0Sn3vfGqhSBPNwjI2FhI0Vnn3bkrioVQ3UmddoTtjcGZNkdM4eOjgwNPxXm7pAe40iJtj0fDCAVs0Jsrm7NmrfjYCSds3VJBlZ9yGUOJMI5ccczCzM/yO2heGtnHOs1LeEj4uXpP3nsl6H8o7xLKzSX6N0uaqyHmiqExnDN4959U9jjbm383ggwop2WYlvPPWZ6+m+eQM8mqwSJ7NSD5ShH8q9k+QkbcMeJ8ajxN310JXI4VkCcBCefY0AAAGv0lEQVRh2exPXofl8mSydif+rgMC1n0mB7rOAnKQ64DmdfA522FrcJuH1nAOMHKUQZzONr0KKteSpnkISSC7QpJKGG/n+SrPjmg0zfTKeSuDoJlxChkFRNIDwvDOK3VsUN6R5uWws8I3l0AcrHhJ6ZspZ3KF1G9Z4HbvRVPYrQiz7U1qxmm+9gPISOMom3xzedxLS73E06WgNMjbx2Lbtv98lqxtH3hLHcrIszYeglYpLY2QJsQlXw0l0mAbjkVDibOHv072xkumPXScDGEORK0opD7hdJ7fAV6T4ynqzQh3SaXxEhd4JuHsPCqgI8ncjWYv1Hwm5Uu69ARulz//DF4PfT6J3/LteHz3IvCmyrn/YUd/OVQ/AfCqk6dStuxXT5HHH4GzyHMDQMX0r/guFeK15lRIGq0kzZByOeDzQLZncFRM8tdzbeaXNK8MyKTR+nfP1EGDXyN+E2UaVTdvgQ5vT8fL4lxGOxAaHGRmyaCPlDws/5v57cATL5t7GJhfizJvVeaTZ5CbCHFUgsJBAevlnS5Jac7qiXTNIRX0QYXIHNmOoTWMHVxh6knwp5OnJqYqiP0oz8eB7wA5p94qpj+Qh3zzExAu1ewEHVoAKYx47IyzDlU+jv7cC9sOylTYCps9KMPJwDeBGwHj8nqhy/WL/G4CHJG6GW7bk4cu632PPFMLoH7b8VCrhyFt543PW0FnpaNcKqaf4Hu/5FOJ5B6T5sq2XfeuCJq4cwbnZy7c+7Fd2CZczj8Cur8GjDxYjkD1Vv89KIVLUXjJnUuf20JHU2vZEMI8N+c3k0LShMaVX16E3emlu4kopD4nqfS/AD8ETiXMzurV/Haig/jtTceOVGwYzgZyCS5HKO79uPGtEHVZzJG0Mx/3vpzNeTfUJtC5C3AM8AXgB8BvgVx0wYJqR57y7fv4fmNGS0aF/ZOJ7aFkDUlclsrJN8vsTFCeaXRxGXk78neJQ2GhIYs0bQaNewIfAS4Ffg0opIk+WQcdfwK+B3wQ0DTWmdO6UGU7tO69W1DlfwVhflrBtuHmtiNZwWfDHKx4yaZC/3PE9bYNvxPmMqv4vB1bPngZ50fJy7ZGtLyOfFyNuADf0bezaul4JbmeBGgWL+2uTgxdGiNejLNtODBTsMsb+aLCVzFqhmx/ehJ07QrYLq7Cl1b74cj8UEYqL79v5MFPBw+pQaXtkQvrfCQtKV9Sfnnm99k8h5i6TIP4NGzwQ4wueaYsQjJcE1VIg6WgUhzdOTq6kOdDgOcCzgJc1rEhOyuwoyv0HOHa0BWECgNHndeDrwq0QjKOV7+7sa3AtoM4QhPfXqTzFLyK8IHkuR6wFeCG5mn4znwcyXdCkELrAgd9fwN+CnwJ2B/YHLDjOvr3w2S7ksByOrtTyHra3w+nyZM+ODtQeOj3w/SN53KKa/oOGpztuCxkXTwPvO4JPoj8Hgu4XLkj/vuAi4AbAPc3iNZ9B62/Aq4ATgWs++fjbwo8ErBdeNDQTy0oUP1mkOVenXdrAI8ANgSeBbwMeCPwMeDbgHUz0bYDDa5IXI3/IWB7QOW7JrXyFMAZou2j36/cxHcg6KDGvbeqPmV/s318k/TuiXnRqCN897DcpPdz7w7iHkBe8uVF+O4TnofvAFQhSdJg54f9HOU7UMwBzoxOgcaxyjGY8gUJKn+4yuHgMke5BnF6S4RntyqJmHRgZxTSMEbQOH4GnA8cB9jRFXpb8qwwtNE7ClVIuHZeBb4zzuNJ8wRAgW0HcYQmPmc8ZxGu4ontKMPIn1g45VGJfhn/eMByOrtTyP4Dv52JypM+yCN5p6Dth+nLL0ezzyHNSwFnO2/Bty4+h/9dwNHwxMrZZsaWFfgRcD3gDLHN7JPmJf2AA4cT8W0f/X7Vn93224TtYhAc6PTbyfqkdeVga/xXAgcB7wfOBZzBJxXs4PwGcEZGcLCalM91kVEmB+SX4Ocsn7g/SR6ubNQlrdV4nVdIo7gBY/8KOPpzyu9yUBW472Kc1EsTo0jr/Lse3+SL8Ht+u7fS55VhQlKB0nmmFAJXcYC2oBGN9X8zz4v7lO3E9uJ7l5pWpSn/CgdScGCqFVIKBswAjlKEwoHCgcKBmeBAUUgzUY2lEIUDhQOFA9PPgaKQpr8OSwkKB2aXA6Vky4oDRSEtq+ouhS0cKBwoHOguB4pC6m7dFMoKBwoHCgeWFQeWmUJaVnVbCls4UDhQODBVHCgKaaqqqxBbOFA4UDgwuxwoCml267aUbJlxoBS3cGDaOVAU0rTXYKG/cKBwoHBgRjhQFNKMVGQpRuFA4UDhwLRz4P8DAAD//yBbH8QAAAAGSURBVAMAL8/F/aFBqNEAAAAASUVORK5CYII=" alt="Datex">
|
|
168
|
+
<span class="rule"></span>
|
|
169
|
+
<span class="kicker">Studio CLI</span>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="glyph warn" id="glyph">
|
|
172
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" id="icon-warn">
|
|
173
|
+
<path class="draw" d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/>
|
|
174
|
+
<path d="M12 9v4"/><path d="M12 17h.01"/>
|
|
175
|
+
</svg>
|
|
176
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" id="icon-calm" style="display:none">
|
|
177
|
+
<path class="draw" d="M18 6 6 18"/><path d="M6 6l12 12"/>
|
|
178
|
+
</svg>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="stagger">
|
|
181
|
+
<h1 id="head">Sign-in didn't complete</h1>
|
|
182
|
+
<p class="lede" id="lede">Microsoft turned us back before we could finish. Give it another run — if it happens again, Datex support can take it from there.</p>
|
|
183
|
+
<div class="term" aria-hidden="true">
|
|
184
|
+
<div class="row"><span class="p">›</span> <span class="cmd">dxs auth login</span> <span class="caret"></span></div>
|
|
185
|
+
</div>
|
|
186
|
+
<div id="tech">
|
|
187
|
+
<span class="code"><b>error</b> <span id="code">$error</span></span>
|
|
188
|
+
<details id="det">
|
|
189
|
+
<summary><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> Technical detail</summary>
|
|
190
|
+
<p class="detail" id="desc">$error_description</p>
|
|
191
|
+
</details>
|
|
192
|
+
</div>
|
|
193
|
+
<p class="foot" id="foot">Close this tab and run the command again. <b>Nothing was changed on your account.</b></p>
|
|
194
|
+
</div>
|
|
195
|
+
</main>
|
|
196
|
+
<script>
|
|
197
|
+
(function () {
|
|
198
|
+
var q = new URLSearchParams(location.search);
|
|
199
|
+
// Tidy the error params out of the address bar (only after the query is read).
|
|
200
|
+
try { history.replaceState(null, "", location.pathname); } catch (e) {}
|
|
201
|
+
var t = q.get("demo_theme");
|
|
202
|
+
if (t === "dark" || t === "light") document.documentElement.setAttribute("data-theme", t);
|
|
203
|
+
var unset = function (v) { return !v || v.charAt(0) === "\u0024"; };
|
|
204
|
+
|
|
205
|
+
var el = function (id) { return document.getElementById(id); };
|
|
206
|
+
// The slots are substituted (HTML-escaped) into the DOM; reading them back
|
|
207
|
+
// keeps the values out of JS string literals, where escaping rules differ.
|
|
208
|
+
var code = el("code").textContent;
|
|
209
|
+
var desc = el("desc").textContent;
|
|
210
|
+
if (q.get("demo_error")) { code = q.get("demo_error"); el("code").textContent = code; }
|
|
211
|
+
if (q.get("demo_desc")) { desc = q.get("demo_desc"); el("desc").textContent = desc; }
|
|
212
|
+
var cancelled = !unset(code) && /^(abort|access_denied|user_cancel(led)?)/i.test(code);
|
|
213
|
+
|
|
214
|
+
if (cancelled) {
|
|
215
|
+
// --- STATE A: the person backed out. Quiet, no technical detail. -----
|
|
216
|
+
el("glyph").className = "glyph calm";
|
|
217
|
+
el("icon-warn").style.display = "none";
|
|
218
|
+
el("icon-calm").style.display = "";
|
|
219
|
+
el("head").textContent = "Sign-in cancelled";
|
|
220
|
+
el("lede").textContent = "No changes made, nothing to clean up. Run it again whenever you're ready.";
|
|
221
|
+
el("tech").parentNode.removeChild(el("tech"));
|
|
222
|
+
el("foot").innerHTML = "You can close this tab. <b>The terminal is waiting.<\/b>";
|
|
223
|
+
document.title = "Sign-in cancelled \u00B7 Datex Studio CLI";
|
|
224
|
+
} else {
|
|
225
|
+
// --- STATE B: something actually failed. Keep the detail available. --
|
|
226
|
+
if (unset(code)) { el("code").parentNode.parentNode.removeChild(el("code").parentNode); }
|
|
227
|
+
else { el("code").textContent = code; }
|
|
228
|
+
if (unset(desc)) { el("det").parentNode.removeChild(el("det")); }
|
|
229
|
+
else { el("desc").textContent = desc; }
|
|
230
|
+
}
|
|
231
|
+
})();
|
|
232
|
+
</script>
|
|
233
|
+
</body>
|
|
234
|
+
</html>
|