@warp-drive/holodeck 0.0.0-alpha.21 → 0.0.0-alpha.27

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/bin/cmd/pm2.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /* eslint-disable no-console */
2
2
  /* global Bun, globalThis */
3
- const { process } = globalThis;
4
- import pm2 from 'pm2';
5
3
  import fs from 'fs';
4
+ import pm2 from 'pm2';
5
+
6
+ const { process } = globalThis;
6
7
 
7
8
  export default async function pm2Delegate(cmd, _args) {
8
9
  const pkg = JSON.parse(fs.readFileSync('./package.json'), 'utf8');
package/bin/cmd/run.js CHANGED
File without changes
package/bin/holodeck.js CHANGED
@@ -8,6 +8,7 @@ exec printf '%s\n' "$test1" "$test2" 1>&2
8
8
  /* global Bun, globalThis */
9
9
 
10
10
  import chalk from 'chalk';
11
+
11
12
  import { spawn } from './cmd/spawn.js';
12
13
 
13
14
  const isBun = typeof Bun !== 'undefined';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAe,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEhH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAIhD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,QAS5D;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,QAE5C;AACD,wBAAgB,cAAc,YAE7B;AAED,qBAAa,iBAAkB,YAAW,OAAO;IACvC,KAAK,EAAE,MAAM,CAAC;gBACV,KAAK,EAAE,MAAM;IAGnB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CA6B/F;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,OAAO,iBAgB3F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAe,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEhH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAIhD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,QAS5D;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,QAE5C;AACD,wBAAgB,cAAc,YAE7B;AAED,qBAAa,iBAAkB,YAAW,OAAO;IACvC,KAAK,EAAE,MAAM,CAAC;gBACV,KAAK,EAAE,MAAM;IAGnB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CA+B/F;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,OAAO,iBAgB3F"}
package/dist/index.js CHANGED
@@ -38,7 +38,9 @@ class MockServerHandler {
38
38
  request.credentials = 'omit';
39
39
  request.referrerPolicy = '';
40
40
  try {
41
- return await next(request);
41
+ const future = next(request);
42
+ context.setStream(future.getStream());
43
+ return await future;
42
44
  } catch (e) {
43
45
  if (e instanceof Error && !(e instanceof DOMException)) {
44
46
  e.message = e.message.replace(queryForTest, '');
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../client/index.ts"],"sourcesContent":["import type { Handler, NextFn, RequestContext, RequestInfo, StructuredDataDocument } from '@ember-data/request';\n\nimport type { ScaffoldGenerator } from './mock';\n\nconst TEST_IDS = new WeakMap<object, { id: string; request: number; mock: number }>();\n\nexport function setTestId(context: object, str: string | null) {\n if (str && TEST_IDS.has(context)) {\n throw new Error(`MockServerHandler is already configured with a testId.`);\n }\n if (str) {\n TEST_IDS.set(context, { id: str, request: 0, mock: 0 });\n } else {\n TEST_IDS.delete(context);\n }\n}\n\nlet IS_RECORDING = false;\nexport function setIsRecording(value: boolean) {\n IS_RECORDING = Boolean(value);\n}\nexport function getIsRecording() {\n return IS_RECORDING;\n}\n\nexport class MockServerHandler implements Handler {\n declare owner: object;\n constructor(owner: object) {\n this.owner = owner;\n }\n async request<T>(context: RequestContext, next: NextFn<T>): Promise<StructuredDataDocument<T>> {\n const test = TEST_IDS.get(this.owner);\n if (!test) {\n throw new Error(\n `MockServerHandler is not configured with a testId. Use setTestId to set the testId for each test`\n );\n }\n\n const request: RequestInfo = Object.assign({}, context.request);\n const isRecording = request.url!.endsWith('/__record');\n const firstChar = request.url!.includes('?') ? '&' : '?';\n const queryForTest = `${firstChar}__xTestId=${test.id}&__xTestRequestNumber=${\n isRecording ? test.mock++ : test.request++\n }`;\n request.url = request.url + queryForTest;\n\n request.mode = 'cors';\n request.credentials = 'omit';\n request.referrerPolicy = '';\n\n try {\n return await next(request);\n } catch (e) {\n if (e instanceof Error && !(e instanceof DOMException)) {\n e.message = e.message.replace(queryForTest, '');\n }\n throw e;\n }\n }\n}\n\nexport async function mock(owner: object, generate: ScaffoldGenerator, isRecording?: boolean) {\n const test = TEST_IDS.get(owner);\n if (!test) {\n throw new Error(`Cannot call \"mock\" before configuring a testId. Use setTestId to set the testId for each test`);\n }\n const testMockNum = test.mock++;\n if (getIsRecording() || isRecording) {\n const url = `https://localhost:1135/__record?__xTestId=${test.id}&__xTestRequestNumber=${testMockNum}`;\n await fetch(url, {\n method: 'POST',\n body: JSON.stringify(generate()),\n mode: 'cors',\n credentials: 'omit',\n referrerPolicy: '',\n });\n }\n}\n"],"names":["TEST_IDS","WeakMap","setTestId","context","str","has","Error","set","id","request","mock","delete","IS_RECORDING","setIsRecording","value","Boolean","getIsRecording","MockServerHandler","constructor","owner","next","test","get","Object","assign","isRecording","url","endsWith","firstChar","includes","queryForTest","mode","credentials","referrerPolicy","e","DOMException","message","replace","generate","testMockNum","fetch","method","body","JSON","stringify"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../client/index.ts"],"sourcesContent":["import type { Handler, NextFn, RequestContext, RequestInfo, StructuredDataDocument } from '@ember-data/request';\n\nimport type { ScaffoldGenerator } from './mock';\n\nconst TEST_IDS = new WeakMap<object, { id: string; request: number; mock: number }>();\n\nexport function setTestId(context: object, str: string | null) {\n if (str && TEST_IDS.has(context)) {\n throw new Error(`MockServerHandler is already configured with a testId.`);\n }\n if (str) {\n TEST_IDS.set(context, { id: str, request: 0, mock: 0 });\n } else {\n TEST_IDS.delete(context);\n }\n}\n\nlet IS_RECORDING = false;\nexport function setIsRecording(value: boolean) {\n IS_RECORDING = Boolean(value);\n}\nexport function getIsRecording() {\n return IS_RECORDING;\n}\n\nexport class MockServerHandler implements Handler {\n declare owner: object;\n constructor(owner: object) {\n this.owner = owner;\n }\n async request<T>(context: RequestContext, next: NextFn<T>): Promise<StructuredDataDocument<T>> {\n const test = TEST_IDS.get(this.owner);\n if (!test) {\n throw new Error(\n `MockServerHandler is not configured with a testId. Use setTestId to set the testId for each test`\n );\n }\n\n const request: RequestInfo = Object.assign({}, context.request);\n const isRecording = request.url!.endsWith('/__record');\n const firstChar = request.url!.includes('?') ? '&' : '?';\n const queryForTest = `${firstChar}__xTestId=${test.id}&__xTestRequestNumber=${\n isRecording ? test.mock++ : test.request++\n }`;\n request.url = request.url + queryForTest;\n\n request.mode = 'cors';\n request.credentials = 'omit';\n request.referrerPolicy = '';\n\n try {\n const future = next(request);\n context.setStream(future.getStream());\n return await future;\n } catch (e) {\n if (e instanceof Error && !(e instanceof DOMException)) {\n e.message = e.message.replace(queryForTest, '');\n }\n throw e;\n }\n }\n}\n\nexport async function mock(owner: object, generate: ScaffoldGenerator, isRecording?: boolean) {\n const test = TEST_IDS.get(owner);\n if (!test) {\n throw new Error(`Cannot call \"mock\" before configuring a testId. Use setTestId to set the testId for each test`);\n }\n const testMockNum = test.mock++;\n if (getIsRecording() || isRecording) {\n const url = `https://localhost:1135/__record?__xTestId=${test.id}&__xTestRequestNumber=${testMockNum}`;\n await fetch(url, {\n method: 'POST',\n body: JSON.stringify(generate()),\n mode: 'cors',\n credentials: 'omit',\n referrerPolicy: '',\n });\n }\n}\n"],"names":["TEST_IDS","WeakMap","setTestId","context","str","has","Error","set","id","request","mock","delete","IS_RECORDING","setIsRecording","value","Boolean","getIsRecording","MockServerHandler","constructor","owner","next","test","get","Object","assign","isRecording","url","endsWith","firstChar","includes","queryForTest","mode","credentials","referrerPolicy","future","setStream","getStream","e","DOMException","message","replace","generate","testMockNum","fetch","method","body","JSON","stringify"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@warp-drive/holodeck",
3
3
  "description": "⚡️ Simple, Fast HTTP Mocking for Tests",
4
- "version": "0.0.0-alpha.21",
4
+ "version": "0.0.0-alpha.27",
5
5
  "license": "MIT",
6
6
  "author": "Chris Thoburn <runspired@users.noreply.github.com>",
7
7
  "repository": {
@@ -21,11 +21,10 @@
21
21
  "extends": "../../package.json"
22
22
  },
23
23
  "dependencies": {
24
- "@hono/node-server": "^1.3.3",
25
- "chalk": "^4.1.2",
26
- "hono": "^3.11.3",
27
- "pm2": "^5.3.1",
28
- "pnpm-sync-dependencies-meta-injected": "0.0.10"
24
+ "@hono/node-server": "^1.8.2",
25
+ "chalk": "^5.3.0",
26
+ "hono": "^4.1.2",
27
+ "pm2": "^5.3.1"
29
28
  },
30
29
  "files": [
31
30
  "bin",
@@ -39,26 +38,34 @@
39
38
  "bin": {
40
39
  "holodeck": "./bin/holodeck.js"
41
40
  },
41
+ "scripts": {
42
+ "build:types": "echo \"Types are private\" && exit 0",
43
+ "build:client": "rollup --config",
44
+ "_build": "bun run build:client && bun run build:types",
45
+ "start": "rollup --config --watch",
46
+ "_syncPnpm": "bun run sync-dependencies-meta-injected"
47
+ },
42
48
  "peerDependencies": {
43
- "@ember-data/request": "5.4.0-alpha.35",
44
- "@warp-drive/core-types": "0.0.0-alpha.21"
49
+ "@ember-data/request": "workspace:5.4.0-alpha.41",
50
+ "@warp-drive/core-types": "workspace:0.0.0-alpha.27"
45
51
  },
46
52
  "devDependencies": {
47
- "@babel/cli": "^7.23.9",
48
- "@babel/core": "^7.23.9",
49
- "@babel/plugin-transform-typescript": "^7.23.6",
50
- "@babel/preset-env": "^7.23.9",
51
- "@babel/preset-typescript": "^7.23.3",
52
- "@babel/runtime": "^7.23.9",
53
- "@ember-data/request": "5.4.0-alpha.35",
54
- "@embroider/addon-dev": "^4.1.2",
53
+ "@babel/cli": "^7.24.1",
54
+ "@babel/core": "^7.24.1",
55
+ "@babel/plugin-transform-typescript": "^7.24.1",
56
+ "@babel/preset-env": "^7.24.1",
57
+ "@babel/preset-typescript": "^7.24.1",
58
+ "@babel/runtime": "^7.24.1",
59
+ "@ember-data/request": "workspace:5.4.0-alpha.41",
60
+ "@embroider/addon-dev": "^4.2.1",
55
61
  "@rollup/plugin-babel": "^6.0.4",
56
62
  "@rollup/plugin-node-resolve": "^15.2.3",
57
- "@warp-drive/core-types": "0.0.0-alpha.21",
58
- "@warp-drive/internal-config": "5.4.0-alpha.35",
59
- "rollup": "^4.9.6",
60
- "typescript": "^5.3.3",
61
- "walk-sync": "^3.0.0"
63
+ "@warp-drive/core-types": "workspace:0.0.0-alpha.27",
64
+ "@warp-drive/internal-config": "workspace:5.4.0-alpha.41",
65
+ "rollup": "^4.13.0",
66
+ "typescript": "^5.4.3",
67
+ "walk-sync": "^3.0.0",
68
+ "pnpm-sync-dependencies-meta-injected": "0.0.10"
62
69
  },
63
70
  "type": "module",
64
71
  "exports": {
@@ -85,12 +92,5 @@
85
92
  "@warp-drive/core-types": {
86
93
  "injected": true
87
94
  }
88
- },
89
- "scripts": {
90
- "build:types": "echo \"Types are private\" && exit 0",
91
- "build:client": "rollup --config",
92
- "_build": "bun run build:client && bun run build:types",
93
- "start": "rollup --config --watch",
94
- "_syncPnpm": "bun run sync-dependencies-meta-injected"
95
95
  }
96
- }
96
+ }
package/server/index.js CHANGED
@@ -1,16 +1,63 @@
1
1
  import { serve } from '@hono/node-server';
2
+ import chalk from 'chalk';
2
3
  import { Hono } from 'hono';
3
4
  import { cors } from 'hono/cors';
5
+ import { HTTPException } from 'hono/http-exception';
4
6
  import { logger } from 'hono/logger';
7
+ import { execSync } from 'node:child_process';
5
8
  import crypto from 'node:crypto';
6
9
  import fs from 'node:fs';
7
10
  import http2 from 'node:http2';
8
- import { dirname } from 'node:path';
9
11
  import zlib from 'node:zlib';
10
- import { fileURLToPath } from 'url';
11
- import { HTTPException } from 'hono/http-exception';
12
+ import { homedir, userInfo } from 'os';
13
+ import path from 'path';
14
+
15
+ function getShellConfigFilePath() {
16
+ const shell = userInfo().shell;
17
+ switch (shell) {
18
+ case '/bin/zsh':
19
+ return path.join(homedir(), '.zshrc');
20
+ case '/bin/bash':
21
+ return path.join(homedir(), '.bashrc');
22
+ default:
23
+ throw Error(
24
+ `Unable to determine configuration file for shell: ${shell}. Manual SSL Cert Setup Required for Holodeck.`
25
+ );
26
+ }
27
+ }
28
+
29
+ function getCertInfo() {
30
+ let CERT_PATH = process.env.HOLODECK_SSL_CERT_PATH;
31
+ let KEY_PATH = process.env.HOLODECK_SSL_KEY_PATH;
12
32
 
13
- const __dirname = dirname(fileURLToPath(import.meta.url));
33
+ if (!CERT_PATH) {
34
+ CERT_PATH = path.join(homedir(), 'holodeck-localhost.pem');
35
+ process.env.HOLODECK_SSL_CERT_PATH = CERT_PATH;
36
+ execSync(`echo '\nexport HOLODECK_SSL_CERT_PATH="${CERT_PATH}"' >> ${getShellConfigFilePath()}`);
37
+ console.log(`Added HOLODECK_SSL_CERT_PATH to ${getShellConfigFilePath()}`);
38
+ }
39
+
40
+ if (!KEY_PATH) {
41
+ KEY_PATH = path.join(homedir(), 'holodeck-localhost-key.pem');
42
+ process.env.HOLODECK_SSL_KEY_PATH = KEY_PATH;
43
+ execSync(`echo '\nexport HOLODECK_SSL_KEY_PATH="${KEY_PATH}"' >> ${getShellConfigFilePath()}`);
44
+ console.log(`Added HOLODECK_SSL_KEY_PATH to ${getShellConfigFilePath()}`);
45
+ }
46
+
47
+ if (!fs.existsSync(CERT_PATH) || !fs.existsSync(KEY_PATH)) {
48
+ console.log('SSL certificate or key not found, generating new ones...');
49
+
50
+ execSync(`mkcert -install`);
51
+ execSync(`mkcert -key-file ${KEY_PATH} -cert-file ${CERT_PATH} localhost`);
52
+ }
53
+
54
+ return {
55
+ CERT_PATH,
56
+ KEY_PATH,
57
+ CERT: fs.readFileSync(CERT_PATH),
58
+ KEY: fs.readFileSync(KEY_PATH),
59
+ };
60
+ }
14
61
 
15
62
  const DEFAULT_PORT = 1135;
16
63
  const BROTLI_OPTIONS = {
@@ -211,13 +258,15 @@ export function createServer(options) {
211
258
  );
212
259
  app.all('*', createTestHandler(options.projectRoot));
213
260
 
261
+ const { CERT, KEY } = getCertInfo();
262
+
214
263
  serve({
215
264
  fetch: app.fetch,
216
265
  createServer: (_, requestListener) => {
217
266
  return http2.createSecureServer(
218
267
  {
219
- key: fs.readFileSync(`${__dirname}/localhost-key.pem`),
220
- cert: fs.readFileSync(`${__dirname}/localhost.pem`),
268
+ key: KEY,
269
+ cert: CERT,
221
270
  },
222
271
  requestListener
223
272
  );
@@ -225,4 +274,8 @@ export function createServer(options) {
225
274
  port: options.port ?? DEFAULT_PORT,
226
275
  hostname: 'localhost',
227
276
  });
277
+
278
+ console.log(
279
+ `\tMock server running at ${chalk.magenta('https://localhost:') + chalk.yellow(options.port ?? DEFAULT_PORT)}`
280
+ );
228
281
  }
package/server/CERT.md DELETED
@@ -1,3 +0,0 @@
1
- Generated with `mkcert`
2
-
3
- It will expire on 9 January 2026 🗓
@@ -1,28 +0,0 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCz8yulPBPYYZH+
3
- M+kBVOCSj4EmN7Texxd/DXjOJTTpDI8aophZhfaXZSnTFhLxTEuAUVboU7yGR/JJ
4
- JzL1nTVujR/gjJFrc4PVDeLzWMTJsTQcagdtku9suKC6M74/GlTI4yQC5p+IKRuv
5
- ZisQhacyjpj5s4RoBR2n2aOscIncYtuKTJ570CIt9SFxEaV/WW3PlAG5LGEuqqJR
6
- MwFTXz10IaKOVc/sxV2sYVS1tARydAx27IHKf23FilAu30nnc0ipGZNqFvHNvNed
7
- Ggye+aaCh0WtX99HXs+JKPTfvV4sCDb7KIZq3WjRk7PAaSr6e999kvHuhZpXDUJL
8
- Ynu0FYBZAgMBAAECggEBAJXcluWWAeT7ZO0x6AOe3yPPdTwRuoSpg4zg+FGdtNG9
9
- DtScwooTwchVjJ5pzL69zkb/9oOncOLXuhRoG81m7l+yEfEcv+KfohPl67LDo6dg
10
- 90gOmT8M1m5R2DEZ9H9y+1cNqyjrTcLEkXTifkzVMegtz4JsmYFTeV4XJ3LtijJJ
11
- j0b8X4d22DiNtQrx2zrcUF64UJSAxdRHW3nYlnjVxiXjUCO6TcrZvA+rqYNhX+QJ
12
- lX9EwyVOdBtGsNMMECviFgrr4DPxkh77WptO6suIZ1X//UOAYEQp7rOsAf6sXRkp
13
- seVp/TvhbjDk/XuRiv8zLaf0W4pFwt90XsCmkEzsH10CgYEA6beK8o2r5CA+mTJO
14
- fb4MyqKhv6v5RXfG69IXf01gvARcXwjOMD5cV38UsI7YEw9RCXGRXzeH3MvW28aD
15
- ADJYd+516vb0VwZwFYrUVKuBcjvvShPCk9HtOCqCEbRPBPJE7/mODHmL8u+61Rq/
16
- l1n6GmYGLmJy2HaVDDnWi9jb0I8CgYEAxRtOKrkkdt36iUYlQ7wkWtDcN1gYVpuB
17
- e2G/6BmDwIBTX/WoVlJrL9S3hFTjFc+0UJBpmmfFGFtp0tZFtjY7SaTj2whK4ZU7
18
- VI90CUgExdsjf7yw+OeCgqdkiuRoFn39tL0h/pM4UcAKz9UB9yxvrfQRCXD3O6w2
19
- TzbEv3VAxJcCgYBlnHvXeoqqEu7EUh/YAWG0U8K4/37PmgStEFlQ6oZNGCRE2SIz
20
- zVj+XWzUWjZNCxKzZWHLoOv7rc/LG2JnGnxmIBG6RwXyNAVVCFfKPAp6bN5bOX4W
21
- IGXfTnPgWKEmSGJ6ZuhAOjQDOgDjl86GcgMPqR202u6Nd/jTKO5DPNRMtwKBgHNu
22
- JjzG6B/kp5A00CX2zKOSpSSUJsyxjQagnC5kos/dVvZfexHyemsse7y3qbVgSgzU
23
- RcPy+W3mOvcKHRE0eUwLkJT5KkEpj/FZgW7eCk2EpClua4WYrsmtFihw0rQ5XJa4
24
- HGxl8xmNCcfkyp3iHBUXVdLdoSwFElkZjedB14hJAoGAeeX+Rg4Y5a9/GNgxgsBU
25
- o9MM/6qmjAJAb4iln9jHaEYZBd7EyogYuzqiKlASutIovGHj+P0RH3kvVlmVt1g/
26
- 45zmwVVrobCi5dqGQ1oPYvZpGCi85aYciTlfuH0mJqouXEkcO8kZQbc8ylR7WZS/
27
- U9Mf1mB0yw8kupDasZ+uJ5c=
28
- -----END PRIVATE KEY-----
@@ -1,27 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIEfzCCAuegAwIBAgIQWxpBRFaerCiZ6Gh6L9VAqjANBgkqhkiG9w0BAQsFADCB
3
- qzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMUAwPgYDVQQLDDdjdGhv
4
- YnVybkBDaHJpcy1UaG9idXJuLUs1MFEzMEQ3NjEubG9jYWwgKENocmlzIFRob2J1
5
- cm4pMUcwRQYDVQQDDD5ta2NlcnQgY3Rob2J1cm5AQ2hyaXMtVGhvYnVybi1LNTBR
6
- MzBENzYxLmxvY2FsIChDaHJpcyBUaG9idXJuKTAeFw0yMzEwMDkwOTE1MDZaFw0y
7
- NjAxMDkxMDE1MDZaMGsxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0
8
- aWZpY2F0ZTFAMD4GA1UECww3Y3Rob2J1cm5AQ2hyaXMtVGhvYnVybi1LNTBRMzBE
9
- NzYxLmxvY2FsIChDaHJpcyBUaG9idXJuKTCCASIwDQYJKoZIhvcNAQEBBQADggEP
10
- ADCCAQoCggEBALPzK6U8E9hhkf4z6QFU4JKPgSY3tN7HF38NeM4lNOkMjxqimFmF
11
- 9pdlKdMWEvFMS4BRVuhTvIZH8kknMvWdNW6NH+CMkWtzg9UN4vNYxMmxNBxqB22S
12
- 72y4oLozvj8aVMjjJALmn4gpG69mKxCFpzKOmPmzhGgFHafZo6xwidxi24pMnnvQ
13
- Ii31IXERpX9Zbc+UAbksYS6qolEzAVNfPXQhoo5Vz+zFXaxhVLW0BHJ0DHbsgcp/
14
- bcWKUC7fSedzSKkZk2oW8c28150aDJ75poKHRa1f30dez4ko9N+9XiwINvsohmrd
15
- aNGTs8BpKvp7332S8e6FmlcNQktie7QVgFkCAwEAAaNeMFwwDgYDVR0PAQH/BAQD
16
- AgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFPvg1+9/Kqq1KAXH
17
- lhQsaJhmqOd1MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOC
18
- AYEAx2seTuq9JRa2sdio17IJO+9ns35zl8TymSIV9U6YGgiW3m/bsfmZic6Kzn9R
19
- +lj6rBAGIefrQEmfF3RGL3n7FOW0gwSXSeKmG1r7TBXYrkKF9i41C/VRUZ8iKZfl
20
- ja5P9BFXWUeMQDLv6p3X/ynZMsw1HOIy2r5OJoxLjfN4NvnAnQxbMtVSsCHMesj1
21
- U44mT09CeGTLTsbqFNZ7TX/Gm1I4ic7z8PGFpWDgliNARNH5Yf6Quh/ryY+jXc4F
22
- yoC3JwhmRfi4vNCP6wmUzpLmS+psJkCjU1SnUmzjX219F22Y5vFUJrWhQq+qs/yx
23
- t9PPlf+dt2MfoPsNIE096E9z8yBWcyggCQvyH0kv+a7HKOOHORtd8SuCNGtTEl4Q
24
- Q8eheMGoIa4dsiMyJeWUOtxdInPkZNBxjQLkC2wCqSuN5+3iTuFfniRSoamqSVYo
25
- /TtgXWM5tTUOHHisy+u9HR6fZpSlvplYIjVcmK5bObIlRx7MCOFiyXjJf7Xjv1ji
26
- 6JQn
27
- -----END CERTIFICATE-----