@numairbaseer/scifcode 0.1.6 → 0.3.0

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Scifcode is the user-facing configuration wrapper for the Scifcode coding agent powered by Poolside Laguna.
4
4
 
5
- This v0.1 is intentionally small: it installs one global `scifcode` command, configures the Scifcode runtime to use Laguna, and launches the coding agent with Scifcode defaults.
5
+ It installs one global `scifcode` command, configures the Scifcode runtime to use Laguna, and launches the coding agent with Scifcode defaults.
6
6
 
7
7
  ## Install
8
8
 
@@ -21,23 +21,68 @@ Supported runtime packages cover:
21
21
  - Windows: arm64 and x64
22
22
  - baseline x64 builds for CPUs without AVX2
23
23
 
24
- ## Configure
24
+ ## Offline install and update
25
25
 
26
- Scifcode does not store API keys in the repo. Set the API key or bearer token
27
- for your configured endpoint in the current shell:
26
+ Each `v*` GitHub release includes platform archives containing a standalone
27
+ `scifcode` launcher and its pinned `scifcode-runtime`. The target machine does
28
+ not need Node.js, Bun, npm, or network access.
29
+
30
+ Transfer the archive, the versioned offline `SHA256SUMS` file, and its
31
+ `.sigstore.json` bundle through the approved media process. Verify the signed
32
+ checksum manifest and the archive, then extract it and run the included
33
+ installer:
28
34
 
29
35
  ```bash
30
- export SCIFCODE_API_KEY="endpoint_or_modal_bearer_token"
36
+ cosign verify-blob scifcode-0.3.0-offline-SHA256SUMS \
37
+ --bundle scifcode-0.3.0-offline-SHA256SUMS.sigstore.json \
38
+ --certificate-identity \
39
+ https://github.com/numairbaseer/scifcode/.github/workflows/release-cli.yml@refs/tags/v0.3.0 \
40
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com
41
+ sha256sum -c scifcode-0.3.0-offline-SHA256SUMS
42
+ tar -xzf scifcode-0.3.0-linux-x64-baseline.tar.gz
43
+ cd scifcode-0.3.0-linux-x64-baseline
44
+ ./install.sh
45
+ ```
46
+
47
+ On Windows, extract the archive and run:
48
+
49
+ ```powershell
50
+ .\install.ps1
31
51
  ```
32
52
 
33
- Scifcode uses the project's fixed Modal endpoint:
53
+ Installing a newer archive performs an offline update. Versions are retained
54
+ under the installation root so an administrator can restore an earlier
55
+ version. Unix installs default to `~/.local/share/scifcode`; Windows installs
56
+ default to `%LOCALAPPDATA%\Programs\Scifcode`.
57
+
58
+ The release workflow signs every offline archive and the release-level
59
+ checksum manifest with a keyless Sigstore certificate tied to the tagged
60
+ GitHub Actions workflow. It verifies every signature before publishing the
61
+ release assets; no long-lived signing key is required.
62
+
63
+ Publish the matching `runtime-vX.Y.Z` runtime release before tagging the CLI as
64
+ `vX.Y.Z`. The CLI workflow downloads the exact platform runtime package pinned
65
+ in `package.json`, compiles the launcher, and attaches the completed offline
66
+ archives to the CLI release.
67
+
68
+ ## Log in
69
+
70
+ Authenticate once through the Scifcode control-plane portal. The CLI opens a
71
+ short-lived authorization page and receives its own revocable session after you
72
+ approve it:
34
73
 
35
74
  ```bash
36
- https://danishshaik--reservoir-vllm-serve.modal.run/v1
75
+ scifcode login
37
76
  ```
38
77
 
39
- You usually only need to set `SCIFCODE_API_KEY`. The provider and model are
40
- fixed to the Scifcode Modal deployment.
78
+ The session is stored at `~/.scifcode/session.json` with owner-only permissions.
79
+ Scifcode uses it only to authenticate with the control plane; upstream model
80
+ URLs and credentials remain server-side.
81
+
82
+ The control plane defaults to `http://localhost:8080` for local development.
83
+ Self-hosted customers pass their URL once with
84
+ `scifcode login --control-plane https://scifcode.customer.example`; the URL is
85
+ stored with the session and reused. Non-local control planes must use HTTPS.
41
86
 
42
87
  ## Run
43
88
 
@@ -64,9 +109,10 @@ This happens before the runtime launches, so no separate initialization command
64
109
 
65
110
  | Variable | Required | Default | Description |
66
111
  | --- | ---: | --- | --- |
67
- | `SCIFCODE_API_KEY` | yes | none | API key or bearer token for the configured endpoint |
68
- | `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcode-1.0` |
69
- | `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcode-1.0` |
112
+ | `SCIFCODE_CONTROL_PLANE_URL` | no | `http://localhost:8080` | Alternative to `login --control-plane`; useful for managed installation and automation |
113
+ | `SCIFCODE_SESSION_TOKEN` | no | stored login session | Ephemeral process override for the control-plane session |
114
+ | `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcoder-1.0` |
115
+ | `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcoder-1.0` |
70
116
  | `SCIFCODE_RUNTIME_BIN` | no | installed platform package | Override path to a compiled Scifcode runtime binary |
71
117
  | `SCIFCODE_SOURCE_DIR` | no | adjacent `../scifcode` | Development-only path to the Scifcode source fork |
72
118
  | `SCIFCODE_BUN_BIN` | no | auto-detected | Development-only Bun executable used to run the fork from source |
@@ -78,23 +124,25 @@ Scifcode also loads private env defaults from:
78
124
  ./.scifcode.env
79
125
  ```
80
126
 
81
- Shell environment variables win over these files. Keep API keys in the global
82
- file or an ignored project `.scifcode.env`, not in committed source.
127
+ Shell environment variables win over these files. Do not put session tokens in
128
+ project env files or commit them to source control.
83
129
 
84
130
  ## Troubleshooting
85
131
 
86
- ### `Scifcode requires SCIFCODE_API_KEY`
132
+ ### `Scifcode requires a control-plane session`
87
133
 
88
- Set your key:
134
+ Log in through the browser. If you already have a portal session, you only need
135
+ to approve the CLI. Otherwise, complete the portal's email verification first:
89
136
 
90
137
  ```bash
91
- export SCIFCODE_API_KEY="endpoint_or_modal_bearer_token"
138
+ scifcode login
92
139
  ```
93
140
 
94
- Then retry:
141
+ Inspect or revoke the current session with:
95
142
 
96
143
  ```bash
97
- scifcode
144
+ scifcode whoami
145
+ scifcode logout
98
146
  ```
99
147
 
100
148
  ### Invalid Scifcode config
@@ -111,22 +159,24 @@ If this file contains invalid JSON, fix it or move it aside and rerun:
111
159
  scifcode
112
160
  ```
113
161
 
114
- ### Modal A100 endpoint
115
-
116
- Scifcode can also point at an OpenAI Chat Completions-compatible endpoint
117
- served from Modal. See `docs/modal-a100.md` for a Laguna XS.2 vLLM scaffold.
118
-
119
162
  ## Security
120
163
 
121
- Scifcode v0.1 does not store API keys in the repo. It writes an environment
122
- variable reference such as `{env:SCIFCODE_API_KEY}` into its runtime config and
123
- passes the current process environment to the agent process. `LAGUNA_API_KEY` is
124
- still accepted as a legacy fallback.
164
+ Scifcode never receives the upstream model credential. The control plane owns
165
+ the model endpoint, model-ID translation, and upstream authentication. The CLI
166
+ stores only a revocable user session token in an owner-readable file and injects
167
+ it into the runtime through `SCIFCODE_SESSION_TOKEN`.
125
168
 
126
169
  Scifcode launches the installed platform runtime directly with argument arrays
127
170
  and does not use shell string execution. Bun/source execution remains available
128
171
  only as a local-development fallback.
129
172
 
173
+ For usage analytics, Scifcode snapshots the Git working tree when an agent
174
+ session starts and reports the aggregate number of added and deleted lines when
175
+ the session ends. The snapshot uses an isolated temporary Git index, so staged,
176
+ unstaged, and untracked work that existed before the session is preserved and
177
+ excluded from the count. Source code and file names are never sent to the
178
+ control plane.
179
+
130
180
  ## Third-party notices
131
181
 
132
182
  Scifcode uses third-party open-source software internally. See `THIRD_PARTY_NOTICES.md`.
package/bin/scifcode.js CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  import { main } from "../src/cli.js";
4
4
 
5
- main();
5
+ await main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numairbaseer/scifcode",
3
- "version": "0.1.6",
3
+ "version": "0.3.0",
4
4
  "description": "Scifcode: a coding CLI agent powered by Poolside Laguna.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -18,17 +18,18 @@
18
18
  "bin",
19
19
  "src",
20
20
  "assets",
21
+ "sbom",
21
22
  "README.md",
22
23
  "LICENSE",
23
24
  "THIRD_PARTY_NOTICES.md"
24
25
  ],
25
26
  "scripts": {
26
27
  "test": "node --test",
27
- "lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/constants.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
28
+ "lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/code-usage.js && node --check src/constants.js && node --check src/control-plane-auth.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
28
29
  "prepack": "npm test && npm run lint"
29
30
  },
30
31
  "dependencies": {
31
- "@numairbaseer/scifcode-runtime": "0.1.6"
32
+ "@numairbaseer/scifcode-runtime": "0.3.0"
32
33
  },
33
34
  "engines": {
34
35
  "node": ">=22.19.0"
@@ -0,0 +1 @@
1
+ 0cffa66b37db6ac57f8674c4333a7d7538f1fa8c1290073b53f5daaf5e45bc78 scifcode-0.3.0-all-platforms.cdx.json
@@ -0,0 +1 @@
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"2670340931","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788228290","inclusionPromise":{"signedEntryTimestamp":"MEYCIQCNThOoX9+RP8aK+xIGZCAig0S90RsmalBfsMzZ9xtLuAIhALwurxlXxal0mHGdmIi4VXbddgFPwPkStcaOrMQGZfFF"},"inclusionProof":{"logIndex":"2548436669","rootHash":"YoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=","treeSize":"2548436688","hashes":["MHpRHAfk9ew2epuavTPtp55QwT/aYkHD4O+1VMyhekY=","uEK78hAhOJYtxzGucUdhvLIcru8aTSgt2Pvr/ocsOPo=","WKMTJCh9xSA0JlvsC2pkxsROsyTLrXOkTFJRxhF/Ml4=","xCEM/MXK/TMOydPcTPTi3HN1C/k22ZuniihkVskaoGk=","VIGKZ4THxvJ0K+6Jzw75JVxxUWl+mDau2BjSC/yRjg8=","fwEheFWEE6If6/2zr00OBc47rcn5x7UK5o/iY2kgDbY=","Dg3J/nrjcbfDFZ95U3E2k+MigcpD0rTYzyIIUzvmKxg=","DfYNZ8ZruiXAOuQwlMedsYnaK8/QftEZ+XdioF06AkI=","yxm1n7WV1D9Ocx/PAatNvrH4sPbKRT7G2fC1Tk/KuI0=","iDGA2apU6OrdVY64HuuevCjq1OLTD0dTNjzpAHUzjIE=","teOA0aoFI4b4vp2Yey4S54m0vCXTtmwt4iFnHHiCKNg=","p07sZPiNhS3OKedAe6eZnpNiY4alN/6vFHSwmzD+XeM=","0x+NthETNYNp/FuWTune0hSsB75R/jw5TVMLuguVBt0=","xyOt2GKNFZJCSWNl1S4wKoCid/PFKOYR1XcNE/ZPkJ8=","zY/PhpISrIBFRZyHncbk1o+GE9n0L8P+0JwBnaBs+FM=","88k9bhVfFtycpvkQKEbIw1Ql9DnXkT/cvWFa/NEgXeQ=","fABv5KbTDQGTSJg+5k8zHZQKwnOUQHo6srePRzgEpf8=","ddECIA46kQzLbMwjR1L9WCHUWrsqVGYIgRiw6XlG1xs=","0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2548436688\nYoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=\n\n— rekor.sigstore.dev wNI9ajBEAiB+YTa7sjFBaarIcZvV7b36/lJ0nwj/myPeMUdBCSjhnQIgMuZQ1wTHTz4vCb/hvbTruX7javMh4EvWa754FbK3MvA=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmNmZhODJkZjE4Zjg3ZGJkOWFlOTY4MWQxMGQxNjI5ZjA5NGE1M2ZiNmMzOWQzNGUyNWMyMWYxMTAxMzQ3OWMzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURqblppcWF3L1hTS0VoSlEvNmQ2bUJqaEJnTWx2R1piOWhWWWVGdVh0SnJRSWdOazBZUEVMbGRyQ1o3amdjVXpjSmJ5b0RzMURqeVd0RzQrS0lzdGlORUxnPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFNla05EUW5NeVowRjNTVUpCWjBsVlRuSTBhRmRJYnpaVUwyUkRjRkF4TkhBdlVDOVdia3RWUkdSWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhoTlJFbDNUa1JSTlZkb1kwNU5hbGwzVDFSQmVFMUVTWGhPUkZFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZpWW5aS2IxRlVRMmQ2TUZOa2NEaERTWFJCVFVoR2F6UlVaV3BLUVVKWk9XMUxWWFlLYTBkcmJUaFdZM2d3Tm0xNU1EZERNelFyVUVjeVJ6WTBOVkVyV0d4R01IUjVWMEp1WTJocVFsQnVSMlZCVTFsUll6WlBRMEpsZDNkbloxaHZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZzT1dwSENtZG5NVzVOWTBKUGNsa3ZUemRwU0hkd05tNXdZVGRKZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGUldVUldVakJTUVZGSUwwSkdPSGRZV1ZwaVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERJMU1XSlhSbkJqYlVwb1l6SldiQXBqYVRsNldUSnNiVmt5T1d0YVV6aDFXakpzTUdGSVZtbE1NMlIyWTIxMGJXSkhPVE5qZVRsNVdsZDRiRmxZVG14TVYwNXpZVk0xTldKWGVFRmpiVlp0Q21ONU9UQlpWMlI2VEROWmQweHFUWFZOUkVFMVFtZHZja0puUlVWQldVOHZUVUZGUWtKRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhZS1ltNU5kVm95YkRCaFNGWnBaRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOUWtsSFEybHpSMEZSVVVKbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlN3cExkMWxDUWtGSFJIWjZRVUpCZDFGdlQxZFNhRTlFVFRWTlYxVXlXV3BOZDFwcVZYcGFhbFpxV2tkTk5GcEVaR2xOTWxKb1dXcEdiVmt5UlRSTk1scHRDazVIVFROTmVrRnFRbWR2Y2tKblJVVkJXVTh2VFVGRlJVSkNWbE5hVjNoc1dWaE9iRWxHVGtSVFZWbG5VVEk1YTFwVFFrUlVSV3QzU1hkWlMwdDNXVUlLUWtGSFJIWjZRVUpDVVZGV1ltNVdkRmxYYkhsWmJVWjZXbGRXZVV3elRtcGhWMXBxWWpKU2JFMUNORWREYVhOSFFWRlJRbWMzT0hkQlVWbEZSVWhLYkFwYWJrMTJaRWRHYm1ONU9USk5RelI2VEdwQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacUNtUkhiSFppYmsxMVdqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUhjMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZXRkY0WW1GSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWpVeFlsZEdjR050U21oak1sWnNZMms1ZWxreWJHMVpNamxyV2xNNGRWb3liREJoU0ZacFRETmtkZ3BqYlhSdFlrYzVNMk41T1hsYVYzaHNXVmhPYkV4WFRuTmhVelUxWWxkNFFXTnRWbTFqZVRrd1dWZGtla3d6V1hkTWFrMTFUVVJCTkVKbmIzSkNaMFZGQ2tGWlR5OU5RVVZMUWtOdlRVdEViR3RaVkdkNlQxUkdiRTV0U1hwTlIxa3hUVEpaTVZreVVtcFBSMUV6V1dwT2ExbFhTWGhhYlU1b1QwUk9iVnBxVW1vS1RucE5kMGhSV1V0TGQxbENRa0ZIUkhaNlFVSkRkMUZRUkVFeGJtRllVbTlrVjBsMFlVYzVlbVJIVm10TlJHZEhRMmx6UjBGUlVVSm5OemgzUVZGM1JRcExaM2R2WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREkxTVdKWFJuQmpiVXBvWXpKV2JHTnBPWHBaTW14dFdUSTVhMXBVUVRSQ1oyOXlDa0puUlVWQldVOHZUVUZGVGtKRGIwMUxSR3hyV1ZSbmVrOVVSbXhPYlVsNlRVZFpNVTB5V1RGWk1sSnFUMGRSTTFscVRtdFpWMGw0V20xT2FFOUVUbTBLV21wU2FrNTZUWGRKUVZsTFMzZFpRa0pCUjBSMmVrRkNSR2RSVTBSQ1FubGFWMXA2VEROU2FGb3pUWFprYWtGMVRYazBkMDFDYjBkRGFYTkhRVkZSUWdwbk56aDNRVkU0UlVSQmQwdE5WRTB3VG1wVk1VMVVWWGxPUkVGMlFtZHZja0puUlVWQldVOHZUVUZGVVVKRFJVMUlNbWd3WkVoQ2VrOXBPSFphTW13d0NtRklWbWxNYlU1MllsTTVkV1JYTVdoaFdFcHBXVmhPYkZwWVNYZEhRVmxMUzNkWlFrSkJSMFIyZWtGQ1JWRlJTMFJCWjNoTmFsa3pUMFJCTWs5RVFuSUtRbWR2Y2tKblJVVkJXVTh2VFVGRlUwSkdNRTFYTW1nd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemwxWkZjeGFHRllTbWxaV0U1c1dsaEpkZ3BqTWs1d1dtMU9kbHBIVlhaTWJXUndaRWRvTVZscE9UTmlNMHB5V20xNGRtUXpUWFpqYlZaeldsZEdlbHBUTVdwaVIydDFaVmN4YzFGSVNteGFiazEyQ21SSFJtNWplVGt5VFVNMGVreHFRWGRQUVZsTFMzZFpRa0pCUjBSMmVrRkNSWGRSY1VSRFp6VmFSMFUwVFhwcmVGcFVXbWxOZWtKdFRsUk9iVTVYVG1zS1dYcG9hMDR5U1hwYVIwWnBUVmRhYWxsVVozcGFiVmt3V1hwamVrMUNVVWREYVhOSFFWRlJRbWMzT0hkQlVsRkZRbWQzUldOSVZucGhSRUpqUW1kdmNncENaMFZGUVZsUEwwMUJSVlpDUlRSTlZFZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZtbE1iVTUyWWxNNWRXUlhNV2hoV0VwcFdWaE9iRnBZU1haak1rNXdDbHB0VG5aYVIxVjJXVmRPTUdGWE9YVmplVGw1WkZjMWVreDZUWHBPUkZsNFRWUlZlRTFFU1hsTU1rWXdaRWRXZEdOSVVucE1la1YzUm5kWlMwdDNXVUlLUWtGSFJIWjZRVUpHWjFGS1JFRmtkMk50YkRKWldGSnNUVUpOUjBOcGMwZEJVVkZDWnpjNGQwRlNZMFZDVVhkRVltNUNkRTFGTkVkRGFYTkhRVkZSUWdwbk56aDNRVkpuUlZGQmR5dGpiVlozWW5wd2RXUlhNV2hoV0VwcFdWaE9iRnBZU2tGTlZFa3lUbnBuZDA1cVozWmpNazV3V20xT2RscEhWa0ZOVkUwd0NrNXFWVEZOVkZWNVRrUndiR0p1V25CamJUbDFZbGRXZFdSRWNIVmpSekIzWjFselIwTnBjMGRCVVZGQ01XNXJRMEpCU1VWbVVWSTNRVWhyUVdSM1JHUUtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPSEptSzBocGJrdEJUSGx1ZFdwblFVRkJZVUpoZEd0U1VVRkJRVVZCZDBKSlRVVlpRd3BKVVVRMlUyTnRWVFZPWmtsRWJGUndUM0YwVDJSTloxRklZVGhyTldVdlFUYzFOMWR1VERsaFdFZEhjbkJCU1doQlRraHBNVVIzWm1kRVVWbHZaVVI0Q2xWQk1IZFNORmRSY0c5cGFGTkZSVEY2VERST2FETmFaWFozTm1WTlFXOUhRME54UjFOTk5EbENRVTFFUVRKblFVMUhWVU5OUnpSb1drbE5ZWGxITlU4S2QxbEVPVGt6VGtZM1ltTkJWV2t4VGk5blFsWlJVRWxOSzNKT2FHOWxValZ0Y1ZNNVNIcDFibHBtUmpSVFJuRnlXamw0VFhGUlNYaEJTelZ5YUZkRFFncG1OREJrT1Zsd1JYQnlZMFpPUkVodEswTXZVWGxGUlZSR2RFRTBZMGgzV0hjNU4zSm5iVWRrVW5ZdmExSk5lVnBuZWxwU1EwUmFPVVZSUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgIf5OgasegNyGoUrQSdiIVwVr8eSV5+Vx7qj9FUmRgzkCFD9x3QCN1L+z5zonTPlYv4KsRu0tGA8yMDI2MDkwMTAyMDQ0OVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTAxMDIwNDQ5WjAvBgkqhkiG9w0BCQQxIgQg2YwWnzGPhehuka8MMdfng0VJn1yOOrSuAB99cMrORJkwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwAy4JghX669DtMAxHnCcvK0+fbiy+qKeRZFtGoxenFhubOLdOvLpMyygY4Os1Yc0eAjEAsAIqcKWQ/rc8jY0vLBECry1zQLzH5tirL8IymyAFOqIRnXIsKZlh1gT12UEMGJjk"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"9vqC3xj4fb2a6WgdENFinwlKU/tsOdNOJcIfEQE0ecM="},"signature":"MEUCIQDjnZiqaw/XSKEhJQ/6d6mBjhBgMlvGZb9hVYeFuXtJrQIgNk0YPELldrCZ7jgcUzcJbyoDs1DjyWtG4+KIstiNELg="}}