flightdeck 0.2.3 → 0.2.5

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.
@@ -48,6 +48,9 @@
48
48
  "checkAvailability"
49
49
  ],
50
50
  "additionalProperties": false
51
+ },
52
+ "jsonLogging": {
53
+ "type": "boolean"
51
54
  }
52
55
  },
53
56
  "required": [
@@ -0,0 +1,68 @@
1
+ {
2
+ "$schema": "https://lnav.org/schemas/format-v1.schema.json",
3
+ "flightdeck_log": {
4
+ "title": "FlightDeck Log",
5
+ "description": "Format for events logged by the FlightDeck process manager.",
6
+ "file-type": "json",
7
+ "timestamp-field": "timestamp",
8
+ "subsecond-field": "subsecond",
9
+ "subsecond-units": "milli",
10
+ "opid-field": "service",
11
+ "level-field": "level",
12
+ "level": {
13
+ "info": "info",
14
+ "warning": "warn",
15
+ "error": "err!"
16
+ },
17
+ "ordered-by-time": true,
18
+ "line-format": [
19
+ {
20
+ "field": "__level__"
21
+ },
22
+ {
23
+ "prefix": " ",
24
+ "field": "__timestamp__",
25
+ "timestamp-format": "%Y-%m-%dT%H:%M:%S.%L%Z"
26
+ },
27
+ {
28
+ "prefix": " ",
29
+ "field": "package"
30
+ },
31
+ {
32
+ "prefix": "::",
33
+ "field": "service",
34
+ "default-value": ""
35
+ },
36
+ {
37
+ "prefix": "[",
38
+ "field": "process",
39
+ "suffix": "]",
40
+ "min-width": 5
41
+ },
42
+ {
43
+ "prefix": ": ",
44
+ "field": "body"
45
+ }
46
+ ],
47
+ "value": {
48
+ "timestamp": {
49
+ "kind": "integer"
50
+ },
51
+ "level": {
52
+ "kind": "string"
53
+ },
54
+ "package": {
55
+ "kind": "string"
56
+ },
57
+ "service": {
58
+ "kind": "string"
59
+ },
60
+ "process": {
61
+ "kind": "integer"
62
+ },
63
+ "body": {
64
+ "kind": "string"
65
+ }
66
+ }
67
+ }
68
+ }
@@ -1,90 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ var L=Object.defineProperty;var M=(q,w)=>{for(var x in w)L(q,x,{get:w[x],enumerable:!0,configurable:!0,set:(y)=>w[x]=()=>y})};import{cli as N,required as O}from"comline";import{z as j}from"zod";var E={};M(E,{scramble:()=>B,alert:()=>D});async function D({secret:q,endpoint:w,version:x}){return await fetch(w,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8",Authorization:`Bearer ${q}`},body:x})}async function B({packageConfig:q,secretsConfig:w,publishedPackages:x}){let y=[];for(let z of x)if(z.name in q){let A=z.name,{endpoint:G}=q[A],H=w[A],I=z.version,J=D({secret:H,endpoint:G,version:I}).then((K)=>[A,K]);y.push(J)}let F=await Promise.all(y);return Object.fromEntries(F)}var Q=j.object({packageConfig:j.record(j.string(),j.object({endpoint:j.string()})),secretsConfig:j.record(j.string(),j.string()),publishedPackages:j.array(j.object({name:j.string(),version:j.string()}))}),T=N({cliName:"klaxon",routes:O({scramble:null}),routeOptions:{scramble:{options:{packageConfig:{description:"Maps the names of your packages to the endpoints that klaxon will POST to.",example:'--packageConfig="{\\"my-app\\":{\\"endpoint\\":\\"https://my-app.com\\"}}"',flag:"c",parse:JSON.parse,required:!0},secretsConfig:{description:"Maps the names of your packages to the secrets that klaxon will use to authenticate with their respective endpoints.",example:'--secretsConfig="{\\"my-app\\":\\"XXXX-XXXX-XXXX\\"}"',flag:"s",parse:JSON.parse,required:!0},publishedPackages:{description:'The output of the "Publish" step in Changesets.',example:'--publishedPackages="[{\\"name\\":\\"my-app\\",\\"version\\":\\"0.0.0\\"}]"',flag:"p",parse:JSON.parse,required:!0}},optionsSchema:Q}}}),{inputs:U}=T(process.argv);await B(U.opts).then((q)=>{console.log(q)});
2
3
 
3
- // src/klaxon.bin.ts
4
- import { cli, required } from "comline";
5
- import { z } from "zod";
6
-
7
- // src/klaxon.lib.ts
8
- async function alert({
9
- secret,
10
- endpoint,
11
- version
12
- }) {
13
- const response = await fetch(endpoint, {
14
- method: `POST`,
15
- headers: {
16
- "Content-Type": `text/plain;charset=UTF-8`,
17
- Authorization: `Bearer ${secret}`
18
- },
19
- body: version
20
- });
21
- return response;
22
- }
23
- async function scramble({
24
- packageConfig,
25
- secretsConfig,
26
- publishedPackages
27
- }) {
28
- const alertResults = [];
29
- for (const publishedPackage of publishedPackages) {
30
- if (publishedPackage.name in packageConfig) {
31
- const name = publishedPackage.name;
32
- const { endpoint } = packageConfig[name];
33
- const secret = secretsConfig[name];
34
- const version = publishedPackage.version;
35
- const alertResultPromise = alert({ secret, endpoint, version }).then((alertResult) => [name, alertResult]);
36
- alertResults.push(alertResultPromise);
37
- }
38
- }
39
- const alertResultsResolved = await Promise.all(alertResults);
40
- const scrambleResult = Object.fromEntries(alertResultsResolved);
41
- return scrambleResult;
42
- }
43
-
44
- // src/klaxon.bin.ts
45
- var changesetsPublishedPackagesSchema = z.object({
46
- packageConfig: z.record(z.string(), z.object({ endpoint: z.string() })),
47
- secretsConfig: z.record(z.string(), z.string()),
48
- publishedPackages: z.array(z.object({
49
- name: z.string(),
50
- version: z.string()
51
- }))
52
- });
53
- var klaxon = cli({
54
- cliName: `klaxon`,
55
- routes: required({
56
- scramble: null
57
- }),
58
- routeOptions: {
59
- scramble: {
60
- options: {
61
- packageConfig: {
62
- description: `Maps the names of your packages to the endpoints that klaxon will POST to.`,
63
- example: `--packageConfig="{\\"my-app\\":{\\"endpoint\\":\\"https://my-app.com\\"}}"`,
64
- flag: `c`,
65
- parse: JSON.parse,
66
- required: true
67
- },
68
- secretsConfig: {
69
- description: `Maps the names of your packages to the secrets that klaxon will use to authenticate with their respective endpoints.`,
70
- example: `--secretsConfig="{\\"my-app\\":\\"XXXX-XXXX-XXXX\\"}"`,
71
- flag: `s`,
72
- parse: JSON.parse,
73
- required: true
74
- },
75
- publishedPackages: {
76
- description: `The output of the "Publish" step in Changesets.`,
77
- example: `--publishedPackages="[{\\"name\\":\\"my-app\\",\\"version\\":\\"0.0.0\\"}]"`,
78
- flag: `p`,
79
- parse: JSON.parse,
80
- required: true
81
- }
82
- },
83
- optionsSchema: changesetsPublishedPackagesSchema
84
- }
85
- }
86
- });
87
- var { inputs } = klaxon(process.argv);
88
- await scramble(inputs.opts).then((scrambleResult) => {
89
- console.log(scrambleResult);
90
- });
4
+ //# debugId=F19DE54014786B8464756E2164756E21
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2tsYXhvbi5iaW4udHMiLCAiLi4vc3JjL2tsYXhvbi5saWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBjbGksIHJlcXVpcmVkIH0gZnJvbSBcImNvbWxpbmVcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuXG5pbXBvcnQgKiBhcyBLbGF4b24gZnJvbSBcIi4va2xheG9uLmxpYlwiXG5cbmNvbnN0IGNoYW5nZXNldHNQdWJsaXNoZWRQYWNrYWdlc1NjaGVtYTogei5ab2RTY2hlbWE8S2xheG9uLlNjcmFtYmxlT3B0aW9ucz4gPVxuXHR6Lm9iamVjdCh7XG5cdFx0cGFja2FnZUNvbmZpZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5vYmplY3QoeyBlbmRwb2ludDogei5zdHJpbmcoKSB9KSksXG5cdFx0c2VjcmV0c0NvbmZpZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSksXG5cdFx0cHVibGlzaGVkUGFja2FnZXM6IHouYXJyYXkoXG5cdFx0XHR6Lm9iamVjdCh7XG5cdFx0XHRcdG5hbWU6IHouc3RyaW5nKCksXG5cdFx0XHRcdHZlcnNpb246IHouc3RyaW5nKCksXG5cdFx0XHR9KSxcblx0XHQpLFxuXHR9KVxuXG5jb25zdCBrbGF4b24gPSBjbGkoe1xuXHRjbGlOYW1lOiBga2xheG9uYCxcblx0cm91dGVzOiByZXF1aXJlZCh7XG5cdFx0c2NyYW1ibGU6IG51bGwsXG5cdH0pLFxuXHRyb3V0ZU9wdGlvbnM6IHtcblx0XHRzY3JhbWJsZToge1xuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRwYWNrYWdlQ29uZmlnOiB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGBNYXBzIHRoZSBuYW1lcyBvZiB5b3VyIHBhY2thZ2VzIHRvIHRoZSBlbmRwb2ludHMgdGhhdCBrbGF4b24gd2lsbCBQT1NUIHRvLmAsXG5cdFx0XHRcdFx0ZXhhbXBsZTogYC0tcGFja2FnZUNvbmZpZz1cIntcXFxcXCJteS1hcHBcXFxcXCI6e1xcXFxcImVuZHBvaW50XFxcXFwiOlxcXFxcImh0dHBzOi8vbXktYXBwLmNvbVxcXFxcIn19XCJgLFxuXHRcdFx0XHRcdGZsYWc6IGBjYCxcblx0XHRcdFx0XHRwYXJzZTogSlNPTi5wYXJzZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c2VjcmV0c0NvbmZpZzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBgTWFwcyB0aGUgbmFtZXMgb2YgeW91ciBwYWNrYWdlcyB0byB0aGUgc2VjcmV0cyB0aGF0IGtsYXhvbiB3aWxsIHVzZSB0byBhdXRoZW50aWNhdGUgd2l0aCB0aGVpciByZXNwZWN0aXZlIGVuZHBvaW50cy5gLFxuXHRcdFx0XHRcdGV4YW1wbGU6IGAtLXNlY3JldHNDb25maWc9XCJ7XFxcXFwibXktYXBwXFxcXFwiOlxcXFxcIlhYWFgtWFhYWC1YWFhYXFxcXFwifVwiYCxcblx0XHRcdFx0XHRmbGFnOiBgc2AsXG5cdFx0XHRcdFx0cGFyc2U6IEpTT04ucGFyc2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHB1Ymxpc2hlZFBhY2thZ2VzOiB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGBUaGUgb3V0cHV0IG9mIHRoZSBcIlB1Ymxpc2hcIiBzdGVwIGluIENoYW5nZXNldHMuYCxcblx0XHRcdFx0XHRleGFtcGxlOiBgLS1wdWJsaXNoZWRQYWNrYWdlcz1cIlt7XFxcXFwibmFtZVxcXFxcIjpcXFxcXCJteS1hcHBcXFxcXCIsXFxcXFwidmVyc2lvblxcXFxcIjpcXFxcXCIwLjAuMFxcXFxcIn1dXCJgLFxuXHRcdFx0XHRcdGZsYWc6IGBwYCxcblx0XHRcdFx0XHRwYXJzZTogSlNPTi5wYXJzZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zU2NoZW1hOiBjaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZXNTY2hlbWEsXG5cdFx0fSxcblx0fSxcbn0pXG5cbmNvbnN0IHsgaW5wdXRzIH0gPSBrbGF4b24ocHJvY2Vzcy5hcmd2KVxuYXdhaXQgS2xheG9uLnNjcmFtYmxlKGlucHV0cy5vcHRzKS50aGVuKChzY3JhbWJsZVJlc3VsdCkgPT4ge1xuXHRjb25zb2xlLmxvZyhzY3JhbWJsZVJlc3VsdClcbn0pXG4iLAogICAgImV4cG9ydCB0eXBlIEFsZXJ0T3B0aW9ucyA9IHtcblx0c2VjcmV0OiBzdHJpbmdcblx0ZW5kcG9pbnQ6IHN0cmluZ1xuXHR2ZXJzaW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFsZXJ0KHtcblx0c2VjcmV0LFxuXHRlbmRwb2ludCxcblx0dmVyc2lvbixcbn06IEFsZXJ0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2U+IHtcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuXHRcdG1ldGhvZDogYFBPU1RgLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IGB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThgLFxuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJlYXJlciAke3NlY3JldH1gLFxuXHRcdH0sXG5cdFx0Ym9keTogdmVyc2lvbixcblx0fSlcblxuXHRyZXR1cm4gcmVzcG9uc2Vcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFuZ2VzZXRzL2FjdGlvbi9ibG9iL21haW4vc3JjL3J1bi50c1xuICovXG5leHBvcnQgdHlwZSBDaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZSA9IHtcblx0bmFtZTogc3RyaW5nXG5cdHZlcnNpb246IHN0cmluZ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYW5nZXNldHMvYWN0aW9uL2Jsb2IvbWFpbi9zcmMvcnVuLnRzXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5nZXNldHNQdWJsaXNoUmVzdWx0ID1cblx0fCB7XG5cdFx0XHRwdWJsaXNoZWQ6IHRydWVcblx0XHRcdHB1Ymxpc2hlZFBhY2thZ2VzOiBDaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZVtdXG5cdCAgfVxuXHR8IHsgcHVibGlzaGVkOiBmYWxzZSB9XG5cbmV4cG9ydCB0eXBlIFBhY2thZ2VDb25maWc8SyBleHRlbmRzIHN0cmluZz4gPSB7XG5cdFtrZXkgaW4gS106IHsgZW5kcG9pbnQ6IHN0cmluZyB9XG59XG5leHBvcnQgdHlwZSBTZWNyZXRzQ29uZmlnPEsgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRba2V5IGluIEtdOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgU2NyYW1ibGVPcHRpb25zPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuXHRwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnPEs+XG5cdHNlY3JldHNDb25maWc6IFNlY3JldHNDb25maWc8Sz5cblx0cHVibGlzaGVkUGFja2FnZXM6IENoYW5nZXNldHNQdWJsaXNoZWRQYWNrYWdlW11cbn1cblxuZXhwb3J0IHR5cGUgU2NyYW1ibGVSZXN1bHQ8SyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG5cdFtrZXkgaW4gS106IFJlc3BvbnNlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY3JhbWJsZTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPih7XG5cdHBhY2thZ2VDb25maWcsXG5cdHNlY3JldHNDb25maWcsXG5cdHB1Ymxpc2hlZFBhY2thZ2VzLFxufTogU2NyYW1ibGVPcHRpb25zPEs+KTogUHJvbWlzZTxTY3JhbWJsZVJlc3VsdDxLPj4ge1xuXHRjb25zdCBhbGVydFJlc3VsdHM6IFByb21pc2U8cmVhZG9ubHkgW0ssIFJlc3BvbnNlXT5bXSA9IFtdXG5cdGZvciAoY29uc3QgcHVibGlzaGVkUGFja2FnZSBvZiBwdWJsaXNoZWRQYWNrYWdlcykge1xuXHRcdGlmIChwdWJsaXNoZWRQYWNrYWdlLm5hbWUgaW4gcGFja2FnZUNvbmZpZykge1xuXHRcdFx0Y29uc3QgbmFtZSA9IHB1Ymxpc2hlZFBhY2thZ2UubmFtZSBhcyBLXG5cdFx0XHRjb25zdCB7IGVuZHBvaW50IH0gPSBwYWNrYWdlQ29uZmlnW25hbWVdXG5cdFx0XHRjb25zdCBzZWNyZXQgPSBzZWNyZXRzQ29uZmlnW25hbWVdXG5cdFx0XHRjb25zdCB2ZXJzaW9uID0gcHVibGlzaGVkUGFja2FnZS52ZXJzaW9uXG5cdFx0XHRjb25zdCBhbGVydFJlc3VsdFByb21pc2UgPSBhbGVydCh7IHNlY3JldCwgZW5kcG9pbnQsIHZlcnNpb24gfSkudGhlbihcblx0XHRcdFx0KGFsZXJ0UmVzdWx0KSA9PiBbbmFtZSwgYWxlcnRSZXN1bHRdIGFzIGNvbnN0LFxuXHRcdFx0KVxuXHRcdFx0YWxlcnRSZXN1bHRzLnB1c2goYWxlcnRSZXN1bHRQcm9taXNlKVxuXHRcdH1cblx0fVxuXHRjb25zdCBhbGVydFJlc3VsdHNSZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKGFsZXJ0UmVzdWx0cylcblx0Y29uc3Qgc2NyYW1ibGVSZXN1bHQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0YWxlcnRSZXN1bHRzUmVzb2x2ZWQsXG5cdCkgYXMgU2NyYW1ibGVSZXN1bHQ8Sz5cblx0cmV0dXJuIHNjcmFtYmxlUmVzdWx0XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzhIQUVBLGNBQVMsY0FBSyxnQkFDZCxZQUFTLHVEQ0dULGVBQXNCLENBQUssRUFDMUIsU0FDQSxXQUNBLFdBQ21DLENBVW5DLE9BVGlCLE1BQU0sTUFBTSxFQUFVLENBQ3RDLE9BQVEsT0FDUixRQUFTLENBQ1IsZUFBZ0IsMkJBQ2hCLGNBQWUsVUFBVSxHQUMxQixFQUNBLEtBQU0sQ0FDUCxDQUFDLEVBd0NGLGVBQXNCLENBQW1DLEVBQ3hELGdCQUNBLGdCQUNBLHFCQUNrRCxDQUNsRCxJQUFNLEVBQWtELENBQUMsRUFDekQsUUFBVyxLQUFvQixFQUM5QixHQUFJLEVBQWlCLFFBQVEsRUFBZSxDQUMzQyxJQUFNLEVBQU8sRUFBaUIsTUFDdEIsWUFBYSxFQUFjLEdBQzdCLEVBQVMsRUFBYyxHQUN2QixFQUFVLEVBQWlCLFFBQzNCLEVBQXFCLEVBQU0sQ0FBRSxTQUFRLFdBQVUsU0FBUSxDQUFDLEVBQUUsS0FDL0QsQ0FBQyxJQUFnQixDQUFDLEVBQU0sQ0FBVyxDQUNwQyxFQUNBLEVBQWEsS0FBSyxDQUFrQixFQUd0QyxJQUFNLEVBQXVCLE1BQU0sUUFBUSxJQUFJLENBQVksRUFJM0QsT0FIdUIsT0FBTyxZQUM3QixDQUNELEVEeEVELElBQU0sRUFDTCxFQUFFLE9BQU8sQ0FDUixjQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRyxFQUFFLE9BQU8sQ0FBRSxTQUFVLEVBQUUsT0FBTyxDQUFFLENBQUMsQ0FBQyxFQUN0RSxjQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRyxFQUFFLE9BQU8sQ0FBQyxFQUM5QyxrQkFBbUIsRUFBRSxNQUNwQixFQUFFLE9BQU8sQ0FDUixLQUFNLEVBQUUsT0FBTyxFQUNmLFFBQVMsRUFBRSxPQUFPLENBQ25CLENBQUMsQ0FDRixDQUNELENBQUMsRUFFSSxFQUFTLEVBQUksQ0FDbEIsUUFBUyxTQUNULE9BQVEsRUFBUyxDQUNoQixTQUFVLElBQ1gsQ0FBQyxFQUNELGFBQWMsQ0FDYixTQUFVLENBQ1QsUUFBUyxDQUNSLGNBQWUsQ0FDZCxZQUFhLDZFQUNiLFFBQVMsNkVBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxFQUNBLGNBQWUsQ0FDZCxZQUFhLHVIQUNiLFFBQVMsd0RBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxFQUNBLGtCQUFtQixDQUNsQixZQUFhLGtEQUNiLFFBQVMsOEVBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxDQUNELEVBQ0EsY0FBZSxDQUNoQixDQUNELENBQ0QsQ0FBQyxHQUVPLFVBQVcsRUFBTyxRQUFRLElBQUksRUFDdEMsTUFBYSxFQUFTLEVBQU8sSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFtQixDQUMzRCxRQUFRLElBQUksQ0FBYyxFQUMxQiIsCiAgImRlYnVnSWQiOiAiRjE5REU1NDAxNDc4NkI4NDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=