From 50793786f2e913673fddf3a1fd67f7198641f720 Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 17 Dec 2021 15:48:13 +0800 Subject: [PATCH 01/20] Chore/180568905 edit cloudwatch (#405) chore: refactor cloudwatch --- src/middleware/cloudWatch.test.ts | 81 ++++++++++++++++++++++++++++--- src/middleware/cloudWatch.ts | 76 ++++++++++++++++++++--------- 2 files changed, 126 insertions(+), 31 deletions(-) diff --git a/src/middleware/cloudWatch.test.ts b/src/middleware/cloudWatch.test.ts index 71d6a0af..148259af 100644 --- a/src/middleware/cloudWatch.test.ts +++ b/src/middleware/cloudWatch.test.ts @@ -1,6 +1,6 @@ import { cloneDeep } from "lodash"; -import { NotarisationResult } from "../types"; -import wrappedDocument from "../../test/fixtures/v1/example_healthcert_with_nric_wrapped.json"; +import { NotarisationResult, Observation } from "../types"; +import wrappedDocumentV1 from "../../test/fixtures/v1/example_healthcert_with_nric_wrapped.json"; import wrappedDocumentV2 from "../../test/fixtures/v2/pdt_pcr_with_nric_wrapped.json"; import { CloudWatchMiddleware, Request } from "./cloudWatch"; import * as log from "./trace"; @@ -20,7 +20,7 @@ describe("test cloudwatch middleware for v1", () => { jest.spyOn(log, "trace"); const request: Request = { event: { - body: wrappedDocument, + body: wrappedDocumentV1, }, response: null, }; @@ -42,14 +42,14 @@ describe("test cloudwatch middleware for v1", () => { // let's assume the wrappedDocument has been notarized const notarisationResult: NotarisationResult = { - notarisedDocument: wrappedDocument as any, + notarisedDocument: wrappedDocumentV1 as any, ttl: 0, url: "", }; const request: Request = { event: { - body: wrappedDocumentV2, + body: wrappedDocumentV1, }, response: { body: JSON.stringify(notarisationResult), @@ -63,9 +63,41 @@ describe("test cloudwatch middleware for v1", () => { expect(log.trace).toHaveBeenCalledWith( `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type pcr` ); - // expect(log.trace).toHaveBeenCalledWith( - // `aggregateDomain gov.sg successfully notarised pdt of type pcr` - // ); + }); + + it("middleware should log unrecognised cert type from response", async () => { + jest.spyOn(log, "trace"); + + // let's assume the wrappedDocument has been notarized + const newDoc = cloneDeep(wrappedDocumentV1); + const observation: Observation = newDoc.data.fhirBundle.entry.find((ent) => + ent.resourceType.includes("Observation") + ) as any; + + observation.code.coding[0].code = "1234"; + + const notarisationResult: NotarisationResult = { + notarisedDocument: newDoc as any, + ttl: 0, + url: "", + }; + + const request: Request = { + event: { + body: newDoc, + }, + response: { + body: JSON.stringify(notarisationResult), + statusCode: 200, + }, + }; + const cloudWatchMiddleware: CloudWatchMiddleware = + new CloudWatchMiddleware(); + await cloudWatchMiddleware.before(request); + await cloudWatchMiddleware.after(request); + expect(log.trace).toHaveBeenCalledWith( + `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type UNRECOGNISED: 1234` + ); }); }); @@ -124,4 +156,37 @@ describe("test cloudwatch middleware for v2", () => { `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type pcr, ser` ); }); + + it("middleware should log unrecognised cert type from response", async () => { + jest.spyOn(log, "trace"); + const doc = cloneDeep(wrappedDocumentV2); + doc.data.type = ["pcr", "blah"] as any; + + // let's assume the wrappedDocumentV2 has been notarized + const notarisationResult: NotarisationResult = { + notarisedDocument: doc as any, + ttl: 0, + url: "", + }; + + const request: Request = { + event: { + body: doc, + }, + response: { + body: JSON.stringify(notarisationResult), + statusCode: 200, + }, + }; + const cloudWatchMiddleware: CloudWatchMiddleware = + new CloudWatchMiddleware(); + await cloudWatchMiddleware.before(request); + await cloudWatchMiddleware.after(request); + expect(log.trace).toHaveBeenCalledWith( + `aggregateDomain gov.sg successfully notarised pdt of type pcr, UNRECOGNISED: blah` + ); + expect(log.trace).toHaveBeenCalledWith( + `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type pcr, UNRECOGNISED: blah` + ); + }); }); diff --git a/src/middleware/cloudWatch.ts b/src/middleware/cloudWatch.ts index 4277a439..06607e66 100644 --- a/src/middleware/cloudWatch.ts +++ b/src/middleware/cloudWatch.ts @@ -23,6 +23,12 @@ export class CloudWatchMiddleware { private specificDomain = ""; + private validTests: Record = { + "94531-1": "pcr", + "97097-0": "art", + "94661-6": "ser", + }; + // split "abc.riverr.io" into "riverr.io" // searches for final "." toAggregateDomain(provider: string): string { @@ -55,37 +61,16 @@ export class CloudWatchMiddleware const data: HealthCertDocument | PDTHealthCertV2 = getData(notarisedDocument); let testTypes: string[] = []; - const validTestTypes = ["art", "pcr", "ser"]; if (data.version === "pdt-healthcert-v2.0") { // version 2 - if (typeof data.type === "string") { - testTypes = [data.type]; - } else if (Array.isArray(data.type)) { - testTypes = data.type; - } - testTypes = testTypes.map((test) => test.toLowerCase()); - const allValid: boolean = testTypes.every((test) => - validTestTypes.includes(test) - ); - if (!allValid) { - logError(`${testTypes.join(", ")} are not valid`); - } + testTypes = this.extractTestTypesV2(data as PDTHealthCertV2); } else { // version 1 // @ts-ignore - const observations = data.fhirBundle?.entry as Observation[]; - const observation = observations.find( - (entr: any) => entr.resourceType === "Observation" - ) as Observation; - let { display } = observation.code.coding[0]; // e.g. Reverse transcription polymerase chain reaction (rRT-PCR) test - display = display.toLowerCase(); - testTypes = validTestTypes - .filter((test) => display.includes(test)) - .map((test) => test.toLowerCase()); + testTypes = this.extractTestTypesV1(data as HealthCertDocument); } const { specificDomain } = this; const aggregateDomain = this.toAggregateDomain(specificDomain); - testTypes.sort(); trace( `aggregateDomain ${aggregateDomain} successfully notarised pdt of type ${testTypes.join( ", " @@ -102,6 +87,51 @@ export class CloudWatchMiddleware ); } }; + + // version 2 + private extractTestTypesV2(data: PDTHealthCertV2): string[] { + let testTypes: string[] = []; + const validTestTypes = Object.values(this.validTests); + if (typeof data.type === "string") { + testTypes = [data.type]; + } else if (Array.isArray(data.type)) { + testTypes = data.type; + } + for (let i = 0; i < testTypes.length; i += 1) { + testTypes[i] = testTypes[i].toLowerCase(); + if (!validTestTypes.includes(testTypes[i])) { + testTypes[i] = `UNRECOGNISED: ${testTypes[i]}`; + } + } + return testTypes; + } + + // version 1 + private extractTestTypesV1(data: HealthCertDocument): string[] { + const testTypes = new Set(); + const entries = data.fhirBundle?.entry; + if (entries == null) { + return []; + } + const observations = (entries as Observation[]).filter( + (entry) => entry.resourceType === "Observation" + ); + for (let i = 0; i < observations.length; i += 1) { + const observation = observations[i]; + const codings = observation.code.coding; + + for (let j = 0; j < codings.length; j += 1) { + const { code } = codings[j]; + if (code in this.validTests) { + testTypes.add(this.validTests[code]); + } else { + testTypes.add(`UNRECOGNISED: ${code}`); + } + } + } + + return Array.from(testTypes); + } } export const cloudWatchMiddleware = (): Pick< From 59c799b8ec813ff85629db41ea894153c0f314c2 Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Tue, 21 Dec 2021 09:21:12 +0800 Subject: [PATCH 02/20] 180567810: validate logos in healthcerts submitted by clinics/providers (#404) * fix: validate logos submitted by clinics/providers * chore: temporarily disable logo size checking * chore: improve comments * chore: update tests * fix: eslint-disable-next-line jest/no-disabled-tests * WIP: file-type * fix: use file-type checking --- package-lock.json | 23 ++- package.json | 1 + .../validateInputs/mock_image.json | 3 + .../validateInputs/validateDocument.test.ts | 158 ++++++++++++++++++ .../validateInputs/validateDocument.ts | 58 ++++++- 5 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 src/functionHandlers/notarisePdt/validateInputs/mock_image.json diff --git a/package-lock.json b/package-lock.json index 20f1072b..fbbd9fc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7128,6 +7128,11 @@ "safe-buffer": "^5.1.1" } }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -7171,6 +7176,13 @@ "decompress-tar": "^4.1.1", "file-type": "^5.2.0", "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + } } }, "decompress-unzip": { @@ -8949,9 +8961,14 @@ } }, "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", + "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + } }, "file-uri-to-path": { "version": "1.0.0", diff --git a/package.json b/package.json index 19aa8048..43101708 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "debug": "^4.3.2", "fhir": "^4.11.1", "file-loader": "^6.2.0", + "file-type": "16.5.3", "he": "1.2.0", "http-errors": "1.8.1", "lodash": "^4.17.21", diff --git a/src/functionHandlers/notarisePdt/validateInputs/mock_image.json b/src/functionHandlers/notarisePdt/validateInputs/mock_image.json new file mode 100644 index 00000000..188f5f00 --- /dev/null +++ b/src/functionHandlers/notarisePdt/validateInputs/mock_image.json @@ -0,0 +1,3 @@ +{ + "33KB": "data:image/png;base64,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" +} diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts index 7ed216d6..8e230ef9 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts @@ -5,6 +5,8 @@ import _exampleArtHealthCertV2Wrapped from "../../../../test/fixtures/v2/pdt_art import _examplePcrSerHealthCertV2Wrapped from "../../../../test/fixtures/v2/pdt_pcr_ser_multi_result_wrapped.json"; import { validateDocument, validateV2Document } from "./validateDocument"; import { isAuthorizedIssuer } from "../authorizedIssuers"; +import { DocumentInvalidError } from "../../../common/error"; +import mockImage from "./mock_image.json"; jest.mock("@govtechsg/oa-verify"); @@ -303,3 +305,159 @@ it("should throw on v2 document failing when document data type invalid", async /Invalid document error/ ); }); + +describe("document logo validation", () => { + const GENERIC_LOGO_ERROR = `Document should include a valid "logo" attribute in base64 image string or HTTPS direct link (i.e. /(^data:image\\/(png|jpg|jpeg);base64,.*$)|(^https:\\/\\/.*[.](png|jpg|jpeg)$)/)`; + + it("should not throw on valid base64 image string", async () => { + whenFragmentsAreValid(); + await expect( + validateV2Document(examplePcrHealthCertV2Wrapped) + ).resolves.not.toThrow(); + }); + + it("should not throw on valid https url", async () => { + const sampleDocumentV2ValidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2ValidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:https://www.notarise.gov.sg/images/notarise-logo.png"; + + whenFragmentsAreValid(); + await expect( + validateV2Document(examplePcrHealthCertV2Wrapped) + ).resolves.not.toThrow(); + }); + + it("should throw on invalid string", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:foobar"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: GENERIC_LOGO_ERROR, + }); + }); + + it("should throw on invalid base64 image string", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:data:image/png;base64,foobar"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: `Document "logo" should resolve to a valid base64 image string (i.e. png|jpg|jpeg)`, + }); + }); + + // FIXME: Temporarily disable logo size checking + // eslint-disable-next-line jest/no-disabled-tests + it.skip("should throw on large base64 image string (>20KB)", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = `a60dd179-4029-44c5-8b77-296b10412836:string:${mockImage["33KB"]}`; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: `Document logo in base64 image string is too large (33.95KB). Only <=20KB is supported.`, + }); + }); + + it("should throw on https url with unknown format", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:http://example.com/image.foo"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: GENERIC_LOGO_ERROR, + }); + }); + + it("should throw on https url with no direct link", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:http://example.com/image"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: GENERIC_LOGO_ERROR, + }); + }); + + it("should throw on https url that is unresolvable", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:https://foobar.notarise/unknown.png"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: `Document "logo" should resolve to a valid HTTPS direct link (i.e. png|jpg|jpeg)`, + }); + }); + + it("should throw on http url that is insecure", async () => { + const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; + sampleDocumentV2InvalidLogo.data.logo = + "a60dd179-4029-44c5-8b77-296b10412836:string:http://example.com/image.png"; + + let thrownError; + try { + await validateV2Document(sampleDocumentV2InvalidLogo); + } catch (e) { + if (e instanceof DocumentInvalidError) { + thrownError = { title: e.title, body: e.messageBody }; + } + } + expect(thrownError).toStrictEqual({ + title: `Submitted HealthCert is invalid`, + body: GENERIC_LOGO_ERROR, + }); + }); +}); diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts index 1617656a..95b9889d 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts @@ -8,6 +8,8 @@ import { import { WrappedDocument, getData } from "@govtechsg/open-attestation"; import { pdtHealthCertV2 } from "@govtechsg/oa-schemata"; import _ from "lodash"; +import axios from "axios"; +import { fromStream, fromBuffer } from "file-type"; import { isAuthorizedIssuer } from "../authorizedIssuers"; import { HealthCertDocument, PDTHealthCertV2 } from "../../../types"; import { @@ -124,7 +126,7 @@ export const validateV2Document = async ( if (!data.type) throw new DocumentInvalidError( - `Document should include a valid "type" attribute (e.g. "PCR", "ART", "SER", ["PCR", "SER"]` + `Document should include a valid "type" attribute (e.g. "PCR", "ART", "SER" or ["PCR", "SER"])` ); const { PdtTypes } = pdtHealthCertV2; @@ -168,4 +170,58 @@ export const validateV2Document = async ( const validDomain = await isAuthorizedIssuer(issuerDomain, whitelistType); if (!validDomain) throw new UnrecognisedClinicError(issuerDomain, JSON.stringify(data.type)); + + /* 4. Validate logo (<=20KB base64 image string or HTTPS direct link) */ + if (data.logo) { + const VALID_LOGO_PATTERN = + // Either base64 string or https URL in .png | .jpg | .jpeg format + /(^data:image\/(png|jpg|jpeg);base64,.*$)|(^https:\/\/.*[.](png|jpg|jpeg)$)/; + const VALID_MIME_PATTERN = /^image\/(png|jpeg)$/; + // const MAX_LOGO_SIZE_IN_KILOBYTES = 20 * 1024; // 20KB + + if (!VALID_LOGO_PATTERN.test(data.logo)) { + throw new DocumentInvalidError( + `Document should include a valid "logo" attribute in base64 image string or HTTPS direct link (i.e. ${VALID_LOGO_PATTERN})` + ); + } + + if (data.logo.startsWith("https://")) { + try { + const res = await axios.get(data.logo, { responseType: "stream" }); + const httpsFileType = await fromStream(res.data); + if (!VALID_MIME_PATTERN.test(httpsFileType?.mime || "")) { + throw new DocumentInvalidError( + `Document "logo" should resolve to a valid HTTPS direct link (i.e. png|jpg|jpeg)` + ); + } + } catch (err) { + throw new DocumentInvalidError( + `Document "logo" should resolve to a valid HTTPS direct link (i.e. png|jpg|jpeg)` + ); + } + } else if (data.logo.startsWith("data:image")) { + const buffer = Buffer.from(data.logo.split(",")[1], "base64"); + const base64FileType = await fromBuffer(buffer); + + if (!VALID_MIME_PATTERN.test(base64FileType?.mime || "")) { + throw new DocumentInvalidError( + `Document "logo" should resolve to a valid base64 image string (i.e. png|jpg|jpeg)` + ); + } + + // FIXME: Temporarily disable logo size checking + // if (data.logo.startsWith("data:")) { + // const byteLength = Buffer.byteLength(data.logo, "utf-8"); + // if (byteLength >= MAX_LOGO_SIZE_IN_KILOBYTES) { + // throw new DocumentInvalidError( + // `Document logo in base64 image string is too large (${( + // byteLength / 1024 + // ).toFixed(2)}KB). Only <=${ + // MAX_LOGO_SIZE_IN_KILOBYTES / 1024 + // }KB is supported.` + // ); + // } + // } + } + } }; From cf0afbfc3367149821dbcddec868c27e4a66219c Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Tue, 21 Dec 2021 15:49:26 +0800 Subject: [PATCH 03/20] chore: bump @notarise-gov-sg/gpay-covid-cards from 1.0.4 to 1.0.5 (#409) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index fbbd9fc8..72e9332d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2810,9 +2810,9 @@ } }, "@notarise-gov-sg/gpay-covid-cards": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@notarise-gov-sg/gpay-covid-cards/-/gpay-covid-cards-1.0.4.tgz", - "integrity": "sha512-eB8BMD+5uq+OfFG+1K3R4UtgXlCrl9QqHBNEZOm8hDDD6TKWAgm0bzNdTsKyjoM6f8ruTZMPUuG39duc+3ZEag==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@notarise-gov-sg/gpay-covid-cards/-/gpay-covid-cards-1.0.5.tgz", + "integrity": "sha512-Y4ya5I0ZJeZCXJDLp+geI/nkvJ30gc6YOoarQvDLp08llofPOXBkHtGxPDJg2DX/PBzjqgJZh/A0SKXoyf2t6g==", "requires": { "debug": "^4.3.3", "jsonwebtoken": "^8.5.1" diff --git a/package.json b/package.json index 43101708..599f81bb 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@middy/http-error-handler": "^2.5.3", "@middy/http-json-body-parser": "^2.5.3", "@middy/ssm": "^2.5.3", - "@notarise-gov-sg/gpay-covid-cards": "^1.0.4", + "@notarise-gov-sg/gpay-covid-cards": "^1.0.5", "@notarise-gov-sg/i18n-nationality": "^1.2.2", "@notarise-gov-sg/sns-notify-recipients": "^1.5.2", "@pathcheck/dcc-sdk": "0.0.17", From 413d0d10f81507d67176b52c22eb5b178365a3d7 Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Wed, 22 Dec 2021 13:20:17 +0800 Subject: [PATCH 04/20] fix: bypass action.openattestation.com (#410) --- README.md | 2 +- src/services/transientStorage/index.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 18839f78..ce97fca5 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ curl -i -X POST \ { "notarisedDocument": {...}, "ttl": 1636629304073, - "url": "https://action.openattestation.com/?q=xxx", + "url": "https://www.verify.gov.sg/verify?q=xxx", "gpayCovidCardUrl": "https://pay.google.com/gp/v/save/xxx" } ``` diff --git a/src/services/transientStorage/index.ts b/src/services/transientStorage/index.ts index 0d882d4f..8fbc7c0f 100644 --- a/src/services/transientStorage/index.ts +++ b/src/services/transientStorage/index.ts @@ -37,16 +37,17 @@ const stringifyAndEncode = (obj: any): string => const universalUrl = (url: string, key: string) => { const subDomain = process.env.STAGE === "production" ? "www" : "dev"; + const fullDomainToVerifyPath = `https://${subDomain}.verify.gov.sg/verify`; const query = stringifyAndEncode({ type: "DOCUMENT", payload: { uri: url, permittedActions: ["VIEW", "STORE"], - redirect: `https://${subDomain}.verify.gov.sg/verify`, + redirect: fullDomainToVerifyPath, }, }); const anchor = key ? `#${stringifyAndEncode({ key })}` : ``; - return `https://action.openattestation.com/?q=${query}${anchor}`; + return `${fullDomainToVerifyPath}?q=${query}${anchor}`; }; export const buildStoredUrl = (id: string, key: string) => { From 51d2f6fdcca54037c2edd3cc47fb0cd036179a8c Mon Sep 17 00:00:00 2001 From: Zaw Myo Latt Date: Wed, 22 Dec 2021 14:00:07 +0800 Subject: [PATCH 05/20] Fix: skip new SPM wallet notification for multi type oa doc (#411) --- src/functionHandlers/notarisePdt/v2/handler.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/functionHandlers/notarisePdt/v2/handler.ts b/src/functionHandlers/notarisePdt/v2/handler.ts index ed0c6d50..87e6d55e 100644 --- a/src/functionHandlers/notarisePdt/v2/handler.ts +++ b/src/functionHandlers/notarisePdt/v2/handler.ts @@ -88,12 +88,14 @@ export const main: Handler = async ( /* Send to SPM notification/wallet */ if (parsedFhirBundle.patient?.nricFin && config.notification.enabled) { try { - const testType = - testData[0].swabTypeCode === config.swabTestTypes.PCR - ? "PCR" - : testData[0].swabTypeCode === config.swabTestTypes.ART - ? "ART" - : null; + let testType = null; + /* [NEW] SPM wallet notification support only for single type oa doc */ + if (testData.length === 1) { + if (testData[0].swabTypeCode === config.swabTestTypes.PCR) + testType = "PCR"; + else if (testData[0].swabTypeCode === config.swabTestTypes.ART) + testType = "ART"; + } if (config.healthCertNotification.enabled && testType) { /* [NEW] Send HealthCert to SPM wallet for PCR | ART (Only if enabled) */ await notifyHealthCert({ From b7b296d060c471c45e4aa5ae6567caa9c55b1897 Mon Sep 17 00:00:00 2001 From: Zaw Myo Latt Date: Mon, 27 Dec 2021 12:29:56 +0800 Subject: [PATCH 06/20] 180725514 : Add logic to remove child record from SPM Notification if below 15 years old (#413) * 180725514 : Add logic to remove child record from SPM Notification if below 15 years old * Fix: check certificate type from oa doc type * chore: rename buildUniversalUrl --- .../notarisePdt/v1/notarisePdt.ts | 10 +- .../notarisePdt/v2/handler.ts | 42 +- .../notarisePdt/v2/notarisePdt.ts | 21 +- src/services/spmNotification/index.test.ts | 395 ++++++++++++++++++ src/services/spmNotification/index.ts | 62 +++ src/services/transientStorage/index.ts | 21 +- 6 files changed, 478 insertions(+), 73 deletions(-) create mode 100644 src/services/spmNotification/index.test.ts create mode 100644 src/services/spmNotification/index.ts diff --git a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts b/src/functionHandlers/notarisePdt/v1/notarisePdt.ts index 25c149c0..ad482080 100644 --- a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts +++ b/src/functionHandlers/notarisePdt/v1/notarisePdt.ts @@ -7,7 +7,7 @@ import { import { getLogger } from "../../../common/logger"; import { createNotarizedHealthCert } from "../../../models/notarizedHealthCert"; import { - buildStoredUrl, + buildUniversalUrl, getQueueNumber, uploadDocument, } from "../../../services/transientStorage"; @@ -32,7 +32,7 @@ export const notarisePdt = async ( const { id, key } = await getQueueNumber(reference); traceWithRef(`placeholder document id: ${id}`); - const storedUrl = buildStoredUrl(id, key); + const universalUrl = buildUniversalUrl(id, key); const data = getData(certificate); const testData = getTestDataFromHealthCert(data); const { nric, fin } = getParticularsFromHealthCert(data); @@ -54,7 +54,7 @@ export const notarisePdt = async ( testDataTypes.includes(config.swabTestTypes.PCR) ) { traceWithRef("signedEuHealthCerts: Generating EU test cert..."); - const euTestCerts = createEuTestCert(testData, reference, storedUrl); + const euTestCerts = createEuTestCert(testData, reference, universalUrl); traceWithRef(euTestCerts); signedEuHealthCerts = await createEuSignedTestQr(euTestCerts); if (!signedEuHealthCerts.length) { @@ -79,7 +79,7 @@ export const notarisePdt = async ( const notarisedDocument = await createNotarizedHealthCert( certificate, reference, - storedUrl, + universalUrl, signedEuHealthCerts ); const { ttl } = await uploadDocument(notarisedDocument, id, reference); @@ -87,6 +87,6 @@ export const notarisePdt = async ( return { notarisedDocument, ttl, - url: storedUrl, + url: universalUrl, }; }; diff --git a/src/functionHandlers/notarisePdt/v2/handler.ts b/src/functionHandlers/notarisePdt/v2/handler.ts index 87e6d55e..ad165fbb 100644 --- a/src/functionHandlers/notarisePdt/v2/handler.ts +++ b/src/functionHandlers/notarisePdt/v2/handler.ts @@ -1,11 +1,8 @@ import { APIGatewayProxyResult, Handler } from "aws-lambda"; import { v4 as uuid } from "uuid"; import { getData, WrappedDocument } from "@govtechsg/open-attestation"; -import { - notifyHealthCert, - notifyPdt, -} from "@notarise-gov-sg/sns-notify-recipients"; import { R4 } from "@ahryman40k/ts-fhir-types"; +import { sendNotification } from "../../../services/spmNotification"; import fhirHelper from "../../../models/fhir"; import { ParsedBundle } from "../../../models/fhir/types"; import { getTestDataFromParseFhirBundle } from "../../../models/healthCertV2"; @@ -66,14 +63,13 @@ export const main: Handler = async ( /* 2. Endorsement */ let result: NotarisationResult; - let directUrl: string; try { - ({ result, directUrl } = await notarisePdt( + result = await notarisePdt( reference, wrappedDocument, parsedFhirBundle as ParsedBundle, testData as TestData[] - )); + ); } catch (e) { errorWithRef(`Unhandled error: ${e instanceof Error ? e.message : e}`); return { @@ -85,36 +81,10 @@ export const main: Handler = async ( }; } - /* Send to SPM notification/wallet */ - if (parsedFhirBundle.patient?.nricFin && config.notification.enabled) { + /* Send to SPM notification/wallet (Only if enabled) */ + if (config.notification.enabled) { try { - let testType = null; - /* [NEW] SPM wallet notification support only for single type oa doc */ - if (testData.length === 1) { - if (testData[0].swabTypeCode === config.swabTestTypes.PCR) - testType = "PCR"; - else if (testData[0].swabTypeCode === config.swabTestTypes.ART) - testType = "ART"; - } - if (config.healthCertNotification.enabled && testType) { - /* [NEW] Send HealthCert to SPM wallet for PCR | ART (Only if enabled) */ - await notifyHealthCert({ - uin: parsedFhirBundle.patient.nricFin, - version: "2.0", - type: testType, - url: directUrl, - expiry: result.ttl, - }); - } else { - /* Send SPM notification to recipient (Only if enabled) */ - await notifyPdt({ - url: result.url, - nric: parsedFhirBundle.patient.nricFin, - passportNumber: parsedFhirBundle.patient?.passportNumber, - testData, - validFrom: data.validFrom, - }); - } + await sendNotification(result, parsedFhirBundle, testData, data); } catch (e) { if (e instanceof Error) { errorWithRef(`SPM notification/wallet error: ${e.message}`); diff --git a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts index 57c2f0eb..38c54e6b 100644 --- a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts +++ b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts @@ -4,8 +4,7 @@ import { ParsedBundle } from "../../../models/fhir/types"; import { getLogger } from "../../../common/logger"; import { createNotarizedHealthCert } from "../../../models/notarizedHealthCertV2"; import { - buildStoredDirectUrl, - buildStoredUrl, + buildUniversalUrl, getQueueNumber, uploadDocument, } from "../../../services/transientStorage"; @@ -23,15 +22,14 @@ export const notarisePdt = async ( certificate: WrappedDocument, parsedFhirBundle: ParsedBundle, testData: TestData[] -): Promise<{ result: NotarisationResult; directUrl: string }> => { +): Promise => { const errorWithRef = trace.extend(`reference:${reference}`); const traceWithRef = trace.extend(`reference:${reference}`); const { id, key } = await getQueueNumber(reference); traceWithRef(`placeholder document id: ${id}`); - const directUrl = buildStoredDirectUrl(id, key); - const storedUrl = buildStoredUrl(id, key); + const universalUrl = buildUniversalUrl(id, key); const whiteListNrics = getDefaultIfUndefined(process.env.WHITELIST_NRICS, "") .split(",") @@ -54,7 +52,7 @@ export const notarisePdt = async ( const euTestCerts = await createEuTestCert( testData, reference, - storedUrl + universalUrl ); traceWithRef(euTestCerts); signedEuHealthCerts = await createEuSignedTestQr(euTestCerts); @@ -81,17 +79,14 @@ export const notarisePdt = async ( certificate, parsedFhirBundle, reference, - storedUrl, + universalUrl, signedEuHealthCerts ); const { ttl } = await uploadDocument(notarisedDocument, id, reference); traceWithRef("Document successfully notarised"); return { - result: { - notarisedDocument, - ttl, - url: storedUrl, - }, - directUrl, + notarisedDocument, + ttl, + url: universalUrl, }; }; diff --git a/src/services/spmNotification/index.test.ts b/src/services/spmNotification/index.test.ts new file mode 100644 index 00000000..f50e9de9 --- /dev/null +++ b/src/services/spmNotification/index.test.ts @@ -0,0 +1,395 @@ +import { + notifyHealthCert, + notifyPdt, +} from "@notarise-gov-sg/sns-notify-recipients"; +import { ParsedBundle, GroupedObservation } from "../../models/fhir/types"; +import { NotarisationResult, TestData, PDTHealthCertV2 } from "../../types"; +import { config } from "../../config"; +import { sendNotification } from "./index"; + +jest.mock("@notarise-gov-sg/sns-notify-recipients"); + +describe("single type oa-doc notification", () => { + let certificateData: PDTHealthCertV2; + let resultMock: NotarisationResult; + let groupedObservationMock: GroupedObservation[]; + let parsedFhirBundleMock: ParsedBundle; + let testDataMock: TestData[]; + let spy: jest.SpyInstance; + beforeAll(() => { + spy = jest.spyOn(console, "error").mockImplementation(() => { + // do not display errors + }); + config.healthCertNotification.enabled = true; + }); + beforeEach(() => { + certificateData = { + validFrom: "2021-08-24T04:22:36.062Z", + type: "PCR" as any, + } as any; + resultMock = { + notarisedDocument: "notarisedDocument" as any, + ttl: 12345678, + url: "verify.sg/url", + gpayCovidCardUrl: "gpay.com/url", + }; + groupedObservationMock = [ + { + observation: { + testType: { + code: "258500001", + display: "Nasopharyngeal swab", + }, + specimenResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12345", + practitionerResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12346", + organizationAlResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12347", + organizationLhpResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12348", + acsn: "123456789", + targetDisease: { + code: "840539006", + display: "COVID-19", + }, + result: { + code: "260385009", + display: "Negative", + }, + effectiveDateTime: "2020-09-28T06:15:00Z", + status: "final" as any, + }, + specimen: {} as any, + practitioner: {} as any, + organization: {} as any, + }, + ]; + parsedFhirBundleMock = { + patient: { + fullName: "Tan Chen Chen", + nricFin: "S9098989Z", + birthDate: "1990-01-15", + passportNumber: "E7831177G", + nationality: { + code: "SG", + }, + }, + observations: groupedObservationMock, + organization: {} as any, + }; + testDataMock = [ + { + provider: "MacRitchie Medical Clinic", + gender: "M", + lab: "lab", + nationality: "SG", + nric: "123", + observationDate: "6/28/21 2:15:00 PM GMT+08:00", + passportNumber: "ES12345", + patientName: "TESTING", + performerMcr: "123", + performerName: "123", + birthDate: "01/01/2021", + swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", + swabType: "Nasopharyngeal swab", + swabTypeCode: "258500001", + testCode: "94531-1", + testType: + "Reverse transcription polymerase chain reaction (rRT-PCR) test", + testResult: "Negative", + testResultCode: "260385009", + }, + ]; + }); + afterEach(() => { + jest.clearAllMocks(); + }); + afterAll(() => { + spy.mockRestore(); + }); + + it("skip notifyHealthCert/notifyPdt for child valid test cert", async () => { + // set patient dob to 5 years old (less than 15 years) + parsedFhirBundleMock.patient.birthDate = new Date( + new Date().getFullYear() - 5, + 1, + 1 + ).toISOString(); + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyHealthCert).toBeCalledTimes(0); + expect(notifyPdt).toBeCalledTimes(0); + }); + + it("skip notifyHealthCert/notifyPdt for valid PCR test cert without nric/fin", async () => { + // remove patient nric/fin + delete parsedFhirBundleMock.patient.nricFin; + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyHealthCert).toBeCalledTimes(0); + expect(notifyPdt).toBeCalledTimes(0); + }); + + it("trigger notifyPdt for single valid SER test cert", async () => { + // set test type code to SER + certificateData.type = "SER" as any; + parsedFhirBundleMock.observations[0].observation.testType = { + code: "94661-6", + display: "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", + }; + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyPdt).toBeCalledTimes(1); + expect(notifyPdt).toHaveBeenCalledWith({ + nric: parsedFhirBundleMock.patient.nricFin, + passportNumber: parsedFhirBundleMock.patient.passportNumber, + testData: testDataMock, + url: resultMock.url, + validFrom: certificateData.validFrom, + }); + }); + + it("trigger notifyHealthCert for valid ART test cert", async () => { + // set test type code to ART + certificateData.type = "ART" as any; + parsedFhirBundleMock.observations[0].observation.testType = { + code: "697989009", + display: "Anterior nares swab", + }; + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + + expect(notifyHealthCert).toBeCalledTimes(1); + expect(notifyHealthCert).toHaveBeenCalledWith({ + expiry: resultMock.ttl, + type: "ART", + uin: parsedFhirBundleMock.patient.nricFin, + url: resultMock.url, + version: "2.0", + }); + }); + + it("trigger notifyHealthCert for valid PCR test cert", async () => { + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + + expect(notifyHealthCert).toBeCalledTimes(1); + expect(notifyHealthCert).toHaveBeenCalledWith({ + expiry: resultMock.ttl, + type: "PCR", + uin: parsedFhirBundleMock.patient.nricFin, + url: resultMock.url, + version: "2.0", + }); + }); +}); + +describe("multi type oa-doc notification", () => { + let certificateData: PDTHealthCertV2; + let resultMock: NotarisationResult; + let groupedObservationMock: GroupedObservation[]; + let parsedFhirBundleMock: ParsedBundle; + let testDataMock: TestData[]; + let spy: jest.SpyInstance; + beforeAll(() => { + spy = jest.spyOn(console, "error").mockImplementation(() => { + // do not display errors + }); + config.healthCertNotification.enabled = true; + }); + beforeEach(() => { + certificateData = { + validFrom: "2021-08-24T04:22:36.062Z", + type: ["PCR", "SER"] as any, + } as any; + resultMock = { + notarisedDocument: "notarisedDocument" as any, + ttl: 12345678, + url: "verify.sg/url", + gpayCovidCardUrl: "gpay.com/url", + }; + groupedObservationMock = [ + { + observation: { + testType: { + code: "258500001", + display: "Nasopharyngeal swab", + }, + specimenResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12345", + practitionerResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12346", + organizationAlResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12347", + organizationLhpResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-12348", + acsn: "123456789", + targetDisease: { + code: "840539006", + display: "COVID-19", + }, + result: { + code: "260385009", + display: "Negative", + }, + effectiveDateTime: "2020-09-28T06:15:00Z", + status: "final" as any, + }, + specimen: {} as any, + practitioner: {} as any, + organization: {} as any, + }, + { + observation: { + testType: { + code: "94661-6", + display: + "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", + }, + specimenResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-123425", + practitionerResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-123426", + organizationAlResourceUuid: "urn:uuid:0275bfaf-48fb-44e0-80cd-123427", + organizationLhpResourceUuid: + "urn:uuid:0275bfaf-48fb-44e0-80cd-123428", + acsn: "123456789", + targetDisease: { + code: "840539006", + display: "COVID-19", + }, + result: { + code: "260385009", + display: "Negative", + }, + effectiveDateTime: "2020-09-28T06:15:00Z", + status: "final" as any, + }, + specimen: {} as any, + practitioner: {} as any, + organization: {} as any, + }, + ]; + parsedFhirBundleMock = { + patient: { + fullName: "Tan Chen Chen", + nricFin: "S9098989Z", + birthDate: "1990-01-15", + passportNumber: "E7831177G", + nationality: { + code: "SG", + }, + }, + observations: groupedObservationMock, + organization: {} as any, + }; + testDataMock = [ + { + provider: "MacRitchie Medical Clinic", + gender: "M", + lab: "lab", + nationality: "SG", + nric: "123", + observationDate: "6/28/21 2:15:00 PM GMT+08:00", + passportNumber: "ES12345", + patientName: "TESTING", + performerMcr: "123", + performerName: "123", + birthDate: "01/01/2021", + swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", + swabType: "Nasopharyngeal swab", + swabTypeCode: "258500001", + testCode: "94531-1", + testType: + "Reverse transcription polymerase chain reaction (rRT-PCR) test", + testResult: "Negative", + testResultCode: "260385009", + }, + { + provider: "MacRitchie Medical Clinic", + gender: "M", + lab: "lab", + nationality: "SG", + nric: "123", + observationDate: "6/28/21 2:15:00 PM GMT+08:00", + passportNumber: "ES12345", + patientName: "TESTING", + performerMcr: "123", + performerName: "123", + birthDate: "01/01/2021", + swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", + swabType: "Nasopharyngeal swab", + swabTypeCode: "258500001", + testCode: "94661-6", + testType: + "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", + testResult: "Negative", + testResultCode: "260385009", + }, + ]; + }); + afterEach(() => { + jest.clearAllMocks(); + }); + afterAll(() => { + spy.mockRestore(); + }); + + it("skip notifyHealthCert/notifyPdt for child valid [PCR, SER] test cert", async () => { + // set patient dob to 5 years old (less than 15 years) + parsedFhirBundleMock.patient.birthDate = new Date( + new Date().getFullYear() - 5, + 1, + 1 + ).toISOString(); + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyHealthCert).toBeCalledTimes(0); + expect(notifyPdt).toBeCalledTimes(0); + }); + + it("skip notifyHealthCert/notifyPdt for [PCR, SER] test cert without nric/fin", async () => { + // remove patient nric/fin + delete parsedFhirBundleMock.patient.nricFin; + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyHealthCert).toBeCalledTimes(0); + expect(notifyPdt).toBeCalledTimes(0); + }); + + it("trigger notifyPdt for valid [PCR, SER] test cert", async () => { + await sendNotification( + resultMock, + parsedFhirBundleMock, + testDataMock, + certificateData + ); + expect(notifyPdt).toBeCalledTimes(1); + expect(notifyPdt).toHaveBeenCalledWith({ + nric: parsedFhirBundleMock.patient.nricFin, + passportNumber: parsedFhirBundleMock.patient.passportNumber, + testData: testDataMock, + url: resultMock.url, + validFrom: certificateData.validFrom, + }); + }); +}); diff --git a/src/services/spmNotification/index.ts b/src/services/spmNotification/index.ts new file mode 100644 index 00000000..effd36ae --- /dev/null +++ b/src/services/spmNotification/index.ts @@ -0,0 +1,62 @@ +import { + notifyHealthCert, + notifyPdt, +} from "@notarise-gov-sg/sns-notify-recipients"; +import _ from "lodash"; +import moment from "moment-timezone"; +import { pdtHealthCertV2 } from "@govtechsg/oa-schemata"; +import { ParsedBundle } from "../../models/fhir/types"; +import { config } from "../../config"; +import { NotarisationResult, TestData, PDTHealthCertV2 } from "../../types"; + +const { PdtTypes } = pdtHealthCertV2; + +const isChildPatient = (parsedFhirBundle: ParsedBundle): boolean => { + const patientDOB = parsedFhirBundle.patient.birthDate; + return moment().diff(patientDOB, "years") < 15; +}; + +const isEligibleForSpmWallet = (certificateData: PDTHealthCertV2): boolean => { + const supportedSingleTypes = [PdtTypes.Pcr, PdtTypes.Art]; + /* + [NEW] SPM wallet notification support only for; + - single type OA-Doc PCR or ART (currently, doesn't support either single-type 'SER' or multi-type ['PCR', 'SER'].) + */ + return ( + _.isString(certificateData.type) && + supportedSingleTypes.some((t) => t === certificateData.type) + ); +}; + +export const sendNotification = async ( + result: NotarisationResult, + parsedFhirBundle: ParsedBundle, + testData: TestData[], + certificateData: PDTHealthCertV2 +) => { + /* Send SPM notification using api-notify/wallet when patient is adult (15 years & above) and present NRIC-FIN in OA-Doc. */ + if (parsedFhirBundle.patient?.nricFin && !isChildPatient(parsedFhirBundle)) { + /* [NEW] Send HealthCert to SPM wallet for PCR | ART (Only if enabled) */ + if ( + config.healthCertNotification.enabled && + isEligibleForSpmWallet(certificateData) + ) { + await notifyHealthCert({ + uin: parsedFhirBundle.patient?.nricFin, + version: "2.0", + type: certificateData.type as string, + url: result.url, + expiry: result.ttl, + }); + } else { + /* Send SPM notification to recipient (Only if enabled) */ + await notifyPdt({ + url: result.url, + nric: parsedFhirBundle.patient?.nricFin, + passportNumber: parsedFhirBundle.patient?.passportNumber, + testData, + validFrom: certificateData.validFrom, + }); + } + } +}; diff --git a/src/services/transientStorage/index.ts b/src/services/transientStorage/index.ts index 8fbc7c0f..f6a80ec9 100644 --- a/src/services/transientStorage/index.ts +++ b/src/services/transientStorage/index.ts @@ -8,7 +8,7 @@ import { import { config } from "../../config"; import { getLogger } from "../../common/logger"; -const { trace } = getLogger("api-notarise-healthcerts"); +const { trace } = getLogger("src/services/transientStorage"); export const SuccessfulGetQueueNumberResponseDef = Record({ id: String, @@ -50,28 +50,11 @@ const universalUrl = (url: string, key: string) => { return `${fullDomainToVerifyPath}?q=${query}${anchor}`; }; -export const buildStoredUrl = (id: string, key: string) => { +export const buildUniversalUrl = (id: string, key: string) => { const url = `${endpoint}/${id}`; return universalUrl(url, key); }; -const universalDirectUrl = (url: string, key: string) => { - const query = stringifyAndEncode({ - type: "DOCUMENT", - payload: { - uri: url, - permittedActions: ["VIEW", "STORE"], - }, - }); - const anchor = key ? `#${stringifyAndEncode({ key })}` : ``; - return `https://www.verify.gov.sg/verify?q=${query}${anchor}`; -}; - -export const buildStoredDirectUrl = (id: string, key: string) => { - const url = `${endpoint}/${id}`; - return universalDirectUrl(url, key); -}; - export const getQueueNumber = async (reference: string) => { const traceWithRef = trace.extend(`reference:${reference}`); traceWithRef("get queue number"); From 70c14d9ec9879bdfde2d7fb21350d0f779dff8c3 Mon Sep 17 00:00:00 2001 From: Tng Zi Xiang <54768054+zixiang2018@users.noreply.github.com> Date: Tue, 28 Dec 2021 18:38:36 +0800 Subject: [PATCH 07/20] docs: update samples with expiryDateTime (#416) * update pdt_pcr_notarized_with_nric samples with expiryDateTime * update format of sample * update formatting of samples --- ...pdt_pcr_notarized_with_nric_unwrapped.json | 17 +- .../pdt_pcr_notarized_with_nric_wrapped.json | 657 +++++++++--------- 2 files changed, 338 insertions(+), 336 deletions(-) diff --git a/test/fixtures/v2/pdt_pcr_notarized_with_nric_unwrapped.json b/test/fixtures/v2/pdt_pcr_notarized_with_nric_unwrapped.json index 70be45f9..62e4e7be 100644 --- a/test/fixtures/v2/pdt_pcr_notarized_with_nric_unwrapped.json +++ b/test/fixtures/v2/pdt_pcr_notarized_with_nric_unwrapped.json @@ -1,5 +1,5 @@ { - "id": "c5ad19bb-403c-4b52-971d-3f01e87883e3", + "id": "3a21794e-0abb-46ae-91be-f8799818d7b0", "version": "pdt-healthcert-v2.0", "type": "PCR", "validFrom": "2021-08-24T04:22:36.062Z", @@ -42,7 +42,7 @@ }, "value": "E7831177G" }, - { "id": "NRIC-FIN", "value": "S9098989Z" } + { "id": "NRIC-FIN", "value": "S****989Z" } ], "name": [{ "text": "Tan Chen Chen" }], "gender": "female", @@ -283,14 +283,15 @@ "url": "https://healthcert.renderer.moh.gov.sg/" }, "notarisationMetadata": { - "reference": "c5ad19bb-403c-4b52-971d-3f01e87883e3", - "notarisedOn": "2021-09-27T08:57:59.883Z", + "reference": "3a21794e-0abb-46ae-91be-f8799818d7b0", + "notarisedOn": "2021-12-28T07:21:44.562Z", "passportNumber": "E7831177G", - "url": "https://action.openattestation.com/?q=%7B%22type%22%3A%22DOCUMENT%22%2C%22payload%22%3A%7B%22uri%22%3A%22https%3A%2F%2Fapi.storage.staging.notarise.io%2Fdocument%2Fdc65dc7d-05a3-4895-ad80-8dc4a90add1f%22%2C%22permittedActions%22%3A%5B%22VIEW%22%2C%22STORE%22%5D%2C%22redirect%22%3A%22https%3A%2F%2Fwww.verify.gov.sg%2Fverify%22%7D%7D#%7B%22key%22%3A%2210d5995597b68acab3940c53d7433d2a4e1a4c231b67f99e2847cb4b1781098e%22%7D", + "url": "https://www.verify.gov.sg/verify?q=%7B%22type%22%3A%22DOCUMENT%22%2C%22payload%22%3A%7B%22uri%22%3A%22https%3A%2F%2Fapi-vaccine.storage.staging.notarise.io%2Fdocument%2F44409930-70b6-4ab7-94be-86cf57c9ed87%22%2C%22permittedActions%22%3A%5B%22VIEW%22%2C%22STORE%22%5D%2C%22redirect%22%3A%22https%3A%2F%2Fwww.verify.gov.sg%2Fverify%22%7D%7D#%7B%22key%22%3A%2252ae6dafd2ce6f818ccb7d893f4fb58416453f42c4624a9c6a98abf0760f2119%22%7D", "signedEuHealthCerts": [ { "type": "PCR", - "qr": "HC1:6BFK%GA 9HWRH23MLBCFGCFO0WG4Y5XHB1RF%T70GR5QUN87MU6N%4P+JWCK:OJDQ4/M2P+ME2SMMG3SA23V060M$R.KMZ24LES1GO8+0DE2P.5VIHJGK%0I3UPSEHSF5$MI0A7-YK/AUKDUA3D:3K.KJ:6WYCTXRR*/1A5K*+JAKT%2EMQD0AFD T .PM2K 034PV23N MLS EI%TI/AQDSB1ADYTRUMF%EKJ0GDJ83U Q9179 ZTP5VN7O*L92Z3N30 NQJ84D$CA+68ON7+O:RIKQSJ3D.G8L8GNAKMD6D4EQTPX5B.*3V8HI7AYIBM5VB+QJPNPSFZSS-/4+ESBT5+ B940262*32QATB7C1YQYNE500O13TROMGGE45Y.I-I2F.L%Q25YQAV2B$AS87ME7K9NYRL:/8XXSCPS/9L:9ER537L86WOPM5-B6DOJIQ6O0NN7A1PFJ.T1%OTX9E/T 9J7.FEAKFJM:1NWYVBTR6YS ADB7R:CNSUDV D+3QPDD%MMPPJUILKQBWXLHZAN-JLP9XE531BHHJXVDA*E3EP$7A:HC7*C XKE K8WBYQ7+N6NLT2%AIHIP 6+NEXT5DTAKSOFKH9/6O*D5116$HFYI%E6T%BBKEPN9.E9FUP54ITFWYJMR2PQ+T367Z6CI4OLX28PLA*NZ2S-ZHEHAT:FL74Z:V+7KRWQO1U6JH0X899ULEQ/I2R:5B.8T1JQ4L:3K VM-7JR%NM:TK2N:0B-J1GPPYLHB1EEVSI/9 X3Q 0.VD6D8$XQCMH:EONXOXSADLVY$8S1T981C65QE6-MQ6T6W:H$*6S9W5ZSC$RJV8ODT427HMBKF73$RL-6RS28-B/CMOW80*TFAE$D2L*G5UKZGDAMEMVHPA2GV287PIIUNBQF.J4JF-$THLF$RMW9E1L6N/PMI5GVH-:07SGML07XFNX60K7H.VEPAS/PBYQW.6LX972DUNM.YP1JP912OR9Y5PI6DWAGNOP1LUV8PNGVZJ88.KTZGIWSHNG67UX31Y0E0PVSDFBRVPN0TCIJUM$TFX9W7:3TB24KNSY4LIFDIO%1C%0W+.U +JS6GN9W01U-184KDV/VWAT.EUS%FK+DF$TI6P1JTZBSU0EHAW*4W829W5ECQ7Q0RTVNT-FQYV47E3U14RS51" + "qr": "HC1:6BFK%G6 9$P3743BJR6UGEKEOQ68U6B/Q.JLIRLHTTLIDU1UJPTMP1K.C%CQKDJS/0-PLK5D5%P56FFQD54D3IDKJFNDW4VC0P0N-GIZNAKH5 7-32GB0C8GN1A N0U2KHHJ1BR1EHNTU+MU62R8+7*1WY.NCXLV.TK-G:9U$3891PE4HZ177WD*1F1GIN.UA6M9WRLQ81GWA:FP7WT38NWB42331UW3G9NH3SEM3KP/TRXH%R2/9NFXJ$.M4UG 7LW2AZE0Q0N-EF95L+U7S%QT32%2CZ.BQ5R6/4FPFY62970C103WAUXU/MAWMTSJTAO0.4JXZ66CFX-ON$0E AC8WKT0/$HTHOEY0C:0-61KUF3WV1M6MK97$GYB7SDBT9DUSUEF5T2J%HTHT82G7NLJ1HJQ4QL7QFM7-:A9K6-XSL0I$XSPCMKXD4K09PGQ-99.T6G8FIOFAGERK%BM3-8ZBK Q0D*FW12OMVQ5MNCBQ.JG0W*6UT-C4Q0WGE4KRI2NA30/XU% R1+HK.CNHCRJ4DYAKP9BTUVDCR-GLJEGH65Y5E-DMI3SJAX+H.%PL360GK21B%AQ9IL6.U%Q50OLE0Q5BJ+RC1U2I60C C%TIXI8*BCI$KDTC 7IZTL82M995EKI7SMCSII:75YM6S5940XDO4A06+4::N9VM6-ABIIJNL+RJDFA8IP1%D S7R7HSSPAOKM57%PLCMG.%FK7GW$Q$.ICOOM0TK-C0QL7VLY9M4*MPZ6:Q5AV5BKK:/I:MDHRTD3FKDATDMF7BN/TNQNA%SI97 XL8$PBGFT4CCOM4ANKKQ-KGCSPL%PTDB .I97D5MT2-CW$URHKZHJ6WC ZU- 2/KTLNC6A13D4R44H90RZP6P02D9X7JB2I:FHXZFT.33PKTJ9BR8/:L13MSFHYN9/VO..U5A1P38G0P7PMAMB:-8G4G9LLIRUW-QYX4 7U: TQ90./KD+TI.V1KCOLE0PC%KSOR6FQ5J%R$CUFTE*V4ZIMQXJNBP7HPI2I7Y5EYBMQAWZB-YFTLANIN2+MTI4*TN/BOU*O.REN4K59VJUKV4C4RV..9O$UJNO%XS22WZWVWHDO4PUXM/PFFNRI8IA2AGLV.UNJ%3-HFIKHP9PS3O*DWB4S9WV08NG6EHLL$2SPCE106J$Q22", + "expiryDateTime": "2022-01-04T07:21:44.143Z" } ] }, @@ -299,7 +300,7 @@ { "filename": "healthcert.txt", "type": "text/open-attestation", - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiNzY5MzcxMDMtNzdlZi00N2MxLTk5MTItYmI5MmRjNDgyN2VhOnN0cmluZzpjMjM1NmUzYi05MDA5LTQyMjAtYTFjYy0xYWY4ZDM0MjBkYWQiLCJ2ZXJzaW9uIjoiNzFhNWUzOTgtY2FmMi00NDQ4LTg2NzQtMTAwYzgxNGZkNzBhOnN0cmluZzpwZHQtaGVhbHRoY2VydC12Mi4wIiwidHlwZSI6IjNkZWVkNzExLTJiNGMtNDE2ZC04YTBmLWMyMTA1MzQwMDdmODpzdHJpbmc6UENSIiwidmFsaWRGcm9tIjoiZDUwMDhmMGItOGM1NC00YzQ1LTk5ZGEtYjE4NzkxY2ViMjY2OnN0cmluZzoyMDIxLTA4LTI0VDA0OjIyOjM2LjA2MloiLCJmaGlyVmVyc2lvbiI6ImFkNzdjYjEyLTNlZjgtNGZjZi04MmVjLTJkOTYyYTlkZDQ4NDpzdHJpbmc6NC4wLjEiLCJmaGlyQnVuZGxlIjp7InJlc291cmNlVHlwZSI6IjZjMDk3YmI0LTI3YjQtNDA0Yy1iNTViLTI3MmI4ZTkwNGMxYzpzdHJpbmc6QnVuZGxlIiwidHlwZSI6ImY1NjAwMDYyLWIwZTgtNGVmZS1hNDhkLTMxZjg0MjY5MWYwYjpzdHJpbmc6Y29sbGVjdGlvbiIsImVudHJ5IjpbeyJmdWxsVXJsIjoiZDViODc4ZDUtMTdkOS00ODcyLTk3OTctYTE2MTRhM2Y0YzE3OnN0cmluZzp1cm46dXVpZDpiYTdiN2M4ZC1jNTA5LTRkOWQtYmU0ZS1mOTliNmRlMjllMjMiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiIzYWM5NmRlOS0yNDQxLTRkMzItYmFlNS04ZGNiYjBkMjgyZWU6c3RyaW5nOlBhdGllbnQiLCJleHRlbnNpb24iOlt7InVybCI6IjRkNDE3MGU5LWFkMDMtNDkyNy1hODc1LWQyYjc0OWUyZDBmNDpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLCJleHRlbnNpb24iOlt7InVybCI6ImJkZTI0NTVlLTE5YjYtNDcyNi04OTg1LTRlOGVhNWUxYjU1NTpzdHJpbmc6Y29kZSIsInZhbHVlQ29kZWFibGVDb25jZXB0Ijp7InRleHQiOiJhMmM3YTA0My0xOWY2LTQxZmEtOGMxOS1lNWM2Y2E3NDAyNzk6c3RyaW5nOlBhdGllbnQgTmF0aW9uYWxpdHkiLCJjb2RpbmciOlt7InN5c3RlbSI6IjhhZDU2NDY3LWNiMzMtNDBlYy1iNTIxLWE3MTIzMWVhMGU1NzpzdHJpbmc6dXJuOmlzbzpzdGQ6aXNvOjMxNjYiLCJjb2RlIjoiYjQ0MmFiNTQtZGM4NC00MGNmLWE0MmMtYzc2MmJhMTg0MTY5OnN0cmluZzpTRyJ9XX19XX1dLCJpZGVudGlmaWVyIjpbeyJpZCI6IjRiZTk4ZGFiLWJjZWYtNGQ2MS04ZDY2LTNiY2M2ZjBiZmIzYjpzdHJpbmc6UFBOIiwidHlwZSI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjI4OTIyNGRmLTI0ZmItNDgxZi04OTM0LTVhYTVkNGIxNmVmMzpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS92Mi0wMjAzIiwiY29kZSI6ImZmMGUwOTJiLTNkOWItNDE3Ni04YjZkLTMyMGEyOTVhZDliYzpzdHJpbmc6UFBOIiwiZGlzcGxheSI6ImU5NmIxNjQ0LTg0Y2UtNDlkYS04NWRkLTQ2YzI1NjcxYWNjMzpzdHJpbmc6UGFzc3BvcnQgTnVtYmVyIn1dfSwidmFsdWUiOiIzMTQ4YWY2Yi0xMThmLTQ5ZWEtOWQzOS1hODBlYzljMzhjMGI6c3RyaW5nOkU3ODMxMTc3RyJ9LHsiaWQiOiI5NGUzNDk5ZS04YWU4LTRiZjctODgxMS0wZGMyMGRmMTYwOTQ6c3RyaW5nOk5SSUMtRklOIiwidmFsdWUiOiI2MTJjNDEyMC1hM2EwLTQ0MWQtOTFmMy1jNjUwYjlhM2U1MTI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjE5YjhlMDI0LWMwYzAtNDQ0NS1iMTE3LTVjMjY4ZmFmYzFlZTpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiY2Q5ZTE0MWQtYTZlYi00ZDk4LTk3M2QtZDYwMTczNWUzNTI4OnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiI2NTNhYmFjOS0yMjUxLTQzY2YtOWRiYy1lNWM2Nzg2M2U3M2U6c3RyaW5nOjE5OTAtMDEtMTUifX0seyJmdWxsVXJsIjoiZTQyZDQwY2UtOTY3Yi00YTEyLTkzMDktZWU1MmU2MGNhM2U0OnN0cmluZzp1cm46dXVpZDo3NzI5OTcwZS1hYjI2LTQ2OWYtYjNlNS0zNmE0MmVjMjQxNDYiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiI3YTQzMjgxMS1jMTVhLTQ3MDQtYjA2Yy0yNzUzYTYzOTE1MjY6c3RyaW5nOk9ic2VydmF0aW9uIiwic3BlY2ltZW4iOnsidHlwZSI6ImU0YzE2NDJlLTFhMTAtNGY5Zi1hYWU2LWUwNjU3YjJkZjU4MDpzdHJpbmc6U3BlY2ltZW4iLCJyZWZlcmVuY2UiOiIzMTY0YzVmZi1jOWM1LTQxZDUtYmYzNy0wZDNhYjEwMTI1MTE6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSJ9LCJwZXJmb3JtZXIiOlt7InR5cGUiOiI1OTJjZDVhMi1kNmE0LTRhODctODNjNi1iMmQ1YTU5Y2E1YzM6c3RyaW5nOlByYWN0aXRpb25lciIsInJlZmVyZW5jZSI6IjE2MTU5MTljLTIxMWUtNDc2ZS05NjU2LTdkNzkyNGQyYzE5NTpzdHJpbmc6dXJuOnV1aWQ6M2RiZmYwZGUtZDRhNC00ZTFkLTk4YmYtYWY3NDI4YjhhMDRiIn0seyJpZCI6ImExZDhkMDRmLWI4ZTQtNDY4Yy1hOTQzLWQ0OWZkNWVhYmZkNDpzdHJpbmc6TEhQIiwidHlwZSI6ImM1MzNkNjg3LTdkMmYtNDZhOC04OGM1LTNlYWIxZDBiOTUzNjpzdHJpbmc6T3JnYW5pemF0aW9uIiwicmVmZXJlbmNlIjoiODEyYTliYjUtYTgwMS00YjdlLWJjMWEtMGQ2NzUyMGVhNmY5OnN0cmluZzp1cm46dXVpZDpmYTIzMjhhZi00ODgyLTRlYWEtOGMyOC02NmRhYjQ2OTUwZjEifSx7ImlkIjoiOTk5M2I0OGYtOTQ4Yy00NzJkLWFjM2EtYzhjZjQxMTFlNGNjOnN0cmluZzpBTCIsInR5cGUiOiIwZjhjMjQ2NS04ZjgyLTQ1YmUtYTNlNC1kNjk2NDdlNmE5MzI6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImQ5MTZmM2JmLTdjZDEtNDg1Ni05NDY2LWIxYzY3MWU0ZTU1ZTpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3In1dLCJpZGVudGlmaWVyIjpbeyJpZCI6IjM5OTYxMGFiLTNjOTItNDZjNC05MjA0LTkwNmMzMzM0YzU3ODpzdHJpbmc6QUNTTiIsInR5cGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiJkNjg1MTc1NC1mMWMwLTRlNWMtYjQzMC1jMzJmMTY5YzU4MjM6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJmYzNhNTM2Yy1lMGFlLTQ1ZmUtYjliOS03ZjU0ZTJmN2RkZjg6c3RyaW5nOkFDU04iLCJkaXNwbGF5IjoiNTBiZDhmYzktNDEwZS00OTEwLWIyNGYtNjFiN2I3YTI1ZjE4OnN0cmluZzpBY2Nlc3Npb24gSUQifV19LCJ2YWx1ZSI6IjdkYjJkZDFhLTg3OTYtNGEwYy05NDljLWM0YjQ3NjdmMzgwZTpzdHJpbmc6MTIzNDU2Nzg5In1dLCJjYXRlZ29yeSI6W3siY29kaW5nIjpbeyJzeXN0ZW0iOiI0NmYxNTUwYS1hMGYzLTRiYWMtOWMwYy0xOTc2NjJmNDdmZWU6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNTA5MmU3MTctM2RhYi00OTIwLWFmM2EtNDA2NTE1MTRiZDZiOnN0cmluZzo4NDA1MzkwMDYiLCJkaXNwbGF5IjoiOTdiZWZkODItN2I4Yy00M2I2LThlZjMtZjFhOWU2YjQ4OGU1OnN0cmluZzpDT1ZJRC0xOSJ9XX1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMmI4MDdkYzUtMmZhOS00YTE1LTg4YWQtNDk4OWZkODYyNmJjOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6ImEwYzE3ZGZhLTVhMTktNDEwYy1hZGJmLTg3ZjljMzYyZWZlMTpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiJkNTNkZWRlNi1hYmE3LTQ4NDEtOTczMC1mNzNmOThkNDQyMjA6c3RyaW5nOlNBUlMtQ29WLTIgKENPVklELTE5KSBSTkEgcGFuZWwgLSBSZXNwaXJhdG9yeSBzcGVjaW1lbiBieSBOQUEgd2l0aCBwcm9iZSBkZXRlY3Rpb24ifV19LCJ2YWx1ZUNvZGVhYmxlQ29uY2VwdCI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjI2NDU2NWVhLTg5MjgtNDhkYS04NDUzLTRhZGJlZGM0NmI4NzpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsImNvZGUiOiJlNDg2ZjQwNi0wNWNjLTQ1MmEtOGY3OS1jMTJhOTlkMmI3NDY6c3RyaW5nOjI2MDM4NTAwOSIsImRpc3BsYXkiOiJiMmY0M2Y0YS1mOWRmLTQ2YmQtOTAzOS1lODJjZmY4OWE1NWQ6c3RyaW5nOk5lZ2F0aXZlIn1dfSwiZWZmZWN0aXZlRGF0ZVRpbWUiOiIzYzhmMDI3My01MjliLTQyYzYtYTdkMS05ZjVlMWMzMDFmYTM6c3RyaW5nOjIwMjAtMDktMjhUMDY6MTU6MDBaIiwic3RhdHVzIjoiN2NhMGJkZmQtYjRkMC00MDI1LTllMGMtYTI2OWI2ZDQ1ZTNlOnN0cmluZzpmaW5hbCJ9fSx7ImZ1bGxVcmwiOiI1NDg2M2M3NC1kZjZkLTQwMmItYmZkMS03MTQ4YWZkMTYxNjg6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImU2ZjhlZjAwLTg4OGItNDk5Yy1iMDA0LTRkMWNkZWQ3YjNmMDpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMDFlNGI4YTItMTc5My00NTkwLTkyZWMtNzE0MGQ5MjhmYTc2OnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6ImY1NGI4MjE3LWNhODUtNGI1NC04YTNiLWY5OTFkZTE3ODYzYTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjU5ZDNhOTk3LTk3ZjAtNGU0Mi04NjM0LTVkZDAwNGE1N2YzZDpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiIyN2U1YjIxMy0wYjI4LTQ2YmUtYTUyZi1hNDhjOTcxMTcyMGE6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19fSx7ImZ1bGxVcmwiOiJmNTc1ZmI3MC03M2MzLTRlZTYtOTRjYi1kYTM5MjNiNTkzOGU6c3RyaW5nOnVybjp1dWlkOjNkYmZmMGRlLWQ0YTQtNGUxZC05OGJmLWFmNzQyOGI4YTA0YiIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImJlMGMyNTRlLTlmNjYtNDgwYy05Nzg1LWVmZTIzZDY1MGRlODpzdHJpbmc6UHJhY3RpdGlvbmVyIiwibmFtZSI6W3sidGV4dCI6ImVkYTkwN2Y5LWYxMmQtNDc1OS1iNTZjLWM5OWE3ODY5ZDZmZDpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV0sInF1YWxpZmljYXRpb24iOlt7ImNvZGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiJhNjU4YmFkNy02NGRiLTQ2ZjQtOTU2NS00MzA4MjUyNmRlNWQ6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJiZDAxYWQwYy05OTFjLTQzNjgtYTk3YS0wYTIxODc0OTA3ZDY6c3RyaW5nOk1DUiIsImRpc3BsYXkiOiIwNjczYTgzZi04NzNiLTQ4MDQtYTdiMy03M2VhNGEwZmQ2ZTQ6c3RyaW5nOlByYWN0aXRpb25lciBNZWRpY2FyZSBudW1iZXIifV19LCJpZGVudGlmaWVyIjpbeyJpZCI6IjRkYjRlZTE3LTMyYjgtNDk4My1hZTNhLWIwM2JkZGIyZTUyNTpzdHJpbmc6TUNSIiwidmFsdWUiOiIzMTA2YWRiYi1lOWVlLTRiMmQtOGNkZi1iM2EwZjAxYjYyYmU6c3RyaW5nOjEyMzQ1NiJ9XSwiaXNzdWVyIjp7InR5cGUiOiIxMTVkNmRlNi0zNTRjLTQ2YTktYjVjYi0yY2ZiYTIwOTg3MDA6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImI2YmNhNjE0LWVmZGMtNDY4My04MWYzLTQ1OGQzMjQ4OGZmZTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIn19XX19LHsiZnVsbFVybCI6ImY4YjFhNzI4LTc5YmYtNDJkMS1iMzRiLThmZmQ2ZTMzNmIxODpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiY2Y5NDEyZWQtNzM4Ny00YTIzLTk4ZTktNDIxMjRhNTVlZGZkOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMmVlODJkNmEtMTc5Zi00YWEwLWE2YjktOTg4MzNhZmQzYWZkOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGggKE1PSCkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6IjQzZGVlMjMxLWJjYzMtNDgwMC1hMjA2LWQ4YTI0ZWI1NTFiYjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiJjZDU4YjMxZi04MWZkLTQzOGYtOGU3ZS0yYjE2YTczN2I1ZjU6c3RyaW5nOmdvdnQiLCJkaXNwbGF5IjoiMGY4M2Q0YmEtY2ZmYi00ODg1LTlhMTQtZDA0YWIxYjQ2ZTIyOnN0cmluZzpHb3Zlcm5tZW50In1dfV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjllMTk1ODQ1LWM2NjQtNGQzNy1hZGZmLWUxM2QzMWY4YzgyMTpzdHJpbmc6dXJsIiwidmFsdWUiOiJhNThhMDllMC00MjExLTQ4ZGYtOTQzMi00ZWZjZWViNGY3ZWI6c3RyaW5nOmh0dHBzOi8vd3d3Lm1vaC5nb3Yuc2cifSx7InN5c3RlbSI6ImJlMGEyYWI4LTNmZjYtNDBiOS05YjkwLTg1MjUyZTFmOTMyZjpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6IjIxMTI4MDQ4LWZiNjUtNDYzNS04MDEyLTViNDRkNTMwZTkxMDpzdHJpbmc6KzY1NjMyNTkyMjAifV0sImFkZHJlc3MiOnsidHlwZSI6ImMyN2FjZGM4LTA2NTktNDE3Mi05YjU2LWE2MWU3ZjQ1MWExNDpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJkNWVjODU5YS1kNzZlLTRlZWItYjE0MS00ZjUwNzliYmM2OTY6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiMzFhYWNiOWYtMDc5Zi00OTdhLTgxNTUtZjFjNDNhOGZhMzk1OnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGgsIDE2IENvbGxlZ2UgUm9hZCwgQ29sbGVnZSBvZiBNZWRpY2luZSBCdWlsZGluZywgU2luZ2Fwb3JlIDE2OTg1NCJ9fV19fSx7ImZ1bGxVcmwiOiI2OWZkNmZiYi1iMGRhLTQ3ZDktYWEyNC0zMWFjNTY1NDI4Nzg6c3RyaW5nOnVybjp1dWlkOmZhMjMyOGFmLTQ4ODItNGVhYS04YzI4LTY2ZGFiNDY5NTBmMSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjFlZjA2M2RlLTI3NmEtNDkyNS05MzUyLWNlZmM5NjM3ZWI2MDpzdHJpbmc6T3JnYW5pemF0aW9uIiwibmFtZSI6IjNmYzQ0Y2MwLWViMzQtNGY2Ny1hNzU4LTMyYjY4ZTZlZTBkNjpzdHJpbmc6TWFjUml0Y2hpZSBNZWRpY2FsIENsaW5pYyIsInR5cGUiOlt7ImNvZGluZyI6W3sic3lzdGVtIjoiN2ViNWJmOTQtNDAzMC00MTlhLWE1YTAtY2RiM2Q5NzQyNWFkOnN0cmluZzpodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL29yZ2FuaXphdGlvbi10eXBlIiwiY29kZSI6IjZhNzU3Yzc2LWNlNTQtNGVkZi05ZGE0LTlmZWFjYWFmZWFiOTpzdHJpbmc6cHJvdiIsImRpc3BsYXkiOiJlNDE0OGY3OS05Y2YxLTQ5MzctYjJkYy00MmUzYjg3MjhiYjc6c3RyaW5nOkhlYWx0aGNhcmUgUHJvdmlkZXIifV0sInRleHQiOiIyNTI2MzBjNS1jYmNlLTRiMDMtYTc0MC1kMjRhMTBhODY3MDg6c3RyaW5nOkxpY2Vuc2VkIEhlYWx0aGNhcmUgUHJvdmlkZXIifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImI4YmYyYmFmLTNkMGEtNDRjOS1iYThiLTNhNGFjYzVjMGM4MTpzdHJpbmc6dXJsIiwidmFsdWUiOiJmZjc2MDc0Mi0wMDNhLTRlY2ItODY4NS0xY2Y5MDQ4YjQxZTk6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0seyJzeXN0ZW0iOiJlODI5ZTFlNi04MGMzLTRhMmUtODRlMi02NTNjYjdkYzQ4NGI6c3RyaW5nOnBob25lIiwidmFsdWUiOiIzZGNkYTAxNi1mNTI0LTRmMDgtODBmNy0xMmMyN2IwNmI4NmM6c3RyaW5nOis2NTYxMjM0NTY3In1dLCJhZGRyZXNzIjp7InR5cGUiOiJmOWM3NmIxZC1hZDg1LTQyNWYtYjRhZi01NDA5MzAxNzk1MWI6c3RyaW5nOnBoeXNpY2FsIiwidXNlIjoiNDZkODc5NzEtOGZlMy00YmNiLTkxNTAtMDIxYmQ0MjEyZWU1OnN0cmluZzp3b3JrIiwidGV4dCI6ImM3NTlhYjkwLTIwNTMtNDE1MC05M2NhLTQyNGIxNWZmNjU4MjpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCwgVGhvbXNvbiBSb2FkLCBTaW5nYXBvcmUgMTIzMDAwIn19XX19LHsiZnVsbFVybCI6IjdmMTE3OTg4LWE1ZWUtNDA5Yy1hZmY4LTZiMmYwZWIxOThhMDpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3IiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiZGIxNmQyMGYtZjljOC00NDkwLWI1NDAtNjJiYzM4NWZlOTRhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMmU3Mjg0ZTEtOWVjNS00ZjU5LWE1YTAtODU3ZmYyYzE5ZWI0OnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6ImJjODViY2ZkLWY5NWEtNDVhMi1hOTg5LWQ4MzMzNGQzYTcwZDpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiIzM2EzY2NmNy0wODc1LTQzYWItOWJlMC01NzRmMmRlYzQ1YjY6c3RyaW5nOnByb3YiLCJkaXNwbGF5IjoiNzY1YWQ2Y2MtMTMwMS00NTc5LTlkOWItNGNiYjM4NTI0YzllOnN0cmluZzpIZWFsdGhjYXJlIFByb3ZpZGVyIn1dLCJ0ZXh0IjoiYTQyOTUxY2MtZWIxNC00MDg4LWJlYTgtYThmZjg0MjliNzhkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjFhNWIyMTQyLTUxNGEtNDA3Zi1iOTc5LTY3ZjJiYzI3NzMwMDpzdHJpbmc6dXJsIiwidmFsdWUiOiJjYThmZjg4Zi01MjlmLTQwZTYtODA2NC00OGQ2NTAxNzk0MzA6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVsYWJvcmF0b3J5LmNvbS5zZyJ9LHsic3lzdGVtIjoiNzY2YzM5YzEtYmZiMS00MjI3LTkxNTEtYTA1ZDJkNzBmM2M5OnN0cmluZzpwaG9uZSIsInZhbHVlIjoiMzUxZDFjNTUtODg0MC00OTBiLTkyYWItN2NhMjY5MzdjMTdhOnN0cmluZzorNjU2NzY1NDMyMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiZDJlMDBkYmYtZGYxMy00NDQyLWFhOTYtMTg4MTRlMTdjOGNjOnN0cmluZzpwaHlzaWNhbCIsInVzZSI6IjJiMWE5N2YwLTJiMDQtNGVjYi1hMGU3LTU1NmI0MmVhMzM2ZjpzdHJpbmc6d29yayIsInRleHQiOiIzYTkxYTU5ZS1lNjUyLTRmMGEtYTNkYy00OWUwMTViNTE1NGM6c3RyaW5nOjIgVGhvbXNvbiBBdmVudWUgNCwgU2luZ2Fwb3JlIDA5ODg4OCJ9fV19fV19LCJpc3N1ZXJzIjpbeyJuYW1lIjoiYWJjZTIxYTUtOTMxYS00ODQxLWJhMWEtNzIxZTgzZmRmZDMyOnN0cmluZzpTQU1QTEUgSVNTVUVSIChETyBOT1QgVkVSSUZZKSIsImlkIjoiOWY3ZTUzMmYtNjI4OC00NDhkLWExMDktZmQ5ZjI3ZjYzNmI0OnN0cmluZzpkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAiLCJyZXZvY2F0aW9uIjp7InR5cGUiOiJiYTA0ZTIzNi05OTg0LTQzOWEtYmVjMi00Y2RkNTc2ZWViMDY6c3RyaW5nOk5PTkUifSwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjcwYmQxNmItNWI1Ni00Mjg0LTg2N2EtNTRiNjk3YzA1ZWE1OnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiIyMjZjZTcyZS01NzZiLTQ2ZjktYTcyMi1jMGU1Y2E4ZDEzNmE6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6IjEwMjM1OGYyLTNkMDQtNDMwNy1hYzc3LWM1YTNmZTdiMTgzYTpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCIkdGVtcGxhdGUiOnsibmFtZSI6ImJkZjBiZWFlLWY4ZTEtNDRhYS1hZmUzLWYwMTE3NjUwNTM4YjpzdHJpbmc6SEVBTFRIX0NFUlQiLCJ0eXBlIjoiMDc0MjEyZmQtZjIxNC00Mzk3LThhMTYtOTQ1MWE2NjAyOGU0OnN0cmluZzpFTUJFRERFRF9SRU5ERVJFUiIsInVybCI6IjgxZDQxZGM3LWJjMDQtNDA4Ni1hNGU1LTdiNzlkNTY1Yzg5YTpzdHJpbmc6aHR0cHM6Ly9oZWFsdGhjZXJ0LnJlbmRlcmVyLm1vaC5nb3Yuc2cvIn0sIm5vdGFyaXNhdGlvbk1ldGFkYXRhIjp7InJlZmVyZW5jZSI6ImZlZjY4OTZiLTc4Y2MtNDI3MC04NmYzLTU0MTg3NDFkOGM3ZjpzdHJpbmc6YzIzNTZlM2ItOTAwOS00MjIwLWExY2MtMWFmOGQzNDIwZGFkIiwibm90YXJpc2VkT24iOiJmYjQ3M2M1Mi0zM2NjLTQ0ZTUtYmUxYy03NTA0N2IyZGFhMWU6c3RyaW5nOjIwMjEtMDgtMjRUMDU6MDk6NTkuMjk5WiIsInBhc3Nwb3J0TnVtYmVyIjoiMmUwYjlhMWUtYjYwOC00NWQyLWFlMjYtNGQwY2EyYTI1NTBkOnN0cmluZzpFNzgzMTE3N0ciLCJ1cmwiOiI1M2VjMWVhYS0xNGQ0LTQ4NTAtOTg1OC0xMzIwMDIxNGZjZTU6c3RyaW5nOmh0dHBzOi8vYWN0aW9uLm9wZW5hdHRlc3RhdGlvbi5jb20vP3E9JTdCJTIydHlwZSUyMiUzQSUyMkRPQ1VNRU5UJTIyJTJDJTIycGF5bG9hZCUyMiUzQSU3QiUyMnVyaSUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXBpLXZhY2NpbmUuc3RvcmFnZS5zdGFnaW5nLm5vdGFyaXNlLmlvJTJGZG9jdW1lbnQlMkYxMTFkMDI3YS1lOGRjLTRlNDQtODkyNC1jNDFjZDcwN2VhYzYlMjIlMkMlMjJwZXJtaXR0ZWRBY3Rpb25zJTIyJTNBJTVCJTIyVklFVyUyMiUyQyUyMlNUT1JFJTIyJTVEJTJDJTIycmVkaXJlY3QlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy52ZXJpZnkuZ292LnNnJTJGdmVyaWZ5JTIyJTdEJTdEIyU3QiUyMmtleSUyMiUzQSUyMmZhMzVkNGI3MzViNmQ1MDMyN2M5N2YwMDgyNzEyOTk5Y2ZhNjQyYmI4MzAyNWY0ODczM2U1ZjIyMzA2NmQ5NmYlMjIlN0QifSwibG9nbyI6ImUyMmRhMDkzLTY2NzgtNDI0ZC1hZTQyLTg1MTI5YzMyZWUyMjpzdHJpbmc6ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFmUUFBQURJQ0FNQUFBQXB4K1BhQUFBQU0xQk1WRVVBQUFETXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNemVDbWlBQUFBQUVIUlNUbE1BUUwrQTd4QWduMkRQM3pCd3IxQ1BFbCtJL1FBQUJ3ZEpSRUZVZU5yc25kMTIyeW9RUnZrSElTSE4rei90eVVrOW9URUNRMWJUQmMyM2J5TnMwQjVHSURBUkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFrK0lrK0lkeDRnNU40QjlHUS9yUEE5Si9JUGZTZ3dML01FRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEd1A1WlBvUDVyN0ZKS0FmN2N1ZkJpaFBOU2tYNWhsQTl1K0RzUDdkWC9KSzFQMlZQaVNJb2ViRXJMd1ZoNVp4KzhDMVkyMll0UDBGcGY2aGRlYSttcTFXbGl4ZmVqNlJjRHhqMDlzd1hiYmVCUXBpanVnMjBhai9TRThidm81aEV1YXZBdVNLcFFmSnhURzkxZ1VyQ1Y2alNRRTBvUGtlNHd1a2U3MDVFcXBMTld4dE10U2s0anZYR2xkK3RMbHh2Vk1ObmFrRDdtRW5kWVRWV1NuVjg2MFdVWGwzNFJNeTdCZW1weUd6TjdwQWJtWEVBNmJmdkswdTMydVRGS0tWTTByMFl3MU1UY0Z2cDhpVkxQRDArOWdIUXkrN3JTZjNlZWpwMkh1RmNzbWxkaUV6MEZ6S1hmU1J3M3FlMDhYcWQ5ZFA2UUtPTm5rdTRsRzNOU2IvUkJ0S3RLdDF0dGRCSmlZYjJWSTdicmM3dGM4SVlvdEp6SFVCMGMrTytUM3JUUXVMS3NaUnFwemtUUzdkWkk0dm8rcUpuZEVHTzhFemVjeWphYzYvSVROMktPV2FVTElUL2FMZGVVbnFwZGk3VlcyK0t5YzI5RkwzczdlM2hpNUxUU2hlV1dweVdsSDRYem12V2puaU9pRk4zWVdEaXZXSTkyV3VrNWN0MkMwcDNKemw5WU42NldJNUlWL1Z5Rjg2cjFhMTdwSDVVTUMwcFgvRHdYVlU1MjRLczVZZ0RabUw0ekd6MXc4MHAzM1BqMXBNdmNpK3RjMmNGSWptaEgyZFdWZnVhVkx1TGp5OWVUemdxT3JxZXd2MHZ1bS8xS1I0KzJhNkRoNXBYTzdWOU8rczRLUkpQQUR1eE5qdGpGQ0NrL0NsdEV6Z2Z6U3RlclN2ZFpRWmVEb3l5cXhRZ3VSMWxYbUJsSS85UFNlYlpwYk9lOGJpdnQyYkZLOVlhSzRlSGU3TkxOYXRMUDNxR1lMZkw3MVJvTXZCNlh1OTZKM1RXdDlMVG9RTTV6bThZZnhiSElFU1BaWFhXL3RvdlRTbytQcUZ4TmVzd1pxak8vWDA5T3ZCZ2k5T2NIdzdsbFV1a2N2K2RpMHJuZXFmOTl1WG9LZ2xNTXdhbGw3eC9teTBtbFA1cGlWbnYzZnVaKzE5M3hucFRZTHozU2plalBMWHBPNlR0WGJ6WHBmSVVjZUpIbVBzWEFKc2JJK2FMN2Z2c3BwVnNPWDd1YWRKOUZ2dVQ2M1B4c1pBUTNVTXh5Z0x5V3ZzazYvbHVrdTQwZmI4dHRvbERGRmIxWlFRNi9tUmt2MWlXOWkxSjZDLzFhZWpBY3ZRUFZtVXQ2RkIyY24yNkp6RE80VHNhTGNXZWFUYm83SW4wNFgwODY5Nlh4VG5ya216R0NIaW1tSnBMdU5hUGk3MWYrS09rdGU1SUs5T3JTNzRpbmdQU2ZKZDFvSVNEOVowbS9oUGhCMG8rL0xkM01NR1VyU1U2OHM5eVV6WFNPM3N1aFcrQmgrSmowb3l6MnNuWnFncGN6ZDVpd3B2UnZtS2ZYcFkvUDB5ZVNmc2dIT2hsaXd0TFM3Y0JTaVIxYVpGUDMwcStCdDNmWGJLOWhRMlRyKzRyU2MrOGRmbFhDTzJsNnBZK1BJczVwRjF4czRrbWJYVkI2ejBKV1JSZEgrNkIwdzhWZW95ZGVXbFY4NHhhVUxudlgwOHZFek5uK0hKT3UrdGZUMWNTYktQTGV3dldrYy9jMS9ZdHM0U2xKK0RIcHVuc0YzMDY5WFNydzdWaFFlbDRnSE4zUXVITzhqRWsvTzhjQytVby9wWFIrdkcwTFNuL1pYeGxYeUlvYzYwUFNoZWxkd3ZkemI0SFczSTcxcE8vMHdIWXFPSXA4djQxSlQ1MlROamY1angyNGZtRTk2V0xyRzcvYnNvTTZlaENHcEo4czAvWlYzazhxblRPZFgxQjY2SE9nYjRiNUtSZnRsNTRmQzdvdnl2WlpwWHQ2Snk0bzNacWVkT3ZNVGRzbFBVaEQwcmxXeHZWTUZ0UzBQMVVPblB2V2s4NFhkYjBESVhXL2tIaU1TTGVtN3JNTUtEbXQ5SjBIbWd0Sy8zQmc3R2hnT0dMQ2dQVDhhZnAxcGRURXg0ODg2bmd0S0YyYzlPcHNnVkRiT0tDSk9RYWtpKzFWckZpK3dyaUpwZk5hL29yU2hjclcyODZqTFlzeXlmWkxsOFNFdG5NNjVqMVNMSCt3WFZHNmpjMERZSTk4NkZ1aktKblFMVjBjMU1ydzdzTzVuL2Z3d0Rma29qOWdmRDRvemh5RkFVVk1xQlJsWXJDZDBvVW5ScmtpeUV6T1BGTkxGelR6VDVWbEJYZDNPbThvemtCdE9PZERQWmtVOWs5L1BDcExrSGFyblpVZkloWE92MC82SVN2MFNPY3ZqLzFiOXR6ZmtONUczeDdlYmRJaDM0V2ZGNnRwRHJyWUs2UFVwZC80ZkpTM2JwWGFydE9KTitTUkRCWE92MGw2bTZFeloxejM1bHc5azNSTzAxV01GQlU0SDQrMjFsTWJiOFhzMHZsdllWSHAzUFVxS0NjYU9EVXNuYk5MU1I1Y1RDK2RaK3BwVmVsQ25LYTExN2VOVE5Ra1NWRmlVMnRQK1FyU09WdlpaYVVMcXd2dFBDaC9qZE1iM1JOOTlRT2tvanY4THNRUzBrL083K3RLZitOTVQ5Nk5QMFV2THZpblJtOUpuMjR3VnJiRENiR0lkRjR4VkJOSi94SlNlNlVlby9Cai85SS83RHkwUHZybkp5NW9wU0lSUlpYMGFRVUFBUHpYM2gzVUFBQ0FRQXg3WUFEL2FuRkJDTmRhbUlBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREFtbW9lSzlIemlCNUk5RUJYbng4QUFBQUFBQUFBQUxCbUFJWktteldJbnh5T0FBQUFBRWxGVGtTdVFtQ0MiLCJhdHRhY2htZW50cyI6W3siZmlsZW5hbWUiOiJmNjNkYTlhNi1lYWQ4LTQ5MTQtYmYyZS1lMmFiMzA2ZmNkZGY6c3RyaW5nOmhlYWx0aGNlcnQudHh0IiwidHlwZSI6ImI2MDRlNjE4LTc4N2QtNGVkNy04MzkyLTljNjExOTVkMzY5ZDpzdHJpbmc6dGV4dC9vcGVuLWF0dGVzdGF0aW9uIiwiZGF0YSI6ImNkMGJlNGZiLTYxNjUtNGFhNS1iMDVmLTdlMmU4MTM1MTgwZDpzdHJpbmc6ZXlKMlpYSnphVzl1SWpvaWFIUjBjSE02THk5elkyaGxiV0V1YjNCbGJtRjBkR1Z6ZEdGMGFXOXVMbU52YlM4eUxqQXZjMk5vWlcxaExtcHpiMjRpTENKa1lYUmhJanA3SW1sa0lqb2lORGhtTXpsbU5qQXROR0l5WVMwME1HRmtMVGhrWmpBdE1USmhNVGRoWldZd09UWTNPbk4wY21sdVp6bzNObU5oWmpObU9TMDFOVGt4TFRSbFpqRXRZamMxTmkweFkySTBOMkUzTm1SbFpHVWlMQ0oyWlhKemFXOXVJam9pWm1JNE9HUXlaak10TW1RM1lTMDBOemxqTFRrMU5ERXRNbVV4WmpZMU5tWmlaalZsT25OMGNtbHVaenB3WkhRdGFHVmhiSFJvWTJWeWRDMTJNaTR3SWl3aWRIbHdaU0k2SW1RNFkyUmhZekJpTFdJMlptSXROR00zTXkxaU16TTJMVE01TXpjNVpHWTNPRGsyTnpwemRISnBibWM2VUVOU0lpd2lkbUZzYVdSR2NtOXRJam9pTVdZNU9XRmxZMkV0WXpZd1pTMDBOelk1TFdJM09HWXRNV0kxTW1FME5tUmlaR0ZoT25OMGNtbHVaem95TURJeExUQTRMVEkwVkRBME9qSXlPak0yTGpBMk1sb2lMQ0ptYUdseVZtVnljMmx2YmlJNklqVmxaVFZtTW1ZMUxUTTBNalF0TkdNeVppMDRNRFE1TFdGak56Z3lPVFE1TlRnek1UcHpkSEpwYm1jNk5DNHdMakVpTENKbWFHbHlRblZ1Wkd4bElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNkltWTNPRFkwWm1ReExUbGpOak10TkRFM1lpMDRaakJrTFdOaE56aG1aVEF4WVdOak9UcHpkSEpwYm1jNlFuVnVaR3hsSWl3aWRIbHdaU0k2SWpVMU9XWmxNV0kwTFRkbVpXVXROR0kxTnkwNVlXWmhMVFF3TkRZd1pXRmxNV1JsTmpwemRISnBibWM2WTI5c2JHVmpkR2x2YmlJc0ltVnVkSEo1SWpwYmV5Sm1kV3hzVlhKc0lqb2lPREppWVdNeU5XWXRaV1EzTkMwME4ySmpMV0UyWkRJdE9XVTNZVGRrTm1JeVpqbGpPbk4wY21sdVp6cDFjbTQ2ZFhWcFpEcGlZVGRpTjJNNFpDMWpOVEE1TFRSa09XUXRZbVUwWlMxbU9UbGlObVJsTWpsbE1qTWlMQ0p5WlhOdmRYSmpaU0k2ZXlKeVpYTnZkWEpqWlZSNWNHVWlPaUl4T0RFME1UZzJOaTA1WkRjeExUUXpOMkV0WVRnMlpTMDVORGt4Tm1SaU9EZzNZbUk2YzNSeWFXNW5PbEJoZEdsbGJuUWlMQ0psZUhSbGJuTnBiMjRpT2x0N0luVnliQ0k2SWpGaU1XTmtOR0ZsTFdZMFlUTXRORE0yWmkwNE9ERTFMVGc0TVdRM1lUTmpNemhtT0RwemRISnBibWM2YUhSMGNEb3ZMMmhzTnk1dmNtY3ZabWhwY2k5VGRISjFZM1IxY21WRVpXWnBibWwwYVc5dUwzQmhkR2xsYm5RdGJtRjBhVzl1WVd4cGRIa2lMQ0psZUhSbGJuTnBiMjRpT2x0N0luVnliQ0k2SWpJd09HVTNZelF5TFRabE5qY3ROREZsT1MwNE9UWmlMVEEzWkdZMk1XVmxOR1pqWXpwemRISnBibWM2WTI5a1pTSXNJblpoYkhWbFEyOWtaV0ZpYkdWRGIyNWpaWEIwSWpwN0luUmxlSFFpT2lJd01XVXpPRGRtWVMxa1pERmxMVFEyWXpBdE9XWTVZUzFrWmpoalpqYzJZemN4TmpRNmMzUnlhVzVuT2xCaGRHbGxiblFnVG1GMGFXOXVZV3hwZEhraUxDSmpiMlJwYm1jaU9sdDdJbk41YzNSbGJTSTZJakF3TVdJd09HWTRMV1U0WkRndE5HTm1aaTFoT1RZMkxXVTFaVFk1T0RGa1ltVmlZVHB6ZEhKcGJtYzZkWEp1T21semJ6cHpkR1E2YVhOdk9qTXhOallpTENKamIyUmxJam9pWmpOak56VTFZVE10TkRrMU5TMDBOVGM0TFRobVpqZ3RPR1F6TXpNMVl6WTVObVU0T25OMGNtbHVaenBUUnlKOVhYMTlYWDFkTENKcFpHVnVkR2xtYVdWeUlqcGJleUpwWkNJNklqQTBaalJpTW1VMUxUVXpZV1l0TkdFMk1DMWhOVGc1TFRobU5UazJaREJqTlRrNVpqcHpkSEpwYm1jNlVGQk9JaXdpZEhsd1pTSTZleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SW1VNVlUWmpNemcyTFdJeVlqQXROREJoTXkxaE5XRTFMVGxoWkdFNFpXTm1NREUxTlRwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5Mk1pMHdNakF6SWl3aVkyOWtaU0k2SWpkaVpXVTBNRGc1TFdSalpESXRORGRpWXkxaU1qYzBMVEE0WW1RMlpEaG1OekJqWWpwemRISnBibWM2VUZCT0lpd2laR2x6Y0d4aGVTSTZJbU14Wm1Vd016Y3pMVFpqWkRJdE5HWmhOUzA0TlRJNUxUbGlNbVk1TnprMU5UWmlOVHB6ZEhKcGJtYzZVR0Z6YzNCdmNuUWdUblZ0WW1WeUluMWRmU3dpZG1Gc2RXVWlPaUpoTVRjNE5tTTVOQzB5WXpSbUxUUXpNRGN0WVdGbU9TMHhaamhsT1RRM01tWmlPV1k2YzNSeWFXNW5Pa1UzT0RNeE1UYzNSeUo5TEhzaWFXUWlPaUkyTlRCbE9XRmpNUzB5T0RCbExUUTVNamd0T0RFellpMWhPVFU1TWpBd1l6azFNRFU2YzNSeWFXNW5PazVTU1VNdFJrbE9JaXdpZG1Gc2RXVWlPaUkxTldNM1l6RTROeTB4WVRZM0xUUmlObVF0WW1FeE5DMDJNR00yTkdaaE1qY3lOR1k2YzNSeWFXNW5PbE01TURrNE9UZzVXaUo5WFN3aWJtRnRaU0k2VzNzaWRHVjRkQ0k2SW1ZM056VXlZalEwTFdSa1pqRXROR001WkMwNU5qTmpMV1F5TkRoaFkyWTJaR1EzTWpwemRISnBibWM2VkdGdUlFTm9aVzRnUTJobGJpSjlYU3dpWjJWdVpHVnlJam9pWkRjeFptTmlOMkV0WldFM1l5MDBZemN6TFdJMU1qUXRZMlkxTnpjM01HTTJOMkk1T25OMGNtbHVaenBtWlcxaGJHVWlMQ0ppYVhKMGFFUmhkR1VpT2lJNVpXSTJNREZtWWkxa01UTXpMVFF6Wm1ZdFlqWm1aQzFsTW1JelpqSTJaRFExWWpJNmMzUnlhVzVuT2pFNU9UQXRNREV0TVRVaWZYMHNleUptZFd4c1ZYSnNJam9pWW1ZM01qUTVaVEl0TTJReVlTMDBNVEV5TFdFMFl6Y3RaR0kwT0RCa056UXhaV1ptT25OMGNtbHVaenAxY200NmRYVnBaRG8zTnpJNU9UY3daUzFoWWpJMkxUUTJPV1l0WWpObE5TMHpObUUwTW1Wak1qUXhORFlpTENKeVpYTnZkWEpqWlNJNmV5SnlaWE52ZFhKalpWUjVjR1VpT2lKa00yTXdabUZtTXkxaU5ERmhMVFF6WXpBdE9XVXpOUzB3TXpBNE5XUXdOR1V5WkdRNmMzUnlhVzVuT2s5aWMyVnlkbUYwYVc5dUlpd2ljM0JsWTJsdFpXNGlPbnNpZEhsd1pTSTZJbU5oWmpjNE1tTXdMV1JqTm1ZdE5EUmhOQzFpWWpZNExUVTBPRGszTVdKak1EbGtOanB6ZEhKcGJtYzZVM0JsWTJsdFpXNGlMQ0p5WldabGNtVnVZMlVpT2lKbU5HTTJOV1V5TXkxak5tWmtMVFF4TnpndE9UazROUzFrTURoa1kyRmtNMlU0TkRBNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pBeU56VmlabUZtTFRRNFptSXRORFJsTUMwNE1HTmtMVGxqTlRBMFpqZ3daVFpoWlNKOUxDSndaWEptYjNKdFpYSWlPbHQ3SW5SNWNHVWlPaUptWTJKaU9EVmpaUzB3WXpFeExUUXlaR010T0RaaE5pMDRaREprTldVNVlUa3daakU2YzNSeWFXNW5PbEJ5WVdOMGFYUnBiMjVsY2lJc0luSmxabVZ5Wlc1alpTSTZJbUprTUdRd09EUTRMVE5pWVdNdE5EQmlZeTA1TUdFMkxUUXlNV1F5TlRRMU1EYzBaanB6ZEhKcGJtYzZkWEp1T25WMWFXUTZNMlJpWm1Zd1pHVXRaRFJoTkMwMFpURmtMVGs0WW1ZdFlXWTNOREk0WWpoaE1EUmlJbjBzZXlKcFpDSTZJalkxWW1WbFpUTXlMV0prWVdJdE5HWXlOQzA0TWpneExUTTJZbVJpWmpsbFlUazBaVHB6ZEhKcGJtYzZURWhRSWl3aWRIbHdaU0k2SW1JNE5tUTJaVFkzTFRsak1UVXROR1kwTlMxaE5qazBMVGRsTWpKaE56UmtaakUyTWpwemRISnBibWM2VDNKbllXNXBlbUYwYVc5dUlpd2ljbVZtWlhKbGJtTmxJam9pT0dRMk5qZzVORGd0TUROa1lTMDBPR0kzTFdGa01ETXRPVGMyWmpNeFptVmlNR1ZqT25OMGNtbHVaenAxY200NmRYVnBaRHBtWVRJek1qaGhaaTAwT0RneUxUUmxZV0V0T0dNeU9DMDJObVJoWWpRMk9UVXdaakVpZlN4N0ltbGtJam9pWVdNMU1qRXdOek10TkdabU55MDBaVFF3TFRrM1l6SXRaamsxTVdabU5UQTRPVEl4T25OMGNtbHVaenBCVENJc0luUjVjR1VpT2lJek1UVXhPV0UxTVMwd056QTBMVFF6TXpFdFlXRTJZeTB5TkRFMk9ERTNaVFpqWlRZNmMzUnlhVzVuT2s5eVoyRnVhWHBoZEdsdmJpSXNJbkpsWm1WeVpXNWpaU0k2SWpaak4yVmpNakExTFdJNE16TXRORFE0TlMwNU5UZ3pMVEkzWlRaaE4yTTRaalJtTVRwemRISnBibWM2ZFhKdU9uVjFhV1E2T0RNNVlUZGpOVFF0Tm1JME1DMDBNV05pTFdJeE1HUXRPVEk1TldRM1pUYzFaamMzSW4xZExDSnBaR1Z1ZEdsbWFXVnlJanBiZXlKcFpDSTZJbUpsTldWa1pXSXhMVFJsT0RrdE5EVTVNQzA0TnpsbUxUUXhaR0k1TW1JMk16VmlORHB6ZEhKcGJtYzZRVU5UVGlJc0luUjVjR1VpT25zaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSmlNbUptTkRreU1pMDBaVEEyTFRReU1ESXRZakEzT0Mwd1pUTXhaVEV5T0dVNFl6STZjM1J5YVc1bk9taDBkSEE2THk5MFpYSnRhVzV2Ykc5bmVTNW9iRGN1YjNKbkwwTnZaR1ZUZVhOMFpXMHZkakl0TURJd015SXNJbU52WkdVaU9pSmlPVEppT0RFMk1pMWhORGMyTFRSak9EQXRPREpoWXkwNE5ESXdNR1V6WXpZME16VTZjM1J5YVc1bk9rRkRVMDRpTENKa2FYTndiR0Y1SWpvaU5UQXhOVEppWmpFdE4yWmlNUzAwWkROaExUazNOMk10T0dJMk5Ea3haR0ZtTURVek9uTjBjbWx1WnpwQlkyTmxjM05wYjI0Z1NVUWlmVjE5TENKMllXeDFaU0k2SWpReE1ERm1OR1kyTFRKbFlUWXRORGxsWWkxaFlqTTBMVEJqTlRoak4yVXlZbVkwWmpwemRISnBibWM2TVRJek5EVTJOemc1SW4xZExDSmpZWFJsWjI5eWVTSTZXM3NpWTI5a2FXNW5JanBiZXlKemVYTjBaVzBpT2lJNFlqWXdaREkyWVMxbU1UZzRMVFJpWmpZdFlqSmhNQzAzTm1Rek1HVTJOREl3WTJVNmMzUnlhVzVuT21oMGRIQTZMeTl6Ym05dFpXUXVhVzVtYnk5elkzUWlMQ0pqYjJSbElqb2lOVGxqWkRFM05UWXRZMkZsTWkwMFpqSmlMV0l4TVRBdE9XRmlaVEF4TUdWak0yRTRPbk4wY21sdVp6bzROREExTXprd01EWWlMQ0prYVhOd2JHRjVJam9pT0dFNU1qQTBNemN0TTJFeFppMDBPR0l6TFdFNFlUVXRZVGs1TXprNU1XTXdZelZoT25OMGNtbHVaenBEVDFaSlJDMHhPU0o5WFgxZExDSmpiMlJsSWpwN0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lOalppWVdVMFl6SXROak13WkMwMFlUVTJMVGxsWTJNdE9UZzNOemxsT1dSak5EVmhPbk4wY21sdVp6cG9kSFJ3T2k4dmJHOXBibU11YjNKbklpd2lZMjlrWlNJNklqazBZVE0yT1RSbUxXSmxOemN0TkdNeVlpMDVORFJoTFRZNE5HRmtZekl4WkdNM016cHpkSEpwYm1jNk9UUTFNekV0TVNJc0ltUnBjM0JzWVhraU9pSTJNVGRoTVRKaVlTMDFPRGxrTFRSbU56WXRPVEJoWXkxaU1qZGlNV1V4T1RjMk1EWTZjM1J5YVc1bk9sTkJVbE10UTI5V0xUSWdLRU5QVmtsRUxURTVLU0JTVGtFZ2NHRnVaV3dnTFNCU1pYTndhWEpoZEc5eWVTQnpjR1ZqYVcxbGJpQmllU0JPUVVFZ2QybDBhQ0J3Y205aVpTQmtaWFJsWTNScGIyNGlmVjE5TENKMllXeDFaVU52WkdWaFlteGxRMjl1WTJWd2RDSTZleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpReVptWXdZMkkwTFRVellUY3RORGhsTUMwNFpUTTRMV0ZpT1ROaVlUTmlNbVEyWlRwemRISnBibWM2YUhSMGNEb3ZMM051YjIxbFpDNXBibVp2TDNOamRDSXNJbU52WkdVaU9pSTJOVFJrTVRZNE1DMHhaVEkzTFRRME5qRXRZVFZoTVMwNE1XRmhZakE1TTJRNU5UQTZjM1J5YVc1bk9qSTJNRE00TlRBd09TSXNJbVJwYzNCc1lYa2lPaUk1WWpFNU9XWm1ZeTFtWkRsa0xUUXdNbVV0T0RabFppMW1OV0V6TWpjMU1HSXpPR002YzNSeWFXNW5PazVsWjJGMGFYWmxJbjFkZlN3aVpXWm1aV04wYVhabFJHRjBaVlJwYldVaU9pSTFOMlJsTmpnNFppMW1ORFkzTFRSaFlUa3RZVGs1TmkwMk5qVTRNekkyWVRFeFpqYzZjM1J5YVc1bk9qSXdNakF0TURrdE1qaFVNRFk2TVRVNk1EQmFJaXdpYzNSaGRIVnpJam9pWWpka05tWTVaV010TURFMlpTMDBOV0ZrTFdJd09HVXROamczTUdNd1pUVm1ZakUzT25OMGNtbHVaenBtYVc1aGJDSjlmU3g3SW1aMWJHeFZjbXdpT2lJM05UazRaVEF4WXkwelpqSTBMVFE0WW1JdE9ERXpNUzFpT0RrNE56TmhaalEyWlRVNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pBeU56VmlabUZtTFRRNFptSXRORFJsTUMwNE1HTmtMVGxqTlRBMFpqZ3daVFpoWlNJc0luSmxjMjkxY21ObElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNklqWmpNVE0xTnpWbExUa3lOVFF0TkRnNFl5MDRNemd3TFRReU4yWXdNakJsWVRRNU1qcHpkSEpwYm1jNlUzQmxZMmx0Wlc0aUxDSjBlWEJsSWpwN0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lNekl6T0dWallqQXRNV1U1TVMwME56STRMV0kyWXpVdE56QTVPRFJtTURZNVpqTXdPbk4wY21sdVp6cG9kSFJ3T2k4dmMyNXZiV1ZrTG1sdVptOHZjMk4wSWl3aVkyOWtaU0k2SWpGbU1UZzNOVFkyTFRFMk1EWXRORFZrTWkxaFpEaG1MV0U0TVdRd1pqZ3hZamMzTkRwemRISnBibWM2TWpVNE5UQXdNREF4SWl3aVpHbHpjR3hoZVNJNklqTXlOR013WVdRMUxUTXdZVEF0TkdRMk9DMWhORGt3TFRZeFpqRmtNMlV4TjJJM1pEcHpkSEpwYm1jNlRtRnpiM0JvWVhKNWJtZGxZV3dnYzNkaFlpSjlYWDBzSW1OdmJHeGxZM1JwYjI0aU9uc2lZMjlzYkdWamRHVmtSR0YwWlZScGJXVWlPaUppWm1KaFpUa3hZeTAwTkRFeExUUXlZbUl0WWprNE9DMWhNMkUxWmpNek5HSmhOekU2YzNSeWFXNW5Pakl3TWpBdE1Ea3RNamRVTURZNk1UVTZNREJhSW4xOWZTeDdJbVoxYkd4VmNtd2lPaUl4TTJJd1pHTTJPQzB5TVdWakxUUXdZemN0T1dKall5MDJZVFF6Tm1abFltVXlPV1U2YzNSeWFXNW5PblZ5YmpwMWRXbGtPak5rWW1abU1HUmxMV1EwWVRRdE5HVXhaQzA1T0dKbUxXRm1OelF5T0dJNFlUQTBZaUlzSW5KbGMyOTFjbU5sSWpwN0luSmxjMjkxY21ObFZIbHdaU0k2SWpoaFlURmtaRFkyTFdRelpqVXROR0l4TXkwNU9EZGpMVGd4WlRNMk5UUTBaR0V4TmpwemRISnBibWM2VUhKaFkzUnBkR2x2Ym1WeUlpd2libUZ0WlNJNlczc2lkR1Y0ZENJNklqZGtPRFJoT0RjeUxUWmlZVEV0TkRJME9TMWlOMkUyTFdFM01URXlOVFpqWldZeU9EcHpkSEpwYm1jNlJISWdUV2xqYUdGbGJDQk1hVzBpZlYwc0luRjFZV3hwWm1sallYUnBiMjRpT2x0N0ltTnZaR1VpT25zaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSTBOVFUxTWpobVl5MDVOR0U1TFRSa09HRXRZVEV4TlMxa1lUWXpPVE5qTkRrM1pqVTZjM1J5YVc1bk9taDBkSEE2THk5MFpYSnRhVzV2Ykc5bmVTNW9iRGN1YjNKbkwwTnZaR1ZUZVhOMFpXMHZkakl0TURJd015SXNJbU52WkdVaU9pSm1OalZsWTJabVpTMDFNRFJrTFRSbE5XUXRZak5rTlMwMVl6TXdNekUxWlRjeU5HUTZjM1J5YVc1bk9rMURVaUlzSW1ScGMzQnNZWGtpT2lKbU9HTm1PVEV4TmkwM056WmlMVFE1TWpjdE9HRXdZUzAwTldWaU1qRmlaREJqTkdJNmMzUnlhVzVuT2xCeVlXTjBhWFJwYjI1bGNpQk5aV1JwWTJGeVpTQnVkVzFpWlhJaWZWMTlMQ0pwWkdWdWRHbG1hV1Z5SWpwYmV5SnBaQ0k2SW1aa1ptVXhZMkZsTFRrMVlXTXROR1ZoWkMxaE56TTBMVFZpWmprMVl6bGhNakJqWkRwemRISnBibWM2VFVOU0lpd2lkbUZzZFdVaU9pSTBNekUxWlRWbVpDMDRaakV6TFRRd1pUY3RZV0V3TUMxa05HUTFaV0ZtWWpNd05tTTZjM1J5YVc1bk9qRXlNelExTmlKOVhTd2lhWE56ZFdWeUlqcDdJblI1Y0dVaU9pSmpNamd6TnpBd05TMWlNRFU0TFRSalpqY3RPVFEwTVMxbU0ySm1aalEwTnpnMllqWTZjM1J5YVc1bk9rOXlaMkZ1YVhwaGRHbHZiaUlzSW5KbFptVnlaVzVqWlNJNklqUTVaalF5WWpWbExUTmpNR0V0TkRJNE55MDVNV0UwTFdaak5ERXhZV0UwWTJVek5EcHpkSEpwYm1jNmRYSnVPblYxYVdRNlltTTNNRFkxWldVdE5ESmhZUzAwTnpOaExXRTJNVFF0WVdaa09HRTNZak13WWpGbEluMTlYWDE5TEhzaVpuVnNiRlZ5YkNJNkltRTBOV1EzTW1SakxUVTJOelV0TkdOaVppMDVORGcyTFRKbU1ESTBNbVE0TkdWaE1qcHpkSEpwYm1jNmRYSnVPblYxYVdRNlltTTNNRFkxWldVdE5ESmhZUzAwTnpOaExXRTJNVFF0WVdaa09HRTNZak13WWpGbElpd2ljbVZ6YjNWeVkyVWlPbnNpY21WemIzVnlZMlZVZVhCbElqb2laVEJrTm1JMFptRXRaV05qWWkwME5HRTJMV0ZtWlRFdFpUTmlOREpoT1RsbU16STFPbk4wY21sdVp6cFBjbWRoYm1sNllYUnBiMjRpTENKdVlXMWxJam9pWW1KbU1EVTBaV1V0T1RBME9DMDBPRGt6TFdJNE9XTXRPR0kzTnprMU56Y3dNekE0T25OMGNtbHVaenBOYVc1cGMzUnllU0J2WmlCSVpXRnNkR2dnS0UxUFNDa2lMQ0owZVhCbElqcGJleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpFd01qRTBaakkwTFRReU1EZ3ROR1EwTWkxaU16bGxMVFEwTldWbE1UUmlZMkprT0RwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5dmNtZGhibWw2WVhScGIyNHRkSGx3WlNJc0ltTnZaR1VpT2lKbE9EWmlaV1EwT0MweU5EWXdMVFJtTXpNdFlXUmhPQzFsWm1Nd1lqSTJNVFZpWVRRNmMzUnlhVzVuT21kdmRuUWlMQ0prYVhOd2JHRjVJam9pTmprMFpXSm1aVFl0T0RSak55MDBOVGc1TFdFNE1HRXRPV1F3WVdRNE1EQTFPREE1T25OMGNtbHVaenBIYjNabGNtNXRaVzUwSW4xZGZWMHNJbU52Ym5SaFkzUWlPbHQ3SW5SbGJHVmpiMjBpT2x0N0luTjVjM1JsYlNJNklqZ3hNakJrTjJZMUxUbGtOamd0TkRCaU5DMWlZekF4TFRFMFpEQmtZV0ptT1dWak1qcHpkSEpwYm1jNmRYSnNJaXdpZG1Gc2RXVWlPaUl4TVRZMlltSXdOaTAwTmpFeUxUUTRZamN0WVdRd05DMWlZelUzWmpJd056SmtPVFU2YzNSeWFXNW5PbWgwZEhCek9pOHZkM2QzTG0xdmFDNW5iM1l1YzJjaWZTeDdJbk41YzNSbGJTSTZJalptWmpNd09URm1MVGswTXpFdE5HRXpaaTFoWWpka0xUVXpZelV5Tm1ReE5Ea3lNanB6ZEhKcGJtYzZjR2h2Ym1VaUxDSjJZV3gxWlNJNkltRXhPVEkwT1dVeUxUazBNek10TkRFNU5TMDROR0ZpTFdSaFlqTXlPR1UyWmpjMlpEcHpkSEpwYm1jNkt6WTFOak15TlRreU1qQWlmVjBzSW1Ga1pISmxjM01pT25zaWRIbHdaU0k2SW1Ka01qTTBOVGs0TFRneVpUZ3ROREJoTlMwNFlqQmxMVFpsTkRjMU9UTmhZemczWmpwemRISnBibWM2Y0doNWMybGpZV3dpTENKMWMyVWlPaUkxTVRRNE5ETXlPQzFsWkRjMUxUUTROVE10T0RGaE5pMDRNbUV6WmpSa01UWmxPREU2YzNSeWFXNW5PbmR2Y21zaUxDSjBaWGgwSWpvaU1UTTRPV016WVRFdFpqYzVZUzAwWWpsbExXSTFZekl0TkRrMk1XTmxOalppWXpVME9uTjBjbWx1WnpwTmFXNXBjM1J5ZVNCdlppQklaV0ZzZEdnc0lERTJJRU52Ykd4bFoyVWdVbTloWkN3Z1EyOXNiR1ZuWlNCdlppQk5aV1JwWTJsdVpTQkNkV2xzWkdsdVp5d2dVMmx1WjJGd2IzSmxJREUyT1RnMU5DSjlmVjE5ZlN4N0ltWjFiR3hWY213aU9pSTRaVGM1Wm1NME55MWpOalV3TFRRNFptVXRPVFJtWkMwME5qRmxOVFZqWTJVNU1qUTZjM1J5YVc1bk9uVnlianAxZFdsa09tWmhNak15T0dGbUxUUTRPREl0TkdWaFlTMDRZekk0TFRZMlpHRmlORFk1TlRCbU1TSXNJbkpsYzI5MWNtTmxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJak16WWpKaU5EUTNMVEF6WTJRdE5ESmpOUzFpT0ROaExXUmhORFUzTkRReFltWXpNanB6ZEhKcGJtYzZUM0puWVc1cGVtRjBhVzl1SWl3aWJtRnRaU0k2SWpSaFl6RTBPR1V3TFRSaE5tTXRORFEyWVMwNE5qUmtMVE5sWW1abE9UWmhNamxpWmpwemRISnBibWM2VFdGalVtbDBZMmhwWlNCTlpXUnBZMkZzSUVOc2FXNXBZeUlzSW5SNWNHVWlPbHQ3SW1OdlpHbHVaeUk2VzNzaWMzbHpkR1Z0SWpvaVpUWXlNamhqTXpVdFlqZGpOUzAwWTJVeExXSmtaVGN0TWpabFl6STVNRGxqTUdGaE9uTjBjbWx1Wnpwb2RIUndPaTh2ZEdWeWJXbHViMnh2WjNrdWFHdzNMbTl5Wnk5RGIyUmxVM2x6ZEdWdEwyOXlaMkZ1YVhwaGRHbHZiaTEwZVhCbElpd2lZMjlrWlNJNklqZzBPVEE0TURBeUxXVXpNVGN0TkRRMll5MWlNREU0TFRSaU1qQm1ZemxoWldNd1pqcHpkSEpwYm1jNmNISnZkaUlzSW1ScGMzQnNZWGtpT2lJMVltTmhZV0l3TlMwd1pUQm1MVFF4Wm1VdE9UUTNNeTA0TjJWbU1UVTJPVGd3WVdJNmMzUnlhVzVuT2tobFlXeDBhR05oY21VZ1VISnZkbWxrWlhJaWZWMHNJblJsZUhRaU9pSmpNR0k0WlRNM1ppMHpPRFl6TFRRME5tSXRZamxrTkMxbE5qbGtZbU0xWXpKaVlqWTZjM1J5YVc1bk9reHBZMlZ1YzJWa0lFaGxZV3gwYUdOaGNtVWdVSEp2ZG1sa1pYSWlmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJbVl5TUdJME9HUmpMV0l5WW1RdE5HVm1ZaTA0TTJZNExUVXhaV000TkRJeE1XRXhNVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lJM056QXlOalZtTVMwNE5tVmtMVFJrTmpZdE9EVXhaQzFpT0RFM05qTTJNVE0zTnpNNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMWhZM0pwZEdOb2FXVmpiR2x1YVdNdVkyOXRMbk5uSW4wc2V5SnplWE4wWlcwaU9pSmpNekprWXpFNE1TMDROemxrTFRRNE4yWXRZVE5tTUMwM09UTXdORGRrWXpneU9HUTZjM1J5YVc1bk9uQm9iMjVsSWl3aWRtRnNkV1VpT2lKbFpETm1NR00yTlMwMFpXUmpMVFJrTmprdFlqUmxNaTAyWm1RMk9USXhaR1UzT1RNNmMzUnlhVzVuT2lzMk5UWXhNak0wTlRZM0luMWRMQ0poWkdSeVpYTnpJanA3SW5SNWNHVWlPaUkwTTJZelptUXdaQzAyTkRJMExUUTJOVGd0T0dWa1pDMW1ZekpsTTJGbE5EUm1ZbVU2YzNSeWFXNW5PbkJvZVhOcFkyRnNJaXdpZFhObElqb2lNelV3T0RjM1pqRXRaV1F3TWkwMFpqQXdMVGszTXpNdFptRTJNV0pqWkRZek0yTTVPbk4wY21sdVp6cDNiM0pySWl3aWRHVjRkQ0k2SW1NNE5qUmtaVGxtTFRBelkyWXRORGc0WWkxaU1UUTJMV1UxTjJWbE1qaGpOMk15WlRwemRISnBibWM2VFdGalVtbDBZMmhwWlNCSWIzTndhWFJoYkN3Z1ZHaHZiWE52YmlCU2IyRmtMQ0JUYVc1bllYQnZjbVVnTVRJek1EQXdJbjE5WFgxOUxIc2lablZzYkZWeWJDSTZJamhpWldFMk9ESTNMVEZrTlRBdE5EbGxOUzFoT0RreExUVTBZbVl5TWpka09XVmlORHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZPRE01WVRkak5UUXRObUkwTUMwME1XTmlMV0l4TUdRdE9USTVOV1EzWlRjMVpqYzNJaXdpY21WemIzVnlZMlVpT25zaWNtVnpiM1Z5WTJWVWVYQmxJam9pTmpjNE9XVmpaVGN0WmpNNFpDMDBORFk0TFdJNVltWXRPRFV6TWpRNU1UazJOREprT25OMGNtbHVaenBQY21kaGJtbDZZWFJwYjI0aUxDSnVZVzFsSWpvaVlXTXlZVFU0T1RJdE5XWTBPQzAwTVROaExUZ3hOakl0TkRrM1lXSXdNV1F3WlRJek9uTjBjbWx1WnpwTllXTlNhWFJqYUdsbElFeGhZbTl5WVhSdmNua2lMQ0owZVhCbElqcGJleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpGaE1HRTFZbU5oTFRRelpqRXROR015TXkxaU5HSXdMV05tTmpKaE9HSTNOV0U0TkRwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5dmNtZGhibWw2WVhScGIyNHRkSGx3WlNJc0ltTnZaR1VpT2lJeE9XUTNZelJoTnkxbE9XWXhMVFE1Wm1ZdFlUTmpZeTAwWkROak5XVTRZV1JoTWpBNmMzUnlhVzVuT25CeWIzWWlMQ0prYVhOd2JHRjVJam9pTXpKbU1qZzVOak10TnpkaE55MDBOV1l6TFdFNFpUWXROMlpsTmpBek1ERXpZbUUzT25OMGNtbHVaenBJWldGc2RHaGpZWEpsSUZCeWIzWnBaR1Z5SW4xZExDSjBaWGgwSWpvaVptUXhNekpoTWpZdE5URTFNQzAwTVRReExUZzVNREV0WlRZeFpETTBOekF4TjJKbE9uTjBjbWx1WnpwQlkyTnlaV1JwZEdWa0lFeGhZbTl5WVhSdmNua2lmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJamswTnpnMk9UWmpMV1UzWVdJdE5ERTBNeTA0T1RobExXWmtZbVpqT1dZek1EYzJaVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lJM056QTBOV1V4WXkwMU5tTXlMVFJqWlRVdFlXUTFZUzAyWW1Gak16QmxNRFJsTmpjNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMWhZM0pwZEdOb2FXVnNZV0p2Y21GMGIzSjVMbU52YlM1elp5SjlMSHNpYzNsemRHVnRJam9pTUdJek1qWmlabVl0WWpNME9TMDBPR1F6TFdGaE9HTXRNMkkwTldSbVpHTmhNams0T25OMGNtbHVaenB3YUc5dVpTSXNJblpoYkhWbElqb2laV1poTnpjeVlUVXRNMlEzTVMwME9UY3lMV0V6TldZdE1UZ3hNV1EyWmpaaU1UazRPbk4wY21sdVp6b3JOalUyTnpZMU5ETXlNU0o5WFN3aVlXUmtjbVZ6Y3lJNmV5SjBlWEJsSWpvaU5URTRNelk1TVRVdFpEaGtNUzAwWmpKbUxXSXhNVEF0TVRCaE5tVTJZMlZrWlRSa09uTjBjbWx1Wnpwd2FIbHphV05oYkNJc0luVnpaU0k2SWpjNFpEYzVPRFE1TFRoak5HUXRORFprTXkxaU5UWmtMV1F4WVdNelltTmhObVkxWkRwemRISnBibWM2ZDI5eWF5SXNJblJsZUhRaU9pSXhPRGM0Wm1VMVpTMHdOREkzTFRRd05EUXRZbU0zWXkwek9ESTNNMlZoWmpKak1XRTZjM1J5YVc1bk9qSWdWR2h2YlhOdmJpQkJkbVZ1ZFdVZ05Dd2dVMmx1WjJGd2IzSmxJREE1T0RnNE9DSjlmVjE5ZlYxOUxDSnNiMmR2SWpvaVlXSTJNVFEzTURZdE9URXdZaTAwWVRNeExUa3daR1l0Wmpjd05XUTVPR0ppTnpneU9uTjBjbWx1Wnpwa1lYUmhPbWx0WVdkbEwzQnVaenRpWVhObE5qUXNhVlpDVDFKM01FdEhaMjlCUVVGQlRsTlZhRVZWWjBGQlFXWlJRVUZCUkVsRFFVMUJRVUZCY0hnclVHRkJRVUZCVFRGQ1RWWkZWVUZCUVVSTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlpVTnRhVUZCUVVGQlJVaFNVMVJzVFVGUlRDdEJOM2hCWjI0eVJGQXpla0ozY2pGRFVFVnNLMGt2VVVGQlFuZGtTbEpGUmxWbFRuSnpibVF4TWpKNWIxRlNkbXRJU1ZOSVRpdDZMM1I1VldzNWIxUkZRMUV4WWxSQ1l6SXpZbmxPY3pCQ05VZEpSRUZTUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFXc3JTV3NyU1dSNE5HYzFUalJDT1VkUkwzSlFRVGxLTDBsUVpsTm5kMHd2VFVWRlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVVIzVURWYVVHOVFOWEkzUmtwTFFXWTNZM1ZtUW1sb1VFNVRhMWcxYUd4Qk9YVXJSSE5RTjJSWUwwcExNVkF5VmxCcFUwbHZaV0pGY2t4M1ZtZzFXbmdyT0VNeFdUSXlXWFJRTUVad1pqWm9aR1ZoSzIxeE1WZHNhWGhtWldvMlVtTkVlR293T1hOM1dHSmlaVUpSY0dscWRXY3lNR0ZxTDFORk9HSjJielZvUlhWaGRrRjFVMHR3VVdaS2VGUkhPVEZuVlhKRFZqWnFVMUZGTUc5UWEyVTBkM1ZyWlRjd05VVnhjRXhPVjNoMFRYUlRhelJxZGxoSGJHUXJkRXhzZUhaV1RVNXVZV3RFTjIxRmJtUlpWRlpYVTI1V09EWXdWMVZZYkRNMFVrMTVOMEpsYlhCNVIzcE9OM0JCWW0xWVJVRTJZbVoyU3pCMU16SjFWRVpMUzFaTk1ISXdXWGN4VFZSalJuWndPR2xXVEZCRU1DczVaMGhSZVNzM2NsTm1NMlZsYW5BeVNIVkdZM050YkdScFJYb3dSbnBMV0daVFVuY3pjV1V3T0ZoeFpEbGtVRFpSUzA5T2JtdDFOR3hITTA1VFlpOVNRblJMZEV0ME1YUjBaRUpLYVZsaU1sWkpOMkp5WXpkMFl6aEpXVzkwU25wSVZVSXdZeXRQSzFRemNsUlJkVXhMYzFwU2NYQjZhMVJUTjJSYVNUUjJieXR4U201a1JVZFBPRVY2WldONWFtRmpOaTlKVkU0eVMwOVhZVlZNU1ZRdllVeGtaVlZ1Y1hCa2FUZFdWeklyUzNsak1qbEdURE56TjJVemFHazFURlJUYUdWWFYzQjVWMnhJTkZoNmJYWlhhbTVwVDJsR1RqTlpWMFJwZGxkSk9USlhkV3MxWTNReVF6QndNMHA2YkRsWlRqWTJWMGsxU1ZZdlZubEdPRFp5TVdFeE4zQklOVlZOUXpCd1dDOUVkMWhXVlRVeU5FdHpOVmxuUkZwdFREUjZSM294ZHpnd2NETXpVR294Y0UxMlkya3JkR015WTBaSmFtMW9TREprVjFabWRXRldUSFZNYW5rNVpWUjZaM0ZQY25GbGQzWXdkblZ0THpGTFVqUXJNbUUyUkdnMWNGaFBOMVk1VHl0ek5FdFNTbEJCUkhWNFRtcDBha1pEUTJzdlEyeDBSWHBuWm5wVGRHVnlVM1prV2xGYVpVUnZlWGx4ZUZGbmRWSXhiRmh0UW14Skx6bFFVMlZpV25CaVQyVTRZbWwyZERKaVJrczVXV0ZMTkdWSVpUZE9URTVoZEV4UU0zRkhXVXhtVERjeFVtOU5ka0kyV0hVNU5rb3pWRmQwT1V4VWIxRk5OWHB0T0ZsbWVHSklTVVZUVUZwWVdGY3ZkRzkyVkZOdksxQnhSbmhPWlhOM1duRnFUeTlZTURsUGRrSm5hVGxQWTBoM04yeHNWWFZyWTNZclpHa3djbTVsY1dZNU9YVlliMHRuYkUxTmQyRnNiRGQ0TDIxNU1HMXNVRFZ3YVZadWRqTm1kVm9yTVRremVHNXdWRmxNZWpOVGFtVnFVRXhZY0U4MlZIUllZbnBZY0daSlZXTmxTa2h0VUhOWVFVcHpZa2tyWVV3M1puWnpjSEJXYzA5WU4zVmhaRW81Um5aMVZEWXpVSGh6V2tGUk0xVk5lSGxuVEhsWGRuTnJOaTlzZFd0MU5EQm1ZamgwZEc5c1JFWkdZakZhVVZFMkwyMVNhM1l4YVZjNWFURktOa012TVdGbGFrRmpkbEZRVm0xVmREWkdRakpqYmpJMlNucEVUelJVYzJGTVkxZGxZVlJpYnpkSmJqQTBXREE0TmprMldIaFVibkpyYlhwSFEwaHBiVzFLY0V4MVRtRlFhVGN4Wml0TFQydDBaVFZKU3psUGNsTTNOR2x1WjFCVFprcGtNVzlKVTBRNVdqQnRMMmhRYUVJd2J5c3ZUR1F6VFUxSFZYSlRWVFk0Y3psNVZYcFlVMDh6YzNWb1Z5dENhQ3RLYWpCdmVYb3ljMjVhY1dkd1kzcGtOV2wzY0haU2RtMUxabGh3V1M5UU1IbGxVMlp6WjBoUGFHeHBkM1JNVXpkalFsTnBVakZoV2taUU16QnhLMEowTTJaWVlrczVhRkV5VkhJck5ISlRZeXM0Wkdac1dFTlBNbXcyY0ZrclVFbHpOWEJHTVhoek5HdHRZbGhXUWpaNk1FcFhVbEprU0NzMlFqQjNPRlpsYjNsa1pWZHNWamcwZUdGVlRHNTJXREE0ZGtWNlRtNHJTRXBQZFN0MFpsUXhZMU5pUzFCTVpYZDJWMnRqTDJNeEwxbDBjelJUYkVvclJFaHdkVzV6UmpNd05qbFlVM0ozTjFab1VXVnNOR2RJVGpOUmRVaFBPR3BGYXk5UE9HTkRLMVZ2TDNCWVVpdDJSekJNVTI0dldsaDRiRmg1U1c5ak5qQlFVMmhsYkdSM2RtUjZZalJJVnpOSk56RndUeTh3ZDBoWmNVOUpjRGgyTkRGS1ZEVXlWRTVxWmpWcWVESTBabTFGT1RaWFRISkhOeTlpYzI5Tk5tVm9RMGR3U2poek1DOWFWak5yT0hGdVZFOWtXREZDTmpaSVQyZGlOR0kxUzFKbWRHdzFOR1pETjI5MmVYWmFXbkJZZERaS2VUUnZNMXB4WldSUGRrMVVaSE5zVUZWb1JEQnliRmQ0ZGxaTlJuUlRNRkF4VlU5dVVIWlhhemcwV0dSaU1FUkpXRmN2YTBocFRWTk1aVzAzY2sxTlMwUnRkRGxLTUVodFozUkxMek5DWnpkSGFHZFBSMHhEWjFCVU9HRm1jREZ3WkZSRmVEUTRPRFp1WjNSTFJqSmpPVTl3YzJkV1JHSlBTME5LVDFGaGEya3JNVlp5Um1rcmQzSnBTbkJtVG1FdmIzSlRhR055VnpJNE5tcE1XWE41ZVdaYVRHdzRVMFYwYmswMk5Xb3hVMHhJSzNkWVZrYzJhbU13UkZsSk9UZzJSblZxUzBwdVVVeFdNR014VFhKM04zTlBOVzR2Wm5kM1JHWnJiMm81WjJaRU5HOTZhSGxHUVZWV1RYRkNVbXhaY2tOa01HOVZibEp5YTJsNVJYcFBVRVpPVEVaNlZIcFVOVlpzUWxoa00wOXRPRzk2YTBKMFQwOWtSRkJhYTFVNWF6a3ZVRU53VEd0SVlYSnVXbFZtU1doWVQzWXdMelpKVTNZd1UwOWpkbW92TVdJNWRIcG1hMDQxUnpONE4yVmlaRWxvTXpSWFprWTJkSEJFY25KWlN6WlFWWEJrTHpSbVNsTXpZbkJZWVhKMFQwcE9LMU5TUkVKWVQzWXdiRFp0TmtWNldqRjZNelZzZHpsck0xSlBNREZYVFVaQ1ZUUklOQ3N5TVd4TlltSTRXSE13ZG14MldWWkljRE5RVlhGTFEyTmhUMFJWYzI1aVRreFRValZqVkVNclpGb3JjSEJXWld4RGJrdGhNVEUzWlU1VVRsRnJVMVpHYVZVeWRGQXJVWEpUVDFaMldscGhWVXh4ZDNaMFVFTm9MMnBrVFdJelVrNDVPVkZQYTI5cWRqaE1jMUZUTUdzdlR6Y3JkRXRtSzA1TlZEazJUbEF3VlhaTWRtbHVVbTA1U200eU5IZFdjbUpFUTJKSFNXUkdOSGhXUWs1S0wzaEtVMlUyVldWdkwwSnFMemxKTHpkRWVUQlFkbkp1U25rMWIzQlRTVkpTV2xnd1lWRlZRVUZRZWxnemFETlZRVUZEUVZGQmVEZFpRVVF2WVc1R1FrTk9aR0Z0U1VGQ1FVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGRVFXMXRiMlZMT1VoNmFVSTFTVGxGUWxodWVEaEJRVUZCUVVGQlFVRkJURUp0UVVsYVMyMTZWMGx1ZUhsUFFVRkJRVUZGYkVaVWExTjFVVzFEUXlJc0ltbHpjM1ZsY25NaU9sdDdJbWxrSWpvaU1qQm1OVGt4TlRndE9HSTNZUzAwTkdWa0xUZzVZbUV0T1dFMk9UTTBOR1V3TURVMk9uTjBjbWx1Wnpwa2FXUTZaWFJvY2pvd2VFVXpPVFEzT1RreU9FTmpORVZtUmtVMU1EYzNORFE0T0RjNE1FSTVaall4Tm1Ka05FSTRNekFpTENKeVpYWnZZMkYwYVc5dUlqcDdJblI1Y0dVaU9pSmxNekV5WmpJMk1TMWtPV0l5TFRRM016RXRPV0k1WVMwek9UQTBNamhrTkRGaE1UWTZjM1J5YVc1bk9rNVBUa1VpZlN3aWJtRnRaU0k2SW1NMU5UZzJaRGN5TFdZMVltUXROR015TVMwNE4yRTRMVEk1TVRVek1XSTFNV1l4WkRwemRISnBibWM2VTBGTlVFeEZJRU5NU1U1SlF5SXNJbWxrWlc1MGFYUjVVSEp2YjJZaU9uc2lkSGx3WlNJNklqZzFZVEZrTkRWbUxUUTFPRE10TkRNM055MDVPVFZtTFdaa09XUXpaamt4WVRWbVl6cHpkSEpwYm1jNlJFNVRMVVJKUkNJc0lteHZZMkYwYVc5dUlqb2laVFZqTkdGalpXVXRaalV6WWkwMFlqUmlMV0kyWTJJdE5qRXhaVEF3WTJJNU1ESmtPbk4wY21sdVp6cGtiMjV2ZEhabGNtbG1lUzUwWlhOMGFXNW5MblpsY21sbWVTNW5iM1l1YzJjaUxDSnJaWGtpT2lKaFptVm1abVJsTkMwME1qbG1MVFJqTjJNdFlqSmxNeTAyTWpCa1lUTmxaVGswTkdFNmMzUnlhVzVuT21ScFpEcGxkR2h5T2pCNFJUTTVORGM1T1RJNFEyTTBSV1pHUlRVd056YzBORGc0Tnpnd1FqbG1OakUyWW1RMFFqZ3pNQ05qYjI1MGNtOXNiR1Z5SW4xOVhTd2lKSFJsYlhCc1lYUmxJanA3SW01aGJXVWlPaUppWVRRM01qY3dNeTA0Wm1VMExUUXlNRGt0T1dRNFppMHhaVEJoTlROa1lqSmxaalE2YzNSeWFXNW5Pa2hGUVV4VVNGOURSVkpVSWl3aWRIbHdaU0k2SWpneE9EWTNaVEkwTFRRM09EQXRORFUyTXkxaU1UZzJMVEl4TnpreE9XWTRZemt4T1RwemRISnBibWM2UlUxQ1JVUkVSVVJmVWtWT1JFVlNSVklpTENKMWNtd2lPaUl5T0dGbU1HRXpNaTFsT0RJNExUUmtOelF0T0RjeU1pMDFOR014T1RkbU5tRXdOalE2YzNSeWFXNW5PbWgwZEhCek9pOHZhR1ZoYkhSb1kyVnlkQzV5Wlc1a1pYSmxjaTV0YjJndVoyOTJMbk5uTHlKOWZTd2ljMmxuYm1GMGRYSmxJanA3SW5SNWNHVWlPaUpUU0VFelRXVnlhMnhsVUhKdmIyWWlMQ0owWVhKblpYUklZWE5vSWpvaVlXSXdZMlk0WXpnek1XWTBabUppTlRVeVltUmlObU01WWpKbFltUmlNV1ZoTXpNMFptRm1OV1JpTm1Zd1lXUXlNalpoWlRnMU1HTTROakF6WkdFeVlTSXNJbkJ5YjI5bUlqcGJYU3dpYldWeWEyeGxVbTl2ZENJNkltRmlNR05tT0dNNE16Rm1OR1ppWWpVMU1tSmtZalpqT1dJeVpXSmtZakZsWVRNek5HWmhaalZrWWpabU1HRmtNakkyWVdVNE5UQmpPRFl3TTJSaE1tRWlmU3dpY0hKdmIyWWlPbHQ3SW5SNWNHVWlPaUpQY0dWdVFYUjBaWE4wWVhScGIyNVRhV2R1WVhSMWNtVXlNREU0SWl3aVkzSmxZWFJsWkNJNklqSXdNakV0TURndE1qUlVNRFE2TWpJNk5UVXVNVGMzV2lJc0luQnliMjltVUhWeWNHOXpaU0k2SW1GemMyVnlkR2x2YmsxbGRHaHZaQ0lzSW5abGNtbG1hV05oZEdsdmJrMWxkR2h2WkNJNkltUnBaRHBsZEdoeU9qQjRSVE01TkRjNU9USTRRMk0wUldaR1JUVXdOemMwTkRnNE56Z3dRamxtTmpFMlltUTBRamd6TUNOamIyNTBjbTlzYkdWeUlpd2ljMmxuYm1GMGRYSmxJam9pTUhnM1lUTXhPVFptWmpSbE5tTTRaVFl6TnpWbU9UY3hPRFkxWm1ObE9XTm1OVEprTWpabU5UUXhNVEF3TTJJeFpUQmtZMkV3TURKa056QTJNekkzTURNM00yVmpaVEZtT0dWak9HSTVPVGxqTXpFd09HTmtPRGd6TURCa1pEazBORFV3TXpjek5qTXdNekUyWlRVNVpqWmtaV0kxTURjd1lqa3pObVUyWXpsbFlqRmpJbjFkZlE9PSJ9XX0sInNpZ25hdHVyZSI6eyJ0eXBlIjoiU0hBM01lcmtsZVByb29mIiwidGFyZ2V0SGFzaCI6IjUxNzQwODcxMDk1ZjhjYzBjMDhjZTlmMjJkYzgwMGU1MDNkZGJjZjhjYjIwMzE4NDFkZDc2ODMyOWU1NmI5YTEiLCJwcm9vZiI6W10sIm1lcmtsZVJvb3QiOiI1MTc0MDg3MTA5NWY4Y2MwYzA4Y2U5ZjIyZGM4MDBlNTAzZGRiY2Y4Y2IyMDMxODQxZGQ3NjgzMjllNTZiOWExIn0sInByb29mIjpbeyJ0eXBlIjoiT3BlbkF0dGVzdGF0aW9uU2lnbmF0dXJlMjAxOCIsImNyZWF0ZWQiOiIyMDIxLTA4LTI0VDA1OjA5OjU5LjM0MVoiLCJwcm9vZlB1cnBvc2UiOiJhc3NlcnRpb25NZXRob2QiLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAjY29udHJvbGxlciIsInNpZ25hdHVyZSI6IjB4OGJjOGIxM2VlZjQxYjQxYzM0NWFkY2JlYTFmYmFiMzc3NzNkYjVmYmY1ZDE5ZDViNzM1YzM0YzJlYjYyMTIyNzY2MGJlMWVlN2Y1ZmM5YWY4OGYyM2EzZTRmMjc5MTY4N2YxYzA2NGM4MWVlMmQ4MjFjMzQxOGRhMDNkZTQ5MWQxYiJ9XX0=" + "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiZmVhMzliNDItMzFmNC00MDFkLTlkYzktMGY3ZTgwZDE3NGZmOnN0cmluZzpjNWFkMTliYi00MDNjLTRiNTItOTcxZC0zZjAxZTg3ODgzZTMiLCJ2ZXJzaW9uIjoiOGM5MjUxYWYtMjc2YS00YzA1LWE1YjctN2JiODRlMjA0ZWFmOnN0cmluZzpwZHQtaGVhbHRoY2VydC12Mi4wIiwidHlwZSI6ImU0YmZlMDRiLTM5NDctNDQyOC1iNjg0LTJiYmRiNzNlNDIyNzpzdHJpbmc6UENSIiwidmFsaWRGcm9tIjoiMmU0NDZkMGMtYTc0ZS00YzA1LWFkMDItNTdhMzhkNDc2NmFlOnN0cmluZzoyMDIxLTA4LTI0VDA0OjIyOjM2LjA2MloiLCJmaGlyVmVyc2lvbiI6Ijc4MTAyZTE2LTRjNTUtNGRjNC05ZWFiLWI3YmE4NDE4NzEyZjpzdHJpbmc6NC4wLjEiLCJmaGlyQnVuZGxlIjp7InJlc291cmNlVHlwZSI6ImI1OGI3NDY1LWZmNGItNDg4My05MDEyLWYxMTczNTk4MzU3ZTpzdHJpbmc6QnVuZGxlIiwidHlwZSI6ImFiNGU0YzU4LWYzYmUtNDVhZi1hY2U2LWFlZGFjNjgzYzcwYTpzdHJpbmc6Y29sbGVjdGlvbiIsImVudHJ5IjpbeyJmdWxsVXJsIjoiOThlNjJhNDUtMjRiMi00N2YxLThlMzUtY2U1NTU1NDQ5YmVjOnN0cmluZzp1cm46dXVpZDpiYTdiN2M4ZC1jNTA5LTRkOWQtYmU0ZS1mOTliNmRlMjllMjMiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiJlMjc2NDg3Ny04NmFkLTQzNGYtYTIyYi01Yjk2MzFiNDVlZjc6c3RyaW5nOlBhdGllbnQiLCJleHRlbnNpb24iOlt7InVybCI6IjA0M2FlMGZjLTIzMmQtNGI5MS1hZDYwLTRiOWZiZGFiMGMyNDpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLCJleHRlbnNpb24iOlt7InVybCI6ImI2NzIxZTMzLWRkZWItNDU3ZS1iNDgwLTBlNTFiOGQyZDFlNTpzdHJpbmc6Y29kZSIsInZhbHVlQ29kZWFibGVDb25jZXB0Ijp7InRleHQiOiI0OThhYjJlMy1jOWQ1LTQwZWItYWE2MS1mMWZhOTE3ZmQwZjk6c3RyaW5nOlBhdGllbnQgTmF0aW9uYWxpdHkiLCJjb2RpbmciOlt7InN5c3RlbSI6ImVjYThiNTExLWM3ODMtNDZiNC04M2UyLTAwMjhhYWJlZjI4NDpzdHJpbmc6dXJuOmlzbzpzdGQ6aXNvOjMxNjYiLCJjb2RlIjoiMjMxMTM3MWMtOTA0Ni00ODlkLWI5OTMtZTlhYjIwNTA4OWI3OnN0cmluZzpTRyJ9XX19XX1dLCJpZGVudGlmaWVyIjpbeyJpZCI6ImUxZWRkNGM0LTMwODctNDNlYS05ZGQ0LTRjYjE2NTZiZjFjNzpzdHJpbmc6UFBOIiwidHlwZSI6eyJjb2RpbmciOlt7InN5c3RlbSI6Ijg3NDQ5MDdhLTE3OGEtNDI3OS04YjBlLWEzMWQzZDZkOWI1MTpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS92Mi0wMjAzIiwiY29kZSI6IjkxYTQ5NDk1LWNjM2ItNDI2My1iY2M2LTgyNDQyYjU1NDIxNTpzdHJpbmc6UFBOIiwiZGlzcGxheSI6IjQzMTc1ZmZmLWNmMzUtNGI2YS1iNzMwLTg5ZGI2ZTIxNGM0NTpzdHJpbmc6UGFzc3BvcnQgTnVtYmVyIn1dfSwidmFsdWUiOiIxY2MzNGJkZi1iNjljLTQxODktOTY2Yy1jYTI2MDFlMGEzMGE6c3RyaW5nOkU3ODMxMTc3RyJ9LHsiaWQiOiJjNTY1MjU4Yy05YzI0LTQyNjItYWY1OS02ODU1ZTBmM2M5MDk6c3RyaW5nOk5SSUMtRklOIiwidmFsdWUiOiI5YWFjNGI2Mi0yOWEyLTQ4MGEtYTcxZC04NWQ2ZmNjNmNkZDY6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjA0N2I3NzVhLWM3NmItNDczYi04MDMwLTBiNmUxNWU5MzBlYjpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNzFiOWQ0ZmItODA2ZC00YjBkLTlkMjQtZTcxNjljMDUyMWQ1OnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiI5Njg5NDFkOS01MWI2LTRmNjEtOGYyMC0xYmIyMmZmNjVjOTY6c3RyaW5nOjE5OTAtMDEtMTUifX0seyJmdWxsVXJsIjoiZTIxODVmY2MtN2ZjYy00NTlhLWI2NDktYWNmZWE2ZjNjMjNlOnN0cmluZzp1cm46dXVpZDo3NzI5OTcwZS1hYjI2LTQ2OWYtYjNlNS0zNmE0MmVjMjQxNDYiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiI5YThhMjE3ZS1hNmJlLTQ1NzktYjllMy0xMzcwYjdmZGY3MzM6c3RyaW5nOk9ic2VydmF0aW9uIiwic3BlY2ltZW4iOnsidHlwZSI6IjlhNzU0ZWI3LWNjMzktNGUxNi1hNDUwLWEyMjhhMzFkZTVjMzpzdHJpbmc6U3BlY2ltZW4iLCJyZWZlcmVuY2UiOiJjMmIzZGZlNi0zODhmLTRhMGUtOTU2OS05YzY3YzIwYzNiNjE6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSJ9LCJwZXJmb3JtZXIiOlt7InR5cGUiOiJiYTg0NDk1NC1iNDU3LTQzMDAtYmI2MC1kNzNjZDliNTRkZDk6c3RyaW5nOlByYWN0aXRpb25lciIsInJlZmVyZW5jZSI6ImExM2Q4YzllLWZlMWMtNDE5Ni1iYjEzLTczYzhhNjhjNTRhMDpzdHJpbmc6dXJuOnV1aWQ6M2RiZmYwZGUtZDRhNC00ZTFkLTk4YmYtYWY3NDI4YjhhMDRiIn0seyJpZCI6ImM0MzY3NzNhLWE3MzItNDFjOS1hMzdjLTdkNDYwZjZhMmRiYzpzdHJpbmc6TEhQIiwidHlwZSI6ImExYTlhNzQyLTkxNWEtNGYyNi1iNTgzLWIyZTEzMTY3ZDE5NDpzdHJpbmc6T3JnYW5pemF0aW9uIiwicmVmZXJlbmNlIjoiZmU0Mzk2ZjAtZWE4OS00ZjhmLWEwMTUtYThkMDdlZmRjOWZjOnN0cmluZzp1cm46dXVpZDpmYTIzMjhhZi00ODgyLTRlYWEtOGMyOC02NmRhYjQ2OTUwZjEifSx7ImlkIjoiNjYwZGUxNjktNzFmMC00YzMxLWI4ZWMtMDA1ZGE5MjdkNDdjOnN0cmluZzpBTCIsInR5cGUiOiI3ZDA4MjMzNy00YTA0LTRkZTctOTdhZS1hNjU5ZjgwNGRjOGI6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6IjgxZDE3Yjc4LWZiNmItNGIzMC1hYjg3LWIyNmI2NjY2OWI4MDpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3In1dLCJpZGVudGlmaWVyIjpbeyJpZCI6ImZjYWE5Mjk0LWNkYTEtNDg0OS1iOTRjLWI2YjE5NjJjM2IyMTpzdHJpbmc6QUNTTiIsInR5cGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI2ZDYxMWVjNy0wODJjLTQwM2UtYjhjYS1hMDIzZWI5YTY5Zjk6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiI4MDc3ZTcxMS02ZDFhLTQ1YWQtYmQyZi0yOWQ5YzgwNmY4OGU6c3RyaW5nOkFDU04iLCJkaXNwbGF5IjoiNjBiMjVjMGMtOTIxYS00ODAyLTgyNjAtZGYzZGM2ZmViMWI4OnN0cmluZzpBY2Nlc3Npb24gSUQifV19LCJ2YWx1ZSI6IjIxNzdkMTA0LTJjYTgtNGQ0MC1hMWIzLTY4YjYyOGIxYmI5YTpzdHJpbmc6MTIzNDU2Nzg5In1dLCJjYXRlZ29yeSI6W3siY29kaW5nIjpbeyJzeXN0ZW0iOiI1YTY4NDdjNy1jMjE3LTRiMGQtYTMwNi0xZjE4OTEzZGYyYjQ6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiZWU1ZDI0MzAtYzlmNC00NGMzLTgyNjctNTY2YTgwNzZhM2M0OnN0cmluZzo4NDA1MzkwMDYiLCJkaXNwbGF5IjoiMGFhOWI3ZDctYjA4ZC00Mzk0LWE4NTgtMDhiNTQ0NjBiNmYyOnN0cmluZzpDT1ZJRC0xOSJ9XX1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYTE4MGMxYzYtNDJmYi00ZjBkLWIwYTQtZDk5NWI1YjVhNzE4OnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6ImU2NDQwZDBiLTMzM2MtNGE5Yi1hMjUzLTRkMjc2MmQwZGE3MjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiIwODMwZTYxYy1lOTdmLTRhMDItOWFlMi0wMzNmNTIwZmU1YjA6c3RyaW5nOlNBUlMtQ29WLTIgKENPVklELTE5KSBSTkEgcGFuZWwgLSBSZXNwaXJhdG9yeSBzcGVjaW1lbiBieSBOQUEgd2l0aCBwcm9iZSBkZXRlY3Rpb24ifV19LCJ2YWx1ZUNvZGVhYmxlQ29uY2VwdCI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjUzNzNjNWM2LTBhN2UtNDJkYy1hZjE5LWI4OTY4MmJkOTkxMzpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsImNvZGUiOiJlMzJjMWYzNS1kZmI2LTQ0MDEtODkxOC1hMTc2ZDI0NGE0MmI6c3RyaW5nOjI2MDM4NTAwOSIsImRpc3BsYXkiOiJkN2MzM2U4OS0wOGUwLTRhYTktYWQxNS1kNDc5MTJkZDM3ODU6c3RyaW5nOk5lZ2F0aXZlIn1dfSwiZWZmZWN0aXZlRGF0ZVRpbWUiOiIwYjQyNWEzNy0xMDIxLTRhZDMtYmQwMi1hZjUyMTE3YjkzMTU6c3RyaW5nOjIwMjAtMDktMjhUMDY6MTU6MDBaIiwic3RhdHVzIjoiZTM4ZGI5YzMtZTYzNC00NjllLTkwMjQtYjY5NWVmMGExM2IxOnN0cmluZzpmaW5hbCJ9fSx7ImZ1bGxVcmwiOiI3NjU2MDg5Mi05YjY3LTQ4YjItYjdlNS1hOGRkOWNlOGQ5ZjA6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImE0MzA5OGUxLWYwYzItNDk4NS05N2YzLTk0YmMxOThiNzQ1NDpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiNWUzMjEwNjQtODFjYS00ZjRmLWEzOWItZDRlM2YyOTRjNGQ2OnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6ImQ3MWJhNTJkLTNhNWMtNDdmMy1hOTQ4LWI4MTZhODI2NGM4NTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6Ijc5NzU1YjI5LTEyMzktNDliNi04MDcxLTM4MjdhMGE4M2NiYjpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI0MmY0MDk2Ni1mNGUxLTRkZmYtYTI3Ni01ODVmMmMzNDZmMzc6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19fSx7ImZ1bGxVcmwiOiI5MzU2MDY1OC0zNDcyLTQyZTYtYjllYy0wZGJlZDdlMjYzZjU6c3RyaW5nOnVybjp1dWlkOjNkYmZmMGRlLWQ0YTQtNGUxZC05OGJmLWFmNzQyOGI4YTA0YiIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjBmM2I2MTE3LTI5YjctNGI0NS1iMzIzLTI0NDcxODdkNjg3MjpzdHJpbmc6UHJhY3RpdGlvbmVyIiwibmFtZSI6W3sidGV4dCI6ImI0MTc2MTFmLWIyYWMtNGVhNy1hN2Q5LWI3ZDQ0NTBkMDYwZjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV0sInF1YWxpZmljYXRpb24iOlt7ImNvZGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiIzMWJlMWYwYy1kNDk4LTQ2YTctYjliZC1hYzBkZjJiZmRlZjc6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJiMWQ4MDRkZC04YWQwLTRiN2ItYWI3OS02N2FiNGFmZjFhNGM6c3RyaW5nOk1DUiIsImRpc3BsYXkiOiIwNzcxMGRiZS0wMDgwLTQzZTktOWVjMy1mZThiNGIxNzViMjA6c3RyaW5nOlByYWN0aXRpb25lciBNZWRpY2FyZSBudW1iZXIifV19LCJpZGVudGlmaWVyIjpbeyJpZCI6IjQ2M2ZmNDhkLWQyN2EtNDdlMS04ZDhiLWYxNGJkMGMyY2M2ZTpzdHJpbmc6TUNSIiwidmFsdWUiOiIxNjhiYzgyOS00YmFmLTQ0MzQtOWUwOS0zY2NiMDRjODgxYjQ6c3RyaW5nOjEyMzQ1NiJ9XSwiaXNzdWVyIjp7InR5cGUiOiI5NjI5OWM1MC02YmViLTQ3ODItODg0ZS1lZjA0ZWVkZjZjN2I6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImFiMGNlMDhlLThiNDItNDMwMi04Mzk2LTlmMWY3OTZhZmI3OTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIn19XX19LHsiZnVsbFVybCI6IjQzNzk3ODVkLWRhMzEtNGU0My1hM2ExLWY5MzRlMmY5YWZiMTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiYTczY2VkOTUtODRhMi00YzUxLTkxOGEtZTc2ZmM0MGJjMjNmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiZjQxZThjMTctZDI4OC00NDkwLTk5NjYtZDgwOGRjNTQ4ODUzOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGggKE1PSCkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6IjZlZjk1MGQ4LTAxNzQtNDIyOC1hNWIyLWU3NTQ0ZjBlMDY2MjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiJmZmMxZGUyYS01NmI4LTQwZDQtODA4MC1hODdjZDA1YzJhY2U6c3RyaW5nOmdvdnQiLCJkaXNwbGF5IjoiYjliZWFlNjUtNjFkMi00OTJkLWExZDctN2U1YzZiNDcwZDRlOnN0cmluZzpHb3Zlcm5tZW50In1dfV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImMxM2M5YzgzLTRmOTgtNDY4Ny1hMTJhLTg2NTllZDJhODc4NDpzdHJpbmc6dXJsIiwidmFsdWUiOiI3MjI5ZjVjYy1hMTRmLTQ1ZGQtYjYwOS0wY2Q2NzBiY2NlOWM6c3RyaW5nOmh0dHBzOi8vd3d3Lm1vaC5nb3Yuc2cifSx7InN5c3RlbSI6IjliODhlZjdhLTE0ZDgtNDA3My04NTFiLTI0MzJjMzNmNDNjNzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6IjMyMGQ3ZmNiLWQyOGEtNGIyNS1hNGYyLWQ5MmMwZDRiNzU3MjpzdHJpbmc6KzY1NjMyNTkyMjAifV0sImFkZHJlc3MiOnsidHlwZSI6IjIxMjQ2Yjg1LTYwMTQtNDY0ZS1iNzMyLTdmZWM2YzA1ZGY1MDpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJhODIwZmQzOC03YjE1LTQzYzItYTIyMy05NGUxN2Q5NmZlYTA6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiMjJhZjhiZDctOTFhOC00ZGRkLWI2NGUtNzZjMjZmNTAyMGZmOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGgsIDE2IENvbGxlZ2UgUm9hZCwgQ29sbGVnZSBvZiBNZWRpY2luZSBCdWlsZGluZywgU2luZ2Fwb3JlIDE2OTg1NCJ9fV19fSx7ImZ1bGxVcmwiOiJlMzFlNzFlYS02MWMwLTQwZDUtYjBlNC02YWRkMGVjZDUyOWY6c3RyaW5nOnVybjp1dWlkOmZhMjMyOGFmLTQ4ODItNGVhYS04YzI4LTY2ZGFiNDY5NTBmMSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjcwMjZmODQzLTgwZGUtNDVmNi05YzJlLTRkN2UzMzgxOWY4NzpzdHJpbmc6T3JnYW5pemF0aW9uIiwibmFtZSI6ImRjMjEyMGM3LWE1M2QtNDY1ZS1hODI0LTI0NTdhOTY5NzNjMTpzdHJpbmc6TWFjUml0Y2hpZSBNZWRpY2FsIENsaW5pYyIsInR5cGUiOlt7ImNvZGluZyI6W3sic3lzdGVtIjoiZTU0ZTM3ZTYtNTgxOC00ZTQ4LTljOTYtZWY1NjlmMzNjNzIwOnN0cmluZzpodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL29yZ2FuaXphdGlvbi10eXBlIiwiY29kZSI6ImE5ZTVmMmExLWFlNzEtNDcyNS05MjVjLTU2ZmMzNDNjN2FmZTpzdHJpbmc6cHJvdiIsImRpc3BsYXkiOiIwZjFjNWZmZi1lYzJkLTRkYjctYjVmMS03MDMyMDBmYTY1NGQ6c3RyaW5nOkhlYWx0aGNhcmUgUHJvdmlkZXIifV0sInRleHQiOiJiMzgyMDg5Zi1iM2NhLTQ0ZjMtODJjOS1mMDAyMmIxZTlmMjM6c3RyaW5nOkxpY2Vuc2VkIEhlYWx0aGNhcmUgUHJvdmlkZXIifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImVlMjRmYzdlLTRjMGQtNDkzZi1iZTAxLWI0ZDdjYTQxMjVmNTpzdHJpbmc6dXJsIiwidmFsdWUiOiI2ZDMxMWJiMy00ZjQ5LTRkZjQtYmIwNi0zOGQ1MDQyNTg2MzQ6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0seyJzeXN0ZW0iOiJhOGY5NmQzNy1mYTZiLTQwY2MtOGRmMi1lMGEwYzE4MDE0Y2U6c3RyaW5nOnBob25lIiwidmFsdWUiOiJkMTRhNmI1YS05NTBiLTRhZDAtYmEzYi01NjdmMTk1M2IzNGE6c3RyaW5nOis2NTYxMjM0NTY3In1dLCJhZGRyZXNzIjp7InR5cGUiOiIzZDk2NzY5ZC1mZmM5LTQ5ZGQtODI1NS02NTIzNjA1Y2MwNTQ6c3RyaW5nOnBoeXNpY2FsIiwidXNlIjoiYTg3N2EyNzktY2Q2OC00ZmQyLTg0NmUtZTUyOGJlOTYzYmQ4OnN0cmluZzp3b3JrIiwidGV4dCI6Ijk3ZjNlZGY5LTk3ZTAtNDcxZC04ZmJiLThmNWUwZDAzMjc1NDpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCwgVGhvbXNvbiBSb2FkLCBTaW5nYXBvcmUgMTIzMDAwIn19XX19LHsiZnVsbFVybCI6ImFiMmRkOWI4LTE2ZTAtNGZhNi1iZTExLTIwMjMzZmU1NjgyZjpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3IiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiZTc4NzdhYWQtZTk1Mi00ODQ5LTk2MGQtNTVkZjc4MDdmZjhiOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiYjk5ZmYzNGEtZTg2NS00ZThmLWJjZGUtNzMwOTNmZWI1NjNmOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6ImUzZDA4MDUyLThlOWUtNDk1MS1iZDlmLTE2ODUwM2UyYjk5MjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiIyZGY4OTk0ZS1jOTE4LTQzYTAtYTdiMC0xODcwM2IwMDQyZDA6c3RyaW5nOnByb3YiLCJkaXNwbGF5IjoiN2VhNGFlODUtN2I5Mi00MWEyLWJjN2EtYmMzNmRjNTlmMzU1OnN0cmluZzpIZWFsdGhjYXJlIFByb3ZpZGVyIn1dLCJ0ZXh0IjoiOTg0ZDcyOWEtM2UxNi00OTcyLTk4OWEtMjBjZGJjMTk1MTQ0OnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjhkYjBjNDdkLWUwMDQtNDczYS05NWUwLWQ0OWU4MzVhOWIzNTpzdHJpbmc6dXJsIiwidmFsdWUiOiJkYzBjMTcwZC0xZmNmLTQ5ZmQtODZjOC04ZWM0N2RmNmMzNTM6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVsYWJvcmF0b3J5LmNvbS5zZyJ9LHsic3lzdGVtIjoiNTM0ZjI5YjgtNTg3ZC00YzQzLWE2ZWEtNDhjODQxZTBkMWQ2OnN0cmluZzpwaG9uZSIsInZhbHVlIjoiMjYxYmNhNzktNDg1NC00ZjQxLWJkZmMtOGQ3ZGM4YTQxZjhkOnN0cmluZzorNjU2NzY1NDMyMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiNDg4MDg3MmItNzZmNS00Mjk1LThhOWQtZTdmYzZjNWEwOWVjOnN0cmluZzpwaHlzaWNhbCIsInVzZSI6ImRmZWJiNTdjLTY5ZDAtNGNhNy1hZWQ1LWMyODY2NTEyZDY2ODpzdHJpbmc6d29yayIsInRleHQiOiIyNGIyYWM1ZS03MTBhLTQ3YmUtOThkOC03YjFkMzg1MTI1NDg6c3RyaW5nOjIgVGhvbXNvbiBBdmVudWUgNCwgU2luZ2Fwb3JlIDA5ODg4OCJ9fV19fV19LCJpc3N1ZXJzIjpbeyJuYW1lIjoiYWViOWIzN2YtNDdhNy00YzY3LWI5YzctMzZkYWQ2YTJhYWFiOnN0cmluZzpTQU1QTEUgSVNTVUVSIChETyBOT1QgVkVSSUZZKSIsImlkIjoiYzQzYTVhZDktZDMwMC00YjVmLTgzYjgtYTQxM2QwYjlmZmIzOnN0cmluZzpkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAiLCJyZXZvY2F0aW9uIjp7InR5cGUiOiI1ZjVmNmI3Zi1lMGYwLTQyNWQtYTU3Ny0wNWQ4MTlmMGRlMWY6c3RyaW5nOk5PTkUifSwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiOGFjOWZlYWMtMWM4My00MWEwLTkzMGMtM2FhODRmOTFkM2U5OnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI2OTk3MjJiNC1kM2YxLTQ5MmQtYTQ2ZS0wY2Q0ZTdiNmRhNTc6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6IjFmMjU2MTQ2LTJhY2YtNGMzNC04MDQ5LTMwYTM5M2ExNjczMDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCIkdGVtcGxhdGUiOnsibmFtZSI6ImQ5ZjczNjljLTVlZmYtNDg2Ni04NDRjLTc5NzU1Nzk4MmRmYzpzdHJpbmc6SEVBTFRIX0NFUlQiLCJ0eXBlIjoiZTU3MGIxOWUtNzJmZS00ZTA0LWFmMjUtYzVkMjM3ZTRhZGQzOnN0cmluZzpFTUJFRERFRF9SRU5ERVJFUiIsInVybCI6Ijk5YzM2Mjk1LTllNzYtNGE4ZS05ZDNjLWFjMzY5Y2ZhMjIyYzpzdHJpbmc6aHR0cHM6Ly9oZWFsdGhjZXJ0LnJlbmRlcmVyLm1vaC5nb3Yuc2cvIn0sIm5vdGFyaXNhdGlvbk1ldGFkYXRhIjp7InJlZmVyZW5jZSI6ImFjY2E0M2YwLWE4ZTAtNDNiZC1hMDYyLTNhN2Y5NzY5YmUxMTpzdHJpbmc6YzVhZDE5YmItNDAzYy00YjUyLTk3MWQtM2YwMWU4Nzg4M2UzIiwibm90YXJpc2VkT24iOiIzZjY4N2QwYS05OTJhLTRlY2UtOGIyNC0xMjMzMzJkMjRhZjY6c3RyaW5nOjIwMjEtMDktMjdUMDg6NTc6NTkuODgzWiIsInBhc3Nwb3J0TnVtYmVyIjoiMWFmNjVlMjAtNThiYy00YWM3LWFiNTktZmEwOTk2ZDAwMGFjOnN0cmluZzpFNzgzMTE3N0ciLCJ1cmwiOiI0MjdkMzFhMC02YWFkLTRjOTMtOGUxYy0wNjU2OTkyZmJkZWI6c3RyaW5nOmh0dHBzOi8vYWN0aW9uLm9wZW5hdHRlc3RhdGlvbi5jb20vP3E9JTdCJTIydHlwZSUyMiUzQSUyMkRPQ1VNRU5UJTIyJTJDJTIycGF5bG9hZCUyMiUzQSU3QiUyMnVyaSUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXBpLnN0b3JhZ2Uuc3RhZ2luZy5ub3RhcmlzZS5pbyUyRmRvY3VtZW50JTJGZGM2NWRjN2QtMDVhMy00ODk1LWFkODAtOGRjNGE5MGFkZDFmJTIyJTJDJTIycGVybWl0dGVkQWN0aW9ucyUyMiUzQSU1QiUyMlZJRVclMjIlMkMlMjJTVE9SRSUyMiU1RCUyQyUyMnJlZGlyZWN0JTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZ3d3cudmVyaWZ5Lmdvdi5zZyUyRnZlcmlmeSUyMiU3RCU3RCMlN0IlMjJrZXklMjIlM0ElMjIxMGQ1OTk1NTk3YjY4YWNhYjM5NDBjNTNkNzQzM2QyYTRlMWE0YzIzMWI2N2Y5OWUyODQ3Y2I0YjE3ODEwOThlJTIyJTdEIiwic2lnbmVkRXVIZWFsdGhDZXJ0cyI6W3sidHlwZSI6IjA5NzlhMzkzLTA3YmItNDUxNC04MWY5LTg1MjlmMjNiMDUxMjpzdHJpbmc6UENSIiwicXIiOiI3NzkxZWNlOS1jYjRlLTRiZDItODVmMS03YmIwNTUxMGVlZGU6c3RyaW5nOkhDMTo2QkZLJUdBIDlIV1JIMjNNTEJDRkdDRk8wV0c0WTVYSEIxUkYlVDcwR1I1UVVOODdNVTZOJTRQK0pXQ0s6T0pEUTQvTTJQK01FMlNNTUczU0EyM1YwNjBNJFIuS01aMjRMRVMxR084KzBERTJQLjVWSUhKR0slMEkzVVBTRUhTRjUkTUkwQTctWUsvQVVLRFVBM0Q6M0suS0o6NldZQ1RYUlIqLzFBNUsqK0pBS1QlMkVNUUQwQUZEIFQgLlBNMksgMDM0UFYyM04gTUxTIEVJJVRJL0FRRFNCMUFEWVRSVU1GJUVLSjBHREo4M1UgUTkxNzkgWlRQNVZON08qTDkyWjNOMzAgTlFKODREJENBKzY4T043K086UklLUVNKM0QuRzhMOEdOQUtNRDZENEVRVFBYNUIuKjNWOEhJN0FZSUJNNVZCK1FKUE5QU0ZaU1MtLzQrRVNCVDUrIEI5NDAyNjIqMzJRQVRCN0MxWVFZTkU1MDBPMTNUUk9NR0dFNDVZLkktSTJGLkwlUTI1WVFBVjJCJEFTODdNRTdLOU5ZUkw6LzhYWFNDUFMvOUw6OUVSNTM3TDg2V09QTTUtQjZET0pJUTZPME5ON0ExUEZKLlQxJU9UWDlFL1QgOUo3LkZFQUtGSk06MU5XWVZCVFI2WVMgQURCN1I6Q05TVURWIEQrM1FQREQlTU1QUEpVSUxLUUJXWExIWkFOLUpMUDlYRTUzMUJISEpYVkRBKkUzRVAkN0E6SEM3KkMgWEtFIEs4V0JZUTcrTjZOTFQyJUFJSElQIDYrTkVYVDVEVEFLU09GS0g5LzZPKkQ1MTE2JEhGWUklRTZUJUJCS0VQTjkuRTlGVVA1NElURldZSk1SMlBRK1QzNjdaNkNJNE9MWDI4UExBKk5aMlMtWkhFSEFUOkZMNzRaOlYrN0tSV1FPMVU2SkgwWDg5OVVMRVEvSTJSOjVCLjhUMUpRNEw6M0sgVk0tN0pSJU5NOlRLMk46MEItSjFHUFBZTEhCMUVFVlNJLzkgWDNRIDAuVkQ2RDgkWFFDTUg6RU9OWE9YU0FETFZZJDhTMVQ5ODFDNjVRRTYtTVE2VDZXOkgkKjZTOVc1WlNDJFJKVjhPRFQ0MjdITUJLRjczJFJMLTZSUzI4LUIvQ01PVzgwKlRGQUUkRDJMKkc1VUtaR0RBTUVNVkhQQTJHVjI4N1BJSVVOQlFGLko0SkYtJFRITEYkUk1XOUUxTDZOL1BNSTVHVkgtOjA3U0dNTDA3WEZOWDYwSzdILlZFUEFTL1BCWVFXLjZMWDk3MkRVTk0uWVAxSlA5MTJPUjlZNVBJNkRXQUdOT1AxTFVWOFBOR1ZaSjg4LktUWkdJV1NITkc2N1VYMzFZMEUwUFZTREZCUlZQTjBUQ0lKVU0kVEZYOVc3OjNUQjI0S05TWTRMSUZESU8lMUMlMFcrLlUgK0pTNkdOOVcwMVUtMTg0S0RWL1ZXQVQuRVVTJUZLK0RGJFRJNlAxSlRaQlNVMEVIQVcqNFc4MjlXNUVDUTdRMFJUVk5ULUZRWVY0N0UzVTE0UlM1MSJ9XX0sImxvZ28iOiJhYjM2NTEwZC1mNjFjLTRiZDgtOWIwNi0yODhlNWY1ZmI1MmE6c3RyaW5nOmRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZlFBQUFESUNBTUFBQUFweCtQYUFBQUFNMUJNVkVVQUFBRE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXplQ21pQUFBQUFFSFJTVGxNQVFMK0E3eEFnbjJEUDN6QndyMUNQRWwrSS9RQUFCd2RKUkVGVWVOcnNuZDEyMnlvUVJ2a0hJU0hOK3ovdHlVazlvVEVDUTFiVEJjMjNieU5zMEI1R0lEQVJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBaytJaytJZHg0ZzVONEI5R1EvclBBOUovSVBmU2d3TC9NRUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHdQNVpQb1A1cjdGSktBZjdjdWZCaWhQTlNrWDVobEE5dStEc1A3ZFgvSksxUDJWUGlTSW9lYkVyTHdWaDVaeCs4QzFZMjJZdFAwRnBmNmhkZWErbXExV2xpeGZlajZSY0R4ajA5c3dYYmJlQlFwaWp1ZzIwYWovU0U4YnZvNWhFdWF2QXVTS3BRZkp4VEc5MWdVckNWNmpTUUUwb1BrZTR3dWtlNzA1RXFwTE5XeHRNdFNrNGp2WEdsZCt0TGx4dlZNTm5ha0Q3bUVuZFlUVldTblY4NjBXVVhsMzRSTXk3QmVtcHlHek43cEFibVhFQTZiZnZLMHUzMnVURktLVk0wcjBZdzFNVGNGdnA4aVZMUEQwKzlnSFF5KzdyU2YzZWVqcDJIdUZjc21sZGlFejBGektYZlNSdzNxZTA4WHFkOWRQNlFLT05ua3U0bEczTlNiL1JCdEt0S3QxdHRkQkppWWIyVkk3YnJjN3RjOElZb3RKekhVQjBjK08rVDNyVFF1TEtzWlJxcHprVFM3ZFpJNHZvK3FKbmRFR084RXplY3lqYWM2L0lUTjJLT1dhVUxJVC9hTGRlVW5xcGRpN1ZXMitLeWMyOUZMM3M3ZTNoaTVMVFNoZVdXcHlXbEg0WHptdldqbmlPaUZOM1lXRGl2V0k5Mld1azVjdDJDMHAzSnpsOVlONjZXSTVJVi9WeUY4NnIxYTE3cEg1VU1DMHBYL0R3WFZVNTI0S3M1WWdEWm1MNHpHejF3ODBwMzNQajFwTXZjaSt0YzJjRklqbWhIMmRXVmZ1YVZMdUxqeTllVHpncU9ycWV3djB2dW0vMUtSNCsyYTZEaDVwWE83VjlPK3M0S1JKUEFEdXhOanRqRkNDay9DbHRFemdmelN0ZXJTdmRaUVplRG95eXF4UWd1UjFsWG1CbEkvOVBTZWJacGJPZThiaXZ0MmJGSzlZYUs0ZUhlN05MTmF0TFAzcUdZTGZMNzFSb012QjZYdTk2SjNUV3Q5TFRvUU01em04WWZ4YkhJRVNQWlhYVy90b3ZUU28rUHFGeE5lc3dacWpPL1gwOU92QmdpOU9jSHc3bGxVdWtjditkaTBybmVxZjk5dVhvS2dsTU13YWxsN3gvbXkwbWxQNXBpVm52M2Z1WisxOTN4bnBUWUx6M1NqZWpQTFhwTzZUdFhielhwZklVY2VKSG1Qc1hBSnNiSSthTDdmdnNwcFZzT1g3dWFkSjlGdnVUNjNQeHNaQVEzVU14eWdMeVd2c2s2L2x1a3U0MGZiOHR0b2xERkZiMVpRUTYvbVJrdjFpVzlpMUo2Qy8xYWVqQWN2UVBWbVV0NkZCMmNuMjZKekRPNFRzYUxjV2VhVGJvN0luMDRYMDg2OTZYeFRucmttekdDSGltbUpwTHVOYVBpNzFmK0tPa3RlNUlLOU9yUzc0aW5nUFNmSmQxb0lTRDlaMG0vaFBoQjBvKy9MZDNNTUdVclNVNjhzOXlVelhTTzNzdWhXK0JoK0pqMG95ejJzblpxZ3BjemQ1aXdwdlJ2bUtmWHBZL1AweWVTZnNnSE9obGl3dExTN2NCU2lSMWFaRlAzMHErQnQzZlhiSzloUTJUcis0clNjKzhkZmxYQ08ybDZwWStQSXM1cEYxeHM0a21iWFZCNnowSldSUmRIKzZCMHc4VmVveWRlV2xWODR4YVVMbnZYMDh2RXpObitISk91K3RmVDFjU2JLUExld3ZXa2MvYzEvWXRzNFNsSitESHB1bnNGMzA2OVhTcnc3VmhRZWw0Z0hOM1F1SE84akVrL084Y0MrVW8vcFhSK3ZHMExTbi9aWHhsWHlJb2M2MFBTaGVsZHd2ZHpiNEhXM0k3MXBPLzB3SFlxT0lwOHY0MUpUNTJUTmpmNWp4MjRmbUU5NldMckc3L2Jzb002ZWhDR3BKOHMwL1pWM2s4cW5UT2RYMUI2NkhPZ2I0YjVLUmZ0bDU0ZkM3b3Z5dlpacFh0Nkp5NG8zWnFlZE92TVRkc2xQVWhEMHJsV3h2Vk1GdFMwUDFVT25QdldrODRYZGIwRElYVy9rSGlNU0xlbTdyTU1LRG10OUowSG1ndEsvM0JnN0doZ09HTENnUFQ4YWZwMXBkVEV4NDg4Nm5ndEtGMmM5T3BzZ1ZEYk9LQ0pPUWFraSsxVnJGaSt3cmlKcGZOYS9vclNoY3JXMjg2akxZc3l5ZlpMbDhTRXRuTTY1ajFTTEgrd1hWRzZqYzBEWUk5ODZGdWpLSm5RTFYwYzFNcnc3c081bi9md3dEZmtvajlnZkQ0b3poeUZBVVZNcUJSbFlyQ2Qwb1VuUnJraXlFek9QRk5MRnpUelQ1VmxCWGQzT204b3prQnRPT2REUFprVTlrOS9QQ3BMa0hhcm5aVWZJaFhPdjAvNklTdjBTT2N2ai8xYjl0emZrTjVHM3g3ZWJkSWgzNFdmRjZ0cERycllLNlBVcGQvNGZKUzNicFhhcnRPSk4rU1JEQlhPdjBsNm02RXpaMXozNWx3OWszUk8wMVdNRkJVNEg0KzIxbE1iYjhYczB2bHZZVkhwM1BVcUtDY2FPRFVzbmJOTFNSNWNUQytkWitwcFZlbENuS2ExMTdlTlROUWtTVkZpVTJ0UCtRclNPVnZaWmFVTHF3dnRQQ2gvamRNYjNSTjk5UU9rb2p2OExzUVMway9PNyt0S2YrTk1UOTZOUDBVdkx2aW5SbTlKbjI0d1ZyYkRDYkdJZEY0eFZCTkoveEpTZTZVZW8vQmovOUkvN0R5MFB2cm5KeTVvcFNJUlJaWDBhUVVBQVB6WDNoM1VBQUNBUUF4N1lBRC9hbkZCQ05kYW1JQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBbW1vZUs5SHppQjVJOUVCWG54OEFBQUFBQUFBQUFMQm1BSVpLbXpXSW54eU9BQUFBQUVsRlRrU3VRbUNDIiwiYXR0YWNobWVudHMiOlt7ImZpbGVuYW1lIjoiN2YzZmY1ZmMtZTEwOC00OWE2LTljNmUtMTBmMDdlMzg0MGI3OnN0cmluZzpoZWFsdGhjZXJ0LnR4dCIsInR5cGUiOiI3NmU3ZGZkYS1kNGY3LTRlYTEtOTc0Ny02MDcwYTlhNjJiNDA6c3RyaW5nOnRleHQvb3Blbi1hdHRlc3RhdGlvbiIsImRhdGEiOiJjMTU1YzY3Ni05Yzk2LTRmM2MtOTYzYS0yYTU2OTJmMTdiYzU6c3RyaW5nOmV5SjJaWEp6YVc5dUlqb2lhSFIwY0hNNkx5OXpZMmhsYldFdWIzQmxibUYwZEdWemRHRjBhVzl1TG1OdmJTOHlMakF2YzJOb1pXMWhMbXB6YjI0aUxDSmtZWFJoSWpwN0ltbGtJam9pTnpZNU16Y3hNRE10TnpkbFppMDBOMk14TFRrNU1USXRZbUk1TW1Sak5EZ3lOMlZoT25OMGNtbHVaenBqTWpNMU5tVXpZaTA1TURBNUxUUXlNakF0WVRGall5MHhZV1k0WkRNME1qQmtZV1FpTENKMlpYSnphVzl1SWpvaU56RmhOV1V6T1RndFkyRm1NaTAwTkRRNExUZzJOelF0TVRBd1l6Z3hOR1prTnpCaE9uTjBjbWx1Wnpwd1pIUXRhR1ZoYkhSb1kyVnlkQzEyTWk0d0lpd2lkSGx3WlNJNklqTmtaV1ZrTnpFeExUSmlOR010TkRFMlpDMDRZVEJtTFdNeU1UQTFNelF3TURkbU9EcHpkSEpwYm1jNlVFTlNJaXdpZG1Gc2FXUkdjbTl0SWpvaVpEVXdNRGhtTUdJdE9HTTFOQzAwWXpRMUxUazVaR0V0WWpFNE56a3hZMlZpTWpZMk9uTjBjbWx1WnpveU1ESXhMVEE0TFRJMFZEQTBPakl5T2pNMkxqQTJNbG9pTENKbWFHbHlWbVZ5YzJsdmJpSTZJbUZrTnpkallqRXlMVE5sWmpndE5HWmpaaTA0TW1WakxUSmtPVFl5WVRsa1pEUTRORHB6ZEhKcGJtYzZOQzR3TGpFaUxDSm1hR2x5UW5WdVpHeGxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJalpqTURrM1ltSTBMVEkzWWpRdE5EQTBZeTFpTlRWaUxUSTNNbUk0WlRrd05HTXhZenB6ZEhKcGJtYzZRblZ1Wkd4bElpd2lkSGx3WlNJNkltWTFOakF3TURZeUxXSXdaVGd0TkdWbVpTMWhORGhrTFRNeFpqZzBNalk1TVdZd1lqcHpkSEpwYm1jNlkyOXNiR1ZqZEdsdmJpSXNJbVZ1ZEhKNUlqcGJleUptZFd4c1ZYSnNJam9pWkRWaU9EYzRaRFV0TVRka09TMDBPRGN5TFRrM09UY3RZVEUyTVRSaE0yWTBZekUzT25OMGNtbHVaenAxY200NmRYVnBaRHBpWVRkaU4yTTRaQzFqTlRBNUxUUmtPV1F0WW1VMFpTMW1PVGxpTm1SbE1qbGxNak1pTENKeVpYTnZkWEpqWlNJNmV5SnlaWE52ZFhKalpWUjVjR1VpT2lJellXTTVObVJsT1MweU5EUXhMVFJrTXpJdFltRmxOUzA0WkdOaVlqQmtNamd5WldVNmMzUnlhVzVuT2xCaGRHbGxiblFpTENKbGVIUmxibk5wYjI0aU9sdDdJblZ5YkNJNklqUmtOREUzTUdVNUxXRmtNRE10TkRreU55MWhPRGMxTFdReVlqYzBPV1V5WkRCbU5EcHpkSEpwYm1jNmFIUjBjRG92TDJoc055NXZjbWN2Wm1ocGNpOVRkSEoxWTNSMWNtVkVaV1pwYm1sMGFXOXVMM0JoZEdsbGJuUXRibUYwYVc5dVlXeHBkSGtpTENKbGVIUmxibk5wYjI0aU9sdDdJblZ5YkNJNkltSmtaVEkwTlRWbExURTVZall0TkRjeU5pMDRPVGcxTFRSbE9HVmhOV1V4WWpVMU5UcHpkSEpwYm1jNlkyOWtaU0lzSW5aaGJIVmxRMjlrWldGaWJHVkRiMjVqWlhCMElqcDdJblJsZUhRaU9pSmhNbU0zWVRBME15MHhPV1kyTFRReFptRXRPR014T1MxbE5XTTJZMkUzTkRBeU56azZjM1J5YVc1bk9sQmhkR2xsYm5RZ1RtRjBhVzl1WVd4cGRIa2lMQ0pqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpoaFpEVTJORFkzTFdOaU16TXROREJsWXkxaU5USXhMV0UzTVRJek1XVmhNR1UxTnpwemRISnBibWM2ZFhKdU9tbHpienB6ZEdRNmFYTnZPak14TmpZaUxDSmpiMlJsSWpvaVlqUTBNbUZpTlRRdFpHTTROQzAwTUdObUxXRTBNbU10WXpjMk1tSmhNVGcwTVRZNU9uTjBjbWx1WnpwVFJ5SjlYWDE5WFgxZExDSnBaR1Z1ZEdsbWFXVnlJanBiZXlKcFpDSTZJalJpWlRrNFpHRmlMV0pqWldZdE5HUTJNUzA0WkRZMkxUTmlZMk0yWmpCaVptSXpZanB6ZEhKcGJtYzZVRkJPSWl3aWRIbHdaU0k2ZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqSTRPVEl5TkdSbUxUSTBabUl0TkRneFppMDRPVE0wTFRWaFlUVmtOR0l4Tm1WbU16cHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOTJNaTB3TWpBeklpd2lZMjlrWlNJNkltWm1NR1V3T1RKaUxUTmtPV0l0TkRFM05pMDRZalprTFRNeU1HRXlPVFZoWkRsaVl6cHpkSEpwYm1jNlVGQk9JaXdpWkdsemNHeGhlU0k2SW1VNU5tSXhOalEwTFRnMFkyVXRORGxrWVMwNE5XUmtMVFEyWXpJMU5qY3hZV05qTXpwemRISnBibWM2VUdGemMzQnZjblFnVG5WdFltVnlJbjFkZlN3aWRtRnNkV1VpT2lJek1UUTRZV1kyWWkweE1UaG1MVFE1WldFdE9XUXpPUzFoT0RCbFl6bGpNemhqTUdJNmMzUnlhVzVuT2tVM09ETXhNVGMzUnlKOUxIc2lhV1FpT2lJNU5HVXpORGs1WlMwNFlXVTRMVFJpWmpjdE9EZ3hNUzB3WkdNeU1HUm1NVFl3T1RRNmMzUnlhVzVuT2s1U1NVTXRSa2xPSWl3aWRtRnNkV1VpT2lJMk1USmpOREV5TUMxaE0yRXdMVFEwTVdRdE9URm1NeTFqTmpVd1lqbGhNMlUxTVRJNmMzUnlhVzVuT2xNNU1EazRPVGc1V2lKOVhTd2libUZ0WlNJNlczc2lkR1Y0ZENJNklqRTVZamhsTURJMExXTXdZekF0TkRRME5TMWlNVEUzTFRWak1qWTRabUZtWXpGbFpUcHpkSEpwYm1jNlZHRnVJRU5vWlc0Z1EyaGxiaUo5WFN3aVoyVnVaR1Z5SWpvaVkyUTVaVEUwTVdRdFlUWmxZaTAwWkRrNExUazNNMlF0WkRZd01UY3pOV1V6TlRJNE9uTjBjbWx1WnpwbVpXMWhiR1VpTENKaWFYSjBhRVJoZEdVaU9pSTJOVE5oWW1Gak9TMHlNalV4TFRRelkyWXRPV1JpWXkxbE5XTTJOemcyTTJVM00yVTZjM1J5YVc1bk9qRTVPVEF0TURFdE1UVWlmWDBzZXlKbWRXeHNWWEpzSWpvaVpUUXlaRFF3WTJVdE9UWTNZaTAwWVRFeUxUa3pNRGt0WldVMU1tVTJNR05oTTJVME9uTjBjbWx1WnpwMWNtNDZkWFZwWkRvM056STVPVGN3WlMxaFlqSTJMVFEyT1dZdFlqTmxOUzB6Tm1FME1tVmpNalF4TkRZaUxDSnlaWE52ZFhKalpTSTZleUp5WlhOdmRYSmpaVlI1Y0dVaU9pSTNZVFF6TWpneE1TMWpNVFZoTFRRM01EUXRZakEyWXkweU56VXpZVFl6T1RFMU1qWTZjM1J5YVc1bk9rOWljMlZ5ZG1GMGFXOXVJaXdpYzNCbFkybHRaVzRpT25zaWRIbHdaU0k2SW1VMFl6RTJOREpsTFRGaE1UQXROR1k1WmkxaFlXVTJMV1V3TmpVM1lqSmtaalU0TURwemRISnBibWM2VTNCbFkybHRaVzRpTENKeVpXWmxjbVZ1WTJVaU9pSXpNVFkwWXpWbVppMWpPV00xTFRReFpEVXRZbVl6Tnkwd1pETmhZakV3TVRJMU1URTZjM1J5YVc1bk9uVnlianAxZFdsa09qQXlOelZpWm1GbUxUUTRabUl0TkRSbE1DMDRNR05rTFRsak5UQTBaamd3WlRaaFpTSjlMQ0p3WlhKbWIzSnRaWElpT2x0N0luUjVjR1VpT2lJMU9USmpaRFZoTWkxa05tRTBMVFJoT0RjdE9ETmpOaTFpTW1RMVlUVTVZMkUxWXpNNmMzUnlhVzVuT2xCeVlXTjBhWFJwYjI1bGNpSXNJbkpsWm1WeVpXNWpaU0k2SWpFMk1UVTVNVGxqTFRJeE1XVXRORGMyWlMwNU5qVTJMVGRrTnpreU5HUXlZekU1TlRwemRISnBibWM2ZFhKdU9uVjFhV1E2TTJSaVptWXdaR1V0WkRSaE5DMDBaVEZrTFRrNFltWXRZV1kzTkRJNFlqaGhNRFJpSW4wc2V5SnBaQ0k2SW1FeFpEaGtNRFJtTFdJNFpUUXRORFk0WXkxaE9UUXpMV1EwT1daa05XVmhZbVprTkRwemRISnBibWM2VEVoUUlpd2lkSGx3WlNJNkltTTFNek5rTmpnM0xUZGtNbVl0TkRaaE9DMDRPR00xTFRObFlXSXhaREJpT1RVek5qcHpkSEpwYm1jNlQzSm5ZVzVwZW1GMGFXOXVJaXdpY21WbVpYSmxibU5sSWpvaU9ERXlZVGxpWWpVdFlUZ3dNUzAwWWpkbExXSmpNV0V0TUdRMk56VXlNR1ZoTm1ZNU9uTjBjbWx1WnpwMWNtNDZkWFZwWkRwbVlUSXpNamhoWmkwME9EZ3lMVFJsWVdFdE9HTXlPQzAyTm1SaFlqUTJPVFV3WmpFaWZTeDdJbWxrSWpvaU9UazVNMkkwT0dZdE9UUTRZeTAwTnpKa0xXRmpNMkV0WXpoalpqUXhNVEZsTkdOak9uTjBjbWx1WnpwQlRDSXNJblI1Y0dVaU9pSXdaamhqTWpRMk5TMDRaamd5TFRRMVltVXRZVE5sTkMxa05qazJORGRsTm1FNU16STZjM1J5YVc1bk9rOXlaMkZ1YVhwaGRHbHZiaUlzSW5KbFptVnlaVzVqWlNJNkltUTVNVFptTTJKbUxUZGpaREV0TkRnMU5pMDVORFkyTFdJeFl6WTNNV1UwWlRVMVpUcHpkSEpwYm1jNmRYSnVPblYxYVdRNk9ETTVZVGRqTlRRdE5tSTBNQzAwTVdOaUxXSXhNR1F0T1RJNU5XUTNaVGMxWmpjM0luMWRMQ0pwWkdWdWRHbG1hV1Z5SWpwYmV5SnBaQ0k2SWpNNU9UWXhNR0ZpTFROak9USXRORFpqTkMwNU1qQTBMVGt3Tm1Nek16TTBZelUzT0RwemRISnBibWM2UVVOVFRpSXNJblI1Y0dVaU9uc2lZMjlrYVc1bklqcGJleUp6ZVhOMFpXMGlPaUprTmpnMU1UYzFOQzFtTVdNd0xUUmxOV010WWpRek1DMWpNekptTVRZNVl6VTRNak02YzNSeWFXNW5PbWgwZEhBNkx5OTBaWEp0YVc1dmJHOW5lUzVvYkRjdWIzSm5MME52WkdWVGVYTjBaVzB2ZGpJdE1ESXdNeUlzSW1OdlpHVWlPaUptWXpOaE5UTTJZeTFsTUdGbExUUTFabVV0WWpsaU9TMDNaalUwWlRKbU4yUmtaamc2YzNSeWFXNW5Pa0ZEVTA0aUxDSmthWE53YkdGNUlqb2lOVEJpWkRobVl6a3ROREV3WlMwME9URXdMV0l5TkdZdE5qRmlOMkkzWVRJMVpqRTRPbk4wY21sdVp6cEJZMk5sYzNOcGIyNGdTVVFpZlYxOUxDSjJZV3gxWlNJNklqZGtZakprWkRGaExUZzNPVFl0TkdFd1l5MDVORGxqTFdNMFlqUTNOamRtTXpnd1pUcHpkSEpwYm1jNk1USXpORFUyTnpnNUluMWRMQ0pqWVhSbFoyOXllU0k2VzNzaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSTBObVl4TlRVd1lTMWhNR1l6TFRSaVlXTXRPV013WXkweE9UYzJOakptTkRkbVpXVTZjM1J5YVc1bk9taDBkSEE2THk5emJtOXRaV1F1YVc1bWJ5OXpZM1FpTENKamIyUmxJam9pTlRBNU1tVTNNVGN0TTJSaFlpMDBPVEl3TFdGbU0yRXROREEyTlRFMU1UUmlaRFppT25OMGNtbHVaem80TkRBMU16a3dNRFlpTENKa2FYTndiR0Y1SWpvaU9UZGlaV1prT0RJdE4ySTRZeTAwTTJJMkxUaGxaak10WmpGaE9XVTJZalE0T0dVMU9uTjBjbWx1WnpwRFQxWkpSQzB4T1NKOVhYMWRMQ0pqYjJSbElqcDdJbU52WkdsdVp5STZXM3NpYzNsemRHVnRJam9pTW1JNE1EZGtZelV0TW1aaE9TMDBZVEUxTFRnNFlXUXRORGs0T1daa09EWXlObUpqT25OMGNtbHVaenBvZEhSd09pOHZiRzlwYm1NdWIzSm5JaXdpWTI5a1pTSTZJbUV3WXpFM1pHWmhMVFZoTVRrdE5ERXdZeTFoWkdKbUxUZzNaamxqTXpZeVpXWmxNVHB6ZEhKcGJtYzZPVFExTXpFdE1TSXNJbVJwYzNCc1lYa2lPaUprTlROa1pXUmxOaTFoWW1FM0xUUTROREV0T1Rjek1DMW1Oek5tT1Roa05EUXlNakE2YzNSeWFXNW5PbE5CVWxNdFEyOVdMVElnS0VOUFZrbEVMVEU1S1NCU1RrRWdjR0Z1Wld3Z0xTQlNaWE53YVhKaGRHOXllU0J6Y0dWamFXMWxiaUJpZVNCT1FVRWdkMmwwYUNCd2NtOWlaU0JrWlhSbFkzUnBiMjRpZlYxOUxDSjJZV3gxWlVOdlpHVmhZbXhsUTI5dVkyVndkQ0k2ZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqSTJORFUyTldWaExUZzVNamd0TkRoa1lTMDRORFV6TFRSaFpHSmxaR00wTm1JNE56cHpkSEpwYm1jNmFIUjBjRG92TDNOdWIyMWxaQzVwYm1adkwzTmpkQ0lzSW1OdlpHVWlPaUpsTkRnMlpqUXdOaTB3TldOakxUUTFNbUV0T0dZM09TMWpNVEpoT1Rsa01tSTNORFk2YzNSeWFXNW5PakkyTURNNE5UQXdPU0lzSW1ScGMzQnNZWGtpT2lKaU1tWTBNMlkwWVMxbU9XUm1MVFEyWW1RdE9UQXpPUzFsT0RKalptWTRPV0UxTldRNmMzUnlhVzVuT2s1bFoyRjBhWFpsSW4xZGZTd2laV1ptWldOMGFYWmxSR0YwWlZScGJXVWlPaUl6WXpobU1ESTNNeTAxTWpsaUxUUXlZell0WVRka01TMDVaalZsTVdNek1ERm1ZVE02YzNSeWFXNW5Pakl3TWpBdE1Ea3RNamhVTURZNk1UVTZNREJhSWl3aWMzUmhkSFZ6SWpvaU4yTmhNR0prWm1RdFlqUmtNQzAwTURJMUxUbGxNR010WVRJMk9XSTJaRFExWlRObE9uTjBjbWx1WnpwbWFXNWhiQ0o5ZlN4N0ltWjFiR3hWY213aU9pSTFORGcyTTJNM05DMWtaalprTFRRd01tSXRZbVprTVMwM01UUTRZV1prTVRZeE5qZzZjM1J5YVc1bk9uVnlianAxZFdsa09qQXlOelZpWm1GbUxUUTRabUl0TkRSbE1DMDRNR05rTFRsak5UQTBaamd3WlRaaFpTSXNJbkpsYzI5MWNtTmxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJbVUyWmpobFpqQXdMVGc0T0dJdE5EazVZeTFpTURBMExUUmtNV05rWldRM1lqTm1NRHB6ZEhKcGJtYzZVM0JsWTJsdFpXNGlMQ0owZVhCbElqcDdJbU52WkdsdVp5STZXM3NpYzNsemRHVnRJam9pTURGbE5HSTRZVEl0TVRjNU15MDBOVGt3TFRreVpXTXROekUwTUdRNU1qaG1ZVGMyT25OMGNtbHVaenBvZEhSd09pOHZjMjV2YldWa0xtbHVabTh2YzJOMElpd2lZMjlrWlNJNkltWTFOR0k0TWpFM0xXTmhPRFV0TkdJMU5DMDRZVE5pTFdZNU9URmtaVEUzT0RZellUcHpkSEpwYm1jNk1qVTROVEF3TURBeElpd2laR2x6Y0d4aGVTSTZJalU1WkROaE9UazNMVGszWmpBdE5HVTBNaTA0TmpNMExUVmtaREF3TkdFMU4yWXpaRHB6ZEhKcGJtYzZUbUZ6YjNCb1lYSjVibWRsWVd3Z2MzZGhZaUo5WFgwc0ltTnZiR3hsWTNScGIyNGlPbnNpWTI5c2JHVmpkR1ZrUkdGMFpWUnBiV1VpT2lJeU4yVTFZakl4TXkwd1lqSTRMVFEyWW1VdFlUVXlaaTFoTkRoak9UY3hNVGN5TUdFNmMzUnlhVzVuT2pJd01qQXRNRGt0TWpkVU1EWTZNVFU2TURCYUluMTlmU3g3SW1aMWJHeFZjbXdpT2lKbU5UYzFabUkzTUMwM00yTXpMVFJsWlRZdE9UUmpZaTFrWVRNNU1qTmlOVGt6T0dVNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pOa1ltWm1NR1JsTFdRMFlUUXROR1V4WkMwNU9HSm1MV0ZtTnpReU9HSTRZVEEwWWlJc0luSmxjMjkxY21ObElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNkltSmxNR015TlRSbExUbG1Oall0TkRnd1l5MDVOemcxTFdWbVpUSXpaRFkxTUdSbE9EcHpkSEpwYm1jNlVISmhZM1JwZEdsdmJtVnlJaXdpYm1GdFpTSTZXM3NpZEdWNGRDSTZJbVZrWVRrd04yWTVMV1l4TW1RdE5EYzFPUzFpTlRaakxXTTVPV0UzT0RZNVpEWm1aRHB6ZEhKcGJtYzZSSElnVFdsamFHRmxiQ0JNYVcwaWZWMHNJbkYxWVd4cFptbGpZWFJwYjI0aU9sdDdJbU52WkdVaU9uc2lZMjlrYVc1bklqcGJleUp6ZVhOMFpXMGlPaUpoTmpVNFltRmtOeTAyTkdSaUxUUTJaalF0T1RVMk5TMDBNekE0TWpVeU5tUmxOV1E2YzNSeWFXNW5PbWgwZEhBNkx5OTBaWEp0YVc1dmJHOW5lUzVvYkRjdWIzSm5MME52WkdWVGVYTjBaVzB2ZGpJdE1ESXdNeUlzSW1OdlpHVWlPaUppWkRBeFlXUXdZeTA1T1RGakxUUXpOamd0WVRrM1lTMHdZVEl4T0RjME9UQTNaRFk2YzNSeWFXNW5PazFEVWlJc0ltUnBjM0JzWVhraU9pSXdOamN6WVRnelppMDROek5pTFRRNE1EUXRZVGRpTXkwM00yVmhOR0V3Wm1RMlpUUTZjM1J5YVc1bk9sQnlZV04wYVhScGIyNWxjaUJOWldScFkyRnlaU0J1ZFcxaVpYSWlmVjE5TENKcFpHVnVkR2xtYVdWeUlqcGJleUpwWkNJNklqUmtZalJsWlRFM0xUTXlZamd0TkRrNE15MWhaVE5oTFdJd00ySmtaR0l5WlRVeU5UcHpkSEpwYm1jNlRVTlNJaXdpZG1Gc2RXVWlPaUl6TVRBMllXUmlZaTFsT1dWbExUUmlNbVF0T0dOa1ppMWlNMkV3WmpBeFlqWXlZbVU2YzNSeWFXNW5PakV5TXpRMU5pSjlYU3dpYVhOemRXVnlJanA3SW5SNWNHVWlPaUl4TVRWa05tUmxOaTB6TlRSakxUUTJZVGt0WWpWallpMHlZMlppWVRJd09UZzNNREE2YzNSeWFXNW5Pazl5WjJGdWFYcGhkR2x2YmlJc0luSmxabVZ5Wlc1alpTSTZJbUkyWW1OaE5qRTBMV1ZtWkdNdE5EWTRNeTA0TVdZekxUUTFPR1F6TWpRNE9HWm1aVHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZZbU0zTURZMVpXVXROREpoWVMwME56TmhMV0UyTVRRdFlXWmtPR0UzWWpNd1lqRmxJbjE5WFgxOUxIc2lablZzYkZWeWJDSTZJbVk0WWpGaE56STRMVGM1WW1ZdE5ESmtNUzFpTXpSaUxUaG1abVEyWlRNek5tSXhPRHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZZbU0zTURZMVpXVXROREpoWVMwME56TmhMV0UyTVRRdFlXWmtPR0UzWWpNd1lqRmxJaXdpY21WemIzVnlZMlVpT25zaWNtVnpiM1Z5WTJWVWVYQmxJam9pWTJZNU5ERXlaV1F0TnpNNE55MDBZVEl6TFRrNFpUa3ROREl4TWpSaE5UVmxaR1prT25OMGNtbHVaenBQY21kaGJtbDZZWFJwYjI0aUxDSnVZVzFsSWpvaU1tVmxPREprTm1FdE1UYzVaaTAwWVdFd0xXRTJZamt0T1RnNE16TmhabVF6WVdaa09uTjBjbWx1WnpwTmFXNXBjM1J5ZVNCdlppQklaV0ZzZEdnZ0tFMVBTQ2tpTENKMGVYQmxJanBiZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqUXpaR1ZsTWpNeExXSmpZek10TkRnd01DMWhNakEyTFdRNFlUSTBaV0kxTlRGaVlqcHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOXZjbWRoYm1sNllYUnBiMjR0ZEhsd1pTSXNJbU52WkdVaU9pSmpaRFU0WWpNeFppMDRNV1prTFRRek9HWXRPR1UzWlMweVlqRTJZVGN6TjJJMVpqVTZjM1J5YVc1bk9tZHZkblFpTENKa2FYTndiR0Y1SWpvaU1HWTRNMlEwWW1FdFkyWm1ZaTAwT0RnMUxUbGhNVFF0WkRBMFlXSXhZalEyWlRJeU9uTjBjbWx1WnpwSGIzWmxjbTV0Wlc1MEluMWRmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJamxsTVRrMU9EUTFMV00yTmpRdE5HUXpOeTFoWkdabUxXVXhNMlF6TVdZNFl6Z3lNVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lKaE5UaGhNRGxsTUMwME1qRXhMVFE0WkdZdE9UUXpNaTAwWldaalpXVmlOR1kzWldJNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMXZhQzVuYjNZdWMyY2lmU3g3SW5ONWMzUmxiU0k2SW1KbE1HRXlZV0k0TFRObVpqWXROREJpT1MwNVlqa3dMVGcxTWpVeVpURm1PVE15WmpwemRISnBibWM2Y0dodmJtVWlMQ0oyWVd4MVpTSTZJakl4TVRJNE1EUTRMV1ppTmpVdE5EWXpOUzA0TURFeUxUVmlORFJrTlRNd1pUa3hNRHB6ZEhKcGJtYzZLelkxTmpNeU5Ua3lNakFpZlYwc0ltRmtaSEpsYzNNaU9uc2lkSGx3WlNJNkltTXlOMkZqWkdNNExUQTJOVGt0TkRFM01pMDVZalUyTFdFMk1XVTNaalExTVdFeE5EcHpkSEpwYm1jNmNHaDVjMmxqWVd3aUxDSjFjMlVpT2lKa05XVmpPRFU1WVMxa056WmxMVFJsWldJdFlqRTBNUzAwWmpVd056bGlZbU0yT1RZNmMzUnlhVzVuT25kdmNtc2lMQ0owWlhoMElqb2lNekZoWVdOaU9XWXRNRGM1WmkwME9UZGhMVGd4TlRVdFpqRmpORE5oT0daaE16azFPbk4wY21sdVp6cE5hVzVwYzNSeWVTQnZaaUJJWldGc2RHZ3NJREUySUVOdmJHeGxaMlVnVW05aFpDd2dRMjlzYkdWblpTQnZaaUJOWldScFkybHVaU0JDZFdsc1pHbHVaeXdnVTJsdVoyRndiM0psSURFMk9UZzFOQ0o5ZlYxOWZTeDdJbVoxYkd4VmNtd2lPaUkyT1daa05tWmlZaTFpTUdSaExUUTNaRGt0WVdFeU5DMHpNV0ZqTlRZMU5ESTROemc2YzNSeWFXNW5PblZ5YmpwMWRXbGtPbVpoTWpNeU9HRm1MVFE0T0RJdE5HVmhZUzA0WXpJNExUWTJaR0ZpTkRZNU5UQm1NU0lzSW5KbGMyOTFjbU5sSWpwN0luSmxjMjkxY21ObFZIbHdaU0k2SWpGbFpqQTJNMlJsTFRJM05tRXRORGt5TlMwNU16VXlMV05sWm1NNU5qTTNaV0kyTURwemRISnBibWM2VDNKbllXNXBlbUYwYVc5dUlpd2libUZ0WlNJNklqTm1ZelEwWTJNd0xXVmlNelF0TkdZMk55MWhOelU0TFRNeVlqWTRaVFpsWlRCa05qcHpkSEpwYm1jNlRXRmpVbWwwWTJocFpTQk5aV1JwWTJGc0lFTnNhVzVwWXlJc0luUjVjR1VpT2x0N0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lOMlZpTldKbU9UUXROREF6TUMwME1UbGhMV0UxWVRBdFkyUmlNMlE1TnpReU5XRmtPbk4wY21sdVp6cG9kSFJ3T2k4dmRHVnliV2x1YjJ4dloza3VhR3czTG05eVp5OURiMlJsVTNsemRHVnRMMjl5WjJGdWFYcGhkR2x2YmkxMGVYQmxJaXdpWTI5a1pTSTZJalpoTnpVM1l6YzJMV05sTlRRdE5HVmtaaTA1WkdFMExUbG1aV0ZqWVdGbVpXRmlPVHB6ZEhKcGJtYzZjSEp2ZGlJc0ltUnBjM0JzWVhraU9pSmxOREUwT0dZM09TMDVZMll4TFRRNU16Y3RZakprWXkwME1tVXpZamczTWpoaVlqYzZjM1J5YVc1bk9raGxZV3gwYUdOaGNtVWdVSEp2ZG1sa1pYSWlmVjBzSW5SbGVIUWlPaUl5TlRJMk16QmpOUzFqWW1ObExUUmlNRE10WVRjME1DMWtNalJoTVRCaE9EWTNNRGc2YzNSeWFXNW5Pa3hwWTJWdWMyVmtJRWhsWVd4MGFHTmhjbVVnVUhKdmRtbGtaWElpZlYwc0ltTnZiblJoWTNRaU9sdDdJblJsYkdWamIyMGlPbHQ3SW5ONWMzUmxiU0k2SW1JNFltWXlZbUZtTFROa01HRXRORFJqT1MxaVlUaGlMVE5oTkdGall6VmpNR000TVRwemRISnBibWM2ZFhKc0lpd2lkbUZzZFdVaU9pSm1aamMyTURjME1pMHdNRE5oTFRSbFkySXRPRFk0TlMweFkyWTVNRFE0WWpReFpUazZjM1J5YVc1bk9taDBkSEJ6T2k4dmQzZDNMbTFoWTNKcGRHTm9hV1ZqYkdsdWFXTXVZMjl0TG5ObkluMHNleUp6ZVhOMFpXMGlPaUpsT0RJNVpURmxOaTA0TUdNekxUUmhNbVV0T0RSbE1pMDJOVE5qWWpka1l6UTROR0k2YzNSeWFXNW5PbkJvYjI1bElpd2lkbUZzZFdVaU9pSXpaR05rWVRBeE5pMW1OVEkwTFRSbU1EZ3RPREJtTnkweE1tTXlOMkl3Tm1JNE5tTTZjM1J5YVc1bk9pczJOVFl4TWpNME5UWTNJbjFkTENKaFpHUnlaWE56SWpwN0luUjVjR1VpT2lKbU9XTTNObUl4WkMxaFpEZzFMVFF5TldZdFlqUmhaaTAxTkRBNU16QXhOemsxTVdJNmMzUnlhVzVuT25Cb2VYTnBZMkZzSWl3aWRYTmxJam9pTkRaa09EYzVOekV0T0dabE15MDBZbU5pTFRreE5UQXRNREl4WW1RME1qRXlaV1UxT25OMGNtbHVaenAzYjNKcklpd2lkR1Y0ZENJNkltTTNOVGxoWWprd0xUSXdOVE10TkRFMU1DMDVNMk5oTFRReU5HSXhOV1ptTmpVNE1qcHpkSEpwYm1jNlRXRmpVbWwwWTJocFpTQkliM053YVhSaGJDd2dWR2h2YlhOdmJpQlNiMkZrTENCVGFXNW5ZWEJ2Y21VZ01USXpNREF3SW4xOVhYMTlMSHNpWm5Wc2JGVnliQ0k2SWpkbU1URTNPVGc0TFdFMVpXVXROREE1WXkxaFptWTRMVFppTW1Zd1pXSXhPVGhoTURwemRISnBibWM2ZFhKdU9uVjFhV1E2T0RNNVlUZGpOVFF0Tm1JME1DMDBNV05pTFdJeE1HUXRPVEk1TldRM1pUYzFaamMzSWl3aWNtVnpiM1Z5WTJVaU9uc2ljbVZ6YjNWeVkyVlVlWEJsSWpvaVpHSXhObVF5TUdZdFpqbGpPQzAwTkRrd0xXSTFOREF0TmpKaVl6TTROV1psT1RSaE9uTjBjbWx1WnpwUGNtZGhibWw2WVhScGIyNGlMQ0p1WVcxbElqb2lNbVUzTWpnMFpURXRPV1ZqTlMwMFpqVTVMV0UxWVRBdE9EVTNabVl5WXpFNVpXSTBPbk4wY21sdVp6cE5ZV05TYVhSamFHbGxJRXhoWW05eVlYUnZjbmtpTENKMGVYQmxJanBiZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNkltSmpPRFZpWTJaa0xXWTVOV0V0TkRWaE1pMWhPVGc1TFdRNE16TXpOR1F6WVRjd1pEcHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOXZjbWRoYm1sNllYUnBiMjR0ZEhsd1pTSXNJbU52WkdVaU9pSXpNMkV6WTJObU55MHdPRGMxTFRRellXSXRPV0psTUMwMU56Um1NbVJsWXpRMVlqWTZjM1J5YVc1bk9uQnliM1lpTENKa2FYTndiR0Y1SWpvaU56WTFZV1EyWTJNdE1UTXdNUzAwTlRjNUxUbGtPV0l0TkdOaVlqTTROVEkwWXpsbE9uTjBjbWx1WnpwSVpXRnNkR2hqWVhKbElGQnliM1pwWkdWeUluMWRMQ0owWlhoMElqb2lZVFF5T1RVeFkyTXRaV0l4TkMwME1EZzRMV0psWVRndFlUaG1aamcwTWpsaU56aGtPbk4wY21sdVp6cEJZMk55WldScGRHVmtJRXhoWW05eVlYUnZjbmtpZlYwc0ltTnZiblJoWTNRaU9sdDdJblJsYkdWamIyMGlPbHQ3SW5ONWMzUmxiU0k2SWpGaE5XSXlNVFF5TFRVeE5HRXROREEzWmkxaU9UYzVMVFkzWmpKaVl6STNOek13TURwemRISnBibWM2ZFhKc0lpd2lkbUZzZFdVaU9pSmpZVGhtWmpnNFppMDFNamxtTFRRd1pUWXRPREEyTkMwME9HUTJOVEF4TnprME16QTZjM1J5YVc1bk9taDBkSEJ6T2k4dmQzZDNMbTFoWTNKcGRHTm9hV1ZzWVdKdmNtRjBiM0o1TG1OdmJTNXpaeUo5TEhzaWMzbHpkR1Z0SWpvaU56WTJZek01WXpFdFltWmlNUzAwTWpJM0xUa3hOVEV0WVRBMVpESmtOekJtTTJNNU9uTjBjbWx1Wnpwd2FHOXVaU0lzSW5aaGJIVmxJam9pTXpVeFpERmpOVFV0T0RnME1DMDBPVEJpTFRreVlXSXROMk5oTWpZNU16ZGpNVGRoT25OMGNtbHVaem9yTmpVMk56WTFORE15TVNKOVhTd2lZV1JrY21WemN5STZleUowZVhCbElqb2laREpsTURCa1ltWXRaR1l4TXkwME5EUXlMV0ZoT1RZdE1UZzRNVFJsTVRkak9HTmpPbk4wY21sdVp6cHdhSGx6YVdOaGJDSXNJblZ6WlNJNklqSmlNV0U1TjJZd0xUSmlNRFF0TkdWallpMWhNR1UzTFRVMU5tSTBNbVZoTXpNMlpqcHpkSEpwYm1jNmQyOXlheUlzSW5SbGVIUWlPaUl6WVRreFlUVTVaUzFsTmpVeUxUUm1NR0V0WVROa1l5MDBPV1V3TVRWaU5URTFOR002YzNSeWFXNW5PaklnVkdodmJYTnZiaUJCZG1WdWRXVWdOQ3dnVTJsdVoyRndiM0psSURBNU9EZzRPQ0o5ZlYxOWZWMTlMQ0pwYzNOMVpYSnpJanBiZXlKdVlXMWxJam9pWVdKalpUSXhZVFV0T1RNeFlTMDBPRFF4TFdKaE1XRXROekl4WlRnelptUm1aRE15T25OMGNtbHVaenBUUVUxUVRFVWdTVk5UVlVWU0lDaEVUeUJPVDFRZ1ZrVlNTVVpaS1NJc0ltbGtJam9pT1dZM1pUVXpNbVl0TmpJNE9DMDBORGhrTFdFeE1Ea3RabVE1WmpJM1pqWXpObUkwT25OMGNtbHVaenBrYVdRNlpYUm9jam93ZUVVek9UUTNPVGt5T0VOak5FVm1Sa1UxTURjM05EUTRPRGM0TUVJNVpqWXhObUprTkVJNE16QWlMQ0p5WlhadlkyRjBhVzl1SWpwN0luUjVjR1VpT2lKaVlUQTBaVEl6TmkwNU9UZzBMVFF6T1dFdFltVmpNaTAwWTJSa05UYzJaV1ZpTURZNmMzUnlhVzVuT2s1UFRrVWlmU3dpYVdSbGJuUnBkSGxRY205dlppSTZleUowZVhCbElqb2lOamN3WW1ReE5tSXROV0kxTmkwME1qZzBMVGcyTjJFdE5UUmlOamszWXpBMVpXRTFPbk4wY21sdVp6cEVUbE10UkVsRUlpd2liRzlqWVhScGIyNGlPaUl5TWpaalpUY3laUzAxTnpaaUxUUTJaamt0WVRjeU1pMWpNR1UxWTJFNFpERXpObUU2YzNSeWFXNW5PbVJ2Ym05MGRtVnlhV1o1TG5SbGMzUnBibWN1ZG1WeWFXWjVMbWR2ZGk1elp5SXNJbXRsZVNJNklqRXdNak0xT0dZeUxUTmtNRFF0TkRNd055MWhZemMzTFdNMVlUTm1aVGRpTVRnellUcHpkSEpwYm1jNlpHbGtPbVYwYUhJNk1IaEZNemswTnprNU1qaERZelJGWmtaRk5UQTNOelEwT0RnM09EQkNPV1kyTVRaaVpEUkNPRE13STJOdmJuUnliMnhzWlhJaWZYMWRMQ0lrZEdWdGNHeGhkR1VpT25zaWJtRnRaU0k2SW1Ka1pqQmlaV0ZsTFdZNFpURXRORFJoWVMxaFptVXpMV1l3TVRFM05qVXdOVE00WWpwemRISnBibWM2U0VWQlRGUklYME5GVWxRaUxDSjBlWEJsSWpvaU1EYzBNakV5Wm1RdFpqSXhOQzAwTXprM0xUaGhNVFl0T1RRMU1XRTJOakF5T0dVME9uTjBjbWx1WnpwRlRVSkZSRVJGUkY5U1JVNUVSVkpGVWlJc0luVnliQ0k2SWpneFpEUXhaR00zTFdKak1EUXROREE0TmkxaE5HVTFMVGRpTnpsa05UWTFZemc1WVRwemRISnBibWM2YUhSMGNITTZMeTlvWldGc2RHaGpaWEowTG5KbGJtUmxjbVZ5TG0xdmFDNW5iM1l1YzJjdkluMHNJbTV2ZEdGeWFYTmhkR2x2YmsxbGRHRmtZWFJoSWpwN0luSmxabVZ5Wlc1alpTSTZJbVpsWmpZNE9UWmlMVGM0WTJNdE5ESTNNQzA0Tm1ZekxUVTBNVGczTkRGa09HTTNaanB6ZEhKcGJtYzZZekl6TlRabE0ySXRPVEF3T1MwME1qSXdMV0V4WTJNdE1XRm1PR1F6TkRJd1pHRmtJaXdpYm05MFlYSnBjMlZrVDI0aU9pSm1ZalEzTTJNMU1pMHpNMk5qTFRRMFpUVXRZbVV4WXkwM05UQTBOMkl5WkdGaE1XVTZjM1J5YVc1bk9qSXdNakV0TURndE1qUlVNRFU2TURrNk5Ua3VNams1V2lJc0luQmhjM053YjNKMFRuVnRZbVZ5SWpvaU1tVXdZamxoTVdVdFlqWXdPQzAwTldReUxXRmxNall0TkdRd1kyRXlZVEkxTlRCa09uTjBjbWx1WnpwRk56Z3pNVEUzTjBjaUxDSjFjbXdpT2lJMU0yVmpNV1ZoWVMweE5HUTBMVFE0TlRBdE9UZzFPQzB4TXpJd01ESXhOR1pqWlRVNmMzUnlhVzVuT21oMGRIQnpPaTh2WVdOMGFXOXVMbTl3Wlc1aGRIUmxjM1JoZEdsdmJpNWpiMjB2UDNFOUpUZENKVEl5ZEhsd1pTVXlNaVV6UVNVeU1rUlBRMVZOUlU1VUpUSXlKVEpESlRJeWNHRjViRzloWkNVeU1pVXpRU1UzUWlVeU1uVnlhU1V5TWlVelFTVXlNbWgwZEhCekpUTkJKVEpHSlRKR1lYQnBMWFpoWTJOcGJtVXVjM1J2Y21GblpTNXpkR0ZuYVc1bkxtNXZkR0Z5YVhObExtbHZKVEpHWkc5amRXMWxiblFsTWtZeE1URmtNREkzWVMxbE9HUmpMVFJsTkRRdE9Ea3lOQzFqTkRGalpEY3dOMlZoWXpZbE1qSWxNa01sTWpKd1pYSnRhWFIwWldSQlkzUnBiMjV6SlRJeUpUTkJKVFZDSlRJeVZrbEZWeVV5TWlVeVF5VXlNbE5VVDFKRkpUSXlKVFZFSlRKREpUSXljbVZrYVhKbFkzUWxNaklsTTBFbE1qSm9kSFJ3Y3lVelFTVXlSaVV5Um5kM2R5NTJaWEpwWm5rdVoyOTJMbk5uSlRKR2RtVnlhV1o1SlRJeUpUZEVKVGRFSXlVM1FpVXlNbXRsZVNVeU1pVXpRU1V5TW1aaE16VmtOR0kzTXpWaU5tUTFNRE15TjJNNU4yWXdNRGd5TnpFeU9UazVZMlpoTmpReVltSTRNekF5TldZME9EY3pNMlUxWmpJeU16QTJObVE1Tm1ZbE1qSWxOMFFpZlN3aWJHOW5ieUk2SW1VeU1tUmhNRGt6TFRZMk56Z3ROREkwWkMxaFpUUXlMVGcxTVRJNVl6TXlaV1V5TWpwemRISnBibWM2WkdGMFlUcHBiV0ZuWlM5d2JtYzdZbUZ6WlRZMExHbFdRazlTZHpCTFIyZHZRVUZCUVU1VFZXaEZWV2RCUVVGbVVVRkJRVVJKUTBGTlFVRkJRWEI0SzFCaFFVRkJRVTB4UWsxV1JWVkJRVUZFVFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZW1WRGJXbEJRVUZCUVVWSVVsTlViRTFCVVV3clFUZDRRV2R1TWtSUU0zcENkM0l4UTFCRmJDdEpMMUZCUVVKM1pFcFNSVVpWWlU1eWMyNWtNVEl5ZVc5UlVuWnJTRWxUU0U0cmVpOTBlVlZyT1c5VVJVTlJNV0pVUW1NeU0ySjVUbk13UWpWSFNVUkJVa0ZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGckswbHJLMGxrZURSbk5VNDBRamxIVVM5eVVFRTVTaTlKVUdaVFozZE1MMDFGUlVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkVkMUExV2xCdlVEVnlOMFpLUzBGbU4yTjFaa0pwYUZCT1UydFlOV2hzUVRsMUswUnpVRGRrV0M5S1N6RlFNbFpRYVZOSmIyVmlSWEpNZDFab05WcDRLemhETVZreU1sbDBVREJHY0dZMmFHUmxZU3R0Y1RGWGJHbDRabVZxTmxKalJIaHFNRGx6ZDFoaVltVkNVWEJwYW5Wbk1qQmhhaTlUUlRoaWRtODFhRVYxWVhaQmRWTkxjRkZtU25oVVJ6a3haMVZ5UTFZMmFsTlJSVEJ2VUd0bE5IZDFhMlUzTURWRmNYQk1UbGQ0ZEUxMFUyczBhblpZUjJ4a0szUk1iSGgyVmsxT2JtRnJSRGR0Ulc1a1dWUldWMU51VmpnMk1GZFZXR3d6TkZKTmVUZENaVzF3ZVVkNlRqZHdRV0p0V0VWQk5tSm1ka3N3ZFRNeWRWUkdTMHRXVFRCeU1GbDNNVTFVWTBaMmNEaHBWa3hRUkRBck9XZElVWGtyTjNKVFpqTmxaV3B3TWtoMVJtTnpiV3hrYVVWNk1FWjZTMWhtVTFKM00zRmxNRGhZY1dRNVpGQTJVVXRQVG01cmRUUnNSek5PVTJJdlVrSjBTM1JMZERGMGRHUkNTbWxaWWpKV1NUZGljbU0zZEdNNFNWbHZkRXA2U0ZWQ01HTXJUeXRVTTNKVVVYVk1TM05hVW5Gd2VtdFVVemRrV2trMGRtOHJjVXB1WkVWSFR6aEZlbVZqZVdwaFl6WXZTVlJPTWt0UFYyRlZURWxVTDJGTVpHVlZibkZ3WkdrM1ZsY3lLMHQ1WXpJNVJrd3pjemRsTTJocE5VeFVVMmhsVjFkd2VWZHNTRFJZZW0xMlYycHVhVTlwUms0eldWZEVhWFpYU1RreVYzVnJOV04wTWtNd2NETktlbXc1V1U0Mk5sZEpOVWxXTDFaNVJqZzJjakZoTVRkd1NEVlZUVU13Y0ZndlJIZFlWbFUxTWpSTGN6VlpaMFJhYlV3MGVrZDZNWGM0TUhBek0xQnFNWEJOZG1OcEszUmpNbU5HU1dwdGFFZ3laRmRXWm5WaFZreDFUR3A1T1dWVWVtZHhUM0p4WlhkMk1IWjFiUzh4UzFJMEt6SmhOa1JvTlhCWVR6ZFdPVThyY3pSTFVrcFFRVVIxZUU1cWRHcEdRME5yTDBOc2RFVjZaMlo2VTNSbGNsTjJaRnBSV21WRWIzbDVjWGhSWjNWU01XeFliVUpzU1M4NVVGTmxZbHB3WWs5bE9HSnBkblF5WWtaTE9WbGhTelJsU0dVM1RreE9ZWFJNVUROeFIxbE1aa3czTVZKdlRYWkNObGgxT1RaS00xUlhkRGxNVkc5UlRUVjZiVGhaWm5oaVNFbEZVMUJhV0ZoWEwzUnZkbFJUYnl0UWNVWjRUbVZ6ZDFweGFrOHZXREE1VDNaQ1oyazVUMk5JZHpkc2JGVjFhMk4ySzJScE1ISnVaWEZtT1RsMVdHOUxaMnhOVFhkaGJHdzNlQzl0ZVRCdGJGQTFjR2xXYm5ZelpuVmFLekU1TTNodWNGUlpUSG96VTJwbGFsQk1XSEJQTmxSMFdHSjZXSEJtU1ZWalpVcEliVkJ6V0VGS2MySkpLMkZNTjJaMmMzQndWbk5QV0RkMVlXUktPVVoyZFZRMk0xQjRjMXBCVVROVlRYaDVaMHg1VjNaemF6WXZiSFZyZFRRd1ptSTRkSFJ2YkVSR1JtSXhXbEZSTmk5dFVtdDJNV2xYT1dreFNqWkRMekZoWldwQlkzWlJVRlp0VlhRMlJrSXlZMjR5TmtwNlJFODBWSE5oVEdOWFpXRlVZbTgzU1c0d05GZ3dPRFk1TmxoNFZHNXlhMjE2UjBOSWFXMXRTbkJNZFU1aFVHazNNV1lyUzA5cmRHVTFTVXM1VDNKVE56UnBibWRRVTJaS1pERnZTVk5FT1Zvd2JTOW9VR2hDTUc4ckwweGtNMDFOUjFWeVUxVTJPSE01ZVZWNldGTlBNM04xYUZjclFtZ3JTbW93YjNsNk1uTnVXbkZuY0dONlpEVnBkM0IyVW5adFMyWlljRmt2VURCNVpWTm1jMmRJVDJoc2FYZDBURk0zWTBKVGFWSXhZVnBHVURNd2NTdENkRE5tV0dKTE9XaFJNbFJ5S3pSeVUyTXJPR1JtYkZoRFR6SnNObkJaSzFCSmN6VndSakY0Y3pScmJXSllWa0kyZWpCS1YxSlNaRWdyTmtJd2R6aFdaVzk1WkdWWGJGWTROSGhoVlV4dWRsZ3dPSFpGZWs1dUswaEtUM1VyZEdaVU1XTlRZa3RRVEdWM2RsZHJZeTlqTVM5WmRITTBVMnhLSzBSSWNIVnVjMFl6TURZNVdGTnlkemRXYUZGbGJEUm5TRTR6VVhWSVR6aHFSV3N2VHpoalF5dFZieTl3V0ZJcmRrY3dURk51TDFwWWVHeFllVWx2WXpZd1VGTm9aV3hrZDNaa2VtSTBTRmN6U1RjeGNFOHZNSGRJV1hGUFNYQTRkalF4U2xRMU1sUk9hbVkxYW5neU5HWnRSVGsyVjB4eVJ6Y3ZZbk52VFRabGFFTkhjRW80Y3pBdldsWXphemh4YmxSUFpGZ3hRalkyU0U5bllqUmlOVXRTWm5Sc05UUm1RemR2ZG5sMldscHdXSFEyU25rMGJ6TmFjV1ZrVDNaTlZHUnpiRkJWYUVRd2NteFhlSFpXVFVaMFV6QlFNVlZQYmxCMlYyczRORmhrWWpCRVNWaFhMMnRJYVUxVFRHVnROM0pOVFV0RWJYUTVTakJJYldkMFN5OHpRbWMzUjJoblQwZE1RMmRRVkRoaFpuQXhjR1JVUlhnME9EZzJibWQwUzBZeVl6bFBjSE5uVmtSaVQwdERTazlSWVd0cEt6Rldja1pwSzNkeWFVcHdaazVoTDI5eVUyaGpjbGN5T0RacVRGbHplWGxtV2t4c09GTkZkRzVOTmpWcU1WTk1TQ3QzV0ZaSE5tcGpNRVJaU1RrNE5rWjFha3RLYmxGTVZqQmpNVTF5ZHpkelR6VnVMMlozZDBSbWEyOXFPV2RtUkRSdmVtaDVSa0ZWVmsxeFFsSnNXWEpEWkRCdlZXNVNjbXRwZVVWNlQxQkdUa3hHZWxSNlZEVldiRUpZWkROUGJUaHZlbXRDZEU5UFpFUlFXbXRWT1dzNUwxQkRjRXhyU0dGeWJscFZaa2xvV0U5Mk1DODJTVk4yTUZOUFkzWnFMekZpT1hSNlptdE9OVWN6ZURkbFltUkphRE0wVjJaR05uUndSSEp5V1VzMlVGVndaQzgwWmtwVE0ySndXR0Z5ZEU5S1RpdFRVa1JDV0U5Mk1HdzJiVFpGZWxveGVqTTFiSGM1YXpOU1R6QXhWMDFHUWxVMFNEUXJNakZzVFdKaU9GaHpNSFpzZGxsV1NIQXpVRlZ4UzBOallVOUVWWE51WWs1TVUxSTFZMVJESzJSYUszQndWbVZzUTI1TFlURXhOMlZPVkU1UmExTldSbWxWTW5SUUsxRnlVMDlXZGxwYVlWVk1jWGQyZEZCRGFDOXFaRTFpTTFKT09UbFJUMnR2YW5ZNFRITlJVekJyTDA4M0szUkxaaXRPVFZRNU5rNVFNRlYyVEhacGJsSnRPVXB1TWpSM1ZuSmlSRU5pUjBsa1JqUjRWa0pPU2k5NFNsTmxObFZsYnk5Q2FpODVTUzgzUkhrd1VIWnlia3A1Tlc5d1UwbFNVbHBZTUdGUlZVRkJVSHBZTTJnelZVRkJRMEZSUVhnM1dVRkVMMkZ1UmtKRFRtUmhiVWxCUWtGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUkVGdGJXOWxTemxJZW1sQ05VazVSVUpZYm5nNFFVRkJRVUZCUVVGQlFVeENiVUZKV2t0dGVsZEpibmg1VDBGQlFVRkJSV3hHVkd0VGRWRnRRME1pTENKaGRIUmhZMmh0Wlc1MGN5STZXM3NpWm1sc1pXNWhiV1VpT2lKbU5qTmtZVGxoTmkxbFlXUTRMVFE1TVRRdFltWXlaUzFsTW1GaU16QTJabU5rWkdZNmMzUnlhVzVuT21obFlXeDBhR05sY25RdWRIaDBJaXdpZEhsd1pTSTZJbUkyTURSbE5qRTRMVGM0TjJRdE5HVmtOeTA0TXpreUxUbGpOakV4T1RWa016WTVaRHB6ZEhKcGJtYzZkR1Y0ZEM5dmNHVnVMV0YwZEdWemRHRjBhVzl1SWl3aVpHRjBZU0k2SW1Oa01HSmxOR1ppTFRZeE5qVXROR0ZoTlMxaU1EVm1MVGRsTW1VNE1UTTFNVGd3WkRwemRISnBibWM2WlhsS01scFlTbnBoVnpsMVNXcHZhV0ZJVWpCalNFMDJUSGs1ZWxreWFHeGlWMFYxWWpOQ2JHSnRSakJrUjFaNlpFZEdNR0ZYT1hWTWJVNTJZbE00ZVV4cVFYWmpNazV2V2xjeGFFeHRjSHBpTWpScFRFTkthMWxZVW1oSmFuQTNTVzFzYTBscWIybE9SR2h0VFhwc2JVNXFRWFJPUjBsNVdWTXdNRTFIUm10TVZHaHJXbXBCZEUxVVNtaE5WR1JvV2xkWmQwOVVXVE5QYms0d1kyMXNkVnA2YnpOT2JVNW9XbXBPYlU5VE1ERk9WR3Q0VEZSU2JGcHFSWFJaYW1NeFRta3dlRmt5U1RCT01rVXpUbTFTYkZwSFZXbE1RMG95V2xoS2VtRlhPWFZKYW05cFdtMUpORTlIVVhsYWFrMTBUVzFSTTFsVE1EQk9lbXhxVEZSck1VNUVSWFJOYlZWNFdtcFpNVTV0V21sYWFsWnNUMjVPTUdOdGJIVmFlbkIzV2toUmRHRkhWbWhpU0ZKdldUSldlV1JETVRKTmFUUjNTV2wzYVdSSWJIZGFVMGsyU1cxUk5Ga3lVbWhaZWtKcFRGZEpNbHB0U1hST1IwMHpUWGt4YVUxNlRUSk1WRTAxVFhwak5WcEhXVE5QUkdzeVRucHdlbVJJU25CaWJXTTJWVVZPVTBscGQybGtiVVp6WVZkU1IyTnRPWFJKYW05cFRWZFpOVTlYUm14Wk1rVjBXWHBaZDFwVE1EQk9lbGsxVEZkSk0wOUhXWFJOVjBreFRXMUZNRTV0VW1sYVIwWm9UMjVPTUdOdGJIVmFlbTk1VFVSSmVFeFVRVFJNVkVrd1ZrUkJNRTlxU1hsUGFrMHlUR3BCTWsxc2IybE1RMHB0WVVkc2VWWnRWbmxqTW14MlltbEpOa2xxVm14YVZGWnRUVzFaTVV4VVRUQk5hbEYwVGtkTmVWcHBNRFJOUkZFMVRGZEdhazU2WjNsUFZGRTFUbFJuZWsxVWNIcGtTRXB3WW0xak5rNUROSGRNYWtWcFRFTktiV0ZIYkhsUmJsWjFXa2Q0YkVscWNEZEpia3BzWXpJNU1XTnRUbXhXU0d4M1dsTkpOa2x0V1ROUFJGa3dXbTFSZUV4VWJHcE9hazEwVGtSRk0xbHBNRFJhYWtKclRGZE9hRTU2YUcxYVZFRjRXVmRPYWs5VWNIcGtTRXB3WW0xak5sRnVWblZhUjNoc1NXbDNhV1JJYkhkYVUwazJTV3BWTVU5WFdteE5WMGt3VEZSa2JWcFhWWFJPUjBreFRua3dOVmxYV21oTVZGRjNUa1JaZDFwWFJteE5WMUpzVG1wd2VtUklTbkJpYldNMldUSTVjMkpIVm1wa1IyeDJZbWxKYzBsdFZuVmtTRW8xU1dwd1ltVjVTbTFrVjNoelZsaEtjMGxxYjJsUFJFcHBXVmROZVU1WFdYUmFWMUV6VGtNd01FNHlTbXBNVjBVeVdrUkpkRTlYVlROWlZHUnJUbTFKZVZwcWJHcFBiazR3WTIxc2RWcDZjREZqYlRRMlpGaFdjRnBFY0dsWlZHUnBUakpOTkZwRE1XcE9WRUUxVEZSU2EwOVhVWFJaYlZVd1dsTXhiVTlVYkdsT2JWSnNUV3BzYkUxcVRXbE1RMHA1V2xoT2RtUllTbXBhVTBrMlpYbEtlVnBZVG5aa1dFcHFXbFpTTldOSFZXbFBhVWw0VDBSRk1FMVVaekpPYVRBMVdrUmplRXhVVVhwT01rVjBXVlJuTWxwVE1EVk9SR3Q0VG0xU2FVOUVaek5aYlVrMll6TlNlV0ZYTlc1UGJFSm9aRWRzYkdKdVVXbE1RMHBzWlVoU2JHSnVUbkJpTWpScFQyeDBOMGx1Vm5saVEwazJTV3BHYVUxWFRtdE9SMFpzVEZkWk1GbFVUWFJPUkUweVdta3dORTlFUlRGTVZHYzBUVmRSTTFsVVRtcE5lbWh0VDBSd2VtUklTbkJpYldNMllVaFNNR05FYjNaTU1taHpUbmsxZG1OdFkzWmFiV2h3WTJrNVZHUklTakZaTTFJeFkyMVdSVnBYV25CaWJXd3dZVmM1ZFV3elFtaGtSMnhzWW01UmRHSnRSakJoVnpsMVdWZDRjR1JJYTJsTVEwcHNaVWhTYkdKdVRuQmlNalJwVDJ4ME4wbHVWbmxpUTBrMlNXcEpkMDlIVlROWmVsRjVURlJhYkU1cVkzUk9SRVpzVDFNd05FOVVXbWxNVkVFeldrZFpNazFYVm14T1IxcHFXWHB3ZW1SSVNuQmliV00yV1RJNWExcFRTWE5KYmxwb1lraFdiRkV5T1d0YVYwWnBZa2RXUkdJeU5XcGFXRUl3U1dwd04wbHVVbXhsU0ZGcFQybEpkMDFYVlhwUFJHUnRXVk14YTFwRVJteE1WRkV5V1hwQmRFOVhXVFZaVXpGcldtcG9hbHBxWXpKWmVtTjRUbXBSTm1NelVubGhWelZ1VDJ4Q2FHUkhiR3hpYmxGblZHMUdNR0ZYT1hWWlYzaHdaRWhyYVV4RFNtcGlNbEp3WW0xamFVOXNkRGRKYms0MVl6TlNiR0pUU1RaSmFrRjNUVmRKZDA5SFdUUk1WMVUwV2tSbmRFNUhUbTFhYVRGb1QxUlpNa3hYVlRGYVZGazFUMFJHYTFsdFZtbFpWSEI2WkVoS2NHSnRZelprV0VwMVQyMXNlbUo2Y0hwa1IxRTJZVmhPZGs5cVRYaE9hbGxwVEVOS2FtSXlVbXhKYW05cFdtcE9hazU2VlRGWlZFMTBUa1JyTVU1VE1EQk9WR00wVEZSb2JWcHFaM1JQUjFGNlRYcE5NVmw2V1RWT2JWVTBUMjVPTUdOdGJIVmFlbkJVVW5sS09WaFlNVGxZV0RGa1RFTktjRnBIVm5Wa1IyeHRZVmRXZVVscWNHSmxlVXB3V2tOSk5rbHFRVEJhYWxKcFRXMVZNVXhVVlhwWlYxbDBUa2RGTWsxRE1XaE9WR2MxVEZSb2JVNVVhekphUkVKcVRsUnJOVnBxY0hwa1NFcHdZbTFqTmxWR1FrOUphWGRwWkVoc2QxcFRTVFpsZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1cxVk5WbFVXbXBOZW1jeVRGZEplVmxxUVhST1JFSm9UWGt4YUU1WFJURk1WR3hvV2tkRk5GcFhUbTFOUkVVeFRsUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMUpzWTIweGNHSnRPWE5pTW1RMVRHMW9jMDU1TlhaamJXTjJVVEk1YTFwV1RqVmpNMUpzWWxNNU1rMXBNSGROYWtGNlNXbDNhVmt5T1d0YVUwazJTV3BrYVZwWFZUQk5SR2MxVEZkU2FscEVTWFJPUkdScFdYa3hhVTFxWXpCTVZFRTBXVzFSTWxwRWFHMU9la0pxV1dwd2VtUklTbkJpYldNMlZVWkNUMGxwZDJsYVIyeDZZMGQ0YUdWVFNUWkpiVTE0V20xVmQwMTZZM3BNVkZwcVdrUkpkRTVIV21oT1V6QTBUbFJKTlV4VWJHbE5iVmsxVG5wck1VNVVXbWxPVkhCNlpFaEtjR0p0WXpaVlIwWjZZek5DZG1OdVVXZFVibFowV1cxV2VVbHVNV1JtVTNkcFpHMUdjMlJYVldsUGFVcG9UVlJqTkU1dFRUVk9RekI1V1hwU2JVeFVVWHBOUkdOMFdWZEdiVTlUTUhoYWFtaHNUMVJSTTAxdFdtbFBWMWsyWXpOU2VXRlhOVzVQYTFVelQwUk5lRTFVWXpOU2VVbzVURWh6YVdGWFVXbFBhVWt5VGxSQ2JFOVhSbXBOVXpCNVQwUkNiRXhVVVRWTmFtZDBUMFJGZWxscE1XaFBWRlUxVFdwQmQxbDZhekZOUkZVMll6TlNlV0ZYTlc1UGF6VlRVMVZOZEZKcmJFOUphWGRwWkcxR2MyUlhWV2xQYVVreFRsZE5NMWw2UlRST2VUQjRXVlJaTTB4VVVtbE9iVkYwV1cxRmVFNURNREpOUjAweVRrZGFhRTFxWTNsT1IxazJZek5TZVdGWE5XNVBiRTAxVFVSck5FOVVaelZYYVVvNVdGTjNhV0p0Um5SYVUwazJWek56YVdSSFZqUmtRMGsyU1cxWk0wNTZWWGxaYWxFd1RGZFNhMXBxUlhST1IwMDFXa013TlU1cVRtcE1WMUY1VGtSb2FGa3lXVEphUjFFelRXcHdlbVJJU25CaWJXTTJWa2RHZFVsRlRtOWFWelJuVVRKb2JHSnBTamxZVTNkcFdqSldkVnBIVm5sSmFtOXBXa1JqZUZwdFRtbE9Na1YwV2xkRk0xbDVNREJaZW1ONlRGZEpNVTFxVVhSWk1sa3hUbnBqTTAxSFRUSk9Na2sxVDI1T01HTnRiSFZhZW5CdFdsY3hhR0pIVldsTVEwcHBZVmhLTUdGRlVtaGtSMVZwVDJsSk5WcFhTVEpOUkVadFdXa3hhMDFVVFhwTVZGRjZXbTFaZEZscVdtMWFRekZzVFcxSmVscHFTVEphUkZFeFdXcEpObU16VW5saFZ6VnVUMnBGTlU5VVFYUk5SRVYwVFZSVmFXWllNSE5sZVVwdFpGZDRjMVpZU25OSmFtOXBXVzFaTTAxcVVUVmFWRWwwVFRKUmVWbFRNREJOVkVWNVRGZEZNRmw2WTNSYVIwa3dUMFJDYTA1NlVYaGFWMXB0VDI1T01HTnRiSFZhZW5BeFkyMDBObVJZVm5CYVJHOHpUbnBKTlU5VVkzZGFVekZvV1dwSk1reFVVVEpQVjFsMFdXcE9iRTVUTUhwT2JVVXdUVzFXYWsxcVVYaE9SRmxwVEVOS2VWcFlUblprV0VwcVdsTkpObVY1U25sYVdFNTJaRmhLYWxwV1VqVmpSMVZwVDJsS2EwMHlUWGRhYlVadFRYa3hhVTVFUm1oTVZGRjZXWHBCZEU5WFZYcE9VekIzVFhwQk5FNVhVWGRPUjFWNVdrZFJObU16VW5saFZ6VnVUMnM1YVdNeVZubGtiVVl3WVZjNWRVbHBkMmxqTTBKc1dUSnNkRnBYTkdsUGJuTnBaRWhzZDFwVFNUWkpiVTVvV21wak5FMXRUWGRNVjFKcVRtMVpkRTVFVW1oT1F6RnBXV3BaTkV4VVZUQlBSR3N6VFZkS2FrMUViR3RPYW5CNlpFaEtjR0p0WXpaVk0wSnNXVEpzZEZwWE5HbE1RMHA1V2xkYWJHTnRWblZaTWxWcFQybEtiVTVIVFRKT1YxVjVUWGt4YWs1dFdtdE1WRkY0VG5wbmRFOVVhelJPVXpGclRVUm9hMWt5Um10Tk1sVTBUa1JCTm1NelVubGhWelZ1VDI1V2VXSnFjREZrVjJ4clQycEJlVTU2Vm1sYWJVWnRURlJSTkZwdFNYUk9SRkpzVFVNd05FMUhUbXRNVkd4cVRsUkJNRnBxWjNkYVZGcG9XbE5LT1V4RFNuZGFXRXB0WWpOS2RGcFlTV2xQYkhRM1NXNVNOV05IVldsUGFVcHRXVEpLYVU5RVZtcGFVekIzV1hwRmVFeFVVWGxhUjAxMFQwUmFhRTVwTURSYVJFcHJUbGRWTlZsVWEzZGFha1UyWXpOU2VXRlhOVzVQYkVKNVdWZE9NR0ZZVW5CaU1qVnNZMmxKYzBsdVNteGFiVlo1V2xjMWFscFRTVFpKYlVwclRVZFJkMDlFVVRSTVZFNXBXVmROZEU1RVFtbFplVEExVFVkRk1reFVVWGxOVjFGNVRsUlJNVTFFWXpCYWFuQjZaRWhLY0dKdFl6WmtXRXAxVDI1V01XRlhVVFpOTWxKcFdtMVpkMXBIVlhSYVJGSm9Ua013TUZwVVJtdE1WR3MwV1cxWmRGbFhXVE5PUkVrMFdXcG9hRTFFVW1sSmJqQnpaWGxLY0ZwRFNUWkphbGt4V1cxV2JGcFVUWGxNVjBwcldWZEpkRTVIV1hsT1F6QTBUV3BuZUV4VVRUSlpiVkpwV21wc2JGbFVhekJhVkhCNlpFaEtjR0p0WXpaVVJXaFJTV2wzYVdSSWJIZGFVMGsyU1cxSk5FNXRVVEphVkZrelRGUnNhazFVVlhST1Ixa3dUbE14YUU1cWF6Qk1WR1JzVFdwS2FFNTZVbXRhYWtVeVRXcHdlbVJJU25CaWJXTTJWRE5LYmxsWE5YQmxiVVl3WVZjNWRVbHBkMmxqYlZadFdsaEtiR0p0VG14SmFtOXBUMGRSTWs1cVp6Vk9SR2QwVFVST2ExbFRNREJQUjBrelRGZEdhMDFFVFhSUFZHTXlXbXBOZUZwdFZtbE5SMVpxVDI1T01HTnRiSFZhZW5BeFkyMDBObVJZVm5CYVJIQnRXVlJKZWsxcWFHaGFhVEF3VDBSbmVVeFVVbXhaVjBWMFQwZE5lVTlETURKT2JWSm9XV3BSTWs5VVZYZGFha1ZwWmxONE4wbHRiR3RKYW05cFdWZE5NVTFxUlhkT2VrMTBUa2RhYlU1NU1EQmFWRkYzVEZSck0xbDZTWFJhYW1zeFRWZGFiVTVVUVRSUFZFbDRUMjVPTUdOdGJIVmFlbkJDVkVOSmMwbHVValZqUjFWcFQybEplazFVVlhoUFYwVXhUVk13ZDA1NlFUQk1WRkY2VFhwRmRGbFhSVEpaZVRCNVRrUkZNazlFUlROYVZGcHFXbFJaTm1NelVubGhWelZ1VDJzNWVWb3lSblZoV0hCb1pFZHNkbUpwU1hOSmJrcHNXbTFXZVZwWE5XcGFVMGsyU1dwYWFrNHlWbXBOYWtFeFRGZEpORTE2VFhST1JGRTBUbE13TlU1VVozcE1WRWt6V2xSYWFFNHlUVFJhYWxKdFRWUndlbVJJU25CaWJXTTJaRmhLZFU5dVZqRmhWMUUyVDBSTk5WbFVaR3BPVkZGMFRtMUpNRTFETURCTlYwNXBURmRKZUUxSFVYUlBWRWsxVGxkUk0xcFVZekZhYW1NelNXNHhaRXhEU25CYVIxWjFaRWRzYldGWFZubEphbkJpWlhsS2NGcERTVFpKYlVwc1RsZFdhMXBYU1hoTVZGSnNUMFJyZEU1RVZUVk5RekEwVG5wc2JVeFVVWGhhUjBrMVRXMUpNazE2Vm1sT1JIQjZaRWhLY0dKdFl6WlJWVTVVVkdsSmMwbHVValZqUjFWcFQyNXphVmt5T1d0aFZ6VnVTV3B3WW1WNVNucGxXRTR3V2xjd2FVOXBTbWxOYlVwdFRrUnJlVTFwTURCYVZFRXlURlJSZVUxRVNYUlpha0V6VDBNd2QxcFVUWGhhVkVWNVQwZFZORmw2U1Raak0xSjVZVmMxYms5dGFEQmtTRUUyVEhrNU1GcFlTblJoVnpWMllrYzVibVZUTlc5aVJHTjFZak5LYmt3d1RuWmFSMVpVWlZoT01GcFhNSFprYWtsMFRVUkpkMDE1U1hOSmJVNTJXa2RWYVU5cFNtbFBWRXBwVDBSRk1rMXBNV2hPUkdNeVRGUlNhazlFUVhSUFJFcG9XWGt3TkU1RVNYZE5SMVY2V1hwWk1FMTZWVFpqTTFKNVlWYzFiazlyUmtSVk1EUnBURU5LYTJGWVRuZGlSMFkxU1dwdmFVNVVRWGhPVkVwcFdtcEZkRTR5V21sTlV6QXdXa1JPYUV4VWF6Tk9NazEwVDBkSk1rNUVhM2hhUjBadFRVUlZlazl1VGpCamJXeDFXbnB3UWxreVRteGpNMDV3WWpJMFoxTlZVV2xtVmpFNVRFTktNbGxYZURGYVUwazJTV3BSZUUxRVJtMU9SMWt5VEZSS2JGbFVXWFJPUkd4c1dXa3hhRmxxVFRCTVZFSnFUbFJvYWs0eVZYbFpiVmt3V21wd2VtUklTbkJpYldNMlRWUkplazVFVlRKT2VtYzFTVzR4WkV4RFNtcFpXRkpzV2pJNWVXVlRTVFpYTTNOcFdUSTVhMkZYTlc1SmFuQmlaWGxLZW1WWVRqQmFWekJwVDJsSk5GbHFXWGRhUkVreVdWTXhiVTFVWnpSTVZGSnBXbXBaZEZscVNtaE5RekF6VG0xUmVrMUhWVEpPUkVsM1dUSlZObU16VW5saFZ6VnVUMjFvTUdSSVFUWk1lVGw2WW0wNWRGcFhVWFZoVnpWdFluazVlbGt6VVdsTVEwcHFZakpTYkVscWIybE9WR3hxV2tSRk0wNVVXWFJaTWtac1RXa3dNRnBxU21sTVYwbDRUVlJCZEU5WFJtbGFWRUY0VFVkV2FrMHlSVFJQYms0d1kyMXNkVnA2YnpST1JFRXhUWHByZDAxRVdXbE1RMHByWVZoT2QySkhSalZKYW05cFQwZEZOVTFxUVRCTmVtTjBUVEpGZUZwcE1EQlBSMGw2VEZkRk5GbFVWWFJaVkdzMVRYcHJOVTFYVFhkWmVsWm9UMjVPTUdOdGJIVmFlbkJFVkRGYVNsSkRNSGhQVTBvNVdGZ3haRXhEU21waU1sSnNTV3B3TjBsdFRuWmFSMngxV25sSk5sY3pjMmxqTTJ4NlpFZFdkRWxxYjJsT2FscHBXVmRWTUZsNlNYUk9hazEzV2tNd01GbFVWVEpNVkd4c1dUSk5kRTlVWnpOT2VteHNUMWRTYWs1RVZtaFBiazR3WTIxc2RWcDZjRzlrU0ZKM1QyazRkbUpIT1hCaWJVMTFZak5LYmtscGQybFpNamxyV2xOSk5rbHFhekJaVkUweVQxUlNiVXhYU214T2VtTjBUa2ROZVZscE1EVk9SRkpvVEZSWk5FNUhSbXRaZWtsNFdrZE5NMDE2Y0hwa1NFcHdZbTFqTms5VVVURk5la1YwVFZOSmMwbHRVbkJqTTBKeldWaHJhVTlwU1RKTlZHUm9UVlJLYVZsVE1ERlBSR3hyVEZSU2JVNTZXWFJQVkVKb1dYa3hhVTFxWkdsTlYxVjRUMVJqTWsxRVdUWmpNMUo1WVZjMWJrOXNUa0pWYkUxMFVUSTVWMHhVU1dkTFJVNVFWbXRzUlV4VVJUVkxVMEpUVkd0RloyTkhSblZhVjNkblRGTkNVMXBZVG5kaFdFcG9aRWM1ZVdWVFFucGpSMVpxWVZjeGJHSnBRbWxsVTBKUFVWVkZaMlF5YkRCaFEwSjNZMjA1YVZwVFFtdGFXRkpzV1ROU2NHSXlOR2xtVmpFNVRFTktNbGxYZURGYVZVNTJXa2RXYUZsdGVHeFJNamwxV1RKV2QyUkRTVFpsZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1dwUmVWcHRXWGRaTWtrd1RGUlZlbGxVWTNST1JHaHNUVU13TkZwVVRUUk1WMFpwVDFST2FWbFVUbWxOYlZFeVdsUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMDUxWWpJeGJGcEROWEJpYlZwMlRETk9hbVJEU1hOSmJVNTJXa2RWYVU5cFNUSk9WRkpyVFZSWk5FMURNSGhhVkVrelRGUlJNRTVxUlhSWlZGWm9UVk13TkUxWFJtaFpha0UxVFRKUk5VNVVRVFpqTTFKNVlWYzFiazlxU1RKTlJFMDBUbFJCZDA5VFNYTkpiVkp3WXpOQ2MxbFlhMmxQYVVrMVdXcEZOVTlYV20xWmVURnRXa1JzYTB4VVVYZE5iVlYwVDBSYWJGcHBNVzFPVjBWNlRXcGpNVTFIU1hwUFIwMDJZek5TZVdGWE5XNVBhelZzV2pKR01HRllXbXhKYmpGa1psTjNhVnBYV20xYVYwNHdZVmhhYkZKSFJqQmFWbEp3WWxkVmFVOXBTVEZPTWxKc1RtcG5ORnBwTVcxT1JGa3pURlJTYUZsVWEzUlpWR3MxVG1rd01rNXFWVFJOZWtreVdWUkZlRnBxWXpaak0xSjVZVmMxYms5cVNYZE5ha0YwVFVScmRFMXFhRlZOUkZrMlRWUlZOazFFUW1GSmFYZHBZek5TYUdSSVZucEphbTlwV1dwa2EwNXRXVFZhVjAxMFRVUkZNbHBUTURCT1YwWnJURmRKZDA5SFZYUk9hbWN6VFVkTmQxcFVWbTFaYWtVelQyNU9NR050YkhWYWVuQnRZVmMxYUdKRFNqbG1VM2czU1cxYU1XSkhlRlpqYlhkcFQybEpNMDVVYXpSYVZFRjRXWGt3ZWxwcVNUQk1WRkUwV1cxSmRFOUVSWHBOVXpGcFQwUnJORTU2VG1oYWFsRXlXbFJWTm1NelVubGhWelZ1VDI1V2VXSnFjREZrVjJ4clQycEJlVTU2Vm1sYWJVWnRURlJSTkZwdFNYUk9SRkpzVFVNd05FMUhUbXRNVkd4cVRsUkJNRnBxWjNkYVZGcG9XbE5KYzBsdVNteGpNamt4WTIxT2JFbHFjRGRKYmtwc1l6STVNV050VG14V1NHeDNXbE5KTmtscVdtcE5WRTB4VG5wV2JFeFVhM2xPVkZGMFRrUm5ORmw1TURSTmVtZDNURlJSZVU0eVdYZE5ha0pzV1ZSUk5VMXFjSHBrU0Vwd1ltMWpObFV6UW14Wk1teDBXbGMwYVV4RFNqQmxXRUpzU1dwd04wbHRUblphUjJ4MVdubEpObGN6YzJsak0yeDZaRWRXZEVscWIybE5la2w2VDBkV2FsbHFRWFJOVjFVMVRWTXdNRTU2U1RSTVYwa3lXWHBWZEU1NlFUVlBSRkp0VFVSWk5WcHFUWGRQYms0d1kyMXNkVnA2Y0c5a1NGSjNUMms0ZG1NeU5YWmlWMVpyVEcxc2RWcHRPSFpqTWs0d1NXbDNhVmt5T1d0YVUwazJTV3BHYlUxVVp6Tk9WRmt5VEZSRk1rMUVXWFJPUkZaclRXa3hhRnBFYUcxTVYwVTBUVmRSZDFwcVozaFphbU16VGtSd2VtUklTbkJpYldNMlRXcFZORTVVUVhkTlJFRjRTV2wzYVZwSGJIcGpSM2hvWlZOSk5rbHFUWGxPUjAxM1dWZFJNVXhVVFhkWlZFRjBUa2RSTWs5RE1XaE9SR3QzVEZSWmVGcHFSbXROTWxWNFRqSkpNMXBFY0hwa1NFcHdZbTFqTmxSdFJucGlNMEp2V1ZoS05XSnRaR3haVjNkbll6TmthRmxwU2psWVdEQnpTVzFPZG1KSGVHeFpNMUp3WWpJMGFVOXVjMmxaTWpsellrZFdhbVJIVm10U1IwWXdXbFpTY0dKWFZXbFBhVXBwV20xS2FGcFVhM2haZVRBd1RrUkZlRXhVVVhsWmJVbDBXV3ByTkU5RE1XaE5Na1V4V21wTmVrNUhTbWhPZWtVMll6TlNlV0ZYTlc1UGFrbDNUV3BCZEUxRWEzUk5hbVJWVFVSWk5rMVVWVFpOUkVKaFNXNHhPV1pUZURkSmJWb3hZa2Q0Vm1OdGQybFBhVWw0VFRKSmQxcEhUVEpQUXpCNVRWZFdha3hVVVhkWmVtTjBUMWRLYWxsNU1ESlpWRkY2VG0xYWJGbHRWWGxQVjFVMll6TlNlV0ZYTlc1UGJsWjVZbXB3TVdSWGJHdFBhazVyV1cxYWJVMUhVbXhNVjFFd1dWUlJkRTVIVlhoYVF6QTFUMGRLYlV4WFJtMU9lbEY1VDBkSk5GbFVRVEJaYVVselNXNUtiR015T1RGamJVNXNTV3B3TjBsdVNteGpNamt4WTIxT2JGWkliSGRhVTBrMlNXcG9hRmxVUm10YVJGa3lURmRSZWxwcVZYUk9SMGw0VFhrd05VOUVaR3BNVkdkNFdsUk5NazVVVVRCYVIwVjRUbXB3ZW1SSVNuQmliV00yVlVoS2FGa3pVbkJrUjJ4MlltMVdlVWxwZDJsaWJVWjBXbE5KTmxjemMybGtSMVkwWkVOSk5rbHFaR3RQUkZKb1QwUmplVXhVV21sWlZFVjBUa1JKTUU5VE1XbE9Na1V5VEZkRk0wMVVSWGxPVkZwcVdsZFplVTlFY0hwa1NFcHdZbTFqTmxKSVNXZFVWMnhxWVVkR2JHSkRRazFoVnpCcFpsWXdjMGx1UmpGWlYzaHdXbTFzYWxsWVVuQmlNalJwVDJ4ME4wbHRUblphUjFWcFQyNXphVmt5T1d0aFZ6VnVTV3B3WW1WNVNucGxXRTR3V2xjd2FVOXBTVEJPVkZVeFRXcG9iVmw1TURWT1IwVTFURlJTYTA5SFJYUlpWRVY0VGxNeGExbFVXWHBQVkU1cVRrUnJNMXBxVlRaak0xSjVZVmMxYms5dGFEQmtTRUUyVEhrNU1GcFlTblJoVnpWMllrYzVibVZUTlc5aVJHTjFZak5LYmt3d1RuWmFSMVpVWlZoT01GcFhNSFprYWtsMFRVUkpkMDE1U1hOSmJVNTJXa2RWYVU5cFNtMU9hbFpzV1RKYWJWcFRNREZOUkZKclRGUlNiRTVYVVhSWmFrNXJUbE13TVZsNlRYZE5la1V4V2xSamVVNUhVVFpqTTFKNVlWYzFiazlyTVVSVmFVbHpTVzFTY0dNelFuTlpXR3RwVDJsS2JVOUhUbTFQVkVWNFRta3dNMDU2V21sTVZGRTFUV3BqZEU5SFJYZFpVekF3VGxkV2FVMXFSbWxhUkVKcVRrZEpObU16VW5saFZ6VnVUMnhDZVZsWFRqQmhXRkp3WWpJMWJHTnBRazVhVjFKd1dUSkdlVnBUUW5Wa1Z6RnBXbGhKYVdaV01UbE1RMHB3V2tkV2RXUkhiRzFoVjFaNVNXcHdZbVY1U25CYVEwazJTVzFhYTFwdFZYaFpNa1pzVEZSck1WbFhUWFJPUjFab1drTXhhRTU2VFRCTVZGWnBXbXByTVZsNmJHaE5ha0pxV2tSd2VtUklTbkJpYldNMlZGVk9VMGxwZDJsa2JVWnpaRmRWYVU5cFNUQk5la1V4V2xSV2JWcERNRFJhYWtWNlRGUlJkMXBVWTNSWlYwVjNUVU14YTA1SFVURmFWMFp0V1dwTmQwNXRUVFpqTTFKNVlWYzFiazlxUlhsTmVsRXhUbWxLT1ZoVGQybGhXRTU2WkZkV2VVbHFjRGRKYmxJMVkwZFZhVTlwU21wTmFtZDZUbnBCZDA1VE1XbE5SRlUwVEZSU2FscHFZM1JQVkZFd1RWTXhiVTB5U20xYWFsRXdUbnBuTWxscVdUWmpNMUo1WVZjMWJrOXJPWGxhTWtaMVlWaHdhR1JIYkhaaWFVbHpTVzVLYkZwdFZubGFWelZxV2xOSk5rbHFVVFZhYWxGNVdXcFdiRXhVVG1wTlIwVjBUa1JKTkU1NU1EVk5WMFV3VEZkYWFrNUVSWGhaVjBVd1dUSlZlazVFY0hwa1NFcHdZbTFqTm1SWVNuVlBibFl4WVZkUk5sbHRUVE5OUkZreFdsZFZkRTVFU21oWlV6QXdUbnBPYUV4WFJUSk5WRkYwV1ZkYWEwOUhSVE5aYWsxM1dXcEdiRWx1TVRsWVdERTVURWh6YVZwdVZuTmlSbFo1WWtOSk5rbHRSVEJPVjFFelRXMVNha3hVVlRKT2VsVjBUa2RPYVZwcE1EVk9SR2N5VEZSS2JVMUVTVEJOYlZFMFRrZFdhRTFxY0hwa1NFcHdZbTFqTm1SWVNuVlBibFl4WVZkUk5sbHRUVE5OUkZreFdsZFZkRTVFU21oWlV6QXdUbnBPYUV4WFJUSk5WRkYwV1ZkYWEwOUhSVE5aYWsxM1dXcEdiRWxwZDJsamJWWjZZak5XZVZreVZXbFBibk5wWTIxV2VtSXpWbmxaTWxaVlpWaENiRWxxYjJsYVZFSnJUbTFKTUZwdFJYUmFWMDVxV1drd01FNUhSVEpNVjBadFdsUkZkRnBVVG1sT1JFcG9UMVJzYlUxNlNURlBiazR3WTIxc2RWcDZjRkJqYldSb1ltMXNObGxZVW5CaU1qUnBURU5LZFZsWE1XeEphbTlwV1cxS2JVMUVWVEJhVjFWMFQxUkJNRTlETURCUFJHdDZURmRKTkU5WFRYUlBSMGt6VG5wck1VNTZZM2ROZWtFMFQyNU9NR050YkhWYWVuQk9ZVmMxY0dNelVubGxVMEoyV21sQ1NWcFhSbk5rUjJkblMwVXhVRk5EYTJsTVEwb3daVmhDYkVscWNHSmxlVXBxWWpKU2NHSnRZMmxQYkhRM1NXNU9OV016VW14aVUwazJTV3BGZDAxcVJUQmFha2t3VEZSUmVVMUVaM1JPUjFFd1RXa3hhVTE2Ykd4TVZGRXdUbGRXYkUxVVVtbFpNa3ByVDBSd2VtUklTbkJpYldNMllVaFNNR05FYjNaTU0xSnNZMjB4Y0dKdE9YTmlNbVExVEcxb2MwNTVOWFpqYldOMlVUSTVhMXBXVGpWak0xSnNZbE01ZG1OdFpHaGliV3cyV1ZoU2NHSXlOSFJrU0d4M1dsTkpjMGx0VG5aYVIxVnBUMmxLYkU5RVdtbGFWMUV3VDBNd2VVNUVXWGRNVkZKdFRYcE5kRmxYVW1oUFF6RnNXbTFOZDFscVNUSk5WRlpwV1ZSUk5tTXpVbmxoVnpWdVQyMWtkbVJ1VVdsTVEwcHJZVmhPZDJKSFJqVkphbTlwVG1wck1GcFhTbTFhVkZsMFQwUlNhazU1TURCT1ZHYzFURmRGTkUxSFJYUlBWMUYzV1ZkUk5FMUVRVEZQUkVFMVQyNU9NR050YkhWYWVuQklZak5hYkdOdE5YUmFWelV3U1c0eFpHWldNSE5KYlU1MlltNVNhRmt6VVdsUGJIUTNTVzVTYkdKSFZtcGlNakJwVDJ4ME4wbHVUalZqTTFKc1lsTkpOa2xxWjNoTmFrSnJUakpaTVV4VWJHdE9hbWQwVGtSQ2FVNURNV2xaZWtGNFRGUkZNRnBFUW10WlYwcHRUMWRXYWsxcWNIcGtTRXB3WW0xak5tUllTbk5KYVhkcFpHMUdjMlJYVldsUGFVbDRUVlJaTWxsdFNYZE9hVEF3VG1wRmVVeFVVVFJaYW1OMFdWZFJkMDVETVdsWmVsVXpXbXBKZDA1NlNtdFBWRlUyWXpOU2VXRlhOVzVQYldnd1pFaENlazlwT0haa00yUXpURzB4ZG1GRE5XNWlNMWwxWXpKamFXWlRlRGRKYms0MVl6TlNiR0pUU1RaSmFscHRXbXBOZDA5VVJtMU1WR3N3VFhwRmRFNUhSWHBhYVRGb1dXcGthMHhVVlhwWmVsVjVUbTFSZUU1RWEzbE5hbkI2WkVoS2NHSnRZelpqUjJoMlltMVZhVXhEU2pKWlYzZ3hXbE5KTmtsdFJYaFBWRWt3VDFkVmVVeFVhekJOZWsxMFRrUkZOVTVUTURST1IwWnBURmRTYUZscVRYbFBSMVV5V21wak1scEVjSHBrU0Vwd1ltMWpOa3Q2V1RGT2FrMTVUbFJyZVUxcVFXbG1WakJ6U1cxR2ExcElTbXhqTTAxcFQyNXphV1JJYkhkYVUwazJTVzFLYTAxcVRUQk9WR3MwVEZSbmVWcFVaM1JPUkVKb1RsTXdORmxxUW14TVZGcHNUa1JqTVU5VVRtaFplbWN6V21wd2VtUklTbkJpYldNMlkwZG9OV015YkdwWlYzZHBURU5LTVdNeVZXbFBhVWt4VFZSUk5FNUVUWGxQUXpGc1drUmpNVXhVVVRST1ZFMTBUMFJHYUU1cE1EUk5iVVY2V21wU2EwMVVXbXhQUkVVMll6TlNlV0ZYTlc1UGJtUjJZMjF6YVV4RFNqQmFXR2d3U1dwdmFVMVVUVFJQVjAxNldWUkZkRnBxWXpWWlV6QXdXV3BzYkV4WFNURlpla2wwVGtSck1rMVhUbXhPYWxwcFdYcFZNRTl1VGpCamJXeDFXbnB3VG1GWE5YQmpNMUo1WlZOQ2RscHBRa2xhVjBaelpFZG5jMGxFUlRKSlJVNTJZa2Q0YkZveVZXZFZiVGxvV2tOM1oxRXlPWE5pUjFadVdsTkNkbHBwUWs1YVYxSndXVEpzZFZwVFFrTmtWMnh6V2tkc2RWcDVkMmRWTW14MVdqSkdkMkl6U214SlJFVXlUMVJuTVU1RFNqbG1WakU1WmxONE4wbHRXakZpUjNoV1kyMTNhVTlwU1RSYVZHTTFXbTFOTUU1NU1XcE9hbFYzVEZSUk5GcHRWWFJQVkZKdFdrTXdNRTVxUm14T1ZGWnFXVEpWTlUxcVVUWmpNMUo1WVZjMWJrOXVWbmxpYW5BeFpGZHNhMDl0V21oTmFrMTVUMGRHYlV4VVVUUlBSRWwwVGtkV2FGbFRNRFJaZWtrMFRGUlpNbHBIUm1sT1JGazFUbFJDYlUxVFNYTkpia3BzWXpJNU1XTnRUbXhKYW5BM1NXNUtiR015T1RGamJVNXNWa2hzZDFwVFNUWkphazE2V1dwS2FVNUVVVE5NVkVGNldUSlJkRTVFU21wT1V6RnBUMFJPYUV4WFVtaE9SRlV6VGtSUmVGbHRXWHBOYW5CNlpFaEtjR0p0WXpaVU0wcHVXVmMxY0dWdFJqQmhWemwxU1dsM2FXSnRSblJhVTBrMlNXcFNhRmw2UlRCUFIxVjNURlJTYUU1dFRYUk9SRkV5V1ZNd05FNXFVbXRNVkU1c1dXMWFiRTlVV21oTmFteHBXbXB3ZW1SSVNuQmliV00yVkZkR2FsVnRiREJaTW1od1dsTkNUbHBYVW5CWk1rWnpTVVZPYzJGWE5YQlplVWx6U1c1U05XTkhWV2xQYkhRM1NXMU9kbHBIYkhWYWVVazJWek56YVdNemJIcGtSMVowU1dwdmFWcFVXWGxOYW1ocVRYcFZkRmxxWkdwT1V6QXdXVEpWZUV4WFNtdGFWR04wVFdwYWJGbDZTVFZOUkd4cVRVZEdhRTl1VGpCamJXeDFXbnB3YjJSSVVuZFBhVGgyWkVkV2VXSlhiSFZpTW5oMldqTnJkV0ZIZHpOTWJUbDVXbms1UkdJeVVteFZNMng2WkVkV2RFd3lPWGxhTWtaMVlWaHdhR1JIYkhaaWFURXdaVmhDYkVscGQybFpNamxyV2xOSk5rbHFaekJQVkVFMFRVUkJlVXhYVlhwTlZHTjBUa1JSTWxsNU1XbE5SRVUwVEZSU2FVMXFRbTFaZW14b1dsZE5kMXBxY0hwa1NFcHdZbTFqTm1OSVNuWmthVWx6U1cxU2NHTXpRbk5aV0d0cFQybEpNVmx0VG1oWlYwbDNUbE13ZDFwVVFtMU1WRkY0V20xVmRFOVVVVE5OZVRBMFRqSldiVTFVVlRKUFZHZDNXVmRKTm1NelVubGhWelZ1VDJ0b2JGbFhlREJoUjA1b1kyMVZaMVZJU25aa2JXeHJXbGhKYVdaV01ITkpibEpzWlVoUmFVOXBTbXBOUjBrMFdsUk5NMXBwTUhwUFJGbDZURlJSTUU1dFNYUlphbXhyVGtNeGJFNXFiR3RaYlUweFdYcEthVmxxV1Raak0xSjVZVmMxYms5cmVIQlpNbFoxWXpKV2EwbEZhR3haVjNnd1lVZE9hR050VldkVlNFcDJaRzFzYTFwWVNXbG1WakJ6U1cxT2RtSnVVbWhaTTFGcFQyeDBOMGx1VW14aVIxWnFZakl3YVU5c2REZEpiazQxWXpOU2JHSlRTVFpKYlZsNVRVZEpNRTlIVW1wTVYwbDVXVzFSZEU1SFZtMVphVEEwVFRKWk5FeFVWWGhhVjAwMFRrUkplRTFYUlhoTlZIQjZaRWhLY0dKdFl6WmtXRXB6U1dsM2FXUnRSbk5rVjFWcFQybEpNMDU2UVhsT2FsWnRUVk13TkU1dFZtdE1WRkpyVG1wWmRFOUVWWGhhUXpGcFQwUkZNMDVxVFRKTlZFMHpUbnBOTm1NelVubGhWelZ1VDIxb01HUklRbnBQYVRoMlpETmtNMHh0TVdoWk0wcHdaRWRPYjJGWFZtcGlSMngxWVZkTmRWa3lPWFJNYms1dVNXNHdjMlY1U25wbFdFNHdXbGN3YVU5cFNtcE5la3ByV1hwRk5FMVRNRFJPZW14clRGUlJORTR5V1hSWlZFNXRUVU13TTA5VVRYZE9SR1JyV1hwbmVVOUhVVFpqTTFKNVlWYzFiazl1UW05aU1qVnNTV2wzYVdSdFJuTmtWMVZwVDJsS2JGcEVUbTFOUjAweVRsTXdNRnBYVW1wTVZGSnJUbXByZEZscVVteE5hVEF5V20xUk1rOVVTWGhhUjFVelQxUk5ObU16VW5saFZ6VnVUMmx6TWs1VVdYaE5hazB3VGxSWk0wbHVNV1JNUTBwb1drZFNlVnBZVG5wSmFuQTNTVzVTTldOSFZXbFBhVWt3VFRKWmVscHRVWGRhUXpBeVRrUkpNRXhVVVRKT1ZHZDBUMGRXYTFwRE1XMVpla3BzVFRKR2JFNUVVbTFaYlZVMll6TlNlV0ZYTlc1UGJrSnZaVmhPY0ZreVJuTkphWGRwWkZoT2JFbHFiMmxOZWxWM1QwUmpNMXBxUlhSYVYxRjNUV2t3TUZwcVFYZE1WR3N6VFhwTmRGcHRSVEpOVjBwcVdrUlplazB5VFRWUGJrNHdZMjFzZFZwNmNETmlNMHB5U1dsM2FXUkhWalJrUTBrMlNXMU5ORTVxVW10YVZHeHRURlJCZWxreVdYUk9SR2MwV1dreGFVMVVVVEpNVjFVeFRqSldiRTFxYUdwT01rMTVXbFJ3ZW1SSVNuQmliV00yVkZkR2FsVnRiREJaTW1od1dsTkNTV0l6VG5kaFdGSm9Za04zWjFaSGFIWmlXRTUyWW1sQ1UySXlSbXRNUTBKVVlWYzFibGxZUW5aamJWVm5UVlJKZWsxRVFYZEpiakU1V0ZneE9VeEljMmxhYmxaellrWldlV0pEU1RaSmFtaHBXbGRGTWs5RVNUTk1WRVpyVGxSQmRFNUViR3hPVXpGb1QwUnJlRXhVVlRCWmJWbDVUV3BrYTA5WFZtbE9SSEI2WkVoS2NHSnRZelprV0VwMVQyNVdNV0ZYVVRaUFJFMDFXVlJrYWs1VVVYUk9iVWt3VFVNd01FMVhUbWxNVjBsNFRVZFJkRTlVU1RWT1YxRXpXbFJqTVZwcVl6TkphWGRwWTIxV2VtSXpWbmxaTWxWcFQyNXphV050Vm5waU0xWjVXVEpXVldWWVFteEphbTlwVG1wak5FOVhWbXBhVkdOMFdtcE5ORnBETURCT1JGazBURmRKTlZsdFdYUlBSRlY2VFdwUk5VMVVhekpPUkVwclQyNU9NR050YkhWYWVuQlFZMjFrYUdKdGJEWlpXRkp3WWpJMGFVeERTblZaVnpGc1NXcHZhVmxYVFhsWlZGVTBUMVJKZEU1WFdUQlBRekF3VFZST2FFeFVaM2hPYWtsMFRrUnJNMWxYU1hkTlYxRjNXbFJKZWs5dVRqQmpiV3gxV25wd1RsbFhUbE5oV0ZKcVlVZHNiRWxGZUdoWmJUbDVXVmhTZG1OdWEybE1RMG93WlZoQ2JFbHFjR0psZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1dwR2FFMUhSVEZaYlU1b1RGUlJlbHBxUlhST1IwMTVUWGt4YVU1SFNYZE1WMDV0VG1wS2FFOUhTVE5PVjBVMFRrUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMUpzWTIweGNHSnRPWE5pTW1RMVRHMW9jMDU1TlhaamJXTjJVVEk1YTFwV1RqVmpNMUpzWWxNNWRtTnRaR2hpYld3MldWaFNjR0l5TkhSa1NHeDNXbE5KYzBsdFRuWmFSMVZwVDJsSmVFOVhVVE5aZWxKb1Rua3hiRTlYV1hoTVZGRTFXbTFaZEZsVVRtcFplVEF3V2tST2FrNVhWVFJaVjFKb1RXcEJObU16VW5saFZ6VnVUMjVDZVdJeldXbE1RMHByWVZoT2QySkhSalZKYW05cFRYcEtiVTFxWnpWT2FrMTBUbnBrYUU1NU1EQk9WMWw2VEZkRk5GcFVXWFJPTWxwc1RtcEJlazFFUlhwWmJVVXpUMjVPTUdOdGJIVmFlbkJKV2xkR2MyUkhhR3BaV0Vwc1NVWkNlV0l6V25CYVIxWjVTVzR4WkV4RFNqQmFXR2d3U1dwdmFWcHRVWGhOZWtwb1RXcFpkRTVVUlRGTlF6QXdUVlJSZUV4VVp6Vk5SRVYwV2xSWmVGcEVUVEJPZWtGNFRqSktiRTl1VGpCamJXeDFXbnB3UWxreVRubGFWMUp3WkVkV2EwbEZlR2haYlRsNVdWaFNkbU51YTJsbVZqQnpTVzFPZG1KdVVtaFpNMUZwVDJ4ME4wbHVVbXhpUjFacVlqSXdhVTlzZERkSmJrNDFZek5TYkdKVFNUWkphbXN3VG5wbk1rOVVXbXBNVjFVeldWZEpkRTVFUlRCTmVUQTBUMVJvYkV4WFdtdFpiVnBxVDFkWmVrMUVZekphVkhCNlpFaEtjR0p0WXpaa1dFcHpTV2wzYVdSdFJuTmtWMVZwVDJsSk0wNTZRVEJPVjFWNFdYa3dNVTV0VFhsTVZGSnFXbFJWZEZsWFVURlpVekF5V1cxR2FrMTZRbXhOUkZKc1RtcGpObU16VW5saFZ6VnVUMjFvTUdSSVFucFBhVGgyWkROa00weHRNV2haTTBwd1pFZE9iMkZYVm5OWlYwcDJZMjFHTUdJelNqVk1iVTUyWWxNMWVscDVTamxNU0hOcFl6TnNlbVJIVm5SSmFtOXBUVWRKZWsxcVdtbGFiVmwwV1dwTk1FOVRNREJQUjFGNlRGZEdhRTlIVFhSTk1ra3dUbGRTYlZwSFRtaE5hbXMwVDI1T01HTnRiSFZhZW5CM1lVYzVkVnBUU1hOSmJscG9Za2hXYkVscWIybGFWMXBvVG5wamVWbFVWWFJOTWxFelRWTXdNRTlVWTNsTVYwVjZUbGRaZEUxVVozaE5WMUV5V21wYWFVMVVhelJQYms0d1kyMXNkVnA2YjNKT2FsVXlUbnBaTVU1RVRYbE5VMG81V0ZOM2FWbFhVbXRqYlZaNlkzbEpObVY1U2pCbFdFSnNTV3B2YVU1VVJUUk5lbGsxVFZSVmRGcEVhR3ROVXpBd1dtcEtiVXhYU1hoTlZFRjBUVlJDYUU1dFZUSlpNbFpyV2xSU2EwOXVUakJqYld4MVducHdkMkZJYkhwaFYwNW9Za05KYzBsdVZucGFVMGsyU1dwak5GcEVZelZQUkZFMVRGUm9hazVIVVhST1JGcHJUWGt4YVU1VVdtdE1WMUY0V1ZkTmVsbHRUbWhPYlZreFdrUndlbVJJU25CaWJXTTJaREk1ZVdGNVNYTkpibEpzWlVoUmFVOXBTWGhQUkdNMFdtMVZNVnBUTUhkT1JFa3pURlJSZDA1RVVYUlpiVTB6V1hrd2VrOUVTVE5OTWxab1dtcEthazFYUlRaak0xSjVZVmMxYms5cVNXZFdSMmgyWWxoT2RtSnBRa0prYlZaMVpGZFZaMDVEZDJkVk1teDFXakpHZDJJelNteEpSRUUxVDBSbk5FOURTamxtVmpFNVpsWXhPVXhEU25OaU1tUjJTV3B2YVZsWFNUSk5WRkV6VFVSWmRFOVVSWGRaYVRBd1dWUk5lRXhVYTNkYVIxbDBXbXBqZDA1WFVUVlBSMHBwVG5wbmVVOXVUakJqYld4MVducHdhMWxZVW1oUGJXeDBXVmRrYkV3elFuVmFlblJwV1ZoT2JFNXFVWE5oVmxwRFZERktNMDFGZEVoYU1qbENVVlZHUWxSc1RsWmhSVlpXV2pCR1FsRlhXbEpSVlVaQ1VrVnNSRkZWTVVKUlZVWkNZMGhuY2xWSFJrSlJWVVpDVkZSR1ExUldXa1pXVlVaQ1VWVlNUbVZyTVRaVVdIQk9aV3N4TmxSWWNFNWxhekUyVkZod1RtVnJNVFpVV0hCT1pXc3hObFJZY0U1bGF6RTJWRmh3VG1Wck1UWlVXSEJPWldzeE5sUlljRTVsYXpFMlZGaHdUbVZyTVRaVVdIQk9aV3N4TmxwVlRuUmhWVVpDVVZWR1FsSlZhRk5WTVZKelZGVkdVbFJEZEVKT00yaENXakkwZVZKR1FYcGxhMG96WTJwR1JGVkZWbk5MTUd0MlZWVkdRbEZ1Wkd0VGJFcEdVbXhXYkZSdVNucGliVkY0VFdwS05XSXhSbE5rYlhSSlUxWk9TVlJwZERaTU0xSTFWbGR6TldJeFVrWlJNVVY0V1d4U1ExbDZTWHBaYm14UFkzcENRMDVWWkVwU1JVWlRVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlhjM0pUVjNOeVUxZFNORTVIWXpGVWFsSkRUMVZrVWt3elNsRlJWR3hMVERCc1VWcHNUbTVrTUhkMlZGVldSbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVkl6VlVSV1lWVkhPVkZPV0VrelVtdHdURkZYV1ROWk0xWnRVVzFzYjFWRk5WUmhNV2N4WVVkNFFrOVlWWEpTU0U1UlRqSlNXVXd3Y0V4TlZrRjVWbXhDY0ZVd2JIWmFWMHBHWTJ0NE0xWnRaekZYYm1keVQwVk5lRmRVU1hsWFdGSlJUVVZhZDFwcVdtOWFSMVpvU3pJeGVFMVdaSE5oV0dodFdsZHZNbFZ0VGtWbFIyOTNUMWhPTTFkSFNtbGFWVXBTWTBkc2NXUlhZM2xOUjBaeFRERk9SazlIU2pKaWVsWnZVbGhXYUdSclJqRlZNSFIzVlZkYVMyVkdVa2hQVkVadVZsaEtSRlpxV25GVk1VWkdUVWM1VVdFeVZUQmtNMVp5V2xSamQwNVZWbmhqUlhoUFZqTm9NRlJZVWxSaGVsSnhaR3hvU0dKSFVYSmtSWGh6WlVoYVYxUlZOWFZaVjNSRlRqSXhSbUp0VWxwV1JscFlWVEkxVjA5RVdYZFdNVlpaWWtSTk1GVnJNVFZPTUVwc1lsaENOVkl6Y0U5T00wSkNXVzB4V1ZKVlJUSlpiVm95VTNwQ01VMTZTakZXUlZwTVV6RmFUazFJU1hkWFdHTjRWRlpTYWxKdVduZFBSMnhYVkVaQ1JVMURjelZhTUdoU1pWTnpNMk5zVG0xTk1sWnNZVzVCZVZOSVZrZFpNMDUwWWtkU2NGSlliM2RTYm5CTVYwZGFWRlZ1WTNwalYxVjNUMFpvZUZwRWJHdFZSRnBTVXpBNVQySnRkREZPUjNoSVRUQTFWRmxwT1ZOUmJsSk1aRVYwTUUxWVVqQmFSVXBMWVZac2FVMXNXa3BPTWtwNVdYcGtNRmw2YUVwWFZ6a3dVMjV3U1ZaVlNYZFplWFJRU3pGUmVtTnNVbEprVlhoTVl6RndVMk5ZUWpaaE1WSlVUakpTWVZOVVVqSmllWFI0VTIwMWExSlZaRkJQUlZZMldsZE9OV0Z0Um1wT2FUbEtWa1UwZVZNd09WaFpWbFpOVTFaUmRsbFZlR3RhVmxaMVkxaENhMkZVWkZkV2VrbHlVek5zYWsxcWJFZFVSRTU2VGpKVmVtRkhhekZVUmxKVVlVZFdXRll6UWpWV01uaEpUa1pvTm1KWVdsaGhiVFZ3VkRKc1IxUnFUbHBXTUZKd1pHeGtTazlVU2xoa1YzTXhXVE5SZVZGNlFuZE5NSEEyWWtSc1dsUnFXVEpXTUdzeFUxWlpkbFp1YkVkUFJGcDVUVmRGZUU0elFrbE9WbFpPVVhwQ2QxZERPVVZrTVdoWFZsUlZlVTVGZEhwT1ZteHVVa1p3ZEZSRVVqWlNNMjk0WkhwbmQyTkVUWHBWUjI5NFkwVXhNbGt5YTNKa1IwMTVXVEJhU21GdE1XOVRSRXByVmpGYWJXUlhSbGRVU0ZaTllXNXJOVnBXVWpaYU0wWlFZMjVHYkdReldYZGtibFowVEhwR1RGVnFVWEpOYlVVeVVrZG5NV05HYUZCT01WazFWSGwwZWs1RmRGTlRiRUpDVWtoV05GUnRjREJoYTFwRVVUSnpkbEV5ZURCU1dIQnVXbTV3VkdSSFZubFZNMXByVjJ4R1lWcFZVblpsV0d4NFpVWkdibVJXU1hoaVJtaDBVVzE0U2t4NmJGRlZNbFpwVjI1Q2FWUXlWVFJaYld3eVpFUkthVkpyY3pWWFYwWk1Ua2RXU1ZwVVpFOVVSVFZvWkVWNFVVMHpSa2hYVlhodFZFUmplRlZ0T1U1a2Ewa3lWMGhWTlU1cmIzcFdSbVF3VDFWNFZXSXhSazVPV0hCMFQwWnNiV1ZIU2tsVFZWWlVWVVp3V1ZkR1kzWmtSemt5VmtaT2Rrc3hRbmhTYm1oUFdsaE9NMWR1Um5GVWVUbFpUVVJzVUdSclNtNWhWR3hRV1RCb00wNHllSE5XV0ZaeVdUTlpjbHBIYTNkamJUVnNZMWRaTlU5WVZsbGlNSFJ1WWtVeFRtUXlSbk5pUkdRMFRESXhOVTFITVhOVlJGWjNZVlphZFdScVRtMWtWbTl5VFZScmVtVkhOWGRXUm14TlpXcE9WR0Z0Vm5GVlJYaFpZMFU0TWxaSVVsbFpibkJaWTBkYVNsWlhUbXhUYTJoMFZVaE9XVkZWY0hwWmEydHlXVlYzTTFwdVducGpTRUpYWXpBNVdVNHpWbWhhUlc4MVVtNWFNVlpFV1hwVlNHaDZWMnRHVWsweFZrNWxTR3h1VkVoc1dHUnVUbkpPYVRselpGZDBNVTVFUW0xWmFtZ3daRWM1YzFKRldrZFpha1poVlZaRk1rd3lNVk5oTTFsNFlWWmpOV0ZVUmt0T2EwMTJUVmRHYkdGclJtcGtiRVpSVm0weFZtUkVXa2RSYWtwcVltcEpNbE51Y0VWVWVsSlZZekpHVFZreFpHeFpWbEpwWW5wa1NtSnFRVEJYUkVFMFRtcHJNbGRJYUZWaWJrcHlZbGh3U0ZFd2FIQmlWekZMWTBWNE1WUnRSbEZoVkdONFdtbDBURlF5ZERCYVZGWktVM3BzVUdOc1RUTk9SMngxV2pGQ1ZGcHJjR3ROVnpsS1ZUQlJOVmRxUW5STU1taFJZVVZKZDJKNWMzWlVSMUY2VkZVeFNGWllTbFJXVkZrMFkzcHNOVlpZY0ZsVk1EaDZZek5XYjFaNWRFTmhRM1JMWVdwQ2RtVlliM2xqTWpWaFkxZGtkMWt6Y0d0T1Yyd3pZMGhhVTJSdE1VeGFiR2gzVjFNNVVVMUliR3hWTWxwNldqQm9VR0ZIZUhCa00xSk5WWHBrYWxGc1RuQlZha1pvVjJ0YVVVMTZRbmhMTUVvd1RUSmFXVmxyY3pWaFJrVjVWa2hKY2s1SVNsUlplWE0wV2tkYWMxZEZUbEJOYlhjeVkwWnJjbFZGYkhwT1dFSkhUVmhvZWs1SGRIUlpiR2hYVVdwYU5rMUZjRmhWYkVwclUwTnpNbEZxUWpOUFJscHNZak5zYTFwV1pITldhbWN3WlVkR1ZsUkhOVEpYUkVFMFpHdFdObFJ0TkhKVFJYQlFaRk4wTUZwc1VYaFpNVTVwVXpGQ1RWcFlaREpXTW5ScVRESk5lRXd4YkRCamVsSlVZa1Z2Y2xKRmFIZGtWelY2VW1wTmQwNXFiRmxWTTBvelRqRmFiMVZYVm5OT1IyUkpWR3BPVW1SVmFGQlBSM0JHWVhrNVVFOUhUa1JMTVZaMlRETkNXVlZwZERKU2VrSk5WVEkwZGxkc2FEUmlSbWcxVTFjNWFrNXFRbEZWTW1oc1lrZFNNMlJ0VWpaWmFsSkpWbnBPU2s1NlJuZFVlVGgzWkRCb1dtTlZPVXBqUkdneVRrUkdTMVpFVlhsV1JUVnhXbXBXY1dWRVNUQmFiVEZHVDFSYVdGUklTa2hPZVRscFl6STVUazV0Vm05Uk1HUjNVMnBvZWsxRE9XRldhazV5VDBoR2RWWkZPV3RYUkVaRFRtcGFTVlF5WkdsT1Iwa3hVekZLYldSSGR6Rk9SMXBFVGpJNU1tVllXbUZYYmtKWlpFUmFTMlZVVW5aTk1YQjRXbGRTVUdSck1WVmFTRTV6VlVaV2IxSkVRbmxpUm1RMFpHeGFUbEp1VWxSTlJrRjRWbFU1ZFZWSVdsaGhlbWN3VjBkU2FVMUZVa3BYUm1OMllUQm9jRlJXVGsxYVZ6QXpZMnN4VGxNd1VuUmtSR3hMVFVWb2RGb3pVa3hNZWs1RFducGtTR0ZIWkZCU01IaEVXakZDVlU5SFJtMWpSRVozV2taU1JtVkVVVFJQUkZwMVdqTlNURkpxU21wUFZUbDNZekprVjFKSFNsQlRNRTVMVkRGR2FHRXlhM0pOVmxwNVVtMXJjbVF6U25CVGJrSnRWRzFGZG1JelNsUmhSMDU1Vm5wSk5FNXRjRTFYV0U0MVpWZGFZVlJIZHpSVk1GWXdZbXN3TWs1WGIzaFZNSGhKU3pOa1dWWnJZekpoYlUxM1VrWnNTazlVWnpKU2JsWnhVekJ3ZFZWVmVGZE5SMDE0VkZoS00wNHpUbEJPVnpSMldtNWtNMUpIV25KaU1tODFXakphUlU1SE9UWmhTR3hIVVZaV1YxUllSa05WYlhoYVkydE9hMDFIT1ZaaWJFcDVZVEpzTlZKWWNGQlZSVnBQVkVWYU5sWkljRlZPVmxwelVXeG9hMDB3T1hSUFJ6azJZVEJLTUZRd09XdFNSa0poWVRGVk5XRjZhM1pWUlU1M1ZFZDBTVmxZU25WWGJGWnRVMWRvV1ZReldYZE1lbHBLVlROWmQxVXdPV3BrYlc5MlRWZEpOV1JJY0cxaE1EUXhVbnBPTkU0eVZtbGFSV3h2VFhwU1dGcHJXVEprU0VKRlkyNUtXbE42V2xGV1dFSnJUSHBTYlZOc1RYcFpia0paV1ZoS01GUXdjRTlMTVU1VFVrVktXVlF6V1hkaVJGcDBUbXRXTmxkcVJqWk5lbFp6Wkhwc2NrMHhTbEJOUkVaWVZGVmFRMVpVVWtsT1EzTjVUVmQ0VGxsdFNUUlhTRTEzWkcxNE1sZFdXa2xqUkU1UlZsaEdURkV5VG1oVU1GSldZekkxYVZScmVGUlZhbFpxVmtWTmNscEdiM0pqU0VKWFdsZDRSR0pyZEdoTlZFVXpXbFUxVlZSc1JuSlZNVnBIWVZaVmVXUkdRWEpWV0VwVVZERmFNbGRzY0doV1ZYaDRaRE5hTUZWRlRtOU1NbkJyVkZkSmVsVnJORFZQVmtaUVlUSTVjV1JxYUUxak1VWlVUVWR6ZGxSNlkzSmtSWFJ0U3pBMVRsWkVhekpVYkVGM1ZsaGFUV1J0YkhWVmJUQTFVMjAwZVU1SVpGZGpiVXBGVVRKS1NGTlhVa2RPU0doWFVXczFTMHd6YUV0Vk1sVXlWbGRXZGt3d1NuRk1lbXhLVEhwa1JXVlVRbEZrYmtwMVUyNXJNV0l6UWxSVFZrcFRWMnhuZDFsV1JsWlJWVVpSWld4bmVtRkVUbFpSVlVaRVVWWkdRbVZFWkZwUlZWRjJXVmMxUjFGclRrOWFSMFowVTFWR1ExRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1JWRlhNWFJpTWxaTVQxVm9ObUZWU1RGVFZHeEdVV3hvZFdWRWFFSlJWVVpDVVZWR1FsRlZSa0pVUlVwMFVWVnNZVk15TVRaV01HeDFaVWhzVUZGVlJrSlJWVVpHWWtWYVZXRXhUakZWVnpGRVVYbEpjMGx0Ykhwak0xWnNZMjVOYVU5c2REZEpiV3hyU1dwdmFVMXFRbTFPVkd0NFRsUm5kRTlIU1ROWlV6QXdUa2RXYTB4VVp6VlpiVVYwVDFkRk1rOVVUVEJPUjFWM1RVUlZNazl1VGpCamJXeDFXbnB3YTJGWFVUWmFXRkp2WTJwdmQyVkZWWHBQVkZFelQxUnJlVTlGVG1wT1JWWnRVbXRWTVUxRVl6Tk9SRkUwVDBSak5FMUZTVFZhYWxsNFRtMUthMDVGU1RSTmVrRnBURU5LZVZwWVduWlpNa1l3WVZjNWRVbHFjRGRKYmxJMVkwZFZhVTlwU214TmVrVjVXbXBKTWsxVE1XdFBWMGw1VEZSUk0wMTZSWFJQVjBrMVdWTXdlazlVUVRCTmFtaHJUa1JHYUUxVVdUWmpNMUo1WVZjMWJrOXJOVkJVYTFWcFpsTjNhV0p0Um5SYVUwazJTVzFOTVU1VVp6SmFSR041VEZkWk1WbHRVWFJPUjAxNVRWTXdORTR5UlRSTVZFazFUVlJWZWsxWFNURk5WMWw0V2tSd2VtUklTbkJpYldNMlZUQkdUbFZGZUVaSlJVNU5VMVUxU2xGNVNYTkpiV3hyV2xjMU1HRllValZWU0VwMllqSlphVTl1YzJsa1NHeDNXbE5KTmtscVp6RlpWRVpyVGtSV2JVeFVVVEZQUkUxMFRrUk5NMDU1TURWUFZGWnRURmRhYTA5WFVYcGFhbXQ0V1ZSV2JWbDZjSHBrU0Vwd1ltMWpObEpGTlZSTVZWSktVa05KYzBsdGVIWlpNa1l3WVZjNWRVbHFiMmxhVkZacVRrZEdhbHBYVlhSYWFsVjZXV2t3TUZscVVtbE1WMGt5V1RKSmRFNXFSWGhhVkVGM1dUSkpOVTFFU210UGJrNHdZMjFzZFZwNmNHdGlNalYyWkVoYWJHTnRiRzFsVXpVd1dsaE9NR0ZYTlc1TWJscHNZMjFzYldWVE5XNWlNMWwxWXpKamFVeERTbkphV0d0cFQybEthRnB0Vm0xYWJWSnNUa013TUUxcWJHMU1WRkpxVGpKTmRGbHFTbXhOZVRBeVRXcENhMWxVVG14YVZHc3dUa2RGTm1NelVubGhWelZ1VDIxU2NGcEVjR3hrUjJoNVQycENORkpVVFRWT1JHTTFUMVJKTkZFeVRUQlNWMXBIVWxSVmQwNTZZekJPUkdjMFRucG5kMUZxYkcxT2FrVXlXVzFSTUZGcVozcE5RMDVxWWpJMU1HTnRPWE5pUjFaNVNXNHhPVmhUZDJsS1NGSnNZbGhDYzFsWVVteEphbkEzU1cwMWFHSlhWV2xQYVVwcFdWUlJNMDFxWTNkTmVUQTBXbTFWTUV4VVVYbE5SR3QwVDFkUk5GcHBNSGhhVkVKb1RsUk9hMWxxU214YWFsRTJZek5TZVdGWE5XNVBhMmhHVVZWNFZWTkdPVVJTVmtwVlNXbDNhV1JJYkhkYVUwazJTV3BuZUU5RVdUTmFWRWt3VEZSUk0wOUVRWFJPUkZVeVRYa3hhVTFVWnpKTVZFbDRUbnByZUU5WFdUUlplbXQ0VDFSd2VtUklTbkJpYldNMlVsVXhRMUpWVWtWU1ZWSm1WV3RXVDFKRlZsTlNWa2xwVEVOS01XTnRkMmxQYVVsNVQwZEdiVTFIUlhwTmFURnNUMFJKTkV4VVVtdE9lbEYwVDBSamVVMXBNREZPUjAxNFQxUmtiVTV0UlhkT2FsRTJZek5TZVdGWE5XNVBiV2d3WkVoQ2VrOXBPSFpoUjFab1lraFNiMWt5Vm5sa1F6VjVXbGMxYTFwWVNteGphVFYwWWpKbmRWb3lPVEpNYms1dVRIbEtPV1pUZDJsak1teHVZbTFHTUdSWVNteEphbkEzU1c1U05XTkhWV2xQYVVwVVUwVkZlbFJYVm5saE1uaHNWVWhLZG1JeVdXbE1RMG93V1ZoS2JscFlVa2xaV0U1dlNXcHZhVmxYU1hkWk1sazBXWHBuZWsxWFdUQmFiVXBwVGxSVmVWbHRVbWxPYlUwMVdXcEtiRmx0VW1sTlYxWm9UWHBOTUZwdFJtMU9WMUpwVG0xWmQxbFhVWGxOYWxwb1dsUm5NVTFIVFRST2FrRjZXa2RGZVZsVFNYTkpia0o1WWpJNWJVbHFjR0pZVTNkcFlsZFdlV0V5ZUd4VmJUbDJaRU5KTmtsdFJtbE5SMDV0VDBkTk5FMTZSbTFPUjFwcFdXcFZNVTF0U210WmFscHFUMWRKZVZwWFNtdFpha1pzV1ZSTmVrNUhXbWhhYWxacldXcGFiVTFIUm10TmFra3lXVmRWTkU1VVFtcFBSRmwzVFRKU2FFMXRSV2xtVTNkcFkwaEtkbUl5V1dsUGJIUTNTVzVTTldOSFZXbFBhVXBRWTBkV2RWRllVakJhV0U0d1dWaFNjR0l5TlZSaFYyUjFXVmhTTVdOdFZYbE5SRVUwU1dsM2FWa3pTbXhaV0ZKc1drTkpOa2xxU1hkTmFrVjBUVVJuZEUxcVVsVk5SRkUyVFdwSk5rNVVWWFZOVkdNelYybEpjMGx1UW5saU1qbHRWVWhXZVdOSE9YcGFVMGsyU1cxR2VtTXlWbmxrUjJ4Mlltc3hiR1JIYUhaYVEwbHpTVzVhYkdOdGJHMWhWMDVvWkVkc2RtSnJNV3hrUjJoMldrTkpOa2x0VW5CYVJIQnNaRWRvZVU5cVFqUlNWRTAxVGtSak5VOVVTVFJSTWswd1VsZGFSMUpVVlhkT2VtTXdUa1JuTkU1NlozZFJhbXh0VG1wRk1sbHRVVEJSYW1kNlRVTk9hbUl5TlRCamJUbHpZa2RXZVVscGQybGpNbXh1WW0xR01HUllTbXhKYW05cFRVaG5NMWxVVFhoUFZGcHRXbXBTYkU1dFRUUmFWRmw2VG5wV2JVOVVZM2hQUkZreFdtMU9iRTlYVG0xT1ZFcHJUV3BhYlU1VVVYaE5WRUYzVFRKSmVGcFVRbXRaTWtWM1RVUkthMDU2UVRKTmVra3pUVVJOTTAweVZtcGFWRVp0VDBkV2FrOUhTVFZQVkd4cVRYcEZkMDlIVG10UFJHZDZUVVJDYTFwRWF6Qk9SRlYzVFhwamVrNXFUWGROZWtVeVdsUlZOVnBxV210YVYwa3hUVVJqZDFscWEzcE9iVlV5V1hwc2JGbHFSbXBKYmpGa1psRTlQU0o5WFgwc0luTnBaMjVoZEhWeVpTSTZleUowZVhCbElqb2lVMGhCTTAxbGNtdHNaVkJ5YjI5bUlpd2lkR0Z5WjJWMFNHRnphQ0k2SWpVeE56UXdPRGN4TURrMVpqaGpZekJqTURoalpUbG1NakprWXpnd01HVTFNRE5rWkdKalpqaGpZakl3TXpFNE5ERmtaRGMyT0RNeU9XVTFObUk1WVRFaUxDSndjbTl2WmlJNlcxMHNJbTFsY210c1pWSnZiM1FpT2lJMU1UYzBNRGczTVRBNU5XWTRZMk13WXpBNFkyVTVaakl5WkdNNE1EQmxOVEF6WkdSaVkyWTRZMkl5TURNeE9EUXhaR1EzTmpnek1qbGxOVFppT1dFeEluMHNJbkJ5YjI5bUlqcGJleUowZVhCbElqb2lUM0JsYmtGMGRHVnpkR0YwYVc5dVUybG5ibUYwZFhKbE1qQXhPQ0lzSW1OeVpXRjBaV1FpT2lJeU1ESXhMVEE0TFRJMFZEQTFPakE1T2pVNUxqTTBNVm9pTENKd2NtOXZabEIxY25CdmMyVWlPaUpoYzNObGNuUnBiMjVOWlhSb2IyUWlMQ0oyWlhKcFptbGpZWFJwYjI1TlpYUm9iMlFpT2lKa2FXUTZaWFJvY2pvd2VFVXpPVFEzT1RreU9FTmpORVZtUmtVMU1EYzNORFE0T0RjNE1FSTVaall4Tm1Ka05FSTRNekFqWTI5dWRISnZiR3hsY2lJc0luTnBaMjVoZEhWeVpTSTZJakI0T0dKak9HSXhNMlZsWmpReFlqUXhZek0wTldGa1kySmxZVEZtWW1GaU16YzNOek5rWWpWbVltWTFaREU1WkRWaU56TTFZek0wWXpKbFlqWXlNVEl5TnpZMk1HSmxNV1ZsTjJZMVptTTVZV1k0T0dZeU0yRXpaVFJtTWpjNU1UWTROMll4WXpBMk5HTTRNV1ZsTW1RNE1qRmpNelF4T0dSaE1ETmtaVFE1TVdReFlpSjlYWDA9In1dfSwic2lnbmF0dXJlIjp7InR5cGUiOiJTSEEzTWVya2xlUHJvb2YiLCJ0YXJnZXRIYXNoIjoiMzhkMDBkMGQ2ZGU1ODU1MDNiNDRiYzc5MmNjNWVjMzlhMDZmZjRhYmU3YTFhOGIzYjIzNjNjMjUyMzMwMzRmMiIsInByb29mIjpbXSwibWVya2xlUm9vdCI6IjM4ZDAwZDBkNmRlNTg1NTAzYjQ0YmM3OTJjYzVlYzM5YTA2ZmY0YWJlN2ExYThiM2IyMzYzYzI1MjMzMDM0ZjIifSwicHJvb2YiOlt7InR5cGUiOiJPcGVuQXR0ZXN0YXRpb25TaWduYXR1cmUyMDE4IiwiY3JlYXRlZCI6IjIwMjEtMDktMjdUMDg6NTg6MDAuMDA3WiIsInByb29mUHVycG9zZSI6ImFzc2VydGlvbk1ldGhvZCIsInZlcmlmaWNhdGlvbk1ldGhvZCI6ImRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCNjb250cm9sbGVyIiwic2lnbmF0dXJlIjoiMHg3N2VmYzE4ZjJkYzBhNzIzYThkNGRkZmY3Y2UxZjE1N2Q3MGFjZTQxNWEwOTU5ZGM3MGE2NzE0ZmU0ZTVlZTY1MThlZGFjMmIxYjdjMDY3Y2UwOTRhMThiNGQ0MThhN2QzNzZiMWQxYzg5YWM3NjQyYTcxOWZhOGNhOWY2YTg1ZjFjIn1dfQ==" } ] -} +} \ No newline at end of file diff --git a/test/fixtures/v2/pdt_pcr_notarized_with_nric_wrapped.json b/test/fixtures/v2/pdt_pcr_notarized_with_nric_wrapped.json index 5a774598..d8a42182 100644 --- a/test/fixtures/v2/pdt_pcr_notarized_with_nric_wrapped.json +++ b/test/fixtures/v2/pdt_pcr_notarized_with_nric_wrapped.json @@ -1,358 +1,359 @@ { "version": "https://schema.openattestation.com/2.0/schema.json", "data": { - "id": "fea39b42-31f4-401d-9dc9-0f7e80d174ff:string:c5ad19bb-403c-4b52-971d-3f01e87883e3", - "version": "8c9251af-276a-4c05-a5b7-7bb84e204eaf:string:pdt-healthcert-v2.0", - "type": "e4bfe04b-3947-4428-b684-2bbdb73e4227:string:PCR", - "validFrom": "2e446d0c-a74e-4c05-ad02-57a38d4766ae:string:2021-08-24T04:22:36.062Z", - "fhirVersion": "78102e16-4c55-4dc4-9eab-b7ba8418712f:string:4.0.1", - "fhirBundle": { - "resourceType": "b58b7465-ff4b-4883-9012-f1173598357e:string:Bundle", - "type": "ab4e4c58-f3be-45af-ace6-aedac683c70a:string:collection", - "entry": [ - { - "fullUrl": "98e62a45-24b2-47f1-8e35-ce5555449bec:string:urn:uuid:ba7b7c8d-c509-4d9d-be4e-f99b6de29e23", - "resource": { - "resourceType": "e2764877-86ad-434f-a22b-5b9631b45ef7:string:Patient", - "extension": [ + "id": "919a402f-f399-4d80-9a36-5393ad757027:string:3a21794e-0abb-46ae-91be-f8799818d7b0", + "version": "b524b41e-e9f3-4e30-9060-54484cfaa3d8:string:pdt-healthcert-v2.0", + "type": "1b5cc929-5ed5-48b7-a2d6-cd8aaba102ae:string:PCR", + "validFrom": "3eda08d3-8396-4405-ad0e-22ea94881e9b:string:2021-08-24T04:22:36.062Z", + "fhirVersion": "9e1876e8-208c-4ee8-8e13-7f41cba11aca:string:4.0.1", + "fhirBundle": { + "resourceType": "c92f6e26-4381-42d8-94dc-10872bd3d80f:string:Bundle", + "type": "d475c3ab-ec7f-4637-bcbe-737271709015:string:collection", + "entry": [ { - "url": "043ae0fc-232d-4b91-ad60-4b9fbdab0c24:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "extension": [ - { - "url": "b6721e33-ddeb-457e-b480-0e51b8d2d1e5:string:code", - "valueCodeableConcept": { - "text": "498ab2e3-c9d5-40eb-aa61-f1fa917fd0f9:string:Patient Nationality", - "coding": [ - { - "system": "eca8b511-c783-46b4-83e2-0028aabef284:string:urn:iso:std:iso:3166", - "code": "2311371c-9046-489d-b993-e9ab205089b7:string:SG" - } - ] - } + "fullUrl": "adadd2e6-31f0-4c29-94e4-708a640e5d30:string:urn:uuid:ba7b7c8d-c509-4d9d-be4e-f99b6de29e23", + "resource": { + "resourceType": "f2dbdccc-6591-4468-9927-5e73a0754f98:string:Patient", + "extension": [ + { + "url": "6a9e8b05-3a13-48ec-b1a8-23dfa8640ac3:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", + "extension": [ + { + "url": "5ad7f45c-447a-4f39-b18f-8d3f210cfb10:string:code", + "valueCodeableConcept": { + "text": "b3f57c96-7e5a-408d-8d91-d365a5216dbb:string:Patient Nationality", + "coding": [ + { + "system": "e0ecc597-6d1a-4794-830a-cc52e8ca45b9:string:urn:iso:std:iso:3166", + "code": "30139f50-0a25-466b-9ec7-d638fb678ad9:string:SG" + } + ] + } + } + ] + } + ], + "identifier": [ + { + "id": "0313376f-3f35-42e3-a475-faddedffac37:string:PPN", + "type": { + "coding": [ + { + "system": "d80a5377-19b2-498d-8db5-920df798420a:string:http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "58641a91-45fa-4938-b823-fa2814450f23:string:PPN", + "display": "0ac81cb9-1c5a-4a5b-87e2-d40e1ddaf727:string:Passport Number" + } + ] + }, + "value": "ee2384a5-6be5-405d-aa15-c423800f7285:string:E7831177G" + }, + { + "id": "9debb5c8-b408-49a1-97fb-23f73e42f514:string:NRIC-FIN", + "value": "511f4d36-b5e0-4434-8385-77fecb09c783:string:S****989Z" + } + ], + "name": [ + { + "text": "c013316c-05f9-4a8c-8a7d-40d03e98782f:string:Tan Chen Chen" + } + ], + "gender": "f9ba11b5-eb4e-499f-aa58-c3a6b4c2d68e:string:female", + "birthDate": "35ba2caf-0d90-4c88-899e-ece1dc6fcc56:string:1990-01-15" } - ] - } - ], - "identifier": [ - { - "id": "e1edd4c4-3087-43ea-9dd4-4cb1656bf1c7:string:PPN", - "type": { - "coding": [ - { - "system": "8744907a-178a-4279-8b0e-a31d3d6d9b51:string:http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "91a49495-cc3b-4263-bcc6-82442b554215:string:PPN", - "display": "43175fff-cf35-4b6a-b730-89db6e214c45:string:Passport Number" - } - ] - }, - "value": "1cc34bdf-b69c-4189-966c-ca2601e0a30a:string:E7831177G" - }, - { - "id": "c565258c-9c24-4262-af59-6855e0f3c909:string:NRIC-FIN", - "value": "9aac4b62-29a2-480a-a71d-85d6fcc6cdd6:string:S9098989Z" - } - ], - "name": [ - { - "text": "047b775a-c76b-473b-8030-0b6e15e930eb:string:Tan Chen Chen" - } - ], - "gender": "71b9d4fb-806d-4b0d-9d24-e7169c0521d5:string:female", - "birthDate": "968941d9-51b6-4f61-8f20-1bb22ff65c96:string:1990-01-15" - } - }, - { - "fullUrl": "e2185fcc-7fcc-459a-b649-acfea6f3c23e:string:urn:uuid:7729970e-ab26-469f-b3e5-36a42ec24146", - "resource": { - "resourceType": "9a8a217e-a6be-4579-b9e3-1370b7fdf733:string:Observation", - "specimen": { - "type": "9a754eb7-cc39-4e16-a450-a228a31de5c3:string:Specimen", - "reference": "c2b3dfe6-388f-4a0e-9569-9c67c20c3b61:string:urn:uuid:0275bfaf-48fb-44e0-80cd-9c504f80e6ae" - }, - "performer": [ - { - "type": "ba844954-b457-4300-bb60-d73cd9b54dd9:string:Practitioner", - "reference": "a13d8c9e-fe1c-4196-bb13-73c8a68c54a0:string:urn:uuid:3dbff0de-d4a4-4e1d-98bf-af7428b8a04b" }, { - "id": "c436773a-a732-41c9-a37c-7d460f6a2dbc:string:LHP", - "type": "a1a9a742-915a-4f26-b583-b2e13167d194:string:Organization", - "reference": "fe4396f0-ea89-4f8f-a015-a8d07efdc9fc:string:urn:uuid:fa2328af-4882-4eaa-8c28-66dab46950f1" + "fullUrl": "d34d1bba-01ca-4a1c-b558-c113eb687000:string:urn:uuid:7729970e-ab26-469f-b3e5-36a42ec24146", + "resource": { + "resourceType": "dbb388b3-8f5f-4430-bf39-084d040b9a01:string:Observation", + "specimen": { + "type": "a7b5aa27-5327-43d8-afdd-4d55fb607bc6:string:Specimen", + "reference": "22cd274e-c752-4704-b80d-e662e81366ac:string:urn:uuid:0275bfaf-48fb-44e0-80cd-9c504f80e6ae" + }, + "performer": [ + { + "type": "3f642973-5a26-469f-b2e0-eac271bd19b0:string:Practitioner", + "reference": "de1d005a-8c5d-4cb7-a082-a13b9cc0ee22:string:urn:uuid:3dbff0de-d4a4-4e1d-98bf-af7428b8a04b" + }, + { + "id": "a277f61f-af95-4547-8c97-6ecc7d00d47c:string:LHP", + "type": "e94c0196-746e-4558-a840-722de1d16a89:string:Organization", + "reference": "3becd52f-51fa-4b23-b7c3-cff7c92c2a0d:string:urn:uuid:fa2328af-4882-4eaa-8c28-66dab46950f1" + }, + { + "id": "6e31efe5-0e3f-4731-a84d-6577ccb5ab77:string:AL", + "type": "bac26249-19c6-49af-8585-8f0a506de9a8:string:Organization", + "reference": "809f47b7-33dd-413f-a962-48d3eeb609fa:string:urn:uuid:839a7c54-6b40-41cb-b10d-9295d7e75f77" + } + ], + "identifier": [ + { + "id": "d9e08c5c-da9e-45b5-b0e3-3b1234f568ed:string:ACSN", + "type": { + "coding": [ + { + "system": "a44cc45c-97f2-49f1-8e79-949ccb3e6433:string:http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "b91078c0-e180-4376-b142-a4f6007d13b3:string:ACSN", + "display": "7efc9f31-69d0-4c55-b030-c8d6d7312fc5:string:Accession ID" + } + ] + }, + "value": "36716b84-7868-4e10-88ca-35089e54742c:string:123456789" + } + ], + "category": [ + { + "coding": [ + { + "system": "f03aa87a-df39-4d2b-a64d-9d42a1072eb9:string:http://snomed.info/sct", + "code": "3aa2e320-cb76-4155-ab92-5d4d9650132f:string:840539006", + "display": "bc43043b-d9e1-4581-8206-9e435e4cb6f4:string:COVID-19" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "8b4f3faa-5f9a-4cef-895b-821f55455be1:string:http://loinc.org", + "code": "878b94bd-7ca7-457e-9bb2-3e4fa9923418:string:94531-1", + "display": "584010ef-54d3-479f-a3f3-603b3fd4c878:string:SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "11627a38-7f6f-4740-9afd-e8a3535198c3:string:http://snomed.info/sct", + "code": "2001fb1b-73f2-4ea0-a477-3a4034be0bb7:string:260385009", + "display": "804e4d77-b323-4743-8cd6-a2e88f9cf993:string:Negative" + } + ] + }, + "effectiveDateTime": "70991a8d-fce8-45db-ad94-54047738d8b2:string:2020-09-28T06:15:00Z", + "status": "edd92751-a499-4533-b3cf-a9874256ec74:string:final" + } }, { - "id": "660de169-71f0-4c31-b8ec-005da927d47c:string:AL", - "type": "7d082337-4a04-4de7-97ae-a659f804dc8b:string:Organization", - "reference": "81d17b78-fb6b-4b30-ab87-b26b66669b80:string:urn:uuid:839a7c54-6b40-41cb-b10d-9295d7e75f77" - } - ], - "identifier": [ - { - "id": "fcaa9294-cda1-4849-b94c-b6b1962c3b21:string:ACSN", - "type": { - "coding": [ - { - "system": "6d611ec7-082c-403e-b8ca-a023eb9a69f9:string:http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "8077e711-6d1a-45ad-bd2f-29d9c806f88e:string:ACSN", - "display": "60b25c0c-921a-4802-8260-df3dc6feb1b8:string:Accession ID" - } - ] - }, - "value": "2177d104-2ca8-4d40-a1b3-68b628b1bb9a:string:123456789" - } - ], - "category": [ - { - "coding": [ - { - "system": "5a6847c7-c217-4b0d-a306-1f18913df2b4:string:http://snomed.info/sct", - "code": "ee5d2430-c9f4-44c3-8267-566a8076a3c4:string:840539006", - "display": "0aa9b7d7-b08d-4394-a858-08b54460b6f2:string:COVID-19" + "fullUrl": "439b320c-b834-47a7-99e9-e68e3a8aad67:string:urn:uuid:0275bfaf-48fb-44e0-80cd-9c504f80e6ae", + "resource": { + "resourceType": "5425ee45-0015-4263-af80-cb54be25f501:string:Specimen", + "type": { + "coding": [ + { + "system": "7da692db-1ac8-4700-b628-3017f91d807f:string:http://snomed.info/sct", + "code": "2ac46745-e900-4ff1-976b-be98dbbc512d:string:258500001", + "display": "a78ce216-e7df-4421-a22d-ddfecf5d6317:string:Nasopharyngeal swab" + } + ] + }, + "collection": { + "collectedDateTime": "ec704e9b-dc4a-4dfc-8ee8-fb798a235d47:string:2020-09-27T06:15:00Z" + } } - ] - } - ], - "code": { - "coding": [ - { - "system": "a180c1c6-42fb-4f0d-b0a4-d995b5b5a718:string:http://loinc.org", - "code": "e6440d0b-333c-4a9b-a253-4d2762d0da72:string:94531-1", - "display": "0830e61c-e97f-4a02-9ae2-033f520fe5b0:string:SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "5373c5c6-0a7e-42dc-af19-b89682bd9913:string:http://snomed.info/sct", - "code": "e32c1f35-dfb6-4401-8918-a176d244a42b:string:260385009", - "display": "d7c33e89-08e0-4aa9-ad15-d47912dd3785:string:Negative" - } - ] - }, - "effectiveDateTime": "0b425a37-1021-4ad3-bd02-af52117b9315:string:2020-09-28T06:15:00Z", - "status": "e38db9c3-e634-469e-9024-b695ef0a13b1:string:final" - } - }, - { - "fullUrl": "76560892-9b67-48b2-b7e5-a8dd9ce8d9f0:string:urn:uuid:0275bfaf-48fb-44e0-80cd-9c504f80e6ae", - "resource": { - "resourceType": "a43098e1-f0c2-4985-97f3-94bc198b7454:string:Specimen", - "type": { - "coding": [ - { - "system": "5e321064-81ca-4f4f-a39b-d4e3f294c4d6:string:http://snomed.info/sct", - "code": "d71ba52d-3a5c-47f3-a948-b816a8264c85:string:258500001", - "display": "79755b29-1239-49b6-8071-3827a0a83cbb:string:Nasopharyngeal swab" - } - ] - }, - "collection": { - "collectedDateTime": "42f40966-f4e1-4dff-a276-585f2c346f37:string:2020-09-27T06:15:00Z" - } - } - }, - { - "fullUrl": "93560658-3472-42e6-b9ec-0dbed7e263f5:string:urn:uuid:3dbff0de-d4a4-4e1d-98bf-af7428b8a04b", - "resource": { - "resourceType": "0f3b6117-29b7-4b45-b323-2447187d6872:string:Practitioner", - "name": [ - { - "text": "b417611f-b2ac-4ea7-a7d9-b7d4450d060f:string:Dr Michael Lim" - } - ], - "qualification": [ + }, { - "code": { - "coding": [ - { - "system": "31be1f0c-d498-46a7-b9bd-ac0df2bfdef7:string:http://terminology.hl7.org/CodeSystem/v2-0203", - "code": "b1d804dd-8ad0-4b7b-ab79-67ab4aff1a4c:string:MCR", - "display": "07710dbe-0080-43e9-9ec3-fe8b4b175b20:string:Practitioner Medicare number" - } - ] - }, - "identifier": [ - { - "id": "463ff48d-d27a-47e1-8d8b-f14bd0c2cc6e:string:MCR", - "value": "168bc829-4baf-4434-9e09-3ccb04c881b4:string:123456" + "fullUrl": "efabb5d3-ca92-44aa-979c-cae573ffd713:string:urn:uuid:3dbff0de-d4a4-4e1d-98bf-af7428b8a04b", + "resource": { + "resourceType": "b665d375-dcc0-4582-be7e-7fb2a7b8461f:string:Practitioner", + "name": [ + { + "text": "1ee6c31f-47d2-4cdd-81d7-7df84b11ab7b:string:Dr Michael Lim" + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "8968559e-5189-4aea-bdda-aae0c377104c:string:http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "d73b8947-fbb6-4fc6-9653-e238d5999262:string:MCR", + "display": "c3d995c3-ca75-4f87-bbf8-c5912ccae0e2:string:Practitioner Medicare number" + } + ] + }, + "identifier": [ + { + "id": "ef646a65-08ab-4670-8826-cf68523732a0:string:MCR", + "value": "f7c25742-dd9a-4016-9d34-4470810c89c8:string:123456" + } + ], + "issuer": { + "type": "39b58ffb-5dda-478f-afcb-a831ad1216d9:string:Organization", + "reference": "58663663-d8ae-4c43-b92c-710403825e05:string:urn:uuid:bc7065ee-42aa-473a-a614-afd8a7b30b1e" + } + } + ] } - ], - "issuer": { - "type": "96299c50-6beb-4782-884e-ef04eedf6c7b:string:Organization", - "reference": "ab0ce08e-8b42-4302-8396-9f1f796afb79:string:urn:uuid:bc7065ee-42aa-473a-a614-afd8a7b30b1e" - } - } - ] - } - }, - { - "fullUrl": "4379785d-da31-4e43-a3a1-f934e2f9afb1:string:urn:uuid:bc7065ee-42aa-473a-a614-afd8a7b30b1e", - "resource": { - "resourceType": "a73ced95-84a2-4c51-918a-e76fc40bc23f:string:Organization", - "name": "f41e8c17-d288-4490-9966-d808dc548853:string:Ministry of Health (MOH)", - "type": [ + }, { - "coding": [ - { - "system": "6ef950d8-0174-4228-a5b2-e7544f0e0662:string:http://terminology.hl7.org/CodeSystem/organization-type", - "code": "ffc1de2a-56b8-40d4-8080-a87cd05c2ace:string:govt", - "display": "b9beae65-61d2-492d-a1d7-7e5c6b470d4e:string:Government" + "fullUrl": "367cb75a-f12d-45cf-9e12-6988609bc2c1:string:urn:uuid:bc7065ee-42aa-473a-a614-afd8a7b30b1e", + "resource": { + "resourceType": "2ad4842e-9790-45d0-a801-eed29a1f8a08:string:Organization", + "name": "cf852704-3321-49d2-b372-967d51d23cd6:string:Ministry of Health (MOH)", + "type": [ + { + "coding": [ + { + "system": "1bee0056-da6b-4ab8-9393-acf98bb9f817:string:http://terminology.hl7.org/CodeSystem/organization-type", + "code": "8038ed41-1dc1-41ac-b7aa-89e0522b8fc7:string:govt", + "display": "97796441-0854-488b-ab99-1711ae8c660e:string:Government" + } + ] + } + ], + "contact": [ + { + "telecom": [ + { + "system": "877a540e-95d0-40df-a8be-058906251c01:string:url", + "value": "b6347755-2607-4f2d-b850-546229d4da15:string:https://www.moh.gov.sg" + }, + { + "system": "abc089ca-7b61-4123-b280-6c7bab106319:string:phone", + "value": "39ce8ae7-5eb4-474d-8f2b-60f5e365d37e:string:+6563259220" + } + ], + "address": { + "type": "bf2fbee1-ead3-4611-860d-56c6d974b46f:string:physical", + "use": "bb2a22a9-e053-48c8-bda0-b6284de736f9:string:work", + "text": "8608b49a-1ad4-4767-98c2-428e3a35dd21:string:Ministry of Health, 16 College Road, College of Medicine Building, Singapore 169854" + } + } + ] } - ] - } - ], - "contact": [ + }, { - "telecom": [ - { - "system": "c13c9c83-4f98-4687-a12a-8659ed2a8784:string:url", - "value": "7229f5cc-a14f-45dd-b609-0cd670bcce9c:string:https://www.moh.gov.sg" - }, - { - "system": "9b88ef7a-14d8-4073-851b-2432c33f43c7:string:phone", - "value": "320d7fcb-d28a-4b25-a4f2-d92c0d4b7572:string:+6563259220" + "fullUrl": "f4a4206c-882a-4785-ad1a-73282a1a4946:string:urn:uuid:fa2328af-4882-4eaa-8c28-66dab46950f1", + "resource": { + "resourceType": "10839d55-d564-45a5-951f-731dd3cb5073:string:Organization", + "name": "ab958a9a-424a-4f63-ba45-1b5ef710195b:string:MacRitchie Medical Clinic", + "type": [ + { + "coding": [ + { + "system": "1a6da8de-e5a3-45cd-9ff9-ccc78d0882f5:string:http://terminology.hl7.org/CodeSystem/organization-type", + "code": "4980f8d0-ae54-48b9-8db3-4e78b3e45394:string:prov", + "display": "7c42937d-3051-4d53-8a77-4354349ba473:string:Healthcare Provider" + } + ], + "text": "00446da2-8f5f-48a3-80fb-b882aec5aebd:string:Licensed Healthcare Provider" + } + ], + "contact": [ + { + "telecom": [ + { + "system": "dfdd8a65-1e71-4f8b-a13b-a3b83e209b90:string:url", + "value": "273d44df-05af-4b6a-8126-94e0bf49ca87:string:https://www.macritchieclinic.com.sg" + }, + { + "system": "b3078fa1-55e3-406b-9c5b-ef3d05b2a6e9:string:phone", + "value": "b832bbaa-5742-4cce-a585-a9f865dd85ef:string:+6561234567" + } + ], + "address": { + "type": "3b6b641a-79d2-45c2-87ff-be82525c3002:string:physical", + "use": "526359c5-6dd3-4569-8af8-b7fd89c91c28:string:work", + "text": "e2d238d9-2269-4323-84e0-cd85f44c0a65:string:MacRitchie Hospital, Thomson Road, Singapore 123000" + } + } + ] } - ], - "address": { - "type": "21246b85-6014-464e-b732-7fec6c05df50:string:physical", - "use": "a820fd38-7b15-43c2-a223-94e17d96fea0:string:work", - "text": "22af8bd7-91a8-4ddd-b64e-76c26f5020ff:string:Ministry of Health, 16 College Road, College of Medicine Building, Singapore 169854" - } - } - ] - } - }, - { - "fullUrl": "e31e71ea-61c0-40d5-b0e4-6add0ecd529f:string:urn:uuid:fa2328af-4882-4eaa-8c28-66dab46950f1", - "resource": { - "resourceType": "7026f843-80de-45f6-9c2e-4d7e33819f87:string:Organization", - "name": "dc2120c7-a53d-465e-a824-2457a96973c1:string:MacRitchie Medical Clinic", - "type": [ + }, { - "coding": [ - { - "system": "e54e37e6-5818-4e48-9c96-ef569f33c720:string:http://terminology.hl7.org/CodeSystem/organization-type", - "code": "a9e5f2a1-ae71-4725-925c-56fc343c7afe:string:prov", - "display": "0f1c5fff-ec2d-4db7-b5f1-703200fa654d:string:Healthcare Provider" + "fullUrl": "fb17570e-bc00-4e93-9d34-8b967948cdd4:string:urn:uuid:839a7c54-6b40-41cb-b10d-9295d7e75f77", + "resource": { + "resourceType": "150e09d7-ca56-4848-a303-bdc20fd763c1:string:Organization", + "name": "312c0e1d-ca37-40a0-a54f-e5d4698c3255:string:MacRitchie Laboratory", + "type": [ + { + "coding": [ + { + "system": "ea88b0c5-0b45-4767-b92a-b9cd62906408:string:http://terminology.hl7.org/CodeSystem/organization-type", + "code": "ce0707f2-3d2d-406a-9a11-2e1aaf7a7faf:string:prov", + "display": "ebbc122d-6ad5-4307-9ea1-b5c06f350ede:string:Healthcare Provider" + } + ], + "text": "7c04f692-bf3e-429b-8ca5-cfcd1f29256b:string:Accredited Laboratory" + } + ], + "contact": [ + { + "telecom": [ + { + "system": "9c2529e6-4cce-41e9-95d1-6b108cc86848:string:url", + "value": "e25825e5-cba5-4e4b-83e5-ad00ff826d34:string:https://www.macritchielaboratory.com.sg" + }, + { + "system": "19468ca7-a837-44ef-82fd-9e837601021c:string:phone", + "value": "18a52ac0-ab29-449f-9d4f-883b97ebd2f1:string:+6567654321" + } + ], + "address": { + "type": "5ba1e94a-8ef3-404b-bee6-05ecdc1412e8:string:physical", + "use": "5507d70b-979a-4798-9c3a-7a8f400eb448:string:work", + "text": "0402e027-25db-4037-a5ec-8f7426b85ff5:string:2 Thomson Avenue 4, Singapore 098888" + } + } + ] } - ], - "text": "b382089f-b3ca-44f3-82c9-f0022b1e9f23:string:Licensed Healthcare Provider" } - ], - "contact": [ - { - "telecom": [ - { - "system": "ee24fc7e-4c0d-493f-be01-b4d7ca4125f5:string:url", - "value": "6d311bb3-4f49-4df4-bb06-38d504258634:string:https://www.macritchieclinic.com.sg" - }, - { - "system": "a8f96d37-fa6b-40cc-8df2-e0a0c18014ce:string:phone", - "value": "d14a6b5a-950b-4ad0-ba3b-567f1953b34a:string:+6561234567" - } - ], - "address": { - "type": "3d96769d-ffc9-49dd-8255-6523605cc054:string:physical", - "use": "a877a279-cd68-4fd2-846e-e528be963bd8:string:work", - "text": "97f3edf9-97e0-471d-8fbb-8f5e0d032754:string:MacRitchie Hospital, Thomson Road, Singapore 123000" - } + ] + }, + "issuers": [ + { + "name": "76bec86c-f4f1-4f1a-880d-0107b4f44079:string:SAMPLE ISSUER (DO NOT VERIFY)", + "id": "c6f20205-0910-4fbd-942a-9f56de656ecc:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", + "revocation": { + "type": "bcd0b8ca-d930-49e8-bf55-37bdba267e78:string:NONE" + }, + "identityProof": { + "type": "74f7fd9a-fca6-4aba-bae2-cddc2b4647f2:string:DNS-DID", + "location": "109a2963-2088-4e68-8ec0-1e4b8ed38f07:string:donotverify.testing.verify.gov.sg", + "key": "c32bfde4-852b-438c-99b2-d6a5659b0ad4:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" } - ] } - }, - { - "fullUrl": "ab2dd9b8-16e0-4fa6-be11-20233fe5682f:string:urn:uuid:839a7c54-6b40-41cb-b10d-9295d7e75f77", - "resource": { - "resourceType": "e7877aad-e952-4849-960d-55df7807ff8b:string:Organization", - "name": "b99ff34a-e865-4e8f-bcde-73093feb563f:string:MacRitchie Laboratory", - "type": [ + ], + "$template": { + "name": "fbc5f0d2-f5a0-475a-ae1b-1827175e02e4:string:HEALTH_CERT", + "type": "5efe249d-6d00-4544-9642-3e647c583f8f:string:EMBEDDED_RENDERER", + "url": "034adcfb-b367-405d-bfec-0db87962ee6c:string:https://healthcert.renderer.moh.gov.sg/" + }, + "notarisationMetadata": { + "reference": "a7af626e-4daa-43a5-aa3d-a5895125901b:string:3a21794e-0abb-46ae-91be-f8799818d7b0", + "notarisedOn": "a79ac486-5a04-4b6f-9509-ef007d13c4df:string:2021-12-28T07:21:44.562Z", + "passportNumber": "13264007-ef86-4b70-bc59-51db3f14b5c3:string:E7831177G", + "url": "2f52135d-deb5-4e63-9965-e8eb11454ff6:string:https://www.verify.gov.sg/verify?q=%7B%22type%22%3A%22DOCUMENT%22%2C%22payload%22%3A%7B%22uri%22%3A%22https%3A%2F%2Fapi-vaccine.storage.staging.notarise.io%2Fdocument%2F44409930-70b6-4ab7-94be-86cf57c9ed87%22%2C%22permittedActions%22%3A%5B%22VIEW%22%2C%22STORE%22%5D%2C%22redirect%22%3A%22https%3A%2F%2Fwww.verify.gov.sg%2Fverify%22%7D%7D#%7B%22key%22%3A%2252ae6dafd2ce6f818ccb7d893f4fb58416453f42c4624a9c6a98abf0760f2119%22%7D", + "signedEuHealthCerts": [ { - "coding": [ - { - "system": "e3d08052-8e9e-4951-bd9f-168503e2b992:string:http://terminology.hl7.org/CodeSystem/organization-type", - "code": "2df8994e-c918-43a0-a7b0-18703b0042d0:string:prov", - "display": "7ea4ae85-7b92-41a2-bc7a-bc36dc59f355:string:Healthcare Provider" - } - ], - "text": "984d729a-3e16-4972-989a-20cdbc195144:string:Accredited Laboratory" - } - ], - "contact": [ - { - "telecom": [ - { - "system": "8db0c47d-e004-473a-95e0-d49e835a9b35:string:url", - "value": "dc0c170d-1fcf-49fd-86c8-8ec47df6c353:string:https://www.macritchielaboratory.com.sg" - }, - { - "system": "534f29b8-587d-4c43-a6ea-48c841e0d1d6:string:phone", - "value": "261bca79-4854-4f41-bdfc-8d7dc8a41f8d:string:+6567654321" - } - ], - "address": { - "type": "4880872b-76f5-4295-8a9d-e7fc6c5a09ec:string:physical", - "use": "dfebb57c-69d0-4ca7-aed5-c2866512d668:string:work", - "text": "24b2ac5e-710a-47be-98d8-7b1d38512548:string:2 Thomson Avenue 4, Singapore 098888" - } + "type": "8f5a0582-0b74-4cef-971c-6ea916de03fd:string:PCR", + "qr": "41cae531-4f2b-4e80-b158-337e42b88a70:string:HC1:6BFK%G6 9$P3743BJR6UGEKEOQ68U6B/Q.JLIRLHTTLIDU1UJPTMP1K.C%CQKDJS/0-PLK5D5%P56FFQD54D3IDKJFNDW4VC0P0N-GIZNAKH5 7-32GB0C8GN1A N0U2KHHJ1BR1EHNTU+MU62R8+7*1WY.NCXLV.TK-G:9U$3891PE4HZ177WD*1F1GIN.UA6M9WRLQ81GWA:FP7WT38NWB42331UW3G9NH3SEM3KP/TRXH%R2/9NFXJ$.M4UG 7LW2AZE0Q0N-EF95L+U7S%QT32%2CZ.BQ5R6/4FPFY62970C103WAUXU/MAWMTSJTAO0.4JXZ66CFX-ON$0E AC8WKT0/$HTHOEY0C:0-61KUF3WV1M6MK97$GYB7SDBT9DUSUEF5T2J%HTHT82G7NLJ1HJQ4QL7QFM7-:A9K6-XSL0I$XSPCMKXD4K09PGQ-99.T6G8FIOFAGERK%BM3-8ZBK Q0D*FW12OMVQ5MNCBQ.JG0W*6UT-C4Q0WGE4KRI2NA30/XU% R1+HK.CNHCRJ4DYAKP9BTUVDCR-GLJEGH65Y5E-DMI3SJAX+H.%PL360GK21B%AQ9IL6.U%Q50OLE0Q5BJ+RC1U2I60C C%TIXI8*BCI$KDTC 7IZTL82M995EKI7SMCSII:75YM6S5940XDO4A06+4::N9VM6-ABIIJNL+RJDFA8IP1%D S7R7HSSPAOKM57%PLCMG.%FK7GW$Q$.ICOOM0TK-C0QL7VLY9M4*MPZ6:Q5AV5BKK:/I:MDHRTD3FKDATDMF7BN/TNQNA%SI97 XL8$PBGFT4CCOM4ANKKQ-KGCSPL%PTDB .I97D5MT2-CW$URHKZHJ6WC ZU- 2/KTLNC6A13D4R44H90RZP6P02D9X7JB2I:FHXZFT.33PKTJ9BR8/:L13MSFHYN9/VO..U5A1P38G0P7PMAMB:-8G4G9LLIRUW-QYX4 7U: TQ90./KD+TI.V1KCOLE0PC%KSOR6FQ5J%R$CUFTE*V4ZIMQXJNBP7HPI2I7Y5EYBMQAWZB-YFTLANIN2+MTI4*TN/BOU*O.REN4K59VJUKV4C4RV..9O$UJNO%XS22WZWVWHDO4PUXM/PFFNRI8IA2AGLV.UNJ%3-HFIKHP9PS3O*DWB4S9WV08NG6EHLL$2SPCE106J$Q22", + "expiryDateTime": "e8d761a8-c1d9-45ad-a1b3-c3f2fcc4212a:string:2022-01-04T07:21:44.143Z" } - ] + ] + }, + "logo": "702ca827-2993-44d7-b5e0-febebf628cbb:string:data:image/png;base64,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", + "attachments": [ + { + "filename": "1514e3d4-e714-4162-a569-cdb32058e63b:string:healthcert.txt", + "type": "e4c1ec52-edce-419d-b8c2-74ab13be4a0b:string:text/open-attestation", + "data": "d3309cbe-2e49-442b-9351-762663b1ccdd:string:eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiZmVhMzliNDItMzFmNC00MDFkLTlkYzktMGY3ZTgwZDE3NGZmOnN0cmluZzpjNWFkMTliYi00MDNjLTRiNTItOTcxZC0zZjAxZTg3ODgzZTMiLCJ2ZXJzaW9uIjoiOGM5MjUxYWYtMjc2YS00YzA1LWE1YjctN2JiODRlMjA0ZWFmOnN0cmluZzpwZHQtaGVhbHRoY2VydC12Mi4wIiwidHlwZSI6ImU0YmZlMDRiLTM5NDctNDQyOC1iNjg0LTJiYmRiNzNlNDIyNzpzdHJpbmc6UENSIiwidmFsaWRGcm9tIjoiMmU0NDZkMGMtYTc0ZS00YzA1LWFkMDItNTdhMzhkNDc2NmFlOnN0cmluZzoyMDIxLTA4LTI0VDA0OjIyOjM2LjA2MloiLCJmaGlyVmVyc2lvbiI6Ijc4MTAyZTE2LTRjNTUtNGRjNC05ZWFiLWI3YmE4NDE4NzEyZjpzdHJpbmc6NC4wLjEiLCJmaGlyQnVuZGxlIjp7InJlc291cmNlVHlwZSI6ImI1OGI3NDY1LWZmNGItNDg4My05MDEyLWYxMTczNTk4MzU3ZTpzdHJpbmc6QnVuZGxlIiwidHlwZSI6ImFiNGU0YzU4LWYzYmUtNDVhZi1hY2U2LWFlZGFjNjgzYzcwYTpzdHJpbmc6Y29sbGVjdGlvbiIsImVudHJ5IjpbeyJmdWxsVXJsIjoiOThlNjJhNDUtMjRiMi00N2YxLThlMzUtY2U1NTU1NDQ5YmVjOnN0cmluZzp1cm46dXVpZDpiYTdiN2M4ZC1jNTA5LTRkOWQtYmU0ZS1mOTliNmRlMjllMjMiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiJlMjc2NDg3Ny04NmFkLTQzNGYtYTIyYi01Yjk2MzFiNDVlZjc6c3RyaW5nOlBhdGllbnQiLCJleHRlbnNpb24iOlt7InVybCI6IjA0M2FlMGZjLTIzMmQtNGI5MS1hZDYwLTRiOWZiZGFiMGMyNDpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLCJleHRlbnNpb24iOlt7InVybCI6ImI2NzIxZTMzLWRkZWItNDU3ZS1iNDgwLTBlNTFiOGQyZDFlNTpzdHJpbmc6Y29kZSIsInZhbHVlQ29kZWFibGVDb25jZXB0Ijp7InRleHQiOiI0OThhYjJlMy1jOWQ1LTQwZWItYWE2MS1mMWZhOTE3ZmQwZjk6c3RyaW5nOlBhdGllbnQgTmF0aW9uYWxpdHkiLCJjb2RpbmciOlt7InN5c3RlbSI6ImVjYThiNTExLWM3ODMtNDZiNC04M2UyLTAwMjhhYWJlZjI4NDpzdHJpbmc6dXJuOmlzbzpzdGQ6aXNvOjMxNjYiLCJjb2RlIjoiMjMxMTM3MWMtOTA0Ni00ODlkLWI5OTMtZTlhYjIwNTA4OWI3OnN0cmluZzpTRyJ9XX19XX1dLCJpZGVudGlmaWVyIjpbeyJpZCI6ImUxZWRkNGM0LTMwODctNDNlYS05ZGQ0LTRjYjE2NTZiZjFjNzpzdHJpbmc6UFBOIiwidHlwZSI6eyJjb2RpbmciOlt7InN5c3RlbSI6Ijg3NDQ5MDdhLTE3OGEtNDI3OS04YjBlLWEzMWQzZDZkOWI1MTpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS92Mi0wMjAzIiwiY29kZSI6IjkxYTQ5NDk1LWNjM2ItNDI2My1iY2M2LTgyNDQyYjU1NDIxNTpzdHJpbmc6UFBOIiwiZGlzcGxheSI6IjQzMTc1ZmZmLWNmMzUtNGI2YS1iNzMwLTg5ZGI2ZTIxNGM0NTpzdHJpbmc6UGFzc3BvcnQgTnVtYmVyIn1dfSwidmFsdWUiOiIxY2MzNGJkZi1iNjljLTQxODktOTY2Yy1jYTI2MDFlMGEzMGE6c3RyaW5nOkU3ODMxMTc3RyJ9LHsiaWQiOiJjNTY1MjU4Yy05YzI0LTQyNjItYWY1OS02ODU1ZTBmM2M5MDk6c3RyaW5nOk5SSUMtRklOIiwidmFsdWUiOiI5YWFjNGI2Mi0yOWEyLTQ4MGEtYTcxZC04NWQ2ZmNjNmNkZDY6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjA0N2I3NzVhLWM3NmItNDczYi04MDMwLTBiNmUxNWU5MzBlYjpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNzFiOWQ0ZmItODA2ZC00YjBkLTlkMjQtZTcxNjljMDUyMWQ1OnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiI5Njg5NDFkOS01MWI2LTRmNjEtOGYyMC0xYmIyMmZmNjVjOTY6c3RyaW5nOjE5OTAtMDEtMTUifX0seyJmdWxsVXJsIjoiZTIxODVmY2MtN2ZjYy00NTlhLWI2NDktYWNmZWE2ZjNjMjNlOnN0cmluZzp1cm46dXVpZDo3NzI5OTcwZS1hYjI2LTQ2OWYtYjNlNS0zNmE0MmVjMjQxNDYiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiI5YThhMjE3ZS1hNmJlLTQ1NzktYjllMy0xMzcwYjdmZGY3MzM6c3RyaW5nOk9ic2VydmF0aW9uIiwic3BlY2ltZW4iOnsidHlwZSI6IjlhNzU0ZWI3LWNjMzktNGUxNi1hNDUwLWEyMjhhMzFkZTVjMzpzdHJpbmc6U3BlY2ltZW4iLCJyZWZlcmVuY2UiOiJjMmIzZGZlNi0zODhmLTRhMGUtOTU2OS05YzY3YzIwYzNiNjE6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSJ9LCJwZXJmb3JtZXIiOlt7InR5cGUiOiJiYTg0NDk1NC1iNDU3LTQzMDAtYmI2MC1kNzNjZDliNTRkZDk6c3RyaW5nOlByYWN0aXRpb25lciIsInJlZmVyZW5jZSI6ImExM2Q4YzllLWZlMWMtNDE5Ni1iYjEzLTczYzhhNjhjNTRhMDpzdHJpbmc6dXJuOnV1aWQ6M2RiZmYwZGUtZDRhNC00ZTFkLTk4YmYtYWY3NDI4YjhhMDRiIn0seyJpZCI6ImM0MzY3NzNhLWE3MzItNDFjOS1hMzdjLTdkNDYwZjZhMmRiYzpzdHJpbmc6TEhQIiwidHlwZSI6ImExYTlhNzQyLTkxNWEtNGYyNi1iNTgzLWIyZTEzMTY3ZDE5NDpzdHJpbmc6T3JnYW5pemF0aW9uIiwicmVmZXJlbmNlIjoiZmU0Mzk2ZjAtZWE4OS00ZjhmLWEwMTUtYThkMDdlZmRjOWZjOnN0cmluZzp1cm46dXVpZDpmYTIzMjhhZi00ODgyLTRlYWEtOGMyOC02NmRhYjQ2OTUwZjEifSx7ImlkIjoiNjYwZGUxNjktNzFmMC00YzMxLWI4ZWMtMDA1ZGE5MjdkNDdjOnN0cmluZzpBTCIsInR5cGUiOiI3ZDA4MjMzNy00YTA0LTRkZTctOTdhZS1hNjU5ZjgwNGRjOGI6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6IjgxZDE3Yjc4LWZiNmItNGIzMC1hYjg3LWIyNmI2NjY2OWI4MDpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3In1dLCJpZGVudGlmaWVyIjpbeyJpZCI6ImZjYWE5Mjk0LWNkYTEtNDg0OS1iOTRjLWI2YjE5NjJjM2IyMTpzdHJpbmc6QUNTTiIsInR5cGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI2ZDYxMWVjNy0wODJjLTQwM2UtYjhjYS1hMDIzZWI5YTY5Zjk6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiI4MDc3ZTcxMS02ZDFhLTQ1YWQtYmQyZi0yOWQ5YzgwNmY4OGU6c3RyaW5nOkFDU04iLCJkaXNwbGF5IjoiNjBiMjVjMGMtOTIxYS00ODAyLTgyNjAtZGYzZGM2ZmViMWI4OnN0cmluZzpBY2Nlc3Npb24gSUQifV19LCJ2YWx1ZSI6IjIxNzdkMTA0LTJjYTgtNGQ0MC1hMWIzLTY4YjYyOGIxYmI5YTpzdHJpbmc6MTIzNDU2Nzg5In1dLCJjYXRlZ29yeSI6W3siY29kaW5nIjpbeyJzeXN0ZW0iOiI1YTY4NDdjNy1jMjE3LTRiMGQtYTMwNi0xZjE4OTEzZGYyYjQ6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiZWU1ZDI0MzAtYzlmNC00NGMzLTgyNjctNTY2YTgwNzZhM2M0OnN0cmluZzo4NDA1MzkwMDYiLCJkaXNwbGF5IjoiMGFhOWI3ZDctYjA4ZC00Mzk0LWE4NTgtMDhiNTQ0NjBiNmYyOnN0cmluZzpDT1ZJRC0xOSJ9XX1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYTE4MGMxYzYtNDJmYi00ZjBkLWIwYTQtZDk5NWI1YjVhNzE4OnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6ImU2NDQwZDBiLTMzM2MtNGE5Yi1hMjUzLTRkMjc2MmQwZGE3MjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiIwODMwZTYxYy1lOTdmLTRhMDItOWFlMi0wMzNmNTIwZmU1YjA6c3RyaW5nOlNBUlMtQ29WLTIgKENPVklELTE5KSBSTkEgcGFuZWwgLSBSZXNwaXJhdG9yeSBzcGVjaW1lbiBieSBOQUEgd2l0aCBwcm9iZSBkZXRlY3Rpb24ifV19LCJ2YWx1ZUNvZGVhYmxlQ29uY2VwdCI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjUzNzNjNWM2LTBhN2UtNDJkYy1hZjE5LWI4OTY4MmJkOTkxMzpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsImNvZGUiOiJlMzJjMWYzNS1kZmI2LTQ0MDEtODkxOC1hMTc2ZDI0NGE0MmI6c3RyaW5nOjI2MDM4NTAwOSIsImRpc3BsYXkiOiJkN2MzM2U4OS0wOGUwLTRhYTktYWQxNS1kNDc5MTJkZDM3ODU6c3RyaW5nOk5lZ2F0aXZlIn1dfSwiZWZmZWN0aXZlRGF0ZVRpbWUiOiIwYjQyNWEzNy0xMDIxLTRhZDMtYmQwMi1hZjUyMTE3YjkzMTU6c3RyaW5nOjIwMjAtMDktMjhUMDY6MTU6MDBaIiwic3RhdHVzIjoiZTM4ZGI5YzMtZTYzNC00NjllLTkwMjQtYjY5NWVmMGExM2IxOnN0cmluZzpmaW5hbCJ9fSx7ImZ1bGxVcmwiOiI3NjU2MDg5Mi05YjY3LTQ4YjItYjdlNS1hOGRkOWNlOGQ5ZjA6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImE0MzA5OGUxLWYwYzItNDk4NS05N2YzLTk0YmMxOThiNzQ1NDpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiNWUzMjEwNjQtODFjYS00ZjRmLWEzOWItZDRlM2YyOTRjNGQ2OnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6ImQ3MWJhNTJkLTNhNWMtNDdmMy1hOTQ4LWI4MTZhODI2NGM4NTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6Ijc5NzU1YjI5LTEyMzktNDliNi04MDcxLTM4MjdhMGE4M2NiYjpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI0MmY0MDk2Ni1mNGUxLTRkZmYtYTI3Ni01ODVmMmMzNDZmMzc6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19fSx7ImZ1bGxVcmwiOiI5MzU2MDY1OC0zNDcyLTQyZTYtYjllYy0wZGJlZDdlMjYzZjU6c3RyaW5nOnVybjp1dWlkOjNkYmZmMGRlLWQ0YTQtNGUxZC05OGJmLWFmNzQyOGI4YTA0YiIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjBmM2I2MTE3LTI5YjctNGI0NS1iMzIzLTI0NDcxODdkNjg3MjpzdHJpbmc6UHJhY3RpdGlvbmVyIiwibmFtZSI6W3sidGV4dCI6ImI0MTc2MTFmLWIyYWMtNGVhNy1hN2Q5LWI3ZDQ0NTBkMDYwZjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV0sInF1YWxpZmljYXRpb24iOlt7ImNvZGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiIzMWJlMWYwYy1kNDk4LTQ2YTctYjliZC1hYzBkZjJiZmRlZjc6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJiMWQ4MDRkZC04YWQwLTRiN2ItYWI3OS02N2FiNGFmZjFhNGM6c3RyaW5nOk1DUiIsImRpc3BsYXkiOiIwNzcxMGRiZS0wMDgwLTQzZTktOWVjMy1mZThiNGIxNzViMjA6c3RyaW5nOlByYWN0aXRpb25lciBNZWRpY2FyZSBudW1iZXIifV19LCJpZGVudGlmaWVyIjpbeyJpZCI6IjQ2M2ZmNDhkLWQyN2EtNDdlMS04ZDhiLWYxNGJkMGMyY2M2ZTpzdHJpbmc6TUNSIiwidmFsdWUiOiIxNjhiYzgyOS00YmFmLTQ0MzQtOWUwOS0zY2NiMDRjODgxYjQ6c3RyaW5nOjEyMzQ1NiJ9XSwiaXNzdWVyIjp7InR5cGUiOiI5NjI5OWM1MC02YmViLTQ3ODItODg0ZS1lZjA0ZWVkZjZjN2I6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImFiMGNlMDhlLThiNDItNDMwMi04Mzk2LTlmMWY3OTZhZmI3OTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIn19XX19LHsiZnVsbFVybCI6IjQzNzk3ODVkLWRhMzEtNGU0My1hM2ExLWY5MzRlMmY5YWZiMTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiYTczY2VkOTUtODRhMi00YzUxLTkxOGEtZTc2ZmM0MGJjMjNmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiZjQxZThjMTctZDI4OC00NDkwLTk5NjYtZDgwOGRjNTQ4ODUzOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGggKE1PSCkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6IjZlZjk1MGQ4LTAxNzQtNDIyOC1hNWIyLWU3NTQ0ZjBlMDY2MjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiJmZmMxZGUyYS01NmI4LTQwZDQtODA4MC1hODdjZDA1YzJhY2U6c3RyaW5nOmdvdnQiLCJkaXNwbGF5IjoiYjliZWFlNjUtNjFkMi00OTJkLWExZDctN2U1YzZiNDcwZDRlOnN0cmluZzpHb3Zlcm5tZW50In1dfV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImMxM2M5YzgzLTRmOTgtNDY4Ny1hMTJhLTg2NTllZDJhODc4NDpzdHJpbmc6dXJsIiwidmFsdWUiOiI3MjI5ZjVjYy1hMTRmLTQ1ZGQtYjYwOS0wY2Q2NzBiY2NlOWM6c3RyaW5nOmh0dHBzOi8vd3d3Lm1vaC5nb3Yuc2cifSx7InN5c3RlbSI6IjliODhlZjdhLTE0ZDgtNDA3My04NTFiLTI0MzJjMzNmNDNjNzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6IjMyMGQ3ZmNiLWQyOGEtNGIyNS1hNGYyLWQ5MmMwZDRiNzU3MjpzdHJpbmc6KzY1NjMyNTkyMjAifV0sImFkZHJlc3MiOnsidHlwZSI6IjIxMjQ2Yjg1LTYwMTQtNDY0ZS1iNzMyLTdmZWM2YzA1ZGY1MDpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJhODIwZmQzOC03YjE1LTQzYzItYTIyMy05NGUxN2Q5NmZlYTA6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiMjJhZjhiZDctOTFhOC00ZGRkLWI2NGUtNzZjMjZmNTAyMGZmOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGgsIDE2IENvbGxlZ2UgUm9hZCwgQ29sbGVnZSBvZiBNZWRpY2luZSBCdWlsZGluZywgU2luZ2Fwb3JlIDE2OTg1NCJ9fV19fSx7ImZ1bGxVcmwiOiJlMzFlNzFlYS02MWMwLTQwZDUtYjBlNC02YWRkMGVjZDUyOWY6c3RyaW5nOnVybjp1dWlkOmZhMjMyOGFmLTQ4ODItNGVhYS04YzI4LTY2ZGFiNDY5NTBmMSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjcwMjZmODQzLTgwZGUtNDVmNi05YzJlLTRkN2UzMzgxOWY4NzpzdHJpbmc6T3JnYW5pemF0aW9uIiwibmFtZSI6ImRjMjEyMGM3LWE1M2QtNDY1ZS1hODI0LTI0NTdhOTY5NzNjMTpzdHJpbmc6TWFjUml0Y2hpZSBNZWRpY2FsIENsaW5pYyIsInR5cGUiOlt7ImNvZGluZyI6W3sic3lzdGVtIjoiZTU0ZTM3ZTYtNTgxOC00ZTQ4LTljOTYtZWY1NjlmMzNjNzIwOnN0cmluZzpodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL29yZ2FuaXphdGlvbi10eXBlIiwiY29kZSI6ImE5ZTVmMmExLWFlNzEtNDcyNS05MjVjLTU2ZmMzNDNjN2FmZTpzdHJpbmc6cHJvdiIsImRpc3BsYXkiOiIwZjFjNWZmZi1lYzJkLTRkYjctYjVmMS03MDMyMDBmYTY1NGQ6c3RyaW5nOkhlYWx0aGNhcmUgUHJvdmlkZXIifV0sInRleHQiOiJiMzgyMDg5Zi1iM2NhLTQ0ZjMtODJjOS1mMDAyMmIxZTlmMjM6c3RyaW5nOkxpY2Vuc2VkIEhlYWx0aGNhcmUgUHJvdmlkZXIifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImVlMjRmYzdlLTRjMGQtNDkzZi1iZTAxLWI0ZDdjYTQxMjVmNTpzdHJpbmc6dXJsIiwidmFsdWUiOiI2ZDMxMWJiMy00ZjQ5LTRkZjQtYmIwNi0zOGQ1MDQyNTg2MzQ6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0seyJzeXN0ZW0iOiJhOGY5NmQzNy1mYTZiLTQwY2MtOGRmMi1lMGEwYzE4MDE0Y2U6c3RyaW5nOnBob25lIiwidmFsdWUiOiJkMTRhNmI1YS05NTBiLTRhZDAtYmEzYi01NjdmMTk1M2IzNGE6c3RyaW5nOis2NTYxMjM0NTY3In1dLCJhZGRyZXNzIjp7InR5cGUiOiIzZDk2NzY5ZC1mZmM5LTQ5ZGQtODI1NS02NTIzNjA1Y2MwNTQ6c3RyaW5nOnBoeXNpY2FsIiwidXNlIjoiYTg3N2EyNzktY2Q2OC00ZmQyLTg0NmUtZTUyOGJlOTYzYmQ4OnN0cmluZzp3b3JrIiwidGV4dCI6Ijk3ZjNlZGY5LTk3ZTAtNDcxZC04ZmJiLThmNWUwZDAzMjc1NDpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCwgVGhvbXNvbiBSb2FkLCBTaW5nYXBvcmUgMTIzMDAwIn19XX19LHsiZnVsbFVybCI6ImFiMmRkOWI4LTE2ZTAtNGZhNi1iZTExLTIwMjMzZmU1NjgyZjpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3IiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiZTc4NzdhYWQtZTk1Mi00ODQ5LTk2MGQtNTVkZjc4MDdmZjhiOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiYjk5ZmYzNGEtZTg2NS00ZThmLWJjZGUtNzMwOTNmZWI1NjNmOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6ImUzZDA4MDUyLThlOWUtNDk1MS1iZDlmLTE2ODUwM2UyYjk5MjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiIyZGY4OTk0ZS1jOTE4LTQzYTAtYTdiMC0xODcwM2IwMDQyZDA6c3RyaW5nOnByb3YiLCJkaXNwbGF5IjoiN2VhNGFlODUtN2I5Mi00MWEyLWJjN2EtYmMzNmRjNTlmMzU1OnN0cmluZzpIZWFsdGhjYXJlIFByb3ZpZGVyIn1dLCJ0ZXh0IjoiOTg0ZDcyOWEtM2UxNi00OTcyLTk4OWEtMjBjZGJjMTk1MTQ0OnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjhkYjBjNDdkLWUwMDQtNDczYS05NWUwLWQ0OWU4MzVhOWIzNTpzdHJpbmc6dXJsIiwidmFsdWUiOiJkYzBjMTcwZC0xZmNmLTQ5ZmQtODZjOC04ZWM0N2RmNmMzNTM6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVsYWJvcmF0b3J5LmNvbS5zZyJ9LHsic3lzdGVtIjoiNTM0ZjI5YjgtNTg3ZC00YzQzLWE2ZWEtNDhjODQxZTBkMWQ2OnN0cmluZzpwaG9uZSIsInZhbHVlIjoiMjYxYmNhNzktNDg1NC00ZjQxLWJkZmMtOGQ3ZGM4YTQxZjhkOnN0cmluZzorNjU2NzY1NDMyMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiNDg4MDg3MmItNzZmNS00Mjk1LThhOWQtZTdmYzZjNWEwOWVjOnN0cmluZzpwaHlzaWNhbCIsInVzZSI6ImRmZWJiNTdjLTY5ZDAtNGNhNy1hZWQ1LWMyODY2NTEyZDY2ODpzdHJpbmc6d29yayIsInRleHQiOiIyNGIyYWM1ZS03MTBhLTQ3YmUtOThkOC03YjFkMzg1MTI1NDg6c3RyaW5nOjIgVGhvbXNvbiBBdmVudWUgNCwgU2luZ2Fwb3JlIDA5ODg4OCJ9fV19fV19LCJpc3N1ZXJzIjpbeyJuYW1lIjoiYWViOWIzN2YtNDdhNy00YzY3LWI5YzctMzZkYWQ2YTJhYWFiOnN0cmluZzpTQU1QTEUgSVNTVUVSIChETyBOT1QgVkVSSUZZKSIsImlkIjoiYzQzYTVhZDktZDMwMC00YjVmLTgzYjgtYTQxM2QwYjlmZmIzOnN0cmluZzpkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAiLCJyZXZvY2F0aW9uIjp7InR5cGUiOiI1ZjVmNmI3Zi1lMGYwLTQyNWQtYTU3Ny0wNWQ4MTlmMGRlMWY6c3RyaW5nOk5PTkUifSwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiOGFjOWZlYWMtMWM4My00MWEwLTkzMGMtM2FhODRmOTFkM2U5OnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI2OTk3MjJiNC1kM2YxLTQ5MmQtYTQ2ZS0wY2Q0ZTdiNmRhNTc6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6IjFmMjU2MTQ2LTJhY2YtNGMzNC04MDQ5LTMwYTM5M2ExNjczMDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCIkdGVtcGxhdGUiOnsibmFtZSI6ImQ5ZjczNjljLTVlZmYtNDg2Ni04NDRjLTc5NzU1Nzk4MmRmYzpzdHJpbmc6SEVBTFRIX0NFUlQiLCJ0eXBlIjoiZTU3MGIxOWUtNzJmZS00ZTA0LWFmMjUtYzVkMjM3ZTRhZGQzOnN0cmluZzpFTUJFRERFRF9SRU5ERVJFUiIsInVybCI6Ijk5YzM2Mjk1LTllNzYtNGE4ZS05ZDNjLWFjMzY5Y2ZhMjIyYzpzdHJpbmc6aHR0cHM6Ly9oZWFsdGhjZXJ0LnJlbmRlcmVyLm1vaC5nb3Yuc2cvIn0sIm5vdGFyaXNhdGlvbk1ldGFkYXRhIjp7InJlZmVyZW5jZSI6ImFjY2E0M2YwLWE4ZTAtNDNiZC1hMDYyLTNhN2Y5NzY5YmUxMTpzdHJpbmc6YzVhZDE5YmItNDAzYy00YjUyLTk3MWQtM2YwMWU4Nzg4M2UzIiwibm90YXJpc2VkT24iOiIzZjY4N2QwYS05OTJhLTRlY2UtOGIyNC0xMjMzMzJkMjRhZjY6c3RyaW5nOjIwMjEtMDktMjdUMDg6NTc6NTkuODgzWiIsInBhc3Nwb3J0TnVtYmVyIjoiMWFmNjVlMjAtNThiYy00YWM3LWFiNTktZmEwOTk2ZDAwMGFjOnN0cmluZzpFNzgzMTE3N0ciLCJ1cmwiOiI0MjdkMzFhMC02YWFkLTRjOTMtOGUxYy0wNjU2OTkyZmJkZWI6c3RyaW5nOmh0dHBzOi8vYWN0aW9uLm9wZW5hdHRlc3RhdGlvbi5jb20vP3E9JTdCJTIydHlwZSUyMiUzQSUyMkRPQ1VNRU5UJTIyJTJDJTIycGF5bG9hZCUyMiUzQSU3QiUyMnVyaSUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXBpLnN0b3JhZ2Uuc3RhZ2luZy5ub3RhcmlzZS5pbyUyRmRvY3VtZW50JTJGZGM2NWRjN2QtMDVhMy00ODk1LWFkODAtOGRjNGE5MGFkZDFmJTIyJTJDJTIycGVybWl0dGVkQWN0aW9ucyUyMiUzQSU1QiUyMlZJRVclMjIlMkMlMjJTVE9SRSUyMiU1RCUyQyUyMnJlZGlyZWN0JTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZ3d3cudmVyaWZ5Lmdvdi5zZyUyRnZlcmlmeSUyMiU3RCU3RCMlN0IlMjJrZXklMjIlM0ElMjIxMGQ1OTk1NTk3YjY4YWNhYjM5NDBjNTNkNzQzM2QyYTRlMWE0YzIzMWI2N2Y5OWUyODQ3Y2I0YjE3ODEwOThlJTIyJTdEIiwic2lnbmVkRXVIZWFsdGhDZXJ0cyI6W3sidHlwZSI6IjA5NzlhMzkzLTA3YmItNDUxNC04MWY5LTg1MjlmMjNiMDUxMjpzdHJpbmc6UENSIiwicXIiOiI3NzkxZWNlOS1jYjRlLTRiZDItODVmMS03YmIwNTUxMGVlZGU6c3RyaW5nOkhDMTo2QkZLJUdBIDlIV1JIMjNNTEJDRkdDRk8wV0c0WTVYSEIxUkYlVDcwR1I1UVVOODdNVTZOJTRQK0pXQ0s6T0pEUTQvTTJQK01FMlNNTUczU0EyM1YwNjBNJFIuS01aMjRMRVMxR084KzBERTJQLjVWSUhKR0slMEkzVVBTRUhTRjUkTUkwQTctWUsvQVVLRFVBM0Q6M0suS0o6NldZQ1RYUlIqLzFBNUsqK0pBS1QlMkVNUUQwQUZEIFQgLlBNMksgMDM0UFYyM04gTUxTIEVJJVRJL0FRRFNCMUFEWVRSVU1GJUVLSjBHREo4M1UgUTkxNzkgWlRQNVZON08qTDkyWjNOMzAgTlFKODREJENBKzY4T043K086UklLUVNKM0QuRzhMOEdOQUtNRDZENEVRVFBYNUIuKjNWOEhJN0FZSUJNNVZCK1FKUE5QU0ZaU1MtLzQrRVNCVDUrIEI5NDAyNjIqMzJRQVRCN0MxWVFZTkU1MDBPMTNUUk9NR0dFNDVZLkktSTJGLkwlUTI1WVFBVjJCJEFTODdNRTdLOU5ZUkw6LzhYWFNDUFMvOUw6OUVSNTM3TDg2V09QTTUtQjZET0pJUTZPME5ON0ExUEZKLlQxJU9UWDlFL1QgOUo3LkZFQUtGSk06MU5XWVZCVFI2WVMgQURCN1I6Q05TVURWIEQrM1FQREQlTU1QUEpVSUxLUUJXWExIWkFOLUpMUDlYRTUzMUJISEpYVkRBKkUzRVAkN0E6SEM3KkMgWEtFIEs4V0JZUTcrTjZOTFQyJUFJSElQIDYrTkVYVDVEVEFLU09GS0g5LzZPKkQ1MTE2JEhGWUklRTZUJUJCS0VQTjkuRTlGVVA1NElURldZSk1SMlBRK1QzNjdaNkNJNE9MWDI4UExBKk5aMlMtWkhFSEFUOkZMNzRaOlYrN0tSV1FPMVU2SkgwWDg5OVVMRVEvSTJSOjVCLjhUMUpRNEw6M0sgVk0tN0pSJU5NOlRLMk46MEItSjFHUFBZTEhCMUVFVlNJLzkgWDNRIDAuVkQ2RDgkWFFDTUg6RU9OWE9YU0FETFZZJDhTMVQ5ODFDNjVRRTYtTVE2VDZXOkgkKjZTOVc1WlNDJFJKVjhPRFQ0MjdITUJLRjczJFJMLTZSUzI4LUIvQ01PVzgwKlRGQUUkRDJMKkc1VUtaR0RBTUVNVkhQQTJHVjI4N1BJSVVOQlFGLko0SkYtJFRITEYkUk1XOUUxTDZOL1BNSTVHVkgtOjA3U0dNTDA3WEZOWDYwSzdILlZFUEFTL1BCWVFXLjZMWDk3MkRVTk0uWVAxSlA5MTJPUjlZNVBJNkRXQUdOT1AxTFVWOFBOR1ZaSjg4LktUWkdJV1NITkc2N1VYMzFZMEUwUFZTREZCUlZQTjBUQ0lKVU0kVEZYOVc3OjNUQjI0S05TWTRMSUZESU8lMUMlMFcrLlUgK0pTNkdOOVcwMVUtMTg0S0RWL1ZXQVQuRVVTJUZLK0RGJFRJNlAxSlRaQlNVMEVIQVcqNFc4MjlXNUVDUTdRMFJUVk5ULUZRWVY0N0UzVTE0UlM1MSJ9XX0sImxvZ28iOiJhYjM2NTEwZC1mNjFjLTRiZDgtOWIwNi0yODhlNWY1ZmI1MmE6c3RyaW5nOmRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZlFBQUFESUNBTUFBQUFweCtQYUFBQUFNMUJNVkVVQUFBRE16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXplQ21pQUFBQUFFSFJTVGxNQVFMK0E3eEFnbjJEUDN6QndyMUNQRWwrSS9RQUFCd2RKUkVGVWVOcnNuZDEyMnlvUVJ2a0hJU0hOK3ovdHlVazlvVEVDUTFiVEJjMjNieU5zMEI1R0lEQVJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBaytJaytJZHg0ZzVONEI5R1EvclBBOUovSVBmU2d3TC9NRUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHdQNVpQb1A1cjdGSktBZjdjdWZCaWhQTlNrWDVobEE5dStEc1A3ZFgvSksxUDJWUGlTSW9lYkVyTHdWaDVaeCs4QzFZMjJZdFAwRnBmNmhkZWErbXExV2xpeGZlajZSY0R4ajA5c3dYYmJlQlFwaWp1ZzIwYWovU0U4YnZvNWhFdWF2QXVTS3BRZkp4VEc5MWdVckNWNmpTUUUwb1BrZTR3dWtlNzA1RXFwTE5XeHRNdFNrNGp2WEdsZCt0TGx4dlZNTm5ha0Q3bUVuZFlUVldTblY4NjBXVVhsMzRSTXk3QmVtcHlHek43cEFibVhFQTZiZnZLMHUzMnVURktLVk0wcjBZdzFNVGNGdnA4aVZMUEQwKzlnSFF5KzdyU2YzZWVqcDJIdUZjc21sZGlFejBGektYZlNSdzNxZTA4WHFkOWRQNlFLT05ua3U0bEczTlNiL1JCdEt0S3QxdHRkQkppWWIyVkk3YnJjN3RjOElZb3RKekhVQjBjK08rVDNyVFF1TEtzWlJxcHprVFM3ZFpJNHZvK3FKbmRFR084RXplY3lqYWM2L0lUTjJLT1dhVUxJVC9hTGRlVW5xcGRpN1ZXMitLeWMyOUZMM3M3ZTNoaTVMVFNoZVdXcHlXbEg0WHptdldqbmlPaUZOM1lXRGl2V0k5Mld1azVjdDJDMHAzSnpsOVlONjZXSTVJVi9WeUY4NnIxYTE3cEg1VU1DMHBYL0R3WFZVNTI0S3M1WWdEWm1MNHpHejF3ODBwMzNQajFwTXZjaSt0YzJjRklqbWhIMmRXVmZ1YVZMdUxqeTllVHpncU9ycWV3djB2dW0vMUtSNCsyYTZEaDVwWE83VjlPK3M0S1JKUEFEdXhOanRqRkNDay9DbHRFemdmelN0ZXJTdmRaUVplRG95eXF4UWd1UjFsWG1CbEkvOVBTZWJacGJPZThiaXZ0MmJGSzlZYUs0ZUhlN05MTmF0TFAzcUdZTGZMNzFSb012QjZYdTk2SjNUV3Q5TFRvUU01em04WWZ4YkhJRVNQWlhYVy90b3ZUU28rUHFGeE5lc3dacWpPL1gwOU92QmdpOU9jSHc3bGxVdWtjditkaTBybmVxZjk5dVhvS2dsTU13YWxsN3gvbXkwbWxQNXBpVm52M2Z1WisxOTN4bnBUWUx6M1NqZWpQTFhwTzZUdFhielhwZklVY2VKSG1Qc1hBSnNiSSthTDdmdnNwcFZzT1g3dWFkSjlGdnVUNjNQeHNaQVEzVU14eWdMeVd2c2s2L2x1a3U0MGZiOHR0b2xERkZiMVpRUTYvbVJrdjFpVzlpMUo2Qy8xYWVqQWN2UVBWbVV0NkZCMmNuMjZKekRPNFRzYUxjV2VhVGJvN0luMDRYMDg2OTZYeFRucmttekdDSGltbUpwTHVOYVBpNzFmK0tPa3RlNUlLOU9yUzc0aW5nUFNmSmQxb0lTRDlaMG0vaFBoQjBvKy9MZDNNTUdVclNVNjhzOXlVelhTTzNzdWhXK0JoK0pqMG95ejJzblpxZ3BjemQ1aXdwdlJ2bUtmWHBZL1AweWVTZnNnSE9obGl3dExTN2NCU2lSMWFaRlAzMHErQnQzZlhiSzloUTJUcis0clNjKzhkZmxYQ08ybDZwWStQSXM1cEYxeHM0a21iWFZCNnowSldSUmRIKzZCMHc4VmVveWRlV2xWODR4YVVMbnZYMDh2RXpObitISk91K3RmVDFjU2JLUExld3ZXa2MvYzEvWXRzNFNsSitESHB1bnNGMzA2OVhTcnc3VmhRZWw0Z0hOM1F1SE84akVrL084Y0MrVW8vcFhSK3ZHMExTbi9aWHhsWHlJb2M2MFBTaGVsZHd2ZHpiNEhXM0k3MXBPLzB3SFlxT0lwOHY0MUpUNTJUTmpmNWp4MjRmbUU5NldMckc3L2Jzb002ZWhDR3BKOHMwL1pWM2s4cW5UT2RYMUI2NkhPZ2I0YjVLUmZ0bDU0ZkM3b3Z5dlpacFh0Nkp5NG8zWnFlZE92TVRkc2xQVWhEMHJsV3h2Vk1GdFMwUDFVT25QdldrODRYZGIwRElYVy9rSGlNU0xlbTdyTU1LRG10OUowSG1ndEsvM0JnN0doZ09HTENnUFQ4YWZwMXBkVEV4NDg4Nm5ndEtGMmM5T3BzZ1ZEYk9LQ0pPUWFraSsxVnJGaSt3cmlKcGZOYS9vclNoY3JXMjg2akxZc3l5ZlpMbDhTRXRuTTY1ajFTTEgrd1hWRzZqYzBEWUk5ODZGdWpLSm5RTFYwYzFNcnc3c081bi9md3dEZmtvajlnZkQ0b3poeUZBVVZNcUJSbFlyQ2Qwb1VuUnJraXlFek9QRk5MRnpUelQ1VmxCWGQzT204b3prQnRPT2REUFprVTlrOS9QQ3BMa0hhcm5aVWZJaFhPdjAvNklTdjBTT2N2ai8xYjl0emZrTjVHM3g3ZWJkSWgzNFdmRjZ0cERycllLNlBVcGQvNGZKUzNicFhhcnRPSk4rU1JEQlhPdjBsNm02RXpaMXozNWx3OWszUk8wMVdNRkJVNEg0KzIxbE1iYjhYczB2bHZZVkhwM1BVcUtDY2FPRFVzbmJOTFNSNWNUQytkWitwcFZlbENuS2ExMTdlTlROUWtTVkZpVTJ0UCtRclNPVnZaWmFVTHF3dnRQQ2gvamRNYjNSTjk5UU9rb2p2OExzUVMway9PNyt0S2YrTk1UOTZOUDBVdkx2aW5SbTlKbjI0d1ZyYkRDYkdJZEY0eFZCTkoveEpTZTZVZW8vQmovOUkvN0R5MFB2cm5KeTVvcFNJUlJaWDBhUVVBQVB6WDNoM1VBQUNBUUF4N1lBRC9hbkZCQ05kYW1JQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBbW1vZUs5SHppQjVJOUVCWG54OEFBQUFBQUFBQUFMQm1BSVpLbXpXSW54eU9BQUFBQUVsRlRrU3VRbUNDIiwiYXR0YWNobWVudHMiOlt7ImZpbGVuYW1lIjoiN2YzZmY1ZmMtZTEwOC00OWE2LTljNmUtMTBmMDdlMzg0MGI3OnN0cmluZzpoZWFsdGhjZXJ0LnR4dCIsInR5cGUiOiI3NmU3ZGZkYS1kNGY3LTRlYTEtOTc0Ny02MDcwYTlhNjJiNDA6c3RyaW5nOnRleHQvb3Blbi1hdHRlc3RhdGlvbiIsImRhdGEiOiJjMTU1YzY3Ni05Yzk2LTRmM2MtOTYzYS0yYTU2OTJmMTdiYzU6c3RyaW5nOmV5SjJaWEp6YVc5dUlqb2lhSFIwY0hNNkx5OXpZMmhsYldFdWIzQmxibUYwZEdWemRHRjBhVzl1TG1OdmJTOHlMakF2YzJOb1pXMWhMbXB6YjI0aUxDSmtZWFJoSWpwN0ltbGtJam9pTnpZNU16Y3hNRE10TnpkbFppMDBOMk14TFRrNU1USXRZbUk1TW1Sak5EZ3lOMlZoT25OMGNtbHVaenBqTWpNMU5tVXpZaTA1TURBNUxUUXlNakF0WVRGall5MHhZV1k0WkRNME1qQmtZV1FpTENKMlpYSnphVzl1SWpvaU56RmhOV1V6T1RndFkyRm1NaTAwTkRRNExUZzJOelF0TVRBd1l6Z3hOR1prTnpCaE9uTjBjbWx1Wnpwd1pIUXRhR1ZoYkhSb1kyVnlkQzEyTWk0d0lpd2lkSGx3WlNJNklqTmtaV1ZrTnpFeExUSmlOR010TkRFMlpDMDRZVEJtTFdNeU1UQTFNelF3TURkbU9EcHpkSEpwYm1jNlVFTlNJaXdpZG1Gc2FXUkdjbTl0SWpvaVpEVXdNRGhtTUdJdE9HTTFOQzAwWXpRMUxUazVaR0V0WWpFNE56a3hZMlZpTWpZMk9uTjBjbWx1WnpveU1ESXhMVEE0TFRJMFZEQTBPakl5T2pNMkxqQTJNbG9pTENKbWFHbHlWbVZ5YzJsdmJpSTZJbUZrTnpkallqRXlMVE5sWmpndE5HWmpaaTA0TW1WakxUSmtPVFl5WVRsa1pEUTRORHB6ZEhKcGJtYzZOQzR3TGpFaUxDSm1hR2x5UW5WdVpHeGxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJalpqTURrM1ltSTBMVEkzWWpRdE5EQTBZeTFpTlRWaUxUSTNNbUk0WlRrd05HTXhZenB6ZEhKcGJtYzZRblZ1Wkd4bElpd2lkSGx3WlNJNkltWTFOakF3TURZeUxXSXdaVGd0TkdWbVpTMWhORGhrTFRNeFpqZzBNalk1TVdZd1lqcHpkSEpwYm1jNlkyOXNiR1ZqZEdsdmJpSXNJbVZ1ZEhKNUlqcGJleUptZFd4c1ZYSnNJam9pWkRWaU9EYzRaRFV0TVRka09TMDBPRGN5TFRrM09UY3RZVEUyTVRSaE0yWTBZekUzT25OMGNtbHVaenAxY200NmRYVnBaRHBpWVRkaU4yTTRaQzFqTlRBNUxUUmtPV1F0WW1VMFpTMW1PVGxpTm1SbE1qbGxNak1pTENKeVpYTnZkWEpqWlNJNmV5SnlaWE52ZFhKalpWUjVjR1VpT2lJellXTTVObVJsT1MweU5EUXhMVFJrTXpJdFltRmxOUzA0WkdOaVlqQmtNamd5WldVNmMzUnlhVzVuT2xCaGRHbGxiblFpTENKbGVIUmxibk5wYjI0aU9sdDdJblZ5YkNJNklqUmtOREUzTUdVNUxXRmtNRE10TkRreU55MWhPRGMxTFdReVlqYzBPV1V5WkRCbU5EcHpkSEpwYm1jNmFIUjBjRG92TDJoc055NXZjbWN2Wm1ocGNpOVRkSEoxWTNSMWNtVkVaV1pwYm1sMGFXOXVMM0JoZEdsbGJuUXRibUYwYVc5dVlXeHBkSGtpTENKbGVIUmxibk5wYjI0aU9sdDdJblZ5YkNJNkltSmtaVEkwTlRWbExURTVZall0TkRjeU5pMDRPVGcxTFRSbE9HVmhOV1V4WWpVMU5UcHpkSEpwYm1jNlkyOWtaU0lzSW5aaGJIVmxRMjlrWldGaWJHVkRiMjVqWlhCMElqcDdJblJsZUhRaU9pSmhNbU0zWVRBME15MHhPV1kyTFRReFptRXRPR014T1MxbE5XTTJZMkUzTkRBeU56azZjM1J5YVc1bk9sQmhkR2xsYm5RZ1RtRjBhVzl1WVd4cGRIa2lMQ0pqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpoaFpEVTJORFkzTFdOaU16TXROREJsWXkxaU5USXhMV0UzTVRJek1XVmhNR1UxTnpwemRISnBibWM2ZFhKdU9tbHpienB6ZEdRNmFYTnZPak14TmpZaUxDSmpiMlJsSWpvaVlqUTBNbUZpTlRRdFpHTTROQzAwTUdObUxXRTBNbU10WXpjMk1tSmhNVGcwTVRZNU9uTjBjbWx1WnpwVFJ5SjlYWDE5WFgxZExDSnBaR1Z1ZEdsbWFXVnlJanBiZXlKcFpDSTZJalJpWlRrNFpHRmlMV0pqWldZdE5HUTJNUzA0WkRZMkxUTmlZMk0yWmpCaVptSXpZanB6ZEhKcGJtYzZVRkJPSWl3aWRIbHdaU0k2ZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqSTRPVEl5TkdSbUxUSTBabUl0TkRneFppMDRPVE0wTFRWaFlUVmtOR0l4Tm1WbU16cHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOTJNaTB3TWpBeklpd2lZMjlrWlNJNkltWm1NR1V3T1RKaUxUTmtPV0l0TkRFM05pMDRZalprTFRNeU1HRXlPVFZoWkRsaVl6cHpkSEpwYm1jNlVGQk9JaXdpWkdsemNHeGhlU0k2SW1VNU5tSXhOalEwTFRnMFkyVXRORGxrWVMwNE5XUmtMVFEyWXpJMU5qY3hZV05qTXpwemRISnBibWM2VUdGemMzQnZjblFnVG5WdFltVnlJbjFkZlN3aWRtRnNkV1VpT2lJek1UUTRZV1kyWWkweE1UaG1MVFE1WldFdE9XUXpPUzFoT0RCbFl6bGpNemhqTUdJNmMzUnlhVzVuT2tVM09ETXhNVGMzUnlKOUxIc2lhV1FpT2lJNU5HVXpORGs1WlMwNFlXVTRMVFJpWmpjdE9EZ3hNUzB3WkdNeU1HUm1NVFl3T1RRNmMzUnlhVzVuT2s1U1NVTXRSa2xPSWl3aWRtRnNkV1VpT2lJMk1USmpOREV5TUMxaE0yRXdMVFEwTVdRdE9URm1NeTFqTmpVd1lqbGhNMlUxTVRJNmMzUnlhVzVuT2xNNU1EazRPVGc1V2lKOVhTd2libUZ0WlNJNlczc2lkR1Y0ZENJNklqRTVZamhsTURJMExXTXdZekF0TkRRME5TMWlNVEUzTFRWak1qWTRabUZtWXpGbFpUcHpkSEpwYm1jNlZHRnVJRU5vWlc0Z1EyaGxiaUo5WFN3aVoyVnVaR1Z5SWpvaVkyUTVaVEUwTVdRdFlUWmxZaTAwWkRrNExUazNNMlF0WkRZd01UY3pOV1V6TlRJNE9uTjBjbWx1WnpwbVpXMWhiR1VpTENKaWFYSjBhRVJoZEdVaU9pSTJOVE5oWW1Gak9TMHlNalV4TFRRelkyWXRPV1JpWXkxbE5XTTJOemcyTTJVM00yVTZjM1J5YVc1bk9qRTVPVEF0TURFdE1UVWlmWDBzZXlKbWRXeHNWWEpzSWpvaVpUUXlaRFF3WTJVdE9UWTNZaTAwWVRFeUxUa3pNRGt0WldVMU1tVTJNR05oTTJVME9uTjBjbWx1WnpwMWNtNDZkWFZwWkRvM056STVPVGN3WlMxaFlqSTJMVFEyT1dZdFlqTmxOUzB6Tm1FME1tVmpNalF4TkRZaUxDSnlaWE52ZFhKalpTSTZleUp5WlhOdmRYSmpaVlI1Y0dVaU9pSTNZVFF6TWpneE1TMWpNVFZoTFRRM01EUXRZakEyWXkweU56VXpZVFl6T1RFMU1qWTZjM1J5YVc1bk9rOWljMlZ5ZG1GMGFXOXVJaXdpYzNCbFkybHRaVzRpT25zaWRIbHdaU0k2SW1VMFl6RTJOREpsTFRGaE1UQXROR1k1WmkxaFlXVTJMV1V3TmpVM1lqSmtaalU0TURwemRISnBibWM2VTNCbFkybHRaVzRpTENKeVpXWmxjbVZ1WTJVaU9pSXpNVFkwWXpWbVppMWpPV00xTFRReFpEVXRZbVl6Tnkwd1pETmhZakV3TVRJMU1URTZjM1J5YVc1bk9uVnlianAxZFdsa09qQXlOelZpWm1GbUxUUTRabUl0TkRSbE1DMDRNR05rTFRsak5UQTBaamd3WlRaaFpTSjlMQ0p3WlhKbWIzSnRaWElpT2x0N0luUjVjR1VpT2lJMU9USmpaRFZoTWkxa05tRTBMVFJoT0RjdE9ETmpOaTFpTW1RMVlUVTVZMkUxWXpNNmMzUnlhVzVuT2xCeVlXTjBhWFJwYjI1bGNpSXNJbkpsWm1WeVpXNWpaU0k2SWpFMk1UVTVNVGxqTFRJeE1XVXRORGMyWlMwNU5qVTJMVGRrTnpreU5HUXlZekU1TlRwemRISnBibWM2ZFhKdU9uVjFhV1E2TTJSaVptWXdaR1V0WkRSaE5DMDBaVEZrTFRrNFltWXRZV1kzTkRJNFlqaGhNRFJpSW4wc2V5SnBaQ0k2SW1FeFpEaGtNRFJtTFdJNFpUUXRORFk0WXkxaE9UUXpMV1EwT1daa05XVmhZbVprTkRwemRISnBibWM2VEVoUUlpd2lkSGx3WlNJNkltTTFNek5rTmpnM0xUZGtNbVl0TkRaaE9DMDRPR00xTFRObFlXSXhaREJpT1RVek5qcHpkSEpwYm1jNlQzSm5ZVzVwZW1GMGFXOXVJaXdpY21WbVpYSmxibU5sSWpvaU9ERXlZVGxpWWpVdFlUZ3dNUzAwWWpkbExXSmpNV0V0TUdRMk56VXlNR1ZoTm1ZNU9uTjBjbWx1WnpwMWNtNDZkWFZwWkRwbVlUSXpNamhoWmkwME9EZ3lMVFJsWVdFdE9HTXlPQzAyTm1SaFlqUTJPVFV3WmpFaWZTeDdJbWxrSWpvaU9UazVNMkkwT0dZdE9UUTRZeTAwTnpKa0xXRmpNMkV0WXpoalpqUXhNVEZsTkdOak9uTjBjbWx1WnpwQlRDSXNJblI1Y0dVaU9pSXdaamhqTWpRMk5TMDRaamd5TFRRMVltVXRZVE5sTkMxa05qazJORGRsTm1FNU16STZjM1J5YVc1bk9rOXlaMkZ1YVhwaGRHbHZiaUlzSW5KbFptVnlaVzVqWlNJNkltUTVNVFptTTJKbUxUZGpaREV0TkRnMU5pMDVORFkyTFdJeFl6WTNNV1UwWlRVMVpUcHpkSEpwYm1jNmRYSnVPblYxYVdRNk9ETTVZVGRqTlRRdE5tSTBNQzAwTVdOaUxXSXhNR1F0T1RJNU5XUTNaVGMxWmpjM0luMWRMQ0pwWkdWdWRHbG1hV1Z5SWpwYmV5SnBaQ0k2SWpNNU9UWXhNR0ZpTFROak9USXRORFpqTkMwNU1qQTBMVGt3Tm1Nek16TTBZelUzT0RwemRISnBibWM2UVVOVFRpSXNJblI1Y0dVaU9uc2lZMjlrYVc1bklqcGJleUp6ZVhOMFpXMGlPaUprTmpnMU1UYzFOQzFtTVdNd0xUUmxOV010WWpRek1DMWpNekptTVRZNVl6VTRNak02YzNSeWFXNW5PbWgwZEhBNkx5OTBaWEp0YVc1dmJHOW5lUzVvYkRjdWIzSm5MME52WkdWVGVYTjBaVzB2ZGpJdE1ESXdNeUlzSW1OdlpHVWlPaUptWXpOaE5UTTJZeTFsTUdGbExUUTFabVV0WWpsaU9TMDNaalUwWlRKbU4yUmtaamc2YzNSeWFXNW5Pa0ZEVTA0aUxDSmthWE53YkdGNUlqb2lOVEJpWkRobVl6a3ROREV3WlMwME9URXdMV0l5TkdZdE5qRmlOMkkzWVRJMVpqRTRPbk4wY21sdVp6cEJZMk5sYzNOcGIyNGdTVVFpZlYxOUxDSjJZV3gxWlNJNklqZGtZakprWkRGaExUZzNPVFl0TkdFd1l5MDVORGxqTFdNMFlqUTNOamRtTXpnd1pUcHpkSEpwYm1jNk1USXpORFUyTnpnNUluMWRMQ0pqWVhSbFoyOXllU0k2VzNzaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSTBObVl4TlRVd1lTMWhNR1l6TFRSaVlXTXRPV013WXkweE9UYzJOakptTkRkbVpXVTZjM1J5YVc1bk9taDBkSEE2THk5emJtOXRaV1F1YVc1bWJ5OXpZM1FpTENKamIyUmxJam9pTlRBNU1tVTNNVGN0TTJSaFlpMDBPVEl3TFdGbU0yRXROREEyTlRFMU1UUmlaRFppT25OMGNtbHVaem80TkRBMU16a3dNRFlpTENKa2FYTndiR0Y1SWpvaU9UZGlaV1prT0RJdE4ySTRZeTAwTTJJMkxUaGxaak10WmpGaE9XVTJZalE0T0dVMU9uTjBjbWx1WnpwRFQxWkpSQzB4T1NKOVhYMWRMQ0pqYjJSbElqcDdJbU52WkdsdVp5STZXM3NpYzNsemRHVnRJam9pTW1JNE1EZGtZelV0TW1aaE9TMDBZVEUxTFRnNFlXUXRORGs0T1daa09EWXlObUpqT25OMGNtbHVaenBvZEhSd09pOHZiRzlwYm1NdWIzSm5JaXdpWTI5a1pTSTZJbUV3WXpFM1pHWmhMVFZoTVRrdE5ERXdZeTFoWkdKbUxUZzNaamxqTXpZeVpXWmxNVHB6ZEhKcGJtYzZPVFExTXpFdE1TSXNJbVJwYzNCc1lYa2lPaUprTlROa1pXUmxOaTFoWW1FM0xUUTROREV0T1Rjek1DMW1Oek5tT1Roa05EUXlNakE2YzNSeWFXNW5PbE5CVWxNdFEyOVdMVElnS0VOUFZrbEVMVEU1S1NCU1RrRWdjR0Z1Wld3Z0xTQlNaWE53YVhKaGRHOXllU0J6Y0dWamFXMWxiaUJpZVNCT1FVRWdkMmwwYUNCd2NtOWlaU0JrWlhSbFkzUnBiMjRpZlYxOUxDSjJZV3gxWlVOdlpHVmhZbXhsUTI5dVkyVndkQ0k2ZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqSTJORFUyTldWaExUZzVNamd0TkRoa1lTMDRORFV6TFRSaFpHSmxaR00wTm1JNE56cHpkSEpwYm1jNmFIUjBjRG92TDNOdWIyMWxaQzVwYm1adkwzTmpkQ0lzSW1OdlpHVWlPaUpsTkRnMlpqUXdOaTB3TldOakxUUTFNbUV0T0dZM09TMWpNVEpoT1Rsa01tSTNORFk2YzNSeWFXNW5PakkyTURNNE5UQXdPU0lzSW1ScGMzQnNZWGtpT2lKaU1tWTBNMlkwWVMxbU9XUm1MVFEyWW1RdE9UQXpPUzFsT0RKalptWTRPV0UxTldRNmMzUnlhVzVuT2s1bFoyRjBhWFpsSW4xZGZTd2laV1ptWldOMGFYWmxSR0YwWlZScGJXVWlPaUl6WXpobU1ESTNNeTAxTWpsaUxUUXlZell0WVRka01TMDVaalZsTVdNek1ERm1ZVE02YzNSeWFXNW5Pakl3TWpBdE1Ea3RNamhVTURZNk1UVTZNREJhSWl3aWMzUmhkSFZ6SWpvaU4yTmhNR0prWm1RdFlqUmtNQzAwTURJMUxUbGxNR010WVRJMk9XSTJaRFExWlRObE9uTjBjbWx1WnpwbWFXNWhiQ0o5ZlN4N0ltWjFiR3hWY213aU9pSTFORGcyTTJNM05DMWtaalprTFRRd01tSXRZbVprTVMwM01UUTRZV1prTVRZeE5qZzZjM1J5YVc1bk9uVnlianAxZFdsa09qQXlOelZpWm1GbUxUUTRabUl0TkRSbE1DMDRNR05rTFRsak5UQTBaamd3WlRaaFpTSXNJbkpsYzI5MWNtTmxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJbVUyWmpobFpqQXdMVGc0T0dJdE5EazVZeTFpTURBMExUUmtNV05rWldRM1lqTm1NRHB6ZEhKcGJtYzZVM0JsWTJsdFpXNGlMQ0owZVhCbElqcDdJbU52WkdsdVp5STZXM3NpYzNsemRHVnRJam9pTURGbE5HSTRZVEl0TVRjNU15MDBOVGt3TFRreVpXTXROekUwTUdRNU1qaG1ZVGMyT25OMGNtbHVaenBvZEhSd09pOHZjMjV2YldWa0xtbHVabTh2YzJOMElpd2lZMjlrWlNJNkltWTFOR0k0TWpFM0xXTmhPRFV0TkdJMU5DMDRZVE5pTFdZNU9URmtaVEUzT0RZellUcHpkSEpwYm1jNk1qVTROVEF3TURBeElpd2laR2x6Y0d4aGVTSTZJalU1WkROaE9UazNMVGszWmpBdE5HVTBNaTA0TmpNMExUVmtaREF3TkdFMU4yWXpaRHB6ZEhKcGJtYzZUbUZ6YjNCb1lYSjVibWRsWVd3Z2MzZGhZaUo5WFgwc0ltTnZiR3hsWTNScGIyNGlPbnNpWTI5c2JHVmpkR1ZrUkdGMFpWUnBiV1VpT2lJeU4yVTFZakl4TXkwd1lqSTRMVFEyWW1VdFlUVXlaaTFoTkRoak9UY3hNVGN5TUdFNmMzUnlhVzVuT2pJd01qQXRNRGt0TWpkVU1EWTZNVFU2TURCYUluMTlmU3g3SW1aMWJHeFZjbXdpT2lKbU5UYzFabUkzTUMwM00yTXpMVFJsWlRZdE9UUmpZaTFrWVRNNU1qTmlOVGt6T0dVNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pOa1ltWm1NR1JsTFdRMFlUUXROR1V4WkMwNU9HSm1MV0ZtTnpReU9HSTRZVEEwWWlJc0luSmxjMjkxY21ObElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNkltSmxNR015TlRSbExUbG1Oall0TkRnd1l5MDVOemcxTFdWbVpUSXpaRFkxTUdSbE9EcHpkSEpwYm1jNlVISmhZM1JwZEdsdmJtVnlJaXdpYm1GdFpTSTZXM3NpZEdWNGRDSTZJbVZrWVRrd04yWTVMV1l4TW1RdE5EYzFPUzFpTlRaakxXTTVPV0UzT0RZNVpEWm1aRHB6ZEhKcGJtYzZSSElnVFdsamFHRmxiQ0JNYVcwaWZWMHNJbkYxWVd4cFptbGpZWFJwYjI0aU9sdDdJbU52WkdVaU9uc2lZMjlrYVc1bklqcGJleUp6ZVhOMFpXMGlPaUpoTmpVNFltRmtOeTAyTkdSaUxUUTJaalF0T1RVMk5TMDBNekE0TWpVeU5tUmxOV1E2YzNSeWFXNW5PbWgwZEhBNkx5OTBaWEp0YVc1dmJHOW5lUzVvYkRjdWIzSm5MME52WkdWVGVYTjBaVzB2ZGpJdE1ESXdNeUlzSW1OdlpHVWlPaUppWkRBeFlXUXdZeTA1T1RGakxUUXpOamd0WVRrM1lTMHdZVEl4T0RjME9UQTNaRFk2YzNSeWFXNW5PazFEVWlJc0ltUnBjM0JzWVhraU9pSXdOamN6WVRnelppMDROek5pTFRRNE1EUXRZVGRpTXkwM00yVmhOR0V3Wm1RMlpUUTZjM1J5YVc1bk9sQnlZV04wYVhScGIyNWxjaUJOWldScFkyRnlaU0J1ZFcxaVpYSWlmVjE5TENKcFpHVnVkR2xtYVdWeUlqcGJleUpwWkNJNklqUmtZalJsWlRFM0xUTXlZamd0TkRrNE15MWhaVE5oTFdJd00ySmtaR0l5WlRVeU5UcHpkSEpwYm1jNlRVTlNJaXdpZG1Gc2RXVWlPaUl6TVRBMllXUmlZaTFsT1dWbExUUmlNbVF0T0dOa1ppMWlNMkV3WmpBeFlqWXlZbVU2YzNSeWFXNW5PakV5TXpRMU5pSjlYU3dpYVhOemRXVnlJanA3SW5SNWNHVWlPaUl4TVRWa05tUmxOaTB6TlRSakxUUTJZVGt0WWpWallpMHlZMlppWVRJd09UZzNNREE2YzNSeWFXNW5Pazl5WjJGdWFYcGhkR2x2YmlJc0luSmxabVZ5Wlc1alpTSTZJbUkyWW1OaE5qRTBMV1ZtWkdNdE5EWTRNeTA0TVdZekxUUTFPR1F6TWpRNE9HWm1aVHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZZbU0zTURZMVpXVXROREpoWVMwME56TmhMV0UyTVRRdFlXWmtPR0UzWWpNd1lqRmxJbjE5WFgxOUxIc2lablZzYkZWeWJDSTZJbVk0WWpGaE56STRMVGM1WW1ZdE5ESmtNUzFpTXpSaUxUaG1abVEyWlRNek5tSXhPRHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZZbU0zTURZMVpXVXROREpoWVMwME56TmhMV0UyTVRRdFlXWmtPR0UzWWpNd1lqRmxJaXdpY21WemIzVnlZMlVpT25zaWNtVnpiM1Z5WTJWVWVYQmxJam9pWTJZNU5ERXlaV1F0TnpNNE55MDBZVEl6TFRrNFpUa3ROREl4TWpSaE5UVmxaR1prT25OMGNtbHVaenBQY21kaGJtbDZZWFJwYjI0aUxDSnVZVzFsSWpvaU1tVmxPREprTm1FdE1UYzVaaTAwWVdFd0xXRTJZamt0T1RnNE16TmhabVF6WVdaa09uTjBjbWx1WnpwTmFXNXBjM1J5ZVNCdlppQklaV0ZzZEdnZ0tFMVBTQ2tpTENKMGVYQmxJanBiZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNklqUXpaR1ZsTWpNeExXSmpZek10TkRnd01DMWhNakEyTFdRNFlUSTBaV0kxTlRGaVlqcHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOXZjbWRoYm1sNllYUnBiMjR0ZEhsd1pTSXNJbU52WkdVaU9pSmpaRFU0WWpNeFppMDRNV1prTFRRek9HWXRPR1UzWlMweVlqRTJZVGN6TjJJMVpqVTZjM1J5YVc1bk9tZHZkblFpTENKa2FYTndiR0Y1SWpvaU1HWTRNMlEwWW1FdFkyWm1ZaTAwT0RnMUxUbGhNVFF0WkRBMFlXSXhZalEyWlRJeU9uTjBjbWx1WnpwSGIzWmxjbTV0Wlc1MEluMWRmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJamxsTVRrMU9EUTFMV00yTmpRdE5HUXpOeTFoWkdabUxXVXhNMlF6TVdZNFl6Z3lNVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lKaE5UaGhNRGxsTUMwME1qRXhMVFE0WkdZdE9UUXpNaTAwWldaalpXVmlOR1kzWldJNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMXZhQzVuYjNZdWMyY2lmU3g3SW5ONWMzUmxiU0k2SW1KbE1HRXlZV0k0TFRObVpqWXROREJpT1MwNVlqa3dMVGcxTWpVeVpURm1PVE15WmpwemRISnBibWM2Y0dodmJtVWlMQ0oyWVd4MVpTSTZJakl4TVRJNE1EUTRMV1ppTmpVdE5EWXpOUzA0TURFeUxUVmlORFJrTlRNd1pUa3hNRHB6ZEhKcGJtYzZLelkxTmpNeU5Ua3lNakFpZlYwc0ltRmtaSEpsYzNNaU9uc2lkSGx3WlNJNkltTXlOMkZqWkdNNExUQTJOVGt0TkRFM01pMDVZalUyTFdFMk1XVTNaalExTVdFeE5EcHpkSEpwYm1jNmNHaDVjMmxqWVd3aUxDSjFjMlVpT2lKa05XVmpPRFU1WVMxa056WmxMVFJsWldJdFlqRTBNUzAwWmpVd056bGlZbU0yT1RZNmMzUnlhVzVuT25kdmNtc2lMQ0owWlhoMElqb2lNekZoWVdOaU9XWXRNRGM1WmkwME9UZGhMVGd4TlRVdFpqRmpORE5oT0daaE16azFPbk4wY21sdVp6cE5hVzVwYzNSeWVTQnZaaUJJWldGc2RHZ3NJREUySUVOdmJHeGxaMlVnVW05aFpDd2dRMjlzYkdWblpTQnZaaUJOWldScFkybHVaU0JDZFdsc1pHbHVaeXdnVTJsdVoyRndiM0psSURFMk9UZzFOQ0o5ZlYxOWZTeDdJbVoxYkd4VmNtd2lPaUkyT1daa05tWmlZaTFpTUdSaExUUTNaRGt0WVdFeU5DMHpNV0ZqTlRZMU5ESTROemc2YzNSeWFXNW5PblZ5YmpwMWRXbGtPbVpoTWpNeU9HRm1MVFE0T0RJdE5HVmhZUzA0WXpJNExUWTJaR0ZpTkRZNU5UQm1NU0lzSW5KbGMyOTFjbU5sSWpwN0luSmxjMjkxY21ObFZIbHdaU0k2SWpGbFpqQTJNMlJsTFRJM05tRXRORGt5TlMwNU16VXlMV05sWm1NNU5qTTNaV0kyTURwemRISnBibWM2VDNKbllXNXBlbUYwYVc5dUlpd2libUZ0WlNJNklqTm1ZelEwWTJNd0xXVmlNelF0TkdZMk55MWhOelU0TFRNeVlqWTRaVFpsWlRCa05qcHpkSEpwYm1jNlRXRmpVbWwwWTJocFpTQk5aV1JwWTJGc0lFTnNhVzVwWXlJc0luUjVjR1VpT2x0N0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lOMlZpTldKbU9UUXROREF6TUMwME1UbGhMV0UxWVRBdFkyUmlNMlE1TnpReU5XRmtPbk4wY21sdVp6cG9kSFJ3T2k4dmRHVnliV2x1YjJ4dloza3VhR3czTG05eVp5OURiMlJsVTNsemRHVnRMMjl5WjJGdWFYcGhkR2x2YmkxMGVYQmxJaXdpWTI5a1pTSTZJalpoTnpVM1l6YzJMV05sTlRRdE5HVmtaaTA1WkdFMExUbG1aV0ZqWVdGbVpXRmlPVHB6ZEhKcGJtYzZjSEp2ZGlJc0ltUnBjM0JzWVhraU9pSmxOREUwT0dZM09TMDVZMll4TFRRNU16Y3RZakprWXkwME1tVXpZamczTWpoaVlqYzZjM1J5YVc1bk9raGxZV3gwYUdOaGNtVWdVSEp2ZG1sa1pYSWlmVjBzSW5SbGVIUWlPaUl5TlRJMk16QmpOUzFqWW1ObExUUmlNRE10WVRjME1DMWtNalJoTVRCaE9EWTNNRGc2YzNSeWFXNW5Pa3hwWTJWdWMyVmtJRWhsWVd4MGFHTmhjbVVnVUhKdmRtbGtaWElpZlYwc0ltTnZiblJoWTNRaU9sdDdJblJsYkdWamIyMGlPbHQ3SW5ONWMzUmxiU0k2SW1JNFltWXlZbUZtTFROa01HRXRORFJqT1MxaVlUaGlMVE5oTkdGall6VmpNR000TVRwemRISnBibWM2ZFhKc0lpd2lkbUZzZFdVaU9pSm1aamMyTURjME1pMHdNRE5oTFRSbFkySXRPRFk0TlMweFkyWTVNRFE0WWpReFpUazZjM1J5YVc1bk9taDBkSEJ6T2k4dmQzZDNMbTFoWTNKcGRHTm9hV1ZqYkdsdWFXTXVZMjl0TG5ObkluMHNleUp6ZVhOMFpXMGlPaUpsT0RJNVpURmxOaTA0TUdNekxUUmhNbVV0T0RSbE1pMDJOVE5qWWpka1l6UTROR0k2YzNSeWFXNW5PbkJvYjI1bElpd2lkbUZzZFdVaU9pSXpaR05rWVRBeE5pMW1OVEkwTFRSbU1EZ3RPREJtTnkweE1tTXlOMkl3Tm1JNE5tTTZjM1J5YVc1bk9pczJOVFl4TWpNME5UWTNJbjFkTENKaFpHUnlaWE56SWpwN0luUjVjR1VpT2lKbU9XTTNObUl4WkMxaFpEZzFMVFF5TldZdFlqUmhaaTAxTkRBNU16QXhOemsxTVdJNmMzUnlhVzVuT25Cb2VYTnBZMkZzSWl3aWRYTmxJam9pTkRaa09EYzVOekV0T0dabE15MDBZbU5pTFRreE5UQXRNREl4WW1RME1qRXlaV1UxT25OMGNtbHVaenAzYjNKcklpd2lkR1Y0ZENJNkltTTNOVGxoWWprd0xUSXdOVE10TkRFMU1DMDVNMk5oTFRReU5HSXhOV1ptTmpVNE1qcHpkSEpwYm1jNlRXRmpVbWwwWTJocFpTQkliM053YVhSaGJDd2dWR2h2YlhOdmJpQlNiMkZrTENCVGFXNW5ZWEJ2Y21VZ01USXpNREF3SW4xOVhYMTlMSHNpWm5Wc2JGVnliQ0k2SWpkbU1URTNPVGc0TFdFMVpXVXROREE1WXkxaFptWTRMVFppTW1Zd1pXSXhPVGhoTURwemRISnBibWM2ZFhKdU9uVjFhV1E2T0RNNVlUZGpOVFF0Tm1JME1DMDBNV05pTFdJeE1HUXRPVEk1TldRM1pUYzFaamMzSWl3aWNtVnpiM1Z5WTJVaU9uc2ljbVZ6YjNWeVkyVlVlWEJsSWpvaVpHSXhObVF5TUdZdFpqbGpPQzAwTkRrd0xXSTFOREF0TmpKaVl6TTROV1psT1RSaE9uTjBjbWx1WnpwUGNtZGhibWw2WVhScGIyNGlMQ0p1WVcxbElqb2lNbVUzTWpnMFpURXRPV1ZqTlMwMFpqVTVMV0UxWVRBdE9EVTNabVl5WXpFNVpXSTBPbk4wY21sdVp6cE5ZV05TYVhSamFHbGxJRXhoWW05eVlYUnZjbmtpTENKMGVYQmxJanBiZXlKamIyUnBibWNpT2x0N0luTjVjM1JsYlNJNkltSmpPRFZpWTJaa0xXWTVOV0V0TkRWaE1pMWhPVGc1TFdRNE16TXpOR1F6WVRjd1pEcHpkSEpwYm1jNmFIUjBjRG92TDNSbGNtMXBibTlzYjJkNUxtaHNOeTV2Y21jdlEyOWtaVk41YzNSbGJTOXZjbWRoYm1sNllYUnBiMjR0ZEhsd1pTSXNJbU52WkdVaU9pSXpNMkV6WTJObU55MHdPRGMxTFRRellXSXRPV0psTUMwMU56Um1NbVJsWXpRMVlqWTZjM1J5YVc1bk9uQnliM1lpTENKa2FYTndiR0Y1SWpvaU56WTFZV1EyWTJNdE1UTXdNUzAwTlRjNUxUbGtPV0l0TkdOaVlqTTROVEkwWXpsbE9uTjBjbWx1WnpwSVpXRnNkR2hqWVhKbElGQnliM1pwWkdWeUluMWRMQ0owWlhoMElqb2lZVFF5T1RVeFkyTXRaV0l4TkMwME1EZzRMV0psWVRndFlUaG1aamcwTWpsaU56aGtPbk4wY21sdVp6cEJZMk55WldScGRHVmtJRXhoWW05eVlYUnZjbmtpZlYwc0ltTnZiblJoWTNRaU9sdDdJblJsYkdWamIyMGlPbHQ3SW5ONWMzUmxiU0k2SWpGaE5XSXlNVFF5TFRVeE5HRXROREEzWmkxaU9UYzVMVFkzWmpKaVl6STNOek13TURwemRISnBibWM2ZFhKc0lpd2lkbUZzZFdVaU9pSmpZVGhtWmpnNFppMDFNamxtTFRRd1pUWXRPREEyTkMwME9HUTJOVEF4TnprME16QTZjM1J5YVc1bk9taDBkSEJ6T2k4dmQzZDNMbTFoWTNKcGRHTm9hV1ZzWVdKdmNtRjBiM0o1TG1OdmJTNXpaeUo5TEhzaWMzbHpkR1Z0SWpvaU56WTJZek01WXpFdFltWmlNUzAwTWpJM0xUa3hOVEV0WVRBMVpESmtOekJtTTJNNU9uTjBjbWx1Wnpwd2FHOXVaU0lzSW5aaGJIVmxJam9pTXpVeFpERmpOVFV0T0RnME1DMDBPVEJpTFRreVlXSXROMk5oTWpZNU16ZGpNVGRoT25OMGNtbHVaem9yTmpVMk56WTFORE15TVNKOVhTd2lZV1JrY21WemN5STZleUowZVhCbElqb2laREpsTURCa1ltWXRaR1l4TXkwME5EUXlMV0ZoT1RZdE1UZzRNVFJsTVRkak9HTmpPbk4wY21sdVp6cHdhSGx6YVdOaGJDSXNJblZ6WlNJNklqSmlNV0U1TjJZd0xUSmlNRFF0TkdWallpMWhNR1UzTFRVMU5tSTBNbVZoTXpNMlpqcHpkSEpwYm1jNmQyOXlheUlzSW5SbGVIUWlPaUl6WVRreFlUVTVaUzFsTmpVeUxUUm1NR0V0WVROa1l5MDBPV1V3TVRWaU5URTFOR002YzNSeWFXNW5PaklnVkdodmJYTnZiaUJCZG1WdWRXVWdOQ3dnVTJsdVoyRndiM0psSURBNU9EZzRPQ0o5ZlYxOWZWMTlMQ0pwYzNOMVpYSnpJanBiZXlKdVlXMWxJam9pWVdKalpUSXhZVFV0T1RNeFlTMDBPRFF4TFdKaE1XRXROekl4WlRnelptUm1aRE15T25OMGNtbHVaenBUUVUxUVRFVWdTVk5UVlVWU0lDaEVUeUJPVDFRZ1ZrVlNTVVpaS1NJc0ltbGtJam9pT1dZM1pUVXpNbVl0TmpJNE9DMDBORGhrTFdFeE1Ea3RabVE1WmpJM1pqWXpObUkwT25OMGNtbHVaenBrYVdRNlpYUm9jam93ZUVVek9UUTNPVGt5T0VOak5FVm1Sa1UxTURjM05EUTRPRGM0TUVJNVpqWXhObUprTkVJNE16QWlMQ0p5WlhadlkyRjBhVzl1SWpwN0luUjVjR1VpT2lKaVlUQTBaVEl6TmkwNU9UZzBMVFF6T1dFdFltVmpNaTAwWTJSa05UYzJaV1ZpTURZNmMzUnlhVzVuT2s1UFRrVWlmU3dpYVdSbGJuUnBkSGxRY205dlppSTZleUowZVhCbElqb2lOamN3WW1ReE5tSXROV0kxTmkwME1qZzBMVGcyTjJFdE5UUmlOamszWXpBMVpXRTFPbk4wY21sdVp6cEVUbE10UkVsRUlpd2liRzlqWVhScGIyNGlPaUl5TWpaalpUY3laUzAxTnpaaUxUUTJaamt0WVRjeU1pMWpNR1UxWTJFNFpERXpObUU2YzNSeWFXNW5PbVJ2Ym05MGRtVnlhV1o1TG5SbGMzUnBibWN1ZG1WeWFXWjVMbWR2ZGk1elp5SXNJbXRsZVNJNklqRXdNak0xT0dZeUxUTmtNRFF0TkRNd055MWhZemMzTFdNMVlUTm1aVGRpTVRnellUcHpkSEpwYm1jNlpHbGtPbVYwYUhJNk1IaEZNemswTnprNU1qaERZelJGWmtaRk5UQTNOelEwT0RnM09EQkNPV1kyTVRaaVpEUkNPRE13STJOdmJuUnliMnhzWlhJaWZYMWRMQ0lrZEdWdGNHeGhkR1VpT25zaWJtRnRaU0k2SW1Ka1pqQmlaV0ZsTFdZNFpURXRORFJoWVMxaFptVXpMV1l3TVRFM05qVXdOVE00WWpwemRISnBibWM2U0VWQlRGUklYME5GVWxRaUxDSjBlWEJsSWpvaU1EYzBNakV5Wm1RdFpqSXhOQzAwTXprM0xUaGhNVFl0T1RRMU1XRTJOakF5T0dVME9uTjBjbWx1WnpwRlRVSkZSRVJGUkY5U1JVNUVSVkpGVWlJc0luVnliQ0k2SWpneFpEUXhaR00zTFdKak1EUXROREE0TmkxaE5HVTFMVGRpTnpsa05UWTFZemc1WVRwemRISnBibWM2YUhSMGNITTZMeTlvWldGc2RHaGpaWEowTG5KbGJtUmxjbVZ5TG0xdmFDNW5iM1l1YzJjdkluMHNJbTV2ZEdGeWFYTmhkR2x2YmsxbGRHRmtZWFJoSWpwN0luSmxabVZ5Wlc1alpTSTZJbVpsWmpZNE9UWmlMVGM0WTJNdE5ESTNNQzA0Tm1ZekxUVTBNVGczTkRGa09HTTNaanB6ZEhKcGJtYzZZekl6TlRabE0ySXRPVEF3T1MwME1qSXdMV0V4WTJNdE1XRm1PR1F6TkRJd1pHRmtJaXdpYm05MFlYSnBjMlZrVDI0aU9pSm1ZalEzTTJNMU1pMHpNMk5qTFRRMFpUVXRZbVV4WXkwM05UQTBOMkl5WkdGaE1XVTZjM1J5YVc1bk9qSXdNakV0TURndE1qUlVNRFU2TURrNk5Ua3VNams1V2lJc0luQmhjM053YjNKMFRuVnRZbVZ5SWpvaU1tVXdZamxoTVdVdFlqWXdPQzAwTldReUxXRmxNall0TkdRd1kyRXlZVEkxTlRCa09uTjBjbWx1WnpwRk56Z3pNVEUzTjBjaUxDSjFjbXdpT2lJMU0yVmpNV1ZoWVMweE5HUTBMVFE0TlRBdE9UZzFPQzB4TXpJd01ESXhOR1pqWlRVNmMzUnlhVzVuT21oMGRIQnpPaTh2WVdOMGFXOXVMbTl3Wlc1aGRIUmxjM1JoZEdsdmJpNWpiMjB2UDNFOUpUZENKVEl5ZEhsd1pTVXlNaVV6UVNVeU1rUlBRMVZOUlU1VUpUSXlKVEpESlRJeWNHRjViRzloWkNVeU1pVXpRU1UzUWlVeU1uVnlhU1V5TWlVelFTVXlNbWgwZEhCekpUTkJKVEpHSlRKR1lYQnBMWFpoWTJOcGJtVXVjM1J2Y21GblpTNXpkR0ZuYVc1bkxtNXZkR0Z5YVhObExtbHZKVEpHWkc5amRXMWxiblFsTWtZeE1URmtNREkzWVMxbE9HUmpMVFJsTkRRdE9Ea3lOQzFqTkRGalpEY3dOMlZoWXpZbE1qSWxNa01sTWpKd1pYSnRhWFIwWldSQlkzUnBiMjV6SlRJeUpUTkJKVFZDSlRJeVZrbEZWeVV5TWlVeVF5VXlNbE5VVDFKRkpUSXlKVFZFSlRKREpUSXljbVZrYVhKbFkzUWxNaklsTTBFbE1qSm9kSFJ3Y3lVelFTVXlSaVV5Um5kM2R5NTJaWEpwWm5rdVoyOTJMbk5uSlRKR2RtVnlhV1o1SlRJeUpUZEVKVGRFSXlVM1FpVXlNbXRsZVNVeU1pVXpRU1V5TW1aaE16VmtOR0kzTXpWaU5tUTFNRE15TjJNNU4yWXdNRGd5TnpFeU9UazVZMlpoTmpReVltSTRNekF5TldZME9EY3pNMlUxWmpJeU16QTJObVE1Tm1ZbE1qSWxOMFFpZlN3aWJHOW5ieUk2SW1VeU1tUmhNRGt6TFRZMk56Z3ROREkwWkMxaFpUUXlMVGcxTVRJNVl6TXlaV1V5TWpwemRISnBibWM2WkdGMFlUcHBiV0ZuWlM5d2JtYzdZbUZ6WlRZMExHbFdRazlTZHpCTFIyZHZRVUZCUVU1VFZXaEZWV2RCUVVGbVVVRkJRVVJKUTBGTlFVRkJRWEI0SzFCaFFVRkJRVTB4UWsxV1JWVkJRVUZFVFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZW1WRGJXbEJRVUZCUVVWSVVsTlViRTFCVVV3clFUZDRRV2R1TWtSUU0zcENkM0l4UTFCRmJDdEpMMUZCUVVKM1pFcFNSVVpWWlU1eWMyNWtNVEl5ZVc5UlVuWnJTRWxUU0U0cmVpOTBlVlZyT1c5VVJVTlJNV0pVUW1NeU0ySjVUbk13UWpWSFNVUkJVa0ZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGckswbHJLMGxrZURSbk5VNDBRamxIVVM5eVVFRTVTaTlKVUdaVFozZE1MMDFGUlVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkVkMUExV2xCdlVEVnlOMFpLUzBGbU4yTjFaa0pwYUZCT1UydFlOV2hzUVRsMUswUnpVRGRrV0M5S1N6RlFNbFpRYVZOSmIyVmlSWEpNZDFab05WcDRLemhETVZreU1sbDBVREJHY0dZMmFHUmxZU3R0Y1RGWGJHbDRabVZxTmxKalJIaHFNRGx6ZDFoaVltVkNVWEJwYW5Wbk1qQmhhaTlUUlRoaWRtODFhRVYxWVhaQmRWTkxjRkZtU25oVVJ6a3haMVZ5UTFZMmFsTlJSVEJ2VUd0bE5IZDFhMlUzTURWRmNYQk1UbGQ0ZEUxMFUyczBhblpZUjJ4a0szUk1iSGgyVmsxT2JtRnJSRGR0Ulc1a1dWUldWMU51VmpnMk1GZFZXR3d6TkZKTmVUZENaVzF3ZVVkNlRqZHdRV0p0V0VWQk5tSm1ka3N3ZFRNeWRWUkdTMHRXVFRCeU1GbDNNVTFVWTBaMmNEaHBWa3hRUkRBck9XZElVWGtyTjNKVFpqTmxaV3B3TWtoMVJtTnpiV3hrYVVWNk1FWjZTMWhtVTFKM00zRmxNRGhZY1dRNVpGQTJVVXRQVG01cmRUUnNSek5PVTJJdlVrSjBTM1JMZERGMGRHUkNTbWxaWWpKV1NUZGljbU0zZEdNNFNWbHZkRXA2U0ZWQ01HTXJUeXRVTTNKVVVYVk1TM05hVW5Gd2VtdFVVemRrV2trMGRtOHJjVXB1WkVWSFR6aEZlbVZqZVdwaFl6WXZTVlJPTWt0UFYyRlZURWxVTDJGTVpHVlZibkZ3WkdrM1ZsY3lLMHQ1WXpJNVJrd3pjemRsTTJocE5VeFVVMmhsVjFkd2VWZHNTRFJZZW0xMlYycHVhVTlwUms0eldWZEVhWFpYU1RreVYzVnJOV04wTWtNd2NETktlbXc1V1U0Mk5sZEpOVWxXTDFaNVJqZzJjakZoTVRkd1NEVlZUVU13Y0ZndlJIZFlWbFUxTWpSTGN6VlpaMFJhYlV3MGVrZDZNWGM0TUhBek0xQnFNWEJOZG1OcEszUmpNbU5HU1dwdGFFZ3laRmRXWm5WaFZreDFUR3A1T1dWVWVtZHhUM0p4WlhkMk1IWjFiUzh4UzFJMEt6SmhOa1JvTlhCWVR6ZFdPVThyY3pSTFVrcFFRVVIxZUU1cWRHcEdRME5yTDBOc2RFVjZaMlo2VTNSbGNsTjJaRnBSV21WRWIzbDVjWGhSWjNWU01XeFliVUpzU1M4NVVGTmxZbHB3WWs5bE9HSnBkblF5WWtaTE9WbGhTelJsU0dVM1RreE9ZWFJNVUROeFIxbE1aa3czTVZKdlRYWkNObGgxT1RaS00xUlhkRGxNVkc5UlRUVjZiVGhaWm5oaVNFbEZVMUJhV0ZoWEwzUnZkbFJUYnl0UWNVWjRUbVZ6ZDFweGFrOHZXREE1VDNaQ1oyazVUMk5JZHpkc2JGVjFhMk4ySzJScE1ISnVaWEZtT1RsMVdHOUxaMnhOVFhkaGJHdzNlQzl0ZVRCdGJGQTFjR2xXYm5ZelpuVmFLekU1TTNodWNGUlpUSG96VTJwbGFsQk1XSEJQTmxSMFdHSjZXSEJtU1ZWalpVcEliVkJ6V0VGS2MySkpLMkZNTjJaMmMzQndWbk5QV0RkMVlXUktPVVoyZFZRMk0xQjRjMXBCVVROVlRYaDVaMHg1VjNaemF6WXZiSFZyZFRRd1ptSTRkSFJ2YkVSR1JtSXhXbEZSTmk5dFVtdDJNV2xYT1dreFNqWkRMekZoWldwQlkzWlJVRlp0VlhRMlJrSXlZMjR5TmtwNlJFODBWSE5oVEdOWFpXRlVZbTgzU1c0d05GZ3dPRFk1TmxoNFZHNXlhMjE2UjBOSWFXMXRTbkJNZFU1aFVHazNNV1lyUzA5cmRHVTFTVXM1VDNKVE56UnBibWRRVTJaS1pERnZTVk5FT1Zvd2JTOW9VR2hDTUc4ckwweGtNMDFOUjFWeVUxVTJPSE01ZVZWNldGTlBNM04xYUZjclFtZ3JTbW93YjNsNk1uTnVXbkZuY0dONlpEVnBkM0IyVW5adFMyWlljRmt2VURCNVpWTm1jMmRJVDJoc2FYZDBURk0zWTBKVGFWSXhZVnBHVURNd2NTdENkRE5tV0dKTE9XaFJNbFJ5S3pSeVUyTXJPR1JtYkZoRFR6SnNObkJaSzFCSmN6VndSakY0Y3pScmJXSllWa0kyZWpCS1YxSlNaRWdyTmtJd2R6aFdaVzk1WkdWWGJGWTROSGhoVlV4dWRsZ3dPSFpGZWs1dUswaEtUM1VyZEdaVU1XTlRZa3RRVEdWM2RsZHJZeTlqTVM5WmRITTBVMnhLSzBSSWNIVnVjMFl6TURZNVdGTnlkemRXYUZGbGJEUm5TRTR6VVhWSVR6aHFSV3N2VHpoalF5dFZieTl3V0ZJcmRrY3dURk51TDFwWWVHeFllVWx2WXpZd1VGTm9aV3hrZDNaa2VtSTBTRmN6U1RjeGNFOHZNSGRJV1hGUFNYQTRkalF4U2xRMU1sUk9hbVkxYW5neU5HWnRSVGsyVjB4eVJ6Y3ZZbk52VFRabGFFTkhjRW80Y3pBdldsWXphemh4YmxSUFpGZ3hRalkyU0U5bllqUmlOVXRTWm5Sc05UUm1RemR2ZG5sMldscHdXSFEyU25rMGJ6TmFjV1ZrVDNaTlZHUnpiRkJWYUVRd2NteFhlSFpXVFVaMFV6QlFNVlZQYmxCMlYyczRORmhrWWpCRVNWaFhMMnRJYVUxVFRHVnROM0pOVFV0RWJYUTVTakJJYldkMFN5OHpRbWMzUjJoblQwZE1RMmRRVkRoaFpuQXhjR1JVUlhnME9EZzJibWQwUzBZeVl6bFBjSE5uVmtSaVQwdERTazlSWVd0cEt6Rldja1pwSzNkeWFVcHdaazVoTDI5eVUyaGpjbGN5T0RacVRGbHplWGxtV2t4c09GTkZkRzVOTmpWcU1WTk1TQ3QzV0ZaSE5tcGpNRVJaU1RrNE5rWjFha3RLYmxGTVZqQmpNVTF5ZHpkelR6VnVMMlozZDBSbWEyOXFPV2RtUkRSdmVtaDVSa0ZWVmsxeFFsSnNXWEpEWkRCdlZXNVNjbXRwZVVWNlQxQkdUa3hHZWxSNlZEVldiRUpZWkROUGJUaHZlbXRDZEU5UFpFUlFXbXRWT1dzNUwxQkRjRXhyU0dGeWJscFZaa2xvV0U5Mk1DODJTVk4yTUZOUFkzWnFMekZpT1hSNlptdE9OVWN6ZURkbFltUkphRE0wVjJaR05uUndSSEp5V1VzMlVGVndaQzgwWmtwVE0ySndXR0Z5ZEU5S1RpdFRVa1JDV0U5Mk1HdzJiVFpGZWxveGVqTTFiSGM1YXpOU1R6QXhWMDFHUWxVMFNEUXJNakZzVFdKaU9GaHpNSFpzZGxsV1NIQXpVRlZ4UzBOallVOUVWWE51WWs1TVUxSTFZMVJESzJSYUszQndWbVZzUTI1TFlURXhOMlZPVkU1UmExTldSbWxWTW5SUUsxRnlVMDlXZGxwYVlWVk1jWGQyZEZCRGFDOXFaRTFpTTFKT09UbFJUMnR2YW5ZNFRITlJVekJyTDA4M0szUkxaaXRPVFZRNU5rNVFNRlYyVEhacGJsSnRPVXB1TWpSM1ZuSmlSRU5pUjBsa1JqUjRWa0pPU2k5NFNsTmxObFZsYnk5Q2FpODVTUzgzUkhrd1VIWnlia3A1Tlc5d1UwbFNVbHBZTUdGUlZVRkJVSHBZTTJnelZVRkJRMEZSUVhnM1dVRkVMMkZ1UmtKRFRtUmhiVWxCUWtGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUkVGdGJXOWxTemxJZW1sQ05VazVSVUpZYm5nNFFVRkJRVUZCUVVGQlFVeENiVUZKV2t0dGVsZEpibmg1VDBGQlFVRkJSV3hHVkd0VGRWRnRRME1pTENKaGRIUmhZMmh0Wlc1MGN5STZXM3NpWm1sc1pXNWhiV1VpT2lKbU5qTmtZVGxoTmkxbFlXUTRMVFE1TVRRdFltWXlaUzFsTW1GaU16QTJabU5rWkdZNmMzUnlhVzVuT21obFlXeDBhR05sY25RdWRIaDBJaXdpZEhsd1pTSTZJbUkyTURSbE5qRTRMVGM0TjJRdE5HVmtOeTA0TXpreUxUbGpOakV4T1RWa016WTVaRHB6ZEhKcGJtYzZkR1Y0ZEM5dmNHVnVMV0YwZEdWemRHRjBhVzl1SWl3aVpHRjBZU0k2SW1Oa01HSmxOR1ppTFRZeE5qVXROR0ZoTlMxaU1EVm1MVGRsTW1VNE1UTTFNVGd3WkRwemRISnBibWM2WlhsS01scFlTbnBoVnpsMVNXcHZhV0ZJVWpCalNFMDJUSGs1ZWxreWFHeGlWMFYxWWpOQ2JHSnRSakJrUjFaNlpFZEdNR0ZYT1hWTWJVNTJZbE00ZVV4cVFYWmpNazV2V2xjeGFFeHRjSHBpTWpScFRFTkthMWxZVW1oSmFuQTNTVzFzYTBscWIybE9SR2h0VFhwc2JVNXFRWFJPUjBsNVdWTXdNRTFIUm10TVZHaHJXbXBCZEUxVVNtaE5WR1JvV2xkWmQwOVVXVE5QYms0d1kyMXNkVnA2YnpOT2JVNW9XbXBPYlU5VE1ERk9WR3Q0VEZSU2JGcHFSWFJaYW1NeFRta3dlRmt5U1RCT01rVXpUbTFTYkZwSFZXbE1RMG95V2xoS2VtRlhPWFZKYW05cFdtMUpORTlIVVhsYWFrMTBUVzFSTTFsVE1EQk9lbXhxVEZSck1VNUVSWFJOYlZWNFdtcFpNVTV0V21sYWFsWnNUMjVPTUdOdGJIVmFlbkIzV2toUmRHRkhWbWhpU0ZKdldUSldlV1JETVRKTmFUUjNTV2wzYVdSSWJIZGFVMGsyU1cxUk5Ga3lVbWhaZWtKcFRGZEpNbHB0U1hST1IwMHpUWGt4YVUxNlRUSk1WRTAxVFhwak5WcEhXVE5QUkdzeVRucHdlbVJJU25CaWJXTTJWVVZPVTBscGQybGtiVVp6WVZkU1IyTnRPWFJKYW05cFRWZFpOVTlYUm14Wk1rVjBXWHBaZDFwVE1EQk9lbGsxVEZkSk0wOUhXWFJOVjBreFRXMUZNRTV0VW1sYVIwWm9UMjVPTUdOdGJIVmFlbTk1VFVSSmVFeFVRVFJNVkVrd1ZrUkJNRTlxU1hsUGFrMHlUR3BCTWsxc2IybE1RMHB0WVVkc2VWWnRWbmxqTW14MlltbEpOa2xxVm14YVZGWnRUVzFaTVV4VVRUQk5hbEYwVGtkTmVWcHBNRFJOUkZFMVRGZEdhazU2WjNsUFZGRTFUbFJuZWsxVWNIcGtTRXB3WW0xak5rNUROSGRNYWtWcFRFTktiV0ZIYkhsUmJsWjFXa2Q0YkVscWNEZEpia3BzWXpJNU1XTnRUbXhXU0d4M1dsTkpOa2x0V1ROUFJGa3dXbTFSZUV4VWJHcE9hazEwVGtSRk0xbHBNRFJhYWtKclRGZE9hRTU2YUcxYVZFRjRXVmRPYWs5VWNIcGtTRXB3WW0xak5sRnVWblZhUjNoc1NXbDNhV1JJYkhkYVUwazJTV3BWTVU5WFdteE5WMGt3VEZSa2JWcFhWWFJPUjBreFRua3dOVmxYV21oTVZGRjNUa1JaZDFwWFJteE5WMUpzVG1wd2VtUklTbkJpYldNMldUSTVjMkpIVm1wa1IyeDJZbWxKYzBsdFZuVmtTRW8xU1dwd1ltVjVTbTFrVjNoelZsaEtjMGxxYjJsUFJFcHBXVmROZVU1WFdYUmFWMUV6VGtNd01FNHlTbXBNVjBVeVdrUkpkRTlYVlROWlZHUnJUbTFKZVZwcWJHcFBiazR3WTIxc2RWcDZjREZqYlRRMlpGaFdjRnBFY0dsWlZHUnBUakpOTkZwRE1XcE9WRUUxVEZSU2EwOVhVWFJaYlZVd1dsTXhiVTlVYkdsT2JWSnNUV3BzYkUxcVRXbE1RMHA1V2xoT2RtUllTbXBhVTBrMlpYbEtlVnBZVG5aa1dFcHFXbFpTTldOSFZXbFBhVWw0VDBSRk1FMVVaekpPYVRBMVdrUmplRXhVVVhwT01rVjBXVlJuTWxwVE1EVk9SR3Q0VG0xU2FVOUVaek5aYlVrMll6TlNlV0ZYTlc1UGJFSm9aRWRzYkdKdVVXbE1RMHBzWlVoU2JHSnVUbkJpTWpScFQyeDBOMGx1Vm5saVEwazJTV3BHYVUxWFRtdE9SMFpzVEZkWk1GbFVUWFJPUkUweVdta3dORTlFUlRGTVZHYzBUVmRSTTFsVVRtcE5lbWh0VDBSd2VtUklTbkJpYldNMllVaFNNR05FYjNaTU1taHpUbmsxZG1OdFkzWmFiV2h3WTJrNVZHUklTakZaTTFJeFkyMVdSVnBYV25CaWJXd3dZVmM1ZFV3elFtaGtSMnhzWW01UmRHSnRSakJoVnpsMVdWZDRjR1JJYTJsTVEwcHNaVWhTYkdKdVRuQmlNalJwVDJ4ME4wbHVWbmxpUTBrMlNXcEpkMDlIVlROWmVsRjVURlJhYkU1cVkzUk9SRVpzVDFNd05FOVVXbWxNVkVFeldrZFpNazFYVm14T1IxcHFXWHB3ZW1SSVNuQmliV00yV1RJNWExcFRTWE5KYmxwb1lraFdiRkV5T1d0YVYwWnBZa2RXUkdJeU5XcGFXRUl3U1dwd04wbHVVbXhsU0ZGcFQybEpkMDFYVlhwUFJHUnRXVk14YTFwRVJteE1WRkV5V1hwQmRFOVhXVFZaVXpGcldtcG9hbHBxWXpKWmVtTjRUbXBSTm1NelVubGhWelZ1VDJ4Q2FHUkhiR3hpYmxGblZHMUdNR0ZYT1hWWlYzaHdaRWhyYVV4RFNtcGlNbEp3WW0xamFVOXNkRGRKYms0MVl6TlNiR0pUU1RaSmFrRjNUVmRKZDA5SFdUUk1WMVUwV2tSbmRFNUhUbTFhYVRGb1QxUlpNa3hYVlRGYVZGazFUMFJHYTFsdFZtbFpWSEI2WkVoS2NHSnRZelprV0VwMVQyMXNlbUo2Y0hwa1IxRTJZVmhPZGs5cVRYaE9hbGxwVEVOS2FtSXlVbXhKYW05cFdtcE9hazU2VlRGWlZFMTBUa1JyTVU1VE1EQk9WR00wVEZSb2JWcHFaM1JQUjFGNlRYcE5NVmw2V1RWT2JWVTBUMjVPTUdOdGJIVmFlbkJVVW5sS09WaFlNVGxZV0RGa1RFTktjRnBIVm5Wa1IyeHRZVmRXZVVscWNHSmxlVXB3V2tOSk5rbHFRVEJhYWxKcFRXMVZNVXhVVlhwWlYxbDBUa2RGTWsxRE1XaE9WR2MxVEZSb2JVNVVhekphUkVKcVRsUnJOVnBxY0hwa1NFcHdZbTFqTmxWR1FrOUphWGRwWkVoc2QxcFRTVFpsZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1cxVk5WbFVXbXBOZW1jeVRGZEplVmxxUVhST1JFSm9UWGt4YUU1WFJURk1WR3hvV2tkRk5GcFhUbTFOUkVVeFRsUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMUpzWTIweGNHSnRPWE5pTW1RMVRHMW9jMDU1TlhaamJXTjJVVEk1YTFwV1RqVmpNMUpzWWxNNU1rMXBNSGROYWtGNlNXbDNhVmt5T1d0YVUwazJTV3BrYVZwWFZUQk5SR2MxVEZkU2FscEVTWFJPUkdScFdYa3hhVTFxWXpCTVZFRTBXVzFSTWxwRWFHMU9la0pxV1dwd2VtUklTbkJpYldNMlZVWkNUMGxwZDJsYVIyeDZZMGQ0YUdWVFNUWkpiVTE0V20xVmQwMTZZM3BNVkZwcVdrUkpkRTVIV21oT1V6QTBUbFJKTlV4VWJHbE5iVmsxVG5wck1VNVVXbWxPVkhCNlpFaEtjR0p0WXpaVlIwWjZZek5DZG1OdVVXZFVibFowV1cxV2VVbHVNV1JtVTNkcFpHMUdjMlJYVldsUGFVcG9UVlJqTkU1dFRUVk9RekI1V1hwU2JVeFVVWHBOUkdOMFdWZEdiVTlUTUhoYWFtaHNUMVJSTTAxdFdtbFBWMWsyWXpOU2VXRlhOVzVQYTFVelQwUk5lRTFVWXpOU2VVbzVURWh6YVdGWFVXbFBhVWt5VGxSQ2JFOVhSbXBOVXpCNVQwUkNiRXhVVVRWTmFtZDBUMFJGZWxscE1XaFBWRlUxVFdwQmQxbDZhekZOUkZVMll6TlNlV0ZYTlc1UGF6VlRVMVZOZEZKcmJFOUphWGRwWkcxR2MyUlhWV2xQYVVreFRsZE5NMWw2UlRST2VUQjRXVlJaTTB4VVVtbE9iVkYwV1cxRmVFNURNREpOUjAweVRrZGFhRTFxWTNsT1IxazJZek5TZVdGWE5XNVBiRTAxVFVSck5FOVVaelZYYVVvNVdGTjNhV0p0Um5SYVUwazJWek56YVdSSFZqUmtRMGsyU1cxWk0wNTZWWGxaYWxFd1RGZFNhMXBxUlhST1IwMDFXa013TlU1cVRtcE1WMUY1VGtSb2FGa3lXVEphUjFFelRXcHdlbVJJU25CaWJXTTJWa2RHZFVsRlRtOWFWelJuVVRKb2JHSnBTamxZVTNkcFdqSldkVnBIVm5sSmFtOXBXa1JqZUZwdFRtbE9Na1YwV2xkRk0xbDVNREJaZW1ONlRGZEpNVTFxVVhSWk1sa3hUbnBqTTAxSFRUSk9Na2sxVDI1T01HTnRiSFZhZW5CdFdsY3hhR0pIVldsTVEwcHBZVmhLTUdGRlVtaGtSMVZwVDJsSk5WcFhTVEpOUkVadFdXa3hhMDFVVFhwTVZGRjZXbTFaZEZscVdtMWFRekZzVFcxSmVscHFTVEphUkZFeFdXcEpObU16VW5saFZ6VnVUMnBGTlU5VVFYUk5SRVYwVFZSVmFXWllNSE5sZVVwdFpGZDRjMVpZU25OSmFtOXBXVzFaTTAxcVVUVmFWRWwwVFRKUmVWbFRNREJOVkVWNVRGZEZNRmw2WTNSYVIwa3dUMFJDYTA1NlVYaGFWMXB0VDI1T01HTnRiSFZhZW5BeFkyMDBObVJZVm5CYVJHOHpUbnBKTlU5VVkzZGFVekZvV1dwSk1reFVVVEpQVjFsMFdXcE9iRTVUTUhwT2JVVXdUVzFXYWsxcVVYaE9SRmxwVEVOS2VWcFlUblprV0VwcVdsTkpObVY1U25sYVdFNTJaRmhLYWxwV1VqVmpSMVZwVDJsS2EwMHlUWGRhYlVadFRYa3hhVTVFUm1oTVZGRjZXWHBCZEU5WFZYcE9VekIzVFhwQk5FNVhVWGRPUjFWNVdrZFJObU16VW5saFZ6VnVUMnM1YVdNeVZubGtiVVl3WVZjNWRVbHBkMmxqTTBKc1dUSnNkRnBYTkdsUGJuTnBaRWhzZDFwVFNUWkpiVTVvV21wak5FMXRUWGRNVjFKcVRtMVpkRTVFVW1oT1F6RnBXV3BaTkV4VVZUQlBSR3N6VFZkS2FrMUViR3RPYW5CNlpFaEtjR0p0WXpaVk0wSnNXVEpzZEZwWE5HbE1RMHA1V2xkYWJHTnRWblZaTWxWcFQybEtiVTVIVFRKT1YxVjVUWGt4YWs1dFdtdE1WRkY0VG5wbmRFOVVhelJPVXpGclRVUm9hMWt5Um10Tk1sVTBUa1JCTm1NelVubGhWelZ1VDI1V2VXSnFjREZrVjJ4clQycEJlVTU2Vm1sYWJVWnRURlJSTkZwdFNYUk9SRkpzVFVNd05FMUhUbXRNVkd4cVRsUkJNRnBxWjNkYVZGcG9XbE5LT1V4RFNuZGFXRXB0WWpOS2RGcFlTV2xQYkhRM1NXNVNOV05IVldsUGFVcHRXVEpLYVU5RVZtcGFVekIzV1hwRmVFeFVVWGxhUjAxMFQwUmFhRTVwTURSYVJFcHJUbGRWTlZsVWEzZGFha1UyWXpOU2VXRlhOVzVQYkVKNVdWZE9NR0ZZVW5CaU1qVnNZMmxKYzBsdVNteGFiVlo1V2xjMWFscFRTVFpKYlVwclRVZFJkMDlFVVRSTVZFNXBXVmROZEU1RVFtbFplVEExVFVkRk1reFVVWGxOVjFGNVRsUlJNVTFFWXpCYWFuQjZaRWhLY0dKdFl6WmtXRXAxVDI1V01XRlhVVFpOTWxKcFdtMVpkMXBIVlhSYVJGSm9Ua013TUZwVVJtdE1WR3MwV1cxWmRGbFhXVE5PUkVrMFdXcG9hRTFFVW1sSmJqQnpaWGxLY0ZwRFNUWkphbGt4V1cxV2JGcFVUWGxNVjBwcldWZEpkRTVIV1hsT1F6QTBUV3BuZUV4VVRUSlpiVkpwV21wc2JGbFVhekJhVkhCNlpFaEtjR0p0WXpaVVJXaFJTV2wzYVdSSWJIZGFVMGsyU1cxSk5FNXRVVEphVkZrelRGUnNhazFVVlhST1Ixa3dUbE14YUU1cWF6Qk1WR1JzVFdwS2FFNTZVbXRhYWtVeVRXcHdlbVJJU25CaWJXTTJWRE5LYmxsWE5YQmxiVVl3WVZjNWRVbHBkMmxqYlZadFdsaEtiR0p0VG14SmFtOXBUMGRSTWs1cVp6Vk9SR2QwVFVST2ExbFRNREJQUjBrelRGZEdhMDFFVFhSUFZHTXlXbXBOZUZwdFZtbE5SMVpxVDI1T01HTnRiSFZhZW5BeFkyMDBObVJZVm5CYVJIQnRXVlJKZWsxcWFHaGFhVEF3VDBSbmVVeFVVbXhaVjBWMFQwZE5lVTlETURKT2JWSm9XV3BSTWs5VVZYZGFha1ZwWmxONE4wbHRiR3RKYW05cFdWZE5NVTFxUlhkT2VrMTBUa2RhYlU1NU1EQmFWRkYzVEZSck0xbDZTWFJhYW1zeFRWZGFiVTVVUVRSUFZFbDRUMjVPTUdOdGJIVmFlbkJDVkVOSmMwbHVValZqUjFWcFQybEplazFVVlhoUFYwVXhUVk13ZDA1NlFUQk1WRkY2VFhwRmRGbFhSVEpaZVRCNVRrUkZNazlFUlROYVZGcHFXbFJaTm1NelVubGhWelZ1VDJzNWVWb3lSblZoV0hCb1pFZHNkbUpwU1hOSmJrcHNXbTFXZVZwWE5XcGFVMGsyU1dwYWFrNHlWbXBOYWtFeFRGZEpORTE2VFhST1JGRTBUbE13TlU1VVozcE1WRWt6V2xSYWFFNHlUVFJhYWxKdFRWUndlbVJJU25CaWJXTTJaRmhLZFU5dVZqRmhWMUUyVDBSTk5WbFVaR3BPVkZGMFRtMUpNRTFETURCTlYwNXBURmRKZUUxSFVYUlBWRWsxVGxkUk0xcFVZekZhYW1NelNXNHhaRXhEU25CYVIxWjFaRWRzYldGWFZubEphbkJpWlhsS2NGcERTVFpKYlVwc1RsZFdhMXBYU1hoTVZGSnNUMFJyZEU1RVZUVk5RekEwVG5wc2JVeFVVWGhhUjBrMVRXMUpNazE2Vm1sT1JIQjZaRWhLY0dKdFl6WlJWVTVVVkdsSmMwbHVValZqUjFWcFQyNXphVmt5T1d0aFZ6VnVTV3B3WW1WNVNucGxXRTR3V2xjd2FVOXBTbWxOYlVwdFRrUnJlVTFwTURCYVZFRXlURlJSZVUxRVNYUlpha0V6VDBNd2QxcFVUWGhhVkVWNVQwZFZORmw2U1Raak0xSjVZVmMxYms5dGFEQmtTRUUyVEhrNU1GcFlTblJoVnpWMllrYzVibVZUTlc5aVJHTjFZak5LYmt3d1RuWmFSMVpVWlZoT01GcFhNSFprYWtsMFRVUkpkMDE1U1hOSmJVNTJXa2RWYVU5cFNtbFBWRXBwVDBSRk1rMXBNV2hPUkdNeVRGUlNhazlFUVhSUFJFcG9XWGt3TkU1RVNYZE5SMVY2V1hwWk1FMTZWVFpqTTFKNVlWYzFiazlyUmtSVk1EUnBURU5LYTJGWVRuZGlSMFkxU1dwdmFVNVVRWGhPVkVwcFdtcEZkRTR5V21sTlV6QXdXa1JPYUV4VWF6Tk9NazEwVDBkSk1rNUVhM2hhUjBadFRVUlZlazl1VGpCamJXeDFXbnB3UWxreVRteGpNMDV3WWpJMFoxTlZVV2xtVmpFNVRFTktNbGxYZURGYVUwazJTV3BSZUUxRVJtMU9SMWt5VEZSS2JGbFVXWFJPUkd4c1dXa3hhRmxxVFRCTVZFSnFUbFJvYWs0eVZYbFpiVmt3V21wd2VtUklTbkJpYldNMlRWUkplazVFVlRKT2VtYzFTVzR4WkV4RFNtcFpXRkpzV2pJNWVXVlRTVFpYTTNOcFdUSTVhMkZYTlc1SmFuQmlaWGxLZW1WWVRqQmFWekJwVDJsSk5GbHFXWGRhUkVreVdWTXhiVTFVWnpSTVZGSnBXbXBaZEZscVNtaE5RekF6VG0xUmVrMUhWVEpPUkVsM1dUSlZObU16VW5saFZ6VnVUMjFvTUdSSVFUWk1lVGw2WW0wNWRGcFhVWFZoVnpWdFluazVlbGt6VVdsTVEwcHFZakpTYkVscWIybE9WR3hxV2tSRk0wNVVXWFJaTWtac1RXa3dNRnBxU21sTVYwbDRUVlJCZEU5WFJtbGFWRUY0VFVkV2FrMHlSVFJQYms0d1kyMXNkVnA2YnpST1JFRXhUWHByZDAxRVdXbE1RMHByWVZoT2QySkhSalZKYW05cFQwZEZOVTFxUVRCTmVtTjBUVEpGZUZwcE1EQlBSMGw2VEZkRk5GbFVWWFJaVkdzMVRYcHJOVTFYVFhkWmVsWm9UMjVPTUdOdGJIVmFlbkJFVkRGYVNsSkRNSGhQVTBvNVdGZ3haRXhEU21waU1sSnNTV3B3TjBsdFRuWmFSMngxV25sSk5sY3pjMmxqTTJ4NlpFZFdkRWxxYjJsT2FscHBXVmRWTUZsNlNYUk9hazEzV2tNd01GbFVWVEpNVkd4c1dUSk5kRTlVWnpOT2VteHNUMWRTYWs1RVZtaFBiazR3WTIxc2RWcDZjRzlrU0ZKM1QyazRkbUpIT1hCaWJVMTFZak5LYmtscGQybFpNamxyV2xOSk5rbHFhekJaVkUweVQxUlNiVXhYU214T2VtTjBUa2ROZVZscE1EVk9SRkpvVEZSWk5FNUhSbXRaZWtsNFdrZE5NMDE2Y0hwa1NFcHdZbTFqTms5VVVURk5la1YwVFZOSmMwbHRVbkJqTTBKeldWaHJhVTlwU1RKTlZHUm9UVlJLYVZsVE1ERlBSR3hyVEZSU2JVNTZXWFJQVkVKb1dYa3hhVTFxWkdsTlYxVjRUMVJqTWsxRVdUWmpNMUo1WVZjMWJrOXNUa0pWYkUxMFVUSTVWMHhVU1dkTFJVNVFWbXRzUlV4VVJUVkxVMEpUVkd0RloyTkhSblZhVjNkblRGTkNVMXBZVG5kaFdFcG9aRWM1ZVdWVFFucGpSMVpxWVZjeGJHSnBRbWxsVTBKUFVWVkZaMlF5YkRCaFEwSjNZMjA1YVZwVFFtdGFXRkpzV1ROU2NHSXlOR2xtVmpFNVRFTktNbGxYZURGYVZVNTJXa2RXYUZsdGVHeFJNamwxV1RKV2QyUkRTVFpsZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1dwUmVWcHRXWGRaTWtrd1RGUlZlbGxVWTNST1JHaHNUVU13TkZwVVRUUk1WMFpwVDFST2FWbFVUbWxOYlZFeVdsUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMDUxWWpJeGJGcEROWEJpYlZwMlRETk9hbVJEU1hOSmJVNTJXa2RWYVU5cFNUSk9WRkpyVFZSWk5FMURNSGhhVkVrelRGUlJNRTVxUlhSWlZGWm9UVk13TkUxWFJtaFpha0UxVFRKUk5VNVVRVFpqTTFKNVlWYzFiazlxU1RKTlJFMDBUbFJCZDA5VFNYTkpiVkp3WXpOQ2MxbFlhMmxQYVVrMVdXcEZOVTlYV20xWmVURnRXa1JzYTB4VVVYZE5iVlYwVDBSYWJGcHBNVzFPVjBWNlRXcGpNVTFIU1hwUFIwMDJZek5TZVdGWE5XNVBhelZzV2pKR01HRllXbXhKYmpGa1psTjNhVnBYV20xYVYwNHdZVmhhYkZKSFJqQmFWbEp3WWxkVmFVOXBTVEZPTWxKc1RtcG5ORnBwTVcxT1JGa3pURlJTYUZsVWEzUlpWR3MxVG1rd01rNXFWVFJOZWtreVdWUkZlRnBxWXpaak0xSjVZVmMxYms5cVNYZE5ha0YwVFVScmRFMXFhRlZOUkZrMlRWUlZOazFFUW1GSmFYZHBZek5TYUdSSVZucEphbTlwV1dwa2EwNXRXVFZhVjAxMFRVUkZNbHBUTURCT1YwWnJURmRKZDA5SFZYUk9hbWN6VFVkTmQxcFVWbTFaYWtVelQyNU9NR050YkhWYWVuQnRZVmMxYUdKRFNqbG1VM2czU1cxYU1XSkhlRlpqYlhkcFQybEpNMDVVYXpSYVZFRjRXWGt3ZWxwcVNUQk1WRkUwV1cxSmRFOUVSWHBOVXpGcFQwUnJORTU2VG1oYWFsRXlXbFJWTm1NelVubGhWelZ1VDI1V2VXSnFjREZrVjJ4clQycEJlVTU2Vm1sYWJVWnRURlJSTkZwdFNYUk9SRkpzVFVNd05FMUhUbXRNVkd4cVRsUkJNRnBxWjNkYVZGcG9XbE5KYzBsdVNteGpNamt4WTIxT2JFbHFjRGRKYmtwc1l6STVNV050VG14V1NHeDNXbE5KTmtscVdtcE5WRTB4VG5wV2JFeFVhM2xPVkZGMFRrUm5ORmw1TURSTmVtZDNURlJSZVU0eVdYZE5ha0pzV1ZSUk5VMXFjSHBrU0Vwd1ltMWpObFV6UW14Wk1teDBXbGMwYVV4RFNqQmxXRUpzU1dwd04wbHRUblphUjJ4MVdubEpObGN6YzJsak0yeDZaRWRXZEVscWIybE5la2w2VDBkV2FsbHFRWFJOVjFVMVRWTXdNRTU2U1RSTVYwa3lXWHBWZEU1NlFUVlBSRkp0VFVSWk5WcHFUWGRQYms0d1kyMXNkVnA2Y0c5a1NGSjNUMms0ZG1NeU5YWmlWMVpyVEcxc2RWcHRPSFpqTWs0d1NXbDNhVmt5T1d0YVUwazJTV3BHYlUxVVp6Tk9WRmt5VEZSRk1rMUVXWFJPUkZaclRXa3hhRnBFYUcxTVYwVTBUVmRSZDFwcVozaFphbU16VGtSd2VtUklTbkJpYldNMlRXcFZORTVVUVhkTlJFRjRTV2wzYVZwSGJIcGpSM2hvWlZOSk5rbHFUWGxPUjAxM1dWZFJNVXhVVFhkWlZFRjBUa2RSTWs5RE1XaE9SR3QzVEZSWmVGcHFSbXROTWxWNFRqSkpNMXBFY0hwa1NFcHdZbTFqTmxSdFJucGlNMEp2V1ZoS05XSnRaR3haVjNkbll6TmthRmxwU2psWVdEQnpTVzFPZG1KSGVHeFpNMUp3WWpJMGFVOXVjMmxaTWpsellrZFdhbVJIVm10U1IwWXdXbFpTY0dKWFZXbFBhVXBwV20xS2FGcFVhM2haZVRBd1RrUkZlRXhVVVhsWmJVbDBXV3ByTkU5RE1XaE5Na1V4V21wTmVrNUhTbWhPZWtVMll6TlNlV0ZYTlc1UGFrbDNUV3BCZEUxRWEzUk5hbVJWVFVSWk5rMVVWVFpOUkVKaFNXNHhPV1pUZURkSmJWb3hZa2Q0Vm1OdGQybFBhVWw0VFRKSmQxcEhUVEpQUXpCNVRWZFdha3hVVVhkWmVtTjBUMWRLYWxsNU1ESlpWRkY2VG0xYWJGbHRWWGxQVjFVMll6TlNlV0ZYTlc1UGJsWjVZbXB3TVdSWGJHdFBhazVyV1cxYWJVMUhVbXhNVjFFd1dWUlJkRTVIVlhoYVF6QTFUMGRLYlV4WFJtMU9lbEY1VDBkSk5GbFVRVEJaYVVselNXNUtiR015T1RGamJVNXNTV3B3TjBsdVNteGpNamt4WTIxT2JGWkliSGRhVTBrMlNXcG9hRmxVUm10YVJGa3lURmRSZWxwcVZYUk9SMGw0VFhrd05VOUVaR3BNVkdkNFdsUk5NazVVVVRCYVIwVjRUbXB3ZW1SSVNuQmliV00yVlVoS2FGa3pVbkJrUjJ4MlltMVdlVWxwZDJsaWJVWjBXbE5KTmxjemMybGtSMVkwWkVOSk5rbHFaR3RQUkZKb1QwUmplVXhVV21sWlZFVjBUa1JKTUU5VE1XbE9Na1V5VEZkRk0wMVVSWGxPVkZwcVdsZFplVTlFY0hwa1NFcHdZbTFqTmxKSVNXZFVWMnhxWVVkR2JHSkRRazFoVnpCcFpsWXdjMGx1UmpGWlYzaHdXbTFzYWxsWVVuQmlNalJwVDJ4ME4wbHRUblphUjFWcFQyNXphVmt5T1d0aFZ6VnVTV3B3WW1WNVNucGxXRTR3V2xjd2FVOXBTVEJPVkZVeFRXcG9iVmw1TURWT1IwVTFURlJTYTA5SFJYUlpWRVY0VGxNeGExbFVXWHBQVkU1cVRrUnJNMXBxVlRaak0xSjVZVmMxYms5dGFEQmtTRUUyVEhrNU1GcFlTblJoVnpWMllrYzVibVZUTlc5aVJHTjFZak5LYmt3d1RuWmFSMVpVWlZoT01GcFhNSFprYWtsMFRVUkpkMDE1U1hOSmJVNTJXa2RWYVU5cFNtMU9hbFpzV1RKYWJWcFRNREZOUkZKclRGUlNiRTVYVVhSWmFrNXJUbE13TVZsNlRYZE5la1V4V2xSamVVNUhVVFpqTTFKNVlWYzFiazlyTVVSVmFVbHpTVzFTY0dNelFuTlpXR3RwVDJsS2JVOUhUbTFQVkVWNFRta3dNMDU2V21sTVZGRTFUV3BqZEU5SFJYZFpVekF3VGxkV2FVMXFSbWxhUkVKcVRrZEpObU16VW5saFZ6VnVUMnhDZVZsWFRqQmhXRkp3WWpJMWJHTnBRazVhVjFKd1dUSkdlVnBUUW5Wa1Z6RnBXbGhKYVdaV01UbE1RMHB3V2tkV2RXUkhiRzFoVjFaNVNXcHdZbVY1U25CYVEwazJTVzFhYTFwdFZYaFpNa1pzVEZSck1WbFhUWFJPUjFab1drTXhhRTU2VFRCTVZGWnBXbXByTVZsNmJHaE5ha0pxV2tSd2VtUklTbkJpYldNMlZGVk9VMGxwZDJsa2JVWnpaRmRWYVU5cFNUQk5la1V4V2xSV2JWcERNRFJhYWtWNlRGUlJkMXBVWTNSWlYwVjNUVU14YTA1SFVURmFWMFp0V1dwTmQwNXRUVFpqTTFKNVlWYzFiazlxUlhsTmVsRXhUbWxLT1ZoVGQybGhXRTU2WkZkV2VVbHFjRGRKYmxJMVkwZFZhVTlwU21wTmFtZDZUbnBCZDA1VE1XbE5SRlUwVEZSU2FscHFZM1JQVkZFd1RWTXhiVTB5U20xYWFsRXdUbnBuTWxscVdUWmpNMUo1WVZjMWJrOXJPWGxhTWtaMVlWaHdhR1JIYkhaaWFVbHpTVzVLYkZwdFZubGFWelZxV2xOSk5rbHFVVFZhYWxGNVdXcFdiRXhVVG1wTlIwVjBUa1JKTkU1NU1EVk5WMFV3VEZkYWFrNUVSWGhaVjBVd1dUSlZlazVFY0hwa1NFcHdZbTFqTm1SWVNuVlBibFl4WVZkUk5sbHRUVE5OUkZreFdsZFZkRTVFU21oWlV6QXdUbnBPYUV4WFJUSk5WRkYwV1ZkYWEwOUhSVE5aYWsxM1dXcEdiRWx1TVRsWVdERTVURWh6YVZwdVZuTmlSbFo1WWtOSk5rbHRSVEJPVjFFelRXMVNha3hVVlRKT2VsVjBUa2RPYVZwcE1EVk9SR2N5VEZSS2JVMUVTVEJOYlZFMFRrZFdhRTFxY0hwa1NFcHdZbTFqTm1SWVNuVlBibFl4WVZkUk5sbHRUVE5OUkZreFdsZFZkRTVFU21oWlV6QXdUbnBPYUV4WFJUSk5WRkYwV1ZkYWEwOUhSVE5aYWsxM1dXcEdiRWxwZDJsamJWWjZZak5XZVZreVZXbFBibk5wWTIxV2VtSXpWbmxaTWxaVlpWaENiRWxxYjJsYVZFSnJUbTFKTUZwdFJYUmFWMDVxV1drd01FNUhSVEpNVjBadFdsUkZkRnBVVG1sT1JFcG9UMVJzYlUxNlNURlBiazR3WTIxc2RWcDZjRkJqYldSb1ltMXNObGxZVW5CaU1qUnBURU5LZFZsWE1XeEphbTlwV1cxS2JVMUVWVEJhVjFWMFQxUkJNRTlETURCUFJHdDZURmRKTkU5WFRYUlBSMGt6VG5wck1VNTZZM2ROZWtFMFQyNU9NR050YkhWYWVuQk9ZVmMxY0dNelVubGxVMEoyV21sQ1NWcFhSbk5rUjJkblMwVXhVRk5EYTJsTVEwb3daVmhDYkVscWNHSmxlVXBxWWpKU2NHSnRZMmxQYkhRM1NXNU9OV016VW14aVUwazJTV3BGZDAxcVJUQmFha2t3VEZSUmVVMUVaM1JPUjFFd1RXa3hhVTE2Ykd4TVZGRXdUbGRXYkUxVVVtbFpNa3ByVDBSd2VtUklTbkJpYldNMllVaFNNR05FYjNaTU0xSnNZMjB4Y0dKdE9YTmlNbVExVEcxb2MwNTVOWFpqYldOMlVUSTVhMXBXVGpWak0xSnNZbE01ZG1OdFpHaGliV3cyV1ZoU2NHSXlOSFJrU0d4M1dsTkpjMGx0VG5aYVIxVnBUMmxLYkU5RVdtbGFWMUV3VDBNd2VVNUVXWGRNVkZKdFRYcE5kRmxYVW1oUFF6RnNXbTFOZDFscVNUSk5WRlpwV1ZSUk5tTXpVbmxoVnpWdVQyMWtkbVJ1VVdsTVEwcHJZVmhPZDJKSFJqVkphbTlwVG1wck1GcFhTbTFhVkZsMFQwUlNhazU1TURCT1ZHYzFURmRGTkUxSFJYUlBWMUYzV1ZkUk5FMUVRVEZQUkVFMVQyNU9NR050YkhWYWVuQklZak5hYkdOdE5YUmFWelV3U1c0eFpHWldNSE5KYlU1MlltNVNhRmt6VVdsUGJIUTNTVzVTYkdKSFZtcGlNakJwVDJ4ME4wbHVUalZqTTFKc1lsTkpOa2xxWjNoTmFrSnJUakpaTVV4VWJHdE9hbWQwVGtSQ2FVNURNV2xaZWtGNFRGUkZNRnBFUW10WlYwcHRUMWRXYWsxcWNIcGtTRXB3WW0xak5tUllTbk5KYVhkcFpHMUdjMlJYVldsUGFVbDRUVlJaTWxsdFNYZE9hVEF3VG1wRmVVeFVVVFJaYW1OMFdWZFJkMDVETVdsWmVsVXpXbXBKZDA1NlNtdFBWRlUyWXpOU2VXRlhOVzVQYldnd1pFaENlazlwT0haa00yUXpURzB4ZG1GRE5XNWlNMWwxWXpKamFXWlRlRGRKYms0MVl6TlNiR0pUU1RaSmFscHRXbXBOZDA5VVJtMU1WR3N3VFhwRmRFNUhSWHBhYVRGb1dXcGthMHhVVlhwWmVsVjVUbTFSZUU1RWEzbE5hbkI2WkVoS2NHSnRZelpqUjJoMlltMVZhVXhEU2pKWlYzZ3hXbE5KTmtsdFJYaFBWRWt3VDFkVmVVeFVhekJOZWsxMFRrUkZOVTVUTURST1IwWnBURmRTYUZscVRYbFBSMVV5V21wak1scEVjSHBrU0Vwd1ltMWpOa3Q2V1RGT2FrMTVUbFJyZVUxcVFXbG1WakJ6U1cxR2ExcElTbXhqTTAxcFQyNXphV1JJYkhkYVUwazJTVzFLYTAxcVRUQk9WR3MwVEZSbmVWcFVaM1JPUkVKb1RsTXdORmxxUW14TVZGcHNUa1JqTVU5VVRtaFplbWN6V21wd2VtUklTbkJpYldNMlkwZG9OV015YkdwWlYzZHBURU5LTVdNeVZXbFBhVWt4VFZSUk5FNUVUWGxQUXpGc1drUmpNVXhVVVRST1ZFMTBUMFJHYUU1cE1EUk5iVVY2V21wU2EwMVVXbXhQUkVVMll6TlNlV0ZYTlc1UGJtUjJZMjF6YVV4RFNqQmFXR2d3U1dwdmFVMVVUVFJQVjAxNldWUkZkRnBxWXpWWlV6QXdXV3BzYkV4WFNURlpla2wwVGtSck1rMVhUbXhPYWxwcFdYcFZNRTl1VGpCamJXeDFXbnB3VG1GWE5YQmpNMUo1WlZOQ2RscHBRa2xhVjBaelpFZG5jMGxFUlRKSlJVNTJZa2Q0YkZveVZXZFZiVGxvV2tOM1oxRXlPWE5pUjFadVdsTkNkbHBwUWs1YVYxSndXVEpzZFZwVFFrTmtWMnh6V2tkc2RWcDVkMmRWTW14MVdqSkdkMkl6U214SlJFVXlUMVJuTVU1RFNqbG1WakU1WmxONE4wbHRXakZpUjNoV1kyMTNhVTlwU1RSYVZHTTFXbTFOTUU1NU1XcE9hbFYzVEZSUk5GcHRWWFJQVkZKdFdrTXdNRTVxUm14T1ZGWnFXVEpWTlUxcVVUWmpNMUo1WVZjMWJrOXVWbmxpYW5BeFpGZHNhMDl0V21oTmFrMTVUMGRHYlV4VVVUUlBSRWwwVGtkV2FGbFRNRFJaZWtrMFRGUlpNbHBIUm1sT1JGazFUbFJDYlUxVFNYTkpia3BzWXpJNU1XTnRUbXhKYW5BM1NXNUtiR015T1RGamJVNXNWa2hzZDFwVFNUWkphazE2V1dwS2FVNUVVVE5NVkVGNldUSlJkRTVFU21wT1V6RnBUMFJPYUV4WFVtaE9SRlV6VGtSUmVGbHRXWHBOYW5CNlpFaEtjR0p0WXpaVU0wcHVXVmMxY0dWdFJqQmhWemwxU1dsM2FXSnRSblJhVTBrMlNXcFNhRmw2UlRCUFIxVjNURlJTYUU1dFRYUk9SRkV5V1ZNd05FNXFVbXRNVkU1c1dXMWFiRTlVV21oTmFteHBXbXB3ZW1SSVNuQmliV00yVkZkR2FsVnRiREJaTW1od1dsTkNUbHBYVW5CWk1rWnpTVVZPYzJGWE5YQlplVWx6U1c1U05XTkhWV2xQYkhRM1NXMU9kbHBIYkhWYWVVazJWek56YVdNemJIcGtSMVowU1dwdmFWcFVXWGxOYW1ocVRYcFZkRmxxWkdwT1V6QXdXVEpWZUV4WFNtdGFWR04wVFdwYWJGbDZTVFZOUkd4cVRVZEdhRTl1VGpCamJXeDFXbnB3YjJSSVVuZFBhVGgyWkVkV2VXSlhiSFZpTW5oMldqTnJkV0ZIZHpOTWJUbDVXbms1UkdJeVVteFZNMng2WkVkV2RFd3lPWGxhTWtaMVlWaHdhR1JIYkhaaWFURXdaVmhDYkVscGQybFpNamxyV2xOSk5rbHFaekJQVkVFMFRVUkJlVXhYVlhwTlZHTjBUa1JSTWxsNU1XbE5SRVUwVEZSU2FVMXFRbTFaZW14b1dsZE5kMXBxY0hwa1NFcHdZbTFqTm1OSVNuWmthVWx6U1cxU2NHTXpRbk5aV0d0cFQybEpNVmx0VG1oWlYwbDNUbE13ZDFwVVFtMU1WRkY0V20xVmRFOVVVVE5OZVRBMFRqSldiVTFVVlRKUFZHZDNXVmRKTm1NelVubGhWelZ1VDJ0b2JGbFhlREJoUjA1b1kyMVZaMVZJU25aa2JXeHJXbGhKYVdaV01ITkpibEpzWlVoUmFVOXBTbXBOUjBrMFdsUk5NMXBwTUhwUFJGbDZURlJSTUU1dFNYUlphbXhyVGtNeGJFNXFiR3RaYlUweFdYcEthVmxxV1Raak0xSjVZVmMxYms5cmVIQlpNbFoxWXpKV2EwbEZhR3haVjNnd1lVZE9hR050VldkVlNFcDJaRzFzYTFwWVNXbG1WakJ6U1cxT2RtSnVVbWhaTTFGcFQyeDBOMGx1VW14aVIxWnFZakl3YVU5c2REZEpiazQxWXpOU2JHSlRTVFpKYlZsNVRVZEpNRTlIVW1wTVYwbDVXVzFSZEU1SFZtMVphVEEwVFRKWk5FeFVWWGhhVjAwMFRrUkplRTFYUlhoTlZIQjZaRWhLY0dKdFl6WmtXRXB6U1dsM2FXUnRSbk5rVjFWcFQybEpNMDU2UVhsT2FsWnRUVk13TkU1dFZtdE1WRkpyVG1wWmRFOUVWWGhhUXpGcFQwUkZNMDVxVFRKTlZFMHpUbnBOTm1NelVubGhWelZ1VDIxb01HUklRbnBQYVRoMlpETmtNMHh0TVdoWk0wcHdaRWRPYjJGWFZtcGlSMngxWVZkTmRWa3lPWFJNYms1dVNXNHdjMlY1U25wbFdFNHdXbGN3YVU5cFNtcE5la3ByV1hwRk5FMVRNRFJPZW14clRGUlJORTR5V1hSWlZFNXRUVU13TTA5VVRYZE9SR1JyV1hwbmVVOUhVVFpqTTFKNVlWYzFiazl1UW05aU1qVnNTV2wzYVdSdFJuTmtWMVZwVDJsS2JGcEVUbTFOUjAweVRsTXdNRnBYVW1wTVZGSnJUbXByZEZscVVteE5hVEF5V20xUk1rOVVTWGhhUjFVelQxUk5ObU16VW5saFZ6VnVUMmx6TWs1VVdYaE5hazB3VGxSWk0wbHVNV1JNUTBwb1drZFNlVnBZVG5wSmFuQTNTVzVTTldOSFZXbFBhVWt3VFRKWmVscHRVWGRhUXpBeVRrUkpNRXhVVVRKT1ZHZDBUMGRXYTFwRE1XMVpla3BzVFRKR2JFNUVVbTFaYlZVMll6TlNlV0ZYTlc1UGJrSnZaVmhPY0ZreVJuTkphWGRwWkZoT2JFbHFiMmxOZWxWM1QwUmpNMXBxUlhSYVYxRjNUV2t3TUZwcVFYZE1WR3N6VFhwTmRGcHRSVEpOVjBwcVdrUlplazB5VFRWUGJrNHdZMjFzZFZwNmNETmlNMHB5U1dsM2FXUkhWalJrUTBrMlNXMU5ORTVxVW10YVZHeHRURlJCZWxreVdYUk9SR2MwV1dreGFVMVVVVEpNVjFVeFRqSldiRTFxYUdwT01rMTVXbFJ3ZW1SSVNuQmliV00yVkZkR2FsVnRiREJaTW1od1dsTkNTV0l6VG5kaFdGSm9Za04zWjFaSGFIWmlXRTUyWW1sQ1UySXlSbXRNUTBKVVlWYzFibGxZUW5aamJWVm5UVlJKZWsxRVFYZEpiakU1V0ZneE9VeEljMmxhYmxaellrWldlV0pEU1RaSmFtaHBXbGRGTWs5RVNUTk1WRVpyVGxSQmRFNUViR3hPVXpGb1QwUnJlRXhVVlRCWmJWbDVUV3BrYTA5WFZtbE9SSEI2WkVoS2NHSnRZelprV0VwMVQyNVdNV0ZYVVRaUFJFMDFXVlJrYWs1VVVYUk9iVWt3VFVNd01FMVhUbWxNVjBsNFRVZFJkRTlVU1RWT1YxRXpXbFJqTVZwcVl6TkphWGRwWTIxV2VtSXpWbmxaTWxWcFQyNXphV050Vm5waU0xWjVXVEpXVldWWVFteEphbTlwVG1wak5FOVhWbXBhVkdOMFdtcE5ORnBETURCT1JGazBURmRKTlZsdFdYUlBSRlY2VFdwUk5VMVVhekpPUkVwclQyNU9NR050YkhWYWVuQlFZMjFrYUdKdGJEWlpXRkp3WWpJMGFVeERTblZaVnpGc1NXcHZhVmxYVFhsWlZGVTBUMVJKZEU1WFdUQlBRekF3VFZST2FFeFVaM2hPYWtsMFRrUnJNMWxYU1hkTlYxRjNXbFJKZWs5dVRqQmpiV3gxV25wd1RsbFhUbE5oV0ZKcVlVZHNiRWxGZUdoWmJUbDVXVmhTZG1OdWEybE1RMG93WlZoQ2JFbHFjR0psZVVwcVlqSlNjR0p0WTJsUGJIUTNTVzVPTldNelVteGlVMGsyU1dwR2FFMUhSVEZaYlU1b1RGUlJlbHBxUlhST1IwMTVUWGt4YVU1SFNYZE1WMDV0VG1wS2FFOUhTVE5PVjBVMFRrUndlbVJJU25CaWJXTTJZVWhTTUdORWIzWk1NMUpzWTIweGNHSnRPWE5pTW1RMVRHMW9jMDU1TlhaamJXTjJVVEk1YTFwV1RqVmpNMUpzWWxNNWRtTnRaR2hpYld3MldWaFNjR0l5TkhSa1NHeDNXbE5KYzBsdFRuWmFSMVZwVDJsSmVFOVhVVE5aZWxKb1Rua3hiRTlYV1hoTVZGRTFXbTFaZEZsVVRtcFplVEF3V2tST2FrNVhWVFJaVjFKb1RXcEJObU16VW5saFZ6VnVUMjVDZVdJeldXbE1RMHByWVZoT2QySkhSalZKYW05cFRYcEtiVTFxWnpWT2FrMTBUbnBrYUU1NU1EQk9WMWw2VEZkRk5GcFVXWFJPTWxwc1RtcEJlazFFUlhwWmJVVXpUMjVPTUdOdGJIVmFlbkJKV2xkR2MyUkhhR3BaV0Vwc1NVWkNlV0l6V25CYVIxWjVTVzR4WkV4RFNqQmFXR2d3U1dwdmFWcHRVWGhOZWtwb1RXcFpkRTVVUlRGTlF6QXdUVlJSZUV4VVp6Vk5SRVYwV2xSWmVGcEVUVEJPZWtGNFRqSktiRTl1VGpCamJXeDFXbnB3UWxreVRubGFWMUp3WkVkV2EwbEZlR2haYlRsNVdWaFNkbU51YTJsbVZqQnpTVzFPZG1KdVVtaFpNMUZwVDJ4ME4wbHVVbXhpUjFacVlqSXdhVTlzZERkSmJrNDFZek5TYkdKVFNUWkphbXN3VG5wbk1rOVVXbXBNVjFVeldWZEpkRTVFUlRCTmVUQTBUMVJvYkV4WFdtdFpiVnBxVDFkWmVrMUVZekphVkhCNlpFaEtjR0p0WXpaa1dFcHpTV2wzYVdSdFJuTmtWMVZwVDJsSk0wNTZRVEJPVjFWNFdYa3dNVTV0VFhsTVZGSnFXbFJWZEZsWFVURlpVekF5V1cxR2FrMTZRbXhOUkZKc1RtcGpObU16VW5saFZ6VnVUMjFvTUdSSVFucFBhVGgyWkROa00weHRNV2haTTBwd1pFZE9iMkZYVm5OWlYwcDJZMjFHTUdJelNqVk1iVTUyWWxNMWVscDVTamxNU0hOcFl6TnNlbVJIVm5SSmFtOXBUVWRKZWsxcVdtbGFiVmwwV1dwTk1FOVRNREJQUjFGNlRGZEdhRTlIVFhSTk1ra3dUbGRTYlZwSFRtaE5hbXMwVDI1T01HTnRiSFZhZW5CM1lVYzVkVnBUU1hOSmJscG9Za2hXYkVscWIybGFWMXBvVG5wamVWbFVWWFJOTWxFelRWTXdNRTlVWTNsTVYwVjZUbGRaZEUxVVozaE5WMUV5V21wYWFVMVVhelJQYms0d1kyMXNkVnA2YjNKT2FsVXlUbnBaTVU1RVRYbE5VMG81V0ZOM2FWbFhVbXRqYlZaNlkzbEpObVY1U2pCbFdFSnNTV3B2YVU1VVJUUk5lbGsxVFZSVmRGcEVhR3ROVXpBd1dtcEtiVXhYU1hoTlZFRjBUVlJDYUU1dFZUSlpNbFpyV2xSU2EwOXVUakJqYld4MVducHdkMkZJYkhwaFYwNW9Za05KYzBsdVZucGFVMGsyU1dwak5GcEVZelZQUkZFMVRGUm9hazVIVVhST1JGcHJUWGt4YVU1VVdtdE1WMUY0V1ZkTmVsbHRUbWhPYlZreFdrUndlbVJJU25CaWJXTTJaREk1ZVdGNVNYTkpibEpzWlVoUmFVOXBTWGhQUkdNMFdtMVZNVnBUTUhkT1JFa3pURlJSZDA1RVVYUlpiVTB6V1hrd2VrOUVTVE5OTWxab1dtcEthazFYUlRaak0xSjVZVmMxYms5cVNXZFdSMmgyWWxoT2RtSnBRa0prYlZaMVpGZFZaMDVEZDJkVk1teDFXakpHZDJJelNteEpSRUUxVDBSbk5FOURTamxtVmpFNVpsWXhPVXhEU25OaU1tUjJTV3B2YVZsWFNUSk5WRkV6VFVSWmRFOVVSWGRaYVRBd1dWUk5lRXhVYTNkYVIxbDBXbXBqZDA1WFVUVlBSMHBwVG5wbmVVOXVUakJqYld4MVducHdhMWxZVW1oUGJXeDBXVmRrYkV3elFuVmFlblJwV1ZoT2JFNXFVWE5oVmxwRFZERktNMDFGZEVoYU1qbENVVlZHUWxSc1RsWmhSVlpXV2pCR1FsRlhXbEpSVlVaQ1VrVnNSRkZWTVVKUlZVWkNZMGhuY2xWSFJrSlJWVVpDVkZSR1ExUldXa1pXVlVaQ1VWVlNUbVZyTVRaVVdIQk9aV3N4TmxSWWNFNWxhekUyVkZod1RtVnJNVFpVV0hCT1pXc3hObFJZY0U1bGF6RTJWRmh3VG1Wck1UWlVXSEJPWldzeE5sUlljRTVsYXpFMlZGaHdUbVZyTVRaVVdIQk9aV3N4TmxwVlRuUmhWVVpDVVZWR1FsSlZhRk5WTVZKelZGVkdVbFJEZEVKT00yaENXakkwZVZKR1FYcGxhMG96WTJwR1JGVkZWbk5MTUd0MlZWVkdRbEZ1Wkd0VGJFcEdVbXhXYkZSdVNucGliVkY0VFdwS05XSXhSbE5rYlhSSlUxWk9TVlJwZERaTU0xSTFWbGR6TldJeFVrWlJNVVY0V1d4U1ExbDZTWHBaYm14UFkzcENRMDVWWkVwU1JVWlRVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlhjM0pUVjNOeVUxZFNORTVIWXpGVWFsSkRUMVZrVWt3elNsRlJWR3hMVERCc1VWcHNUbTVrTUhkMlZGVldSbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1FsRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVkl6VlVSV1lWVkhPVkZPV0VrelVtdHdURkZYV1ROWk0xWnRVVzFzYjFWRk5WUmhNV2N4WVVkNFFrOVlWWEpTU0U1UlRqSlNXVXd3Y0V4TlZrRjVWbXhDY0ZVd2JIWmFWMHBHWTJ0NE0xWnRaekZYYm1keVQwVk5lRmRVU1hsWFdGSlJUVVZhZDFwcVdtOWFSMVpvU3pJeGVFMVdaSE5oV0dodFdsZHZNbFZ0VGtWbFIyOTNUMWhPTTFkSFNtbGFWVXBTWTBkc2NXUlhZM2xOUjBaeFRERk9SazlIU2pKaWVsWnZVbGhXYUdSclJqRlZNSFIzVlZkYVMyVkdVa2hQVkVadVZsaEtSRlpxV25GVk1VWkdUVWM1VVdFeVZUQmtNMVp5V2xSamQwNVZWbmhqUlhoUFZqTm9NRlJZVWxSaGVsSnhaR3hvU0dKSFVYSmtSWGh6WlVoYVYxUlZOWFZaVjNSRlRqSXhSbUp0VWxwV1JscFlWVEkxVjA5RVdYZFdNVlpaWWtSTk1GVnJNVFZPTUVwc1lsaENOVkl6Y0U5T00wSkNXVzB4V1ZKVlJUSlpiVm95VTNwQ01VMTZTakZXUlZwTVV6RmFUazFJU1hkWFdHTjRWRlpTYWxKdVduZFBSMnhYVkVaQ1JVMURjelZhTUdoU1pWTnpNMk5zVG0xTk1sWnNZVzVCZVZOSVZrZFpNMDUwWWtkU2NGSlliM2RTYm5CTVYwZGFWRlZ1WTNwalYxVjNUMFpvZUZwRWJHdFZSRnBTVXpBNVQySnRkREZPUjNoSVRUQTFWRmxwT1ZOUmJsSk1aRVYwTUUxWVVqQmFSVXBMWVZac2FVMXNXa3BPTWtwNVdYcGtNRmw2YUVwWFZ6a3dVMjV3U1ZaVlNYZFplWFJRU3pGUmVtTnNVbEprVlhoTVl6RndVMk5ZUWpaaE1WSlVUakpTWVZOVVVqSmllWFI0VTIwMWExSlZaRkJQUlZZMldsZE9OV0Z0Um1wT2FUbEtWa1UwZVZNd09WaFpWbFpOVTFaUmRsbFZlR3RhVmxaMVkxaENhMkZVWkZkV2VrbHlVek5zYWsxcWJFZFVSRTU2VGpKVmVtRkhhekZVUmxKVVlVZFdXRll6UWpWV01uaEpUa1pvTm1KWVdsaGhiVFZ3VkRKc1IxUnFUbHBXTUZKd1pHeGtTazlVU2xoa1YzTXhXVE5SZVZGNlFuZE5NSEEyWWtSc1dsUnFXVEpXTUdzeFUxWlpkbFp1YkVkUFJGcDVUVmRGZUU0elFrbE9WbFpPVVhwQ2QxZERPVVZrTVdoWFZsUlZlVTVGZEhwT1ZteHVVa1p3ZEZSRVVqWlNNMjk0WkhwbmQyTkVUWHBWUjI5NFkwVXhNbGt5YTNKa1IwMTVXVEJhU21GdE1XOVRSRXByVmpGYWJXUlhSbGRVU0ZaTllXNXJOVnBXVWpaYU0wWlFZMjVHYkdReldYZGtibFowVEhwR1RGVnFVWEpOYlVVeVVrZG5NV05HYUZCT01WazFWSGwwZWs1RmRGTlRiRUpDVWtoV05GUnRjREJoYTFwRVVUSnpkbEV5ZURCU1dIQnVXbTV3VkdSSFZubFZNMXByVjJ4R1lWcFZVblpsV0d4NFpVWkdibVJXU1hoaVJtaDBVVzE0U2t4NmJGRlZNbFpwVjI1Q2FWUXlWVFJaYld3eVpFUkthVkpyY3pWWFYwWk1Ua2RXU1ZwVVpFOVVSVFZvWkVWNFVVMHpSa2hYVlhodFZFUmplRlZ0T1U1a2Ewa3lWMGhWTlU1cmIzcFdSbVF3VDFWNFZXSXhSazVPV0hCMFQwWnNiV1ZIU2tsVFZWWlVWVVp3V1ZkR1kzWmtSemt5VmtaT2Rrc3hRbmhTYm1oUFdsaE9NMWR1Um5GVWVUbFpUVVJzVUdSclNtNWhWR3hRV1RCb00wNHllSE5XV0ZaeVdUTlpjbHBIYTNkamJUVnNZMWRaTlU5WVZsbGlNSFJ1WWtVeFRtUXlSbk5pUkdRMFRESXhOVTFITVhOVlJGWjNZVlphZFdScVRtMWtWbTl5VFZScmVtVkhOWGRXUm14TlpXcE9WR0Z0Vm5GVlJYaFpZMFU0TWxaSVVsbFpibkJaWTBkYVNsWlhUbXhUYTJoMFZVaE9XVkZWY0hwWmEydHlXVlYzTTFwdVducGpTRUpYWXpBNVdVNHpWbWhhUlc4MVVtNWFNVlpFV1hwVlNHaDZWMnRHVWsweFZrNWxTR3h1VkVoc1dHUnVUbkpPYVRselpGZDBNVTVFUW0xWmFtZ3daRWM1YzFKRldrZFpha1poVlZaRk1rd3lNVk5oTTFsNFlWWmpOV0ZVUmt0T2EwMTJUVmRHYkdGclJtcGtiRVpSVm0weFZtUkVXa2RSYWtwcVltcEpNbE51Y0VWVWVsSlZZekpHVFZreFpHeFpWbEpwWW5wa1NtSnFRVEJYUkVFMFRtcHJNbGRJYUZWaWJrcHlZbGh3U0ZFd2FIQmlWekZMWTBWNE1WUnRSbEZoVkdONFdtbDBURlF5ZERCYVZGWktVM3BzVUdOc1RUTk9SMngxV2pGQ1ZGcHJjR3ROVnpsS1ZUQlJOVmRxUW5STU1taFJZVVZKZDJKNWMzWlVSMUY2VkZVeFNGWllTbFJXVkZrMFkzcHNOVlpZY0ZsVk1EaDZZek5XYjFaNWRFTmhRM1JMWVdwQ2RtVlliM2xqTWpWaFkxZGtkMWt6Y0d0T1Yyd3pZMGhhVTJSdE1VeGFiR2gzVjFNNVVVMUliR3hWTWxwNldqQm9VR0ZIZUhCa00xSk5WWHBrYWxGc1RuQlZha1pvVjJ0YVVVMTZRbmhMTUVvd1RUSmFXVmxyY3pWaFJrVjVWa2hKY2s1SVNsUlplWE0wV2tkYWMxZEZUbEJOYlhjeVkwWnJjbFZGYkhwT1dFSkhUVmhvZWs1SGRIUlpiR2hYVVdwYU5rMUZjRmhWYkVwclUwTnpNbEZxUWpOUFJscHNZak5zYTFwV1pITldhbWN3WlVkR1ZsUkhOVEpYUkVFMFpHdFdObFJ0TkhKVFJYQlFaRk4wTUZwc1VYaFpNVTVwVXpGQ1RWcFlaREpXTW5ScVRESk5lRXd4YkRCamVsSlVZa1Z2Y2xKRmFIZGtWelY2VW1wTmQwNXFiRmxWTTBvelRqRmFiMVZYVm5OT1IyUkpWR3BPVW1SVmFGQlBSM0JHWVhrNVVFOUhUa1JMTVZaMlRETkNXVlZwZERKU2VrSk5WVEkwZGxkc2FEUmlSbWcxVTFjNWFrNXFRbEZWTW1oc1lrZFNNMlJ0VWpaWmFsSkpWbnBPU2s1NlJuZFVlVGgzWkRCb1dtTlZPVXBqUkdneVRrUkdTMVpFVlhsV1JUVnhXbXBXY1dWRVNUQmFiVEZHVDFSYVdGUklTa2hPZVRscFl6STVUazV0Vm05Uk1HUjNVMnBvZWsxRE9XRldhazV5VDBoR2RWWkZPV3RYUkVaRFRtcGFTVlF5WkdsT1Iwa3hVekZLYldSSGR6Rk9SMXBFVGpJNU1tVllXbUZYYmtKWlpFUmFTMlZVVW5aTk1YQjRXbGRTVUdSck1WVmFTRTV6VlVaV2IxSkVRbmxpUm1RMFpHeGFUbEp1VWxSTlJrRjRWbFU1ZFZWSVdsaGhlbWN3VjBkU2FVMUZVa3BYUm1OMllUQm9jRlJXVGsxYVZ6QXpZMnN4VGxNd1VuUmtSR3hMVFVWb2RGb3pVa3hNZWs1RFducGtTR0ZIWkZCU01IaEVXakZDVlU5SFJtMWpSRVozV2taU1JtVkVVVFJQUkZwMVdqTlNURkpxU21wUFZUbDNZekprVjFKSFNsQlRNRTVMVkRGR2FHRXlhM0pOVmxwNVVtMXJjbVF6U25CVGJrSnRWRzFGZG1JelNsUmhSMDU1Vm5wSk5FNXRjRTFYV0U0MVpWZGFZVlJIZHpSVk1GWXdZbXN3TWs1WGIzaFZNSGhKU3pOa1dWWnJZekpoYlUxM1VrWnNTazlVWnpKU2JsWnhVekJ3ZFZWVmVGZE5SMDE0VkZoS00wNHpUbEJPVnpSMldtNWtNMUpIV25KaU1tODFXakphUlU1SE9UWmhTR3hIVVZaV1YxUllSa05WYlhoYVkydE9hMDFIT1ZaaWJFcDVZVEpzTlZKWWNGQlZSVnBQVkVWYU5sWkljRlZPVmxwelVXeG9hMDB3T1hSUFJ6azJZVEJLTUZRd09XdFNSa0poWVRGVk5XRjZhM1pWUlU1M1ZFZDBTVmxZU25WWGJGWnRVMWRvV1ZReldYZE1lbHBLVlROWmQxVXdPV3BrYlc5MlRWZEpOV1JJY0cxaE1EUXhVbnBPTkU0eVZtbGFSV3h2VFhwU1dGcHJXVEprU0VKRlkyNUtXbE42V2xGV1dFSnJUSHBTYlZOc1RYcFpia0paV1ZoS01GUXdjRTlMTVU1VFVrVktXVlF6V1hkaVJGcDBUbXRXTmxkcVJqWk5lbFp6Wkhwc2NrMHhTbEJOUkVaWVZGVmFRMVpVVWtsT1EzTjVUVmQ0VGxsdFNUUlhTRTEzWkcxNE1sZFdXa2xqUkU1UlZsaEdURkV5VG1oVU1GSldZekkxYVZScmVGUlZhbFpxVmtWTmNscEdiM0pqU0VKWFdsZDRSR0pyZEdoTlZFVXpXbFUxVlZSc1JuSlZNVnBIWVZaVmVXUkdRWEpWV0VwVVZERmFNbGRzY0doV1ZYaDRaRE5hTUZWRlRtOU1NbkJyVkZkSmVsVnJORFZQVmtaUVlUSTVjV1JxYUUxak1VWlVUVWR6ZGxSNlkzSmtSWFJ0U3pBMVRsWkVhekpVYkVGM1ZsaGFUV1J0YkhWVmJUQTFVMjAwZVU1SVpGZGpiVXBGVVRKS1NGTlhVa2RPU0doWFVXczFTMHd6YUV0Vk1sVXlWbGRXZGt3d1NuRk1lbXhLVEhwa1JXVlVRbEZrYmtwMVUyNXJNV0l6UWxSVFZrcFRWMnhuZDFsV1JsWlJWVVpSWld4bmVtRkVUbFpSVlVaRVVWWkdRbVZFWkZwUlZWRjJXVmMxUjFGclRrOWFSMFowVTFWR1ExRlZSa0pSVlVaQ1VWVkdRbEZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpDVVZWR1JWRlhNWFJpTWxaTVQxVm9ObUZWU1RGVFZHeEdVV3hvZFdWRWFFSlJWVVpDVVZWR1FsRlZSa0pVUlVwMFVWVnNZVk15TVRaV01HeDFaVWhzVUZGVlJrSlJWVVpHWWtWYVZXRXhUakZWVnpGRVVYbEpjMGx0Ykhwak0xWnNZMjVOYVU5c2REZEpiV3hyU1dwdmFVMXFRbTFPVkd0NFRsUm5kRTlIU1ROWlV6QXdUa2RXYTB4VVp6VlpiVVYwVDFkRk1rOVVUVEJPUjFWM1RVUlZNazl1VGpCamJXeDFXbnB3YTJGWFVUWmFXRkp2WTJwdmQyVkZWWHBQVkZFelQxUnJlVTlGVG1wT1JWWnRVbXRWTVUxRVl6Tk9SRkUwVDBSak5FMUZTVFZhYWxsNFRtMUthMDVGU1RSTmVrRnBURU5LZVZwWVduWlpNa1l3WVZjNWRVbHFjRGRKYmxJMVkwZFZhVTlwU214TmVrVjVXbXBKTWsxVE1XdFBWMGw1VEZSUk0wMTZSWFJQVjBrMVdWTXdlazlVUVRCTmFtaHJUa1JHYUUxVVdUWmpNMUo1WVZjMWJrOXJOVkJVYTFWcFpsTjNhV0p0Um5SYVUwazJTVzFOTVU1VVp6SmFSR041VEZkWk1WbHRVWFJPUjAxNVRWTXdORTR5UlRSTVZFazFUVlJWZWsxWFNURk5WMWw0V2tSd2VtUklTbkJpYldNMlZUQkdUbFZGZUVaSlJVNU5VMVUxU2xGNVNYTkpiV3hyV2xjMU1HRllValZWU0VwMllqSlphVTl1YzJsa1NHeDNXbE5KTmtscVp6RlpWRVpyVGtSV2JVeFVVVEZQUkUxMFRrUk5NMDU1TURWUFZGWnRURmRhYTA5WFVYcGFhbXQ0V1ZSV2JWbDZjSHBrU0Vwd1ltMWpObEpGTlZSTVZWSktVa05KYzBsdGVIWlpNa1l3WVZjNWRVbHFiMmxhVkZacVRrZEdhbHBYVlhSYWFsVjZXV2t3TUZscVVtbE1WMGt5V1RKSmRFNXFSWGhhVkVGM1dUSkpOVTFFU210UGJrNHdZMjFzZFZwNmNHdGlNalYyWkVoYWJHTnRiRzFsVXpVd1dsaE9NR0ZYTlc1TWJscHNZMjFzYldWVE5XNWlNMWwxWXpKamFVeERTbkphV0d0cFQybEthRnB0Vm0xYWJWSnNUa013TUUxcWJHMU1WRkpxVGpKTmRGbHFTbXhOZVRBeVRXcENhMWxVVG14YVZHc3dUa2RGTm1NelVubGhWelZ1VDIxU2NGcEVjR3hrUjJoNVQycENORkpVVFRWT1JHTTFUMVJKTkZFeVRUQlNWMXBIVWxSVmQwNTZZekJPUkdjMFRucG5kMUZxYkcxT2FrVXlXVzFSTUZGcVozcE5RMDVxWWpJMU1HTnRPWE5pUjFaNVNXNHhPVmhUZDJsS1NGSnNZbGhDYzFsWVVteEphbkEzU1cwMWFHSlhWV2xQYVVwcFdWUlJNMDFxWTNkTmVUQTBXbTFWTUV4VVVYbE5SR3QwVDFkUk5GcHBNSGhhVkVKb1RsUk9hMWxxU214YWFsRTJZek5TZVdGWE5XNVBhMmhHVVZWNFZWTkdPVVJTVmtwVlNXbDNhV1JJYkhkYVUwazJTV3BuZUU5RVdUTmFWRWt3VEZSUk0wOUVRWFJPUkZVeVRYa3hhVTFVWnpKTVZFbDRUbnByZUU5WFdUUlplbXQ0VDFSd2VtUklTbkJpYldNMlVsVXhRMUpWVWtWU1ZWSm1WV3RXVDFKRlZsTlNWa2xwVEVOS01XTnRkMmxQYVVsNVQwZEdiVTFIUlhwTmFURnNUMFJKTkV4VVVtdE9lbEYwVDBSamVVMXBNREZPUjAxNFQxUmtiVTV0UlhkT2FsRTJZek5TZVdGWE5XNVBiV2d3WkVoQ2VrOXBPSFpoUjFab1lraFNiMWt5Vm5sa1F6VjVXbGMxYTFwWVNteGphVFYwWWpKbmRWb3lPVEpNYms1dVRIbEtPV1pUZDJsak1teHVZbTFHTUdSWVNteEphbkEzU1c1U05XTkhWV2xQYVVwVVUwVkZlbFJYVm5saE1uaHNWVWhLZG1JeVdXbE1RMG93V1ZoS2JscFlVa2xaV0U1dlNXcHZhVmxYU1hkWk1sazBXWHBuZWsxWFdUQmFiVXBwVGxSVmVWbHRVbWxPYlUwMVdXcEtiRmx0VW1sTlYxWm9UWHBOTUZwdFJtMU9WMUpwVG0xWmQxbFhVWGxOYWxwb1dsUm5NVTFIVFRST2FrRjZXa2RGZVZsVFNYTkpia0o1WWpJNWJVbHFjR0pZVTNkcFlsZFdlV0V5ZUd4VmJUbDJaRU5KTmtsdFJtbE5SMDV0VDBkTk5FMTZSbTFPUjFwcFdXcFZNVTF0U210WmFscHFUMWRKZVZwWFNtdFpha1pzV1ZSTmVrNUhXbWhhYWxacldXcGFiVTFIUm10TmFra3lXVmRWTkU1VVFtcFBSRmwzVFRKU2FFMXRSV2xtVTNkcFkwaEtkbUl5V1dsUGJIUTNTVzVTTldOSFZXbFBhVXBRWTBkV2RWRllVakJhV0U0d1dWaFNjR0l5TlZSaFYyUjFXVmhTTVdOdFZYbE5SRVUwU1dsM2FWa3pTbXhaV0ZKc1drTkpOa2xxU1hkTmFrVjBUVVJuZEUxcVVsVk5SRkUyVFdwSk5rNVVWWFZOVkdNelYybEpjMGx1UW5saU1qbHRWVWhXZVdOSE9YcGFVMGsyU1cxR2VtTXlWbmxrUjJ4Mlltc3hiR1JIYUhaYVEwbHpTVzVhYkdOdGJHMWhWMDVvWkVkc2RtSnJNV3hrUjJoMldrTkpOa2x0VW5CYVJIQnNaRWRvZVU5cVFqUlNWRTAxVGtSak5VOVVTVFJSTWswd1VsZGFSMUpVVlhkT2VtTXdUa1JuTkU1NlozZFJhbXh0VG1wRk1sbHRVVEJSYW1kNlRVTk9hbUl5TlRCamJUbHpZa2RXZVVscGQybGpNbXh1WW0xR01HUllTbXhKYW05cFRVaG5NMWxVVFhoUFZGcHRXbXBTYkU1dFRUUmFWRmw2VG5wV2JVOVVZM2hQUkZreFdtMU9iRTlYVG0xT1ZFcHJUV3BhYlU1VVVYaE5WRUYzVFRKSmVGcFVRbXRaTWtWM1RVUkthMDU2UVRKTmVra3pUVVJOTTAweVZtcGFWRVp0VDBkV2FrOUhTVFZQVkd4cVRYcEZkMDlIVG10UFJHZDZUVVJDYTFwRWF6Qk9SRlYzVFhwamVrNXFUWGROZWtVeVdsUlZOVnBxV210YVYwa3hUVVJqZDFscWEzcE9iVlV5V1hwc2JGbHFSbXBKYmpGa1psRTlQU0o5WFgwc0luTnBaMjVoZEhWeVpTSTZleUowZVhCbElqb2lVMGhCTTAxbGNtdHNaVkJ5YjI5bUlpd2lkR0Z5WjJWMFNHRnphQ0k2SWpVeE56UXdPRGN4TURrMVpqaGpZekJqTURoalpUbG1NakprWXpnd01HVTFNRE5rWkdKalpqaGpZakl3TXpFNE5ERmtaRGMyT0RNeU9XVTFObUk1WVRFaUxDSndjbTl2WmlJNlcxMHNJbTFsY210c1pWSnZiM1FpT2lJMU1UYzBNRGczTVRBNU5XWTRZMk13WXpBNFkyVTVaakl5WkdNNE1EQmxOVEF6WkdSaVkyWTRZMkl5TURNeE9EUXhaR1EzTmpnek1qbGxOVFppT1dFeEluMHNJbkJ5YjI5bUlqcGJleUowZVhCbElqb2lUM0JsYmtGMGRHVnpkR0YwYVc5dVUybG5ibUYwZFhKbE1qQXhPQ0lzSW1OeVpXRjBaV1FpT2lJeU1ESXhMVEE0TFRJMFZEQTFPakE1T2pVNUxqTTBNVm9pTENKd2NtOXZabEIxY25CdmMyVWlPaUpoYzNObGNuUnBiMjVOWlhSb2IyUWlMQ0oyWlhKcFptbGpZWFJwYjI1TlpYUm9iMlFpT2lKa2FXUTZaWFJvY2pvd2VFVXpPVFEzT1RreU9FTmpORVZtUmtVMU1EYzNORFE0T0RjNE1FSTVaall4Tm1Ka05FSTRNekFqWTI5dWRISnZiR3hsY2lJc0luTnBaMjVoZEhWeVpTSTZJakI0T0dKak9HSXhNMlZsWmpReFlqUXhZek0wTldGa1kySmxZVEZtWW1GaU16YzNOek5rWWpWbVltWTFaREU1WkRWaU56TTFZek0wWXpKbFlqWXlNVEl5TnpZMk1HSmxNV1ZsTjJZMVptTTVZV1k0T0dZeU0yRXpaVFJtTWpjNU1UWTROMll4WXpBMk5HTTRNV1ZsTW1RNE1qRmpNelF4T0dSaE1ETmtaVFE1TVdReFlpSjlYWDA9In1dfSwic2lnbmF0dXJlIjp7InR5cGUiOiJTSEEzTWVya2xlUHJvb2YiLCJ0YXJnZXRIYXNoIjoiMzhkMDBkMGQ2ZGU1ODU1MDNiNDRiYzc5MmNjNWVjMzlhMDZmZjRhYmU3YTFhOGIzYjIzNjNjMjUyMzMwMzRmMiIsInByb29mIjpbXSwibWVya2xlUm9vdCI6IjM4ZDAwZDBkNmRlNTg1NTAzYjQ0YmM3OTJjYzVlYzM5YTA2ZmY0YWJlN2ExYThiM2IyMzYzYzI1MjMzMDM0ZjIifSwicHJvb2YiOlt7InR5cGUiOiJPcGVuQXR0ZXN0YXRpb25TaWduYXR1cmUyMDE4IiwiY3JlYXRlZCI6IjIwMjEtMDktMjdUMDg6NTg6MDAuMDA3WiIsInByb29mUHVycG9zZSI6ImFzc2VydGlvbk1ldGhvZCIsInZlcmlmaWNhdGlvbk1ldGhvZCI6ImRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCNjb250cm9sbGVyIiwic2lnbmF0dXJlIjoiMHg3N2VmYzE4ZjJkYzBhNzIzYThkNGRkZmY3Y2UxZjE1N2Q3MGFjZTQxNWEwOTU5ZGM3MGE2NzE0ZmU0ZTVlZTY1MThlZGFjMmIxYjdjMDY3Y2UwOTRhMThiNGQ0MThhN2QzNzZiMWQxYzg5YWM3NjQyYTcxOWZhOGNhOWY2YTg1ZjFjIn1dfQ==" } - } ] - }, - "issuers": [ - { - "name": "aeb9b37f-47a7-4c67-b9c7-36dad6a2aaab:string:SAMPLE ISSUER (DO NOT VERIFY)", - "id": "c43a5ad9-d300-4b5f-83b8-a413d0b9ffb3:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "5f5f6b7f-e0f0-425d-a577-05d819f0de1f:string:NONE" - }, - "identityProof": { - "type": "8ac9feac-1c83-41a0-930c-3aa84f91d3e9:string:DNS-DID", - "location": "699722b4-d3f1-492d-a46e-0cd4e7b6da57:string:donotverify.testing.verify.gov.sg", - "key": "1f256146-2acf-4c34-8049-30a393a16730:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "$template": { - "name": "d9f7369c-5eff-4866-844c-797557982dfc:string:HEALTH_CERT", - "type": "e570b19e-72fe-4e04-af25-c5d237e4add3:string:EMBEDDED_RENDERER", - "url": "99c36295-9e76-4a8e-9d3c-ac369cfa222c:string:https://healthcert.renderer.moh.gov.sg/" - }, - "notarisationMetadata": { - "reference": "acca43f0-a8e0-43bd-a062-3a7f9769be11:string:c5ad19bb-403c-4b52-971d-3f01e87883e3", - "notarisedOn": "3f687d0a-992a-4ece-8b24-123332d24af6:string:2021-09-27T08:57:59.883Z", - "passportNumber": "1af65e20-58bc-4ac7-ab59-fa0996d000ac:string:E7831177G", - "url": "427d31a0-6aad-4c93-8e1c-0656992fbdeb:string:https://action.openattestation.com/?q=%7B%22type%22%3A%22DOCUMENT%22%2C%22payload%22%3A%7B%22uri%22%3A%22https%3A%2F%2Fapi.storage.staging.notarise.io%2Fdocument%2Fdc65dc7d-05a3-4895-ad80-8dc4a90add1f%22%2C%22permittedActions%22%3A%5B%22VIEW%22%2C%22STORE%22%5D%2C%22redirect%22%3A%22https%3A%2F%2Fwww.verify.gov.sg%2Fverify%22%7D%7D#%7B%22key%22%3A%2210d5995597b68acab3940c53d7433d2a4e1a4c231b67f99e2847cb4b1781098e%22%7D", - "signedEuHealthCerts": [ - { - "type": "0979a393-07bb-4514-81f9-8529f23b0512:string:PCR", - "qr": "7791ece9-cb4e-4bd2-85f1-7bb05510eede:string:HC1:6BFK%GA 9HWRH23MLBCFGCFO0WG4Y5XHB1RF%T70GR5QUN87MU6N%4P+JWCK:OJDQ4/M2P+ME2SMMG3SA23V060M$R.KMZ24LES1GO8+0DE2P.5VIHJGK%0I3UPSEHSF5$MI0A7-YK/AUKDUA3D:3K.KJ:6WYCTXRR*/1A5K*+JAKT%2EMQD0AFD T .PM2K 034PV23N MLS EI%TI/AQDSB1ADYTRUMF%EKJ0GDJ83U Q9179 ZTP5VN7O*L92Z3N30 NQJ84D$CA+68ON7+O:RIKQSJ3D.G8L8GNAKMD6D4EQTPX5B.*3V8HI7AYIBM5VB+QJPNPSFZSS-/4+ESBT5+ B940262*32QATB7C1YQYNE500O13TROMGGE45Y.I-I2F.L%Q25YQAV2B$AS87ME7K9NYRL:/8XXSCPS/9L:9ER537L86WOPM5-B6DOJIQ6O0NN7A1PFJ.T1%OTX9E/T 9J7.FEAKFJM:1NWYVBTR6YS ADB7R:CNSUDV D+3QPDD%MMPPJUILKQBWXLHZAN-JLP9XE531BHHJXVDA*E3EP$7A:HC7*C XKE K8WBYQ7+N6NLT2%AIHIP 6+NEXT5DTAKSOFKH9/6O*D5116$HFYI%E6T%BBKEPN9.E9FUP54ITFWYJMR2PQ+T367Z6CI4OLX28PLA*NZ2S-ZHEHAT:FL74Z:V+7KRWQO1U6JH0X899ULEQ/I2R:5B.8T1JQ4L:3K VM-7JR%NM:TK2N:0B-J1GPPYLHB1EEVSI/9 X3Q 0.VD6D8$XQCMH:EONXOXSADLVY$8S1T981C65QE6-MQ6T6W:H$*6S9W5ZSC$RJV8ODT427HMBKF73$RL-6RS28-B/CMOW80*TFAE$D2L*G5UKZGDAMEMVHPA2GV287PIIUNBQF.J4JF-$THLF$RMW9E1L6N/PMI5GVH-:07SGML07XFNX60K7H.VEPAS/PBYQW.6LX972DUNM.YP1JP912OR9Y5PI6DWAGNOP1LUV8PNGVZJ88.KTZGIWSHNG67UX31Y0E0PVSDFBRVPN0TCIJUM$TFX9W7:3TB24KNSY4LIFDIO%1C%0W+.U +JS6GN9W01U-184KDV/VWAT.EUS%FK+DF$TI6P1JTZBSU0EHAW*4W829W5ECQ7Q0RTVNT-FQYV47E3U14RS51" - } - ] - }, - "logo": "ab36510d-f61c-4bd8-9b06-288e5f5fb52a:string:data:image/png;base64,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", - "attachments": [ - { - "filename": "7f3ff5fc-e108-49a6-9c6e-10f07e3840b7:string:healthcert.txt", - "type": "76e7dfda-d4f7-4ea1-9747-6070a9a62b40:string:text/open-attestation", - "data": "c155c676-9c96-4f3c-963a-2a5692f17bc5:string:eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiNzY5MzcxMDMtNzdlZi00N2MxLTk5MTItYmI5MmRjNDgyN2VhOnN0cmluZzpjMjM1NmUzYi05MDA5LTQyMjAtYTFjYy0xYWY4ZDM0MjBkYWQiLCJ2ZXJzaW9uIjoiNzFhNWUzOTgtY2FmMi00NDQ4LTg2NzQtMTAwYzgxNGZkNzBhOnN0cmluZzpwZHQtaGVhbHRoY2VydC12Mi4wIiwidHlwZSI6IjNkZWVkNzExLTJiNGMtNDE2ZC04YTBmLWMyMTA1MzQwMDdmODpzdHJpbmc6UENSIiwidmFsaWRGcm9tIjoiZDUwMDhmMGItOGM1NC00YzQ1LTk5ZGEtYjE4NzkxY2ViMjY2OnN0cmluZzoyMDIxLTA4LTI0VDA0OjIyOjM2LjA2MloiLCJmaGlyVmVyc2lvbiI6ImFkNzdjYjEyLTNlZjgtNGZjZi04MmVjLTJkOTYyYTlkZDQ4NDpzdHJpbmc6NC4wLjEiLCJmaGlyQnVuZGxlIjp7InJlc291cmNlVHlwZSI6IjZjMDk3YmI0LTI3YjQtNDA0Yy1iNTViLTI3MmI4ZTkwNGMxYzpzdHJpbmc6QnVuZGxlIiwidHlwZSI6ImY1NjAwMDYyLWIwZTgtNGVmZS1hNDhkLTMxZjg0MjY5MWYwYjpzdHJpbmc6Y29sbGVjdGlvbiIsImVudHJ5IjpbeyJmdWxsVXJsIjoiZDViODc4ZDUtMTdkOS00ODcyLTk3OTctYTE2MTRhM2Y0YzE3OnN0cmluZzp1cm46dXVpZDpiYTdiN2M4ZC1jNTA5LTRkOWQtYmU0ZS1mOTliNmRlMjllMjMiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiIzYWM5NmRlOS0yNDQxLTRkMzItYmFlNS04ZGNiYjBkMjgyZWU6c3RyaW5nOlBhdGllbnQiLCJleHRlbnNpb24iOlt7InVybCI6IjRkNDE3MGU5LWFkMDMtNDkyNy1hODc1LWQyYjc0OWUyZDBmNDpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLCJleHRlbnNpb24iOlt7InVybCI6ImJkZTI0NTVlLTE5YjYtNDcyNi04OTg1LTRlOGVhNWUxYjU1NTpzdHJpbmc6Y29kZSIsInZhbHVlQ29kZWFibGVDb25jZXB0Ijp7InRleHQiOiJhMmM3YTA0My0xOWY2LTQxZmEtOGMxOS1lNWM2Y2E3NDAyNzk6c3RyaW5nOlBhdGllbnQgTmF0aW9uYWxpdHkiLCJjb2RpbmciOlt7InN5c3RlbSI6IjhhZDU2NDY3LWNiMzMtNDBlYy1iNTIxLWE3MTIzMWVhMGU1NzpzdHJpbmc6dXJuOmlzbzpzdGQ6aXNvOjMxNjYiLCJjb2RlIjoiYjQ0MmFiNTQtZGM4NC00MGNmLWE0MmMtYzc2MmJhMTg0MTY5OnN0cmluZzpTRyJ9XX19XX1dLCJpZGVudGlmaWVyIjpbeyJpZCI6IjRiZTk4ZGFiLWJjZWYtNGQ2MS04ZDY2LTNiY2M2ZjBiZmIzYjpzdHJpbmc6UFBOIiwidHlwZSI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjI4OTIyNGRmLTI0ZmItNDgxZi04OTM0LTVhYTVkNGIxNmVmMzpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS92Mi0wMjAzIiwiY29kZSI6ImZmMGUwOTJiLTNkOWItNDE3Ni04YjZkLTMyMGEyOTVhZDliYzpzdHJpbmc6UFBOIiwiZGlzcGxheSI6ImU5NmIxNjQ0LTg0Y2UtNDlkYS04NWRkLTQ2YzI1NjcxYWNjMzpzdHJpbmc6UGFzc3BvcnQgTnVtYmVyIn1dfSwidmFsdWUiOiIzMTQ4YWY2Yi0xMThmLTQ5ZWEtOWQzOS1hODBlYzljMzhjMGI6c3RyaW5nOkU3ODMxMTc3RyJ9LHsiaWQiOiI5NGUzNDk5ZS04YWU4LTRiZjctODgxMS0wZGMyMGRmMTYwOTQ6c3RyaW5nOk5SSUMtRklOIiwidmFsdWUiOiI2MTJjNDEyMC1hM2EwLTQ0MWQtOTFmMy1jNjUwYjlhM2U1MTI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjE5YjhlMDI0LWMwYzAtNDQ0NS1iMTE3LTVjMjY4ZmFmYzFlZTpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiY2Q5ZTE0MWQtYTZlYi00ZDk4LTk3M2QtZDYwMTczNWUzNTI4OnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiI2NTNhYmFjOS0yMjUxLTQzY2YtOWRiYy1lNWM2Nzg2M2U3M2U6c3RyaW5nOjE5OTAtMDEtMTUifX0seyJmdWxsVXJsIjoiZTQyZDQwY2UtOTY3Yi00YTEyLTkzMDktZWU1MmU2MGNhM2U0OnN0cmluZzp1cm46dXVpZDo3NzI5OTcwZS1hYjI2LTQ2OWYtYjNlNS0zNmE0MmVjMjQxNDYiLCJyZXNvdXJjZSI6eyJyZXNvdXJjZVR5cGUiOiI3YTQzMjgxMS1jMTVhLTQ3MDQtYjA2Yy0yNzUzYTYzOTE1MjY6c3RyaW5nOk9ic2VydmF0aW9uIiwic3BlY2ltZW4iOnsidHlwZSI6ImU0YzE2NDJlLTFhMTAtNGY5Zi1hYWU2LWUwNjU3YjJkZjU4MDpzdHJpbmc6U3BlY2ltZW4iLCJyZWZlcmVuY2UiOiIzMTY0YzVmZi1jOWM1LTQxZDUtYmYzNy0wZDNhYjEwMTI1MTE6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSJ9LCJwZXJmb3JtZXIiOlt7InR5cGUiOiI1OTJjZDVhMi1kNmE0LTRhODctODNjNi1iMmQ1YTU5Y2E1YzM6c3RyaW5nOlByYWN0aXRpb25lciIsInJlZmVyZW5jZSI6IjE2MTU5MTljLTIxMWUtNDc2ZS05NjU2LTdkNzkyNGQyYzE5NTpzdHJpbmc6dXJuOnV1aWQ6M2RiZmYwZGUtZDRhNC00ZTFkLTk4YmYtYWY3NDI4YjhhMDRiIn0seyJpZCI6ImExZDhkMDRmLWI4ZTQtNDY4Yy1hOTQzLWQ0OWZkNWVhYmZkNDpzdHJpbmc6TEhQIiwidHlwZSI6ImM1MzNkNjg3LTdkMmYtNDZhOC04OGM1LTNlYWIxZDBiOTUzNjpzdHJpbmc6T3JnYW5pemF0aW9uIiwicmVmZXJlbmNlIjoiODEyYTliYjUtYTgwMS00YjdlLWJjMWEtMGQ2NzUyMGVhNmY5OnN0cmluZzp1cm46dXVpZDpmYTIzMjhhZi00ODgyLTRlYWEtOGMyOC02NmRhYjQ2OTUwZjEifSx7ImlkIjoiOTk5M2I0OGYtOTQ4Yy00NzJkLWFjM2EtYzhjZjQxMTFlNGNjOnN0cmluZzpBTCIsInR5cGUiOiIwZjhjMjQ2NS04ZjgyLTQ1YmUtYTNlNC1kNjk2NDdlNmE5MzI6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImQ5MTZmM2JmLTdjZDEtNDg1Ni05NDY2LWIxYzY3MWU0ZTU1ZTpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3In1dLCJpZGVudGlmaWVyIjpbeyJpZCI6IjM5OTYxMGFiLTNjOTItNDZjNC05MjA0LTkwNmMzMzM0YzU3ODpzdHJpbmc6QUNTTiIsInR5cGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiJkNjg1MTc1NC1mMWMwLTRlNWMtYjQzMC1jMzJmMTY5YzU4MjM6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJmYzNhNTM2Yy1lMGFlLTQ1ZmUtYjliOS03ZjU0ZTJmN2RkZjg6c3RyaW5nOkFDU04iLCJkaXNwbGF5IjoiNTBiZDhmYzktNDEwZS00OTEwLWIyNGYtNjFiN2I3YTI1ZjE4OnN0cmluZzpBY2Nlc3Npb24gSUQifV19LCJ2YWx1ZSI6IjdkYjJkZDFhLTg3OTYtNGEwYy05NDljLWM0YjQ3NjdmMzgwZTpzdHJpbmc6MTIzNDU2Nzg5In1dLCJjYXRlZ29yeSI6W3siY29kaW5nIjpbeyJzeXN0ZW0iOiI0NmYxNTUwYS1hMGYzLTRiYWMtOWMwYy0xOTc2NjJmNDdmZWU6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNTA5MmU3MTctM2RhYi00OTIwLWFmM2EtNDA2NTE1MTRiZDZiOnN0cmluZzo4NDA1MzkwMDYiLCJkaXNwbGF5IjoiOTdiZWZkODItN2I4Yy00M2I2LThlZjMtZjFhOWU2YjQ4OGU1OnN0cmluZzpDT1ZJRC0xOSJ9XX1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMmI4MDdkYzUtMmZhOS00YTE1LTg4YWQtNDk4OWZkODYyNmJjOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6ImEwYzE3ZGZhLTVhMTktNDEwYy1hZGJmLTg3ZjljMzYyZWZlMTpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiJkNTNkZWRlNi1hYmE3LTQ4NDEtOTczMC1mNzNmOThkNDQyMjA6c3RyaW5nOlNBUlMtQ29WLTIgKENPVklELTE5KSBSTkEgcGFuZWwgLSBSZXNwaXJhdG9yeSBzcGVjaW1lbiBieSBOQUEgd2l0aCBwcm9iZSBkZXRlY3Rpb24ifV19LCJ2YWx1ZUNvZGVhYmxlQ29uY2VwdCI6eyJjb2RpbmciOlt7InN5c3RlbSI6IjI2NDU2NWVhLTg5MjgtNDhkYS04NDUzLTRhZGJlZGM0NmI4NzpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsImNvZGUiOiJlNDg2ZjQwNi0wNWNjLTQ1MmEtOGY3OS1jMTJhOTlkMmI3NDY6c3RyaW5nOjI2MDM4NTAwOSIsImRpc3BsYXkiOiJiMmY0M2Y0YS1mOWRmLTQ2YmQtOTAzOS1lODJjZmY4OWE1NWQ6c3RyaW5nOk5lZ2F0aXZlIn1dfSwiZWZmZWN0aXZlRGF0ZVRpbWUiOiIzYzhmMDI3My01MjliLTQyYzYtYTdkMS05ZjVlMWMzMDFmYTM6c3RyaW5nOjIwMjAtMDktMjhUMDY6MTU6MDBaIiwic3RhdHVzIjoiN2NhMGJkZmQtYjRkMC00MDI1LTllMGMtYTI2OWI2ZDQ1ZTNlOnN0cmluZzpmaW5hbCJ9fSx7ImZ1bGxVcmwiOiI1NDg2M2M3NC1kZjZkLTQwMmItYmZkMS03MTQ4YWZkMTYxNjg6c3RyaW5nOnVybjp1dWlkOjAyNzViZmFmLTQ4ZmItNDRlMC04MGNkLTljNTA0ZjgwZTZhZSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImU2ZjhlZjAwLTg4OGItNDk5Yy1iMDA0LTRkMWNkZWQ3YjNmMDpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMDFlNGI4YTItMTc5My00NTkwLTkyZWMtNzE0MGQ5MjhmYTc2OnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6ImY1NGI4MjE3LWNhODUtNGI1NC04YTNiLWY5OTFkZTE3ODYzYTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjU5ZDNhOTk3LTk3ZjAtNGU0Mi04NjM0LTVkZDAwNGE1N2YzZDpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiIyN2U1YjIxMy0wYjI4LTQ2YmUtYTUyZi1hNDhjOTcxMTcyMGE6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19fSx7ImZ1bGxVcmwiOiJmNTc1ZmI3MC03M2MzLTRlZTYtOTRjYi1kYTM5MjNiNTkzOGU6c3RyaW5nOnVybjp1dWlkOjNkYmZmMGRlLWQ0YTQtNGUxZC05OGJmLWFmNzQyOGI4YTA0YiIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6ImJlMGMyNTRlLTlmNjYtNDgwYy05Nzg1LWVmZTIzZDY1MGRlODpzdHJpbmc6UHJhY3RpdGlvbmVyIiwibmFtZSI6W3sidGV4dCI6ImVkYTkwN2Y5LWYxMmQtNDc1OS1iNTZjLWM5OWE3ODY5ZDZmZDpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV0sInF1YWxpZmljYXRpb24iOlt7ImNvZGUiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiJhNjU4YmFkNy02NGRiLTQ2ZjQtOTU2NS00MzA4MjUyNmRlNWQ6c3RyaW5nOmh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyIsImNvZGUiOiJiZDAxYWQwYy05OTFjLTQzNjgtYTk3YS0wYTIxODc0OTA3ZDY6c3RyaW5nOk1DUiIsImRpc3BsYXkiOiIwNjczYTgzZi04NzNiLTQ4MDQtYTdiMy03M2VhNGEwZmQ2ZTQ6c3RyaW5nOlByYWN0aXRpb25lciBNZWRpY2FyZSBudW1iZXIifV19LCJpZGVudGlmaWVyIjpbeyJpZCI6IjRkYjRlZTE3LTMyYjgtNDk4My1hZTNhLWIwM2JkZGIyZTUyNTpzdHJpbmc6TUNSIiwidmFsdWUiOiIzMTA2YWRiYi1lOWVlLTRiMmQtOGNkZi1iM2EwZjAxYjYyYmU6c3RyaW5nOjEyMzQ1NiJ9XSwiaXNzdWVyIjp7InR5cGUiOiIxMTVkNmRlNi0zNTRjLTQ2YTktYjVjYi0yY2ZiYTIwOTg3MDA6c3RyaW5nOk9yZ2FuaXphdGlvbiIsInJlZmVyZW5jZSI6ImI2YmNhNjE0LWVmZGMtNDY4My04MWYzLTQ1OGQzMjQ4OGZmZTpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIn19XX19LHsiZnVsbFVybCI6ImY4YjFhNzI4LTc5YmYtNDJkMS1iMzRiLThmZmQ2ZTMzNmIxODpzdHJpbmc6dXJuOnV1aWQ6YmM3MDY1ZWUtNDJhYS00NzNhLWE2MTQtYWZkOGE3YjMwYjFlIiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiY2Y5NDEyZWQtNzM4Ny00YTIzLTk4ZTktNDIxMjRhNTVlZGZkOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMmVlODJkNmEtMTc5Zi00YWEwLWE2YjktOTg4MzNhZmQzYWZkOnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGggKE1PSCkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6IjQzZGVlMjMxLWJjYzMtNDgwMC1hMjA2LWQ4YTI0ZWI1NTFiYjpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiJjZDU4YjMxZi04MWZkLTQzOGYtOGU3ZS0yYjE2YTczN2I1ZjU6c3RyaW5nOmdvdnQiLCJkaXNwbGF5IjoiMGY4M2Q0YmEtY2ZmYi00ODg1LTlhMTQtZDA0YWIxYjQ2ZTIyOnN0cmluZzpHb3Zlcm5tZW50In1dfV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjllMTk1ODQ1LWM2NjQtNGQzNy1hZGZmLWUxM2QzMWY4YzgyMTpzdHJpbmc6dXJsIiwidmFsdWUiOiJhNThhMDllMC00MjExLTQ4ZGYtOTQzMi00ZWZjZWViNGY3ZWI6c3RyaW5nOmh0dHBzOi8vd3d3Lm1vaC5nb3Yuc2cifSx7InN5c3RlbSI6ImJlMGEyYWI4LTNmZjYtNDBiOS05YjkwLTg1MjUyZTFmOTMyZjpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6IjIxMTI4MDQ4LWZiNjUtNDYzNS04MDEyLTViNDRkNTMwZTkxMDpzdHJpbmc6KzY1NjMyNTkyMjAifV0sImFkZHJlc3MiOnsidHlwZSI6ImMyN2FjZGM4LTA2NTktNDE3Mi05YjU2LWE2MWU3ZjQ1MWExNDpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJkNWVjODU5YS1kNzZlLTRlZWItYjE0MS00ZjUwNzliYmM2OTY6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiMzFhYWNiOWYtMDc5Zi00OTdhLTgxNTUtZjFjNDNhOGZhMzk1OnN0cmluZzpNaW5pc3RyeSBvZiBIZWFsdGgsIDE2IENvbGxlZ2UgUm9hZCwgQ29sbGVnZSBvZiBNZWRpY2luZSBCdWlsZGluZywgU2luZ2Fwb3JlIDE2OTg1NCJ9fV19fSx7ImZ1bGxVcmwiOiI2OWZkNmZiYi1iMGRhLTQ3ZDktYWEyNC0zMWFjNTY1NDI4Nzg6c3RyaW5nOnVybjp1dWlkOmZhMjMyOGFmLTQ4ODItNGVhYS04YzI4LTY2ZGFiNDY5NTBmMSIsInJlc291cmNlIjp7InJlc291cmNlVHlwZSI6IjFlZjA2M2RlLTI3NmEtNDkyNS05MzUyLWNlZmM5NjM3ZWI2MDpzdHJpbmc6T3JnYW5pemF0aW9uIiwibmFtZSI6IjNmYzQ0Y2MwLWViMzQtNGY2Ny1hNzU4LTMyYjY4ZTZlZTBkNjpzdHJpbmc6TWFjUml0Y2hpZSBNZWRpY2FsIENsaW5pYyIsInR5cGUiOlt7ImNvZGluZyI6W3sic3lzdGVtIjoiN2ViNWJmOTQtNDAzMC00MTlhLWE1YTAtY2RiM2Q5NzQyNWFkOnN0cmluZzpodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL29yZ2FuaXphdGlvbi10eXBlIiwiY29kZSI6IjZhNzU3Yzc2LWNlNTQtNGVkZi05ZGE0LTlmZWFjYWFmZWFiOTpzdHJpbmc6cHJvdiIsImRpc3BsYXkiOiJlNDE0OGY3OS05Y2YxLTQ5MzctYjJkYy00MmUzYjg3MjhiYjc6c3RyaW5nOkhlYWx0aGNhcmUgUHJvdmlkZXIifV0sInRleHQiOiIyNTI2MzBjNS1jYmNlLTRiMDMtYTc0MC1kMjRhMTBhODY3MDg6c3RyaW5nOkxpY2Vuc2VkIEhlYWx0aGNhcmUgUHJvdmlkZXIifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6ImI4YmYyYmFmLTNkMGEtNDRjOS1iYThiLTNhNGFjYzVjMGM4MTpzdHJpbmc6dXJsIiwidmFsdWUiOiJmZjc2MDc0Mi0wMDNhLTRlY2ItODY4NS0xY2Y5MDQ4YjQxZTk6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0seyJzeXN0ZW0iOiJlODI5ZTFlNi04MGMzLTRhMmUtODRlMi02NTNjYjdkYzQ4NGI6c3RyaW5nOnBob25lIiwidmFsdWUiOiIzZGNkYTAxNi1mNTI0LTRmMDgtODBmNy0xMmMyN2IwNmI4NmM6c3RyaW5nOis2NTYxMjM0NTY3In1dLCJhZGRyZXNzIjp7InR5cGUiOiJmOWM3NmIxZC1hZDg1LTQyNWYtYjRhZi01NDA5MzAxNzk1MWI6c3RyaW5nOnBoeXNpY2FsIiwidXNlIjoiNDZkODc5NzEtOGZlMy00YmNiLTkxNTAtMDIxYmQ0MjEyZWU1OnN0cmluZzp3b3JrIiwidGV4dCI6ImM3NTlhYjkwLTIwNTMtNDE1MC05M2NhLTQyNGIxNWZmNjU4MjpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCwgVGhvbXNvbiBSb2FkLCBTaW5nYXBvcmUgMTIzMDAwIn19XX19LHsiZnVsbFVybCI6IjdmMTE3OTg4LWE1ZWUtNDA5Yy1hZmY4LTZiMmYwZWIxOThhMDpzdHJpbmc6dXJuOnV1aWQ6ODM5YTdjNTQtNmI0MC00MWNiLWIxMGQtOTI5NWQ3ZTc1Zjc3IiwicmVzb3VyY2UiOnsicmVzb3VyY2VUeXBlIjoiZGIxNmQyMGYtZjljOC00NDkwLWI1NDAtNjJiYzM4NWZlOTRhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMmU3Mjg0ZTEtOWVjNS00ZjU5LWE1YTAtODU3ZmYyYzE5ZWI0OnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjpbeyJjb2RpbmciOlt7InN5c3RlbSI6ImJjODViY2ZkLWY5NWEtNDVhMi1hOTg5LWQ4MzMzNGQzYTcwZDpzdHJpbmc6aHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9vcmdhbml6YXRpb24tdHlwZSIsImNvZGUiOiIzM2EzY2NmNy0wODc1LTQzYWItOWJlMC01NzRmMmRlYzQ1YjY6c3RyaW5nOnByb3YiLCJkaXNwbGF5IjoiNzY1YWQ2Y2MtMTMwMS00NTc5LTlkOWItNGNiYjM4NTI0YzllOnN0cmluZzpIZWFsdGhjYXJlIFByb3ZpZGVyIn1dLCJ0ZXh0IjoiYTQyOTUxY2MtZWIxNC00MDg4LWJlYTgtYThmZjg0MjliNzhkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkifV0sImNvbnRhY3QiOlt7InRlbGVjb20iOlt7InN5c3RlbSI6IjFhNWIyMTQyLTUxNGEtNDA3Zi1iOTc5LTY3ZjJiYzI3NzMwMDpzdHJpbmc6dXJsIiwidmFsdWUiOiJjYThmZjg4Zi01MjlmLTQwZTYtODA2NC00OGQ2NTAxNzk0MzA6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVsYWJvcmF0b3J5LmNvbS5zZyJ9LHsic3lzdGVtIjoiNzY2YzM5YzEtYmZiMS00MjI3LTkxNTEtYTA1ZDJkNzBmM2M5OnN0cmluZzpwaG9uZSIsInZhbHVlIjoiMzUxZDFjNTUtODg0MC00OTBiLTkyYWItN2NhMjY5MzdjMTdhOnN0cmluZzorNjU2NzY1NDMyMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiZDJlMDBkYmYtZGYxMy00NDQyLWFhOTYtMTg4MTRlMTdjOGNjOnN0cmluZzpwaHlzaWNhbCIsInVzZSI6IjJiMWE5N2YwLTJiMDQtNGVjYi1hMGU3LTU1NmI0MmVhMzM2ZjpzdHJpbmc6d29yayIsInRleHQiOiIzYTkxYTU5ZS1lNjUyLTRmMGEtYTNkYy00OWUwMTViNTE1NGM6c3RyaW5nOjIgVGhvbXNvbiBBdmVudWUgNCwgU2luZ2Fwb3JlIDA5ODg4OCJ9fV19fV19LCJpc3N1ZXJzIjpbeyJuYW1lIjoiYWJjZTIxYTUtOTMxYS00ODQxLWJhMWEtNzIxZTgzZmRmZDMyOnN0cmluZzpTQU1QTEUgSVNTVUVSIChETyBOT1QgVkVSSUZZKSIsImlkIjoiOWY3ZTUzMmYtNjI4OC00NDhkLWExMDktZmQ5ZjI3ZjYzNmI0OnN0cmluZzpkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAiLCJyZXZvY2F0aW9uIjp7InR5cGUiOiJiYTA0ZTIzNi05OTg0LTQzOWEtYmVjMi00Y2RkNTc2ZWViMDY6c3RyaW5nOk5PTkUifSwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjcwYmQxNmItNWI1Ni00Mjg0LTg2N2EtNTRiNjk3YzA1ZWE1OnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiIyMjZjZTcyZS01NzZiLTQ2ZjktYTcyMi1jMGU1Y2E4ZDEzNmE6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6IjEwMjM1OGYyLTNkMDQtNDMwNy1hYzc3LWM1YTNmZTdiMTgzYTpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCIkdGVtcGxhdGUiOnsibmFtZSI6ImJkZjBiZWFlLWY4ZTEtNDRhYS1hZmUzLWYwMTE3NjUwNTM4YjpzdHJpbmc6SEVBTFRIX0NFUlQiLCJ0eXBlIjoiMDc0MjEyZmQtZjIxNC00Mzk3LThhMTYtOTQ1MWE2NjAyOGU0OnN0cmluZzpFTUJFRERFRF9SRU5ERVJFUiIsInVybCI6IjgxZDQxZGM3LWJjMDQtNDA4Ni1hNGU1LTdiNzlkNTY1Yzg5YTpzdHJpbmc6aHR0cHM6Ly9oZWFsdGhjZXJ0LnJlbmRlcmVyLm1vaC5nb3Yuc2cvIn0sIm5vdGFyaXNhdGlvbk1ldGFkYXRhIjp7InJlZmVyZW5jZSI6ImZlZjY4OTZiLTc4Y2MtNDI3MC04NmYzLTU0MTg3NDFkOGM3ZjpzdHJpbmc6YzIzNTZlM2ItOTAwOS00MjIwLWExY2MtMWFmOGQzNDIwZGFkIiwibm90YXJpc2VkT24iOiJmYjQ3M2M1Mi0zM2NjLTQ0ZTUtYmUxYy03NTA0N2IyZGFhMWU6c3RyaW5nOjIwMjEtMDgtMjRUMDU6MDk6NTkuMjk5WiIsInBhc3Nwb3J0TnVtYmVyIjoiMmUwYjlhMWUtYjYwOC00NWQyLWFlMjYtNGQwY2EyYTI1NTBkOnN0cmluZzpFNzgzMTE3N0ciLCJ1cmwiOiI1M2VjMWVhYS0xNGQ0LTQ4NTAtOTg1OC0xMzIwMDIxNGZjZTU6c3RyaW5nOmh0dHBzOi8vYWN0aW9uLm9wZW5hdHRlc3RhdGlvbi5jb20vP3E9JTdCJTIydHlwZSUyMiUzQSUyMkRPQ1VNRU5UJTIyJTJDJTIycGF5bG9hZCUyMiUzQSU3QiUyMnVyaSUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXBpLXZhY2NpbmUuc3RvcmFnZS5zdGFnaW5nLm5vdGFyaXNlLmlvJTJGZG9jdW1lbnQlMkYxMTFkMDI3YS1lOGRjLTRlNDQtODkyNC1jNDFjZDcwN2VhYzYlMjIlMkMlMjJwZXJtaXR0ZWRBY3Rpb25zJTIyJTNBJTVCJTIyVklFVyUyMiUyQyUyMlNUT1JFJTIyJTVEJTJDJTIycmVkaXJlY3QlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy52ZXJpZnkuZ292LnNnJTJGdmVyaWZ5JTIyJTdEJTdEIyU3QiUyMmtleSUyMiUzQSUyMmZhMzVkNGI3MzViNmQ1MDMyN2M5N2YwMDgyNzEyOTk5Y2ZhNjQyYmI4MzAyNWY0ODczM2U1ZjIyMzA2NmQ5NmYlMjIlN0QifSwibG9nbyI6ImUyMmRhMDkzLTY2NzgtNDI0ZC1hZTQyLTg1MTI5YzMyZWUyMjpzdHJpbmc6ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFmUUFBQURJQ0FNQUFBQXB4K1BhQUFBQU0xQk1WRVVBQUFETXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNemVDbWlBQUFBQUVIUlNUbE1BUUwrQTd4QWduMkRQM3pCd3IxQ1BFbCtJL1FBQUJ3ZEpSRUZVZU5yc25kMTIyeW9RUnZrSElTSE4rei90eVVrOW9URUNRMWJUQmMyM2J5TnMwQjVHSURBUkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFrK0lrK0lkeDRnNU40QjlHUS9yUEE5Si9JUGZTZ3dML01FRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEd1A1WlBvUDVyN0ZKS0FmN2N1ZkJpaFBOU2tYNWhsQTl1K0RzUDdkWC9KSzFQMlZQaVNJb2ViRXJMd1ZoNVp4KzhDMVkyMll0UDBGcGY2aGRlYSttcTFXbGl4ZmVqNlJjRHhqMDlzd1hiYmVCUXBpanVnMjBhai9TRThidm81aEV1YXZBdVNLcFFmSnhURzkxZ1VyQ1Y2alNRRTBvUGtlNHd1a2U3MDVFcXBMTld4dE10U2s0anZYR2xkK3RMbHh2Vk1ObmFrRDdtRW5kWVRWV1NuVjg2MFdVWGwzNFJNeTdCZW1weUd6TjdwQWJtWEVBNmJmdkswdTMydVRGS0tWTTByMFl3MU1UY0Z2cDhpVkxQRDArOWdIUXkrN3JTZjNlZWpwMkh1RmNzbWxkaUV6MEZ6S1hmU1J3M3FlMDhYcWQ5ZFA2UUtPTm5rdTRsRzNOU2IvUkJ0S3RLdDF0dGRCSmlZYjJWSTdicmM3dGM4SVlvdEp6SFVCMGMrTytUM3JUUXVMS3NaUnFwemtUUzdkWkk0dm8rcUpuZEVHTzhFemVjeWphYzYvSVROMktPV2FVTElUL2FMZGVVbnFwZGk3VlcyK0t5YzI5RkwzczdlM2hpNUxUU2hlV1dweVdsSDRYem12V2puaU9pRk4zWVdEaXZXSTkyV3VrNWN0MkMwcDNKemw5WU42NldJNUlWL1Z5Rjg2cjFhMTdwSDVVTUMwcFgvRHdYVlU1MjRLczVZZ0RabUw0ekd6MXc4MHAzM1BqMXBNdmNpK3RjMmNGSWptaEgyZFdWZnVhVkx1TGp5OWVUemdxT3JxZXd2MHZ1bS8xS1I0KzJhNkRoNXBYTzdWOU8rczRLUkpQQUR1eE5qdGpGQ0NrL0NsdEV6Z2Z6U3RlclN2ZFpRWmVEb3l5cXhRZ3VSMWxYbUJsSS85UFNlYlpwYk9lOGJpdnQyYkZLOVlhSzRlSGU3TkxOYXRMUDNxR1lMZkw3MVJvTXZCNlh1OTZKM1RXdDlMVG9RTTV6bThZZnhiSElFU1BaWFhXL3RvdlRTbytQcUZ4TmVzd1pxak8vWDA5T3ZCZ2k5T2NIdzdsbFV1a2N2K2RpMHJuZXFmOTl1WG9LZ2xNTXdhbGw3eC9teTBtbFA1cGlWbnYzZnVaKzE5M3hucFRZTHozU2plalBMWHBPNlR0WGJ6WHBmSVVjZUpIbVBzWEFKc2JJK2FMN2Z2c3BwVnNPWDd1YWRKOUZ2dVQ2M1B4c1pBUTNVTXh5Z0x5V3ZzazYvbHVrdTQwZmI4dHRvbERGRmIxWlFRNi9tUmt2MWlXOWkxSjZDLzFhZWpBY3ZRUFZtVXQ2RkIyY24yNkp6RE80VHNhTGNXZWFUYm83SW4wNFgwODY5Nlh4VG5ya216R0NIaW1tSnBMdU5hUGk3MWYrS09rdGU1SUs5T3JTNzRpbmdQU2ZKZDFvSVNEOVowbS9oUGhCMG8rL0xkM01NR1VyU1U2OHM5eVV6WFNPM3N1aFcrQmgrSmowb3l6MnNuWnFncGN6ZDVpd3B2UnZtS2ZYcFkvUDB5ZVNmc2dIT2hsaXd0TFM3Y0JTaVIxYVpGUDMwcStCdDNmWGJLOWhRMlRyKzRyU2MrOGRmbFhDTzJsNnBZK1BJczVwRjF4czRrbWJYVkI2ejBKV1JSZEgrNkIwdzhWZW95ZGVXbFY4NHhhVUxudlgwOHZFek5uK0hKT3UrdGZUMWNTYktQTGV3dldrYy9jMS9ZdHM0U2xKK0RIcHVuc0YzMDY5WFNydzdWaFFlbDRnSE4zUXVITzhqRWsvTzhjQytVby9wWFIrdkcwTFNuL1pYeGxYeUlvYzYwUFNoZWxkd3ZkemI0SFczSTcxcE8vMHdIWXFPSXA4djQxSlQ1MlROamY1angyNGZtRTk2V0xyRzcvYnNvTTZlaENHcEo4czAvWlYzazhxblRPZFgxQjY2SE9nYjRiNUtSZnRsNTRmQzdvdnl2WlpwWHQ2Snk0bzNacWVkT3ZNVGRzbFBVaEQwcmxXeHZWTUZ0UzBQMVVPblB2V2s4NFhkYjBESVhXL2tIaU1TTGVtN3JNTUtEbXQ5SjBIbWd0Sy8zQmc3R2hnT0dMQ2dQVDhhZnAxcGRURXg0ODg2bmd0S0YyYzlPcHNnVkRiT0tDSk9RYWtpKzFWckZpK3dyaUpwZk5hL29yU2hjclcyODZqTFlzeXlmWkxsOFNFdG5NNjVqMVNMSCt3WFZHNmpjMERZSTk4NkZ1aktKblFMVjBjMU1ydzdzTzVuL2Z3d0Rma29qOWdmRDRvemh5RkFVVk1xQlJsWXJDZDBvVW5ScmtpeUV6T1BGTkxGelR6VDVWbEJYZDNPbThvemtCdE9PZERQWmtVOWs5L1BDcExrSGFyblpVZkloWE92MC82SVN2MFNPY3ZqLzFiOXR6ZmtONUczeDdlYmRJaDM0V2ZGNnRwRHJyWUs2UFVwZC80ZkpTM2JwWGFydE9KTitTUkRCWE92MGw2bTZFeloxejM1bHc5azNSTzAxV01GQlU0SDQrMjFsTWJiOFhzMHZsdllWSHAzUFVxS0NjYU9EVXNuYk5MU1I1Y1RDK2RaK3BwVmVsQ25LYTExN2VOVE5Ra1NWRmlVMnRQK1FyU09WdlpaYVVMcXd2dFBDaC9qZE1iM1JOOTlRT2tvanY4THNRUzBrL083K3RLZitOTVQ5Nk5QMFV2THZpblJtOUpuMjR3VnJiRENiR0lkRjR4VkJOSi94SlNlNlVlby9Cai85SS83RHkwUHZybkp5NW9wU0lSUlpYMGFRVUFBUHpYM2gzVUFBQ0FRQXg3WUFEL2FuRkJDTmRhbUlBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREFtbW9lSzlIemlCNUk5RUJYbng4QUFBQUFBQUFBQUxCbUFJWktteldJbnh5T0FBQUFBRWxGVGtTdVFtQ0MiLCJhdHRhY2htZW50cyI6W3siZmlsZW5hbWUiOiJmNjNkYTlhNi1lYWQ4LTQ5MTQtYmYyZS1lMmFiMzA2ZmNkZGY6c3RyaW5nOmhlYWx0aGNlcnQudHh0IiwidHlwZSI6ImI2MDRlNjE4LTc4N2QtNGVkNy04MzkyLTljNjExOTVkMzY5ZDpzdHJpbmc6dGV4dC9vcGVuLWF0dGVzdGF0aW9uIiwiZGF0YSI6ImNkMGJlNGZiLTYxNjUtNGFhNS1iMDVmLTdlMmU4MTM1MTgwZDpzdHJpbmc6ZXlKMlpYSnphVzl1SWpvaWFIUjBjSE02THk5elkyaGxiV0V1YjNCbGJtRjBkR1Z6ZEdGMGFXOXVMbU52YlM4eUxqQXZjMk5vWlcxaExtcHpiMjRpTENKa1lYUmhJanA3SW1sa0lqb2lORGhtTXpsbU5qQXROR0l5WVMwME1HRmtMVGhrWmpBdE1USmhNVGRoWldZd09UWTNPbk4wY21sdVp6bzNObU5oWmpObU9TMDFOVGt4TFRSbFpqRXRZamMxTmkweFkySTBOMkUzTm1SbFpHVWlMQ0oyWlhKemFXOXVJam9pWm1JNE9HUXlaak10TW1RM1lTMDBOemxqTFRrMU5ERXRNbVV4WmpZMU5tWmlaalZsT25OMGNtbHVaenB3WkhRdGFHVmhiSFJvWTJWeWRDMTJNaTR3SWl3aWRIbHdaU0k2SW1RNFkyUmhZekJpTFdJMlptSXROR00zTXkxaU16TTJMVE01TXpjNVpHWTNPRGsyTnpwemRISnBibWM2VUVOU0lpd2lkbUZzYVdSR2NtOXRJam9pTVdZNU9XRmxZMkV0WXpZd1pTMDBOelk1TFdJM09HWXRNV0kxTW1FME5tUmlaR0ZoT25OMGNtbHVaem95TURJeExUQTRMVEkwVkRBME9qSXlPak0yTGpBMk1sb2lMQ0ptYUdseVZtVnljMmx2YmlJNklqVmxaVFZtTW1ZMUxUTTBNalF0TkdNeVppMDRNRFE1TFdGak56Z3lPVFE1TlRnek1UcHpkSEpwYm1jNk5DNHdMakVpTENKbWFHbHlRblZ1Wkd4bElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNkltWTNPRFkwWm1ReExUbGpOak10TkRFM1lpMDRaakJrTFdOaE56aG1aVEF4WVdOak9UcHpkSEpwYm1jNlFuVnVaR3hsSWl3aWRIbHdaU0k2SWpVMU9XWmxNV0kwTFRkbVpXVXROR0kxTnkwNVlXWmhMVFF3TkRZd1pXRmxNV1JsTmpwemRISnBibWM2WTI5c2JHVmpkR2x2YmlJc0ltVnVkSEo1SWpwYmV5Sm1kV3hzVlhKc0lqb2lPREppWVdNeU5XWXRaV1EzTkMwME4ySmpMV0UyWkRJdE9XVTNZVGRrTm1JeVpqbGpPbk4wY21sdVp6cDFjbTQ2ZFhWcFpEcGlZVGRpTjJNNFpDMWpOVEE1TFRSa09XUXRZbVUwWlMxbU9UbGlObVJsTWpsbE1qTWlMQ0p5WlhOdmRYSmpaU0k2ZXlKeVpYTnZkWEpqWlZSNWNHVWlPaUl4T0RFME1UZzJOaTA1WkRjeExUUXpOMkV0WVRnMlpTMDVORGt4Tm1SaU9EZzNZbUk2YzNSeWFXNW5PbEJoZEdsbGJuUWlMQ0psZUhSbGJuTnBiMjRpT2x0N0luVnliQ0k2SWpGaU1XTmtOR0ZsTFdZMFlUTXRORE0yWmkwNE9ERTFMVGc0TVdRM1lUTmpNemhtT0RwemRISnBibWM2YUhSMGNEb3ZMMmhzTnk1dmNtY3ZabWhwY2k5VGRISjFZM1IxY21WRVpXWnBibWwwYVc5dUwzQmhkR2xsYm5RdGJtRjBhVzl1WVd4cGRIa2lMQ0psZUhSbGJuTnBiMjRpT2x0N0luVnliQ0k2SWpJd09HVTNZelF5TFRabE5qY3ROREZsT1MwNE9UWmlMVEEzWkdZMk1XVmxOR1pqWXpwemRISnBibWM2WTI5a1pTSXNJblpoYkhWbFEyOWtaV0ZpYkdWRGIyNWpaWEIwSWpwN0luUmxlSFFpT2lJd01XVXpPRGRtWVMxa1pERmxMVFEyWXpBdE9XWTVZUzFrWmpoalpqYzJZemN4TmpRNmMzUnlhVzVuT2xCaGRHbGxiblFnVG1GMGFXOXVZV3hwZEhraUxDSmpiMlJwYm1jaU9sdDdJbk41YzNSbGJTSTZJakF3TVdJd09HWTRMV1U0WkRndE5HTm1aaTFoT1RZMkxXVTFaVFk1T0RGa1ltVmlZVHB6ZEhKcGJtYzZkWEp1T21semJ6cHpkR1E2YVhOdk9qTXhOallpTENKamIyUmxJam9pWmpOak56VTFZVE10TkRrMU5TMDBOVGM0TFRobVpqZ3RPR1F6TXpNMVl6WTVObVU0T25OMGNtbHVaenBUUnlKOVhYMTlYWDFkTENKcFpHVnVkR2xtYVdWeUlqcGJleUpwWkNJNklqQTBaalJpTW1VMUxUVXpZV1l0TkdFMk1DMWhOVGc1TFRobU5UazJaREJqTlRrNVpqcHpkSEpwYm1jNlVGQk9JaXdpZEhsd1pTSTZleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SW1VNVlUWmpNemcyTFdJeVlqQXROREJoTXkxaE5XRTFMVGxoWkdFNFpXTm1NREUxTlRwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5Mk1pMHdNakF6SWl3aVkyOWtaU0k2SWpkaVpXVTBNRGc1TFdSalpESXRORGRpWXkxaU1qYzBMVEE0WW1RMlpEaG1OekJqWWpwemRISnBibWM2VUZCT0lpd2laR2x6Y0d4aGVTSTZJbU14Wm1Vd016Y3pMVFpqWkRJdE5HWmhOUzA0TlRJNUxUbGlNbVk1TnprMU5UWmlOVHB6ZEhKcGJtYzZVR0Z6YzNCdmNuUWdUblZ0WW1WeUluMWRmU3dpZG1Gc2RXVWlPaUpoTVRjNE5tTTVOQzB5WXpSbUxUUXpNRGN0WVdGbU9TMHhaamhsT1RRM01tWmlPV1k2YzNSeWFXNW5Pa1UzT0RNeE1UYzNSeUo5TEhzaWFXUWlPaUkyTlRCbE9XRmpNUzB5T0RCbExUUTVNamd0T0RFellpMWhPVFU1TWpBd1l6azFNRFU2YzNSeWFXNW5PazVTU1VNdFJrbE9JaXdpZG1Gc2RXVWlPaUkxTldNM1l6RTROeTB4WVRZM0xUUmlObVF0WW1FeE5DMDJNR00yTkdaaE1qY3lOR1k2YzNSeWFXNW5PbE01TURrNE9UZzVXaUo5WFN3aWJtRnRaU0k2VzNzaWRHVjRkQ0k2SW1ZM056VXlZalEwTFdSa1pqRXROR001WkMwNU5qTmpMV1F5TkRoaFkyWTJaR1EzTWpwemRISnBibWM2VkdGdUlFTm9aVzRnUTJobGJpSjlYU3dpWjJWdVpHVnlJam9pWkRjeFptTmlOMkV0WldFM1l5MDBZemN6TFdJMU1qUXRZMlkxTnpjM01HTTJOMkk1T25OMGNtbHVaenBtWlcxaGJHVWlMQ0ppYVhKMGFFUmhkR1VpT2lJNVpXSTJNREZtWWkxa01UTXpMVFF6Wm1ZdFlqWm1aQzFsTW1JelpqSTJaRFExWWpJNmMzUnlhVzVuT2pFNU9UQXRNREV0TVRVaWZYMHNleUptZFd4c1ZYSnNJam9pWW1ZM01qUTVaVEl0TTJReVlTMDBNVEV5TFdFMFl6Y3RaR0kwT0RCa056UXhaV1ptT25OMGNtbHVaenAxY200NmRYVnBaRG8zTnpJNU9UY3daUzFoWWpJMkxUUTJPV1l0WWpObE5TMHpObUUwTW1Wak1qUXhORFlpTENKeVpYTnZkWEpqWlNJNmV5SnlaWE52ZFhKalpWUjVjR1VpT2lKa00yTXdabUZtTXkxaU5ERmhMVFF6WXpBdE9XVXpOUzB3TXpBNE5XUXdOR1V5WkdRNmMzUnlhVzVuT2s5aWMyVnlkbUYwYVc5dUlpd2ljM0JsWTJsdFpXNGlPbnNpZEhsd1pTSTZJbU5oWmpjNE1tTXdMV1JqTm1ZdE5EUmhOQzFpWWpZNExUVTBPRGszTVdKak1EbGtOanB6ZEhKcGJtYzZVM0JsWTJsdFpXNGlMQ0p5WldabGNtVnVZMlVpT2lKbU5HTTJOV1V5TXkxak5tWmtMVFF4TnpndE9UazROUzFrTURoa1kyRmtNMlU0TkRBNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pBeU56VmlabUZtTFRRNFptSXRORFJsTUMwNE1HTmtMVGxqTlRBMFpqZ3daVFpoWlNKOUxDSndaWEptYjNKdFpYSWlPbHQ3SW5SNWNHVWlPaUptWTJKaU9EVmpaUzB3WXpFeExUUXlaR010T0RaaE5pMDRaREprTldVNVlUa3daakU2YzNSeWFXNW5PbEJ5WVdOMGFYUnBiMjVsY2lJc0luSmxabVZ5Wlc1alpTSTZJbUprTUdRd09EUTRMVE5pWVdNdE5EQmlZeTA1TUdFMkxUUXlNV1F5TlRRMU1EYzBaanB6ZEhKcGJtYzZkWEp1T25WMWFXUTZNMlJpWm1Zd1pHVXRaRFJoTkMwMFpURmtMVGs0WW1ZdFlXWTNOREk0WWpoaE1EUmlJbjBzZXlKcFpDSTZJalkxWW1WbFpUTXlMV0prWVdJdE5HWXlOQzA0TWpneExUTTJZbVJpWmpsbFlUazBaVHB6ZEhKcGJtYzZURWhRSWl3aWRIbHdaU0k2SW1JNE5tUTJaVFkzTFRsak1UVXROR1kwTlMxaE5qazBMVGRsTWpKaE56UmtaakUyTWpwemRISnBibWM2VDNKbllXNXBlbUYwYVc5dUlpd2ljbVZtWlhKbGJtTmxJam9pT0dRMk5qZzVORGd0TUROa1lTMDBPR0kzTFdGa01ETXRPVGMyWmpNeFptVmlNR1ZqT25OMGNtbHVaenAxY200NmRYVnBaRHBtWVRJek1qaGhaaTAwT0RneUxUUmxZV0V0T0dNeU9DMDJObVJoWWpRMk9UVXdaakVpZlN4N0ltbGtJam9pWVdNMU1qRXdOek10TkdabU55MDBaVFF3TFRrM1l6SXRaamsxTVdabU5UQTRPVEl4T25OMGNtbHVaenBCVENJc0luUjVjR1VpT2lJek1UVXhPV0UxTVMwd056QTBMVFF6TXpFdFlXRTJZeTB5TkRFMk9ERTNaVFpqWlRZNmMzUnlhVzVuT2s5eVoyRnVhWHBoZEdsdmJpSXNJbkpsWm1WeVpXNWpaU0k2SWpaak4yVmpNakExTFdJNE16TXRORFE0TlMwNU5UZ3pMVEkzWlRaaE4yTTRaalJtTVRwemRISnBibWM2ZFhKdU9uVjFhV1E2T0RNNVlUZGpOVFF0Tm1JME1DMDBNV05pTFdJeE1HUXRPVEk1TldRM1pUYzFaamMzSW4xZExDSnBaR1Z1ZEdsbWFXVnlJanBiZXlKcFpDSTZJbUpsTldWa1pXSXhMVFJsT0RrdE5EVTVNQzA0TnpsbUxUUXhaR0k1TW1JMk16VmlORHB6ZEhKcGJtYzZRVU5UVGlJc0luUjVjR1VpT25zaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSmlNbUptTkRreU1pMDBaVEEyTFRReU1ESXRZakEzT0Mwd1pUTXhaVEV5T0dVNFl6STZjM1J5YVc1bk9taDBkSEE2THk5MFpYSnRhVzV2Ykc5bmVTNW9iRGN1YjNKbkwwTnZaR1ZUZVhOMFpXMHZkakl0TURJd015SXNJbU52WkdVaU9pSmlPVEppT0RFMk1pMWhORGMyTFRSak9EQXRPREpoWXkwNE5ESXdNR1V6WXpZME16VTZjM1J5YVc1bk9rRkRVMDRpTENKa2FYTndiR0Y1SWpvaU5UQXhOVEppWmpFdE4yWmlNUzAwWkROaExUazNOMk10T0dJMk5Ea3haR0ZtTURVek9uTjBjbWx1WnpwQlkyTmxjM05wYjI0Z1NVUWlmVjE5TENKMllXeDFaU0k2SWpReE1ERm1OR1kyTFRKbFlUWXRORGxsWWkxaFlqTTBMVEJqTlRoak4yVXlZbVkwWmpwemRISnBibWM2TVRJek5EVTJOemc1SW4xZExDSmpZWFJsWjI5eWVTSTZXM3NpWTI5a2FXNW5JanBiZXlKemVYTjBaVzBpT2lJNFlqWXdaREkyWVMxbU1UZzRMVFJpWmpZdFlqSmhNQzAzTm1Rek1HVTJOREl3WTJVNmMzUnlhVzVuT21oMGRIQTZMeTl6Ym05dFpXUXVhVzVtYnk5elkzUWlMQ0pqYjJSbElqb2lOVGxqWkRFM05UWXRZMkZsTWkwMFpqSmlMV0l4TVRBdE9XRmlaVEF4TUdWak0yRTRPbk4wY21sdVp6bzROREExTXprd01EWWlMQ0prYVhOd2JHRjVJam9pT0dFNU1qQTBNemN0TTJFeFppMDBPR0l6TFdFNFlUVXRZVGs1TXprNU1XTXdZelZoT25OMGNtbHVaenBEVDFaSlJDMHhPU0o5WFgxZExDSmpiMlJsSWpwN0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lOalppWVdVMFl6SXROak13WkMwMFlUVTJMVGxsWTJNdE9UZzNOemxsT1dSak5EVmhPbk4wY21sdVp6cG9kSFJ3T2k4dmJHOXBibU11YjNKbklpd2lZMjlrWlNJNklqazBZVE0yT1RSbUxXSmxOemN0TkdNeVlpMDVORFJoTFRZNE5HRmtZekl4WkdNM016cHpkSEpwYm1jNk9UUTFNekV0TVNJc0ltUnBjM0JzWVhraU9pSTJNVGRoTVRKaVlTMDFPRGxrTFRSbU56WXRPVEJoWXkxaU1qZGlNV1V4T1RjMk1EWTZjM1J5YVc1bk9sTkJVbE10UTI5V0xUSWdLRU5QVmtsRUxURTVLU0JTVGtFZ2NHRnVaV3dnTFNCU1pYTndhWEpoZEc5eWVTQnpjR1ZqYVcxbGJpQmllU0JPUVVFZ2QybDBhQ0J3Y205aVpTQmtaWFJsWTNScGIyNGlmVjE5TENKMllXeDFaVU52WkdWaFlteGxRMjl1WTJWd2RDSTZleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpReVptWXdZMkkwTFRVellUY3RORGhsTUMwNFpUTTRMV0ZpT1ROaVlUTmlNbVEyWlRwemRISnBibWM2YUhSMGNEb3ZMM051YjIxbFpDNXBibVp2TDNOamRDSXNJbU52WkdVaU9pSTJOVFJrTVRZNE1DMHhaVEkzTFRRME5qRXRZVFZoTVMwNE1XRmhZakE1TTJRNU5UQTZjM1J5YVc1bk9qSTJNRE00TlRBd09TSXNJbVJwYzNCc1lYa2lPaUk1WWpFNU9XWm1ZeTFtWkRsa0xUUXdNbVV0T0RabFppMW1OV0V6TWpjMU1HSXpPR002YzNSeWFXNW5PazVsWjJGMGFYWmxJbjFkZlN3aVpXWm1aV04wYVhabFJHRjBaVlJwYldVaU9pSTFOMlJsTmpnNFppMW1ORFkzTFRSaFlUa3RZVGs1TmkwMk5qVTRNekkyWVRFeFpqYzZjM1J5YVc1bk9qSXdNakF0TURrdE1qaFVNRFk2TVRVNk1EQmFJaXdpYzNSaGRIVnpJam9pWWpka05tWTVaV010TURFMlpTMDBOV0ZrTFdJd09HVXROamczTUdNd1pUVm1ZakUzT25OMGNtbHVaenBtYVc1aGJDSjlmU3g3SW1aMWJHeFZjbXdpT2lJM05UazRaVEF4WXkwelpqSTBMVFE0WW1JdE9ERXpNUzFpT0RrNE56TmhaalEyWlRVNmMzUnlhVzVuT25WeWJqcDFkV2xrT2pBeU56VmlabUZtTFRRNFptSXRORFJsTUMwNE1HTmtMVGxqTlRBMFpqZ3daVFpoWlNJc0luSmxjMjkxY21ObElqcDdJbkpsYzI5MWNtTmxWSGx3WlNJNklqWmpNVE0xTnpWbExUa3lOVFF0TkRnNFl5MDRNemd3TFRReU4yWXdNakJsWVRRNU1qcHpkSEpwYm1jNlUzQmxZMmx0Wlc0aUxDSjBlWEJsSWpwN0ltTnZaR2x1WnlJNlczc2ljM2x6ZEdWdElqb2lNekl6T0dWallqQXRNV1U1TVMwME56STRMV0kyWXpVdE56QTVPRFJtTURZNVpqTXdPbk4wY21sdVp6cG9kSFJ3T2k4dmMyNXZiV1ZrTG1sdVptOHZjMk4wSWl3aVkyOWtaU0k2SWpGbU1UZzNOVFkyTFRFMk1EWXRORFZrTWkxaFpEaG1MV0U0TVdRd1pqZ3hZamMzTkRwemRISnBibWM2TWpVNE5UQXdNREF4SWl3aVpHbHpjR3hoZVNJNklqTXlOR013WVdRMUxUTXdZVEF0TkdRMk9DMWhORGt3TFRZeFpqRmtNMlV4TjJJM1pEcHpkSEpwYm1jNlRtRnpiM0JvWVhKNWJtZGxZV3dnYzNkaFlpSjlYWDBzSW1OdmJHeGxZM1JwYjI0aU9uc2lZMjlzYkdWamRHVmtSR0YwWlZScGJXVWlPaUppWm1KaFpUa3hZeTAwTkRFeExUUXlZbUl0WWprNE9DMWhNMkUxWmpNek5HSmhOekU2YzNSeWFXNW5Pakl3TWpBdE1Ea3RNamRVTURZNk1UVTZNREJhSW4xOWZTeDdJbVoxYkd4VmNtd2lPaUl4TTJJd1pHTTJPQzB5TVdWakxUUXdZemN0T1dKall5MDJZVFF6Tm1abFltVXlPV1U2YzNSeWFXNW5PblZ5YmpwMWRXbGtPak5rWW1abU1HUmxMV1EwWVRRdE5HVXhaQzA1T0dKbUxXRm1OelF5T0dJNFlUQTBZaUlzSW5KbGMyOTFjbU5sSWpwN0luSmxjMjkxY21ObFZIbHdaU0k2SWpoaFlURmtaRFkyTFdRelpqVXROR0l4TXkwNU9EZGpMVGd4WlRNMk5UUTBaR0V4TmpwemRISnBibWM2VUhKaFkzUnBkR2x2Ym1WeUlpd2libUZ0WlNJNlczc2lkR1Y0ZENJNklqZGtPRFJoT0RjeUxUWmlZVEV0TkRJME9TMWlOMkUyTFdFM01URXlOVFpqWldZeU9EcHpkSEpwYm1jNlJISWdUV2xqYUdGbGJDQk1hVzBpZlYwc0luRjFZV3hwWm1sallYUnBiMjRpT2x0N0ltTnZaR1VpT25zaVkyOWthVzVuSWpwYmV5SnplWE4wWlcwaU9pSTBOVFUxTWpobVl5MDVOR0U1TFRSa09HRXRZVEV4TlMxa1lUWXpPVE5qTkRrM1pqVTZjM1J5YVc1bk9taDBkSEE2THk5MFpYSnRhVzV2Ykc5bmVTNW9iRGN1YjNKbkwwTnZaR1ZUZVhOMFpXMHZkakl0TURJd015SXNJbU52WkdVaU9pSm1OalZsWTJabVpTMDFNRFJrTFRSbE5XUXRZak5rTlMwMVl6TXdNekUxWlRjeU5HUTZjM1J5YVc1bk9rMURVaUlzSW1ScGMzQnNZWGtpT2lKbU9HTm1PVEV4TmkwM056WmlMVFE1TWpjdE9HRXdZUzAwTldWaU1qRmlaREJqTkdJNmMzUnlhVzVuT2xCeVlXTjBhWFJwYjI1bGNpQk5aV1JwWTJGeVpTQnVkVzFpWlhJaWZWMTlMQ0pwWkdWdWRHbG1hV1Z5SWpwYmV5SnBaQ0k2SW1aa1ptVXhZMkZsTFRrMVlXTXROR1ZoWkMxaE56TTBMVFZpWmprMVl6bGhNakJqWkRwemRISnBibWM2VFVOU0lpd2lkbUZzZFdVaU9pSTBNekUxWlRWbVpDMDRaakV6TFRRd1pUY3RZV0V3TUMxa05HUTFaV0ZtWWpNd05tTTZjM1J5YVc1bk9qRXlNelExTmlKOVhTd2lhWE56ZFdWeUlqcDdJblI1Y0dVaU9pSmpNamd6TnpBd05TMWlNRFU0TFRSalpqY3RPVFEwTVMxbU0ySm1aalEwTnpnMllqWTZjM1J5YVc1bk9rOXlaMkZ1YVhwaGRHbHZiaUlzSW5KbFptVnlaVzVqWlNJNklqUTVaalF5WWpWbExUTmpNR0V0TkRJNE55MDVNV0UwTFdaak5ERXhZV0UwWTJVek5EcHpkSEpwYm1jNmRYSnVPblYxYVdRNlltTTNNRFkxWldVdE5ESmhZUzAwTnpOaExXRTJNVFF0WVdaa09HRTNZak13WWpGbEluMTlYWDE5TEhzaVpuVnNiRlZ5YkNJNkltRTBOV1EzTW1SakxUVTJOelV0TkdOaVppMDVORGcyTFRKbU1ESTBNbVE0TkdWaE1qcHpkSEpwYm1jNmRYSnVPblYxYVdRNlltTTNNRFkxWldVdE5ESmhZUzAwTnpOaExXRTJNVFF0WVdaa09HRTNZak13WWpGbElpd2ljbVZ6YjNWeVkyVWlPbnNpY21WemIzVnlZMlZVZVhCbElqb2laVEJrTm1JMFptRXRaV05qWWkwME5HRTJMV0ZtWlRFdFpUTmlOREpoT1RsbU16STFPbk4wY21sdVp6cFBjbWRoYm1sNllYUnBiMjRpTENKdVlXMWxJam9pWW1KbU1EVTBaV1V0T1RBME9DMDBPRGt6TFdJNE9XTXRPR0kzTnprMU56Y3dNekE0T25OMGNtbHVaenBOYVc1cGMzUnllU0J2WmlCSVpXRnNkR2dnS0UxUFNDa2lMQ0owZVhCbElqcGJleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpFd01qRTBaakkwTFRReU1EZ3ROR1EwTWkxaU16bGxMVFEwTldWbE1UUmlZMkprT0RwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5dmNtZGhibWw2WVhScGIyNHRkSGx3WlNJc0ltTnZaR1VpT2lKbE9EWmlaV1EwT0MweU5EWXdMVFJtTXpNdFlXUmhPQzFsWm1Nd1lqSTJNVFZpWVRRNmMzUnlhVzVuT21kdmRuUWlMQ0prYVhOd2JHRjVJam9pTmprMFpXSm1aVFl0T0RSak55MDBOVGc1TFdFNE1HRXRPV1F3WVdRNE1EQTFPREE1T25OMGNtbHVaenBIYjNabGNtNXRaVzUwSW4xZGZWMHNJbU52Ym5SaFkzUWlPbHQ3SW5SbGJHVmpiMjBpT2x0N0luTjVjM1JsYlNJNklqZ3hNakJrTjJZMUxUbGtOamd0TkRCaU5DMWlZekF4TFRFMFpEQmtZV0ptT1dWak1qcHpkSEpwYm1jNmRYSnNJaXdpZG1Gc2RXVWlPaUl4TVRZMlltSXdOaTAwTmpFeUxUUTRZamN0WVdRd05DMWlZelUzWmpJd056SmtPVFU2YzNSeWFXNW5PbWgwZEhCek9pOHZkM2QzTG0xdmFDNW5iM1l1YzJjaWZTeDdJbk41YzNSbGJTSTZJalptWmpNd09URm1MVGswTXpFdE5HRXpaaTFoWWpka0xUVXpZelV5Tm1ReE5Ea3lNanB6ZEhKcGJtYzZjR2h2Ym1VaUxDSjJZV3gxWlNJNkltRXhPVEkwT1dVeUxUazBNek10TkRFNU5TMDROR0ZpTFdSaFlqTXlPR1UyWmpjMlpEcHpkSEpwYm1jNkt6WTFOak15TlRreU1qQWlmVjBzSW1Ga1pISmxjM01pT25zaWRIbHdaU0k2SW1Ka01qTTBOVGs0TFRneVpUZ3ROREJoTlMwNFlqQmxMVFpsTkRjMU9UTmhZemczWmpwemRISnBibWM2Y0doNWMybGpZV3dpTENKMWMyVWlPaUkxTVRRNE5ETXlPQzFsWkRjMUxUUTROVE10T0RGaE5pMDRNbUV6WmpSa01UWmxPREU2YzNSeWFXNW5PbmR2Y21zaUxDSjBaWGgwSWpvaU1UTTRPV016WVRFdFpqYzVZUzAwWWpsbExXSTFZekl0TkRrMk1XTmxOalppWXpVME9uTjBjbWx1WnpwTmFXNXBjM1J5ZVNCdlppQklaV0ZzZEdnc0lERTJJRU52Ykd4bFoyVWdVbTloWkN3Z1EyOXNiR1ZuWlNCdlppQk5aV1JwWTJsdVpTQkNkV2xzWkdsdVp5d2dVMmx1WjJGd2IzSmxJREUyT1RnMU5DSjlmVjE5ZlN4N0ltWjFiR3hWY213aU9pSTRaVGM1Wm1NME55MWpOalV3TFRRNFptVXRPVFJtWkMwME5qRmxOVFZqWTJVNU1qUTZjM1J5YVc1bk9uVnlianAxZFdsa09tWmhNak15T0dGbUxUUTRPREl0TkdWaFlTMDRZekk0TFRZMlpHRmlORFk1TlRCbU1TSXNJbkpsYzI5MWNtTmxJanA3SW5KbGMyOTFjbU5sVkhsd1pTSTZJak16WWpKaU5EUTNMVEF6WTJRdE5ESmpOUzFpT0ROaExXUmhORFUzTkRReFltWXpNanB6ZEhKcGJtYzZUM0puWVc1cGVtRjBhVzl1SWl3aWJtRnRaU0k2SWpSaFl6RTBPR1V3TFRSaE5tTXRORFEyWVMwNE5qUmtMVE5sWW1abE9UWmhNamxpWmpwemRISnBibWM2VFdGalVtbDBZMmhwWlNCTlpXUnBZMkZzSUVOc2FXNXBZeUlzSW5SNWNHVWlPbHQ3SW1OdlpHbHVaeUk2VzNzaWMzbHpkR1Z0SWpvaVpUWXlNamhqTXpVdFlqZGpOUzAwWTJVeExXSmtaVGN0TWpabFl6STVNRGxqTUdGaE9uTjBjbWx1Wnpwb2RIUndPaTh2ZEdWeWJXbHViMnh2WjNrdWFHdzNMbTl5Wnk5RGIyUmxVM2x6ZEdWdEwyOXlaMkZ1YVhwaGRHbHZiaTEwZVhCbElpd2lZMjlrWlNJNklqZzBPVEE0TURBeUxXVXpNVGN0TkRRMll5MWlNREU0TFRSaU1qQm1ZemxoWldNd1pqcHpkSEpwYm1jNmNISnZkaUlzSW1ScGMzQnNZWGtpT2lJMVltTmhZV0l3TlMwd1pUQm1MVFF4Wm1VdE9UUTNNeTA0TjJWbU1UVTJPVGd3WVdJNmMzUnlhVzVuT2tobFlXeDBhR05oY21VZ1VISnZkbWxrWlhJaWZWMHNJblJsZUhRaU9pSmpNR0k0WlRNM1ppMHpPRFl6TFRRME5tSXRZamxrTkMxbE5qbGtZbU0xWXpKaVlqWTZjM1J5YVc1bk9reHBZMlZ1YzJWa0lFaGxZV3gwYUdOaGNtVWdVSEp2ZG1sa1pYSWlmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJbVl5TUdJME9HUmpMV0l5WW1RdE5HVm1ZaTA0TTJZNExUVXhaV000TkRJeE1XRXhNVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lJM056QXlOalZtTVMwNE5tVmtMVFJrTmpZdE9EVXhaQzFpT0RFM05qTTJNVE0zTnpNNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMWhZM0pwZEdOb2FXVmpiR2x1YVdNdVkyOXRMbk5uSW4wc2V5SnplWE4wWlcwaU9pSmpNekprWXpFNE1TMDROemxrTFRRNE4yWXRZVE5tTUMwM09UTXdORGRrWXpneU9HUTZjM1J5YVc1bk9uQm9iMjVsSWl3aWRtRnNkV1VpT2lKbFpETm1NR00yTlMwMFpXUmpMVFJrTmprdFlqUmxNaTAyWm1RMk9USXhaR1UzT1RNNmMzUnlhVzVuT2lzMk5UWXhNak0wTlRZM0luMWRMQ0poWkdSeVpYTnpJanA3SW5SNWNHVWlPaUkwTTJZelptUXdaQzAyTkRJMExUUTJOVGd0T0dWa1pDMW1ZekpsTTJGbE5EUm1ZbVU2YzNSeWFXNW5PbkJvZVhOcFkyRnNJaXdpZFhObElqb2lNelV3T0RjM1pqRXRaV1F3TWkwMFpqQXdMVGszTXpNdFptRTJNV0pqWkRZek0yTTVPbk4wY21sdVp6cDNiM0pySWl3aWRHVjRkQ0k2SW1NNE5qUmtaVGxtTFRBelkyWXRORGc0WWkxaU1UUTJMV1UxTjJWbE1qaGpOMk15WlRwemRISnBibWM2VFdGalVtbDBZMmhwWlNCSWIzTndhWFJoYkN3Z1ZHaHZiWE52YmlCU2IyRmtMQ0JUYVc1bllYQnZjbVVnTVRJek1EQXdJbjE5WFgxOUxIc2lablZzYkZWeWJDSTZJamhpWldFMk9ESTNMVEZrTlRBdE5EbGxOUzFoT0RreExUVTBZbVl5TWpka09XVmlORHB6ZEhKcGJtYzZkWEp1T25WMWFXUTZPRE01WVRkak5UUXRObUkwTUMwME1XTmlMV0l4TUdRdE9USTVOV1EzWlRjMVpqYzNJaXdpY21WemIzVnlZMlVpT25zaWNtVnpiM1Z5WTJWVWVYQmxJam9pTmpjNE9XVmpaVGN0WmpNNFpDMDBORFk0TFdJNVltWXRPRFV6TWpRNU1UazJOREprT25OMGNtbHVaenBQY21kaGJtbDZZWFJwYjI0aUxDSnVZVzFsSWpvaVlXTXlZVFU0T1RJdE5XWTBPQzAwTVROaExUZ3hOakl0TkRrM1lXSXdNV1F3WlRJek9uTjBjbWx1WnpwTllXTlNhWFJqYUdsbElFeGhZbTl5WVhSdmNua2lMQ0owZVhCbElqcGJleUpqYjJScGJtY2lPbHQ3SW5ONWMzUmxiU0k2SWpGaE1HRTFZbU5oTFRRelpqRXROR015TXkxaU5HSXdMV05tTmpKaE9HSTNOV0U0TkRwemRISnBibWM2YUhSMGNEb3ZMM1JsY20xcGJtOXNiMmQ1TG1oc055NXZjbWN2UTI5a1pWTjVjM1JsYlM5dmNtZGhibWw2WVhScGIyNHRkSGx3WlNJc0ltTnZaR1VpT2lJeE9XUTNZelJoTnkxbE9XWXhMVFE1Wm1ZdFlUTmpZeTAwWkROak5XVTRZV1JoTWpBNmMzUnlhVzVuT25CeWIzWWlMQ0prYVhOd2JHRjVJam9pTXpKbU1qZzVOak10TnpkaE55MDBOV1l6TFdFNFpUWXROMlpsTmpBek1ERXpZbUUzT25OMGNtbHVaenBJWldGc2RHaGpZWEpsSUZCeWIzWnBaR1Z5SW4xZExDSjBaWGgwSWpvaVptUXhNekpoTWpZdE5URTFNQzAwTVRReExUZzVNREV0WlRZeFpETTBOekF4TjJKbE9uTjBjbWx1WnpwQlkyTnlaV1JwZEdWa0lFeGhZbTl5WVhSdmNua2lmVjBzSW1OdmJuUmhZM1FpT2x0N0luUmxiR1ZqYjIwaU9sdDdJbk41YzNSbGJTSTZJamswTnpnMk9UWmpMV1UzWVdJdE5ERTBNeTA0T1RobExXWmtZbVpqT1dZek1EYzJaVHB6ZEhKcGJtYzZkWEpzSWl3aWRtRnNkV1VpT2lJM056QTBOV1V4WXkwMU5tTXlMVFJqWlRVdFlXUTFZUzAyWW1Gak16QmxNRFJsTmpjNmMzUnlhVzVuT21oMGRIQnpPaTh2ZDNkM0xtMWhZM0pwZEdOb2FXVnNZV0p2Y21GMGIzSjVMbU52YlM1elp5SjlMSHNpYzNsemRHVnRJam9pTUdJek1qWmlabVl0WWpNME9TMDBPR1F6TFdGaE9HTXRNMkkwTldSbVpHTmhNams0T25OMGNtbHVaenB3YUc5dVpTSXNJblpoYkhWbElqb2laV1poTnpjeVlUVXRNMlEzTVMwME9UY3lMV0V6TldZdE1UZ3hNV1EyWmpaaU1UazRPbk4wY21sdVp6b3JOalUyTnpZMU5ETXlNU0o5WFN3aVlXUmtjbVZ6Y3lJNmV5SjBlWEJsSWpvaU5URTRNelk1TVRVdFpEaGtNUzAwWmpKbUxXSXhNVEF0TVRCaE5tVTJZMlZrWlRSa09uTjBjbWx1Wnpwd2FIbHphV05oYkNJc0luVnpaU0k2SWpjNFpEYzVPRFE1TFRoak5HUXRORFprTXkxaU5UWmtMV1F4WVdNelltTmhObVkxWkRwemRISnBibWM2ZDI5eWF5SXNJblJsZUhRaU9pSXhPRGM0Wm1VMVpTMHdOREkzTFRRd05EUXRZbU0zWXkwek9ESTNNMlZoWmpKak1XRTZjM1J5YVc1bk9qSWdWR2h2YlhOdmJpQkJkbVZ1ZFdVZ05Dd2dVMmx1WjJGd2IzSmxJREE1T0RnNE9DSjlmVjE5ZlYxOUxDSnNiMmR2SWpvaVlXSTJNVFEzTURZdE9URXdZaTAwWVRNeExUa3daR1l0Wmpjd05XUTVPR0ppTnpneU9uTjBjbWx1Wnpwa1lYUmhPbWx0WVdkbEwzQnVaenRpWVhObE5qUXNhVlpDVDFKM01FdEhaMjlCUVVGQlRsTlZhRVZWWjBGQlFXWlJRVUZCUkVsRFFVMUJRVUZCY0hnclVHRkJRVUZCVFRGQ1RWWkZWVUZCUVVSTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlRYcE5lazE2VFhwTmVrMTZUWHBOZWsxNlpVTnRhVUZCUVVGQlJVaFNVMVJzVFVGUlRDdEJOM2hCWjI0eVJGQXpla0ozY2pGRFVFVnNLMGt2VVVGQlFuZGtTbEpGUmxWbFRuSnpibVF4TWpKNWIxRlNkbXRJU1ZOSVRpdDZMM1I1VldzNWIxUkZRMUV4WWxSQ1l6SXpZbmxPY3pCQ05VZEpSRUZTUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFXc3JTV3NyU1dSNE5HYzFUalJDT1VkUkwzSlFRVGxLTDBsUVpsTm5kMHd2VFVWRlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVVIzVURWYVVHOVFOWEkzUmtwTFFXWTNZM1ZtUW1sb1VFNVRhMWcxYUd4Qk9YVXJSSE5RTjJSWUwwcExNVkF5VmxCcFUwbHZaV0pGY2t4M1ZtZzFXbmdyT0VNeFdUSXlXWFJRTUVad1pqWm9aR1ZoSzIxeE1WZHNhWGhtWldvMlVtTkVlR293T1hOM1dHSmlaVUpSY0dscWRXY3lNR0ZxTDFORk9HSjJielZvUlhWaGRrRjFVMHR3VVdaS2VGUkhPVEZuVlhKRFZqWnFVMUZGTUc5UWEyVTBkM1ZyWlRjd05VVnhjRXhPVjNoMFRYUlRhelJxZGxoSGJHUXJkRXhzZUhaV1RVNXVZV3RFTjIxRmJtUlpWRlpYVTI1V09EWXdWMVZZYkRNMFVrMTVOMEpsYlhCNVIzcE9OM0JCWW0xWVJVRTJZbVoyU3pCMU16SjFWRVpMUzFaTk1ISXdXWGN4VFZSalJuWndPR2xXVEZCRU1DczVaMGhSZVNzM2NsTm1NMlZsYW5BeVNIVkdZM050YkdScFJYb3dSbnBMV0daVFVuY3pjV1V3T0ZoeFpEbGtVRFpSUzA5T2JtdDFOR3hITTA1VFlpOVNRblJMZEV0ME1YUjBaRUpLYVZsaU1sWkpOMkp5WXpkMFl6aEpXVzkwU25wSVZVSXdZeXRQSzFRemNsUlJkVXhMYzFwU2NYQjZhMVJUTjJSYVNUUjJieXR4U201a1JVZFBPRVY2WldONWFtRmpOaTlKVkU0eVMwOVhZVlZNU1ZRdllVeGtaVlZ1Y1hCa2FUZFdWeklyUzNsak1qbEdURE56TjJVemFHazFURlJUYUdWWFYzQjVWMnhJTkZoNmJYWlhhbTVwVDJsR1RqTlpWMFJwZGxkSk9USlhkV3MxWTNReVF6QndNMHA2YkRsWlRqWTJWMGsxU1ZZdlZubEdPRFp5TVdFeE4zQklOVlZOUXpCd1dDOUVkMWhXVlRVeU5FdHpOVmxuUkZwdFREUjZSM294ZHpnd2NETXpVR294Y0UxMlkya3JkR015WTBaSmFtMW9TREprVjFabWRXRldUSFZNYW5rNVpWUjZaM0ZQY25GbGQzWXdkblZ0THpGTFVqUXJNbUUyUkdnMWNGaFBOMVk1VHl0ek5FdFNTbEJCUkhWNFRtcDBha1pEUTJzdlEyeDBSWHBuWm5wVGRHVnlVM1prV2xGYVpVUnZlWGx4ZUZGbmRWSXhiRmh0UW14Skx6bFFVMlZpV25CaVQyVTRZbWwyZERKaVJrczVXV0ZMTkdWSVpUZE9URTVoZEV4UU0zRkhXVXhtVERjeFVtOU5ka0kyV0hVNU5rb3pWRmQwT1V4VWIxRk5OWHB0T0ZsbWVHSklTVVZUVUZwWVdGY3ZkRzkyVkZOdksxQnhSbmhPWlhOM1duRnFUeTlZTURsUGRrSm5hVGxQWTBoM04yeHNWWFZyWTNZclpHa3djbTVsY1dZNU9YVlliMHRuYkUxTmQyRnNiRGQ0TDIxNU1HMXNVRFZ3YVZadWRqTm1kVm9yTVRremVHNXdWRmxNZWpOVGFtVnFVRXhZY0U4MlZIUllZbnBZY0daSlZXTmxTa2h0VUhOWVFVcHpZa2tyWVV3M1puWnpjSEJXYzA5WU4zVmhaRW81Um5aMVZEWXpVSGh6V2tGUk0xVk5lSGxuVEhsWGRuTnJOaTlzZFd0MU5EQm1ZamgwZEc5c1JFWkdZakZhVVZFMkwyMVNhM1l4YVZjNWFURktOa012TVdGbGFrRmpkbEZRVm0xVmREWkdRakpqYmpJMlNucEVUelJVYzJGTVkxZGxZVlJpYnpkSmJqQTBXREE0TmprMldIaFVibkpyYlhwSFEwaHBiVzFLY0V4MVRtRlFhVGN4Wml0TFQydDBaVFZKU3psUGNsTTNOR2x1WjFCVFprcGtNVzlKVTBRNVdqQnRMMmhRYUVJd2J5c3ZUR1F6VFUxSFZYSlRWVFk0Y3psNVZYcFlVMDh6YzNWb1Z5dENhQ3RLYWpCdmVYb3ljMjVhY1dkd1kzcGtOV2wzY0haU2RtMUxabGh3V1M5UU1IbGxVMlp6WjBoUGFHeHBkM1JNVXpkalFsTnBVakZoV2taUU16QnhLMEowTTJaWVlrczVhRkV5VkhJck5ISlRZeXM0Wkdac1dFTlBNbXcyY0ZrclVFbHpOWEJHTVhoek5HdHRZbGhXUWpaNk1FcFhVbEprU0NzMlFqQjNPRlpsYjNsa1pWZHNWamcwZUdGVlRHNTJXREE0ZGtWNlRtNHJTRXBQZFN0MFpsUXhZMU5pUzFCTVpYZDJWMnRqTDJNeEwxbDBjelJUYkVvclJFaHdkVzV6UmpNd05qbFlVM0ozTjFab1VXVnNOR2RJVGpOUmRVaFBPR3BGYXk5UE9HTkRLMVZ2TDNCWVVpdDJSekJNVTI0dldsaDRiRmg1U1c5ak5qQlFVMmhsYkdSM2RtUjZZalJJVnpOSk56RndUeTh3ZDBoWmNVOUpjRGgyTkRGS1ZEVXlWRTVxWmpWcWVESTBabTFGT1RaWFRISkhOeTlpYzI5Tk5tVm9RMGR3U2poek1DOWFWak5yT0hGdVZFOWtXREZDTmpaSVQyZGlOR0kxUzFKbWRHdzFOR1pETjI5MmVYWmFXbkJZZERaS2VUUnZNMXB4WldSUGRrMVVaSE5zVUZWb1JEQnliRmQ0ZGxaTlJuUlRNRkF4VlU5dVVIWlhhemcwV0dSaU1FUkpXRmN2YTBocFRWTk1aVzAzY2sxTlMwUnRkRGxLTUVodFozUkxMek5DWnpkSGFHZFBSMHhEWjFCVU9HRm1jREZ3WkZSRmVEUTRPRFp1WjNSTFJqSmpPVTl3YzJkV1JHSlBTME5LVDFGaGEya3JNVlp5Um1rcmQzSnBTbkJtVG1FdmIzSlRhR055VnpJNE5tcE1XWE41ZVdaYVRHdzRVMFYwYmswMk5Xb3hVMHhJSzNkWVZrYzJhbU13UkZsSk9UZzJSblZxUzBwdVVVeFdNR014VFhKM04zTlBOVzR2Wm5kM1JHWnJiMm81WjJaRU5HOTZhSGxHUVZWV1RYRkNVbXhaY2tOa01HOVZibEp5YTJsNVJYcFBVRVpPVEVaNlZIcFVOVlpzUWxoa00wOXRPRzk2YTBKMFQwOWtSRkJhYTFVNWF6a3ZVRU53VEd0SVlYSnVXbFZtU1doWVQzWXdMelpKVTNZd1UwOWpkbW92TVdJNWRIcG1hMDQxUnpONE4yVmlaRWxvTXpSWFprWTJkSEJFY25KWlN6WlFWWEJrTHpSbVNsTXpZbkJZWVhKMFQwcE9LMU5TUkVKWVQzWXdiRFp0TmtWNldqRjZNelZzZHpsck0xSlBNREZYVFVaQ1ZUUklOQ3N5TVd4TlltSTRXSE13ZG14MldWWkljRE5RVlhGTFEyTmhUMFJWYzI1aVRreFRValZqVkVNclpGb3JjSEJXWld4RGJrdGhNVEUzWlU1VVRsRnJVMVpHYVZVeWRGQXJVWEpUVDFaMldscGhWVXh4ZDNaMFVFTm9MMnBrVFdJelVrNDVPVkZQYTI5cWRqaE1jMUZUTUdzdlR6Y3JkRXRtSzA1TlZEazJUbEF3VlhaTWRtbHVVbTA1U200eU5IZFdjbUpFUTJKSFNXUkdOSGhXUWs1S0wzaEtVMlUyVldWdkwwSnFMemxKTHpkRWVUQlFkbkp1U25rMWIzQlRTVkpTV2xnd1lWRlZRVUZRZWxnemFETlZRVUZEUVZGQmVEZFpRVVF2WVc1R1FrTk9aR0Z0U1VGQ1FVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGRVFXMXRiMlZMT1VoNmFVSTFTVGxGUWxodWVEaEJRVUZCUVVGQlFVRkJURUp0UVVsYVMyMTZWMGx1ZUhsUFFVRkJRVUZGYkVaVWExTjFVVzFEUXlJc0ltbHpjM1ZsY25NaU9sdDdJbWxrSWpvaU1qQm1OVGt4TlRndE9HSTNZUzAwTkdWa0xUZzVZbUV0T1dFMk9UTTBOR1V3TURVMk9uTjBjbWx1Wnpwa2FXUTZaWFJvY2pvd2VFVXpPVFEzT1RreU9FTmpORVZtUmtVMU1EYzNORFE0T0RjNE1FSTVaall4Tm1Ka05FSTRNekFpTENKeVpYWnZZMkYwYVc5dUlqcDdJblI1Y0dVaU9pSmxNekV5WmpJMk1TMWtPV0l5TFRRM016RXRPV0k1WVMwek9UQTBNamhrTkRGaE1UWTZjM1J5YVc1bk9rNVBUa1VpZlN3aWJtRnRaU0k2SW1NMU5UZzJaRGN5TFdZMVltUXROR015TVMwNE4yRTRMVEk1TVRVek1XSTFNV1l4WkRwemRISnBibWM2VTBGTlVFeEZJRU5NU1U1SlF5SXNJbWxrWlc1MGFYUjVVSEp2YjJZaU9uc2lkSGx3WlNJNklqZzFZVEZrTkRWbUxUUTFPRE10TkRNM055MDVPVFZtTFdaa09XUXpaamt4WVRWbVl6cHpkSEpwYm1jNlJFNVRMVVJKUkNJc0lteHZZMkYwYVc5dUlqb2laVFZqTkdGalpXVXRaalV6WWkwMFlqUmlMV0kyWTJJdE5qRXhaVEF3WTJJNU1ESmtPbk4wY21sdVp6cGtiMjV2ZEhabGNtbG1lUzUwWlhOMGFXNW5MblpsY21sbWVTNW5iM1l1YzJjaUxDSnJaWGtpT2lKaFptVm1abVJsTkMwME1qbG1MVFJqTjJNdFlqSmxNeTAyTWpCa1lUTmxaVGswTkdFNmMzUnlhVzVuT21ScFpEcGxkR2h5T2pCNFJUTTVORGM1T1RJNFEyTTBSV1pHUlRVd056YzBORGc0Tnpnd1FqbG1OakUyWW1RMFFqZ3pNQ05qYjI1MGNtOXNiR1Z5SW4xOVhTd2lKSFJsYlhCc1lYUmxJanA3SW01aGJXVWlPaUppWVRRM01qY3dNeTA0Wm1VMExUUXlNRGt0T1dRNFppMHhaVEJoTlROa1lqSmxaalE2YzNSeWFXNW5Pa2hGUVV4VVNGOURSVkpVSWl3aWRIbHdaU0k2SWpneE9EWTNaVEkwTFRRM09EQXRORFUyTXkxaU1UZzJMVEl4TnpreE9XWTRZemt4T1RwemRISnBibWM2UlUxQ1JVUkVSVVJmVWtWT1JFVlNSVklpTENKMWNtd2lPaUl5T0dGbU1HRXpNaTFsT0RJNExUUmtOelF0T0RjeU1pMDFOR014T1RkbU5tRXdOalE2YzNSeWFXNW5PbWgwZEhCek9pOHZhR1ZoYkhSb1kyVnlkQzV5Wlc1a1pYSmxjaTV0YjJndVoyOTJMbk5uTHlKOWZTd2ljMmxuYm1GMGRYSmxJanA3SW5SNWNHVWlPaUpUU0VFelRXVnlhMnhsVUhKdmIyWWlMQ0owWVhKblpYUklZWE5vSWpvaVlXSXdZMlk0WXpnek1XWTBabUppTlRVeVltUmlObU01WWpKbFltUmlNV1ZoTXpNMFptRm1OV1JpTm1Zd1lXUXlNalpoWlRnMU1HTTROakF6WkdFeVlTSXNJbkJ5YjI5bUlqcGJYU3dpYldWeWEyeGxVbTl2ZENJNkltRmlNR05tT0dNNE16Rm1OR1ppWWpVMU1tSmtZalpqT1dJeVpXSmtZakZsWVRNek5HWmhaalZrWWpabU1HRmtNakkyWVdVNE5UQmpPRFl3TTJSaE1tRWlmU3dpY0hKdmIyWWlPbHQ3SW5SNWNHVWlPaUpQY0dWdVFYUjBaWE4wWVhScGIyNVRhV2R1WVhSMWNtVXlNREU0SWl3aVkzSmxZWFJsWkNJNklqSXdNakV0TURndE1qUlVNRFE2TWpJNk5UVXVNVGMzV2lJc0luQnliMjltVUhWeWNHOXpaU0k2SW1GemMyVnlkR2x2YmsxbGRHaHZaQ0lzSW5abGNtbG1hV05oZEdsdmJrMWxkR2h2WkNJNkltUnBaRHBsZEdoeU9qQjRSVE01TkRjNU9USTRRMk0wUldaR1JUVXdOemMwTkRnNE56Z3dRamxtTmpFMlltUTBRamd6TUNOamIyNTBjbTlzYkdWeUlpd2ljMmxuYm1GMGRYSmxJam9pTUhnM1lUTXhPVFptWmpSbE5tTTRaVFl6TnpWbU9UY3hPRFkxWm1ObE9XTm1OVEprTWpabU5UUXhNVEF3TTJJeFpUQmtZMkV3TURKa056QTJNekkzTURNM00yVmpaVEZtT0dWak9HSTVPVGxqTXpFd09HTmtPRGd6TURCa1pEazBORFV3TXpjek5qTXdNekUyWlRVNVpqWmtaV0kxTURjd1lqa3pObVUyWXpsbFlqRmpJbjFkZlE9PSJ9XX0sInNpZ25hdHVyZSI6eyJ0eXBlIjoiU0hBM01lcmtsZVByb29mIiwidGFyZ2V0SGFzaCI6IjUxNzQwODcxMDk1ZjhjYzBjMDhjZTlmMjJkYzgwMGU1MDNkZGJjZjhjYjIwMzE4NDFkZDc2ODMyOWU1NmI5YTEiLCJwcm9vZiI6W10sIm1lcmtsZVJvb3QiOiI1MTc0MDg3MTA5NWY4Y2MwYzA4Y2U5ZjIyZGM4MDBlNTAzZGRiY2Y4Y2IyMDMxODQxZGQ3NjgzMjllNTZiOWExIn0sInByb29mIjpbeyJ0eXBlIjoiT3BlbkF0dGVzdGF0aW9uU2lnbmF0dXJlMjAxOCIsImNyZWF0ZWQiOiIyMDIxLTA4LTI0VDA1OjA5OjU5LjM0MVoiLCJwcm9vZlB1cnBvc2UiOiJhc3NlcnRpb25NZXRob2QiLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6ZXRocjoweEUzOTQ3OTkyOENjNEVmRkU1MDc3NDQ4ODc4MEI5ZjYxNmJkNEI4MzAjY29udHJvbGxlciIsInNpZ25hdHVyZSI6IjB4OGJjOGIxM2VlZjQxYjQxYzM0NWFkY2JlYTFmYmFiMzc3NzNkYjVmYmY1ZDE5ZDViNzM1YzM0YzJlYjYyMTIyNzY2MGJlMWVlN2Y1ZmM5YWY4OGYyM2EzZTRmMjc5MTY4N2YxYzA2NGM4MWVlMmQ4MjFjMzQxOGRhMDNkZTQ5MWQxYiJ9XX0=" - } - ] }, "signature": { - "type": "SHA3MerkleProof", - "targetHash": "38d00d0d6de585503b44bc792cc5ec39a06ff4abe7a1a8b3b2363c25233034f2", - "proof": [], - "merkleRoot": "38d00d0d6de585503b44bc792cc5ec39a06ff4abe7a1a8b3b2363c25233034f2" + "type": "SHA3MerkleProof", + "targetHash": "644814f7b7dcca05639fc86a9b8ffd50f749e5d4848a58968e0b036aca2cd5cd", + "proof": [], + "merkleRoot": "644814f7b7dcca05639fc86a9b8ffd50f749e5d4848a58968e0b036aca2cd5cd" }, "proof": [ - { - "type": "OpenAttestationSignature2018", - "created": "2021-09-27T08:58:00.007Z", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - "signature": "0x77efc18f2dc0a723a8d4ddff7ce1f157d70ace415a0959dc70a6714fe4e5ee6518edac2b1b7c067ce094a18b4d418a7d376b1d1c89ac7642a719fa8ca9f6a85f1c" - } + { + "type": "OpenAttestationSignature2018", + "created": "2021-12-28T07:21:44.633Z", + "proofPurpose": "assertionMethod", + "verificationMethod": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", + "signature": "0xd12cbc4a5f8070ca7abfda7a5e9343bb7cc8056560d69bc861f758c5293ab42c4caf8903e65d8f2d416f4e8b52b492fdd89cef7c122672674fba7cbfe61816a01c" + } ] -} +} \ No newline at end of file From d5542b17c3b32dd181443cda70c9c23f1320902f Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Mon, 10 Jan 2022 11:25:14 +0800 Subject: [PATCH 08/20] feat: validate test result codes (#417) * refactor: rename variables for clarity * feat: introduce hasRecognisedFields() * fix: lint errors * chore: fix typo * chore: enable logo size validation --- .../notarisePdt/v2/handler.ts | 1 + .../validateInputs/validateDocument.test.ts | 6 +- .../validateInputs/validateDocument.ts | 27 +++--- src/models/fhir/constraints.ts | 84 ++++++++++++++----- src/models/fhir/index.ts | 3 +- src/models/fhir/recognised.test.ts | 46 ++++++++++ src/models/fhir/recognised.ts | 24 ++++++ src/models/fhir/required.ts | 7 +- 8 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 src/models/fhir/recognised.test.ts create mode 100644 src/models/fhir/recognised.ts diff --git a/src/functionHandlers/notarisePdt/v2/handler.ts b/src/functionHandlers/notarisePdt/v2/handler.ts index ad165fbb..4ef74a61 100644 --- a/src/functionHandlers/notarisePdt/v2/handler.ts +++ b/src/functionHandlers/notarisePdt/v2/handler.ts @@ -40,6 +40,7 @@ export const main: Handler = async ( // validate parsed FhirBundle data with specific healthcert type constraints fhirHelper.hasRequiredFields(data.type, parsedFhirBundle); + fhirHelper.hasRecognisedFields(data.type, parsedFhirBundle); // convert parsed Bundle to testdata[] testData = getTestDataFromParseFhirBundle(parsedFhirBundle); diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts index 8e230ef9..a578498b 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts @@ -365,9 +365,7 @@ describe("document logo validation", () => { }); }); - // FIXME: Temporarily disable logo size checking - // eslint-disable-next-line jest/no-disabled-tests - it.skip("should throw on large base64 image string (>20KB)", async () => { + it("should throw on large base64 image string (>20KB)", async () => { const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; sampleDocumentV2InvalidLogo.data.logo = `a60dd179-4029-44c5-8b77-296b10412836:string:${mockImage["33KB"]}`; @@ -381,7 +379,7 @@ describe("document logo validation", () => { } expect(thrownError).toStrictEqual({ title: `Submitted HealthCert is invalid`, - body: `Document logo in base64 image string is too large (33.95KB). Only <=20KB is supported.`, + body: `Document "logo" in base64 image string is too large (33.95KB). Only <=20KB is supported.`, }); }); diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts index 95b9889d..500d8e6e 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts @@ -177,7 +177,7 @@ export const validateV2Document = async ( // Either base64 string or https URL in .png | .jpg | .jpeg format /(^data:image\/(png|jpg|jpeg);base64,.*$)|(^https:\/\/.*[.](png|jpg|jpeg)$)/; const VALID_MIME_PATTERN = /^image\/(png|jpeg)$/; - // const MAX_LOGO_SIZE_IN_KILOBYTES = 20 * 1024; // 20KB + const MAX_LOGO_SIZE_IN_KILOBYTES = 20 * 1024; // 20KB if (!VALID_LOGO_PATTERN.test(data.logo)) { throw new DocumentInvalidError( @@ -209,19 +209,18 @@ export const validateV2Document = async ( ); } - // FIXME: Temporarily disable logo size checking - // if (data.logo.startsWith("data:")) { - // const byteLength = Buffer.byteLength(data.logo, "utf-8"); - // if (byteLength >= MAX_LOGO_SIZE_IN_KILOBYTES) { - // throw new DocumentInvalidError( - // `Document logo in base64 image string is too large (${( - // byteLength / 1024 - // ).toFixed(2)}KB). Only <=${ - // MAX_LOGO_SIZE_IN_KILOBYTES / 1024 - // }KB is supported.` - // ); - // } - // } + if (data.logo.startsWith("data:")) { + const byteLength = Buffer.byteLength(data.logo, "utf-8"); + if (byteLength >= MAX_LOGO_SIZE_IN_KILOBYTES) { + throw new DocumentInvalidError( + `Document "logo" in base64 image string is too large (${( + byteLength / 1024 + ).toFixed(2)}KB). Only <=${ + MAX_LOGO_SIZE_IN_KILOBYTES / 1024 + }KB is supported.` + ); + } + } } } }; diff --git a/src/models/fhir/constraints.ts b/src/models/fhir/constraints.ts index 6c2c378e..2c8416f7 100644 --- a/src/models/fhir/constraints.ts +++ b/src/models/fhir/constraints.ts @@ -1,12 +1,13 @@ import _ from "lodash"; import { pdtHealthCertV2 } from "@govtechsg/oa-schemata"; import { DocumentInvalidError } from "../../common/error"; +import euDccTestResultMapping from "../../static/EU-DCC-test-result.mapping.json"; /** * Common constraints required by all types of HealthCerts: * To convert parsed format -> original FHIR Bundle format (to aid in custom error message) */ -const commonConstraints = { +const commonFhirKeys = { // Patient "patient.fullName": "Patient.name[0].text", "patient.birthDate": "Patient.birthDate", @@ -39,7 +40,7 @@ const commonConstraints = { * Common grouped constraints required by all types of HealthCerts: * To convert parsed format -> original FHIR Bundle format (to aid in custom error message) */ -const commonGroupedConstraints = { +const commonGroupedFhirKeys = { // Observation(s) "observations._.observation.specimenResourceUuid": "_.Observation.specimen.{ type=Specimen, reference }", @@ -118,7 +119,7 @@ const commonGroupedConstraints = { * ART constraints: * To convert parsed format -> original FHIR Bundle format (to aid in custom error message) */ -const artGroupedConstraints = { +const artGroupedFhirKeys = { // Specimen(s) "observations._.specimen.deviceResourceUuid": "_.Specimen.subject.{ type=Device, reference }", @@ -133,7 +134,7 @@ const artGroupedConstraints = { * PCR constraints: * To convert parsed format -> original FHIR Bundle format (to aid in custom error message) */ -const pcrGroupedConstraints = { +const pcrGroupedFhirKeys = { // Observation(s) "observations._.observation.organizationAlResourceUuid": "Observation.performer[2].{ id=AL, type=Organization, reference }", @@ -161,14 +162,14 @@ const pcrGroupedConstraints = { "_.Organization.contact[0].address.text", }; -const generateConstraints = (constraintMapping: Record) => { - const allKeys = Object.keys(constraintMapping); +const generateRequiredConstraints = (mapping: Record) => { + const allKeys = Object.keys(mapping); const constraints: Record = {}; allKeys.forEach((k) => { constraints[k] = { presence: { - message: `'${constraintMapping[k]}' is required`, + message: `'${mapping[k]}' is required`, allowEmpty: false, }, }; @@ -177,19 +178,19 @@ const generateConstraints = (constraintMapping: Record) => { return constraints; }; -const generateGroupedConstraints = ( - constraintMapping: Record, +const generateRequiredGroupedConstraints = ( + mapping: Record, observationCount: number ) => { - const allKeys = Object.keys(constraintMapping); + const allKeys = Object.keys(mapping); const constraints: Record = {}; for (let i = 0; i < observationCount; i += 1) { allKeys.forEach((k) => { - const key = k.replace("_", i.toString()); - const message = constraintMapping[k].replace("_", i.toString()); - constraints[key] = { - presence: { message: `'${message}' is required`, allowEmpty: false }, + const parsedKey = k.replace("_", i.toString()); + const fhirKey = mapping[k].replace("_", i.toString()); + constraints[parsedKey] = { + presence: { message: `'${fhirKey}' is required`, allowEmpty: false }, }; }); } @@ -198,7 +199,10 @@ const generateGroupedConstraints = ( }; export type Type = pdtHealthCertV2.PdtTypes | pdtHealthCertV2.PdtTypes[]; -export const getConstraints = (type: Type, observationCount: number) => { +export const getRequiredConstraints = ( + type: Type, + observationCount: number +) => { const { PdtTypes } = pdtHealthCertV2; const supportedMultiType = [PdtTypes.Pcr, PdtTypes.Ser]; // For now, only ["PCR", "SER"] is supported @@ -210,9 +214,15 @@ export const getConstraints = (type: Type, observationCount: number) => { if (type === PdtTypes.Art) { // ART HealthCert return { - ...generateConstraints(commonConstraints), - ...generateGroupedConstraints(commonGroupedConstraints, observationCount), - ...generateGroupedConstraints(artGroupedConstraints, observationCount), + ...generateRequiredConstraints(commonFhirKeys), + ...generateRequiredGroupedConstraints( + commonGroupedFhirKeys, + observationCount + ), + ...generateRequiredGroupedConstraints( + artGroupedFhirKeys, + observationCount + ), }; } else if ( type === PdtTypes.Pcr || @@ -222,9 +232,15 @@ export const getConstraints = (type: Type, observationCount: number) => { // PCR, SER or PCR + SER HealthCert // Currently PCR and SER have the same validation constraint return { - ...generateConstraints(commonConstraints), - ...generateGroupedConstraints(commonGroupedConstraints, observationCount), - ...generateGroupedConstraints(pcrGroupedConstraints, observationCount), + ...generateRequiredConstraints(commonFhirKeys), + ...generateRequiredGroupedConstraints( + commonGroupedFhirKeys, + observationCount + ), + ...generateRequiredGroupedConstraints( + pcrGroupedFhirKeys, + observationCount + ), }; } else { throw new DocumentInvalidError( @@ -234,3 +250,29 @@ export const getConstraints = (type: Type, observationCount: number) => { ); } }; + +export const getRecognisedConstraints = ( + _type: Type, + observationCount: number +) => { + const constraints: Record = {}; + + /* Inclusion validation: Limit to 2 sets of Test Result Codes */ + const recognisedTestResultCodes = [ + ...Object.keys(euDccTestResultMapping), + ...Object.values(euDccTestResultMapping), + ]; + for (let i = 0; i < observationCount; i += 1) { + const k = `observations._.observation.result.code`; + const parsedKey = k.replace("_", i.toString()); + const fhirKey = commonGroupedFhirKeys[k].replace("_", i.toString()); + constraints[parsedKey] = { + inclusion: { + within: recognisedTestResultCodes, + message: `'${fhirKey}' is an unrecognised code - please use one of the following codes: ${recognisedTestResultCodes}`, + }, + }; + } + + return constraints; +}; diff --git a/src/models/fhir/index.ts b/src/models/fhir/index.ts index bed65862..bb73156e 100644 --- a/src/models/fhir/index.ts +++ b/src/models/fhir/index.ts @@ -1,4 +1,5 @@ import { parse } from "./parse"; import { hasRequiredFields } from "./required"; +import { hasRecognisedFields } from "./recognised"; -export default { parse, hasRequiredFields }; +export default { parse, hasRequiredFields, hasRecognisedFields }; diff --git a/src/models/fhir/recognised.test.ts b/src/models/fhir/recognised.test.ts new file mode 100644 index 00000000..23e0f3c2 --- /dev/null +++ b/src/models/fhir/recognised.test.ts @@ -0,0 +1,46 @@ +import { R4 } from "@ahryman40k/ts-fhir-types"; +import { pdtHealthCertV2 } from "@govtechsg/oa-schemata"; +import { DetailedCodedError } from "../../common/error"; +import fhirHelper from "./index"; +import exampleSingleTypeHealthCertWithNric from "../../../test/fixtures/v2/pdt_pcr_with_nric_unwrapped.json"; +import exampleMultiTypeHealthCertWithNric from "../../../test/fixtures/v2/pdt_pcr_ser_multi_result_unwrapped.json"; + +const { PdtTypes } = pdtHealthCertV2; + +describe("recognised fields", () => { + test("should throw error if single type HealthCert has an invalid test result code", () => { + let thrownError; + const parsedFhirBundle = fhirHelper.parse( + exampleSingleTypeHealthCertWithNric.fhirBundle as R4.IBundle + ); + parsedFhirBundle.observations[0].observation.result.code = "foobar"; + try { + fhirHelper.hasRecognisedFields(PdtTypes.Pcr, parsedFhirBundle); + } catch (e) { + if (e instanceof DetailedCodedError) { + thrownError = `${e.title}, ${e.messageBody}`; + } + } + expect(thrownError).toMatchInlineSnapshot( + `"Submitted HealthCert is invalid, the following fields in fhirBundle are not recognised: [\\"'0.Observation.valueCodeableConcept.coding[0].code' is an unrecognised code - please use one of the following codes: 10828004,260385009,260373001,260415000\\"]. For more info, refer to the mapping table here: https://github.com/Open-Attestation/schemata/pull/38"` + ); + }); + + test("should throw error if multi type HealthCert has an invalid test result code", () => { + let thrownError; + const parsedFhirBundle = fhirHelper.parse( + exampleMultiTypeHealthCertWithNric.fhirBundle as R4.IBundle + ); + parsedFhirBundle.observations[1].observation.result.code = "foobar"; + try { + fhirHelper.hasRecognisedFields(PdtTypes.Art, parsedFhirBundle); + } catch (e) { + if (e instanceof DetailedCodedError) { + thrownError = `${e.title}, ${e.messageBody}`; + } + } + expect(thrownError).toMatchInlineSnapshot( + `"Submitted HealthCert is invalid, the following fields in fhirBundle are not recognised: [\\"'1.Observation.valueCodeableConcept.coding[0].code' is an unrecognised code - please use one of the following codes: 10828004,260385009,260373001,260415000\\"]. For more info, refer to the mapping table here: https://github.com/Open-Attestation/schemata/pull/38"` + ); + }); +}); diff --git a/src/models/fhir/recognised.ts b/src/models/fhir/recognised.ts new file mode 100644 index 00000000..f8831841 --- /dev/null +++ b/src/models/fhir/recognised.ts @@ -0,0 +1,24 @@ +import validate from "validate.js"; +import { DocumentInvalidError } from "../../common/error"; +import { ParsedBundle } from "./types"; +import { getRecognisedConstraints, Type } from "./constraints"; + +export const hasRecognisedFields = (type: Type, parsedBundle: ParsedBundle) => { + const constraints = getRecognisedConstraints( + type, + parsedBundle.observations.length + ); + + const errors = validate(parsedBundle, constraints, { + fullMessages: false, + format: "flat", + }); + + if (errors) { + throw new DocumentInvalidError( + `the following fields in fhirBundle are not recognised: ${JSON.stringify( + errors + )}. For more info, refer to the mapping table here: https://github.com/Open-Attestation/schemata/pull/38` + ); + } +}; diff --git a/src/models/fhir/required.ts b/src/models/fhir/required.ts index e2ff1af6..2f49345c 100644 --- a/src/models/fhir/required.ts +++ b/src/models/fhir/required.ts @@ -1,10 +1,13 @@ import validate from "validate.js"; import { DocumentInvalidError } from "../../common/error"; import { ParsedBundle } from "./types"; -import { getConstraints, Type } from "./constraints"; +import { getRequiredConstraints, Type } from "./constraints"; export const hasRequiredFields = (type: Type, parsedBundle: ParsedBundle) => { - const constraints = getConstraints(type, parsedBundle.observations.length); + const constraints = getRequiredConstraints( + type, + parsedBundle.observations.length + ); const errors = validate(parsedBundle, constraints, { fullMessages: false, From c85d07fe145e95227489ecdf8accf29af7bf5fd5 Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Mon, 10 Jan 2022 11:54:46 +0800 Subject: [PATCH 09/20] chore: increase limit to 21KB for some leeway (#424) --- .../notarisePdt/validateInputs/validateDocument.test.ts | 4 ++-- .../notarisePdt/validateInputs/validateDocument.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts index a578498b..79926c60 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts @@ -365,7 +365,7 @@ describe("document logo validation", () => { }); }); - it("should throw on large base64 image string (>20KB)", async () => { + it("should throw on large base64 image string (>21KB)", async () => { const sampleDocumentV2InvalidLogo = { ...examplePcrHealthCertV2Wrapped }; sampleDocumentV2InvalidLogo.data.logo = `a60dd179-4029-44c5-8b77-296b10412836:string:${mockImage["33KB"]}`; @@ -379,7 +379,7 @@ describe("document logo validation", () => { } expect(thrownError).toStrictEqual({ title: `Submitted HealthCert is invalid`, - body: `Document "logo" in base64 image string is too large (33.95KB). Only <=20KB is supported.`, + body: `Document "logo" in base64 image string is too large (33.95KB). Only <=21KB is supported.`, }); }); diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts index 500d8e6e..b20b37bf 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts @@ -177,7 +177,7 @@ export const validateV2Document = async ( // Either base64 string or https URL in .png | .jpg | .jpeg format /(^data:image\/(png|jpg|jpeg);base64,.*$)|(^https:\/\/.*[.](png|jpg|jpeg)$)/; const VALID_MIME_PATTERN = /^image\/(png|jpeg)$/; - const MAX_LOGO_SIZE_IN_KILOBYTES = 20 * 1024; // 20KB + const MAX_LOGO_SIZE_IN_KILOBYTES = 21 * 1024; // 20KB (21KB) for some leeway if (!VALID_LOGO_PATTERN.test(data.logo)) { throw new DocumentInvalidError( From 54327df8152086a9bdb532e33b96ad8924db1e61 Mon Sep 17 00:00:00 2001 From: dchocoboo <86618807+dchocoboo@users.noreply.github.com> Date: Mon, 24 Jan 2022 16:54:09 +0800 Subject: [PATCH 10/20] feat: add custom domain (#447) * feat: add custom domain * added production Co-authored-by: David --- package-lock.json | 101 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + serverless.yml | 13 ++++++ 3 files changed, 115 insertions(+) diff --git a/package-lock.json b/package-lock.json index 72e9332d..f5d73ccc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6107,6 +6107,17 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -15053,6 +15064,96 @@ "integrity": "sha512-XIsZMCPiQvwpIpUQX5aVkNvYcTTm7qYSMEGgKnTEKebNG5skN+JQDDHMnujlq+R+76kaK4LiNyni5tr88qLBqA==", "dev": true }, + "serverless-domain-manager": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/serverless-domain-manager/-/serverless-domain-manager-5.4.1.tgz", + "integrity": "sha512-/40LMajeI/tcnMZWqrciewdajRQx6dn0FkBQw5BEE/o3ohGoP/pJyNJ98oRm9B37Cfri1T3BxgsDOOTCsJBGmg==", + "dev": true, + "requires": { + "aws-sdk": "^2.1061.0", + "chalk": "^4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aws-sdk": { + "version": "2.1062.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1062.0.tgz", + "integrity": "sha512-QIU8jwi7Uqyvw2HjsXXXUZv3V/6TinUzLewrdl2EdvonqZCXhwMgnZx2F9I2x62IKH1RqnINwFWdoK+OTgcAjA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, "serverless-http": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/serverless-http/-/serverless-http-2.7.0.tgz", diff --git a/package.json b/package.json index 599f81bb..fac3ed32 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "prettier": "^2.5.0", "raw-loader": "^4.0.2", "serverless-attach-permission-boundary": "^0.1.0", + "serverless-domain-manager": "^5.4.1", "serverless-offline": "^8.3.1", "serverless-s3-local": "^0.6.20", "serverless-webpack": "^5.6.0", diff --git a/serverless.yml b/serverless.yml index 28ae0c44..2cf5931b 100644 --- a/serverless.yml +++ b/serverless.yml @@ -174,6 +174,18 @@ custom: stg: "ssm" production: "ssm" other: "dotenv" + customDomainList: + production: "api-notarise-healthcerts.notarise.gov.sg" + stg: "api-notarise-healthcerts.stg.notarise.io" + other: "api-notarise-healthcerts-${self:provider.stage}.stg.notarise.io" + + customDomain: + domainName: ${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}, + basePath: "" + stage: STAGE + createRoute53Record: false + endpointType: "edge" + autoDomain: true envSource: ${self:custom.envSourceConfig.${self:provider.stage}, self:custom.envSourceConfig.other} KMS_ARN: ${env:KMS_ARN, "PLACEHOLDER_ARN"} ethereumConfig: @@ -271,6 +283,7 @@ plugins: - serverless-s3-local - serverless-offline - serverless-offline-ses + - serverless-domain-manager - serverless-attach-permission-boundary - serverless-plugin-aws-alerts - "@govtechsg/serverless-selective-functions" From 98cf99b896025b3578060e27e9f55073551c3880 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 24 Jan 2022 17:07:14 +0800 Subject: [PATCH 11/20] fix: auto domain --- serverless.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serverless.yml b/serverless.yml index 2cf5931b..0840f1ff 100644 --- a/serverless.yml +++ b/serverless.yml @@ -183,9 +183,9 @@ custom: domainName: ${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}, basePath: "" stage: STAGE - createRoute53Record: false + createRoute53Record: true endpointType: "edge" - autoDomain: true + autoDomain: false envSource: ${self:custom.envSourceConfig.${self:provider.stage}, self:custom.envSourceConfig.other} KMS_ARN: ${env:KMS_ARN, "PLACEHOLDER_ARN"} ethereumConfig: From a7c85862db71de25f45bddcbd625012d587ed64b Mon Sep 17 00:00:00 2001 From: David Date: Mon, 24 Jan 2022 18:39:46 +0800 Subject: [PATCH 12/20] fix : domainname --- serverless.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/serverless.yml b/serverless.yml index 0840f1ff..ac521053 100644 --- a/serverless.yml +++ b/serverless.yml @@ -178,9 +178,8 @@ custom: production: "api-notarise-healthcerts.notarise.gov.sg" stg: "api-notarise-healthcerts.stg.notarise.io" other: "api-notarise-healthcerts-${self:provider.stage}.stg.notarise.io" - customDomain: - domainName: ${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}, + domainName: "${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}" basePath: "" stage: STAGE createRoute53Record: true From dbbdc8a11ba07c199583b57dda71165c628a340a Mon Sep 17 00:00:00 2001 From: David Date: Mon, 24 Jan 2022 22:42:40 +0800 Subject: [PATCH 13/20] chore: fix production add custom domain --- serverless.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/serverless.yml b/serverless.yml index ac521053..aa58c7d6 100644 --- a/serverless.yml +++ b/serverless.yml @@ -175,16 +175,16 @@ custom: production: "ssm" other: "dotenv" customDomainList: - production: "api-notarise-healthcerts.notarise.gov.sg" + production: "api-notarise-healthcerts.aws.notarise.gov.sg" stg: "api-notarise-healthcerts.stg.notarise.io" other: "api-notarise-healthcerts-${self:provider.stage}.stg.notarise.io" customDomain: domainName: "${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}" basePath: "" stage: STAGE - createRoute53Record: true + createRoute53Record: false endpointType: "edge" - autoDomain: false + autoDomain: true envSource: ${self:custom.envSourceConfig.${self:provider.stage}, self:custom.envSourceConfig.other} KMS_ARN: ${env:KMS_ARN, "PLACEHOLDER_ARN"} ethereumConfig: From b786dad71c80d62063f5e77cfb53c7f70b1b44ae Mon Sep 17 00:00:00 2001 From: David Date: Tue, 25 Jan 2022 10:05:12 +0800 Subject: [PATCH 14/20] fix: custom domain in prod --- serverless.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serverless.yml b/serverless.yml index aa58c7d6..ef7dbe84 100644 --- a/serverless.yml +++ b/serverless.yml @@ -181,7 +181,7 @@ custom: customDomain: domainName: "${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}" basePath: "" - stage: STAGE + stage: ${self:provider.stage} createRoute53Record: false endpointType: "edge" autoDomain: true From 5f3c65a69c973a564750095af03aa19e2c4b68b5 Mon Sep 17 00:00:00 2001 From: Zaw Myo Latt Date: Tue, 25 Jan 2022 10:32:10 +0800 Subject: [PATCH 15/20] Fix: 180985706 Upgrade node 14 and update dependency packages (#446) * Fix: 180985706 Upgrade node 14 and update dependency packages * Update package-lock.json * add node cache in work flow --- .github/workflows/ci-master.yml | 17 +- .github/workflows/ci-pull-request.yml | 17 +- .nvmrc | 1 + package-lock.json | 5898 +++++++++++-------------- package.json | 60 +- serverless.yml | 2 +- 6 files changed, 2657 insertions(+), 3338 deletions(-) create mode 100644 .nvmrc diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index 44b924fc..7805cac3 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -16,10 +16,21 @@ jobs: name: Tests steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v2 with: - node-version: '12.x' - - run: npm install + node-version: '14.x' + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - run: npm ci - run: npm run lint - run: npm run typecheck - run: npm run test diff --git a/.github/workflows/ci-pull-request.yml b/.github/workflows/ci-pull-request.yml index 2a9291dc..00066708 100644 --- a/.github/workflows/ci-pull-request.yml +++ b/.github/workflows/ci-pull-request.yml @@ -24,10 +24,21 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v2 with: - node-version: '12.x' - - run: npm install + node-version: '14.x' + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - run: npm ci - run: npm run lint - run: npm run typecheck - run: npm run test diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..518633e1 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/fermium diff --git a/package-lock.json b/package-lock.json index f5d73ccc..fbf52595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,26 +43,26 @@ } }, "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", "dev": true }, "@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -71,92 +71,105 @@ "source-map": "^0.5.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } } } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dev": true, "requires": { - "@babel/types": "^7.16.0", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -169,123 +182,141 @@ "semver": "^6.1.2" } }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -298,12 +329,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { @@ -313,32 +344,32 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dev": true, "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/highlight": { @@ -353,187 +384,187 @@ } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", - "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -681,364 +712,374 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", - "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz", - "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.16.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -1053,44 +1094,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", + "@babel/types": "^7.16.8", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" } }, @@ -1108,61 +1149,126 @@ } }, "@babel/preset-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz", - "integrity": "sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" } }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + } } }, "@bcoe/v8-coverage": { @@ -1194,14 +1300,14 @@ "integrity": "sha512-sJpx3F5xcVV/9jNYJQtvimo4Vfld/nD3ph+ZWtQzZ03Zo8rJC7QKQTRcIGS13Rcz80DwFNthCWMrd58vpY4ZAQ==" }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -1210,12 +1316,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -1231,15 +1331,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1639,9 +1730,9 @@ } }, "@govtechsg/dnsprove": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@govtechsg/dnsprove/-/dnsprove-2.1.3.tgz", - "integrity": "sha512-eW/4MimGjhdS8mS5wM6RCezV+F9RBDuo5WD8DoLLXCipkMWYeWraCAhpKLd+Zl9NC2ROLXNDJSqg8/TUXt5/sg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@govtechsg/dnsprove/-/dnsprove-2.3.0.tgz", + "integrity": "sha512-d8nmtlk8xbM7tR/7sKJcz1cL5yRLDxLysbzO5JTohj2grRij4jKyHwcEyfVTX5up6zXv2ELFcsu0zyvRuVVXFA==", "requires": { "axios": "^0.21.1", "debug": "^4.3.1", @@ -1706,11 +1797,11 @@ "integrity": "sha512-DQYDuknPzpN/7CbWysR5feqtLjJWklhog1+AJbG1hVQ+1+9ggMdXltyWpbRcndB3W4taxGQ0bjhjmcx6bAIQFg==" }, "@govtechsg/oa-verify": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-7.7.0.tgz", - "integrity": "sha512-Ast+8gYBMkJQS6v/YuDgnc1ILjuSTJUjP7JAyMvP5UboH5OzeXl6nv0Hs8JS42It+YgEV8t1POWDH//6XhW6Qg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@govtechsg/oa-verify/-/oa-verify-7.8.0.tgz", + "integrity": "sha512-22UwdpExdsZTmXd8i9ZutftCJye/JY8tRqu3UAtWMXYY4IbFXCC9jalXRPuKRG8cxwfqR5eP8plWBAmJhv0teg==", "requires": { - "@govtechsg/dnsprove": "^2.1.3", + "@govtechsg/dnsprove": "^2.3.0", "@govtechsg/document-store": "^2.2.3", "@govtechsg/open-attestation": "^6.2.0", "@govtechsg/token-registry": "^2.5.3", @@ -1732,43 +1823,6 @@ "requires": { "follow-redirects": "^1.14.0" } - }, - "did-resolver": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-3.1.0.tgz", - "integrity": "sha512-uf3/4LfHoDn3Ek8bFegO72OemHMytBhAkud6CA1HlB5I0iVwrCpG4oh+DA6DXUuBdhrA0cY4cGz1D0VNDTlgnw==" - }, - "ethr-did-resolver": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-4.3.4.tgz", - "integrity": "sha512-xx9rjjBf8t2pSUyciDDXv99D66YIpKH29bufbEYyOds6IJSa5C7xeql4MSYz6zNtAAtvNoj9AYhg6FbBkeQmxg==", - "requires": { - "@ethersproject/abi": "^5.1.0", - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/basex": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/contracts": "^5.1.0", - "@ethersproject/providers": "^5.1.0", - "@ethersproject/transactions": "^5.1.0", - "did-resolver": "^3.1.0", - "ethr-did-registry": "^0.0.3", - "querystring": "^0.2.1" - } - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" - }, - "web-did-resolver": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.4.tgz", - "integrity": "sha512-PORpoA4P0I3m0cLJX2IIDZ0gMKgC1PjS8DuDeg9/JCdIlFiXrZCyTG1hxvw4a4vhDKr0sZKSZL1pQDXTgqLm8w==", - "requires": { - "cross-fetch": "^3.1.2", - "did-resolver": "^3.1.0" - } } } }, @@ -1821,18 +1875,18 @@ } }, "@govtechsg/serverless-selective-functions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@govtechsg/serverless-selective-functions/-/serverless-selective-functions-0.1.1.tgz", - "integrity": "sha512-5pzMLm6mgHNHqdsvBV0q1DYNEzvFENCVCgdvT2NExmxmkVdorIk8bCjEH+qA/n03p6s9/NrZXJJzA2S0NkoiDw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@govtechsg/serverless-selective-functions/-/serverless-selective-functions-0.1.2.tgz", + "integrity": "sha512-cSsyKiF0Ao9oCbu0uJ7xKzfHgNUW32890aI3BsLUfWDMC6E4vnLdvBW5zuttXYJ7bBYboVGxhRPZoAc573aV0Q==", "dev": true, "requires": { "serverless": "^2.15.0" } }, "@govtechsg/token-registry": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@govtechsg/token-registry/-/token-registry-2.5.3.tgz", - "integrity": "sha512-0VIeANA2XpaMNBLBAImwXf3SMV9wQcQeU4HxRgPzWaG4X/MpS2Msxv6YyTwk++p+j57s3PNoUQC5JiIAaY7xZw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@govtechsg/token-registry/-/token-registry-2.6.1.tgz", + "integrity": "sha512-QnAIlYeGD4zHtYPiZ46SIe6hFc3HyMKvyBJIdlsFxHscMR4f8AENIyUS2AKhqJibCcN2beNJy/bPWlCAtHoT7w==" }, "@hapi/accept": { "version": "5.0.2", @@ -2159,12 +2213,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } @@ -2204,6 +2258,16 @@ "path-exists": "^4.0.0" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2243,15 +2307,15 @@ "dev": true }, "@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz", + "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==", "dev": true, "requires": { "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", + "jest-message-util": "^27.4.6", "jest-util": "^27.4.2", "slash": "^3.0.0" }, @@ -2308,15 +2372,15 @@ } }, "@jest/core": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.2.tgz", - "integrity": "sha512-0mPM61tDbu8yc9CMKH9bvV+g+17VUpdWQtU1x6P1gk4AKj8iywWi8zBmEIl7pTGjUtYA92CNc/LlBfKCioBOow==", + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz", + "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==", "dev": true, "requires": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/console": "^27.4.6", + "@jest/reporters": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2325,39 +2389,24 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.2", - "jest-haste-map": "^27.4.2", - "jest-message-util": "^27.4.2", + "jest-config": "^27.4.7", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.6", + "jest-resolve-dependencies": "^27.4.6", + "jest-runner": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", + "jest-validate": "^27.4.6", + "jest-watcher": "^27.4.6", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2415,62 +2464,56 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true } } }, "@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz", + "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==", "dev": true, "requires": { - "@jest/fake-timers": "^27.4.2", + "@jest/fake-timers": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^27.4.2" + "jest-mock": "^27.4.6" } }, "@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz", + "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==", "dev": true, "requires": { "@jest/types": "^27.4.2", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", "jest-util": "^27.4.2" } }, "@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz", + "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.6", "@jest/types": "^27.4.2", - "expect": "^27.4.2" + "expect": "^27.4.6" } }, "@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz", + "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/console": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -2479,14 +2522,14 @@ "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.4.6", + "jest-resolve": "^27.4.6", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.6", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -2534,6 +2577,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2554,50 +2603,58 @@ "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz", + "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==", "dev": true, "requires": { - "@jest/console": "^27.4.2", + "@jest/console": "^27.4.6", "@jest/types": "^27.4.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz", + "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==", "dev": true, "requires": { - "@jest/test-result": "^27.4.2", + "@jest/test-result": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" + "jest-haste-map": "^27.4.6", + "jest-runtime": "^27.4.6" } }, "@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz", + "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==", "dev": true, "requires": { "@babel/core": "^7.1.0", "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", + "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.6", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", - "pirates": "^4.0.1", + "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" @@ -2643,6 +2700,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2753,59 +2816,59 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" }, "@middy/core": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@middy/core/-/core-2.5.3.tgz", - "integrity": "sha512-hCXlRglDu48sl03IjDGjcJwfwElIPAf0fwBu08kqE80qpnouZ1hGH1lZbkbJjAhz6DkSR+79YArUQKUYaM2k1g==" + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@middy/core/-/core-2.5.6.tgz", + "integrity": "sha512-uOKeXqqKK8NjOFXJCtaQl3BF9zTd6R2N/1nwvAJ3MGfXSBBiBoRxXE+NhwHd2DFzf0ruzk3lHel2XMOQu7PXIQ==" }, "@middy/http-error-handler": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@middy/http-error-handler/-/http-error-handler-2.5.3.tgz", - "integrity": "sha512-wOCnTdX0wtGtu3n3+obEF2YaYTMOvu5NDz/BY4f0H35tQEmLnbCq4D2418IdOzV1CvdYvf1v3tPSe2BCzpghCA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@middy/http-error-handler/-/http-error-handler-2.5.6.tgz", + "integrity": "sha512-e8B2nwZnkaL38/KFWFLZurqRUmp08sYrJYJQ7zDr47Yp3tidsyIbkTrRkoBjsDSndhw1XPdQWAFV5hVv7KlAxA==", "requires": { - "@middy/util": "^2.5.3" + "@middy/util": "^2.5.6" } }, "@middy/http-json-body-parser": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@middy/http-json-body-parser/-/http-json-body-parser-2.5.3.tgz", - "integrity": "sha512-8vUW40srhgwkgup9HTGv0lUOUUbTcK8XPrS0zjL3jC0Ew3AgU1FbpfyipTxgcaWr+cZlgmq1VvXY1G60R+7dyQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@middy/http-json-body-parser/-/http-json-body-parser-2.5.6.tgz", + "integrity": "sha512-CeHqXBi1p78RIAh0bNgWQZJrSRBeARpvxNerYNh4Zxudg5VCk/yAmWT9Gane3SL4EOcn1Vzl5SZyH8pP1WFvFg==", "requires": { - "@middy/util": "^2.5.3" + "@middy/util": "^2.5.6" } }, "@middy/ssm": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@middy/ssm/-/ssm-2.5.3.tgz", - "integrity": "sha512-PFKKkE5FBP3a++42geAf7YJvq1/AjywxiyEOOO6aWxjQrDFvdsJ9Xh52fqSjCu2RfPsmExB6fIWsZg1JpjOqig==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@middy/ssm/-/ssm-2.5.6.tgz", + "integrity": "sha512-MglG68oQqK+PM+0bwP5cLbRxTbdY0kDDt45jOSV7yMWzVXJhJT9Li2tL344t31eWKm1saTW07i6Wj8ABo3HqSg==", "requires": { - "@middy/util": "^2.5.3" + "@middy/util": "^2.5.6" } }, "@middy/util": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@middy/util/-/util-2.5.3.tgz", - "integrity": "sha512-tKB4Nw1tFYyt7A6OdY5ohuh/73+/uQQVv6dw+31uqdHZ4UNzqeIN+scT3QAC8Rqky6M8PrREJ+MrkqREykE/Tg==" + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@middy/util/-/util-2.5.6.tgz", + "integrity": "sha512-DMsDKs8pUG/heOmDm3n9mpAZrDqXRrVY+Sc8du5eLr+9luqOOSDZIfgyUooW6yDvX+HQrGiElY+Wn46vrqARmA==" }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -2945,9 +3008,9 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@serverless/cli": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.5.3.tgz", - "integrity": "sha512-ZJ0Y7CsYoE/i45XkIMl/XBZO4KIlt0XH1qwxxNE2/84bZlih5cgRV6MZ+rKt7GlrD0iDAgQGyGv5dpyt+SGhKw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.6.0.tgz", + "integrity": "sha512-1Muw/KhS4sZ6+ZrXBdmVY9zAwZh03lF7v1DKtaZ0cmxjqQBwPLoO40rOGXlxR97pyufe2NS6rD/p+ri8NGqeXg==", "requires": { "@serverless/core": "^1.1.2", "@serverless/template": "^1.1.3", @@ -2975,32 +3038,11 @@ "write-file-atomic": "^2.4.3" } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "dotenv": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3009,11 +3051,6 @@ "ansi-regex": "^5.0.1" } }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -3040,264 +3077,6 @@ "shortid": "^2.2.14" } }, - "@serverless/components": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@serverless/components/-/components-3.18.1.tgz", - "integrity": "sha512-36XSYHjPkSEiSwWkl/xwWgYXa32Fk1CAbHvtWGheCtKV4+I3Yxzhe7FbgR84O0FeGQ/qM3QI8i5vtPUxeDeB9g==", - "requires": { - "@serverless/platform-client": "^4.2.2", - "@serverless/platform-client-china": "^2.2.0", - "@serverless/utils": "^4.0.0", - "adm-zip": "^0.5.4", - "ansi-escapes": "^4.3.1", - "chalk": "^4.1.0", - "child-process-ext": "^2.1.1", - "chokidar": "^3.5.1", - "ci-info": "^3.2.0", - "dayjs": "^1.10.4", - "dotenv": "^8.2.0", - "fastest-levenshtein": "^1.0.12", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "got": "^11.8.2", - "graphlib": "^2.1.8", - "https-proxy-agent": "^5.0.0", - "inquirer-autocomplete-prompt": "^1.3.0", - "js-yaml": "^3.14.1", - "memoizee": "^0.4.14", - "minimist": "^1.2.5", - "open": "^7.3.1", - "prettyoutput": "^1.2.0", - "ramda": "^0.27.1", - "semver": "^7.3.4", - "strip-ansi": "^6.0.0", - "tencent-serverless-http": "^1.3.1", - "traverse": "^0.6.6", - "uuid": "^8.3.2" - }, - "dependencies": { - "@serverless/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-cl5uPaGg72z0sCUpF0zsOhwYYUV72Gxc1FwFfxltO8hSvMeFDvwD7JrNE4kHcIcKRjwPGbSH0fdVPUpErZ8Mog==", - "requires": { - "chalk": "^4.1.0", - "ci-info": "^3.1.1", - "inquirer": "^7.3.3", - "js-yaml": "^4.1.0", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "ncjsm": "^4.1.0", - "type": "^2.5.0", - "uuid": "^8.3.2", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, "@serverless/core": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@serverless/core/-/core-1.1.2.tgz", @@ -3320,24 +3099,28 @@ "universalify": "^0.1.0" } }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, "@serverless/dashboard-plugin": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-5.5.1.tgz", - "integrity": "sha512-gXn17AOyY3fxSq2nIFNnU4tZorplh2yVb0zI9A+rTeHlQ3HgIJa7xs/rR2hLEcW4vT26zX8dqwdJOAml/9kZyw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-5.5.4.tgz", + "integrity": "sha512-qqZnT/RXhBcWXwYnpF+GMeNvSUi6mnyIqsAHj8+f7jJ7N9qa5Qrb14+dUh78sdgRBG5Peub3m3Mlx1n5V9yHDw==", "requires": { "@serverless/event-mocks": "^1.1.1", "@serverless/platform-client": "^4.3.0", - "@serverless/utils": "^5.20.0", + "@serverless/utils": "^5.20.3", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "cli-color": "^2.0.1", "flat": "^5.0.2", "fs-extra": "^9.1.0", @@ -3347,10 +3130,10 @@ "memoizee": "^0.4.15", "ncjsm": "^4.2.0", "node-dir": "^0.1.17", - "node-fetch": "^2.6.6", + "node-fetch": "^2.6.7", "open": "^7.4.2", "semver": "^7.3.5", - "simple-git": "^2.47.0", + "simple-git": "^2.48.0", "uuid": "^8.3.2", "yamljs": "^0.3.0" }, @@ -3363,11 +3146,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3377,6 +3155,21 @@ "supports-color": "^7.1.0" } }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3395,26 +3188,10 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } @@ -3434,30 +3211,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -3500,42 +3253,26 @@ "follow-redirects": "^1.14.0" } }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { - "is-glob": "^4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" - }, "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==" } } }, "@serverless/platform-client-china": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-2.3.2.tgz", - "integrity": "sha512-ZeB64IKuvFnuwwFHAJHEl0ZsJ6QPgGPUjfa8KEzIIn2kZ4lXpESJ+YKvo5PFn4jS+eZajbGrQZ4wCWdEFcuS3w==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-2.3.4.tgz", + "integrity": "sha512-JRrI3gnUZ0e6on8hHtVr4CwnhrU0jXd3iVfJknEE9tLS//syV77h7PhalZ79SemrboykRoSqhdu9qHf/wiFJ3A==", "requires": { "@serverless/utils-china": "^1.1.4", "adm-zip": "^0.5.1", @@ -3566,6 +3303,15 @@ "version": "8.6.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, @@ -3579,25 +3325,18 @@ "graphlib": "^2.1.8", "ramda": "^0.26.1", "traverse": "^0.6.6" - }, - "dependencies": { - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" - } } }, "@serverless/utils": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-5.20.1.tgz", - "integrity": "sha512-X2CD685Q4NHuX4Si3SVZU4iaMDgD4+d78sd+nTyxV+lwFHG9FFUSJftwclYzoqZshw6QoYd/mMnUotWnlsiLWA==", + "version": "5.20.3", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-5.20.3.tgz", + "integrity": "sha512-MG3DQJdto+LaeVY9gh/z0xloAfT0h1Y3Pa4/yYcKe8Dy5HYtSujuav0MvTOH18+s2outjKKJDxTh6tZuyNqFDQ==", "requires": { "archive-type": "^4.0.0", "chalk": "^4.1.2", - "ci-info": "^3.2.0", - "cli-progress-footer": "^2.1.1", - "content-disposition": "^0.5.3", + "ci-info": "^3.3.0", + "cli-progress-footer": "^2.3.0", + "content-disposition": "^0.5.4", "d": "^1.0.1", "decompress": "^4.2.1", "event-emitter": "^0.3.5", @@ -3606,13 +3345,13 @@ "file-type": "^16.5.3", "filenamify": "^4.3.0", "get-stream": "^6.0.1", - "got": "^11.8.2", + "got": "^11.8.3", "inquirer": "^7.3.3", "js-yaml": "^4.1.0", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "log": "^6.3.1", - "log-node": "^8.0.2", + "log-node": "^8.0.3", "make-dir": "^3.1.0", "memoizee": "^0.4.15", "ncjsm": "^4.2.0", @@ -3624,19 +3363,6 @@ "write-file-atomic": "^3.0.3" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3645,11 +3371,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3665,155 +3386,33 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" - } - } - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-type": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", - "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", - "requires": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + } + } } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3821,18 +3420,13 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, "@serverless/utils-china": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-1.1.4.tgz", - "integrity": "sha512-8s73M1k+mST7Z/Rp8wgmZh50tjpwX+fqsbYYRuFGgyuWTvgqAlUflDOWAeQuDx4pEndWEqjbG09ZrZNqlHuZqQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-1.1.5.tgz", + "integrity": "sha512-pykhxsI+TlEbZzDUq5dkJPVWceNpaLU2ILEMsjUwyqGPsSE/g8Lrf7AhXseKtNK/7le3lduNnPacmY4Jb+GT+g==", "requires": { "@tencent-sdk/capi": "^1.1.8", "dijkstrajs": "^1.0.1", @@ -3930,14 +3524,14 @@ "optional": true }, "@types/aws-lambda": { - "version": "8.10.85", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.85.tgz", - "integrity": "sha512-cMRXVxb+NMb6EekKel1fPBfz2ZqE5cGhIS14G7FVUM4Bqilx0lHKnZbsDLWLSeckDpkvlp5six2F7UWyEEJSoQ==" + "version": "8.10.91", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.91.tgz", + "integrity": "sha512-vUmJGUqhwZTcrSLE3i9nNJp1gYa83KNv7AX/K30DJKWE31TWw1swdJopOyccttdBqhG3e8SIAqw3q+5ZYxfz0g==" }, "@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -3948,9 +3542,9 @@ } }, "@types/babel__generator": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", - "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -4029,9 +3623,9 @@ } }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", "dev": true, "requires": { "@types/estree": "*", @@ -4039,9 +3633,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dev": true, "requires": { "@types/eslint": "*", @@ -4075,15 +3669,15 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz", + "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==", "dev": true }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { @@ -4105,26 +3699,15 @@ } }, "@types/jest": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", - "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz", + "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==", "dev": true, "requires": { "jest-diff": "^27.0.0", "pretty-format": "^27.0.0" } }, - "@types/jsdom": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", - "integrity": "sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/parse5": "*", - "@types/tough-cookie": "*" - } - }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -4145,9 +3728,9 @@ } }, "@types/lodash": { - "version": "4.14.177", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", - "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==" + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" }, "@types/long": { "version": "4.0.1", @@ -4155,9 +3738,9 @@ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/ms": { @@ -4177,48 +3760,30 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", + "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==", "dev": true }, "@types/qrcode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.4.1.tgz", - "integrity": "sha512-vxMyr7JM7tYPxu8vUE83NiosWX5DZieCyYeJRoOIg0pAkyofCBzknJ2ycUZkPGDFis2RS8GN/BeJLnRnAPxeCA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.4.2.tgz", + "integrity": "sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/request": { - "version": "2.48.7", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.7.tgz", - "integrity": "sha512-GWP9AZW7foLd4YQxyFZDBepl0lPsWLMEXDZUjQ/c1gqVPDPECrRZyEzuhJdnPWioFCq3Tv0qoGpMD6U+ygd4ZA==", + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", "requires": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" - }, - "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } } }, "@types/request-promise-native": { @@ -4279,9 +3844,9 @@ "integrity": "sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ==" }, "@types/uuid": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.3.tgz", - "integrity": "sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "@types/yargs": { @@ -4300,13 +3865,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", - "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.5.0", - "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -4315,15 +3881,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4332,65 +3889,65 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, "@typescript-eslint/experimental-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", - "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", + "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/utils": "5.10.0" } }, "@typescript-eslint/parser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", - "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.5.0", - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/typescript-estree": "5.5.0", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", - "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0" + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", - "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", - "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", - "@typescript-eslint/visitor-keys": "5.5.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4398,15 +3955,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4415,118 +3963,116 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, + "@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", - "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/types": "5.10.0", "eslint-visitor-keys": "^3.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - } } }, "@vue/compiler-core": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.3.tgz", - "integrity": "sha512-I58MDtVa8AYEIa3waLO6/89JdmgpkDAEcL3Vrmlsbnt07KZ5sIGLqaXjzGrOT57j9s8ty0WTYlLQq2rWUVYGCg==", + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.29.tgz", + "integrity": "sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw==", "dev": true, "requires": { - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", - "@vue/shared": "3.1.3", - "estree-walker": "^2.0.1", + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.29", + "estree-walker": "^2.0.2", "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "@vue/compiler-dom": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.1.3.tgz", - "integrity": "sha512-BunLXKP+UvY1XJ0L6M7KD/De0XP+kOlIxFg3OfXtVQZcLLgnLcTgSK3t/ylvIpYJOadGaHhb+BfCK/hdqOVAyw==", + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.29.tgz", + "integrity": "sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ==", "dev": true, "requires": { - "@vue/compiler-core": "3.1.3", - "@vue/shared": "3.1.3" + "@vue/compiler-core": "3.2.29", + "@vue/shared": "3.2.29" } }, "@vue/compiler-sfc": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.1.3.tgz", - "integrity": "sha512-WpQ0oHMT5Aeb92UBnYCOxfHwdOGFZJ+BUyFiu2rG6TTDuw+aPNHCsFxvi55eG+2P7uiqRFK03lc0mGh3v8OVmw==", - "dev": true, - "requires": { - "@babel/parser": "^7.13.9", - "@babel/types": "^7.13.0", - "@types/estree": "^0.0.48", - "@vue/compiler-core": "3.1.3", - "@vue/compiler-dom": "3.1.3", - "@vue/compiler-ssr": "3.1.3", - "@vue/shared": "3.1.3", - "consolidate": "^0.16.0", - "estree-walker": "^2.0.1", - "hash-sum": "^2.0.0", - "lru-cache": "^5.1.1", + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.29.tgz", + "integrity": "sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.29", + "@vue/compiler-dom": "3.2.29", + "@vue/compiler-ssr": "3.2.29", + "@vue/reactivity-transform": "3.2.29", + "@vue/shared": "3.2.29", + "estree-walker": "^2.0.2", "magic-string": "^0.25.7", - "merge-source-map": "^1.1.0", "postcss": "^8.1.10", - "postcss-modules": "^4.0.0", - "postcss-selector-parser": "^6.0.4", "source-map": "^0.6.1" }, "dependencies": { - "@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "@vue/compiler-ssr": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.1.3.tgz", - "integrity": "sha512-dAktYBae3h9QWJoSKsrfrcZEjh4hwphDMWwj+ZwIkHBhEpyjdFLJks8MpxRjGMZzqz5vNyteVXkbOAaoiWPwwA==", + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.29.tgz", + "integrity": "sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.29", + "@vue/shared": "3.2.29" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.29.tgz", + "integrity": "sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA==", "dev": true, "requires": { - "@vue/compiler-dom": "3.1.3", - "@vue/shared": "3.1.3" + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.29", + "@vue/shared": "3.2.29", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" } }, "@vue/shared": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.3.tgz", - "integrity": "sha512-uGBX4bZVFvgranxzpH3q1gGmICUjEUnNrMIBFeZRw8hBfCPhT+VnuY8+mG2l/yEyY73J9e6d36CtbFUqDXa12w==", + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.29.tgz", + "integrity": "sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw==", "dev": true }, "@webassemblyjs/ast": { @@ -4732,9 +4278,9 @@ } }, "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, "acorn-jsx": { @@ -4839,21 +4385,25 @@ } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -5017,10 +4567,16 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -5059,14 +4615,14 @@ "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" }, "aws-sdk": { - "version": "2.1040.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1040.0.tgz", - "integrity": "sha512-xGKYoVNFA46gphJZ5jRykxT96L3YNMO/STmjdW/cl36n61ENfTvH61OO5v2ReoAoReddAV7F0WMXfkzwjYc5Jw==", + "version": "2.1062.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1062.0.tgz", + "integrity": "sha512-QIU8jwi7Uqyvw2HjsXXXUZv3V/6TinUzLewrdl2EdvonqZCXhwMgnZx2F9I2x62IKH1RqnINwFWdoK+OTgcAjA==", "requires": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", - "jmespath": "0.15.0", + "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", @@ -5084,6 +4640,11 @@ "isarray": "^1.0.0" } }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -5126,14 +4687,6 @@ "supports-color": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5175,9 +4728,9 @@ } }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { "version": "0.24.0", @@ -5219,14 +4772,6 @@ "supports-color": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5286,15 +4831,15 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -5317,11 +4862,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -5335,15 +4875,15 @@ } }, "babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz", + "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==", "dev": true, "requires": { - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", + "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^27.4.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -5419,15 +4959,15 @@ } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, @@ -5444,33 +4984,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.20.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "babel-preset-current-node-syntax": { @@ -5517,11 +5057,6 @@ "source-map-support": "^0.4.15" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -5541,11 +5076,6 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5593,6 +5123,11 @@ "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5686,8 +5221,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "resolved": "", "dev": true }, "ansi-styles": { @@ -5889,20 +5423,20 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "dependencies": { "debug": { @@ -5913,27 +5447,15 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" } } }, @@ -5954,8 +5476,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "ansi-styles": { "version": "4.3.0", @@ -6077,13 +5598,13 @@ "dev": true }, "browserslist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", - "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001280", - "electron-to-chromium": "^1.3.896", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -6108,14 +5629,12 @@ } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-alloc": { @@ -6180,9 +5699,9 @@ } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" }, "cache-content-type": { "version": "1.0.1", @@ -6260,9 +5779,9 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, "caniuse-lite": { - "version": "1.0.30001283", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", - "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", "dev": true }, "canonicalize": { @@ -6407,17 +5926,17 @@ } }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-progress-footer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.2.0.tgz", - "integrity": "sha512-bMlSuLbztsIefm04dOOYcyXOhB6ZhJi8CAqzXtTmwbZlei+BLWDOgzYApl16DJdKucmiOb/pmqmilO3YfobGDQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.0.tgz", + "integrity": "sha512-xJl+jqvdsE0Gjh5tKoLzZrQS4nPHC+yzeitgq2faAZiHl+/Peuwzoy5Sed6EBkm8JNrPk7W4U3YNVO/uxoqOFg==", "requires": { "cli-color": "^2.0.1", "d": "^1.0.1", @@ -6426,50 +5945,33 @@ "process-utils": "^4.0.0", "timers-ext": "^0.1.7", "type": "^2.5.0" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - } } }, "cli-sprintf-format": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-sprintf-format/-/cli-sprintf-format-1.1.0.tgz", - "integrity": "sha512-t3LcCdPvrypZovStadWdRS4a186gsq9aoHJYTIer55VY20YdVjGVHDV4uPWcWCXTw1tPjfwlRGE7zKMWJ663Sw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-sprintf-format/-/cli-sprintf-format-1.1.1.tgz", + "integrity": "sha512-BbEjY9BEdA6wagVwTqPvmAwGB24U93rQPBFZUT8lNCDxXzre5LFHQUTJc70czjgUomVg8u8R5kW8oY9DYRFNeg==", "requires": { - "cli-color": "^1.3", - "es5-ext": "^0.10.46", - "sprintf-kit": "2", - "supports-color": "^5.5" + "cli-color": "^2.0.1", + "es5-ext": "^0.10.53", + "sprintf-kit": "^2.0.1", + "supports-color": "^6.1.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" + "has-flag": "^3.0.0" } } } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "cliui": { "version": "5.0.0", @@ -6542,12 +6044,12 @@ "dev": true }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -6564,20 +6066,14 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", @@ -6589,11 +6085,11 @@ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -6711,27 +6207,18 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "optional": true }, - "consolidate": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz", - "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==", - "dev": true, - "requires": { - "bluebird": "^3.7.2" - } - }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -6756,9 +6243,9 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", @@ -6766,9 +6253,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" }, "cookies": { "version": "0.8.0", @@ -6794,12 +6281,12 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.2.tgz", - "integrity": "sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "dev": true, "requires": { - "browserslist": "^4.18.1", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { @@ -6817,9 +6304,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -6929,11 +6416,11 @@ } }, "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "cross-spawn": { @@ -6979,12 +6466,6 @@ } } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -7047,6 +6528,34 @@ "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } } }, "date-fns": { @@ -7065,18 +6574,11 @@ "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "decamelize": { @@ -7105,10 +6607,20 @@ "strip-dirs": "^2.0.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } } } }, @@ -7220,11 +6732,6 @@ "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -7299,12 +6806,12 @@ "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depcheck": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.2.tgz", - "integrity": "sha512-oYaBLRbF5NMkYxc5rltnqtuPAn25Lx5xPBIJXy5oUVBgrEDDtotCoYUfFH8lvcmSWzgk1Ts9H+f4Rk0oWL51LQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.3.tgz", + "integrity": "sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==", "dev": true, "requires": { - "@babel/parser": "^7.12.5", + "@babel/parser": "7.16.4", "@babel/traverse": "^7.12.5", "@vue/compiler-sfc": "^3.0.5", "camelcase": "^6.2.0", @@ -7329,10 +6836,10 @@ "yargs": "^16.1.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", "dev": true }, "ansi-styles": { @@ -7382,13 +6889,14 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "yallist": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "semver": { @@ -7401,23 +6909,23 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "wrap-ansi": { @@ -7437,12 +6945,6 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -7502,6 +7004,16 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diacritics": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", @@ -7526,6 +7038,11 @@ "streamsearch": "0.1.2" } }, + "did-resolver": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-3.1.5.tgz", + "integrity": "sha512-/4lM1vK5osnWVZ2oN9QhlWV5xOwssuLSL1MvueBc8LQWotbD5kM9XQMe7h4GydYpbh3JaWMFkOWwc9jvSZ+qgg==" + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -7663,9 +7180,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.7.tgz", - "integrity": "sha512-UPy2MsQw1OdcbxR7fvwWZH/rXcv+V26+uvQVHx0fGa1kqRfydtfOw+NMGAvZJ63hyaH4aEBxbhSEtqbpliSNWA==", + "version": "1.4.51", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz", + "integrity": "sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ==", "dev": true }, "elliptic": { @@ -7752,6 +7269,11 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -7785,15 +7307,6 @@ } } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "env-variable": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", @@ -7896,6 +7409,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-promisify": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", + "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==" + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -8010,6 +7528,13 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -8022,24 +7547,23 @@ } }, "eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8047,7 +7571,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -8058,21 +7582,13 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8082,12 +7598,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8129,12 +7639,6 @@ "estraverse": "^5.2.0" } }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -8157,9 +7661,9 @@ } }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8171,39 +7675,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8227,12 +7698,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -8272,24 +7737,17 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", "dev": true, "requires": { "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" + "find-up": "^2.1.0" }, "dependencies": { "debug": { @@ -8320,12 +7778,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -8353,9 +7805,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -8363,14 +7815,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", "is-core-module": "^2.8.0", "is-glob": "^4.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.5", "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "tsconfig-paths": "^3.12.0" }, "dependencies": { "debug": { @@ -8390,13 +7842,19 @@ "requires": { "esutils": "^2.0.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "eslint-plugin-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.3.0.tgz", - "integrity": "sha512-79WQtuBsTN1S8Y9+7euBYwxIOia/k7ykkl9OCBHL3xuww5ecursHy/D8GCIlvzHVWv85gOkS5Kv6Sh7RxOgK1Q==", + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^5.0.0" @@ -8428,12 +7886,20 @@ "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, "esm": { @@ -8451,20 +7917,20 @@ } }, "espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" }, "dependencies": { - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true } } @@ -8484,9 +7950,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8501,17 +7967,20 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "essentials": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", - "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", + "integrity": "sha512-kP/j7Iw7KeNE8b/o7+tr9uX2s1wegElGOoGZ2Xm35qBr4BbbEcH3/bxR2nfH9l9JANCq9AUrvKw+gRuHtZp0HQ==", + "requires": { + "uni-global": "^1.0.0" + } }, "estraverse": { "version": "4.3.0", @@ -8577,6 +8046,24 @@ "resolved": "https://registry.npmjs.org/ethr-did-registry/-/ethr-did-registry-0.0.3.tgz", "integrity": "sha512-4BPvMGkxAK9vTduCq6D5b8ZqjteD2cvDIPPriXP6nnmPhWKFSxypo+AFvyQ0omJGa0cGTR+dkdI/8jiF7U/qaw==" }, + "ethr-did-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-4.3.5.tgz", + "integrity": "sha512-BQO7PQwuqqczK+4AWQhys/sgegDVIFr6+lSoSYXlIbG0oRH0l7PkSuf7VEFKclEJ3JlJ1t9kjDIdj7Ba7euTJg==", + "requires": { + "@ethersproject/abi": "^5.1.0", + "@ethersproject/abstract-signer": "^5.1.0", + "@ethersproject/address": "^5.1.0", + "@ethersproject/basex": "^5.1.0", + "@ethersproject/bignumber": "^5.1.0", + "@ethersproject/contracts": "^5.1.0", + "@ethersproject/providers": "^5.1.0", + "@ethersproject/transactions": "^5.1.0", + "did-resolver": "^3.1.0", + "ethr-did-registry": "^0.0.3", + "querystring": "^0.2.1" + } + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -8655,38 +8142,28 @@ "optional": true }, "expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", + "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", "dev": true, "requires": { "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6" } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -8700,13 +8177,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -8721,15 +8198,20 @@ "ms": "2.0.0" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -8790,16 +8272,15 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -8814,17 +8295,18 @@ "dev": true }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true }, "fast-xml-parser": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.20.0.tgz", - "integrity": "sha512-cMQwDJYVDjMPU56DviszewgMKuNzuf4NQSBuDf9RgZ6FKm5QEMxW05Za8lvnuL6moxoeZVUWBlL733WmovvV6g==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", "dev": true, "requires": { - "strnum": "^1.0.3" + "strnum": "^1.0.4" } }, "fastest-levenshtein": { @@ -8833,9 +8315,9 @@ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "requires": { "reusify": "^1.0.4" } @@ -8858,9 +8340,9 @@ } }, "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, "fhir": { "version": "4.11.1", @@ -8919,9 +8401,9 @@ } }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -9003,9 +8485,9 @@ } }, "filesize": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz", - "integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg==" + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { "version": "7.0.1", @@ -9036,6 +8518,11 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -9080,15 +8567,15 @@ } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "forever-agent": { "version": "0.6.1", @@ -9205,9 +8692,9 @@ } }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -9215,9 +8702,9 @@ } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" }, "forwarded": { "version": "0.2.0", @@ -9339,26 +8826,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "optional": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -9370,15 +8837,6 @@ } } }, - "generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", - "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -9492,15 +8950,15 @@ "dev": true }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -9523,9 +8981,9 @@ }, "dependencies": { "@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.3.0.tgz", + "integrity": "sha512-wwOvh0eO3PiTEivGJWiZ+b946SlMSb4pe+y+Ur/4S87cwo09pYi+FWHHnbrM3W9W7cBYKDqQXcrFYjYUCOJUEQ==" }, "@szmarczak/http-timer": { "version": "4.0.6", @@ -9576,9 +9034,9 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", + "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", "requires": { "json-buffer": "3.0.1" } @@ -9627,11 +9085,11 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -9644,6 +9102,21 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -9710,12 +9183,6 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true - }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -9730,6 +9197,12 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "hi-base32": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", @@ -9867,33 +9340,27 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -9911,58 +9378,13 @@ "dev": true }, "import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } } }, "imurmurhash": { @@ -9995,23 +9417,96 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "inquirer-autocomplete-prompt": { @@ -10026,14 +9521,6 @@ "rxjs": "^6.6.2" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10064,14 +9551,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10084,11 +9563,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, @@ -10193,9 +9667,9 @@ } }, "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -10208,9 +9682,9 @@ "dev": true }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extglob": { "version": "2.1.1", @@ -10414,178 +9888,35 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.0.tgz", - "integrity": "sha512-rgeP8yMlXeH4mfd9K/sQXZv1lvcS7xo379zntcotPDdMwkcGYwMxGHGZYo0/+YW5B/nor2YGKz2BH5ume405ow==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "java-invoke-local": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/java-invoke-local/-/java-invoke-local-0.0.6.tgz", - "integrity": "sha512-gZmQKe1QrfkkMjCn8Qv9cpyJFyogTYqkP5WCobX5RNaHsJzIV/6NvAnlnouOcwKr29QrxLGDGcqYuJ+ae98s1A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.2.tgz", - "integrity": "sha512-TAReynFYCfHNcrL+8Z74WPGafLFLF++bGkrpcsk6cO5G9S2VuJGhu2c44YFForMgF0GlYmtbpmeznkvZpNgTxg==", - "dev": true, - "requires": { - "@jest/core": "^27.4.2", - "import-local": "^3.0.2", - "jest-cli": "^27.4.2" - } - }, - "jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "dependencies": { - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - } + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" } }, - "jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10600,41 +9931,55 @@ "requires": { "has-flag": "^4.0.0" } - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "jest-cli": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.2.tgz", - "integrity": "sha512-Ex2WhCj4s0XFntTKTnyLgV/CZKgQaZBYrKz02XOZ4nUjFD+26Fji/M1SgHm+2IWEIsQqoipNRx9RJH56p8d7MQ==", + "istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", "dev": true, "requires": { - "@jest/core": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "java-invoke-local": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/java-invoke-local/-/java-invoke-local-0.0.6.tgz", + "integrity": "sha512-gZmQKe1QrfkkMjCn8Qv9cpyJFyogTYqkP5WCobX5RNaHsJzIV/6NvAnlnouOcwKr29QrxLGDGcqYuJ+ae98s1A==", + "dev": true + }, + "jest": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz", + "integrity": "sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==", + "dev": true, + "requires": { + "@jest/core": "^27.4.7", "import-local": "^3.0.2", - "jest-config": "^27.4.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" + "jest-cli": "^27.4.7" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10698,6 +10043,26 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "jest-cli": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz", + "integrity": "sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==", + "dev": true, + "requires": { + "@jest/core": "^27.4.7", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.4.7", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -10767,33 +10132,136 @@ } } }, - "jest-config": { + "jest-changed-files": { "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.2.tgz", - "integrity": "sha512-2vKqelsfHPnIzrPTpE9hImqxZLp5l9Vszpci19RdVB2i5OwoM+OkPExZMQb8aGrpEGXoKtlzvdqCL1GObiz8JQ==", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + } + } + }, + "jest-circus": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz", + "integrity": "sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.4.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + } + } + }, + "jest-config": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", + "integrity": "sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==", + "dev": true, + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.4.6", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.6", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", + "jest-circus": "^27.4.6", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", + "jest-jasmine2": "^27.4.6", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.2", + "jest-resolve": "^27.4.6", + "jest-runner": "^27.4.6", "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", + "jest-validate": "^27.4.6", "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", + "pretty-format": "^27.4.6", "slash": "^3.0.0" }, "dependencies": { @@ -10849,15 +10317,15 @@ } }, "jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", + "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.4.0", "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -10921,16 +10389,16 @@ } }, "jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz", + "integrity": "sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "jest-get-type": "^27.4.0", "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -10985,32 +10453,31 @@ } }, "jest-environment-jsdom": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.2.tgz", - "integrity": "sha512-L0dV4oq4+Ll7hZ8QCGvSELn8uOr938/QKOg6o70kMHiZOpWOjAqSf7fMVAtGhG/BVSvk1GTzhGJNOWsxtH5KbQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz", + "integrity": "sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", - "@jest/fake-timers": "^27.4.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", "@jest/types": "^27.4.2", - "@types/jsdom": "^16.2.4", "@types/node": "*", - "jest-mock": "^27.4.2", + "jest-mock": "^27.4.6", "jest-util": "^27.4.2", "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz", + "integrity": "sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", - "@jest/fake-timers": "^27.4.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^27.4.2", + "jest-mock": "^27.4.6", "jest-util": "^27.4.2" } }, @@ -11021,9 +10488,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz", + "integrity": "sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -11036,34 +10503,33 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.6", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz", + "integrity": "sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.6", "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", + "@jest/test-result": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.4.2", + "expect": "^27.4.6", "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", + "pretty-format": "^27.4.6", "throat": "^6.0.1" }, "dependencies": { @@ -11125,25 +10591,25 @@ } }, "jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz", + "integrity": "sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==", "dev": true, "requires": { "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" + "pretty-format": "^27.4.6" } }, "jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", + "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.4.2", + "jest-diff": "^27.4.6", "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -11198,9 +10664,9 @@ } }, "jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", + "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -11209,7 +10675,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", + "pretty-format": "^27.4.6", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -11266,9 +10732,9 @@ } }, "jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz", + "integrity": "sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -11294,18 +10760,18 @@ "dev": true }, "jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz", + "integrity": "sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.6", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", + "jest-validate": "^27.4.6", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" @@ -11363,26 +10829,26 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz", + "integrity": "sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" + "jest-snapshot": "^27.4.6" } }, "jest-runner": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.2.tgz", - "integrity": "sha512-YsgbYKk8V7J5BQPINXhdzNLoqIwUWrJkV9h6/ccsn6fbmC3n3ax1K5cDWzAU9qXyaQhetwFqPpHmAHIACscRKQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz", + "integrity": "sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==", "dev": true, "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/console": "^27.4.6", + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -11390,15 +10856,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.2", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", + "jest-haste-map": "^27.4.6", + "jest-leak-detector": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-resolve": "^27.4.6", + "jest-runtime": "^27.4.6", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.6", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -11461,45 +10927,35 @@ } }, "jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz", + "integrity": "sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==", "dev": true, "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/globals": "^27.4.6", "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", - "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.6", + "jest-snapshot": "^27.4.6", "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" + "strip-bom": "^4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11519,17 +10975,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11545,43 +10990,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } + "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true }, "supports-color": { "version": "7.2.0", @@ -11591,44 +11010,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -11643,34 +11024,32 @@ } }, "jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz", + "integrity": "sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==", "dev": true, "requires": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.6", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.4.2", + "expect": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", + "jest-diff": "^27.4.6", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-haste-map": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", + "pretty-format": "^27.4.6", "semver": "^7.3.2" }, "dependencies": { @@ -11714,15 +11093,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -11740,12 +11110,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -11815,9 +11179,9 @@ } }, "jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz", + "integrity": "sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -11825,7 +11189,7 @@ "chalk": "^4.0.0", "jest-get-type": "^27.4.0", "leven": "^3.1.0", - "pretty-format": "^27.4.2" + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -11880,12 +11244,12 @@ } }, "jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz", + "integrity": "sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==", "dev": true, "requires": { - "@jest/test-result": "^27.4.2", + "@jest/test-result": "^27.4.6", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -11894,15 +11258,6 @@ "string-length": "^4.0.1" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11951,19 +11306,13 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true } } }, "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", "dev": true, "requires": { "@types/node": "*", @@ -11989,9 +11338,9 @@ } }, "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, "js-sha3": { "version": "0.8.0", @@ -12010,12 +11359,18 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } } }, "jsbn": { @@ -12069,12 +11424,6 @@ "mime-types": "^2.1.12" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -12085,6 +11434,32 @@ "punycode": "^2.1.1", "universalify": "^0.1.2" } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } } } }, @@ -12135,13 +11510,22 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -12217,13 +11601,13 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -12308,6 +11692,11 @@ "ms": "2.0.0" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -12344,9 +11733,9 @@ "dev": true }, "koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -12354,7 +11743,7 @@ "content-disposition": "~0.5.2", "content-type": "^1.0.4", "cookies": "~0.8.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", "destroy": "^1.0.4", @@ -12365,7 +11754,7 @@ "http-errors": "^1.6.3", "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", + "koa-convert": "^2.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", @@ -12374,15 +11763,6 @@ "vary": "^1.1.2" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -12398,24 +11778,13 @@ "dev": true }, "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, "requires": { "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "dev": true, - "requires": { - "any-promise": "^1.1.0" - } - } + "koa-compose": "^4.1.0" } }, "koa-logger": { @@ -12491,28 +11860,6 @@ "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -12527,12 +11874,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12630,13 +11971,13 @@ } }, "log-node": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/log-node/-/log-node-8.0.2.tgz", - "integrity": "sha512-H+3t002yGqZRJhVW3A/EksIB7i1M84cwcWzBPsnAmQWOA2ePAV2fXJpNPBnw6VEdhzPcedIxQwT5jhBVTlYQww==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/log-node/-/log-node-8.0.3.tgz", + "integrity": "sha512-1UBwzgYiCIDFs8A0rM2QdBFo8Wd8UQ0HrSTu/MNI+/2zN3NoHRj2fhplurAyuxTYUXu3Oohugq1jAn5s05u1MQ==", "requires": { "ansi-regex": "^5.0.1", - "cli-color": "^2.0.0", - "cli-sprintf-format": "^1.1.0", + "cli-color": "^2.0.1", + "cli-sprintf-format": "^1.1.1", "d": "^1.0.1", "es5-ext": "^0.10.53", "sprintf-kit": "^2.0.1", @@ -12644,11 +11985,6 @@ "type": "^2.5.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12665,21 +12001,21 @@ } }, "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.2.tgz", + "integrity": "sha512-V6JiPThZzTsbVRspNO6TmHkR99oqYTs8fivMBYQkjZj6rxW92KxtDCPE6IkAk1DNBnYKNkjm4jYBm6JDUcyhOA==", "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", + "colors": "1.4.0", + "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", "triple-beam": "^1.3.0" }, "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" } } }, @@ -12707,6 +12043,14 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", @@ -12731,11 +12075,11 @@ } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "pify": "^3.0.0" + "semver": "^6.0.0" } }, "make-error": { @@ -12801,15 +12145,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -12863,17 +12198,24 @@ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.51.0" + }, + "dependencies": { + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + } } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -12904,18 +12246,11 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minizlib": { @@ -12925,13 +12260,6 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "mkdirp": { @@ -12956,9 +12284,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multimatch": { "version": "5.0.0", @@ -12974,9 +12302,9 @@ } }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { "version": "2.15.0", @@ -13080,9 +12408,12 @@ } }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-inspect-extracted": { "version": "1.0.8", @@ -13095,12 +12426,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, "node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", @@ -13285,11 +12610,11 @@ "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "only": { @@ -13616,9 +12941,9 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", @@ -13634,64 +12959,52 @@ } }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "dev": true }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^4.0.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } @@ -13748,91 +13061,24 @@ } }, "postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" }, "dependencies": { "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true } } }, - "postcss-modules": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.1.3.tgz", - "integrity": "sha512-dBT39hrXe4OAVYJe/2ZuIZ9BzYhOe7t+IhedYeQ2OxKwDpAGlkEN/fR0fGnrbx4BvgbMReRX4hCubYK9cE/pJQ==", - "dev": true, - "requires": { - "generic-names": "^2.0.1", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, "prebuild-install": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", @@ -13881,9 +13127,9 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", "dev": true }, "prettier-linter-helpers": { @@ -13896,23 +13142,16 @@ } }, "pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", + "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", "dev": true, "requires": { - "@jest/types": "^27.4.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -13957,12 +13196,6 @@ "type": "^2.1.0" } }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "promise-queue": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", @@ -14029,9 +13262,9 @@ } }, "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.1.1", @@ -14078,35 +13311,23 @@ "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==" }, "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, "query-ast": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/query-ast/-/query-ast-1.0.3.tgz", - "integrity": "sha512-k7z4jilpZCujhiJ+QeKSwYXHc9HxqiVKlVE7/em0zBfPpcqnXKUP8F7ld7XaAkO6oXeAD7yonqcNJWqOF2pSGA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/query-ast/-/query-ast-1.0.4.tgz", + "integrity": "sha512-KFJFSvODCBjIH5HbHvITj9EEZKYUU6VX0T5CuB1ayvjUoUaZkKMi6eeby5Tf8DMukyZHlJQOE1+f3vevKUe6eg==", "dev": true, "requires": { - "invariant": "2.2.2", - "lodash": "^4.17.15" - }, - "dependencies": { - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - } + "invariant": "2.2.4" } }, "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" }, "queue-microtask": { "version": "1.2.3", @@ -14119,9 +13340,9 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" }, "randomatic": { "version": "3.1.1", @@ -14155,33 +13376,14 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } } }, "raw-loader": { @@ -14449,10 +13651,15 @@ "uuid": "^3.3.2" }, "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } }, "uuid": { "version": "3.4.0", @@ -14501,13 +13708,14 @@ "dev": true }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-alpn": { @@ -14553,11 +13761,11 @@ } }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -14581,17 +13789,17 @@ } }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } }, "run-parallel-limit": { "version": "1.1.0", @@ -14621,9 +13829,9 @@ "dev": true }, "s3rver": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/s3rver/-/s3rver-3.7.0.tgz", - "integrity": "sha512-Y/omIxk13qeNmoitsRxbFD/ME9dlcbrais7biuKtdQX43WSufc8P2A482j3BpkjrkoA1F57oBq4skMgeljKzcg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/s3rver/-/s3rver-3.7.1.tgz", + "integrity": "sha512-H9KIX6n8NqcfoE4ziFNbQASBQfjcNJgb+3wbT9L5iotEqfOncFO1c38cfJSFSo7xXTu1zM9HA6t2u9xKNlYRaA==", "dev": true, "requires": { "@koa/router": "^9.0.0", @@ -14669,18 +13877,25 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.35.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", - "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sax": { @@ -14714,13 +13929,12 @@ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "scss-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.4.tgz", - "integrity": "sha512-oDZwDfY2JhnDrHNZPcdcPNVTpAXsJBY2/uhFfN0IzMy1xExAfJDcI1Yl/VXhfRsdQL3wLeg6/Oxt3cafBOuMzQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.5.tgz", + "integrity": "sha512-RZOtvCmCnwkDo7kdcYBi807Y5EoTIxJ34AgEgJNDmOH1jl0/xG0FyYZFbH6Ga3Iwu7q8LSdxJ4C5UkzNXjQxKQ==", "dev": true, "requires": { - "invariant": "2.2.4", - "lodash": "^4.17.4" + "invariant": "2.2.4" } }, "seek-bzip": { @@ -14752,9 +13966,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -14763,9 +13977,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -14786,22 +14000,10 @@ } } }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -14823,54 +14025,53 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "serverless": { - "version": "2.67.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-2.67.0.tgz", - "integrity": "sha512-FbiUlsQnpcVK5nffOS2T4YmHZHHxjadPCJi6NIFOWWWbcDr0Bbai225KF3oO+znF0zSkc0vPmXfkT0Tvm91/lA==", + "version": "2.72.1", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-2.72.1.tgz", + "integrity": "sha512-SxmxyBgWQvcKvEXdP0fR3Y+nljOQ+nWCPDZXnhic//w+k0kNQ/bHcd3S1VZQqU3m7nZZwMsdC5lxB26EpUFELA==", "requires": { - "@serverless/cli": "^1.5.3", - "@serverless/components": "^3.18.1", - "@serverless/dashboard-plugin": "^5.5.1", + "@serverless/cli": "^1.6.0", + "@serverless/components": "^3.18.2", + "@serverless/dashboard-plugin": "^5.5.4", "@serverless/platform-client": "^4.3.0", - "@serverless/utils": "^5.20.1", + "@serverless/utils": "^5.20.3", "ajv": "^6.12.6", "ajv-keywords": "^3.5.2", "archiver": "^5.3.0", - "aws-sdk": "^2.1036.0", + "aws-sdk": "^2.1061.0", "bluebird": "^3.7.2", "boxen": "^5.1.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", "ci-info": "^3.3.0", - "cli-progress-footer": "^2.2.0", + "cli-progress-footer": "^2.3.0", "d": "^1.0.1", "dayjs": "^1.10.7", "decompress": "^4.2.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", - "essentials": "^1.1.1", + "essentials": "^1.2.0", "ext": "^1.6.0", "fastest-levenshtein": "^1.0.12", - "filesize": "^8.0.6", + "filesize": "^8.0.7", "fs-extra": "^9.1.0", "get-stdin": "^8.0.0", - "globby": "^11.0.4", + "globby": "^11.1.0", "got": "^11.8.3", - "graceful-fs": "^4.2.8", + "graceful-fs": "^4.2.9", "https-proxy-agent": "^5.0.0", "is-docker": "^2.2.1", - "is-wsl": "^2.2.0", "js-yaml": "^4.1.0", "json-cycle": "^1.3.0", "json-refs": "^3.0.15", @@ -14878,8 +14079,8 @@ "memoizee": "^0.4.15", "micromatch": "^4.0.4", "ncjsm": "^4.2.0", - "node-fetch": "^2.6.6", - "object-hash": "^2.2.0", + "node-fetch": "^2.6.7", + "open": "^7.4.2", "path2": "^0.1.0", "process-utils": "^4.0.0", "promise-queue": "^2.2.5", @@ -14896,10 +14097,94 @@ "yaml-ast-parser": "0.0.43" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "@serverless/components": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/@serverless/components/-/components-3.18.2.tgz", + "integrity": "sha512-jQSgd3unajU94R6vjzD0l+PS5lVcky0vrE1DOfb28VPgmaS48+I/niavWR7+SOt0mYjIkUlwBI73a2ZuqeYK6Q==", + "requires": { + "@serverless/platform-client": "^4.2.2", + "@serverless/platform-client-china": "^2.2.0", + "@serverless/utils": "^4.0.0", + "adm-zip": "^0.5.4", + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "child-process-ext": "^2.1.1", + "chokidar": "^3.5.1", + "ci-info": "^3.2.0", + "dayjs": "^1.10.4", + "dotenv": "^8.2.0", + "fastest-levenshtein": "^1.0.12", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "got": "^11.8.2", + "graphlib": "^2.1.8", + "https-proxy-agent": "^5.0.0", + "inquirer-autocomplete-prompt": "^1.3.0", + "js-yaml": "^3.14.1", + "memoizee": "^0.4.14", + "minimist": "^1.2.5", + "open": "^7.3.1", + "prettyoutput": "^1.2.0", + "ramda": "^0.27.1", + "semver": "^7.3.4", + "strip-ansi": "^6.0.0", + "tencent-serverless-http": "^1.3.1", + "traverse": "^0.6.6", + "uuid": "^8.3.2" + }, + "dependencies": { + "@serverless/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-cl5uPaGg72z0sCUpF0zsOhwYYUV72Gxc1FwFfxltO8hSvMeFDvwD7JrNE4kHcIcKRjwPGbSH0fdVPUpErZ8Mog==", + "requires": { + "chalk": "^4.1.0", + "ci-info": "^3.1.1", + "inquirer": "^7.3.3", + "js-yaml": "^4.1.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "ncjsm": "^4.1.0", + "type": "^2.5.0", + "uuid": "^8.3.2", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + } + } }, "ansi-styles": { "version": "4.3.0", @@ -14923,11 +14208,6 @@ "supports-color": "^7.1.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -14946,49 +14226,33 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + "ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==" }, "semver": { "version": "7.3.5", @@ -15013,48 +14277,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -15100,6 +14322,17 @@ "xml2js": "0.4.19" } }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -15137,6 +14370,12 @@ "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -15249,9 +14488,9 @@ } }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -15275,28 +14514,6 @@ "has-flag": "^4.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "ws": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", @@ -15332,9 +14549,9 @@ } }, "serverless-s3-local": { - "version": "0.6.20", - "resolved": "https://registry.npmjs.org/serverless-s3-local/-/serverless-s3-local-0.6.20.tgz", - "integrity": "sha512-SWNs58FwIAWSc9MDPurBo7poJlMQqoJ5eOf5pNARmqPWMu6LAdyQVRS+sMqzMqQVm86c+IjO9gIU2hbEzAXE3A==", + "version": "0.6.21", + "resolved": "https://registry.npmjs.org/serverless-s3-local/-/serverless-s3-local-0.6.21.tgz", + "integrity": "sha512-MTRzpd89jg1CKIgJ8sESkzbpczKCdqnzGXyMJfCG4N3KJpfC/glbAw8RxiDVJV/eW+yeM+gKqigPg/Xv+7YvZQ==", "dev": true, "requires": { "aws-sdk": "^2.916.0", @@ -15343,7 +14560,7 @@ "rxjs-compat": "^6.6.7", "s3rver": "^3.7.0", "serverless-offline": "^8.0.0", - "shelljs": "^0.8.4" + "shelljs": "^0.8.5" }, "dependencies": { "fs-extra": { @@ -15449,9 +14666,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha256-uint8array": { "version": "0.10.1", @@ -15472,9 +14689,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "requires": { "glob": "^7.0.0", @@ -15529,9 +14746,9 @@ } }, "simple-git": { - "version": "2.47.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.47.1.tgz", - "integrity": "sha512-DF4rnBr4uzMQsreqxHg8t1wN4Pi3kj/shBVT1OO+aBkBnscCZ02tynKHc9cx3StNPnItHWAaoN31qkRNDhh5Ow==", + "version": "2.48.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", + "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -15569,9 +14786,9 @@ } }, "snyk": { - "version": "1.707.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.707.0.tgz", - "integrity": "sha512-r99f8akVRFPryHAkcgmwH0TA2DdTyT1p0BwgnxPOK6Aak2phfhDF3w+EkmNoVC8p+lGYKeR3PaFW++tV9RQVrQ==" + "version": "1.834.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.834.0.tgz", + "integrity": "sha512-0XKshpV1azNRxOKwFV+NuR/ukT0OAhsUZI/jSN6O2XIQ5lYWXC8wNgvtpJ4pmhekMjBCj4rH6mxYDo2USWEZ1g==" }, "socket.io-client": { "version": "2.4.0", @@ -15598,6 +14815,11 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -15623,6 +14845,11 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -15649,25 +14876,32 @@ "dev": true }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "sourcemap-codec": { @@ -15693,14 +14927,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } } } }, @@ -15718,9 +14944,9 @@ } }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15791,12 +15017,6 @@ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", "dev": true }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -15807,12 +15027,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15821,24 +15035,42 @@ "requires": { "ansi-regex": "^5.0.1" } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^2.0.0" } } } @@ -15887,9 +15119,9 @@ } }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-dirs": { @@ -15920,9 +15152,9 @@ } }, "strnum": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.3.tgz", - "integrity": "sha512-GVoRjsqAYZkAH16GDzfTuafuwKxzKdaaCQyLaWf37gOP1e2PPbAKWoME1OmO+c4RCKMfNrrPRDLFCNBFU45N/A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "dev": true }, "strtok3": { @@ -15952,34 +15184,29 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "supertest": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz", - "integrity": "sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^6.1.0" + "superagent": "^7.1.0" }, "dependencies": { "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -15987,25 +15214,36 @@ "mime-types": "^2.1.12" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, "requires": { - "yallist": "^4.0.0" + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "dependencies": { + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + } } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -16032,29 +15270,23 @@ } }, "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", "dev": true, "requires": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", + "cookiejar": "^2.1.3", + "debug": "^4.3.3", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", + "mime": "^2.5.0", + "qs": "^6.10.1", "readable-stream": "^3.6.0", - "semver": "^7.3.2" + "semver": "^7.3.5" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -16093,6 +15325,12 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -16112,10 +15350,107 @@ "untildify": "^3.0.3" }, "dependencies": { - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==" + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" } } }, @@ -16125,6 +15460,31 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "tar-fs": { "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", @@ -16214,34 +15574,17 @@ "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } } }, "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -16259,28 +15602,18 @@ } }, "terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "jest-worker": "^27.4.1", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", "terser": "^5.7.2" }, "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -16291,6 +15624,12 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -16378,11 +15717,6 @@ "is-number": "^7.0.0" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, "token-types": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.1.1.tgz", @@ -16406,31 +15740,12 @@ "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } } }, "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "traverse": { "version": "0.6.6", @@ -16456,9 +15771,9 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-jest": { - "version": "27.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", - "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "version": "27.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.3.tgz", + "integrity": "sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -16471,15 +15786,6 @@ "yargs-parser": "20.x" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -16489,12 +15795,6 @@ "lru-cache": "^6.0.0" } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -16640,19 +15940,13 @@ "requires": { "minimist": "^1.2.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsscmp": { "version": "1.0.6", @@ -16725,9 +16019,9 @@ } }, "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, "unbox-primitive": { @@ -16757,17 +16051,6 @@ "requires": { "buffer": "^5.2.1", "through": "^2.3.8" - }, - "dependencies": { - "buffer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.0.tgz", - "integrity": "sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } } }, "uni-global": { @@ -16817,9 +16100,9 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" }, "update-notifier": { "version": "5.1.0", @@ -16940,6 +16223,18 @@ "requires": { "punycode": "1.3.2", "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + } } }, "url-join": { @@ -16985,9 +16280,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -17057,25 +16352,33 @@ } }, "watchpack": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", - "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, + "web-did-resolver": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.12.tgz", + "integrity": "sha512-bidL5bPn8CYFM33sfh465iLcgTbkNpfAlmpWkSC69D24fXnAY36tbMfhnehqIut+VCKZqIqeeZZl5ACanF5/+A==", + "requires": { + "cross-fetch": "^3.1.2", + "did-resolver": "^3.1.5" + } + }, "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "webpack": { - "version": "5.64.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.4.tgz", - "integrity": "sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -17092,7 +16395,7 @@ "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -17100,8 +16403,8 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.0", - "webpack-sources": "^3.2.2" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { "events": { @@ -17110,21 +16413,12 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dev": true, - "requires": { - "mime-db": "1.49.0" - } - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -17137,9 +16431,9 @@ } }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true } } @@ -17151,9 +16445,9 @@ "dev": true }, "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, "whatwg-encoding": { @@ -17172,14 +16466,12 @@ "dev": true }, "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which": { @@ -17256,24 +16548,29 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } } } }, "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.2.tgz", + "integrity": "sha512-9jmhltAr5ygt5usgUTQbEiw/7RYXpyUbEAFRCSicIacpUzPkrnQsQZSPGEI12aLK9Jth4zNcYJx3Cvznwrl8pw==", "requires": { - "readable-stream": "^2.3.6", + "logform": "^2.3.2", + "readable-stream": "^3.4.0", "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "word-wrap": { @@ -17372,6 +16669,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", @@ -17464,12 +16766,6 @@ "dev": true, "optional": true }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", diff --git a/package.json b/package.json index fac3ed32..c977df45 100644 --- a/package.json +++ b/package.json @@ -25,21 +25,21 @@ "dependencies": { "@ahryman40k/ts-fhir-types": "^4.0.36", "@govtechsg/oa-schemata": "^1.15.10", - "@govtechsg/oa-verify": "^7.7.0", + "@govtechsg/oa-verify": "^7.8.0", "@govtechsg/open-attestation": "^6.2.0", - "@middy/core": "^2.5.3", - "@middy/http-error-handler": "^2.5.3", - "@middy/http-json-body-parser": "^2.5.3", - "@middy/ssm": "^2.5.3", + "@middy/core": "^2.5.6", + "@middy/http-error-handler": "^2.5.6", + "@middy/http-json-body-parser": "^2.5.6", + "@middy/ssm": "^2.5.6", "@notarise-gov-sg/gpay-covid-cards": "^1.0.5", "@notarise-gov-sg/i18n-nationality": "^1.2.2", "@notarise-gov-sg/sns-notify-recipients": "^1.5.2", "@pathcheck/dcc-sdk": "0.0.17", "@types/url-join": "^4.0.1", - "aws-sdk": "^2.1036.0", + "aws-sdk": "^2.1062.0", "aws-xray-sdk-core": "^3.3.4", "axios": "^0.24.0", - "debug": "^4.3.2", + "debug": "^4.3.3", "fhir": "^4.11.1", "file-loader": "^6.2.0", "file-type": "16.5.3", @@ -49,7 +49,7 @@ "middy-middleware-json-error-handler": "^3.0.0", "moment-timezone": "^0.5.34", "runtypes": "^6.5.0", - "serverless": "^2.66.2", + "serverless": "^2.72.1", "serverless-http": "^2.7.0", "serverless-offline-ses": "https://github.com/rjchow/serverless-offline-ses/tarball/release/1", "serverless-plugin-aws-alerts": "^1.7.4", @@ -59,44 +59,44 @@ "validate.js": "^0.13.1" }, "devDependencies": { - "@babel/preset-env": "^7.16.4", - "@babel/preset-typescript": "^7.16.0", - "@govtechsg/serverless-selective-functions": "^0.1.1", - "@types/aws-lambda": "^8.10.85", + "@babel/preset-env": "^7.16.11", + "@babel/preset-typescript": "^7.16.7", + "@govtechsg/serverless-selective-functions": "^0.1.2", + "@types/aws-lambda": "^8.10.91", "@types/debug": "^4.1.7", "@types/dotenv": "^8.2.0", "@types/he": "^1.1.2", - "@types/http-errors": "^1.8.1", - "@types/jest": "^27.0.3", - "@types/lodash": "^4.14.177", - "@types/qrcode": "^1.4.1", + "@types/http-errors": "^1.8.2", + "@types/jest": "^27.4.0", + "@types/lodash": "^4.14.178", + "@types/qrcode": "^1.4.2", "@types/supertest": "^2.0.11", - "@types/uuid": "^8.3.3", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", "cross-env": "^7.0.3", - "depcheck": "^1.4.2", - "eslint": "^8.3.0", + "depcheck": "^1.4.3", + "eslint": "^8.7.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^25.7.0", "eslint-plugin-prettier": "^4.0.0", "fork-ts-checker-webpack-plugin": "^6.4.2", - "jest": "^27.3.1", + "jest": "^27.4.7", "jest-raw-loader": "^1.0.1", - "prettier": "^2.5.0", + "prettier": "^2.5.1", "raw-loader": "^4.0.2", "serverless-attach-permission-boundary": "^0.1.0", "serverless-domain-manager": "^5.4.1", "serverless-offline": "^8.3.1", - "serverless-s3-local": "^0.6.20", + "serverless-s3-local": "^0.6.21", "serverless-webpack": "^5.6.0", - "supertest": "^6.1.6", - "ts-jest": "^27.0.7", + "supertest": "^6.2.2", + "ts-jest": "^27.1.3", "ts-loader": "^9.2.6", - "typescript": "^4.5.2", - "webpack": "^5.64.4", + "typescript": "^4.5.5", + "webpack": "^5.67.0", "webpack-node-externals": "^3.0.0" } } diff --git a/serverless.yml b/serverless.yml index ef7dbe84..9fad4cf3 100644 --- a/serverless.yml +++ b/serverless.yml @@ -2,7 +2,7 @@ service: api-notarise-healthcerts provider: name: aws - runtime: nodejs12.x + runtime: nodejs14.x memorySize: 256 timeout: 30 # optional, in seconds, default is 6 stage: ${opt:stage, "dev"} From fdf05c5c1ac6d2f0118ff69dfb8c6e4cec9e2842 Mon Sep 17 00:00:00 2001 From: Kyle Huang Junyuan Date: Mon, 31 Jan 2022 11:22:30 +0800 Subject: [PATCH 16/20] chore: remove v1 endpoint by configuration (#460) --- serverless.yml | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/serverless.yml b/serverless.yml index 9fad4cf3..bc6858a6 100644 --- a/serverless.yml +++ b/serverless.yml @@ -70,43 +70,6 @@ provider: burstLimit: 200 rateLimit: 100 functions: - notarisePdt: - environment: - STAGE: ${self:provider.stage} - DEBUG: "*,-follow-redirects" - INFURA_API_KEY: ${self:custom.${self:custom.envSource}.INFURA_API_KEY} - SIGNING_DID_NAME: ${self:custom.${self:custom.envSource}.SIGNING_DID_NAME} - SIGNING_DNS_DID_LOCATION: ${self:custom.${self:custom.envSource}.SIGNING_DNS_DID_LOCATION} - SIGNING_DID: ${self:custom.${self:custom.envSource}.SIGNING_DID} - SIGNING_DID_KEY: ${self:custom.${self:custom.envSource}.SIGNING_DID_KEY} - SIGNING_DID_PRIVATE_KEY: ${self:custom.${self:custom.envSource}.SIGNING_DID_PRIVATE_KEY} - TRANSIENT_STORAGE_URL: ${self:custom.${self:custom.envSource}.TRANSIENT_STORAGE_URL} - TRANSIENT_STORAGE_API_KEY: ${self:custom.${self:custom.envSource}.TRANSIENT_STORAGE_API_KEY} - NOTIFICATION_ENABLED: ${self:custom.${self:custom.envSource}.NOTIFICATION_ENABLED} - NOTIFICATION_TOPIC_ARN: ${self:custom.${self:custom.envSource}.NOTIFICATION_TOPIC_ARN} - NOTIFICATION_SENDER_NAME: ${self:custom.${self:custom.envSource}.NOTIFICATION_SENDER_NAME} - NOTIFICATION_SENDER_LOGO: ${self:custom.${self:custom.envSource}.NOTIFICATION_SENDER_LOGO} - NOTIFICATION_TEMPLATE_ID: ${self:custom.${self:custom.envSource}.NOTIFICATION_TEMPLATE_ID} - AUTHORIZED_ISSUERS_MAP: ${self:custom.${self:custom.envSource}.AUTHORIZED_ISSUERS_MAP} - ETHEREUM_NETWORK: ${self:custom.ethereumConfig.${self:provider.stage}, self:custom.ethereumConfig.stg} - USE_API_AUTHORISED_ISSUER: ${self:custom.${self:custom.envSource}.USE_API_AUTHORISED_ISSUER} - AUTHORIZED_ISSUERS_API_URL: ${self:custom.${self:custom.envSource}.AUTHORIZED_ISSUERS_API_URL} - AUTHORIZED_ISSUERS_API_KEY: ${self:custom.${self:custom.envSource}.AUTHORIZED_ISSUERS_API_KEY} - OFFLINE_QR_ENABLED: ${self:custom.${self:custom.envSource}.OFFLINE_QR_ENABLED} - SIGNING_EU_QR_NAME: ${self:custom.${self:custom.envSource}.SIGNING_EU_QR_NAME} - SIGNING_EU_QR_PUBLIC_KEY: ${self:custom.${self:custom.envSource}.SIGNING_EU_QR_PUBLIC_KEY} - SIGNING_EU_QR_PRIVATE_KEY: ${self:custom.${self:custom.envSource}.SIGNING_EU_QR_PRIVATE_KEY} - WHITELIST_NRICS: ${self:custom.${self:custom.envSource}.WHITELIST_NRICS} - handler: src/functionHandlers/notarisePdt/v1/handler.handler - events: - - http: - path: /notarise/pdt - method: post - private: true - - http: - path: /v1/notarise/pdt - method: post - private: true notarisePdtV2: environment: STAGE: ${self:provider.stage} From b16340990d4511aa705919e85e2d2ae40b032905 Mon Sep 17 00:00:00 2001 From: Zaw Myo Latt Date: Wed, 9 Feb 2022 14:46:39 +0800 Subject: [PATCH 17/20] Feat: 180643659 Add Saliva Test (#465) --- src/config.ts | 3 +- .../notarisePdt/v1/notarisePdt.ts | 2 +- .../notarisePdt/v2/notarisePdt.ts | 3 +- .../createEuHealthCert.test.ts | 73 +++++++++++++++++++ .../createEuHealthCert/createEuTestCert.ts | 12 ++- 5 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/config.ts b/src/config.ts index 11ab2334..c428d9cd 100644 --- a/src/config.ts +++ b/src/config.ts @@ -87,7 +87,8 @@ const generateConfig = () => ({ isGPayCovidCardEnabled: isTruthy(process.env.GPAY_COVID_CARD_ENABLED), swabTestTypes: { ART: "697989009", - PCR: "258500001", + PCR_NASAL: "258500001", + PCR_SALIVA: "119342007", }, }); diff --git a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts b/src/functionHandlers/notarisePdt/v1/notarisePdt.ts index ad482080..142d6939 100644 --- a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts +++ b/src/functionHandlers/notarisePdt/v1/notarisePdt.ts @@ -51,7 +51,7 @@ export const notarisePdt = async ( const testDataTypes = testData.map((test) => test.swabTypeCode); if ( testDataTypes.includes(config.swabTestTypes.ART) || - testDataTypes.includes(config.swabTestTypes.PCR) + testDataTypes.includes(config.swabTestTypes.PCR_NASAL) ) { traceWithRef("signedEuHealthCerts: Generating EU test cert..."); const euTestCerts = createEuTestCert(testData, reference, universalUrl); diff --git a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts index 38c54e6b..ac9f6b14 100644 --- a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts +++ b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts @@ -46,7 +46,8 @@ export const notarisePdt = async ( const testDataTypes = testData.map((test) => test.swabTypeCode); if ( testDataTypes.includes(config.swabTestTypes.ART) || - testDataTypes.includes(config.swabTestTypes.PCR) + testDataTypes.includes(config.swabTestTypes.PCR_NASAL) || + testDataTypes.includes(config.swabTestTypes.PCR_SALIVA) ) { traceWithRef("signedEuHealthCerts: Generating EU test cert..."); const euTestCerts = await createEuTestCert( diff --git a/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts b/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts index 931e7108..3c8314e8 100644 --- a/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts +++ b/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts @@ -533,3 +533,76 @@ describe("createEuTestCert for PCR Nasopharyngeal Swab with detected/not_detecte ]); }); }); + +describe("createEuTestCert for PCR Saliva Swab", () => { + let dateNowSpy: jest.SpyInstance; + let spy: jest.SpyInstance; + beforeAll(() => { + spy = jest.spyOn(console, "error").mockImplementation(() => { + // do not display errors + }); + dateNowSpy = jest + .spyOn(Date.prototype, "toISOString") + .mockReturnValue("2021-06-30T00:00:00.000Z"); + }); + afterAll(() => { + spy.mockRestore(); + dateNowSpy.mockRestore(); + }); + + const testData: TestData[] = [ + { + provider: "MacRitchie Medical Clinic", + gender: "M", + lab: "lab", + nationality: "SG", + nric: "123", + observationDate: "6/28/21 2:15:00 PM GMT+08:00", + passportNumber: "ES12345", + patientName: "TESTING", + performerMcr: "123", + performerName: "123", + birthDate: "01/01/2021", + swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", + swabType: "Saliva swab", + swabTypeCode: "119342007", + testCode: "94531-1", + testType: + "Reverse transcription polymerase chain reaction (rRT-PCR) test", + testResult: "Positive", + testResultCode: "10828004", + }, + ]; + + it("create EU test cert with valid params", async () => { + const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + expect(result).toMatchObject([ + { + ver: "1.3.0", + nam: { + fnt: "TESTING", + }, + dob: "2021-01-01", + t: [ + { + tg: "840539006", + tt: "LP6464-4", + nm: testData[0].testType, + sc: "2021-06-27T14:15:00+08:00", + tr: "260373001", + tc: "MacRitchie Medical Clinic", + co: "SG", + is: "Ministry of Health (Singapore)", + ci: "URN:UVCI:01:SG:1ABC-CDE-CDE", + }, + ], + meta: { + reference: "abc-cde-cde", + notarisedOn: "2021-06-30T00:00:00.000Z", + passportNumber: "ES12345", + url: "storedUrl", + }, + }, + ]); + }); +}); diff --git a/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts b/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts index e04605a3..54ffb2e3 100644 --- a/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts +++ b/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts @@ -55,18 +55,22 @@ export const createEuTestCert = ( is: euSigner.name, ci: UniqueCertificateId, }; - if (item.swabTypeCode === swabTestTypes.PCR) { + // check swab test type is valid PCR Nasal or PCR Saliva + if ( + [swabTestTypes.PCR_NASAL, swabTestTypes.PCR_SALIVA].includes( + item.swabTypeCode + ) + ) { testGroup.tt = "LP6464-4"; // test type code for PCR test [Nucleic acid amplification with probe detection] testGroup.nm = item.testType; } else if (item.swabTypeCode === swabTestTypes.ART) { testGroup.tt = "LP217198-3"; // test type code for ART test [Rapid immunoassay] testGroup.ma = item.deviceIdentifier; } - // generate test cert only for PCR and ART which have valid test result code + // generate test cert only for PCR Nasal, PCR Saliva and ART which have valid test result code if ( euDccTestResultCode && - (item.swabTypeCode === swabTestTypes.PCR || - item.swabTypeCode === swabTestTypes.ART) + Object.values(swabTestTypes).includes(item.swabTypeCode) ) { testHealthCerts.push({ ver: fhirVersion, From 171b8984888944e7ed7dc9accf547ba2ebc0c451 Mon Sep 17 00:00:00 2001 From: dchocoboo <86618807+dchocoboo@users.noreply.github.com> Date: Fri, 11 Feb 2022 14:01:42 +0800 Subject: [PATCH 18/20] fix vpc discovery (#468) Co-authored-by: David --- serverless.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/serverless.yml b/serverless.yml index bc6858a6..ad346717 100644 --- a/serverless.yml +++ b/serverless.yml @@ -125,10 +125,13 @@ custom: # ssm failure returns "undefined" while env failure returns "" vpcDiscovery: vpcName: "${env:VPC_NAME}" - subnetNames: # optional if securityGroupNames are specified - - "notarize-${self:custom.subnetEnvName.${self:provider.stage}, self:custom.subnetEnvName.other}-application-private-*" - securityGroupNames: - - "default" + subnets: + - tagKey: Name + tagValues: + - "notarize-${self:custom.subnetEnvName.${self:provider.stage}, self:custom.subnetEnvName.other}-application-private-*" + securityGroups: + - names: + - "default-application-vpc-*" subnetEnvName: stg: "stg" production: "prd" @@ -145,8 +148,8 @@ custom: domainName: "${self:custom.customDomainList.${self:provider.stage}, self:custom.customDomainList.other}" basePath: "" stage: ${self:provider.stage} - createRoute53Record: false - endpointType: "edge" + createRoute53Record: true + endpointType: regional autoDomain: true envSource: ${self:custom.envSourceConfig.${self:provider.stage}, self:custom.envSourceConfig.other} KMS_ARN: ${env:KMS_ARN, "PLACEHOLDER_ARN"} From 4ea6b0bb77746ac67f89a0749bccaee388517cc6 Mon Sep 17 00:00:00 2001 From: Zaw Myo Latt Date: Wed, 16 Feb 2022 14:51:38 +0800 Subject: [PATCH 19/20] Chore: 181264836 Cleanup Deprecated v1 functions and types (#473) * Chore: clean up v1 un-use function & types * #major Removed Deprecated V1 Api Support * fix: eu test collection time format --- README.md | 10 +- src/common/datetime.ts | 14 + src/common/healthCertDataValidation.test.ts | 103 ---- src/common/healthCertDataValidation.ts | 60 -- src/common/maskNricFin.test.ts | 19 +- src/common/maskNricFin.ts | 22 +- .../notarisePdt/v1/handler.ts | 113 ---- .../notarisePdt/v1/notarisePdt.ts | 92 --- .../notarisePdt/v2/handler.ts | 13 +- .../notarisePdt/v2/notarisePdt.ts | 50 +- .../validateInputs/validateDocument.test.ts | 97 +-- .../validateInputs/validateDocument.ts | 45 +- .../validateInputs/validateInputs.test.ts | 10 +- .../validateInputs/validateInputs.ts | 11 +- src/middleware/cloudWatch.test.ts | 89 +-- src/middleware/cloudWatch.ts | 44 +- .../createEuHealthCert.test.ts | 408 +++++-------- .../createEuHealthCert/createEuTestCert.ts | 88 ++- src/models/healthCert.test.ts | 366 ----------- src/models/healthCert.ts | 228 ------- src/models/healthCertV2.test.ts | 404 ------------- src/models/healthCertV2.ts | 73 --- .../createNotarizedHealthCert.test.ts | 409 ------------- .../createNotarizedHealthCert.ts | 48 -- .../createUnwrappedHealthCert.test.ts | 570 ------------------ .../createUnwrappedHealthCert.ts | 77 --- .../createNotarizedHealthCert/index.ts | 1 - src/models/notarizedHealthCert/index.ts | 1 - src/services/spmNotification/index.test.ts | 118 +--- src/services/spmNotification/index.ts | 24 +- src/services/transientStorage/index.ts | 9 +- src/types.ts | 151 +---- .../v1/example_healthcert_invalid_file.json | 180 ------ ...rt_without_everything_multi_unwrapped.json | 172 ------ ...cert_without_everything_multi_wrapped.json | 192 ------ ...althcert_without_everything_unwrapped.json | 148 ----- ...healthcert_without_everything_wrapped.json | 168 ------ 37 files changed, 296 insertions(+), 4331 deletions(-) delete mode 100644 src/common/healthCertDataValidation.test.ts delete mode 100644 src/common/healthCertDataValidation.ts delete mode 100644 src/functionHandlers/notarisePdt/v1/handler.ts delete mode 100644 src/functionHandlers/notarisePdt/v1/notarisePdt.ts delete mode 100644 src/models/healthCert.test.ts delete mode 100644 src/models/healthCert.ts delete mode 100644 src/models/healthCertV2.test.ts delete mode 100644 src/models/healthCertV2.ts delete mode 100644 src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.test.ts delete mode 100644 src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.ts delete mode 100644 src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.test.ts delete mode 100644 src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.ts delete mode 100644 src/models/notarizedHealthCert/createNotarizedHealthCert/index.ts delete mode 100644 src/models/notarizedHealthCert/index.ts delete mode 100644 test/fixtures/v1/example_healthcert_invalid_file.json delete mode 100644 test/fixtures/v1/example_healthcert_without_everything_multi_unwrapped.json delete mode 100644 test/fixtures/v1/example_healthcert_without_everything_multi_wrapped.json delete mode 100644 test/fixtures/v1/example_healthcert_without_everything_unwrapped.json delete mode 100644 test/fixtures/v1/example_healthcert_without_everything_wrapped.json diff --git a/README.md b/README.md index ce97fca5..8dfde03c 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,12 @@ To get onboarded as a HealthCerts Issuer, please refer to the [Notarise FAQ (poi To start endorsing your **Pre-departure Test (PDT) HealthCerts** on Notarise.gov.sg, please take note of the respective endpoints for each version/environment: -| **Environment** | **PDT Schema v1.0**\* | **PDT Schema v2.0** | -| --------------- | -------------------------- | ----------------------------- | -| Staging | `/stg/notarise/pdt` | `/stg/v2/notarise/pdt` | -| Production | `/production/notarise/pdt` | `/production/v2/notarise/pdt` | +| **Environment** | **PDT Schema v2.0** | +| --------------- | ----------------------------- | +| Staging | `/stg/v2/notarise/pdt` | +| Production | `/production/v2/notarise/pdt` | -> **Deprecation notice**: v1.0 endpoint is scheduled to be deprecated on 31 October 2021. Please refer to [this guide](https://github.com/Open-Attestation/schemata/pull/38) to migrate to PDT Schema v2.0.

Please be reminded that endorsement of documents utilising the new PDT HealthCert Schema v2.0 is only available in the new v2 Notarise endpoint: `/stg/v2/notarise/pdt` or `/production/v2/notarise/pdt`. +> **Deprecation notice**: v1.0 endpoint is deprecated on 31 January 2022. Please refer to [this guide](https://github.com/Open-Attestation/schemata/pull/38) to migrate to PDT Schema v2.0.

Please be reminded that endorsement of documents utilising the new PDT HealthCert Schema v2.0 is only available in the new v2 Notarise endpoint: `/stg/v2/notarise/pdt` or `/production/v2/notarise/pdt`. **Request Format**: diff --git a/src/common/datetime.ts b/src/common/datetime.ts index c55ab2d7..fcf2c89a 100644 --- a/src/common/datetime.ts +++ b/src/common/datetime.ts @@ -1,5 +1,7 @@ // Replica of https://github.com/Notarise-gov-sg/healthcert-renderer/blob/352bc3ce4e24308942dce295b604a13daa394b0e/src/util/datetime.ts +import moment from "moment-timezone"; + const SG_LOCALE = "en-sg"; // FIXME: "en-sg" locale may not be supported in user's browser @@ -38,3 +40,15 @@ export const isoToDateOnlyString = (iso = ""): string => day: "numeric", year: "numeric", }); + +/** + * Returns a nicely formatted date-time string with GMT+08:00 timezone. + * @param iso "2020-09-28T06:15:00Z" + * @returns "9/28/20 6:15:00 AM GMT+08:00" + */ +export const parseDateTime = (dateString: string | undefined): string => + dateString + ? `${moment + .tz(dateString, "Asia/Singapore") + .format("M/D/YY h:mm:ss A")} GMT+08:00` + : ""; diff --git a/src/common/healthCertDataValidation.test.ts b/src/common/healthCertDataValidation.test.ts deleted file mode 100644 index 1abca5d3..00000000 --- a/src/common/healthCertDataValidation.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { validateHealthCertData } from "./healthCertDataValidation"; -import { DataInvalidError } from "./error"; - -describe("validateHealthCertData", () => { - test("should not flag optional data as invalid", () => { - const testData = [ - { - provider: "name", - gender: "M", - lab: "lab", - nationality: "SG", - nric: undefined, - observationDate: "123", - passportNumber: "123", - patientName: "123", - performerMcr: "123", - performerName: "123", - birthDate: "123", - swabCollectionDate: "123", - swabType: "123", - testType: "123", - }, - ]; - // @ts-ignore - expect(() => validateHealthCertData(testData)).not.toThrow( - DataInvalidError - ); - }); - - test("should not flag valid ART cert data as invalid", () => { - const testData = [ - { - provider: "name", - gender: "M", - lab: "lab", - nationality: "SG", - nric: undefined, - observationDate: "123", - passportNumber: "123", - patientName: "123", - performerMcr: "123", - performerName: "123", - birthDate: "123", - swabCollectionDate: "123", - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testType: "123", - deviceIdentifier: "1232", - }, - ]; - // @ts-ignore - expect(() => validateHealthCertData(testData)).not.toThrow( - DataInvalidError - ); - }); - - test("should flag device data missing as invalid in ART cert", () => { - const testData = [ - { - provider: "name", - gender: "M", - lab: "lab", - nationality: "SG", - nric: undefined, - observationDate: "123", - passportNumber: "123", - patientName: "123", - performerMcr: "123", - performerName: "123", - birthDate: "123", - swabCollectionDate: "123", - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testType: "123", - }, - ]; - // @ts-ignore - expect(() => validateHealthCertData(testData)).toThrow(DataInvalidError); - }); - - test("should flag missing required fields as invalid", () => { - const testData = [ - { - provider: "", - gender: "", - lab: "", - nationality: "", - nric: undefined, - observationDate: "", - passportNumber: "", - patientName: "", - performerMcr: "", - performerName: "", - birthDate: "", - swabCollectionDate: "", - swabType: "", - testType: "", - }, - ]; - // @ts-ignore - expect(() => validateHealthCertData(testData)).toThrow(DataInvalidError); - }); -}); diff --git a/src/common/healthCertDataValidation.ts b/src/common/healthCertDataValidation.ts deleted file mode 100644 index 0de8eabb..00000000 --- a/src/common/healthCertDataValidation.ts +++ /dev/null @@ -1,60 +0,0 @@ -// converts camelCase words to space seperated words -// e.g passportNumber to passport number -import { TestData } from "src/types"; -import { DataInvalidError } from "./error"; -import { config } from "../config"; - -const { swabTestTypes } = config; - -const toEnglishWords = (variableName: string): string => { - let newString = ""; - for (let i = 0; i < variableName.length; i += 1) { - const character = variableName.charAt(i); - if (character === character.toUpperCase()) { - newString = `${newString} ${character.toLowerCase()}`; - } else { - newString += character; - } - } - return newString; -}; - -// concats all required missing fields of test data to an a string array to be used -// in the error message -export const validateHealthCertData = (testDataList: TestData[]) => { - const optionalData = ["nric", "lab", "deviceIdentifier"]; - const invalidParams: string[] = []; - testDataList.forEach((testData) => { - // art cert need to have device identifier - if ( - testData.swabTypeCode === swabTestTypes.ART && - !testData.deviceIdentifier - ) { - invalidParams.push(toEnglishWords("deviceIdentifier")); - } - Object.entries(testData).forEach((entry) => { - const [key, value] = entry; - if (!value && !optionalData.includes(key)) { - invalidParams.push(toEnglishWords(key)); - } - }); - }); - - // dedupe the invalid params - invalidParams.filter( - (value, index) => invalidParams.indexOf(value) === index - ); - - // for some reason the entire healthcert is malformed and no test data is pushed at all - if (testDataList.length === 0) { - throw new DataInvalidError([ - "observation", - "specimen", - "patient", - "organisation", - ]); - } - if (invalidParams.length > 0) { - throw new DataInvalidError(invalidParams); - } -}; diff --git a/src/common/maskNricFin.test.ts b/src/common/maskNricFin.test.ts index 720b2b51..6a254a88 100644 --- a/src/common/maskNricFin.test.ts +++ b/src/common/maskNricFin.test.ts @@ -1,25 +1,8 @@ import { R4 } from "@ahryman40k/ts-fhir-types"; -import { fhirBundleV1, Patient } from "../types"; -import { maskNricInFhirBundleV1, maskNricInFhirBundle } from "./maskNricFin"; -import pdtUnwrappedSampleV1 from "../../test/fixtures/v1/example_healthcert_with_nric_unwrapped.json"; +import { maskNricInFhirBundle } from "./maskNricFin"; import pdtUnwrappedSampleV2 from "../../test/fixtures/v2/pdt_pcr_with_nric_unwrapped.json"; describe("test maskNricFinInPlace function", () => { - it("nric should be masked for V1 Healthcert", () => { - const { fhirBundle } = pdtUnwrappedSampleV1; - - const maskedFhirBundle = maskNricInFhirBundleV1(fhirBundle as any); - const patient = (maskedFhirBundle as fhirBundleV1).entry.find( - (entry) => entry.resourceType === "Patient" - ); - const nricIdentifier = (patient as Patient).identifier.find( - (i) => i.type !== "PPN" && i.type.text.toUpperCase() === "NRIC" - ); - - expect(fhirBundle).not.toEqual(maskNricInFhirBundle); - expect(nricIdentifier?.value).toStrictEqual("S****989Z"); - }); - it("nric should be masked for V2 Healthcert", () => { const { fhirBundle } = pdtUnwrappedSampleV2; diff --git a/src/common/maskNricFin.ts b/src/common/maskNricFin.ts index f7ce3671..6ca85d56 100644 --- a/src/common/maskNricFin.ts +++ b/src/common/maskNricFin.ts @@ -1,31 +1,11 @@ import { R4 } from "@ahryman40k/ts-fhir-types"; -import { fhirBundleV1, Patient, PDTHealthCertV2 } from "../types"; +import { PDTHealthCertV2 } from "../types"; // Get the reference to the nested nric identifier object // mask the value in place const maskNric = (nric: string) => `${nric[0]}****${nric.slice(5)}`; -/** - * @deprecated This function should be removed when PDT HealthCert v1.0 is deprecated. - */ -export const maskNricInFhirBundleV1 = ( - fhirBundle: fhirBundleV1 | R4.IBundle -) => { - const patient = (fhirBundle as fhirBundleV1).entry.find( - (entry) => entry.resourceType === "Patient" - ); - const nricIdentifier = (patient as Patient).identifier.find( - (i) => i.type !== "PPN" && i.type.text.toUpperCase() === "NRIC" - ); - - // Mask NRIC by reference - if (nricIdentifier?.value) - nricIdentifier.value = maskNric(nricIdentifier.value); - - return fhirBundle; -}; - export const maskNricInFhirBundle = ( fhirBundle: PDTHealthCertV2["fhirBundle"] ) => { diff --git a/src/functionHandlers/notarisePdt/v1/handler.ts b/src/functionHandlers/notarisePdt/v1/handler.ts deleted file mode 100644 index 5cf58f98..00000000 --- a/src/functionHandlers/notarisePdt/v1/handler.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { APIGatewayProxyResult, Handler } from "aws-lambda"; -import { v4 as uuid } from "uuid"; -import { getData, WrappedDocument } from "@govtechsg/open-attestation"; -import { notifyPdt } from "@notarise-gov-sg/sns-notify-recipients"; -import { - getTestDataFromHealthCert, - getParticularsFromHealthCert, -} from "../../../models/healthCert"; -import { getLogger } from "../../../common/logger"; -import { DetailedCodedError } from "../../../common/error"; -import { - HealthCertDocument, - NotarisationResult, - TestData, -} from "../../../types"; -import { middyfy, ValidatedAPIGatewayProxyEvent } from "../../middyfy"; -import { validateInputs } from "../validateInputs"; -import { config } from "../../../config"; -import { notarisePdt } from "./notarisePdt"; - -const { trace, error: logError } = getLogger( - "src/functionHandlers/notarisePdt/v1/handler" -); - -export const main: Handler = async ( - event: ValidatedAPIGatewayProxyEvent> -): Promise => { - trace("config", config); - const reference = uuid(); - const certificate = event.body; - - // need to extract the nric first as the nric will be masked in place when notarisePdt() - let data: HealthCertDocument = {} as any; - let nric: string | undefined; - let fin: string | undefined; - let testData: TestData[] = []; - - try { - data = getData(certificate); - ({ nric, fin } = getParticularsFromHealthCert(data)); - testData = getTestDataFromHealthCert(data); - } catch (e) { - logError(`error extracting data from wrapped document. ${e}`); - } - - const errorWithRef = logError.extend(`reference:${reference}`); - - try { - await validateInputs(certificate); - - // ensure that all the required parameters can be read - getTestDataFromHealthCert(data); - } catch (e) { - if (e instanceof DetailedCodedError) { - errorWithRef( - `Error while validating certificate: ${e.title}, ${e.messageBody}` - ); - return { - statusCode: 400, - headers: { - "x-trace-id": reference, - }, - body: `${e.title}, ${e.messageBody}`, - }; - } - } - - let result: NotarisationResult | undefined; - - try { - result = await notarisePdt(reference, certificate); - } catch (e) { - if (e instanceof Error) { - errorWithRef(`Unhandled error: ${e.message}`); - return { - statusCode: 500, - headers: { - "x-trace-id": reference, - }, - body: "", - }; - } - } - - /* Notify recipient via SPM (only if enabled) */ - if (config.notification.enabled) { - try { - if (result) { - await notifyPdt({ - url: result.url, - nric: nric || fin, - passportNumber: testData[0].passportNumber, - testData, - validFrom: data.validFrom, - }); - } - } catch (e) { - if (e instanceof Error) { - errorWithRef(`Notification error: ${e.message}`); - } - } - } - - return { - statusCode: 200, - headers: { - "x-trace-id": reference, - }, - body: JSON.stringify(result), - }; -}; - -export const handler = middyfy(main); diff --git a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts b/src/functionHandlers/notarisePdt/v1/notarisePdt.ts deleted file mode 100644 index 142d6939..00000000 --- a/src/functionHandlers/notarisePdt/v1/notarisePdt.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { getData, WrappedDocument } from "@govtechsg/open-attestation"; -import { notarise } from "@govtechsg/oa-schemata"; -import { - getTestDataFromHealthCert, - getParticularsFromHealthCert, -} from "../../../models/healthCert"; -import { getLogger } from "../../../common/logger"; -import { createNotarizedHealthCert } from "../../../models/notarizedHealthCert"; -import { - buildUniversalUrl, - getQueueNumber, - uploadDocument, -} from "../../../services/transientStorage"; -import { HealthCertDocument, NotarisationResult } from "../../../types"; -import { config, getDefaultIfUndefined } from "../../../config"; -import { - createEuSignedTestQr, - createEuTestCert, -} from "../../../models/euHealthCert"; - -const { trace } = getLogger( - "src/functionHandlers/notarisePdt/v1/handler/notarisePdt" -); - -export const notarisePdt = async ( - reference: string, - certificate: WrappedDocument -): Promise => { - const errorWithRef = trace.extend(`reference:${reference}`); - const traceWithRef = trace.extend(`reference:${reference}`); - - const { id, key } = await getQueueNumber(reference); - traceWithRef(`placeholder document id: ${id}`); - - const universalUrl = buildUniversalUrl(id, key); - const data = getData(certificate); - const testData = getTestDataFromHealthCert(data); - const { nric, fin } = getParticularsFromHealthCert(data); - const whiteListNrics = getDefaultIfUndefined(process.env.WHITELIST_NRICS, "") - .split(",") - .map((nirc) => nirc.trim()); - const patientNricFin = (nric || fin) ?? ""; - traceWithRef( - `Is offline Qr nric/fin in whitelist : ${whiteListNrics.includes( - patientNricFin - )}` - ); - let signedEuHealthCerts: notarise.SignedEuHealthCert[] = []; - if (config.isOfflineQrEnabled || whiteListNrics.includes(patientNricFin)) { - try { - const testDataTypes = testData.map((test) => test.swabTypeCode); - if ( - testDataTypes.includes(config.swabTestTypes.ART) || - testDataTypes.includes(config.swabTestTypes.PCR_NASAL) - ) { - traceWithRef("signedEuHealthCerts: Generating EU test cert..."); - const euTestCerts = createEuTestCert(testData, reference, universalUrl); - traceWithRef(euTestCerts); - signedEuHealthCerts = await createEuSignedTestQr(euTestCerts); - if (!signedEuHealthCerts.length) { - throw new Error( - `Generated EU Vacc Cert is invalid: signedEuHealthCerts has 0 entries` - ); - } - } else { - traceWithRef( - `signedEuHealthCerts: Unsupported test type - ${JSON.stringify( - testDataTypes - )}` - ); - } - } catch (e) { - errorWithRef( - `signedEuHealthCerts error: ${e instanceof Error ? e.message : e}` - ); - } - } - - const notarisedDocument = await createNotarizedHealthCert( - certificate, - reference, - universalUrl, - signedEuHealthCerts - ); - const { ttl } = await uploadDocument(notarisedDocument, id, reference); - traceWithRef("Document successfully notarised"); - return { - notarisedDocument, - ttl, - url: universalUrl, - }; -}; diff --git a/src/functionHandlers/notarisePdt/v2/handler.ts b/src/functionHandlers/notarisePdt/v2/handler.ts index 4ef74a61..1f2474af 100644 --- a/src/functionHandlers/notarisePdt/v2/handler.ts +++ b/src/functionHandlers/notarisePdt/v2/handler.ts @@ -5,10 +5,9 @@ import { R4 } from "@ahryman40k/ts-fhir-types"; import { sendNotification } from "../../../services/spmNotification"; import fhirHelper from "../../../models/fhir"; import { ParsedBundle } from "../../../models/fhir/types"; -import { getTestDataFromParseFhirBundle } from "../../../models/healthCertV2"; import { getLogger } from "../../../common/logger"; import { DetailedCodedError } from "../../../common/error"; -import { PDTHealthCertV2, NotarisationResult, TestData } from "../../../types"; +import { PDTHealthCertV2, NotarisationResult } from "../../../types"; import { middyfy, ValidatedAPIGatewayProxyEvent } from "../../middyfy"; import { validateV2Inputs } from "../validateInputs"; import { config } from "../../../config"; @@ -30,7 +29,6 @@ export const main: Handler = async ( /* 1. Validation */ let parsedFhirBundle: ParsedBundle; let data: PDTHealthCertV2; // The unwrapped HealthCert - let testData: TestData[]; try { await validateV2Inputs(wrappedDocument); data = getData(wrappedDocument); @@ -41,9 +39,6 @@ export const main: Handler = async ( // validate parsed FhirBundle data with specific healthcert type constraints fhirHelper.hasRequiredFields(data.type, parsedFhirBundle); fhirHelper.hasRecognisedFields(data.type, parsedFhirBundle); - - // convert parsed Bundle to testdata[] - testData = getTestDataFromParseFhirBundle(parsedFhirBundle); } catch (e) { errorWithRef( `Error while validating certificate: ${ @@ -68,8 +63,8 @@ export const main: Handler = async ( result = await notarisePdt( reference, wrappedDocument, - parsedFhirBundle as ParsedBundle, - testData as TestData[] + data.type, + parsedFhirBundle as ParsedBundle ); } catch (e) { errorWithRef(`Unhandled error: ${e instanceof Error ? e.message : e}`); @@ -85,7 +80,7 @@ export const main: Handler = async ( /* Send to SPM notification/wallet (Only if enabled) */ if (config.notification.enabled) { try { - await sendNotification(result, parsedFhirBundle, testData, data); + await sendNotification(result, parsedFhirBundle, data); } catch (e) { if (e instanceof Error) { errorWithRef(`SPM notification/wallet error: ${e.message}`); diff --git a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts index ac9f6b14..cd98bda4 100644 --- a/src/functionHandlers/notarisePdt/v2/notarisePdt.ts +++ b/src/functionHandlers/notarisePdt/v2/notarisePdt.ts @@ -8,29 +8,28 @@ import { getQueueNumber, uploadDocument, } from "../../../services/transientStorage"; -import { PDTHealthCertV2, NotarisationResult, TestData } from "../../../types"; +import { PDTHealthCertV2, NotarisationResult } from "../../../types"; import { config, getDefaultIfUndefined } from "../../../config"; -import { - createEuSignedTestQr, - createEuTestCert, -} from "../../../models/euHealthCert"; +import { generateEuHealthCert } from "../../../models/euHealthCert"; +import { Type } from "../../../models/fhir/constraints"; const { trace } = getLogger("src/functionHandlers/notarisePdt/v2/notarisePdt"); export const notarisePdt = async ( reference: string, certificate: WrappedDocument, - parsedFhirBundle: ParsedBundle, - testData: TestData[] + type: Type, + parsedFhirBundle: ParsedBundle ): Promise => { const errorWithRef = trace.extend(`reference:${reference}`); const traceWithRef = trace.extend(`reference:${reference}`); + /* Get transientStorage queue number for upload and build verify url. */ const { id, key } = await getQueueNumber(reference); traceWithRef(`placeholder document id: ${id}`); - const universalUrl = buildUniversalUrl(id, key); + /* Get whitelisted nrics from SSM for enable some limited features in Prod. */ const whiteListNrics = getDefaultIfUndefined(process.env.WHITELIST_NRICS, "") .split(",") .map((nirc) => nirc.trim()); @@ -40,35 +39,17 @@ export const notarisePdt = async ( patientNricFin )}` ); + + /* Generate EU Test Health Cert (Only if enabled or Match with whitelisted NRIC) */ let signedEuHealthCerts: notarise.SignedEuHealthCert[] = []; if (config.isOfflineQrEnabled || whiteListNrics.includes(patientNricFin)) { try { - const testDataTypes = testData.map((test) => test.swabTypeCode); - if ( - testDataTypes.includes(config.swabTestTypes.ART) || - testDataTypes.includes(config.swabTestTypes.PCR_NASAL) || - testDataTypes.includes(config.swabTestTypes.PCR_SALIVA) - ) { - traceWithRef("signedEuHealthCerts: Generating EU test cert..."); - const euTestCerts = await createEuTestCert( - testData, - reference, - universalUrl - ); - traceWithRef(euTestCerts); - signedEuHealthCerts = await createEuSignedTestQr(euTestCerts); - if (!signedEuHealthCerts.length) { - throw new Error( - `Generated EU Vacc Cert is invalid: signedEuHealthCerts has 0 entries` - ); - } - } else { - traceWithRef( - `signedEuHealthCerts: Unsupported test type - ${JSON.stringify( - testDataTypes - )}` - ); - } + signedEuHealthCerts = await generateEuHealthCert( + type, + parsedFhirBundle, + reference, + universalUrl + ); } catch (e) { errorWithRef( `signedEuHealthCerts error: ${e instanceof Error ? e.message : e}` @@ -76,6 +57,7 @@ export const notarisePdt = async ( } } + /* Generate notarised Test Health Cert Document and Upload to transientStorage bucket. */ const notarisedDocument = await createNotarizedHealthCert( certificate, parsedFhirBundle, diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts index 79926c60..d279671b 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.test.ts @@ -3,7 +3,7 @@ import _examplePcrHealthCertV1Wrapped from "../../../../test/fixtures/v1/example import _examplePcrHealthCertV2Wrapped from "../../../../test/fixtures/v2/pdt_pcr_with_nric_wrapped.json"; import _exampleArtHealthCertV2Wrapped from "../../../../test/fixtures/v2/pdt_art_with_nric_wrapped.json"; import _examplePcrSerHealthCertV2Wrapped from "../../../../test/fixtures/v2/pdt_pcr_ser_multi_result_wrapped.json"; -import { validateDocument, validateV2Document } from "./validateDocument"; +import { validateV2Document } from "./validateDocument"; import { isAuthorizedIssuer } from "../authorizedIssuers"; import { DocumentInvalidError } from "../../../common/error"; import mockImage from "./mock_image.json"; @@ -106,101 +106,6 @@ beforeEach(() => { whenFragmentsAreValid(); }); -it("should not throw on valid document", async () => { - whenFragmentsAreValid(); - await expect( - validateDocument(examplePcrHealthCertV1Wrapped) - ).resolves.not.toThrow(); -}); - -it("should throw on document failing OA verification", async () => { - mockIsValid.mockReturnValue(false); - await expect(validateDocument(examplePcrHealthCertV1Wrapped)).rejects.toThrow( - /Invalid document error/ - ); -}); - -it("should throw on document with multiple issuer identity passing (should not happen)", async () => { - mockVerify.mockResolvedValue([ - ...validFragments, - { - name: "ADDITIONAL", - type: "ISSUER_IDENTITY", - data: {}, - status: "VALID", - }, - ]); - await expect(validateDocument(examplePcrHealthCertV1Wrapped)).rejects.toThrow( - /Invalid document error/ - ); -}); - -it("should throw on document with multiple issuers", async () => { - mockVerify.mockResolvedValue([ - { - name: "OpenAttestationDnsDid", - type: "ISSUER_IDENTITY", - data: [ - { - location: "donotverify.testing.verify.gov.sg", - key: "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - status: "VALID", - }, - { - location: "donotverify2.testing.verify.gov.sg", - key: "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B831#controller", - status: "VALID", - }, - ], - status: "VALID", - }, - ]); - await expect(validateDocument(examplePcrHealthCertV1Wrapped)).rejects.toThrow( - /Invalid document error/ - ); -}); - -it("should throw on document without issuer domain name (should not happen)", async () => { - mockVerify.mockResolvedValue([ - { - name: "OpenAttestationDnsDid", - type: "ISSUER_IDENTITY", - data: [ - { - key: "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - status: "VALID", - }, - ], - status: "VALID", - }, - ]); - await expect(validateDocument(examplePcrHealthCertV1Wrapped)).rejects.toThrow( - /Invalid document error/ - ); -}); - -it("should throw on document with unauthorized issuer domain", async () => { - const unauthorizedIssuerDomain = "unauthorized.gov.sg"; - mockVerify.mockResolvedValue([ - { - name: "OpenAttestationDnsDid", - type: "ISSUER_IDENTITY", - data: [ - { - location: unauthorizedIssuerDomain, - key: "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - status: "VALID", - }, - ], - status: "VALID", - }, - ]); - mockIsAuthorizedIssuer.mockResolvedValue(false); - await expect(validateDocument(examplePcrHealthCertV1Wrapped)).rejects.toThrow( - /Unrecognised clinic error/ - ); -}); - it("should not throw on valid PCR v2 document", async () => { whenFragmentsAreValid(); await expect( diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts index b20b37bf..6d1e5c2e 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateDocument.ts @@ -11,56 +11,13 @@ import _ from "lodash"; import axios from "axios"; import { fromStream, fromBuffer } from "file-type"; import { isAuthorizedIssuer } from "../authorizedIssuers"; -import { HealthCertDocument, PDTHealthCertV2 } from "../../../types"; +import { PDTHealthCertV2 } from "../../../types"; import { UnrecognisedClinicError, DocumentInvalidError, } from "../../../common/error"; import { config } from "../../../config"; -/** - * @deprecated This function should be removed when PDT HealthCert v1.0 is deprecated. - */ -export const validateDocument = async ( - attachment: WrappedDocument -) => { - const verify = - verificationBuilder(openAttestationVerifiers, { - network: config.network, - }) ?? defaultVerify; - - const results = await verify(attachment); - const documentIsValid = isValid(results); - if (!documentIsValid) { - throw new DocumentInvalidError( - `validation error: ${JSON.stringify(results)}` - ); - } - const identityFragments = results.filter( - (fragment) => - fragment.status === "VALID" && fragment.type === "ISSUER_IDENTITY" - ); - if (identityFragments.length !== 1) - throw new DocumentInvalidError( - "Document may only have one issuer identity test" - ); - - type IdentityFragment = VerificationFragment & { - data: any; - }; - - const issuer = identityFragments[0] as IdentityFragment; - - if (!issuer || issuer.data.length !== 1) { - throw new DocumentInvalidError("Document may only have one issuer"); - } - const issuerDomain: string | undefined = issuer.data[0]?.location; - if (!issuerDomain) - throw new DocumentInvalidError("Issuer's domain is not found"); - const validDomain = await isAuthorizedIssuer(issuerDomain, "PCR"); // HealthCerts (in PDT Schema v1.0) are hardcoded to ONLY check against the PCR whitelist - if (!validDomain) throw new UnrecognisedClinicError(issuerDomain, "PCR"); -}; - export const validateV2Document = async ( wrappedDocument: WrappedDocument ) => { diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateInputs.test.ts b/src/functionHandlers/notarisePdt/validateInputs/validateInputs.test.ts index 0c328231..a8f5f06b 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateInputs.test.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateInputs.test.ts @@ -1,20 +1,20 @@ -import { validateInputs } from "./validateInputs"; -import { validateDocument } from "./validateDocument"; +import { validateV2Inputs } from "./validateInputs"; +import { validateV2Document } from "./validateDocument"; jest.mock("./validateDocument"); -const mockValidateDocument = validateDocument as jest.Mock; +const mockValidateDocument = validateV2Document as jest.Mock; const sampleDocument: any = {}; it("should pass when validation passes", async () => { mockValidateDocument.mockResolvedValue(undefined); - await expect(validateInputs(sampleDocument)).resolves.not.toThrow(); + await expect(validateV2Inputs(sampleDocument)).resolves.not.toThrow(); }); it("should throw when validateDocument throws", async () => { mockValidateDocument.mockRejectedValue(new Error("Some error message")); - await expect(validateInputs(sampleDocument)).rejects.toThrow( + await expect(validateV2Inputs(sampleDocument)).rejects.toThrow( /Some error message/ ); }); diff --git a/src/functionHandlers/notarisePdt/validateInputs/validateInputs.ts b/src/functionHandlers/notarisePdt/validateInputs/validateInputs.ts index 5370ce51..44da34bb 100644 --- a/src/functionHandlers/notarisePdt/validateInputs/validateInputs.ts +++ b/src/functionHandlers/notarisePdt/validateInputs/validateInputs.ts @@ -1,13 +1,6 @@ import { WrappedDocument } from "@govtechsg/open-attestation"; -import { validateDocument, validateV2Document } from "./validateDocument"; -import { HealthCertDocument, PDTHealthCertV2 } from "../../../types"; - -/** - * @deprecated This function should be removed when PDT HealthCert v1.0 is deprecated. - */ -export const validateInputs = async ( - attachment: WrappedDocument -) => Promise.all([validateDocument(attachment)]); +import { validateV2Document } from "./validateDocument"; +import { PDTHealthCertV2 } from "../../../types"; export const validateV2Inputs = async ( wrappedDocument: WrappedDocument diff --git a/src/middleware/cloudWatch.test.ts b/src/middleware/cloudWatch.test.ts index 148259af..23112c0c 100644 --- a/src/middleware/cloudWatch.test.ts +++ b/src/middleware/cloudWatch.test.ts @@ -1,6 +1,5 @@ import { cloneDeep } from "lodash"; -import { NotarisationResult, Observation } from "../types"; -import wrappedDocumentV1 from "../../test/fixtures/v1/example_healthcert_with_nric_wrapped.json"; +import { NotarisationResult } from "../types"; import wrappedDocumentV2 from "../../test/fixtures/v2/pdt_pcr_with_nric_wrapped.json"; import { CloudWatchMiddleware, Request } from "./cloudWatch"; import * as log from "./trace"; @@ -15,92 +14,6 @@ it("test regex of extractSubDomain", () => { ).toBe("gov.sg"); }); -describe("test cloudwatch middleware for v1", () => { - it("middlware should log clinic and subdomain from request", async () => { - jest.spyOn(log, "trace"); - const request: Request = { - event: { - body: wrappedDocumentV1, - }, - response: null, - }; - - const cloudWatchMiddleware: CloudWatchMiddleware = - new CloudWatchMiddleware(); - await cloudWatchMiddleware.before(request); - - expect(log.trace).toHaveBeenCalledWith( - "specificDomain donotverify.testing.verify.gov.sg attempting to notarise pdt..." - ); - expect(log.trace).toHaveBeenCalledWith( - "aggregateDomain gov.sg attempting to notarise pdt..." - ); - }); - - it("middleware should log cert type from response", async () => { - jest.spyOn(log, "trace"); - - // let's assume the wrappedDocument has been notarized - const notarisationResult: NotarisationResult = { - notarisedDocument: wrappedDocumentV1 as any, - ttl: 0, - url: "", - }; - - const request: Request = { - event: { - body: wrappedDocumentV1, - }, - response: { - body: JSON.stringify(notarisationResult), - statusCode: 200, - }, - }; - const cloudWatchMiddleware: CloudWatchMiddleware = - new CloudWatchMiddleware(); - await cloudWatchMiddleware.before(request); - await cloudWatchMiddleware.after(request); - expect(log.trace).toHaveBeenCalledWith( - `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type pcr` - ); - }); - - it("middleware should log unrecognised cert type from response", async () => { - jest.spyOn(log, "trace"); - - // let's assume the wrappedDocument has been notarized - const newDoc = cloneDeep(wrappedDocumentV1); - const observation: Observation = newDoc.data.fhirBundle.entry.find((ent) => - ent.resourceType.includes("Observation") - ) as any; - - observation.code.coding[0].code = "1234"; - - const notarisationResult: NotarisationResult = { - notarisedDocument: newDoc as any, - ttl: 0, - url: "", - }; - - const request: Request = { - event: { - body: newDoc, - }, - response: { - body: JSON.stringify(notarisationResult), - statusCode: 200, - }, - }; - const cloudWatchMiddleware: CloudWatchMiddleware = - new CloudWatchMiddleware(); - await cloudWatchMiddleware.before(request); - await cloudWatchMiddleware.after(request); - expect(log.trace).toHaveBeenCalledWith( - `specificDomain donotverify.testing.verify.gov.sg successfully notarised pdt of type UNRECOGNISED: 1234` - ); - }); -}); - describe("test cloudwatch middleware for v2", () => { afterEach(() => { jest.clearAllMocks(); diff --git a/src/middleware/cloudWatch.ts b/src/middleware/cloudWatch.ts index 06607e66..2af8b5c3 100644 --- a/src/middleware/cloudWatch.ts +++ b/src/middleware/cloudWatch.ts @@ -3,12 +3,7 @@ import { getData, WrappedDocument } from "@govtechsg/open-attestation"; import middy, { MiddlewareObj } from "@middy/core"; -import { - HealthCertDocument, - NotarisationResult, - Observation, - PDTHealthCertV2, -} from "../types"; +import { NotarisationResult, PDTHealthCertV2 } from "../types"; import { logError, trace } from "./trace"; export type Request = Pick; @@ -36,8 +31,7 @@ export class CloudWatchMiddleware } before = async (req: Request): Promise => { - const wrappedDocument = req.event - .body as WrappedDocument; + const wrappedDocument = req.event.body as WrappedDocument; const data = getData(wrappedDocument); const provider = data.issuers[0].identityProof?.location ?? "UNKNOWN"; this.specificDomain = provider; @@ -58,16 +52,11 @@ export class CloudWatchMiddleware try { const notarisationResult: NotarisationResult = JSON.parse(body); const { notarisedDocument } = notarisationResult; - const data: HealthCertDocument | PDTHealthCertV2 = - getData(notarisedDocument); + const data: PDTHealthCertV2 = getData(notarisedDocument); let testTypes: string[] = []; if (data.version === "pdt-healthcert-v2.0") { // version 2 testTypes = this.extractTestTypesV2(data as PDTHealthCertV2); - } else { - // version 1 - // @ts-ignore - testTypes = this.extractTestTypesV1(data as HealthCertDocument); } const { specificDomain } = this; const aggregateDomain = this.toAggregateDomain(specificDomain); @@ -105,33 +94,6 @@ export class CloudWatchMiddleware } return testTypes; } - - // version 1 - private extractTestTypesV1(data: HealthCertDocument): string[] { - const testTypes = new Set(); - const entries = data.fhirBundle?.entry; - if (entries == null) { - return []; - } - const observations = (entries as Observation[]).filter( - (entry) => entry.resourceType === "Observation" - ); - for (let i = 0; i < observations.length; i += 1) { - const observation = observations[i]; - const codings = observation.code.coding; - - for (let j = 0; j < codings.length; j += 1) { - const { code } = codings[j]; - if (code in this.validTests) { - testTypes.add(this.validTests[code]); - } else { - testTypes.add(`UNRECOGNISED: ${code}`); - } - } - } - - return Array.from(testTypes); - } } export const cloudWatchMiddleware = (): Pick< diff --git a/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts b/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts index 3c8314e8..4b1e19d5 100644 --- a/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts +++ b/src/models/euHealthCert/createEuHealthCert/createEuHealthCert.test.ts @@ -1,5 +1,10 @@ -import { TestData } from "src/types"; +import { R4 } from "@ahryman40k/ts-fhir-types"; +import _ from "lodash"; import { createEuTestCert } from "./index"; +import fhirHelper from "../../fhir/index"; +import exampleSingleTypePcrHealthCertWithNric from "../../../../test/fixtures/v2/pdt_pcr_with_nric_unwrapped.json"; +import exampleSingleTypeArtHealthCertWithNric from "../../../../test/fixtures/v2/pdt_art_with_nric_unwrapped.json"; +import exampleMultiTypeHealthCertWithNric from "../../../../test/fixtures/v2/pdt_pcr_ser_multi_result_unwrapped.json"; describe("createEuTestCert for invalid tests", () => { let dateNowSpy: jest.SpyInstance; @@ -17,39 +22,19 @@ describe("createEuTestCert for invalid tests", () => { dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - testResult: "Positive", - testResultCode: "10828004", - }, - ]; - - it("invalid EU test cert for other test type", async () => { - testData[0].swabTypeCode = "123456"; - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); - expect(result).toMatchObject([]); - }); + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleSingleTypePcrHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("invalid EU test cert for invalid test result code", async () => { - testData[0].testResultCode = "123456"; - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + parsedFhirBundle.observations[0].observation.result.code = "123456"; + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([]); }); }); @@ -70,46 +55,32 @@ describe("createEuTestCert for PCR Nasopharyngeal Swab", () => { dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - testResult: "Positive", - testResultCode: "10828004", - }, - ]; + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleSingleTypePcrHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("create EU test cert with valid params", async () => { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { meta: { reference: "abc-cde-cde", notarisedOn: "2021-06-30T00:00:00.000Z", - passportNumber: "ES12345", + passportNumber: "E7831177G", url: "storedUrl", }, }, @@ -143,46 +114,32 @@ describe("createEuTestCert for ART Anterior Nares Swab", () => { dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testCode: "41112601", - testType: "Quidel QuickVue At-Home OTC COVID-19 Test", - testResult: "Positive", - testResultCode: "10828004", - deviceIdentifier: "1232", - }, - ]; + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleSingleTypeArtHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("create EU test cert with valid params", async () => { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { meta: { reference: "abc-cde-cde", notarisedOn: "2021-06-30T00:00:00.000Z", - passportNumber: "ES12345", + passportNumber: "E7831177G", url: "storedUrl", }, }, @@ -216,67 +173,32 @@ describe("createEuTestCert for Multiple Swab Test Result", () => { dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - testResult: "Positive", - testResultCode: "10828004", - }, - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testCode: "41112601", - testType: "Quidel QuickVue At-Home OTC COVID-19 Test", - testResult: "Positive", - testResultCode: "10828004", - deviceIdentifier: "1232", - }, - ]; + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleMultiTypeHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("create EU test cert with valid params", async () => { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { meta: { reference: "abc-cde-cde", notarisedOn: "2021-06-30T00:00:00.000Z", - passportNumber: "ES12345", - url: "storedUrl", - }, - }, - { - ver: "1.3.0", - nam: { - fnt: "TESTING", - }, - dob: "2021-01-01", - t: [ - { - tg: "840539006", - tt: "LP217198-3", - ma: testData[1].deviceIdentifier, - sc: "2021-06-27T14:15:00+08:00", - tr: "260373001", - tc: "MacRitchie Medical Clinic", - co: "SG", - is: "Ministry of Health (Singapore)", - ci: "URN:UVCI:01:SG:2ABC-CDE-CDE", - }, - ], - meta: { - reference: "abc-cde-cde", - notarisedOn: "2021-06-30T00:00:00.000Z", - passportNumber: "ES12345", + passportNumber: "E7831177G", url: "storedUrl", }, }, @@ -336,45 +232,31 @@ describe("createEuTestCert for PCR Nasopharyngeal Swab with positive/negative te dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - testResult: "Negative", - testResultCode: "260385009", - }, - ]; + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleSingleTypePcrHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("create EU test cert with valid params negative test result code", async () => { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { - testData[0].testResult = "Positive"; - testData[0].testResultCode = "10828004"; - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + parsedFhirBundle.observations[0].observation.result.display = "Positive"; + parsedFhirBundle.observations[0].observation.result.code = "10828004"; + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { - testData[0].testResult = "Detected"; - testData[0].testResultCode = "260373001"; - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + parsedFhirBundle.observations[0].observation.result.display = "Detected"; + parsedFhirBundle.observations[0].observation.result.code = "260373001"; + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { dateNowSpy.mockRestore(); }); - const testData: TestData[] = [ - { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Saliva swab", - swabTypeCode: "119342007", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - testResult: "Positive", - testResultCode: "10828004", - }, - ]; + const parsedFhirBundle = _.cloneDeep( + fhirHelper.parse( + exampleSingleTypePcrHealthCertWithNric.fhirBundle as R4.IBundle + ) + ); it("create EU test cert with valid params", async () => { - const result = await createEuTestCert(testData, "abc-cde-cde", "storedUrl"); + parsedFhirBundle.observations[0].specimen.swabType.display = "Sliva swab"; + parsedFhirBundle.observations[0].specimen.swabType.code = "119342007"; + const result = await createEuTestCert( + parsedFhirBundle, + "abc-cde-cde", + "storedUrl" + ); expect(result).toMatchObject([ { ver: "1.3.0", nam: { - fnt: "TESTING", + fnt: "TAN { meta: { reference: "abc-cde-cde", notarisedOn: "2021-06-30T00:00:00.000Z", - passportNumber: "ES12345", + passportNumber: "E7831177G", url: "storedUrl", }, }, diff --git a/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts b/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts index 54ffb2e3..9b56bcb2 100644 --- a/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts +++ b/src/models/euHealthCert/createEuHealthCert/createEuTestCert.ts @@ -1,19 +1,18 @@ -import { notarise } from "@govtechsg/oa-schemata"; -import moment from "moment-timezone"; +import { notarise, pdtHealthCertV2 } from "@govtechsg/oa-schemata"; import _ from "lodash"; +import { getLogger } from "../../../common/logger"; import { config } from "../../../config"; -import { - EuHealthCert, - EuNameParams, - EuTestParams, - TestData, -} from "../../../types"; +import { EuHealthCert, EuNameParams, EuTestParams } from "../../../types"; import * as EUDccTestResult from "../../../static/EU-DCC-test-result.mapping.json"; +import { ParsedBundle } from "../../fhir/types"; +import { Type } from "../../fhir/constraints"; +import { createEuSignedTestQr } from "./createEuSignedTestQr"; +const { trace } = getLogger("src/models/euHealthCert/createEuTestCert"); const { euSigner, swabTestTypes } = config; export const createEuTestCert = ( - testData: TestData[], + parsedFhirBundle: ParsedBundle, reference: string, storedUrl: string ): EuHealthCert[] => { @@ -22,15 +21,19 @@ export const createEuTestCert = ( const testHealthCerts: EuHealthCert[] = []; let incrementTestNumber = 1; - testData.forEach((item) => { + parsedFhirBundle.observations.forEach((item) => { + parsedFhirBundle.patient.fullName; const euName: EuNameParams = { - fnt: item.patientName.replace(/ /g, "<").toUpperCase(), + fnt: parsedFhirBundle.patient.fullName.replace(/ /g, "<").toUpperCase(), }; - const dob = item.birthDate?.split("/")?.reverse()?.join("-"); + const dob = parsedFhirBundle.patient.birthDate + .split("/") + ?.reverse() + ?.join("-"); const meta: notarise.NotarisationMetadata = { reference, notarisedOn: dateString, - passportNumber: item.passportNumber, + passportNumber: parsedFhirBundle.patient.passportNumber, url: storedUrl, }; // Set increment dose number + reference @@ -38,19 +41,17 @@ export const createEuTestCert = ( // Set Unique Cert Id with prefix + version + country + unique ref const UniqueCertificateId = `URN:UVCI:01:SG:${uniqueRef}`; const euDccTestResultCode = Object.values(EUDccTestResult).includes( - item.testResultCode + item.observation.result.code as string ) - ? item.testResultCode - : _.get(EUDccTestResult, item.testResultCode, null); + ? item.observation.result.code + : _.get(EUDccTestResult, item.observation.result.code as string, null); const testGroup: EuTestParams = { tg: "840539006", tt: "LP6464-4", // need to confirm with MOH for for Serology, it can either be [Nucleic acid amplification with probe detection] or [Rapid immunoassay] - sc: moment - .tz(item.swabCollectionDate, "M/D/YY h:mm:ss A", "Asia/Singapore") - .format(), + sc: item.specimen.collectionDateTime, tr: euDccTestResultCode, - tc: item.provider, + tc: item.organization.lhp.fullName, co: "SG", is: euSigner.name, ci: UniqueCertificateId, @@ -58,19 +59,21 @@ export const createEuTestCert = ( // check swab test type is valid PCR Nasal or PCR Saliva if ( [swabTestTypes.PCR_NASAL, swabTestTypes.PCR_SALIVA].includes( - item.swabTypeCode + item.specimen.swabType.code as string ) ) { testGroup.tt = "LP6464-4"; // test type code for PCR test [Nucleic acid amplification with probe detection] - testGroup.nm = item.testType; - } else if (item.swabTypeCode === swabTestTypes.ART) { + testGroup.nm = item.observation.testType.display; + } else if (item.specimen.swabType.code === swabTestTypes.ART) { testGroup.tt = "LP217198-3"; // test type code for ART test [Rapid immunoassay] - testGroup.ma = item.deviceIdentifier; + testGroup.ma = item.device?.type.code; } // generate test cert only for PCR Nasal, PCR Saliva and ART which have valid test result code if ( euDccTestResultCode && - Object.values(swabTestTypes).includes(item.swabTypeCode) + Object.values(swabTestTypes).includes( + item.specimen.swabType.code as string + ) ) { testHealthCerts.push({ ver: fhirVersion, @@ -85,3 +88,38 @@ export const createEuTestCert = ( return testHealthCerts; }; + +export const generateEuHealthCert = async ( + type: Type, + parsedFhirBundle: ParsedBundle, + reference: string, + storedUrl: string +): Promise => { + const traceWithRef = trace.extend(`reference:${reference}`); + const { PdtTypes } = pdtHealthCertV2; + let signedEuHealthCerts: notarise.SignedEuHealthCert[] = []; + if ( + (_.isString(type) && (type === PdtTypes.Art || type === PdtTypes.Pcr)) || + type.includes(PdtTypes.Art) || + type.includes(PdtTypes.Pcr) + ) { + traceWithRef("signedEuHealthCerts: Generating EU test cert..."); + const euTestCerts = createEuTestCert( + parsedFhirBundle, + reference, + storedUrl + ); + traceWithRef(euTestCerts); + signedEuHealthCerts = await createEuSignedTestQr(euTestCerts); + if (!signedEuHealthCerts.length) { + throw new Error( + `Generated EU Vacc Cert is invalid: signedEuHealthCerts has 0 entries` + ); + } + } else { + traceWithRef( + `signedEuHealthCerts: Unsupported test type - ${JSON.stringify(type)}` + ); + } + return signedEuHealthCerts; +}; diff --git a/src/models/healthCert.test.ts b/src/models/healthCert.test.ts deleted file mode 100644 index 5069765a..00000000 --- a/src/models/healthCert.test.ts +++ /dev/null @@ -1,366 +0,0 @@ -import exampleHealthCertWithNric from "../../test/fixtures/v1/example_healthcert_with_nric_unwrapped.json"; -import exampleHealthCertWithoutNric from "../../test/fixtures/v1/example_healthcert_without_nric_unwrapped.json"; -import exampleMultiResultHealthCert from "../../test/fixtures/v1/example_healthcert_multi_result_unwrapped.json"; -import exampleArtHealthCertWithNric from "../../test/fixtures/v1/example_art_healthcert_with_nric_unwrapped.json"; -import { - getParticularsFromHealthCert, - getTestDataFromHealthCert, -} from "./healthCert"; -import { DataInvalidError } from "../common/error"; -import { parseDateTime } from "./healthCertV2"; - -type testCert = - | typeof exampleHealthCertWithNric - | typeof exampleHealthCertWithoutNric - | typeof exampleMultiResultHealthCert - | typeof exampleArtHealthCertWithNric; -const getSwabCollectionDates = (document: testCert): string[] => { - const entries: any[] = document.fhirBundle.entry; - return entries - .filter((entry) => entry?.collection?.collectedDateTime != null) - .map((entry) => entry.collection.collectedDateTime); -}; - -const getObservationDates = (document: testCert): (string | undefined)[] => { - const entries: any[] = document.fhirBundle.entry; - return entries - .filter((entry) => entry?.effectiveDateTime != null) - .map((entry) => entry.effectiveDateTime); -}; - -describe("src/models/healthCert", () => { - describe("getParticularsFromHealthCert", () => { - test("should correctly extract patient particulars from a well formed healthcert containing nric", () => { - expect( - getParticularsFromHealthCert(exampleHealthCertWithNric as any) - ).toStrictEqual({ - nric: "S9098989Z", - fin: undefined, - passportNumber: "E7831177G", - }); - }); - test("should correctly extract patient particulars from a well formed healthcert without nric", () => { - expect( - getParticularsFromHealthCert(exampleHealthCertWithoutNric as any) - ).toStrictEqual({ - nric: undefined, - fin: undefined, - passportNumber: "E7831177G", - }); - }); - }); - describe("getTestDataFromHealthCert", () => { - describe("single observation flow", () => { - test("should correctly extract test data from a well formed ART healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleArtHealthCertWithNric - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleArtHealthCertWithNric - ); - - const swabCollectionDate = parseDateTime(swabCollectionDates[0]); - const observationDate = parseDateTime(observationDates[0]); - expect( - getTestDataFromHealthCert(exampleArtHealthCertWithNric as any) - ).toStrictEqual([ - { - lab: undefined, - nric: "S9098989Z", - observationDate, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "MCR 123214", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate, - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testResult: "Negative", - testResultCode: "260385009", - testCode: "97097-0", - testType: - "SARS-CoV-2 (COVID-19) Ag [Presence] in Upper respiratory specimen by Rapid immunoassay", - deviceIdentifier: "1232", - }, - ]); - }); - - test("should throw error if ART healthcert not have device identifier", () => { - const malformedHealthCert = exampleArtHealthCertWithNric as any; - malformedHealthCert.fhirBundle.entry.pop(); - expect(() => - getTestDataFromHealthCert(malformedHealthCert) - ).toThrowError(DataInvalidError); - }); - - test("should correctly extract test data from a well formed PCR healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleHealthCertWithNric - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleHealthCertWithNric - ); - - const swabCollectionDate = parseDateTime(swabCollectionDates[0]); - const observationDate = parseDateTime(observationDates[0]); - - expect( - getTestDataFromHealthCert(exampleHealthCertWithNric as any) - ).toStrictEqual([ - { - lab: "MacRitchie Laboratory", - nric: "S9098989Z", - observationDate, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "MCR 123214", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate, - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ]); - }); - - test("should throw error if observation object not found", () => { - const malformedHealthCert = { - fhirBundle: { - entry: [ - { - resourceType: "Teletubby", - identifier: [{ type: "NAME", value: "Lala" }], - }, - ], - }, - }; - - expect(() => - getTestDataFromHealthCert(malformedHealthCert as any) - ).toThrowError(DataInvalidError); - }); - - test("should throw error if valueCodeableConcept missing", () => { - const malformedHealthCertWithoutValueCodeableConcept = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - getTestDataFromHealthCert( - malformedHealthCertWithoutValueCodeableConcept as any - ) - ).toThrowError(DataInvalidError); - }); - - test("should throw error if code missing", () => { - const malformedHealthCertWithoutCode = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - getTestDataFromHealthCert(malformedHealthCertWithoutCode as any) - ).toThrowError(DataInvalidError); - }); - - test("should throw error if specimen reference is missing", () => { - const malformedHealthCertWithoutSpecimenReference = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - getTestDataFromHealthCert( - malformedHealthCertWithoutSpecimenReference as any - ) - ).toThrowError(DataInvalidError); - }); - - test("should throw error if specimen is missing", () => { - const malformedHealthCertWithoutSpecimen = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - ], - }, - }; - expect(() => - getTestDataFromHealthCert(malformedHealthCertWithoutSpecimen as any) - ).toThrowError(DataInvalidError); - }); - }); - describe("multi observation flow", () => { - test("should correctly extract test data from a well formed healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleMultiResultHealthCert - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleMultiResultHealthCert - ); - - const swabCollectionDate1 = parseDateTime(swabCollectionDates[0]); - const observationDate1 = parseDateTime(observationDates[0]); - const swabCollectionDate2 = parseDateTime(swabCollectionDates[1]); - const observationDate2 = parseDateTime(observationDates[1]); - - expect( - getTestDataFromHealthCert(exampleMultiResultHealthCert as any) - ).toStrictEqual([ - { - lab: "MacRitchie Laboratory", - nric: "S9098989Z", - observationDate: observationDate1, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "MCR 123214", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate: swabCollectionDate1, - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - { - lab: "MacRitchie Laboratory2", - nric: "S9098989Z", - observationDate: observationDate2, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "MCR 123214", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic2", - swabCollectionDate: swabCollectionDate2, - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ]); - }); - }); - }); -}); diff --git a/src/models/healthCert.ts b/src/models/healthCert.ts deleted file mode 100644 index b281add2..00000000 --- a/src/models/healthCert.ts +++ /dev/null @@ -1,228 +0,0 @@ -// @ts-nocheck -// TODO: remove no check. The code to get test data was copied from health cert renderer which also did not enforce type safety -import { Patient } from "@govtechsg/oa-schemata/dist/types/__generated__/sg/gov/moh/pdt-healthcert/1.0/schema"; -import { pdtHealthCertV1 as healthcert } from "@govtechsg/oa-schemata"; -import { HealthCertDocument, TestData } from "../types"; -import { validateHealthCertData } from "../common/healthCertDataValidation"; -import { DataInvalidError } from "../common/error"; -import { getNationality } from "../common/nationality"; -import { parseDateTime } from "./healthCertV2"; - -const getPatientFromHealthCert = (document: HealthCertDocument) => - document.fhirBundle.entry.find( - (entry) => entry?.resourceType === "Patient" - ) as Patient | undefined; - -export const getParticularsFromHealthCert = (document: HealthCertDocument) => { - const patient = getPatientFromHealthCert(document); - - const nric = patient?.identifier?.find( - (identifierEntry) => - identifierEntry.type instanceof Object && - identifierEntry.type.text === "NRIC" - ); - - const fin = patient?.identifier?.find( - (identifierEntry) => - identifierEntry.type instanceof Object && - identifierEntry.type.text === "FIN" - ); - - const ppn = patient?.identifier?.find( - (identifierEntry) => identifierEntry.type === "PPN" - ); - - return { nric: nric?.value, fin: fin?.value, passportNumber: ppn?.value }; -}; - -export const getTestDataFromHealthCert = ( - document: HealthCertDocument -): TestData[] => { - const patient = document.fhirBundle.entry.find( - (entry) => entry.resourceType === "Patient" - ); - const observations = document.fhirBundle.entry.filter( - (entry) => entry.resourceType === "Observation" - ); - const device = document.fhirBundle.entry.find( - (entry) => entry.resourceType === "Device" - ); - - const { passportNumber, nric } = getParticularsFromHealthCert(document); - - const patientName = - typeof patient?.name?.[0] === "object" ? patient?.name?.[0].text : ""; - const patientNationality = patient?.extension?.find( - (extension) => - extension.url === - "http://hl7.org/fhir/StructureDefinition/patient-nationality" - ); - const deviceIdentifier = - typeof device?.type?.coding?.[0] === "object" - ? device?.type?.coding?.[0].code - : null; - - const testData = []; - - // backward compatibility for healthcerts with no full url and only one test. auto resolve to first match instead - if (observations.length === 1) { - const observation = observations[0]; - const specimen = document.fhirBundle.entry.find( - (entry) => entry.resourceType === "Specimen" - ); - const provider = document.fhirBundle.entry.find( - (entry) => - entry.resourceType === "Organization" && - entry.type === "Licensed Healthcare Provider" - ); - const lab = document.fhirBundle.entry.find( - (entry) => - entry.resourceType === "Organization" && - entry.type === "Accredited Laboratory" - ); - - const testCode = observation?.code?.coding?.[0]?.code; - const testType = observation?.code?.coding?.[0]?.display; - - let testResult = observation?.valueCodeableConcept?.coding[0]?.display; - const testResultCode = observation?.valueCodeableConcept?.coding?.[0]?.code; - const codesDict: Record = { - "260385009": "Negative", - "10828004": "Positive", - }; - if (testResultCode && testResultCode in codesDict) { - testResult = codesDict[testResultCode]; - } - - const swabType = - typeof specimen?.type === "object" - ? specimen?.type.coding?.[0] - : undefined; - const swabCollectionDate = parseDateTime( - specimen?.collection?.collectedDateTime - ); - - const performerName = observation?.performer?.name?.[0]?.text; - const performerMcr = observation?.qualification?.[0]?.identifier; - const observationDate = parseDateTime(observation?.effectiveDateTime); - const nationality = getNationality(patientNationality?.code?.text ?? ""); - const gender = - patient?.gender?.toLowerCase() === healthcert.Gender.Female.toLowerCase() - ? "She" - : "He"; - - const testDataValue: TestData = { - provider: provider?.name, - lab: lab?.name, - swabType: swabType?.display, - swabTypeCode: swabType?.code, - patientName, - swabCollectionDate, - performerName, - performerMcr, - observationDate, - nric, - passportNumber, - birthDate: patient?.birthDate?.split("-")?.reverse()?.join("/"), - testCode, - testType, - nationality, - gender, - testResult, - testResultCode, - }; - - if (deviceIdentifier) { - testDataValue.deviceIdentifier = deviceIdentifier; - } - testData.push(testDataValue); - } else { - observations.forEach((observation) => { - const specimenReference = observation?.specimen?.reference; - const organisationReferences = observation?.performerReference?.map( - (organisation) => organisation?.reference - ); - - // certs with multiple observations need to have reference to point the right specimens and organisations to the observation - if (!specimenReference || !organisationReferences) { - throw new DataInvalidError(["observation references"]); - } - - const specimen = document.fhirBundle.entry.find( - (entry) => - entry.resourceType === "Specimen" && - entry?.fullUrl === specimenReference - ); - const provider = document.fhirBundle.entry.find( - (entry) => - entry.resourceType === "Organization" && - entry.type === "Licensed Healthcare Provider" && - organisationReferences.includes(entry?.fullUrl) - ); - const lab = document.fhirBundle.entry.find( - (entry) => - entry.resourceType === "Organization" && - entry.type === "Accredited Laboratory" && - organisationReferences.includes(entry?.fullUrl) - ); - const testCode = observation?.code?.coding?.[0]?.code; - const testType = observation?.code?.coding?.[0]?.display; - let testResult = observation?.valueCodeableConcept?.coding[0]?.display; - const testResultCode = - observation?.valueCodeableConcept?.coding?.[0]?.code; - const codesDict: Record = { - "260385009": "Negative", - "10828004": "Positive", - }; - if (testResultCode && testResultCode in codesDict) { - testResult = codesDict[testResultCode]; - } - const swabType = - typeof specimen?.type === "object" - ? specimen?.type.coding?.[0] - : undefined; - const swabCollectionDate = parseDateTime( - specimen?.collection?.collectedDateTime - ); - - const performerName = observation?.performer?.name?.[0]?.text; - const performerMcr = observation?.qualification?.[0]?.identifier; - const observationDate = parseDateTime(observation?.effectiveDateTime); - - const nationality = getNationality(patientNationality?.code?.text ?? ""); - const gender = - patient?.gender?.toLowerCase() === - healthcert.Gender.Female.toLowerCase() - ? "She" - : "He"; - - const testDataValue: TestData = { - provider: provider?.name, - lab: lab?.name, - swabType: swabType?.display, - swabTypeCode: swabType?.code, - patientName, - swabCollectionDate, - performerName, - performerMcr, - observationDate, - nric, - passportNumber, - birthDate: patient?.birthDate?.split("-")?.reverse()?.join("/"), - testCode, - testType, - nationality, - gender, - testResult, - testResultCode, - }; - - if (deviceIdentifier) { - testDataValue.deviceIdentifier = deviceIdentifier; - } - testData.push(testDataValue); - }); - } - validateHealthCertData(testData); - return testData; -}; diff --git a/src/models/healthCertV2.test.ts b/src/models/healthCertV2.test.ts deleted file mode 100644 index bfe3f3f1..00000000 --- a/src/models/healthCertV2.test.ts +++ /dev/null @@ -1,404 +0,0 @@ -import { R4 } from "@ahryman40k/ts-fhir-types"; -import exampleHealthCertWithNric from "../../test/fixtures/v2/pdt_pcr_with_nric_unwrapped.json"; -import exampleHealthCertWithoutNric from "../../test/fixtures/v2/pdt_pcr_without_nric_unwrapped.json"; -import exampleMultiResultHealthCert from "../../test/fixtures/v2/pdt_pcr_ser_multi_result_unwrapped.json"; -import exampleArtHealthCertWithNric from "../../test/fixtures/v2/pdt_art_with_nric_unwrapped.json"; -import { getTestDataFromParseFhirBundle, parseDateTime } from "./healthCertV2"; -import fhirHelper from "./fhir"; - -type testCert = - | typeof exampleHealthCertWithNric - | typeof exampleHealthCertWithoutNric - | typeof exampleMultiResultHealthCert - | typeof exampleArtHealthCertWithNric; -const getSwabCollectionDates = (document: testCert): string[] => { - const entries: any[] = document.fhirBundle.entry; - return entries - .filter((entry) => entry?.resource?.collection?.collectedDateTime != null) - .map((entry) => entry.resource.collection.collectedDateTime); -}; - -const getObservationDates = (document: testCert): (string | undefined)[] => { - const entries: any[] = document.fhirBundle.entry; - return entries - .filter((entry) => entry?.resource?.effectiveDateTime != null) - .map((entry) => entry.resource.effectiveDateTime); -}; - -describe("src/models/healthCertV2", () => { - describe("getParticularsFromHealthCert", () => { - test("should correctly extract patient particulars from a well formed healthcert containing nric", () => { - const parseFhirBundle = fhirHelper.parse( - exampleHealthCertWithNric.fhirBundle as R4.IBundle - ); - expect(getTestDataFromParseFhirBundle(parseFhirBundle)).toStrictEqual([ - { - birthDate: "15/01/1990", - gender: "She", - lab: "MacRitchie Laboratory", - nationality: "Singaporean", - nric: "S9098989Z", - observationDate: "9/28/20 2:15:00 PM GMT+08:00", - passportNumber: "E7831177G", - patientName: "Tan Chen Chen", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate: "9/27/20 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection", - }, - ]); - }); - test("should correctly extract patient particulars from a well formed healthcert without nric", () => { - const parseFhirBundle = fhirHelper.parse( - exampleHealthCertWithoutNric.fhirBundle as R4.IBundle - ); - expect(getTestDataFromParseFhirBundle(parseFhirBundle)).toStrictEqual([ - { - birthDate: "15/01/1990", - gender: "She", - lab: "MacRitchie Laboratory", - nationality: "Singaporean", - nric: "", - observationDate: "9/28/20 2:15:00 PM GMT+08:00", - passportNumber: "E7831177G", - patientName: "Tan Chen Chen", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate: "9/27/20 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection", - }, - ]); - }); - }); - describe("getTestDataFromHealthCert", () => { - describe("single observation flow", () => { - test("should correctly extract test data from a well formed ART healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleArtHealthCertWithNric - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleArtHealthCertWithNric - ); - - const swabCollectionDate = parseDateTime(swabCollectionDates[0]); - const observationDate = parseDateTime(observationDates[0]); - const parseFhirBundle = fhirHelper.parse( - exampleArtHealthCertWithNric.fhirBundle as R4.IBundle - ); - expect(getTestDataFromParseFhirBundle(parseFhirBundle)).toStrictEqual([ - { - lab: undefined, - nric: "S9098989Z", - observationDate, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate, - swabType: "Anterior nares swab", - swabTypeCode: "697989009", - testResult: "Negative", - testResultCode: "260385009", - testCode: "97097-0", - testType: - "SARS-CoV-2 (COVID-19) Ag [Presence] in Upper respiratory specimen by Rapid immunoassay", - deviceIdentifier: "1232", - }, - ]); - }); - - test("should correctly extract test data from a well formed PCR healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleHealthCertWithNric - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleHealthCertWithNric - ); - - const swabCollectionDate = parseDateTime(swabCollectionDates[0]); - const observationDate = parseDateTime(observationDates[0]); - const parseFhirBundle = fhirHelper.parse( - exampleHealthCertWithNric.fhirBundle as R4.IBundle - ); - expect(getTestDataFromParseFhirBundle(parseFhirBundle)).toStrictEqual([ - { - lab: "MacRitchie Laboratory", - nric: "S9098989Z", - observationDate, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate, - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection", - }, - ]); - }); - - test("should throw error if observation object not found", () => { - const malformedHealthCert = { - fhirBundle: { - entry: [ - { - resourceType: "Teletubby", - identifier: [{ type: "NAME", value: "Lala" }], - }, - ], - }, - }; - expect(() => - // @ts-ignore - fhirHelper.parse(malformedHealthCert.fhirBundle as R4.IBundle) - ).toThrowError(Error); - }); - - test("should throw error if valueCodeableConcept missing", () => { - const malformedHealthCertWithoutValueCodeableConcept = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - fhirHelper.parse( - // @ts-ignore - malformedHealthCertWithoutValueCodeableConcept.fhirBundle as R4.IBundle - ) - ).toThrowError(Error); - }); - - test("should throw error if code missing", () => { - const malformedHealthCertWithoutCode = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - fhirHelper.parse( - // @ts-ignore - malformedHealthCertWithoutCode.fhirBundle as R4.IBundle - ) - ).toThrowError(Error); - }); - - test("should throw error if specimen reference is missing", () => { - const malformedHealthCertWithoutSpecimenReference = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - { - resourceType: "Specimen", - collection: { - collectedDateTime: "2020-09-27T06:15:00Z", - }, - }, - ], - }, - }; - expect(() => - fhirHelper.parse( - // @ts-ignore - malformedHealthCertWithoutSpecimenReference.fhirBundle as R4.IBundle - ) - ).toThrowError(Error); - }); - - test("should throw error if specimen is missing", () => { - const malformedHealthCertWithoutSpecimen = { - fhirBundle: { - entry: [ - { - resourceType: "Observation", - specimen: { - reference: "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d", - }, - valueCodeableConcept: { - coding: [ - { - system: "http://snomed.info/sct", - code: "260385009", - display: "Negative", - }, - ], - }, - code: { - coding: [ - { - system: "http://loinc.org", - code: "94531-1", - display: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", - }, - ], - }, - }, - ], - }, - }; - expect(() => - fhirHelper.parse( - // @ts-ignore - malformedHealthCertWithoutSpecimen.fhirBundle as R4.IBundle - ) - ).toThrowError(Error); - }); - }); - describe("multi observation flow", () => { - test("should correctly extract test data from a well formed healthcert", () => { - const swabCollectionDates: string[] = getSwabCollectionDates( - exampleMultiResultHealthCert - ); - const observationDates: (string | undefined)[] = getObservationDates( - exampleMultiResultHealthCert - ); - - const swabCollectionDate1 = parseDateTime(swabCollectionDates[0]); - const observationDate1 = parseDateTime(observationDates[0]); - const swabCollectionDate2 = parseDateTime(swabCollectionDates[1]); - const observationDate2 = parseDateTime(observationDates[1]); - - const parseFhirBundle = fhirHelper.parse( - exampleMultiResultHealthCert.fhirBundle as R4.IBundle - ); - - expect(getTestDataFromParseFhirBundle(parseFhirBundle)).toStrictEqual([ - { - lab: "MacRitchie Laboratory", - nric: "S9098989Z", - observationDate: observationDate1, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate: swabCollectionDate1, - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94531-1", - testType: - "SARS-CoV-2 (COVID-19) RNA panel - Respiratory specimen by NAA with probe detection", - }, - { - lab: "MacRitchie Laboratory", - nric: "S9098989Z", - observationDate: observationDate2, - passportNumber: "E7831177G", - birthDate: "15/01/1990", - patientName: "Tan Chen Chen", - nationality: "Singaporean", - gender: "She", - performerMcr: "123456", - performerName: "Dr Michael Lim", - provider: "MacRitchie Medical Clinic", - swabCollectionDate: swabCollectionDate2, - swabType: "Venipuncture", - swabTypeCode: "22778000", - testResult: "Negative", - testResultCode: "260385009", - testCode: "94661-6", - testType: - "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", - }, - ]); - }); - }); - }); -}); diff --git a/src/models/healthCertV2.ts b/src/models/healthCertV2.ts deleted file mode 100644 index 30592716..00000000 --- a/src/models/healthCertV2.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { pdtHealthCertV2 as healthcert } from "@govtechsg/oa-schemata"; -import moment from "moment-timezone"; -import { TestData } from "src/types"; -import { getNationality } from "../common/nationality"; -import { ParsedBundle } from "./fhir/types"; - -export const codesDict: Record = { - "260385009": "Negative", - "10828004": "Positive", -}; - -export const parseDateTime = (dateString: string | undefined): string => - dateString - ? `${moment - .tz(dateString, "Asia/Singapore") - .format("M/D/YY h:mm:ss A")} GMT+08:00` - : ""; - -export const getTestDataFromParseFhirBundle = ( - parseFhirBundle: ParsedBundle -): TestData[] => { - const testData: TestData[] = []; - parseFhirBundle.observations.forEach((observationGroup) => { - const testResultCode = observationGroup.observation.result?.code || ""; - const testResult = - testResultCode && testResultCode in codesDict - ? codesDict[testResultCode] - : ""; - - const testCode = observationGroup.observation.testType?.code; - const testType = observationGroup.observation.testType?.display; - - const gender = - parseFhirBundle.patient?.gender?.toLowerCase() === - healthcert.Gender.Female.toLowerCase() - ? "She" - : "He"; - - const testDataValue: TestData = { - provider: observationGroup.organization.lhp?.fullName, - lab: observationGroup.organization.al?.fullName, - swabType: observationGroup.specimen.swabType?.display || "", - swabTypeCode: observationGroup.specimen.swabType?.code || "", - patientName: parseFhirBundle.patient?.fullName, - swabCollectionDate: parseDateTime( - observationGroup.specimen.collectionDateTime - ), - performerName: observationGroup.practitioner?.fullName, - performerMcr: observationGroup.practitioner?.mcr, - observationDate: parseDateTime( - observationGroup.observation?.effectiveDateTime - ), - nric: parseFhirBundle.patient?.nricFin || "", - passportNumber: parseFhirBundle.patient?.passportNumber, - birthDate: parseFhirBundle.patient?.birthDate - ?.split("-") - ?.reverse() - ?.join("/"), - testCode: testCode || "", - testType: testType || "", - nationality: getNationality(parseFhirBundle.patient?.nationality?.code), - gender, - testResult, - testResultCode, - }; - - if (observationGroup.device) { - testDataValue.deviceIdentifier = observationGroup.device.type.code; - } - testData.push(testDataValue); - }); - return testData; -}; diff --git a/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.test.ts b/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.test.ts deleted file mode 100644 index 3cbe804b..00000000 --- a/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.test.ts +++ /dev/null @@ -1,409 +0,0 @@ -import { getData } from "@govtechsg/open-attestation"; -import { notarise } from "@govtechsg/oa-schemata"; -import { createNotarizedHealthCert } from "./createNotarizedHealthCert"; -import exampleHealthcertWrapped from "../../../../test/fixtures/v1/example_healthcert_with_nric_wrapped.json"; -import { mockDate, unmockDate } from "../../../../test/utils"; - -const sampleDocument = exampleHealthcertWrapped as any; -const uuid = "e35f5d2a-4198-4f8f-96dc-d1afe0b67119"; -const storedUrl = "https://example.com"; -const sampleSignedEuHealthCerts: notarise.SignedEuHealthCert[] = [ - { - type: "PCR", - qr: "HC1:abcde", - expiryDateTime: "2022-12-17T01:27:50.263Z", - }, -]; - -beforeAll(mockDate); -afterAll(unmockDate); - -it("should wrap a document and sign the document", async () => { - const createdDocument = await createNotarizedHealthCert( - sampleDocument, - uuid, - storedUrl - ); - const documentData = getData(createdDocument); - expect(documentData).toMatchInlineSnapshot( - documentData, - ` - Object { - "$template": Object { - "name": "HEALTH_CERT", - "type": "EMBEDDED_RENDERER", - "url": "https://healthcert.renderer.moh.gov.sg/", - }, - "attachments": Array [ - Object { - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiYTFjMmQyODItNmMxZi00ZTQyLWEzMzUtZTg4OGRhNGQxYjM0OnN0cmluZzpURVNUMDAxIiwibmFtZSI6ImMyNzI3NTNkLWRjYTItNDk5Zi1iNTQzLTM4MTQ0OWU4NTA3NDpzdHJpbmc6SGVhbHRoQ2VydCIsInZhbGlkRnJvbSI6IjhjMWVlYWVkLWU4MTItNDliMi1iZTY2LTg2OGIxZmNiNDJmZTpzdHJpbmc6MjAyMC0xMS0yMCIsImZoaXJWZXJzaW9uIjoiNTg2ZDQ4NjEtYzlmZC00ZmE4LTk0NmEtMWIwZGJiMzY2MWM5OnN0cmluZzo0LjAuMSIsImZoaXJCdW5kbGUiOnsicmVzb3VyY2VUeXBlIjoiM2ZkOWI1MjAtN2JiYS00NzczLWJjMTgtMTZmMGY1N2U0NjlmOnN0cmluZzpCdW5kbGUiLCJ0eXBlIjoiMGRkNDZkZGEtODY0Yy00ZTgwLWI0NmUtYzc4MDE2MjFmYzdmOnN0cmluZzpjb2xsZWN0aW9uIiwiZW50cnkiOlt7InJlc291cmNlVHlwZSI6IjdkMTI5MWJiLWIxMTQtNDI0Yi1iMDY2LTE1ZmQyMmFlOWRiNTpzdHJpbmc6UGF0aWVudCIsImV4dGVuc2lvbiI6W3sidXJsIjoiMmVlNGRmNjItYjViZS00MWQ0LWI4ZWYtYWI4ZTE4NTdlMjA4OnN0cmluZzpodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vcGF0aWVudC1uYXRpb25hbGl0eSIsImNvZGUiOnsidGV4dCI6ImVhOTUzMmQ1LTlhMmQtNDRlYS05ZDFlLTlmZDMyN2M4MzY0NTpzdHJpbmc6U0cifX1dLCJpZGVudGlmaWVyIjpbeyJ0eXBlIjoiMDExYzEzYmUtMzE5Ny00ZDA4LTk0ZTMtYzNkMzExZTgxNjNkOnN0cmluZzpQUE4iLCJ2YWx1ZSI6ImEwZTE0YTUwLTZkMGUtNDk4Ni1iYWE1LThmMmQyZDZkNTZlYjpzdHJpbmc6RTc4MzExNzdHIn0seyJ0eXBlIjp7InRleHQiOiIyZmUyZjIzMy05MzBmLTRlYmItODFmZi1iYmI1MzdhM2Y3ZjI6c3RyaW5nOk5SSUMifSwidmFsdWUiOiI4ODkyMTc2Zi0yZGMzLTQ0ODctOTc1Ni1iOWJmNWUyN2EwYmI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjM0OGY0YThiLTBiMTktNDkyZi05YThhLTk0MTkxZjE3NDg1YzpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNWE3MWI3Y2ItMWNkNy00NzBjLTgzMWItYzBiMDkzMDJmMmZjOnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiIzN2ZhODRjNy0yMjg1LTQ0N2EtOTRmOS04MWUyMzA2MTY2MTE6c3RyaW5nOjE5OTAtMDEtMTUifSx7InJlc291cmNlVHlwZSI6IjQ2NjUxMzk3LTlhMzAtNDFkYS1iOGQ1LTVlMzk2MTRjMzM1YjpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYWM5NjQ3ODAtOWFiNS00M2U2LTg3NmMtN2Y2M2IxMjIxNDlkOnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6IjgwYTM3YTM0LWZhYjEtNGZjOS1iOGFjLWUzNGVkYTZhNDA2YTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjdmMDFmMGUwLTIxN2UtNDFhYi04MTA1LWUzOGYwMmViNWUxNzpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI1MjcwODc5Yi05OTBkLTRlN2EtYmM3Ny1jNWU5ZWJkZjM5NWY6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19LHsicmVzb3VyY2VUeXBlIjoiNjY2M2I0NjEtYWYwYy00YTI0LWI3ODgtNThiOGY3MjM3NjE5OnN0cmluZzpPYnNlcnZhdGlvbiIsImlkZW50aWZpZXIiOlt7InZhbHVlIjoiNzFlYmNkYWMtOTU1My00MmFmLWE3M2ItNmJlYTQyNmM3MzVhOnN0cmluZzoxMjM0NTY3ODkiLCJ0eXBlIjoiYzQxMjliMWMtY2U5NC00ZDk5LWI4NTktMjc2NzQ2OTJlYzc2OnN0cmluZzpBQ1NOIn1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMzdkZDBjMTMtZGMxMy00ZDY4LWFhZDYtMzgwOGMzNzg2NWViOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6IjUwYmUwOWE4LTAwNzMtNGUxMS1iMGNkLWZjOTg5NGM4OGYzMjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiI5YmYxOWFkNC1jMTFiLTQzOWUtOWUxNS05ZTJmODhiZGY5Nzg6c3RyaW5nOlJldmVyc2UgdHJhbnNjcmlwdGlvbiBwb2x5bWVyYXNlIGNoYWluIHJlYWN0aW9uIChyUlQtUENSKSB0ZXN0In1dfSwidmFsdWVDb2RlYWJsZUNvbmNlcHQiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI0YWQ1ODBiNS1iYWQ2LTQxZjEtYmJkYS0xZDlmNGY5ODFiY2M6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNWM2NTRlMWUtNmNjOS00NGViLTllOTktNGU5ZGVjZDU2ODZjOnN0cmluZzoyNjAzODUwMDkiLCJkaXNwbGF5IjoiNzI2Y2E5NjgtMjk0MS00Yzc2LTg3MWQtYWM1N2JhOWNkMDVmOnN0cmluZzpOZWdhdGl2ZSJ9XX0sImVmZmVjdGl2ZURhdGVUaW1lIjoiYzhlYzhhNWYtYWY1ZS00MzYyLTgwM2YtZGMyNzAwM2ZhYjEzOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsInN0YXR1cyI6IjFlYTBkZmE5LWRiMzQtNDFlMy1hNDkwLWRkZWQ0YjM1NGExOTpzdHJpbmc6ZmluYWwiLCJwZXJmb3JtZXIiOnsibmFtZSI6W3sidGV4dCI6ImE3NzI1MDE5LWNkNDYtNDEyNS05MDAzLTdmNDE2NGMyOTY2MjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV19LCJxdWFsaWZpY2F0aW9uIjpbeyJpZGVudGlmaWVyIjoiMDExMTY1OWEtNTRhMi00MjYwLWJlMzUtZDNlMmQzZmVlYTAwOnN0cmluZzpNQ1IgMTIzMjE0IiwiaXNzdWVyIjoiZjQzNTRjYzQtYzJhOS00YTk2LWE1OTQtODE1YmNkY2FmNjdjOnN0cmluZzpNT0gifV19LHsicmVzb3VyY2VUeXBlIjoiNDc0ODg4NjYtNjkyMC00MWIwLWJjNzMtMDM1ZmMxMDY3MDFmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiNzc3OGM2ZTgtZTI5My00NzJiLWJiNmEtNDNmMWFiNDg1YzlkOnN0cmluZzpNYWNSaXRjaGllIE1lZGljYWwgQ2xpbmljIiwidHlwZSI6IjA0OGQ1ZGM4LTg1ZmMtNDQyZC1hMThlLTdmY2UwNDk0ZDczNTpzdHJpbmc6TGljZW5zZWQgSGVhbHRoY2FyZSBQcm92aWRlciIsImVuZHBvaW50Ijp7ImFkZHJlc3MiOiI5NjkzYjdhOS0yMzI5LTRiOTgtODVmNi1hNThjNWNlNGI5ZTU6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0sImNvbnRhY3QiOnsidGVsZWNvbSI6W3sic3lzdGVtIjoiYjU5YjI2NDYtNWVjYi00NWM0LThmOGEtODAwYzBjMWI4MDhmOnN0cmluZzpwaG9uZSIsInZhbHVlIjoiZjk5MDMzNjYtMTgyNS00Njc5LWI1MzUtNjk5ODdkZGQyYWQ5OnN0cmluZzorNjU2MzExMzExMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiYmY0OTE0NDYtMDAzMy00NzBlLThhOTQtMjc4ZmIyNWRkZDY2OnN0cmluZzpwaHlzaWNhbCIsInVzZSI6Ijc0ZTEwMTMzLTcyNTUtNGRjNy04NjNiLTgxYjA1MDZiMWFhMjpzdHJpbmc6d29yayIsInRleHQiOiI3NjFlNDI0OC1iNTI0LTRjODctOGM0ZC0xZDYyZTg3ZjhjZWY6c3RyaW5nOk1hY1JpdGNoaWUgSG9zcGl0YWwgVGhvbXNvbiBSb2FkIFNpbmdhcG9yZSAxMjMwMDAifX19LHsicmVzb3VyY2VUeXBlIjoiMTE3YzhjNjQtYzcyNy00ZGY2LWE3YjItMGE1Mjk3YTZjZTFhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMjQzYTliN2ItMzczOC00MWIzLWJiNzQtMGFjY2IyYzFmYWNjOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjoiOTNiMzI4ODgtOTI2MC00NWYyLWE4ZTAtOTE3YzkwOWRiZThkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkiLCJjb250YWN0Ijp7InRlbGVjb20iOlt7InN5c3RlbSI6IjM4MDY3NDQ1LTNkNDctNDYyNS1hYjE0LTNmNjk3MjlkODYwYzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6ImUzNDU2MWNlLWQ0MGEtNDE4NC05ZGRkLTM3ODU3OTIzMjg3ZTpzdHJpbmc6KzY1NjI3MTExODgifV0sImFkZHJlc3MiOnsidHlwZSI6ImNjNTcwZDBkLTUzOWEtNGY0Ny05MjExLTlkMWYzMzZkZmVjMjpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJjMjViZTJhNS04NjUzLTRjZGMtOWQ1ZS0wNjM5OTBmZjY2M2Y6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiOGI0OGYzYzAtNTc1NC00ZmQ3LTk5YTgtMjM0NDNmNDRlOGMzOnN0cmluZzoyIFRob21zb24gQXZlbnVlIDQgU2luZ2Fwb3JlIDA5ODg4OCJ9fX1dfSwiaXNzdWVycyI6W3siaWQiOiI3YzZhNWFmMS1hMTg3LTQ5NTktYjk5My1iYzg1NmZiN2MzYzc6c3RyaW5nOmRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCIsInJldm9jYXRpb24iOnsidHlwZSI6IjhmNmY2OGI0LTQwNzMtNDc5Ni05YTlhLWI4MDM3NmUzNTk4NjpzdHJpbmc6Tk9ORSJ9LCJuYW1lIjoiNGQ2MTRiYzctNDk2NC00YmI5LTkyYjYtNGM4YWQzNmQ3ZTgwOnN0cmluZzpTQU1QTEUgQ0xJTklDIiwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjI3YmE4NjYtYjcxNC00MTcyLWJiOGUtYmFhYzcwYzdmYzJkOnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI5ZGRlN2RjOC1lMTk4LTQ1ZDItYmJjNi1jYzg2NDgyMWEwMzQ6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6Ijg5MjRjOWRhLTYzNjQtNDZhZi04MTc1LTAzMDM1OTk5NWNkNDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCJsb2dvIjoiOGU5NDFkY2ItM2MzNi00NGZiLWFlZTEtODgxMzY2MzQ2ZGY4OnN0cmluZzpkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWZRQUFBRElDQU1BQUFBcHgrUGFBQUFBTTFCTVZFVUFBQURNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16ZUNtaUFBQUFBRUhSU1RsTUFRTCtBN3hBZ24yRFAzekJ3cjFDUEVsK0kvUUFBQndkSlJFRlVlTnJzbmQxMjJ5b1FSdmtISVNITit6L3R5VWs5b1RFQ1ExYlRCYzIzYnlOczBCNUdJREFSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWsrSWsrSWR4NGc1TjRCOUdRL3JQQTlKL0lQZlNnd0wvTUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UDVaUG9QNXI3RkpLQWY3Y3VmQmloUE5Ta1g1aGxBOXUrRHNQN2RYL0pLMVAyVlBpU0lvZWJFckx3Vmg1WngrOEMxWTIyWXRQMEZwZjZoZGVhK21xMVdsaXhmZWo2UmNEeGowOXN3WGJiZUJRcGlqdWcyMGFqL1NFOGJ2bzVoRXVhdkF1U0twUWZKeFRHOTFnVXJDVjZqU1FFMG9Qa2U0d3VrZTcwNUVxcExOV3h0TXRTazRqdlhHbGQrdExseHZWTU5uYWtEN21FbmRZVFZXU25WODYwV1VYbDM0Uk15N0JlbXB5R3pON3BBYm1YRUE2YmZ2SzB1MzJ1VEZLS1ZNMHIwWXcxTVRjRnZwOGlWTFBEMCs5Z0hReSs3clNmM2VlanAySHVGY3NtbGRpRXowRnpLWGZTUnczcWUwOFhxZDlkUDZRS09Obmt1NGxHM05TYi9SQnRLdEt0MXR0ZEJKaVliMlZJN2JyYzd0YzhJWW90SnpIVUIwYytPK1QzclRRdUxLc1pScXB6a1RTN2RaSTR2bytxSm5kRUdPOEV6ZWN5amFjNi9JVE4yS09XYVVMSVQvYUxkZVVucXBkaTdWVzIrS3ljMjlGTDNzN2UzaGk1TFRTaGVXV3B5V2xINFh6bXZXam5pT2lGTjNZV0RpdldJOTJXdWs1Y3QyQzBwM0p6bDlZTjY2V0k1SVYvVnlGODZyMWExN3BINVVNQzBwWC9Ed1hWVTUyNEtzNVlnRFptTDR6R3oxdzgwcDMzUGoxcE12Y2krdGMyY0ZJam1oSDJkV1ZmdWFWTHVMank5ZVR6Z3FPcnFld3YwdnVtLzFLUjQrMmE2RGg1cFhPN1Y5TytzNEtSSlBBRHV4Tmp0akZDQ2svQ2x0RXpnZnpTdGVyU3ZkWlFaZURveXlxeFFndVIxbFhtQmxJLzlQU2ViWnBiT2U4Yml2dDJiRks5WWFLNGVIZTdOTE5hdExQM3FHWUxmTDcxUm9NdkI2WHU5NkozVFd0OUxUb1FNNXptOFlmeGJISUVTUFpYWFcvdG92VFNvK1BxRnhOZXN3WnFqTy9YMDlPdkJnaTlPY0h3N2xsVXVrY3YrZGkwcm5lcWY5OXVYb0tnbE1Nd2FsbDd4L215MG1sUDVwaVZudjNmdVorMTkzeG5wVFlMejNTamVqUExYcE82VHRYYnpYcGZJVWNlSkhtUHNYQUpzYkkrYUw3ZnZzcHBWc09YN3VhZEo5RnZ1VDYzUHhzWkFRM1VNeHlnTHlXdnNrNi9sdWt1NDBmYjh0dG9sREZGYjFaUVE2L21Sa3YxaVc5aTFKNkMvMWFlakFjdlFQVm1VdDZGQjJjbjI2SnpETzRUc2FMY1dlYVRibzdJbjA0WDA4Njk2WHhUbnJrbXpHQ0hpbW1KcEx1TmFQaTcxZitLT2t0ZTVJSzlPclM3NGluZ1BTZkpkMW9JU0Q5WjBtL2hQaEIwbysvTGQzTU1HVXJTVTY4czl5VXpYU08zc3VoVytCaCtKajBveXoyc25acWdwY3pkNWl3cHZSdm1LZlhwWS9QMHllU2ZzZ0hPaGxpd3RMUzdjQlNpUjFhWkZQMzBxK0J0M2ZYYks5aFEyVHIrNHJTYys4ZGZsWENPMmw2cFkrUElzNXBGMXhzNGttYlhWQjZ6MEpXUlJkSCs2QjB3OFZlb3lkZVdsVjg0eGFVTG52WDA4dkV6Tm4rSEpPdSt0ZlQxY1NiS1BMZXd2V2tjL2MxL1l0czRTbEorREhwdW5zRjMwNjlYU3J3N1ZoUWVsNGdITjNRdUhPOGpFay9POGNDK1VvL3BYUit2RzBMU24vWlh4bFh5SW9jNjBQU2hlbGR3dmR6YjRIVzNJNzFwTy8wd0hZcU9JcDh2NDFKVDUyVE5qZjVqeDI0Zm1FOTZXTHJHNy9ic29NNmVoQ0dwSjhzMC9aVjNrOHFuVE9kWDFCNjZIT2diNGI1S1JmdGw1NGZDN292eXZaWnBYdDZKeTRvM1pxZWRPdk1UZHNsUFVoRDBybFd4dlZNRnRTMFAxVU9uUHZXazg0WGRiMERJWFcva0hpTVNMZW03ck1NS0RtdDlKMEhtZ3RLLzNCZzdHaGdPR0xDZ1BUOGFmcDFwZFRFeDQ4ODZuZ3RLRjJjOU9wc2dWRGJPS0NKT1Fha2krMVZyRmkrd3JpSnBmTmEvb3JTaGNyVzI4NmpMWXN5eWZaTGw4U0V0bk02NWoxU0xIK3dYVkc2amMwRFlJOTg2RnVqS0puUUxWMGMxTXJ3N3NPNW4vZnd3RGZrb2o5Z2ZENG96aHlGQVVWTXFCUmxZckNkMG9VblJya2l5RXpPUEZOTEZ6VHpUNVZsQlhkM09tOG96a0J0T09kRFBaa1U5azkvUENwTGtIYXJuWlVmSWhYT3YwLzZJU3YwU09jdmovMWI5dHpma041RzN4N2ViZEloMzRXZkY2dHBEcnJZSzZQVXBkLzRmSlMzYnBYYXJ0T0pOK1NSREJYT3YwbDZtNkV6WjF6MzVsdzlrM1JPMDFXTUZCVTRINCsyMWxNYmI4WHMwdmx2WVZIcDNQVXFLQ2NhT0RVc25iTkxTUjVjVEMrZForcHBWZWxDbkthMTE3ZU5UTlFrU1ZGaVUydFArUXJTT1Z2WlphVUxxd3Z0UENoL2pkTWIzUk45OVFPa29qdjhMc1FTMGsvTzcrdEtmK05NVDk2TlAwVXZMdmluUm05Sm4yNHdWcmJEQ2JHSWRGNHhWQk5KL3hKU2U2VWVvL0JqLzlJLzdEeTBQdnJuSnk1b3BTSVJSWlgwYVFVQUFQelgzaDNVQUFDQVFBeDdZQUQvYW5GQkNOZGFtSUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQW1tb2VLOUh6aUI1STlFQlhueDhBQUFBQUFBQUFBTEJtQUlaS216V0lueHlPQUFBQUFFbEZUa1N1UW1DQyIsIiR0ZW1wbGF0ZSI6eyJuYW1lIjoiN2M0NDIxNzMtMjMwYS00MmNiLTlkY2EtOWViYTIyYWMzNjAzOnN0cmluZzpIRUFMVEhDRVJUIiwidHlwZSI6IjU0MWVjMWE0LTJkYjItNDdjNi04OGNhLTcxZGIxYjczNTlkMzpzdHJpbmc6RU1CRURERURfUkVOREVSRVIiLCJ1cmwiOiI5NzUyM2Y5Yi1lYmY2LTQ2YjYtOTI5YS0wMmRmMTY2YzQ5MTE6c3RyaW5nOmh0dHBzOi8vbW9oLWhlYWx0aGNlcnQtcmVuZGVyZXIubmV0bGlmeS5hcHAvIn19LCJzaWduYXR1cmUiOnsidHlwZSI6IlNIQTNNZXJrbGVQcm9vZiIsInRhcmdldEhhc2giOiJmZjM0M2FhMjQzMjg0MTExN2NlMzNmMWEwYmNlNzU0ODhmYzUxZDg5MDhmZDZmMTMzZWYyZDRhZjE4YjllYmMyIiwicHJvb2YiOltdLCJtZXJrbGVSb290IjoiZmYzNDNhYTI0MzI4NDExMTdjZTMzZjFhMGJjZTc1NDg4ZmM1MWQ4OTA4ZmQ2ZjEzM2VmMmQ0YWYxOGI5ZWJjMiJ9LCJwcm9vZiI6W3sidHlwZSI6Ik9wZW5BdHRlc3RhdGlvblNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMC0xMC0wN1QwOTo1NjoxMC42OTFaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIiLCJzaWduYXR1cmUiOiIweDI5NjYzYTZiZDhiYzA5MTdmMzdkMWIyMGViNjQ0N2M5ZTc4OGQ1MTc3NWNhOWZlYWExZjk4YjYyYWVhODZiYTAyMDIyZjhhMzFkOWE1Y2IwYmU3YWFhYzY1ZDZhMTJkZjc0YmQzZTBlNzkxMTEzMmNiZGUxNzhhMTg2ZTZhMDViMWIifV19", - "filename": "healthcert.txt", - "type": "text/open-attestation", - }, - ], - "fhirBundle": Object { - "entry": Array [ - Object { - "birthDate": "1990-01-15", - "extension": Array [ - Object { - "code": Object { - "text": "SG", - }, - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - }, - ], - "gender": "female", - "identifier": Array [ - Object { - "type": "PPN", - "value": "E7831177G", - }, - Object { - "type": Object { - "text": "NRIC", - }, - "value": "S****989Z", - }, - ], - "name": Array [ - Object { - "text": "Tan Chen Chen", - }, - ], - "resourceType": "Patient", - }, - Object { - "collection": Object { - "collectedDateTime": "2020-09-27T06:15:00Z", - }, - "resourceType": "Specimen", - "type": Object { - "coding": Array [ - Object { - "code": "258500001", - "display": "Nasopharyngeal swab", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "code": Object { - "coding": Array [ - Object { - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test", - "system": "http://loinc.org", - }, - ], - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "identifier": Array [ - Object { - "type": "ACSN", - "value": "123456789", - }, - ], - "performer": Object { - "name": Array [ - Object { - "text": "Dr Michael Lim", - }, - ], - }, - "qualification": Array [ - Object { - "identifier": "MCR 123214", - "issuer": "MOH", - }, - ], - "resourceType": "Observation", - "status": "final", - "valueCodeableConcept": Object { - "coding": Array [ - Object { - "code": "260385009", - "display": "Negative", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "contact": Object { - "address": Object { - "text": "MacRitchie Hospital Thomson Road Singapore 123000", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6563113111", - }, - ], - }, - "endpoint": Object { - "address": "https://www.macritchieclinic.com.sg", - }, - "name": "MacRitchie Medical Clinic", - "resourceType": "Organization", - "type": "Licensed Healthcare Provider", - }, - Object { - "contact": Object { - "address": Object { - "text": "2 Thomson Avenue 4 Singapore 098888", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6562711188", - }, - ], - }, - "name": "MacRitchie Laboratory", - "resourceType": "Organization", - "type": "Accredited Laboratory", - }, - ], - "resourceType": "Bundle", - "type": "collection", - }, - "fhirVersion": "4.0.1", - "id": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "issuers": Array [ - Object { - "id": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E", - "identityProof": Object { - "key": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller", - "location": "moh.gov.sg", - "type": "DNS-DID", - }, - "name": "Ministry of Health (Singapore)", - "revocation": Object { - "type": "NONE", - }, - }, - ], - "logo": "data:image/png;base64,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", - "name": "HealthCert", - "notarisationMetadata": Object { - "notarisedOn": "1970-01-01T00:00:01.000Z", - "passportNumber": "E7831177G", - "reference": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "url": "https://example.com", - }, - "validFrom": "2020-11-20", - } - ` - ); - expect(createdDocument.proof).toHaveLength(1); - expect(createdDocument.proof[0].type).toBe("OpenAttestationSignature2018"); - expect(createdDocument.proof[0].verificationMethod).toBe( - "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller" - ); - expect(createdDocument.proof[0].signature).toBeTruthy(); -}); - -it("should wrap a document and sign the document with signedEuHealthCert", async () => { - const createdDocument = await createNotarizedHealthCert( - sampleDocument, - uuid, - storedUrl, - sampleSignedEuHealthCerts - ); - const documentData = getData(createdDocument); - expect(documentData).toMatchInlineSnapshot( - documentData, - ` - Object { - "$template": Object { - "name": "HEALTH_CERT", - "type": "EMBEDDED_RENDERER", - "url": "https://healthcert.renderer.moh.gov.sg/", - }, - "attachments": Array [ - Object { - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiYTFjMmQyODItNmMxZi00ZTQyLWEzMzUtZTg4OGRhNGQxYjM0OnN0cmluZzpURVNUMDAxIiwibmFtZSI6ImMyNzI3NTNkLWRjYTItNDk5Zi1iNTQzLTM4MTQ0OWU4NTA3NDpzdHJpbmc6SGVhbHRoQ2VydCIsInZhbGlkRnJvbSI6IjhjMWVlYWVkLWU4MTItNDliMi1iZTY2LTg2OGIxZmNiNDJmZTpzdHJpbmc6MjAyMC0xMS0yMCIsImZoaXJWZXJzaW9uIjoiNTg2ZDQ4NjEtYzlmZC00ZmE4LTk0NmEtMWIwZGJiMzY2MWM5OnN0cmluZzo0LjAuMSIsImZoaXJCdW5kbGUiOnsicmVzb3VyY2VUeXBlIjoiM2ZkOWI1MjAtN2JiYS00NzczLWJjMTgtMTZmMGY1N2U0NjlmOnN0cmluZzpCdW5kbGUiLCJ0eXBlIjoiMGRkNDZkZGEtODY0Yy00ZTgwLWI0NmUtYzc4MDE2MjFmYzdmOnN0cmluZzpjb2xsZWN0aW9uIiwiZW50cnkiOlt7InJlc291cmNlVHlwZSI6IjdkMTI5MWJiLWIxMTQtNDI0Yi1iMDY2LTE1ZmQyMmFlOWRiNTpzdHJpbmc6UGF0aWVudCIsImV4dGVuc2lvbiI6W3sidXJsIjoiMmVlNGRmNjItYjViZS00MWQ0LWI4ZWYtYWI4ZTE4NTdlMjA4OnN0cmluZzpodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vcGF0aWVudC1uYXRpb25hbGl0eSIsImNvZGUiOnsidGV4dCI6ImVhOTUzMmQ1LTlhMmQtNDRlYS05ZDFlLTlmZDMyN2M4MzY0NTpzdHJpbmc6U0cifX1dLCJpZGVudGlmaWVyIjpbeyJ0eXBlIjoiMDExYzEzYmUtMzE5Ny00ZDA4LTk0ZTMtYzNkMzExZTgxNjNkOnN0cmluZzpQUE4iLCJ2YWx1ZSI6ImEwZTE0YTUwLTZkMGUtNDk4Ni1iYWE1LThmMmQyZDZkNTZlYjpzdHJpbmc6RTc4MzExNzdHIn0seyJ0eXBlIjp7InRleHQiOiIyZmUyZjIzMy05MzBmLTRlYmItODFmZi1iYmI1MzdhM2Y3ZjI6c3RyaW5nOk5SSUMifSwidmFsdWUiOiI4ODkyMTc2Zi0yZGMzLTQ0ODctOTc1Ni1iOWJmNWUyN2EwYmI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjM0OGY0YThiLTBiMTktNDkyZi05YThhLTk0MTkxZjE3NDg1YzpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNWE3MWI3Y2ItMWNkNy00NzBjLTgzMWItYzBiMDkzMDJmMmZjOnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiIzN2ZhODRjNy0yMjg1LTQ0N2EtOTRmOS04MWUyMzA2MTY2MTE6c3RyaW5nOjE5OTAtMDEtMTUifSx7InJlc291cmNlVHlwZSI6IjQ2NjUxMzk3LTlhMzAtNDFkYS1iOGQ1LTVlMzk2MTRjMzM1YjpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYWM5NjQ3ODAtOWFiNS00M2U2LTg3NmMtN2Y2M2IxMjIxNDlkOnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6IjgwYTM3YTM0LWZhYjEtNGZjOS1iOGFjLWUzNGVkYTZhNDA2YTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjdmMDFmMGUwLTIxN2UtNDFhYi04MTA1LWUzOGYwMmViNWUxNzpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI1MjcwODc5Yi05OTBkLTRlN2EtYmM3Ny1jNWU5ZWJkZjM5NWY6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19LHsicmVzb3VyY2VUeXBlIjoiNjY2M2I0NjEtYWYwYy00YTI0LWI3ODgtNThiOGY3MjM3NjE5OnN0cmluZzpPYnNlcnZhdGlvbiIsImlkZW50aWZpZXIiOlt7InZhbHVlIjoiNzFlYmNkYWMtOTU1My00MmFmLWE3M2ItNmJlYTQyNmM3MzVhOnN0cmluZzoxMjM0NTY3ODkiLCJ0eXBlIjoiYzQxMjliMWMtY2U5NC00ZDk5LWI4NTktMjc2NzQ2OTJlYzc2OnN0cmluZzpBQ1NOIn1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMzdkZDBjMTMtZGMxMy00ZDY4LWFhZDYtMzgwOGMzNzg2NWViOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6IjUwYmUwOWE4LTAwNzMtNGUxMS1iMGNkLWZjOTg5NGM4OGYzMjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiI5YmYxOWFkNC1jMTFiLTQzOWUtOWUxNS05ZTJmODhiZGY5Nzg6c3RyaW5nOlJldmVyc2UgdHJhbnNjcmlwdGlvbiBwb2x5bWVyYXNlIGNoYWluIHJlYWN0aW9uIChyUlQtUENSKSB0ZXN0In1dfSwidmFsdWVDb2RlYWJsZUNvbmNlcHQiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI0YWQ1ODBiNS1iYWQ2LTQxZjEtYmJkYS0xZDlmNGY5ODFiY2M6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNWM2NTRlMWUtNmNjOS00NGViLTllOTktNGU5ZGVjZDU2ODZjOnN0cmluZzoyNjAzODUwMDkiLCJkaXNwbGF5IjoiNzI2Y2E5NjgtMjk0MS00Yzc2LTg3MWQtYWM1N2JhOWNkMDVmOnN0cmluZzpOZWdhdGl2ZSJ9XX0sImVmZmVjdGl2ZURhdGVUaW1lIjoiYzhlYzhhNWYtYWY1ZS00MzYyLTgwM2YtZGMyNzAwM2ZhYjEzOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsInN0YXR1cyI6IjFlYTBkZmE5LWRiMzQtNDFlMy1hNDkwLWRkZWQ0YjM1NGExOTpzdHJpbmc6ZmluYWwiLCJwZXJmb3JtZXIiOnsibmFtZSI6W3sidGV4dCI6ImE3NzI1MDE5LWNkNDYtNDEyNS05MDAzLTdmNDE2NGMyOTY2MjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV19LCJxdWFsaWZpY2F0aW9uIjpbeyJpZGVudGlmaWVyIjoiMDExMTY1OWEtNTRhMi00MjYwLWJlMzUtZDNlMmQzZmVlYTAwOnN0cmluZzpNQ1IgMTIzMjE0IiwiaXNzdWVyIjoiZjQzNTRjYzQtYzJhOS00YTk2LWE1OTQtODE1YmNkY2FmNjdjOnN0cmluZzpNT0gifV19LHsicmVzb3VyY2VUeXBlIjoiNDc0ODg4NjYtNjkyMC00MWIwLWJjNzMtMDM1ZmMxMDY3MDFmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiNzc3OGM2ZTgtZTI5My00NzJiLWJiNmEtNDNmMWFiNDg1YzlkOnN0cmluZzpNYWNSaXRjaGllIE1lZGljYWwgQ2xpbmljIiwidHlwZSI6IjA0OGQ1ZGM4LTg1ZmMtNDQyZC1hMThlLTdmY2UwNDk0ZDczNTpzdHJpbmc6TGljZW5zZWQgSGVhbHRoY2FyZSBQcm92aWRlciIsImVuZHBvaW50Ijp7ImFkZHJlc3MiOiI5NjkzYjdhOS0yMzI5LTRiOTgtODVmNi1hNThjNWNlNGI5ZTU6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0sImNvbnRhY3QiOnsidGVsZWNvbSI6W3sic3lzdGVtIjoiYjU5YjI2NDYtNWVjYi00NWM0LThmOGEtODAwYzBjMWI4MDhmOnN0cmluZzpwaG9uZSIsInZhbHVlIjoiZjk5MDMzNjYtMTgyNS00Njc5LWI1MzUtNjk5ODdkZGQyYWQ5OnN0cmluZzorNjU2MzExMzExMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiYmY0OTE0NDYtMDAzMy00NzBlLThhOTQtMjc4ZmIyNWRkZDY2OnN0cmluZzpwaHlzaWNhbCIsInVzZSI6Ijc0ZTEwMTMzLTcyNTUtNGRjNy04NjNiLTgxYjA1MDZiMWFhMjpzdHJpbmc6d29yayIsInRleHQiOiI3NjFlNDI0OC1iNTI0LTRjODctOGM0ZC0xZDYyZTg3ZjhjZWY6c3RyaW5nOk1hY1JpdGNoaWUgSG9zcGl0YWwgVGhvbXNvbiBSb2FkIFNpbmdhcG9yZSAxMjMwMDAifX19LHsicmVzb3VyY2VUeXBlIjoiMTE3YzhjNjQtYzcyNy00ZGY2LWE3YjItMGE1Mjk3YTZjZTFhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMjQzYTliN2ItMzczOC00MWIzLWJiNzQtMGFjY2IyYzFmYWNjOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjoiOTNiMzI4ODgtOTI2MC00NWYyLWE4ZTAtOTE3YzkwOWRiZThkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkiLCJjb250YWN0Ijp7InRlbGVjb20iOlt7InN5c3RlbSI6IjM4MDY3NDQ1LTNkNDctNDYyNS1hYjE0LTNmNjk3MjlkODYwYzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6ImUzNDU2MWNlLWQ0MGEtNDE4NC05ZGRkLTM3ODU3OTIzMjg3ZTpzdHJpbmc6KzY1NjI3MTExODgifV0sImFkZHJlc3MiOnsidHlwZSI6ImNjNTcwZDBkLTUzOWEtNGY0Ny05MjExLTlkMWYzMzZkZmVjMjpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJjMjViZTJhNS04NjUzLTRjZGMtOWQ1ZS0wNjM5OTBmZjY2M2Y6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiOGI0OGYzYzAtNTc1NC00ZmQ3LTk5YTgtMjM0NDNmNDRlOGMzOnN0cmluZzoyIFRob21zb24gQXZlbnVlIDQgU2luZ2Fwb3JlIDA5ODg4OCJ9fX1dfSwiaXNzdWVycyI6W3siaWQiOiI3YzZhNWFmMS1hMTg3LTQ5NTktYjk5My1iYzg1NmZiN2MzYzc6c3RyaW5nOmRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCIsInJldm9jYXRpb24iOnsidHlwZSI6IjhmNmY2OGI0LTQwNzMtNDc5Ni05YTlhLWI4MDM3NmUzNTk4NjpzdHJpbmc6Tk9ORSJ9LCJuYW1lIjoiNGQ2MTRiYzctNDk2NC00YmI5LTkyYjYtNGM4YWQzNmQ3ZTgwOnN0cmluZzpTQU1QTEUgQ0xJTklDIiwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjI3YmE4NjYtYjcxNC00MTcyLWJiOGUtYmFhYzcwYzdmYzJkOnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI5ZGRlN2RjOC1lMTk4LTQ1ZDItYmJjNi1jYzg2NDgyMWEwMzQ6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6Ijg5MjRjOWRhLTYzNjQtNDZhZi04MTc1LTAzMDM1OTk5NWNkNDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCJsb2dvIjoiOGU5NDFkY2ItM2MzNi00NGZiLWFlZTEtODgxMzY2MzQ2ZGY4OnN0cmluZzpkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWZRQUFBRElDQU1BQUFBcHgrUGFBQUFBTTFCTVZFVUFBQURNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16ZUNtaUFBQUFBRUhSU1RsTUFRTCtBN3hBZ24yRFAzekJ3cjFDUEVsK0kvUUFBQndkSlJFRlVlTnJzbmQxMjJ5b1FSdmtISVNITit6L3R5VWs5b1RFQ1ExYlRCYzIzYnlOczBCNUdJREFSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWsrSWsrSWR4NGc1TjRCOUdRL3JQQTlKL0lQZlNnd0wvTUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UDVaUG9QNXI3RkpLQWY3Y3VmQmloUE5Ta1g1aGxBOXUrRHNQN2RYL0pLMVAyVlBpU0lvZWJFckx3Vmg1WngrOEMxWTIyWXRQMEZwZjZoZGVhK21xMVdsaXhmZWo2UmNEeGowOXN3WGJiZUJRcGlqdWcyMGFqL1NFOGJ2bzVoRXVhdkF1U0twUWZKeFRHOTFnVXJDVjZqU1FFMG9Qa2U0d3VrZTcwNUVxcExOV3h0TXRTazRqdlhHbGQrdExseHZWTU5uYWtEN21FbmRZVFZXU25WODYwV1VYbDM0Uk15N0JlbXB5R3pON3BBYm1YRUE2YmZ2SzB1MzJ1VEZLS1ZNMHIwWXcxTVRjRnZwOGlWTFBEMCs5Z0hReSs3clNmM2VlanAySHVGY3NtbGRpRXowRnpLWGZTUnczcWUwOFhxZDlkUDZRS09Obmt1NGxHM05TYi9SQnRLdEt0MXR0ZEJKaVliMlZJN2JyYzd0YzhJWW90SnpIVUIwYytPK1QzclRRdUxLc1pScXB6a1RTN2RaSTR2bytxSm5kRUdPOEV6ZWN5amFjNi9JVE4yS09XYVVMSVQvYUxkZVVucXBkaTdWVzIrS3ljMjlGTDNzN2UzaGk1TFRTaGVXV3B5V2xINFh6bXZXam5pT2lGTjNZV0RpdldJOTJXdWs1Y3QyQzBwM0p6bDlZTjY2V0k1SVYvVnlGODZyMWExN3BINVVNQzBwWC9Ed1hWVTUyNEtzNVlnRFptTDR6R3oxdzgwcDMzUGoxcE12Y2krdGMyY0ZJam1oSDJkV1ZmdWFWTHVMank5ZVR6Z3FPcnFld3YwdnVtLzFLUjQrMmE2RGg1cFhPN1Y5TytzNEtSSlBBRHV4Tmp0akZDQ2svQ2x0RXpnZnpTdGVyU3ZkWlFaZURveXlxeFFndVIxbFhtQmxJLzlQU2ViWnBiT2U4Yml2dDJiRks5WWFLNGVIZTdOTE5hdExQM3FHWUxmTDcxUm9NdkI2WHU5NkozVFd0OUxUb1FNNXptOFlmeGJISUVTUFpYWFcvdG92VFNvK1BxRnhOZXN3WnFqTy9YMDlPdkJnaTlPY0h3N2xsVXVrY3YrZGkwcm5lcWY5OXVYb0tnbE1Nd2FsbDd4L215MG1sUDVwaVZudjNmdVorMTkzeG5wVFlMejNTamVqUExYcE82VHRYYnpYcGZJVWNlSkhtUHNYQUpzYkkrYUw3ZnZzcHBWc09YN3VhZEo5RnZ1VDYzUHhzWkFRM1VNeHlnTHlXdnNrNi9sdWt1NDBmYjh0dG9sREZGYjFaUVE2L21Sa3YxaVc5aTFKNkMvMWFlakFjdlFQVm1VdDZGQjJjbjI2SnpETzRUc2FMY1dlYVRibzdJbjA0WDA4Njk2WHhUbnJrbXpHQ0hpbW1KcEx1TmFQaTcxZitLT2t0ZTVJSzlPclM3NGluZ1BTZkpkMW9JU0Q5WjBtL2hQaEIwbysvTGQzTU1HVXJTVTY4czl5VXpYU08zc3VoVytCaCtKajBveXoyc25acWdwY3pkNWl3cHZSdm1LZlhwWS9QMHllU2ZzZ0hPaGxpd3RMUzdjQlNpUjFhWkZQMzBxK0J0M2ZYYks5aFEyVHIrNHJTYys4ZGZsWENPMmw2cFkrUElzNXBGMXhzNGttYlhWQjZ6MEpXUlJkSCs2QjB3OFZlb3lkZVdsVjg0eGFVTG52WDA4dkV6Tm4rSEpPdSt0ZlQxY1NiS1BMZXd2V2tjL2MxL1l0czRTbEorREhwdW5zRjMwNjlYU3J3N1ZoUWVsNGdITjNRdUhPOGpFay9POGNDK1VvL3BYUit2RzBMU24vWlh4bFh5SW9jNjBQU2hlbGR3dmR6YjRIVzNJNzFwTy8wd0hZcU9JcDh2NDFKVDUyVE5qZjVqeDI0Zm1FOTZXTHJHNy9ic29NNmVoQ0dwSjhzMC9aVjNrOHFuVE9kWDFCNjZIT2diNGI1S1JmdGw1NGZDN292eXZaWnBYdDZKeTRvM1pxZWRPdk1UZHNsUFVoRDBybFd4dlZNRnRTMFAxVU9uUHZXazg0WGRiMERJWFcva0hpTVNMZW03ck1NS0RtdDlKMEhtZ3RLLzNCZzdHaGdPR0xDZ1BUOGFmcDFwZFRFeDQ4ODZuZ3RLRjJjOU9wc2dWRGJPS0NKT1Fha2krMVZyRmkrd3JpSnBmTmEvb3JTaGNyVzI4NmpMWXN5eWZaTGw4U0V0bk02NWoxU0xIK3dYVkc2amMwRFlJOTg2RnVqS0puUUxWMGMxTXJ3N3NPNW4vZnd3RGZrb2o5Z2ZENG96aHlGQVVWTXFCUmxZckNkMG9VblJya2l5RXpPUEZOTEZ6VHpUNVZsQlhkM09tOG96a0J0T09kRFBaa1U5azkvUENwTGtIYXJuWlVmSWhYT3YwLzZJU3YwU09jdmovMWI5dHpma041RzN4N2ViZEloMzRXZkY2dHBEcnJZSzZQVXBkLzRmSlMzYnBYYXJ0T0pOK1NSREJYT3YwbDZtNkV6WjF6MzVsdzlrM1JPMDFXTUZCVTRINCsyMWxNYmI4WHMwdmx2WVZIcDNQVXFLQ2NhT0RVc25iTkxTUjVjVEMrZForcHBWZWxDbkthMTE3ZU5UTlFrU1ZGaVUydFArUXJTT1Z2WlphVUxxd3Z0UENoL2pkTWIzUk45OVFPa29qdjhMc1FTMGsvTzcrdEtmK05NVDk2TlAwVXZMdmluUm05Sm4yNHdWcmJEQ2JHSWRGNHhWQk5KL3hKU2U2VWVvL0JqLzlJLzdEeTBQdnJuSnk1b3BTSVJSWlgwYVFVQUFQelgzaDNVQUFDQVFBeDdZQUQvYW5GQkNOZGFtSUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQW1tb2VLOUh6aUI1STlFQlhueDhBQUFBQUFBQUFBTEJtQUlaS216V0lueHlPQUFBQUFFbEZUa1N1UW1DQyIsIiR0ZW1wbGF0ZSI6eyJuYW1lIjoiN2M0NDIxNzMtMjMwYS00MmNiLTlkY2EtOWViYTIyYWMzNjAzOnN0cmluZzpIRUFMVEhDRVJUIiwidHlwZSI6IjU0MWVjMWE0LTJkYjItNDdjNi04OGNhLTcxZGIxYjczNTlkMzpzdHJpbmc6RU1CRURERURfUkVOREVSRVIiLCJ1cmwiOiI5NzUyM2Y5Yi1lYmY2LTQ2YjYtOTI5YS0wMmRmMTY2YzQ5MTE6c3RyaW5nOmh0dHBzOi8vbW9oLWhlYWx0aGNlcnQtcmVuZGVyZXIubmV0bGlmeS5hcHAvIn19LCJzaWduYXR1cmUiOnsidHlwZSI6IlNIQTNNZXJrbGVQcm9vZiIsInRhcmdldEhhc2giOiJmZjM0M2FhMjQzMjg0MTExN2NlMzNmMWEwYmNlNzU0ODhmYzUxZDg5MDhmZDZmMTMzZWYyZDRhZjE4YjllYmMyIiwicHJvb2YiOltdLCJtZXJrbGVSb290IjoiZmYzNDNhYTI0MzI4NDExMTdjZTMzZjFhMGJjZTc1NDg4ZmM1MWQ4OTA4ZmQ2ZjEzM2VmMmQ0YWYxOGI5ZWJjMiJ9LCJwcm9vZiI6W3sidHlwZSI6Ik9wZW5BdHRlc3RhdGlvblNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMC0xMC0wN1QwOTo1NjoxMC42OTFaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIiLCJzaWduYXR1cmUiOiIweDI5NjYzYTZiZDhiYzA5MTdmMzdkMWIyMGViNjQ0N2M5ZTc4OGQ1MTc3NWNhOWZlYWExZjk4YjYyYWVhODZiYTAyMDIyZjhhMzFkOWE1Y2IwYmU3YWFhYzY1ZDZhMTJkZjc0YmQzZTBlNzkxMTEzMmNiZGUxNzhhMTg2ZTZhMDViMWIifV19", - "filename": "healthcert.txt", - "type": "text/open-attestation", - }, - ], - "fhirBundle": Object { - "entry": Array [ - Object { - "birthDate": "1990-01-15", - "extension": Array [ - Object { - "code": Object { - "text": "SG", - }, - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - }, - ], - "gender": "female", - "identifier": Array [ - Object { - "type": "PPN", - "value": "E7831177G", - }, - Object { - "type": Object { - "text": "NRIC", - }, - "value": "S****989Z", - }, - ], - "name": Array [ - Object { - "text": "Tan Chen Chen", - }, - ], - "resourceType": "Patient", - }, - Object { - "collection": Object { - "collectedDateTime": "2020-09-27T06:15:00Z", - }, - "resourceType": "Specimen", - "type": Object { - "coding": Array [ - Object { - "code": "258500001", - "display": "Nasopharyngeal swab", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "code": Object { - "coding": Array [ - Object { - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test", - "system": "http://loinc.org", - }, - ], - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "identifier": Array [ - Object { - "type": "ACSN", - "value": "123456789", - }, - ], - "performer": Object { - "name": Array [ - Object { - "text": "Dr Michael Lim", - }, - ], - }, - "qualification": Array [ - Object { - "identifier": "MCR 123214", - "issuer": "MOH", - }, - ], - "resourceType": "Observation", - "status": "final", - "valueCodeableConcept": Object { - "coding": Array [ - Object { - "code": "260385009", - "display": "Negative", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "contact": Object { - "address": Object { - "text": "MacRitchie Hospital Thomson Road Singapore 123000", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6563113111", - }, - ], - }, - "endpoint": Object { - "address": "https://www.macritchieclinic.com.sg", - }, - "name": "MacRitchie Medical Clinic", - "resourceType": "Organization", - "type": "Licensed Healthcare Provider", - }, - Object { - "contact": Object { - "address": Object { - "text": "2 Thomson Avenue 4 Singapore 098888", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6562711188", - }, - ], - }, - "name": "MacRitchie Laboratory", - "resourceType": "Organization", - "type": "Accredited Laboratory", - }, - ], - "resourceType": "Bundle", - "type": "collection", - }, - "fhirVersion": "4.0.1", - "id": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "issuers": Array [ - Object { - "id": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E", - "identityProof": Object { - "key": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller", - "location": "moh.gov.sg", - "type": "DNS-DID", - }, - "name": "Ministry of Health (Singapore)", - "revocation": Object { - "type": "NONE", - }, - }, - ], - "logo": "data:image/png;base64,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", - "name": "HealthCert", - "notarisationMetadata": Object { - "notarisedOn": "1970-01-01T00:00:01.000Z", - "passportNumber": "E7831177G", - "reference": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "signedEuHealthCerts": Array [ - Object { - "expiryDateTime": "2022-12-17T01:27:50.263Z", - "qr": "HC1:abcde", - "type": "PCR", - }, - ], - "url": "https://example.com", - }, - "validFrom": "2020-11-20", - } - ` - ); - expect(createdDocument.proof).toHaveLength(1); - expect(createdDocument.proof[0].type).toBe("OpenAttestationSignature2018"); - expect(createdDocument.proof[0].verificationMethod).toBe( - "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller" - ); - expect(createdDocument.proof[0].signature).toBeTruthy(); -}); diff --git a/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.ts b/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.ts deleted file mode 100644 index f93f8876..00000000 --- a/src/models/notarizedHealthCert/createNotarizedHealthCert/createNotarizedHealthCert.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - wrapDocument, - WrappedDocument, - signDocument, - SUPPORTED_SIGNING_ALGORITHM, -} from "@govtechsg/open-attestation"; -import { notarise } from "@govtechsg/oa-schemata"; -import { - HealthCertDocument, - NotarizedHealthCert, - SignedNotarizedHealthCert, -} from "../../../types"; -import { createUnwrappedDocument } from "./createUnwrappedHealthCert"; -import { config } from "../../../config"; -import { getLogger } from "../../../common/logger"; - -const { didSigner } = config; -const { trace } = getLogger("api-notarise-healthcerts"); - -const signWrappedDocument = ( - wrappedDocument: WrappedDocument -) => - signDocument( - wrappedDocument as any, - SUPPORTED_SIGNING_ALGORITHM.Secp256k1VerificationKey2018, - { - public: didSigner.key, - private: didSigner.privateKey, - } - ) as Promise; - -export const createNotarizedHealthCert = async ( - certificate: WrappedDocument, - reference: string, - storedUrl: string, - signedEuHealthCerts?: notarise.SignedEuHealthCert[] -) => { - const unwrappedNotarisedDocument = createUnwrappedDocument( - certificate, - reference, - storedUrl, - signedEuHealthCerts - ); - const wrappedNotarisedDocument = wrapDocument(unwrappedNotarisedDocument); - const traceWithRef = trace.extend(`reference: ${reference}`); - traceWithRef("Document successfully notarised"); - return signWrappedDocument(wrappedNotarisedDocument); -}; diff --git a/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.test.ts b/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.test.ts deleted file mode 100644 index 795fb9c4..00000000 --- a/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.test.ts +++ /dev/null @@ -1,570 +0,0 @@ -import { notarise } from "@govtechsg/oa-schemata"; -import { createUnwrappedDocument } from "./createUnwrappedHealthCert"; -import exampleHealthcertWrapped from "../../../../test/fixtures/v1/example_healthcert_with_nric_wrapped.json"; -import { mockDate, unmockDate } from "../../../../test/utils"; - -const sampleDocument = exampleHealthcertWrapped as any; -const uuid = "e35f5d2a-4198-4f8f-96dc-d1afe0b67119"; -const storedUrl = "https://example.com"; -const sampleSignedEuHealthCerts: notarise.SignedEuHealthCert[] = [ - { - type: "PCR", - qr: "HC1:abcde", - expiryDateTime: "2022-12-17T01:27:50.263Z", - }, -]; - -beforeAll(mockDate); -afterAll(unmockDate); - -it("should create the unwrapped document from input data", () => { - const createdDocument = createUnwrappedDocument( - sampleDocument, - uuid, - storedUrl - ); - expect(createdDocument).toMatchInlineSnapshot(` - Object { - "$template": Object { - "name": "HEALTH_CERT", - "type": "EMBEDDED_RENDERER", - "url": "https://healthcert.renderer.moh.gov.sg/", - }, - "attachments": Array [ - Object { - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiYTFjMmQyODItNmMxZi00ZTQyLWEzMzUtZTg4OGRhNGQxYjM0OnN0cmluZzpURVNUMDAxIiwibmFtZSI6ImMyNzI3NTNkLWRjYTItNDk5Zi1iNTQzLTM4MTQ0OWU4NTA3NDpzdHJpbmc6SGVhbHRoQ2VydCIsInZhbGlkRnJvbSI6IjhjMWVlYWVkLWU4MTItNDliMi1iZTY2LTg2OGIxZmNiNDJmZTpzdHJpbmc6MjAyMC0xMS0yMCIsImZoaXJWZXJzaW9uIjoiNTg2ZDQ4NjEtYzlmZC00ZmE4LTk0NmEtMWIwZGJiMzY2MWM5OnN0cmluZzo0LjAuMSIsImZoaXJCdW5kbGUiOnsicmVzb3VyY2VUeXBlIjoiM2ZkOWI1MjAtN2JiYS00NzczLWJjMTgtMTZmMGY1N2U0NjlmOnN0cmluZzpCdW5kbGUiLCJ0eXBlIjoiMGRkNDZkZGEtODY0Yy00ZTgwLWI0NmUtYzc4MDE2MjFmYzdmOnN0cmluZzpjb2xsZWN0aW9uIiwiZW50cnkiOlt7InJlc291cmNlVHlwZSI6IjdkMTI5MWJiLWIxMTQtNDI0Yi1iMDY2LTE1ZmQyMmFlOWRiNTpzdHJpbmc6UGF0aWVudCIsImV4dGVuc2lvbiI6W3sidXJsIjoiMmVlNGRmNjItYjViZS00MWQ0LWI4ZWYtYWI4ZTE4NTdlMjA4OnN0cmluZzpodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vcGF0aWVudC1uYXRpb25hbGl0eSIsImNvZGUiOnsidGV4dCI6ImVhOTUzMmQ1LTlhMmQtNDRlYS05ZDFlLTlmZDMyN2M4MzY0NTpzdHJpbmc6U0cifX1dLCJpZGVudGlmaWVyIjpbeyJ0eXBlIjoiMDExYzEzYmUtMzE5Ny00ZDA4LTk0ZTMtYzNkMzExZTgxNjNkOnN0cmluZzpQUE4iLCJ2YWx1ZSI6ImEwZTE0YTUwLTZkMGUtNDk4Ni1iYWE1LThmMmQyZDZkNTZlYjpzdHJpbmc6RTc4MzExNzdHIn0seyJ0eXBlIjp7InRleHQiOiIyZmUyZjIzMy05MzBmLTRlYmItODFmZi1iYmI1MzdhM2Y3ZjI6c3RyaW5nOk5SSUMifSwidmFsdWUiOiI4ODkyMTc2Zi0yZGMzLTQ0ODctOTc1Ni1iOWJmNWUyN2EwYmI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjM0OGY0YThiLTBiMTktNDkyZi05YThhLTk0MTkxZjE3NDg1YzpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNWE3MWI3Y2ItMWNkNy00NzBjLTgzMWItYzBiMDkzMDJmMmZjOnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiIzN2ZhODRjNy0yMjg1LTQ0N2EtOTRmOS04MWUyMzA2MTY2MTE6c3RyaW5nOjE5OTAtMDEtMTUifSx7InJlc291cmNlVHlwZSI6IjQ2NjUxMzk3LTlhMzAtNDFkYS1iOGQ1LTVlMzk2MTRjMzM1YjpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYWM5NjQ3ODAtOWFiNS00M2U2LTg3NmMtN2Y2M2IxMjIxNDlkOnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6IjgwYTM3YTM0LWZhYjEtNGZjOS1iOGFjLWUzNGVkYTZhNDA2YTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjdmMDFmMGUwLTIxN2UtNDFhYi04MTA1LWUzOGYwMmViNWUxNzpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI1MjcwODc5Yi05OTBkLTRlN2EtYmM3Ny1jNWU5ZWJkZjM5NWY6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19LHsicmVzb3VyY2VUeXBlIjoiNjY2M2I0NjEtYWYwYy00YTI0LWI3ODgtNThiOGY3MjM3NjE5OnN0cmluZzpPYnNlcnZhdGlvbiIsImlkZW50aWZpZXIiOlt7InZhbHVlIjoiNzFlYmNkYWMtOTU1My00MmFmLWE3M2ItNmJlYTQyNmM3MzVhOnN0cmluZzoxMjM0NTY3ODkiLCJ0eXBlIjoiYzQxMjliMWMtY2U5NC00ZDk5LWI4NTktMjc2NzQ2OTJlYzc2OnN0cmluZzpBQ1NOIn1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMzdkZDBjMTMtZGMxMy00ZDY4LWFhZDYtMzgwOGMzNzg2NWViOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6IjUwYmUwOWE4LTAwNzMtNGUxMS1iMGNkLWZjOTg5NGM4OGYzMjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiI5YmYxOWFkNC1jMTFiLTQzOWUtOWUxNS05ZTJmODhiZGY5Nzg6c3RyaW5nOlJldmVyc2UgdHJhbnNjcmlwdGlvbiBwb2x5bWVyYXNlIGNoYWluIHJlYWN0aW9uIChyUlQtUENSKSB0ZXN0In1dfSwidmFsdWVDb2RlYWJsZUNvbmNlcHQiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI0YWQ1ODBiNS1iYWQ2LTQxZjEtYmJkYS0xZDlmNGY5ODFiY2M6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNWM2NTRlMWUtNmNjOS00NGViLTllOTktNGU5ZGVjZDU2ODZjOnN0cmluZzoyNjAzODUwMDkiLCJkaXNwbGF5IjoiNzI2Y2E5NjgtMjk0MS00Yzc2LTg3MWQtYWM1N2JhOWNkMDVmOnN0cmluZzpOZWdhdGl2ZSJ9XX0sImVmZmVjdGl2ZURhdGVUaW1lIjoiYzhlYzhhNWYtYWY1ZS00MzYyLTgwM2YtZGMyNzAwM2ZhYjEzOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsInN0YXR1cyI6IjFlYTBkZmE5LWRiMzQtNDFlMy1hNDkwLWRkZWQ0YjM1NGExOTpzdHJpbmc6ZmluYWwiLCJwZXJmb3JtZXIiOnsibmFtZSI6W3sidGV4dCI6ImE3NzI1MDE5LWNkNDYtNDEyNS05MDAzLTdmNDE2NGMyOTY2MjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV19LCJxdWFsaWZpY2F0aW9uIjpbeyJpZGVudGlmaWVyIjoiMDExMTY1OWEtNTRhMi00MjYwLWJlMzUtZDNlMmQzZmVlYTAwOnN0cmluZzpNQ1IgMTIzMjE0IiwiaXNzdWVyIjoiZjQzNTRjYzQtYzJhOS00YTk2LWE1OTQtODE1YmNkY2FmNjdjOnN0cmluZzpNT0gifV19LHsicmVzb3VyY2VUeXBlIjoiNDc0ODg4NjYtNjkyMC00MWIwLWJjNzMtMDM1ZmMxMDY3MDFmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiNzc3OGM2ZTgtZTI5My00NzJiLWJiNmEtNDNmMWFiNDg1YzlkOnN0cmluZzpNYWNSaXRjaGllIE1lZGljYWwgQ2xpbmljIiwidHlwZSI6IjA0OGQ1ZGM4LTg1ZmMtNDQyZC1hMThlLTdmY2UwNDk0ZDczNTpzdHJpbmc6TGljZW5zZWQgSGVhbHRoY2FyZSBQcm92aWRlciIsImVuZHBvaW50Ijp7ImFkZHJlc3MiOiI5NjkzYjdhOS0yMzI5LTRiOTgtODVmNi1hNThjNWNlNGI5ZTU6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0sImNvbnRhY3QiOnsidGVsZWNvbSI6W3sic3lzdGVtIjoiYjU5YjI2NDYtNWVjYi00NWM0LThmOGEtODAwYzBjMWI4MDhmOnN0cmluZzpwaG9uZSIsInZhbHVlIjoiZjk5MDMzNjYtMTgyNS00Njc5LWI1MzUtNjk5ODdkZGQyYWQ5OnN0cmluZzorNjU2MzExMzExMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiYmY0OTE0NDYtMDAzMy00NzBlLThhOTQtMjc4ZmIyNWRkZDY2OnN0cmluZzpwaHlzaWNhbCIsInVzZSI6Ijc0ZTEwMTMzLTcyNTUtNGRjNy04NjNiLTgxYjA1MDZiMWFhMjpzdHJpbmc6d29yayIsInRleHQiOiI3NjFlNDI0OC1iNTI0LTRjODctOGM0ZC0xZDYyZTg3ZjhjZWY6c3RyaW5nOk1hY1JpdGNoaWUgSG9zcGl0YWwgVGhvbXNvbiBSb2FkIFNpbmdhcG9yZSAxMjMwMDAifX19LHsicmVzb3VyY2VUeXBlIjoiMTE3YzhjNjQtYzcyNy00ZGY2LWE3YjItMGE1Mjk3YTZjZTFhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMjQzYTliN2ItMzczOC00MWIzLWJiNzQtMGFjY2IyYzFmYWNjOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjoiOTNiMzI4ODgtOTI2MC00NWYyLWE4ZTAtOTE3YzkwOWRiZThkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkiLCJjb250YWN0Ijp7InRlbGVjb20iOlt7InN5c3RlbSI6IjM4MDY3NDQ1LTNkNDctNDYyNS1hYjE0LTNmNjk3MjlkODYwYzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6ImUzNDU2MWNlLWQ0MGEtNDE4NC05ZGRkLTM3ODU3OTIzMjg3ZTpzdHJpbmc6KzY1NjI3MTExODgifV0sImFkZHJlc3MiOnsidHlwZSI6ImNjNTcwZDBkLTUzOWEtNGY0Ny05MjExLTlkMWYzMzZkZmVjMjpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJjMjViZTJhNS04NjUzLTRjZGMtOWQ1ZS0wNjM5OTBmZjY2M2Y6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiOGI0OGYzYzAtNTc1NC00ZmQ3LTk5YTgtMjM0NDNmNDRlOGMzOnN0cmluZzoyIFRob21zb24gQXZlbnVlIDQgU2luZ2Fwb3JlIDA5ODg4OCJ9fX1dfSwiaXNzdWVycyI6W3siaWQiOiI3YzZhNWFmMS1hMTg3LTQ5NTktYjk5My1iYzg1NmZiN2MzYzc6c3RyaW5nOmRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCIsInJldm9jYXRpb24iOnsidHlwZSI6IjhmNmY2OGI0LTQwNzMtNDc5Ni05YTlhLWI4MDM3NmUzNTk4NjpzdHJpbmc6Tk9ORSJ9LCJuYW1lIjoiNGQ2MTRiYzctNDk2NC00YmI5LTkyYjYtNGM4YWQzNmQ3ZTgwOnN0cmluZzpTQU1QTEUgQ0xJTklDIiwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjI3YmE4NjYtYjcxNC00MTcyLWJiOGUtYmFhYzcwYzdmYzJkOnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI5ZGRlN2RjOC1lMTk4LTQ1ZDItYmJjNi1jYzg2NDgyMWEwMzQ6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6Ijg5MjRjOWRhLTYzNjQtNDZhZi04MTc1LTAzMDM1OTk5NWNkNDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCJsb2dvIjoiOGU5NDFkY2ItM2MzNi00NGZiLWFlZTEtODgxMzY2MzQ2ZGY4OnN0cmluZzpkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWZRQUFBRElDQU1BQUFBcHgrUGFBQUFBTTFCTVZFVUFBQURNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16ZUNtaUFBQUFBRUhSU1RsTUFRTCtBN3hBZ24yRFAzekJ3cjFDUEVsK0kvUUFBQndkSlJFRlVlTnJzbmQxMjJ5b1FSdmtISVNITit6L3R5VWs5b1RFQ1ExYlRCYzIzYnlOczBCNUdJREFSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWsrSWsrSWR4NGc1TjRCOUdRL3JQQTlKL0lQZlNnd0wvTUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UDVaUG9QNXI3RkpLQWY3Y3VmQmloUE5Ta1g1aGxBOXUrRHNQN2RYL0pLMVAyVlBpU0lvZWJFckx3Vmg1WngrOEMxWTIyWXRQMEZwZjZoZGVhK21xMVdsaXhmZWo2UmNEeGowOXN3WGJiZUJRcGlqdWcyMGFqL1NFOGJ2bzVoRXVhdkF1U0twUWZKeFRHOTFnVXJDVjZqU1FFMG9Qa2U0d3VrZTcwNUVxcExOV3h0TXRTazRqdlhHbGQrdExseHZWTU5uYWtEN21FbmRZVFZXU25WODYwV1VYbDM0Uk15N0JlbXB5R3pON3BBYm1YRUE2YmZ2SzB1MzJ1VEZLS1ZNMHIwWXcxTVRjRnZwOGlWTFBEMCs5Z0hReSs3clNmM2VlanAySHVGY3NtbGRpRXowRnpLWGZTUnczcWUwOFhxZDlkUDZRS09Obmt1NGxHM05TYi9SQnRLdEt0MXR0ZEJKaVliMlZJN2JyYzd0YzhJWW90SnpIVUIwYytPK1QzclRRdUxLc1pScXB6a1RTN2RaSTR2bytxSm5kRUdPOEV6ZWN5amFjNi9JVE4yS09XYVVMSVQvYUxkZVVucXBkaTdWVzIrS3ljMjlGTDNzN2UzaGk1TFRTaGVXV3B5V2xINFh6bXZXam5pT2lGTjNZV0RpdldJOTJXdWs1Y3QyQzBwM0p6bDlZTjY2V0k1SVYvVnlGODZyMWExN3BINVVNQzBwWC9Ed1hWVTUyNEtzNVlnRFptTDR6R3oxdzgwcDMzUGoxcE12Y2krdGMyY0ZJam1oSDJkV1ZmdWFWTHVMank5ZVR6Z3FPcnFld3YwdnVtLzFLUjQrMmE2RGg1cFhPN1Y5TytzNEtSSlBBRHV4Tmp0akZDQ2svQ2x0RXpnZnpTdGVyU3ZkWlFaZURveXlxeFFndVIxbFhtQmxJLzlQU2ViWnBiT2U4Yml2dDJiRks5WWFLNGVIZTdOTE5hdExQM3FHWUxmTDcxUm9NdkI2WHU5NkozVFd0OUxUb1FNNXptOFlmeGJISUVTUFpYWFcvdG92VFNvK1BxRnhOZXN3WnFqTy9YMDlPdkJnaTlPY0h3N2xsVXVrY3YrZGkwcm5lcWY5OXVYb0tnbE1Nd2FsbDd4L215MG1sUDVwaVZudjNmdVorMTkzeG5wVFlMejNTamVqUExYcE82VHRYYnpYcGZJVWNlSkhtUHNYQUpzYkkrYUw3ZnZzcHBWc09YN3VhZEo5RnZ1VDYzUHhzWkFRM1VNeHlnTHlXdnNrNi9sdWt1NDBmYjh0dG9sREZGYjFaUVE2L21Sa3YxaVc5aTFKNkMvMWFlakFjdlFQVm1VdDZGQjJjbjI2SnpETzRUc2FMY1dlYVRibzdJbjA0WDA4Njk2WHhUbnJrbXpHQ0hpbW1KcEx1TmFQaTcxZitLT2t0ZTVJSzlPclM3NGluZ1BTZkpkMW9JU0Q5WjBtL2hQaEIwbysvTGQzTU1HVXJTVTY4czl5VXpYU08zc3VoVytCaCtKajBveXoyc25acWdwY3pkNWl3cHZSdm1LZlhwWS9QMHllU2ZzZ0hPaGxpd3RMUzdjQlNpUjFhWkZQMzBxK0J0M2ZYYks5aFEyVHIrNHJTYys4ZGZsWENPMmw2cFkrUElzNXBGMXhzNGttYlhWQjZ6MEpXUlJkSCs2QjB3OFZlb3lkZVdsVjg0eGFVTG52WDA4dkV6Tm4rSEpPdSt0ZlQxY1NiS1BMZXd2V2tjL2MxL1l0czRTbEorREhwdW5zRjMwNjlYU3J3N1ZoUWVsNGdITjNRdUhPOGpFay9POGNDK1VvL3BYUit2RzBMU24vWlh4bFh5SW9jNjBQU2hlbGR3dmR6YjRIVzNJNzFwTy8wd0hZcU9JcDh2NDFKVDUyVE5qZjVqeDI0Zm1FOTZXTHJHNy9ic29NNmVoQ0dwSjhzMC9aVjNrOHFuVE9kWDFCNjZIT2diNGI1S1JmdGw1NGZDN292eXZaWnBYdDZKeTRvM1pxZWRPdk1UZHNsUFVoRDBybFd4dlZNRnRTMFAxVU9uUHZXazg0WGRiMERJWFcva0hpTVNMZW03ck1NS0RtdDlKMEhtZ3RLLzNCZzdHaGdPR0xDZ1BUOGFmcDFwZFRFeDQ4ODZuZ3RLRjJjOU9wc2dWRGJPS0NKT1Fha2krMVZyRmkrd3JpSnBmTmEvb3JTaGNyVzI4NmpMWXN5eWZaTGw4U0V0bk02NWoxU0xIK3dYVkc2amMwRFlJOTg2RnVqS0puUUxWMGMxTXJ3N3NPNW4vZnd3RGZrb2o5Z2ZENG96aHlGQVVWTXFCUmxZckNkMG9VblJya2l5RXpPUEZOTEZ6VHpUNVZsQlhkM09tOG96a0J0T09kRFBaa1U5azkvUENwTGtIYXJuWlVmSWhYT3YwLzZJU3YwU09jdmovMWI5dHpma041RzN4N2ViZEloMzRXZkY2dHBEcnJZSzZQVXBkLzRmSlMzYnBYYXJ0T0pOK1NSREJYT3YwbDZtNkV6WjF6MzVsdzlrM1JPMDFXTUZCVTRINCsyMWxNYmI4WHMwdmx2WVZIcDNQVXFLQ2NhT0RVc25iTkxTUjVjVEMrZForcHBWZWxDbkthMTE3ZU5UTlFrU1ZGaVUydFArUXJTT1Z2WlphVUxxd3Z0UENoL2pkTWIzUk45OVFPa29qdjhMc1FTMGsvTzcrdEtmK05NVDk2TlAwVXZMdmluUm05Sm4yNHdWcmJEQ2JHSWRGNHhWQk5KL3hKU2U2VWVvL0JqLzlJLzdEeTBQdnJuSnk1b3BTSVJSWlgwYVFVQUFQelgzaDNVQUFDQVFBeDdZQUQvYW5GQkNOZGFtSUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQW1tb2VLOUh6aUI1STlFQlhueDhBQUFBQUFBQUFBTEJtQUlaS216V0lueHlPQUFBQUFFbEZUa1N1UW1DQyIsIiR0ZW1wbGF0ZSI6eyJuYW1lIjoiN2M0NDIxNzMtMjMwYS00MmNiLTlkY2EtOWViYTIyYWMzNjAzOnN0cmluZzpIRUFMVEhDRVJUIiwidHlwZSI6IjU0MWVjMWE0LTJkYjItNDdjNi04OGNhLTcxZGIxYjczNTlkMzpzdHJpbmc6RU1CRURERURfUkVOREVSRVIiLCJ1cmwiOiI5NzUyM2Y5Yi1lYmY2LTQ2YjYtOTI5YS0wMmRmMTY2YzQ5MTE6c3RyaW5nOmh0dHBzOi8vbW9oLWhlYWx0aGNlcnQtcmVuZGVyZXIubmV0bGlmeS5hcHAvIn19LCJzaWduYXR1cmUiOnsidHlwZSI6IlNIQTNNZXJrbGVQcm9vZiIsInRhcmdldEhhc2giOiJmZjM0M2FhMjQzMjg0MTExN2NlMzNmMWEwYmNlNzU0ODhmYzUxZDg5MDhmZDZmMTMzZWYyZDRhZjE4YjllYmMyIiwicHJvb2YiOltdLCJtZXJrbGVSb290IjoiZmYzNDNhYTI0MzI4NDExMTdjZTMzZjFhMGJjZTc1NDg4ZmM1MWQ4OTA4ZmQ2ZjEzM2VmMmQ0YWYxOGI5ZWJjMiJ9LCJwcm9vZiI6W3sidHlwZSI6Ik9wZW5BdHRlc3RhdGlvblNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMC0xMC0wN1QwOTo1NjoxMC42OTFaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIiLCJzaWduYXR1cmUiOiIweDI5NjYzYTZiZDhiYzA5MTdmMzdkMWIyMGViNjQ0N2M5ZTc4OGQ1MTc3NWNhOWZlYWExZjk4YjYyYWVhODZiYTAyMDIyZjhhMzFkOWE1Y2IwYmU3YWFhYzY1ZDZhMTJkZjc0YmQzZTBlNzkxMTEzMmNiZGUxNzhhMTg2ZTZhMDViMWIifV19", - "filename": "healthcert.txt", - "type": "text/open-attestation", - }, - ], - "fhirBundle": Object { - "entry": Array [ - Object { - "birthDate": "1990-01-15", - "extension": Array [ - Object { - "code": Object { - "text": "SG", - }, - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - }, - ], - "gender": "female", - "identifier": Array [ - Object { - "type": "PPN", - "value": "E7831177G", - }, - Object { - "type": Object { - "text": "NRIC", - }, - "value": "S****989Z", - }, - ], - "name": Array [ - Object { - "text": "Tan Chen Chen", - }, - ], - "resourceType": "Patient", - }, - Object { - "collection": Object { - "collectedDateTime": "2020-09-27T06:15:00Z", - }, - "resourceType": "Specimen", - "type": Object { - "coding": Array [ - Object { - "code": "258500001", - "display": "Nasopharyngeal swab", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "code": Object { - "coding": Array [ - Object { - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test", - "system": "http://loinc.org", - }, - ], - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "identifier": Array [ - Object { - "type": "ACSN", - "value": "123456789", - }, - ], - "performer": Object { - "name": Array [ - Object { - "text": "Dr Michael Lim", - }, - ], - }, - "qualification": Array [ - Object { - "identifier": "MCR 123214", - "issuer": "MOH", - }, - ], - "resourceType": "Observation", - "status": "final", - "valueCodeableConcept": Object { - "coding": Array [ - Object { - "code": "260385009", - "display": "Negative", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "contact": Object { - "address": Object { - "text": "MacRitchie Hospital Thomson Road Singapore 123000", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6563113111", - }, - ], - }, - "endpoint": Object { - "address": "https://www.macritchieclinic.com.sg", - }, - "name": "MacRitchie Medical Clinic", - "resourceType": "Organization", - "type": "Licensed Healthcare Provider", - }, - Object { - "contact": Object { - "address": Object { - "text": "2 Thomson Avenue 4 Singapore 098888", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6562711188", - }, - ], - }, - "name": "MacRitchie Laboratory", - "resourceType": "Organization", - "type": "Accredited Laboratory", - }, - ], - "resourceType": "Bundle", - "type": "collection", - }, - "fhirVersion": "4.0.1", - "id": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "issuers": Array [ - Object { - "id": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E", - "identityProof": Object { - "key": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller", - "location": "moh.gov.sg", - "type": "DNS-DID", - }, - "name": "Ministry of Health (Singapore)", - "revocation": Object { - "type": "NONE", - }, - }, - ], - "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAM1BMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzeCmiAAAAAEHRSTlMAQL+A7xAgn2DP3zBwr1CPEl+I/QAABwdJREFUeNrsnd122yoQRvkHISHN+z/tyUk9oTECQ1bTBc23byNs0B5GIDARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk+Ik+Idx4g5N4B9GQ/rPA9J/IPfSgwL/MEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP5ZPoP5r7FJKAf7cufBihPNSkX5hlA9u+DsP7dX/JK1P2VPiSIoebErLwVh5Zx+8C1Y22YtP0Fpf6hdea+mq1Wlixfej6RcDxj09swXbbeBQpijug20aj/SE8bvo5hEuavAuSKpQfJxTG91gUrCV6jSQE0oPke4wuke705EqpLNWxtMtSk4jvXGld+tLlxvVMNnakD7mEndYTVWSnV860WUXl34RMy7BempyGzN7pAbmXEA6bfvK0u32uTFKKVM0r0Yw1MTcFvp8iVLPD0+9gHQy+7rSf3eejp2HuFcsmldiEz0FzKXfSRw3qe08Xqd9dP6QKONnku4lG3NSb/RBtKtKt1ttdBJiYb2VI7brc7tc8IYotJzHUB0c+O+T3rTQuLKsZRqpzkTS7dZI4vo+qJndEGO8Ezecyjac6/ITN2KOWaULIT/aLdeUnqpdi7VW2+Kyc29FL3s7e3hi5LTSheWWpyWlH4XzmvWjniOiFN3YWDivWI92Wuk5ct2C0p3Jzl9YN66WI5IV/VyF86r1a17pH5UMC0pX/DwXVU524Ks5YgDZmL4zGz1w80p33Pj1pMvci+tc2cFIjmhH2dWVfuaVLuLjy9eTzgqOrqewv0vum/1KR4+2a6Dh5pXO7V9O+s4KRJPADuxNjtjFCCk/CltEzgfzSterSvdZQZeDoyyqxQguR1lXmBlI/9PSebZpbOe8bivt2bFK9YaK4eHe7NLNatLP3qGYLfL71RoMvB6Xu96J3TWt9LToQM5zm8YfxbHIESPZXXW/tovTSo+PqFxNeswZqjO/X09OvBgi9OcHw7llUukcv+di0rneqf99uXoKglMMwall7x/my0mlP5piVnv3fuZ+193xnpTYLz3SjejPLXpO6TtXbzXpfIUceJHmPsXAJsbI+aL7fvsppVsOX7uadJ9FvuT63PxsZAQ3UMxygLyWvsk6/luku40fb8ttolDFFb1ZQQ6/mRkv1iW9i1J6C/1aejAcvQPVmUt6FB2cn26JzDO4TsaLcWeaTbo7In04X08696XxTnrkmzGCHimmJpLuNaPi71f+KOkte5IK9OrS74ingPSfJd1oISD9Z0m/hPhB0o+/Ld3MMGUrSU68s9yUzXSO3suhW+Bh+Jj0oyz2snZqgpczd5iwpvRvmKfXpY/P0yeSfsgHOhliwtLS7cBSiR1aZFP30q+Bt3fXbK9hQ2Tr+4rSc+8dflXCO2l6pY+PIs5pF1xs4kmbXVB6z0JWRRdH+6B0w8VeoydeWlV84xaULnvX08vEzNn+HJOu+tfT1cSbKPLewvWkc/c1/Yts4SlJ+DHpunsF3069XSrw7VhQel4gHN3QuHO8jEk/O8cC+Uo/pXR+vG0LSn/ZXxlXyIoc60PSheldwvdzb4HW3I71pO/0wHYqOIp8v41JT52TNjf5jx24fmE96WLrG7/bsoM6ehCGpJ8s0/ZV3k8qnTOdX1B66HOgb4b5KRftl54fC7ovyvZZpXt6Jy4o3ZqedOvMTdslPUhD0rlWxvVMFtS0P1UOnPvWk84Xdb0DIXW/kHiMSLem7rMMKDmt9J0HmgtK/3Bg7GhgOGLCgPT8afp1pdTEx4886ngtKF2c9OpsgVDbOKCJOQaki+1VrFi+wriJpfNa/orShcrW286jLYsyyfZLl8SEtnM65j1SLH+wXVG6jc0DYI986FujKJnQLV0c1Mrw7sO5n/fwwDfkoj9gfD4ozhyFAUVMqBRlYrCd0oUnRrkiyEzOPFNLFzTzT5VlBXd3Om8ozkBtOOdDPZkU9k9/PCpLkHarnZUfIhXOv0/6ISv0SOcvj/1b9tzfkN5G3x7ebdIh34WfF6tpDrrYK6PUpd/4fJS3bpXartOJN+SRDBXOv0l6m6EzZ1z35lw9k3RO01WMFBU4H4+21lMbb8Xs0vlvYVHp3PUqKCcaODUsnbNLSR5cTC+dZ+ppVelCnKa117eNTNQkSVFiU2tP+QrSOVvZZaULqwvtPCh/jdMb3RN99QOkojv8LsQS0k/O7+tKf+NMT96NP0UvLvinRm9Jn24wVrbDCbGIdF4xVBNJ/xJSe6Ueo/Bj/9I/7Dy0PvrnJy5opSIRRZX0aQUAAPzX3h3UAACAQAx7YAD/anFBCNdamIABAAAAAAAAAAAAAAAAAAAAAAAAAADAmmoeK9HziB5I9EBXnx8AAAAAAAAAALBmAIZKmzWInxyOAAAAAElFTkSuQmCC", - "name": "HealthCert", - "notarisationMetadata": Object { - "notarisedOn": "1970-01-01T00:00:01.000Z", - "passportNumber": "E7831177G", - "reference": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "url": "https://example.com", - }, - "validFrom": "2020-11-20", - } - `); -}); - -it("should create the unwrapped document from input data with empty signedEuHealthCerts", () => { - const createdDocument = createUnwrappedDocument( - sampleDocument, - uuid, - storedUrl, - [] - ); - expect(createdDocument).toMatchInlineSnapshot(` - Object { - "$template": Object { - "name": "HEALTH_CERT", - "type": "EMBEDDED_RENDERER", - "url": "https://healthcert.renderer.moh.gov.sg/", - }, - "attachments": Array [ - Object { - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiYTFjMmQyODItNmMxZi00ZTQyLWEzMzUtZTg4OGRhNGQxYjM0OnN0cmluZzpURVNUMDAxIiwibmFtZSI6ImMyNzI3NTNkLWRjYTItNDk5Zi1iNTQzLTM4MTQ0OWU4NTA3NDpzdHJpbmc6SGVhbHRoQ2VydCIsInZhbGlkRnJvbSI6IjhjMWVlYWVkLWU4MTItNDliMi1iZTY2LTg2OGIxZmNiNDJmZTpzdHJpbmc6MjAyMC0xMS0yMCIsImZoaXJWZXJzaW9uIjoiNTg2ZDQ4NjEtYzlmZC00ZmE4LTk0NmEtMWIwZGJiMzY2MWM5OnN0cmluZzo0LjAuMSIsImZoaXJCdW5kbGUiOnsicmVzb3VyY2VUeXBlIjoiM2ZkOWI1MjAtN2JiYS00NzczLWJjMTgtMTZmMGY1N2U0NjlmOnN0cmluZzpCdW5kbGUiLCJ0eXBlIjoiMGRkNDZkZGEtODY0Yy00ZTgwLWI0NmUtYzc4MDE2MjFmYzdmOnN0cmluZzpjb2xsZWN0aW9uIiwiZW50cnkiOlt7InJlc291cmNlVHlwZSI6IjdkMTI5MWJiLWIxMTQtNDI0Yi1iMDY2LTE1ZmQyMmFlOWRiNTpzdHJpbmc6UGF0aWVudCIsImV4dGVuc2lvbiI6W3sidXJsIjoiMmVlNGRmNjItYjViZS00MWQ0LWI4ZWYtYWI4ZTE4NTdlMjA4OnN0cmluZzpodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vcGF0aWVudC1uYXRpb25hbGl0eSIsImNvZGUiOnsidGV4dCI6ImVhOTUzMmQ1LTlhMmQtNDRlYS05ZDFlLTlmZDMyN2M4MzY0NTpzdHJpbmc6U0cifX1dLCJpZGVudGlmaWVyIjpbeyJ0eXBlIjoiMDExYzEzYmUtMzE5Ny00ZDA4LTk0ZTMtYzNkMzExZTgxNjNkOnN0cmluZzpQUE4iLCJ2YWx1ZSI6ImEwZTE0YTUwLTZkMGUtNDk4Ni1iYWE1LThmMmQyZDZkNTZlYjpzdHJpbmc6RTc4MzExNzdHIn0seyJ0eXBlIjp7InRleHQiOiIyZmUyZjIzMy05MzBmLTRlYmItODFmZi1iYmI1MzdhM2Y3ZjI6c3RyaW5nOk5SSUMifSwidmFsdWUiOiI4ODkyMTc2Zi0yZGMzLTQ0ODctOTc1Ni1iOWJmNWUyN2EwYmI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjM0OGY0YThiLTBiMTktNDkyZi05YThhLTk0MTkxZjE3NDg1YzpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNWE3MWI3Y2ItMWNkNy00NzBjLTgzMWItYzBiMDkzMDJmMmZjOnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiIzN2ZhODRjNy0yMjg1LTQ0N2EtOTRmOS04MWUyMzA2MTY2MTE6c3RyaW5nOjE5OTAtMDEtMTUifSx7InJlc291cmNlVHlwZSI6IjQ2NjUxMzk3LTlhMzAtNDFkYS1iOGQ1LTVlMzk2MTRjMzM1YjpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYWM5NjQ3ODAtOWFiNS00M2U2LTg3NmMtN2Y2M2IxMjIxNDlkOnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6IjgwYTM3YTM0LWZhYjEtNGZjOS1iOGFjLWUzNGVkYTZhNDA2YTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjdmMDFmMGUwLTIxN2UtNDFhYi04MTA1LWUzOGYwMmViNWUxNzpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI1MjcwODc5Yi05OTBkLTRlN2EtYmM3Ny1jNWU5ZWJkZjM5NWY6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19LHsicmVzb3VyY2VUeXBlIjoiNjY2M2I0NjEtYWYwYy00YTI0LWI3ODgtNThiOGY3MjM3NjE5OnN0cmluZzpPYnNlcnZhdGlvbiIsImlkZW50aWZpZXIiOlt7InZhbHVlIjoiNzFlYmNkYWMtOTU1My00MmFmLWE3M2ItNmJlYTQyNmM3MzVhOnN0cmluZzoxMjM0NTY3ODkiLCJ0eXBlIjoiYzQxMjliMWMtY2U5NC00ZDk5LWI4NTktMjc2NzQ2OTJlYzc2OnN0cmluZzpBQ1NOIn1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMzdkZDBjMTMtZGMxMy00ZDY4LWFhZDYtMzgwOGMzNzg2NWViOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6IjUwYmUwOWE4LTAwNzMtNGUxMS1iMGNkLWZjOTg5NGM4OGYzMjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiI5YmYxOWFkNC1jMTFiLTQzOWUtOWUxNS05ZTJmODhiZGY5Nzg6c3RyaW5nOlJldmVyc2UgdHJhbnNjcmlwdGlvbiBwb2x5bWVyYXNlIGNoYWluIHJlYWN0aW9uIChyUlQtUENSKSB0ZXN0In1dfSwidmFsdWVDb2RlYWJsZUNvbmNlcHQiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI0YWQ1ODBiNS1iYWQ2LTQxZjEtYmJkYS0xZDlmNGY5ODFiY2M6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNWM2NTRlMWUtNmNjOS00NGViLTllOTktNGU5ZGVjZDU2ODZjOnN0cmluZzoyNjAzODUwMDkiLCJkaXNwbGF5IjoiNzI2Y2E5NjgtMjk0MS00Yzc2LTg3MWQtYWM1N2JhOWNkMDVmOnN0cmluZzpOZWdhdGl2ZSJ9XX0sImVmZmVjdGl2ZURhdGVUaW1lIjoiYzhlYzhhNWYtYWY1ZS00MzYyLTgwM2YtZGMyNzAwM2ZhYjEzOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsInN0YXR1cyI6IjFlYTBkZmE5LWRiMzQtNDFlMy1hNDkwLWRkZWQ0YjM1NGExOTpzdHJpbmc6ZmluYWwiLCJwZXJmb3JtZXIiOnsibmFtZSI6W3sidGV4dCI6ImE3NzI1MDE5LWNkNDYtNDEyNS05MDAzLTdmNDE2NGMyOTY2MjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV19LCJxdWFsaWZpY2F0aW9uIjpbeyJpZGVudGlmaWVyIjoiMDExMTY1OWEtNTRhMi00MjYwLWJlMzUtZDNlMmQzZmVlYTAwOnN0cmluZzpNQ1IgMTIzMjE0IiwiaXNzdWVyIjoiZjQzNTRjYzQtYzJhOS00YTk2LWE1OTQtODE1YmNkY2FmNjdjOnN0cmluZzpNT0gifV19LHsicmVzb3VyY2VUeXBlIjoiNDc0ODg4NjYtNjkyMC00MWIwLWJjNzMtMDM1ZmMxMDY3MDFmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiNzc3OGM2ZTgtZTI5My00NzJiLWJiNmEtNDNmMWFiNDg1YzlkOnN0cmluZzpNYWNSaXRjaGllIE1lZGljYWwgQ2xpbmljIiwidHlwZSI6IjA0OGQ1ZGM4LTg1ZmMtNDQyZC1hMThlLTdmY2UwNDk0ZDczNTpzdHJpbmc6TGljZW5zZWQgSGVhbHRoY2FyZSBQcm92aWRlciIsImVuZHBvaW50Ijp7ImFkZHJlc3MiOiI5NjkzYjdhOS0yMzI5LTRiOTgtODVmNi1hNThjNWNlNGI5ZTU6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0sImNvbnRhY3QiOnsidGVsZWNvbSI6W3sic3lzdGVtIjoiYjU5YjI2NDYtNWVjYi00NWM0LThmOGEtODAwYzBjMWI4MDhmOnN0cmluZzpwaG9uZSIsInZhbHVlIjoiZjk5MDMzNjYtMTgyNS00Njc5LWI1MzUtNjk5ODdkZGQyYWQ5OnN0cmluZzorNjU2MzExMzExMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiYmY0OTE0NDYtMDAzMy00NzBlLThhOTQtMjc4ZmIyNWRkZDY2OnN0cmluZzpwaHlzaWNhbCIsInVzZSI6Ijc0ZTEwMTMzLTcyNTUtNGRjNy04NjNiLTgxYjA1MDZiMWFhMjpzdHJpbmc6d29yayIsInRleHQiOiI3NjFlNDI0OC1iNTI0LTRjODctOGM0ZC0xZDYyZTg3ZjhjZWY6c3RyaW5nOk1hY1JpdGNoaWUgSG9zcGl0YWwgVGhvbXNvbiBSb2FkIFNpbmdhcG9yZSAxMjMwMDAifX19LHsicmVzb3VyY2VUeXBlIjoiMTE3YzhjNjQtYzcyNy00ZGY2LWE3YjItMGE1Mjk3YTZjZTFhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMjQzYTliN2ItMzczOC00MWIzLWJiNzQtMGFjY2IyYzFmYWNjOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjoiOTNiMzI4ODgtOTI2MC00NWYyLWE4ZTAtOTE3YzkwOWRiZThkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkiLCJjb250YWN0Ijp7InRlbGVjb20iOlt7InN5c3RlbSI6IjM4MDY3NDQ1LTNkNDctNDYyNS1hYjE0LTNmNjk3MjlkODYwYzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6ImUzNDU2MWNlLWQ0MGEtNDE4NC05ZGRkLTM3ODU3OTIzMjg3ZTpzdHJpbmc6KzY1NjI3MTExODgifV0sImFkZHJlc3MiOnsidHlwZSI6ImNjNTcwZDBkLTUzOWEtNGY0Ny05MjExLTlkMWYzMzZkZmVjMjpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJjMjViZTJhNS04NjUzLTRjZGMtOWQ1ZS0wNjM5OTBmZjY2M2Y6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiOGI0OGYzYzAtNTc1NC00ZmQ3LTk5YTgtMjM0NDNmNDRlOGMzOnN0cmluZzoyIFRob21zb24gQXZlbnVlIDQgU2luZ2Fwb3JlIDA5ODg4OCJ9fX1dfSwiaXNzdWVycyI6W3siaWQiOiI3YzZhNWFmMS1hMTg3LTQ5NTktYjk5My1iYzg1NmZiN2MzYzc6c3RyaW5nOmRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCIsInJldm9jYXRpb24iOnsidHlwZSI6IjhmNmY2OGI0LTQwNzMtNDc5Ni05YTlhLWI4MDM3NmUzNTk4NjpzdHJpbmc6Tk9ORSJ9LCJuYW1lIjoiNGQ2MTRiYzctNDk2NC00YmI5LTkyYjYtNGM4YWQzNmQ3ZTgwOnN0cmluZzpTQU1QTEUgQ0xJTklDIiwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjI3YmE4NjYtYjcxNC00MTcyLWJiOGUtYmFhYzcwYzdmYzJkOnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI5ZGRlN2RjOC1lMTk4LTQ1ZDItYmJjNi1jYzg2NDgyMWEwMzQ6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6Ijg5MjRjOWRhLTYzNjQtNDZhZi04MTc1LTAzMDM1OTk5NWNkNDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCJsb2dvIjoiOGU5NDFkY2ItM2MzNi00NGZiLWFlZTEtODgxMzY2MzQ2ZGY4OnN0cmluZzpkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWZRQUFBRElDQU1BQUFBcHgrUGFBQUFBTTFCTVZFVUFBQURNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16ZUNtaUFBQUFBRUhSU1RsTUFRTCtBN3hBZ24yRFAzekJ3cjFDUEVsK0kvUUFBQndkSlJFRlVlTnJzbmQxMjJ5b1FSdmtISVNITit6L3R5VWs5b1RFQ1ExYlRCYzIzYnlOczBCNUdJREFSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWsrSWsrSWR4NGc1TjRCOUdRL3JQQTlKL0lQZlNnd0wvTUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UDVaUG9QNXI3RkpLQWY3Y3VmQmloUE5Ta1g1aGxBOXUrRHNQN2RYL0pLMVAyVlBpU0lvZWJFckx3Vmg1WngrOEMxWTIyWXRQMEZwZjZoZGVhK21xMVdsaXhmZWo2UmNEeGowOXN3WGJiZUJRcGlqdWcyMGFqL1NFOGJ2bzVoRXVhdkF1U0twUWZKeFRHOTFnVXJDVjZqU1FFMG9Qa2U0d3VrZTcwNUVxcExOV3h0TXRTazRqdlhHbGQrdExseHZWTU5uYWtEN21FbmRZVFZXU25WODYwV1VYbDM0Uk15N0JlbXB5R3pON3BBYm1YRUE2YmZ2SzB1MzJ1VEZLS1ZNMHIwWXcxTVRjRnZwOGlWTFBEMCs5Z0hReSs3clNmM2VlanAySHVGY3NtbGRpRXowRnpLWGZTUnczcWUwOFhxZDlkUDZRS09Obmt1NGxHM05TYi9SQnRLdEt0MXR0ZEJKaVliMlZJN2JyYzd0YzhJWW90SnpIVUIwYytPK1QzclRRdUxLc1pScXB6a1RTN2RaSTR2bytxSm5kRUdPOEV6ZWN5amFjNi9JVE4yS09XYVVMSVQvYUxkZVVucXBkaTdWVzIrS3ljMjlGTDNzN2UzaGk1TFRTaGVXV3B5V2xINFh6bXZXam5pT2lGTjNZV0RpdldJOTJXdWs1Y3QyQzBwM0p6bDlZTjY2V0k1SVYvVnlGODZyMWExN3BINVVNQzBwWC9Ed1hWVTUyNEtzNVlnRFptTDR6R3oxdzgwcDMzUGoxcE12Y2krdGMyY0ZJam1oSDJkV1ZmdWFWTHVMank5ZVR6Z3FPcnFld3YwdnVtLzFLUjQrMmE2RGg1cFhPN1Y5TytzNEtSSlBBRHV4Tmp0akZDQ2svQ2x0RXpnZnpTdGVyU3ZkWlFaZURveXlxeFFndVIxbFhtQmxJLzlQU2ViWnBiT2U4Yml2dDJiRks5WWFLNGVIZTdOTE5hdExQM3FHWUxmTDcxUm9NdkI2WHU5NkozVFd0OUxUb1FNNXptOFlmeGJISUVTUFpYWFcvdG92VFNvK1BxRnhOZXN3WnFqTy9YMDlPdkJnaTlPY0h3N2xsVXVrY3YrZGkwcm5lcWY5OXVYb0tnbE1Nd2FsbDd4L215MG1sUDVwaVZudjNmdVorMTkzeG5wVFlMejNTamVqUExYcE82VHRYYnpYcGZJVWNlSkhtUHNYQUpzYkkrYUw3ZnZzcHBWc09YN3VhZEo5RnZ1VDYzUHhzWkFRM1VNeHlnTHlXdnNrNi9sdWt1NDBmYjh0dG9sREZGYjFaUVE2L21Sa3YxaVc5aTFKNkMvMWFlakFjdlFQVm1VdDZGQjJjbjI2SnpETzRUc2FMY1dlYVRibzdJbjA0WDA4Njk2WHhUbnJrbXpHQ0hpbW1KcEx1TmFQaTcxZitLT2t0ZTVJSzlPclM3NGluZ1BTZkpkMW9JU0Q5WjBtL2hQaEIwbysvTGQzTU1HVXJTVTY4czl5VXpYU08zc3VoVytCaCtKajBveXoyc25acWdwY3pkNWl3cHZSdm1LZlhwWS9QMHllU2ZzZ0hPaGxpd3RMUzdjQlNpUjFhWkZQMzBxK0J0M2ZYYks5aFEyVHIrNHJTYys4ZGZsWENPMmw2cFkrUElzNXBGMXhzNGttYlhWQjZ6MEpXUlJkSCs2QjB3OFZlb3lkZVdsVjg0eGFVTG52WDA4dkV6Tm4rSEpPdSt0ZlQxY1NiS1BMZXd2V2tjL2MxL1l0czRTbEorREhwdW5zRjMwNjlYU3J3N1ZoUWVsNGdITjNRdUhPOGpFay9POGNDK1VvL3BYUit2RzBMU24vWlh4bFh5SW9jNjBQU2hlbGR3dmR6YjRIVzNJNzFwTy8wd0hZcU9JcDh2NDFKVDUyVE5qZjVqeDI0Zm1FOTZXTHJHNy9ic29NNmVoQ0dwSjhzMC9aVjNrOHFuVE9kWDFCNjZIT2diNGI1S1JmdGw1NGZDN292eXZaWnBYdDZKeTRvM1pxZWRPdk1UZHNsUFVoRDBybFd4dlZNRnRTMFAxVU9uUHZXazg0WGRiMERJWFcva0hpTVNMZW03ck1NS0RtdDlKMEhtZ3RLLzNCZzdHaGdPR0xDZ1BUOGFmcDFwZFRFeDQ4ODZuZ3RLRjJjOU9wc2dWRGJPS0NKT1Fha2krMVZyRmkrd3JpSnBmTmEvb3JTaGNyVzI4NmpMWXN5eWZaTGw4U0V0bk02NWoxU0xIK3dYVkc2amMwRFlJOTg2RnVqS0puUUxWMGMxTXJ3N3NPNW4vZnd3RGZrb2o5Z2ZENG96aHlGQVVWTXFCUmxZckNkMG9VblJya2l5RXpPUEZOTEZ6VHpUNVZsQlhkM09tOG96a0J0T09kRFBaa1U5azkvUENwTGtIYXJuWlVmSWhYT3YwLzZJU3YwU09jdmovMWI5dHpma041RzN4N2ViZEloMzRXZkY2dHBEcnJZSzZQVXBkLzRmSlMzYnBYYXJ0T0pOK1NSREJYT3YwbDZtNkV6WjF6MzVsdzlrM1JPMDFXTUZCVTRINCsyMWxNYmI4WHMwdmx2WVZIcDNQVXFLQ2NhT0RVc25iTkxTUjVjVEMrZForcHBWZWxDbkthMTE3ZU5UTlFrU1ZGaVUydFArUXJTT1Z2WlphVUxxd3Z0UENoL2pkTWIzUk45OVFPa29qdjhMc1FTMGsvTzcrdEtmK05NVDk2TlAwVXZMdmluUm05Sm4yNHdWcmJEQ2JHSWRGNHhWQk5KL3hKU2U2VWVvL0JqLzlJLzdEeTBQdnJuSnk1b3BTSVJSWlgwYVFVQUFQelgzaDNVQUFDQVFBeDdZQUQvYW5GQkNOZGFtSUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQW1tb2VLOUh6aUI1STlFQlhueDhBQUFBQUFBQUFBTEJtQUlaS216V0lueHlPQUFBQUFFbEZUa1N1UW1DQyIsIiR0ZW1wbGF0ZSI6eyJuYW1lIjoiN2M0NDIxNzMtMjMwYS00MmNiLTlkY2EtOWViYTIyYWMzNjAzOnN0cmluZzpIRUFMVEhDRVJUIiwidHlwZSI6IjU0MWVjMWE0LTJkYjItNDdjNi04OGNhLTcxZGIxYjczNTlkMzpzdHJpbmc6RU1CRURERURfUkVOREVSRVIiLCJ1cmwiOiI5NzUyM2Y5Yi1lYmY2LTQ2YjYtOTI5YS0wMmRmMTY2YzQ5MTE6c3RyaW5nOmh0dHBzOi8vbW9oLWhlYWx0aGNlcnQtcmVuZGVyZXIubmV0bGlmeS5hcHAvIn19LCJzaWduYXR1cmUiOnsidHlwZSI6IlNIQTNNZXJrbGVQcm9vZiIsInRhcmdldEhhc2giOiJmZjM0M2FhMjQzMjg0MTExN2NlMzNmMWEwYmNlNzU0ODhmYzUxZDg5MDhmZDZmMTMzZWYyZDRhZjE4YjllYmMyIiwicHJvb2YiOltdLCJtZXJrbGVSb290IjoiZmYzNDNhYTI0MzI4NDExMTdjZTMzZjFhMGJjZTc1NDg4ZmM1MWQ4OTA4ZmQ2ZjEzM2VmMmQ0YWYxOGI5ZWJjMiJ9LCJwcm9vZiI6W3sidHlwZSI6Ik9wZW5BdHRlc3RhdGlvblNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMC0xMC0wN1QwOTo1NjoxMC42OTFaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIiLCJzaWduYXR1cmUiOiIweDI5NjYzYTZiZDhiYzA5MTdmMzdkMWIyMGViNjQ0N2M5ZTc4OGQ1MTc3NWNhOWZlYWExZjk4YjYyYWVhODZiYTAyMDIyZjhhMzFkOWE1Y2IwYmU3YWFhYzY1ZDZhMTJkZjc0YmQzZTBlNzkxMTEzMmNiZGUxNzhhMTg2ZTZhMDViMWIifV19", - "filename": "healthcert.txt", - "type": "text/open-attestation", - }, - ], - "fhirBundle": Object { - "entry": Array [ - Object { - "birthDate": "1990-01-15", - "extension": Array [ - Object { - "code": Object { - "text": "SG", - }, - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - }, - ], - "gender": "female", - "identifier": Array [ - Object { - "type": "PPN", - "value": "E7831177G", - }, - Object { - "type": Object { - "text": "NRIC", - }, - "value": "S****989Z", - }, - ], - "name": Array [ - Object { - "text": "Tan Chen Chen", - }, - ], - "resourceType": "Patient", - }, - Object { - "collection": Object { - "collectedDateTime": "2020-09-27T06:15:00Z", - }, - "resourceType": "Specimen", - "type": Object { - "coding": Array [ - Object { - "code": "258500001", - "display": "Nasopharyngeal swab", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "code": Object { - "coding": Array [ - Object { - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test", - "system": "http://loinc.org", - }, - ], - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "identifier": Array [ - Object { - "type": "ACSN", - "value": "123456789", - }, - ], - "performer": Object { - "name": Array [ - Object { - "text": "Dr Michael Lim", - }, - ], - }, - "qualification": Array [ - Object { - "identifier": "MCR 123214", - "issuer": "MOH", - }, - ], - "resourceType": "Observation", - "status": "final", - "valueCodeableConcept": Object { - "coding": Array [ - Object { - "code": "260385009", - "display": "Negative", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "contact": Object { - "address": Object { - "text": "MacRitchie Hospital Thomson Road Singapore 123000", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6563113111", - }, - ], - }, - "endpoint": Object { - "address": "https://www.macritchieclinic.com.sg", - }, - "name": "MacRitchie Medical Clinic", - "resourceType": "Organization", - "type": "Licensed Healthcare Provider", - }, - Object { - "contact": Object { - "address": Object { - "text": "2 Thomson Avenue 4 Singapore 098888", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6562711188", - }, - ], - }, - "name": "MacRitchie Laboratory", - "resourceType": "Organization", - "type": "Accredited Laboratory", - }, - ], - "resourceType": "Bundle", - "type": "collection", - }, - "fhirVersion": "4.0.1", - "id": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "issuers": Array [ - Object { - "id": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E", - "identityProof": Object { - "key": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller", - "location": "moh.gov.sg", - "type": "DNS-DID", - }, - "name": "Ministry of Health (Singapore)", - "revocation": Object { - "type": "NONE", - }, - }, - ], - "logo": "data:image/png;base64,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", - "name": "HealthCert", - "notarisationMetadata": Object { - "notarisedOn": "1970-01-01T00:00:01.000Z", - "passportNumber": "E7831177G", - "reference": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "url": "https://example.com", - }, - "validFrom": "2020-11-20", - } - `); -}); - -it("should create the unwrapped document from input data with signedEuHealthCerts", () => { - const createdDocument = createUnwrappedDocument( - sampleDocument, - uuid, - storedUrl, - sampleSignedEuHealthCerts - ); - expect(createdDocument).toMatchInlineSnapshot(` - Object { - "$template": Object { - "name": "HEALTH_CERT", - "type": "EMBEDDED_RENDERER", - "url": "https://healthcert.renderer.moh.gov.sg/", - }, - "attachments": Array [ - Object { - "data": "eyJ2ZXJzaW9uIjoiaHR0cHM6Ly9zY2hlbWEub3BlbmF0dGVzdGF0aW9uLmNvbS8yLjAvc2NoZW1hLmpzb24iLCJkYXRhIjp7ImlkIjoiYTFjMmQyODItNmMxZi00ZTQyLWEzMzUtZTg4OGRhNGQxYjM0OnN0cmluZzpURVNUMDAxIiwibmFtZSI6ImMyNzI3NTNkLWRjYTItNDk5Zi1iNTQzLTM4MTQ0OWU4NTA3NDpzdHJpbmc6SGVhbHRoQ2VydCIsInZhbGlkRnJvbSI6IjhjMWVlYWVkLWU4MTItNDliMi1iZTY2LTg2OGIxZmNiNDJmZTpzdHJpbmc6MjAyMC0xMS0yMCIsImZoaXJWZXJzaW9uIjoiNTg2ZDQ4NjEtYzlmZC00ZmE4LTk0NmEtMWIwZGJiMzY2MWM5OnN0cmluZzo0LjAuMSIsImZoaXJCdW5kbGUiOnsicmVzb3VyY2VUeXBlIjoiM2ZkOWI1MjAtN2JiYS00NzczLWJjMTgtMTZmMGY1N2U0NjlmOnN0cmluZzpCdW5kbGUiLCJ0eXBlIjoiMGRkNDZkZGEtODY0Yy00ZTgwLWI0NmUtYzc4MDE2MjFmYzdmOnN0cmluZzpjb2xsZWN0aW9uIiwiZW50cnkiOlt7InJlc291cmNlVHlwZSI6IjdkMTI5MWJiLWIxMTQtNDI0Yi1iMDY2LTE1ZmQyMmFlOWRiNTpzdHJpbmc6UGF0aWVudCIsImV4dGVuc2lvbiI6W3sidXJsIjoiMmVlNGRmNjItYjViZS00MWQ0LWI4ZWYtYWI4ZTE4NTdlMjA4OnN0cmluZzpodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vcGF0aWVudC1uYXRpb25hbGl0eSIsImNvZGUiOnsidGV4dCI6ImVhOTUzMmQ1LTlhMmQtNDRlYS05ZDFlLTlmZDMyN2M4MzY0NTpzdHJpbmc6U0cifX1dLCJpZGVudGlmaWVyIjpbeyJ0eXBlIjoiMDExYzEzYmUtMzE5Ny00ZDA4LTk0ZTMtYzNkMzExZTgxNjNkOnN0cmluZzpQUE4iLCJ2YWx1ZSI6ImEwZTE0YTUwLTZkMGUtNDk4Ni1iYWE1LThmMmQyZDZkNTZlYjpzdHJpbmc6RTc4MzExNzdHIn0seyJ0eXBlIjp7InRleHQiOiIyZmUyZjIzMy05MzBmLTRlYmItODFmZi1iYmI1MzdhM2Y3ZjI6c3RyaW5nOk5SSUMifSwidmFsdWUiOiI4ODkyMTc2Zi0yZGMzLTQ0ODctOTc1Ni1iOWJmNWUyN2EwYmI6c3RyaW5nOlM5MDk4OTg5WiJ9XSwibmFtZSI6W3sidGV4dCI6IjM0OGY0YThiLTBiMTktNDkyZi05YThhLTk0MTkxZjE3NDg1YzpzdHJpbmc6VGFuIENoZW4gQ2hlbiJ9XSwiZ2VuZGVyIjoiNWE3MWI3Y2ItMWNkNy00NzBjLTgzMWItYzBiMDkzMDJmMmZjOnN0cmluZzpmZW1hbGUiLCJiaXJ0aERhdGUiOiIzN2ZhODRjNy0yMjg1LTQ0N2EtOTRmOS04MWUyMzA2MTY2MTE6c3RyaW5nOjE5OTAtMDEtMTUifSx7InJlc291cmNlVHlwZSI6IjQ2NjUxMzk3LTlhMzAtNDFkYS1iOGQ1LTVlMzk2MTRjMzM1YjpzdHJpbmc6U3BlY2ltZW4iLCJ0eXBlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiYWM5NjQ3ODAtOWFiNS00M2U2LTg3NmMtN2Y2M2IxMjIxNDlkOnN0cmluZzpodHRwOi8vc25vbWVkLmluZm8vc2N0IiwiY29kZSI6IjgwYTM3YTM0LWZhYjEtNGZjOS1iOGFjLWUzNGVkYTZhNDA2YTpzdHJpbmc6MjU4NTAwMDAxIiwiZGlzcGxheSI6IjdmMDFmMGUwLTIxN2UtNDFhYi04MTA1LWUzOGYwMmViNWUxNzpzdHJpbmc6TmFzb3BoYXJ5bmdlYWwgc3dhYiJ9XX0sImNvbGxlY3Rpb24iOnsiY29sbGVjdGVkRGF0ZVRpbWUiOiI1MjcwODc5Yi05OTBkLTRlN2EtYmM3Ny1jNWU5ZWJkZjM5NWY6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIn19LHsicmVzb3VyY2VUeXBlIjoiNjY2M2I0NjEtYWYwYy00YTI0LWI3ODgtNThiOGY3MjM3NjE5OnN0cmluZzpPYnNlcnZhdGlvbiIsImlkZW50aWZpZXIiOlt7InZhbHVlIjoiNzFlYmNkYWMtOTU1My00MmFmLWE3M2ItNmJlYTQyNmM3MzVhOnN0cmluZzoxMjM0NTY3ODkiLCJ0eXBlIjoiYzQxMjliMWMtY2U5NC00ZDk5LWI4NTktMjc2NzQ2OTJlYzc2OnN0cmluZzpBQ1NOIn1dLCJjb2RlIjp7ImNvZGluZyI6W3sic3lzdGVtIjoiMzdkZDBjMTMtZGMxMy00ZDY4LWFhZDYtMzgwOGMzNzg2NWViOnN0cmluZzpodHRwOi8vbG9pbmMub3JnIiwiY29kZSI6IjUwYmUwOWE4LTAwNzMtNGUxMS1iMGNkLWZjOTg5NGM4OGYzMjpzdHJpbmc6OTQ1MzEtMSIsImRpc3BsYXkiOiI5YmYxOWFkNC1jMTFiLTQzOWUtOWUxNS05ZTJmODhiZGY5Nzg6c3RyaW5nOlJldmVyc2UgdHJhbnNjcmlwdGlvbiBwb2x5bWVyYXNlIGNoYWluIHJlYWN0aW9uIChyUlQtUENSKSB0ZXN0In1dfSwidmFsdWVDb2RlYWJsZUNvbmNlcHQiOnsiY29kaW5nIjpbeyJzeXN0ZW0iOiI0YWQ1ODBiNS1iYWQ2LTQxZjEtYmJkYS0xZDlmNGY5ODFiY2M6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLCJjb2RlIjoiNWM2NTRlMWUtNmNjOS00NGViLTllOTktNGU5ZGVjZDU2ODZjOnN0cmluZzoyNjAzODUwMDkiLCJkaXNwbGF5IjoiNzI2Y2E5NjgtMjk0MS00Yzc2LTg3MWQtYWM1N2JhOWNkMDVmOnN0cmluZzpOZWdhdGl2ZSJ9XX0sImVmZmVjdGl2ZURhdGVUaW1lIjoiYzhlYzhhNWYtYWY1ZS00MzYyLTgwM2YtZGMyNzAwM2ZhYjEzOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsInN0YXR1cyI6IjFlYTBkZmE5LWRiMzQtNDFlMy1hNDkwLWRkZWQ0YjM1NGExOTpzdHJpbmc6ZmluYWwiLCJwZXJmb3JtZXIiOnsibmFtZSI6W3sidGV4dCI6ImE3NzI1MDE5LWNkNDYtNDEyNS05MDAzLTdmNDE2NGMyOTY2MjpzdHJpbmc6RHIgTWljaGFlbCBMaW0ifV19LCJxdWFsaWZpY2F0aW9uIjpbeyJpZGVudGlmaWVyIjoiMDExMTY1OWEtNTRhMi00MjYwLWJlMzUtZDNlMmQzZmVlYTAwOnN0cmluZzpNQ1IgMTIzMjE0IiwiaXNzdWVyIjoiZjQzNTRjYzQtYzJhOS00YTk2LWE1OTQtODE1YmNkY2FmNjdjOnN0cmluZzpNT0gifV19LHsicmVzb3VyY2VUeXBlIjoiNDc0ODg4NjYtNjkyMC00MWIwLWJjNzMtMDM1ZmMxMDY3MDFmOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiNzc3OGM2ZTgtZTI5My00NzJiLWJiNmEtNDNmMWFiNDg1YzlkOnN0cmluZzpNYWNSaXRjaGllIE1lZGljYWwgQ2xpbmljIiwidHlwZSI6IjA0OGQ1ZGM4LTg1ZmMtNDQyZC1hMThlLTdmY2UwNDk0ZDczNTpzdHJpbmc6TGljZW5zZWQgSGVhbHRoY2FyZSBQcm92aWRlciIsImVuZHBvaW50Ijp7ImFkZHJlc3MiOiI5NjkzYjdhOS0yMzI5LTRiOTgtODVmNi1hNThjNWNlNGI5ZTU6c3RyaW5nOmh0dHBzOi8vd3d3Lm1hY3JpdGNoaWVjbGluaWMuY29tLnNnIn0sImNvbnRhY3QiOnsidGVsZWNvbSI6W3sic3lzdGVtIjoiYjU5YjI2NDYtNWVjYi00NWM0LThmOGEtODAwYzBjMWI4MDhmOnN0cmluZzpwaG9uZSIsInZhbHVlIjoiZjk5MDMzNjYtMTgyNS00Njc5LWI1MzUtNjk5ODdkZGQyYWQ5OnN0cmluZzorNjU2MzExMzExMSJ9XSwiYWRkcmVzcyI6eyJ0eXBlIjoiYmY0OTE0NDYtMDAzMy00NzBlLThhOTQtMjc4ZmIyNWRkZDY2OnN0cmluZzpwaHlzaWNhbCIsInVzZSI6Ijc0ZTEwMTMzLTcyNTUtNGRjNy04NjNiLTgxYjA1MDZiMWFhMjpzdHJpbmc6d29yayIsInRleHQiOiI3NjFlNDI0OC1iNTI0LTRjODctOGM0ZC0xZDYyZTg3ZjhjZWY6c3RyaW5nOk1hY1JpdGNoaWUgSG9zcGl0YWwgVGhvbXNvbiBSb2FkIFNpbmdhcG9yZSAxMjMwMDAifX19LHsicmVzb3VyY2VUeXBlIjoiMTE3YzhjNjQtYzcyNy00ZGY2LWE3YjItMGE1Mjk3YTZjZTFhOnN0cmluZzpPcmdhbml6YXRpb24iLCJuYW1lIjoiMjQzYTliN2ItMzczOC00MWIzLWJiNzQtMGFjY2IyYzFmYWNjOnN0cmluZzpNYWNSaXRjaGllIExhYm9yYXRvcnkiLCJ0eXBlIjoiOTNiMzI4ODgtOTI2MC00NWYyLWE4ZTAtOTE3YzkwOWRiZThkOnN0cmluZzpBY2NyZWRpdGVkIExhYm9yYXRvcnkiLCJjb250YWN0Ijp7InRlbGVjb20iOlt7InN5c3RlbSI6IjM4MDY3NDQ1LTNkNDctNDYyNS1hYjE0LTNmNjk3MjlkODYwYzpzdHJpbmc6cGhvbmUiLCJ2YWx1ZSI6ImUzNDU2MWNlLWQ0MGEtNDE4NC05ZGRkLTM3ODU3OTIzMjg3ZTpzdHJpbmc6KzY1NjI3MTExODgifV0sImFkZHJlc3MiOnsidHlwZSI6ImNjNTcwZDBkLTUzOWEtNGY0Ny05MjExLTlkMWYzMzZkZmVjMjpzdHJpbmc6cGh5c2ljYWwiLCJ1c2UiOiJjMjViZTJhNS04NjUzLTRjZGMtOWQ1ZS0wNjM5OTBmZjY2M2Y6c3RyaW5nOndvcmsiLCJ0ZXh0IjoiOGI0OGYzYzAtNTc1NC00ZmQ3LTk5YTgtMjM0NDNmNDRlOGMzOnN0cmluZzoyIFRob21zb24gQXZlbnVlIDQgU2luZ2Fwb3JlIDA5ODg4OCJ9fX1dfSwiaXNzdWVycyI6W3siaWQiOiI3YzZhNWFmMS1hMTg3LTQ5NTktYjk5My1iYzg1NmZiN2MzYzc6c3RyaW5nOmRpZDpldGhyOjB4RTM5NDc5OTI4Q2M0RWZGRTUwNzc0NDg4NzgwQjlmNjE2YmQ0QjgzMCIsInJldm9jYXRpb24iOnsidHlwZSI6IjhmNmY2OGI0LTQwNzMtNDc5Ni05YTlhLWI4MDM3NmUzNTk4NjpzdHJpbmc6Tk9ORSJ9LCJuYW1lIjoiNGQ2MTRiYzctNDk2NC00YmI5LTkyYjYtNGM4YWQzNmQ3ZTgwOnN0cmluZzpTQU1QTEUgQ0xJTklDIiwiaWRlbnRpdHlQcm9vZiI6eyJ0eXBlIjoiNjI3YmE4NjYtYjcxNC00MTcyLWJiOGUtYmFhYzcwYzdmYzJkOnN0cmluZzpETlMtRElEIiwibG9jYXRpb24iOiI5ZGRlN2RjOC1lMTk4LTQ1ZDItYmJjNi1jYzg2NDgyMWEwMzQ6c3RyaW5nOmRvbm90dmVyaWZ5LnRlc3RpbmcudmVyaWZ5Lmdvdi5zZyIsImtleSI6Ijg5MjRjOWRhLTYzNjQtNDZhZi04MTc1LTAzMDM1OTk5NWNkNDpzdHJpbmc6ZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIifX1dLCJsb2dvIjoiOGU5NDFkY2ItM2MzNi00NGZiLWFlZTEtODgxMzY2MzQ2ZGY4OnN0cmluZzpkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWZRQUFBRElDQU1BQUFBcHgrUGFBQUFBTTFCTVZFVUFBQURNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16TXpNek16ZUNtaUFBQUFBRUhSU1RsTUFRTCtBN3hBZ24yRFAzekJ3cjFDUEVsK0kvUUFBQndkSlJFRlVlTnJzbmQxMjJ5b1FSdmtISVNITit6L3R5VWs5b1RFQ1ExYlRCYzIzYnlOczBCNUdJREFSQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWsrSWsrSWR4NGc1TjRCOUdRL3JQQTlKL0lQZlNnd0wvTUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UDVaUG9QNXI3RkpLQWY3Y3VmQmloUE5Ta1g1aGxBOXUrRHNQN2RYL0pLMVAyVlBpU0lvZWJFckx3Vmg1WngrOEMxWTIyWXRQMEZwZjZoZGVhK21xMVdsaXhmZWo2UmNEeGowOXN3WGJiZUJRcGlqdWcyMGFqL1NFOGJ2bzVoRXVhdkF1U0twUWZKeFRHOTFnVXJDVjZqU1FFMG9Qa2U0d3VrZTcwNUVxcExOV3h0TXRTazRqdlhHbGQrdExseHZWTU5uYWtEN21FbmRZVFZXU25WODYwV1VYbDM0Uk15N0JlbXB5R3pON3BBYm1YRUE2YmZ2SzB1MzJ1VEZLS1ZNMHIwWXcxTVRjRnZwOGlWTFBEMCs5Z0hReSs3clNmM2VlanAySHVGY3NtbGRpRXowRnpLWGZTUnczcWUwOFhxZDlkUDZRS09Obmt1NGxHM05TYi9SQnRLdEt0MXR0ZEJKaVliMlZJN2JyYzd0YzhJWW90SnpIVUIwYytPK1QzclRRdUxLc1pScXB6a1RTN2RaSTR2bytxSm5kRUdPOEV6ZWN5amFjNi9JVE4yS09XYVVMSVQvYUxkZVVucXBkaTdWVzIrS3ljMjlGTDNzN2UzaGk1TFRTaGVXV3B5V2xINFh6bXZXam5pT2lGTjNZV0RpdldJOTJXdWs1Y3QyQzBwM0p6bDlZTjY2V0k1SVYvVnlGODZyMWExN3BINVVNQzBwWC9Ed1hWVTUyNEtzNVlnRFptTDR6R3oxdzgwcDMzUGoxcE12Y2krdGMyY0ZJam1oSDJkV1ZmdWFWTHVMank5ZVR6Z3FPcnFld3YwdnVtLzFLUjQrMmE2RGg1cFhPN1Y5TytzNEtSSlBBRHV4Tmp0akZDQ2svQ2x0RXpnZnpTdGVyU3ZkWlFaZURveXlxeFFndVIxbFhtQmxJLzlQU2ViWnBiT2U4Yml2dDJiRks5WWFLNGVIZTdOTE5hdExQM3FHWUxmTDcxUm9NdkI2WHU5NkozVFd0OUxUb1FNNXptOFlmeGJISUVTUFpYWFcvdG92VFNvK1BxRnhOZXN3WnFqTy9YMDlPdkJnaTlPY0h3N2xsVXVrY3YrZGkwcm5lcWY5OXVYb0tnbE1Nd2FsbDd4L215MG1sUDVwaVZudjNmdVorMTkzeG5wVFlMejNTamVqUExYcE82VHRYYnpYcGZJVWNlSkhtUHNYQUpzYkkrYUw3ZnZzcHBWc09YN3VhZEo5RnZ1VDYzUHhzWkFRM1VNeHlnTHlXdnNrNi9sdWt1NDBmYjh0dG9sREZGYjFaUVE2L21Sa3YxaVc5aTFKNkMvMWFlakFjdlFQVm1VdDZGQjJjbjI2SnpETzRUc2FMY1dlYVRibzdJbjA0WDA4Njk2WHhUbnJrbXpHQ0hpbW1KcEx1TmFQaTcxZitLT2t0ZTVJSzlPclM3NGluZ1BTZkpkMW9JU0Q5WjBtL2hQaEIwbysvTGQzTU1HVXJTVTY4czl5VXpYU08zc3VoVytCaCtKajBveXoyc25acWdwY3pkNWl3cHZSdm1LZlhwWS9QMHllU2ZzZ0hPaGxpd3RMUzdjQlNpUjFhWkZQMzBxK0J0M2ZYYks5aFEyVHIrNHJTYys4ZGZsWENPMmw2cFkrUElzNXBGMXhzNGttYlhWQjZ6MEpXUlJkSCs2QjB3OFZlb3lkZVdsVjg0eGFVTG52WDA4dkV6Tm4rSEpPdSt0ZlQxY1NiS1BMZXd2V2tjL2MxL1l0czRTbEorREhwdW5zRjMwNjlYU3J3N1ZoUWVsNGdITjNRdUhPOGpFay9POGNDK1VvL3BYUit2RzBMU24vWlh4bFh5SW9jNjBQU2hlbGR3dmR6YjRIVzNJNzFwTy8wd0hZcU9JcDh2NDFKVDUyVE5qZjVqeDI0Zm1FOTZXTHJHNy9ic29NNmVoQ0dwSjhzMC9aVjNrOHFuVE9kWDFCNjZIT2diNGI1S1JmdGw1NGZDN292eXZaWnBYdDZKeTRvM1pxZWRPdk1UZHNsUFVoRDBybFd4dlZNRnRTMFAxVU9uUHZXazg0WGRiMERJWFcva0hpTVNMZW03ck1NS0RtdDlKMEhtZ3RLLzNCZzdHaGdPR0xDZ1BUOGFmcDFwZFRFeDQ4ODZuZ3RLRjJjOU9wc2dWRGJPS0NKT1Fha2krMVZyRmkrd3JpSnBmTmEvb3JTaGNyVzI4NmpMWXN5eWZaTGw4U0V0bk02NWoxU0xIK3dYVkc2amMwRFlJOTg2RnVqS0puUUxWMGMxTXJ3N3NPNW4vZnd3RGZrb2o5Z2ZENG96aHlGQVVWTXFCUmxZckNkMG9VblJya2l5RXpPUEZOTEZ6VHpUNVZsQlhkM09tOG96a0J0T09kRFBaa1U5azkvUENwTGtIYXJuWlVmSWhYT3YwLzZJU3YwU09jdmovMWI5dHpma041RzN4N2ViZEloMzRXZkY2dHBEcnJZSzZQVXBkLzRmSlMzYnBYYXJ0T0pOK1NSREJYT3YwbDZtNkV6WjF6MzVsdzlrM1JPMDFXTUZCVTRINCsyMWxNYmI4WHMwdmx2WVZIcDNQVXFLQ2NhT0RVc25iTkxTUjVjVEMrZForcHBWZWxDbkthMTE3ZU5UTlFrU1ZGaVUydFArUXJTT1Z2WlphVUxxd3Z0UENoL2pkTWIzUk45OVFPa29qdjhMc1FTMGsvTzcrdEtmK05NVDk2TlAwVXZMdmluUm05Sm4yNHdWcmJEQ2JHSWRGNHhWQk5KL3hKU2U2VWVvL0JqLzlJLzdEeTBQdnJuSnk1b3BTSVJSWlgwYVFVQUFQelgzaDNVQUFDQVFBeDdZQUQvYW5GQkNOZGFtSUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQW1tb2VLOUh6aUI1STlFQlhueDhBQUFBQUFBQUFBTEJtQUlaS216V0lueHlPQUFBQUFFbEZUa1N1UW1DQyIsIiR0ZW1wbGF0ZSI6eyJuYW1lIjoiN2M0NDIxNzMtMjMwYS00MmNiLTlkY2EtOWViYTIyYWMzNjAzOnN0cmluZzpIRUFMVEhDRVJUIiwidHlwZSI6IjU0MWVjMWE0LTJkYjItNDdjNi04OGNhLTcxZGIxYjczNTlkMzpzdHJpbmc6RU1CRURERURfUkVOREVSRVIiLCJ1cmwiOiI5NzUyM2Y5Yi1lYmY2LTQ2YjYtOTI5YS0wMmRmMTY2YzQ5MTE6c3RyaW5nOmh0dHBzOi8vbW9oLWhlYWx0aGNlcnQtcmVuZGVyZXIubmV0bGlmeS5hcHAvIn19LCJzaWduYXR1cmUiOnsidHlwZSI6IlNIQTNNZXJrbGVQcm9vZiIsInRhcmdldEhhc2giOiJmZjM0M2FhMjQzMjg0MTExN2NlMzNmMWEwYmNlNzU0ODhmYzUxZDg5MDhmZDZmMTMzZWYyZDRhZjE4YjllYmMyIiwicHJvb2YiOltdLCJtZXJrbGVSb290IjoiZmYzNDNhYTI0MzI4NDExMTdjZTMzZjFhMGJjZTc1NDg4ZmM1MWQ4OTA4ZmQ2ZjEzM2VmMmQ0YWYxOGI5ZWJjMiJ9LCJwcm9vZiI6W3sidHlwZSI6Ik9wZW5BdHRlc3RhdGlvblNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMC0xMC0wN1QwOTo1NjoxMC42OTFaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOmV0aHI6MHhFMzk0Nzk5MjhDYzRFZkZFNTA3NzQ0ODg3ODBCOWY2MTZiZDRCODMwI2NvbnRyb2xsZXIiLCJzaWduYXR1cmUiOiIweDI5NjYzYTZiZDhiYzA5MTdmMzdkMWIyMGViNjQ0N2M5ZTc4OGQ1MTc3NWNhOWZlYWExZjk4YjYyYWVhODZiYTAyMDIyZjhhMzFkOWE1Y2IwYmU3YWFhYzY1ZDZhMTJkZjc0YmQzZTBlNzkxMTEzMmNiZGUxNzhhMTg2ZTZhMDViMWIifV19", - "filename": "healthcert.txt", - "type": "text/open-attestation", - }, - ], - "fhirBundle": Object { - "entry": Array [ - Object { - "birthDate": "1990-01-15", - "extension": Array [ - Object { - "code": Object { - "text": "SG", - }, - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - }, - ], - "gender": "female", - "identifier": Array [ - Object { - "type": "PPN", - "value": "E7831177G", - }, - Object { - "type": Object { - "text": "NRIC", - }, - "value": "S****989Z", - }, - ], - "name": Array [ - Object { - "text": "Tan Chen Chen", - }, - ], - "resourceType": "Patient", - }, - Object { - "collection": Object { - "collectedDateTime": "2020-09-27T06:15:00Z", - }, - "resourceType": "Specimen", - "type": Object { - "coding": Array [ - Object { - "code": "258500001", - "display": "Nasopharyngeal swab", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "code": Object { - "coding": Array [ - Object { - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test", - "system": "http://loinc.org", - }, - ], - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "identifier": Array [ - Object { - "type": "ACSN", - "value": "123456789", - }, - ], - "performer": Object { - "name": Array [ - Object { - "text": "Dr Michael Lim", - }, - ], - }, - "qualification": Array [ - Object { - "identifier": "MCR 123214", - "issuer": "MOH", - }, - ], - "resourceType": "Observation", - "status": "final", - "valueCodeableConcept": Object { - "coding": Array [ - Object { - "code": "260385009", - "display": "Negative", - "system": "http://snomed.info/sct", - }, - ], - }, - }, - Object { - "contact": Object { - "address": Object { - "text": "MacRitchie Hospital Thomson Road Singapore 123000", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6563113111", - }, - ], - }, - "endpoint": Object { - "address": "https://www.macritchieclinic.com.sg", - }, - "name": "MacRitchie Medical Clinic", - "resourceType": "Organization", - "type": "Licensed Healthcare Provider", - }, - Object { - "contact": Object { - "address": Object { - "text": "2 Thomson Avenue 4 Singapore 098888", - "type": "physical", - "use": "work", - }, - "telecom": Array [ - Object { - "system": "phone", - "value": "+6562711188", - }, - ], - }, - "name": "MacRitchie Laboratory", - "resourceType": "Organization", - "type": "Accredited Laboratory", - }, - ], - "resourceType": "Bundle", - "type": "collection", - }, - "fhirVersion": "4.0.1", - "id": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "issuers": Array [ - Object { - "id": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E", - "identityProof": Object { - "key": "did:ethr:0x174D34BA87e88f58902b8fec59120AcC0B94743E#controller", - "location": "moh.gov.sg", - "type": "DNS-DID", - }, - "name": "Ministry of Health (Singapore)", - "revocation": Object { - "type": "NONE", - }, - }, - ], - "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAM1BMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzeCmiAAAAAEHRSTlMAQL+A7xAgn2DP3zBwr1CPEl+I/QAABwdJREFUeNrsnd122yoQRvkHISHN+z/tyUk9oTECQ1bTBc23byNs0B5GIDARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk+Ik+Idx4g5N4B9GQ/rPA9J/IPfSgwL/MEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP5ZPoP5r7FJKAf7cufBihPNSkX5hlA9u+DsP7dX/JK1P2VPiSIoebErLwVh5Zx+8C1Y22YtP0Fpf6hdea+mq1Wlixfej6RcDxj09swXbbeBQpijug20aj/SE8bvo5hEuavAuSKpQfJxTG91gUrCV6jSQE0oPke4wuke705EqpLNWxtMtSk4jvXGld+tLlxvVMNnakD7mEndYTVWSnV860WUXl34RMy7BempyGzN7pAbmXEA6bfvK0u32uTFKKVM0r0Yw1MTcFvp8iVLPD0+9gHQy+7rSf3eejp2HuFcsmldiEz0FzKXfSRw3qe08Xqd9dP6QKONnku4lG3NSb/RBtKtKt1ttdBJiYb2VI7brc7tc8IYotJzHUB0c+O+T3rTQuLKsZRqpzkTS7dZI4vo+qJndEGO8Ezecyjac6/ITN2KOWaULIT/aLdeUnqpdi7VW2+Kyc29FL3s7e3hi5LTSheWWpyWlH4XzmvWjniOiFN3YWDivWI92Wuk5ct2C0p3Jzl9YN66WI5IV/VyF86r1a17pH5UMC0pX/DwXVU524Ks5YgDZmL4zGz1w80p33Pj1pMvci+tc2cFIjmhH2dWVfuaVLuLjy9eTzgqOrqewv0vum/1KR4+2a6Dh5pXO7V9O+s4KRJPADuxNjtjFCCk/CltEzgfzSterSvdZQZeDoyyqxQguR1lXmBlI/9PSebZpbOe8bivt2bFK9YaK4eHe7NLNatLP3qGYLfL71RoMvB6Xu96J3TWt9LToQM5zm8YfxbHIESPZXXW/tovTSo+PqFxNeswZqjO/X09OvBgi9OcHw7llUukcv+di0rneqf99uXoKglMMwall7x/my0mlP5piVnv3fuZ+193xnpTYLz3SjejPLXpO6TtXbzXpfIUceJHmPsXAJsbI+aL7fvsppVsOX7uadJ9FvuT63PxsZAQ3UMxygLyWvsk6/luku40fb8ttolDFFb1ZQQ6/mRkv1iW9i1J6C/1aejAcvQPVmUt6FB2cn26JzDO4TsaLcWeaTbo7In04X08696XxTnrkmzGCHimmJpLuNaPi71f+KOkte5IK9OrS74ingPSfJd1oISD9Z0m/hPhB0o+/Ld3MMGUrSU68s9yUzXSO3suhW+Bh+Jj0oyz2snZqgpczd5iwpvRvmKfXpY/P0yeSfsgHOhliwtLS7cBSiR1aZFP30q+Bt3fXbK9hQ2Tr+4rSc+8dflXCO2l6pY+PIs5pF1xs4kmbXVB6z0JWRRdH+6B0w8VeoydeWlV84xaULnvX08vEzNn+HJOu+tfT1cSbKPLewvWkc/c1/Yts4SlJ+DHpunsF3069XSrw7VhQel4gHN3QuHO8jEk/O8cC+Uo/pXR+vG0LSn/ZXxlXyIoc60PSheldwvdzb4HW3I71pO/0wHYqOIp8v41JT52TNjf5jx24fmE96WLrG7/bsoM6ehCGpJ8s0/ZV3k8qnTOdX1B66HOgb4b5KRftl54fC7ovyvZZpXt6Jy4o3ZqedOvMTdslPUhD0rlWxvVMFtS0P1UOnPvWk84Xdb0DIXW/kHiMSLem7rMMKDmt9J0HmgtK/3Bg7GhgOGLCgPT8afp1pdTEx4886ngtKF2c9OpsgVDbOKCJOQaki+1VrFi+wriJpfNa/orShcrW286jLYsyyfZLl8SEtnM65j1SLH+wXVG6jc0DYI986FujKJnQLV0c1Mrw7sO5n/fwwDfkoj9gfD4ozhyFAUVMqBRlYrCd0oUnRrkiyEzOPFNLFzTzT5VlBXd3Om8ozkBtOOdDPZkU9k9/PCpLkHarnZUfIhXOv0/6ISv0SOcvj/1b9tzfkN5G3x7ebdIh34WfF6tpDrrYK6PUpd/4fJS3bpXartOJN+SRDBXOv0l6m6EzZ1z35lw9k3RO01WMFBU4H4+21lMbb8Xs0vlvYVHp3PUqKCcaODUsnbNLSR5cTC+dZ+ppVelCnKa117eNTNQkSVFiU2tP+QrSOVvZZaULqwvtPCh/jdMb3RN99QOkojv8LsQS0k/O7+tKf+NMT96NP0UvLvinRm9Jn24wVrbDCbGIdF4xVBNJ/xJSe6Ueo/Bj/9I/7Dy0PvrnJy5opSIRRZX0aQUAAPzX3h3UAACAQAx7YAD/anFBCNdamIABAAAAAAAAAAAAAAAAAAAAAAAAAADAmmoeK9HziB5I9EBXnx8AAAAAAAAAALBmAIZKmzWInxyOAAAAAElFTkSuQmCC", - "name": "HealthCert", - "notarisationMetadata": Object { - "notarisedOn": "1970-01-01T00:00:01.000Z", - "passportNumber": "E7831177G", - "reference": "e35f5d2a-4198-4f8f-96dc-d1afe0b67119", - "signedEuHealthCerts": Array [ - Object { - "expiryDateTime": "2022-12-17T01:27:50.263Z", - "qr": "HC1:abcde", - "type": "PCR", - }, - ], - "url": "https://example.com", - }, - "validFrom": "2020-11-20", - } - `); -}); diff --git a/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.ts b/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.ts deleted file mode 100644 index ec4d8dcf..00000000 --- a/src/models/notarizedHealthCert/createNotarizedHealthCert/createUnwrappedHealthCert.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { getData, v2, WrappedDocument } from "@govtechsg/open-attestation"; -import { notarise } from "@govtechsg/oa-schemata"; -import { maskNricInFhirBundleV1 } from "../../../common/maskNricFin"; -import { config } from "../../../config"; -import { HealthCertDocument, NotarizedHealthCert } from "../../../types"; -import { getParticularsFromHealthCert } from "../../healthCert"; - -const { didSigner, documentName } = config; - -export const createUnwrappedDocument = ( - certificate: WrappedDocument, - reference: string, - storedUrl: string, - signedEuHealthCerts?: notarise.SignedEuHealthCert[] -): NotarizedHealthCert => { - const certificateData = - getData>(certificate); - const { passportNumber } = getParticularsFromHealthCert(certificateData); - const b64Certificate = Buffer.from(JSON.stringify(certificate)).toString( - "base64" - ); - const dateString = new Date().toISOString(); - - const $template = { - name: "HEALTH_CERT", - type: v2.TemplateType.EmbeddedRenderer, - url: "https://healthcert.renderer.moh.gov.sg/", - }; - - const notarisationMetadata: notarise.NotarisationMetadata = { - reference, - notarisedOn: dateString, - passportNumber: passportNumber || "", - url: storedUrl, - }; - if (signedEuHealthCerts && signedEuHealthCerts.length > 0) { - notarisationMetadata.signedEuHealthCerts = signedEuHealthCerts; - } - - const attachments = [ - { - filename: "healthcert.txt", - type: "text/open-attestation", - data: b64Certificate, - }, - ]; - - const issuers = [ - { - name: didSigner.name, - id: didSigner.id, - revocation: { - type: v2.RevocationType.None, - }, - identityProof: { - type: v2.IdentityProofType.DNSDid, - location: didSigner.dns, - key: didSigner.key, - }, - }, - ]; - - const { fhirVersion, fhirBundle, logo } = certificateData; - - return { - id: reference, - name: documentName, - validFrom: certificateData.validFrom, - fhirVersion, - fhirBundle: maskNricInFhirBundleV1(fhirBundle), - issuers, - $template, - notarisationMetadata, - logo, - attachments, - }; -}; diff --git a/src/models/notarizedHealthCert/createNotarizedHealthCert/index.ts b/src/models/notarizedHealthCert/createNotarizedHealthCert/index.ts deleted file mode 100644 index 237e0dae..00000000 --- a/src/models/notarizedHealthCert/createNotarizedHealthCert/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./createNotarizedHealthCert"; diff --git a/src/models/notarizedHealthCert/index.ts b/src/models/notarizedHealthCert/index.ts deleted file mode 100644 index 237e0dae..00000000 --- a/src/models/notarizedHealthCert/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./createNotarizedHealthCert"; diff --git a/src/services/spmNotification/index.test.ts b/src/services/spmNotification/index.test.ts index f50e9de9..ba5fd69f 100644 --- a/src/services/spmNotification/index.test.ts +++ b/src/services/spmNotification/index.test.ts @@ -2,8 +2,9 @@ import { notifyHealthCert, notifyPdt, } from "@notarise-gov-sg/sns-notify-recipients"; +import { TestData } from "@notarise-gov-sg/sns-notify-recipients/dist/types"; import { ParsedBundle, GroupedObservation } from "../../models/fhir/types"; -import { NotarisationResult, TestData, PDTHealthCertV2 } from "../../types"; +import { NotarisationResult, PDTHealthCertV2 } from "../../types"; import { config } from "../../config"; import { sendNotification } from "./index"; @@ -76,25 +77,11 @@ describe("single type oa-doc notification", () => { }; testDataMock = [ { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", + patientName: "Tan Chen Chen", + swabCollectionDate: "", testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", + "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", testResult: "Negative", - testResultCode: "260385009", }, ]; }); @@ -112,12 +99,7 @@ describe("single type oa-doc notification", () => { 1, 1 ).toISOString(); - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(0); expect(notifyPdt).toBeCalledTimes(0); }); @@ -125,12 +107,7 @@ describe("single type oa-doc notification", () => { it("skip notifyHealthCert/notifyPdt for valid PCR test cert without nric/fin", async () => { // remove patient nric/fin delete parsedFhirBundleMock.patient.nricFin; - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(0); expect(notifyPdt).toBeCalledTimes(0); }); @@ -142,12 +119,7 @@ describe("single type oa-doc notification", () => { code: "94661-6", display: "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", }; - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyPdt).toBeCalledTimes(1); expect(notifyPdt).toHaveBeenCalledWith({ nric: parsedFhirBundleMock.patient.nricFin, @@ -165,12 +137,7 @@ describe("single type oa-doc notification", () => { code: "697989009", display: "Anterior nares swab", }; - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(1); expect(notifyHealthCert).toHaveBeenCalledWith({ @@ -183,12 +150,7 @@ describe("single type oa-doc notification", () => { }); it("trigger notifyHealthCert for valid PCR test cert", async () => { - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(1); expect(notifyHealthCert).toHaveBeenCalledWith({ @@ -296,46 +258,17 @@ describe("multi type oa-doc notification", () => { }; testDataMock = [ { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94531-1", - testType: - "Reverse transcription polymerase chain reaction (rRT-PCR) test", + patientName: "Tan Chen Chen", + swabCollectionDate: "", + testType: "Nasopharyngeal swab", testResult: "Negative", - testResultCode: "260385009", }, { - provider: "MacRitchie Medical Clinic", - gender: "M", - lab: "lab", - nationality: "SG", - nric: "123", - observationDate: "6/28/21 2:15:00 PM GMT+08:00", - passportNumber: "ES12345", - patientName: "TESTING", - performerMcr: "123", - performerName: "123", - birthDate: "01/01/2021", - swabCollectionDate: "6/27/21 2:15:00 PM GMT+08:00", - swabType: "Nasopharyngeal swab", - swabTypeCode: "258500001", - testCode: "94661-6", + patientName: "Tan Chen Chen", + swabCollectionDate: "", testType: "SARS-CoV-2 (COVID-19) Ab [Interpretation] in Serum or Plasma", testResult: "Negative", - testResultCode: "260385009", }, ]; }); @@ -353,12 +286,7 @@ describe("multi type oa-doc notification", () => { 1, 1 ).toISOString(); - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(0); expect(notifyPdt).toBeCalledTimes(0); }); @@ -366,23 +294,13 @@ describe("multi type oa-doc notification", () => { it("skip notifyHealthCert/notifyPdt for [PCR, SER] test cert without nric/fin", async () => { // remove patient nric/fin delete parsedFhirBundleMock.patient.nricFin; - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyHealthCert).toBeCalledTimes(0); expect(notifyPdt).toBeCalledTimes(0); }); it("trigger notifyPdt for valid [PCR, SER] test cert", async () => { - await sendNotification( - resultMock, - parsedFhirBundleMock, - testDataMock, - certificateData - ); + await sendNotification(resultMock, parsedFhirBundleMock, certificateData); expect(notifyPdt).toBeCalledTimes(1); expect(notifyPdt).toHaveBeenCalledWith({ nric: parsedFhirBundleMock.patient.nricFin, diff --git a/src/services/spmNotification/index.ts b/src/services/spmNotification/index.ts index effd36ae..a6c199ee 100644 --- a/src/services/spmNotification/index.ts +++ b/src/services/spmNotification/index.ts @@ -5,9 +5,11 @@ import { import _ from "lodash"; import moment from "moment-timezone"; import { pdtHealthCertV2 } from "@govtechsg/oa-schemata"; +import { TestData } from "@notarise-gov-sg/sns-notify-recipients/dist/types"; import { ParsedBundle } from "../../models/fhir/types"; import { config } from "../../config"; -import { NotarisationResult, TestData, PDTHealthCertV2 } from "../../types"; +import { NotarisationResult, PDTHealthCertV2 } from "../../types"; +import { parseDateTime } from "../../common/datetime"; const { PdtTypes } = pdtHealthCertV2; @@ -28,10 +30,27 @@ const isEligibleForSpmWallet = (certificateData: PDTHealthCertV2): boolean => { ); }; +const getTestDataForNofityPdt = ( + parsedFhirBundle: ParsedBundle +): TestData[] => { + const testData: TestData[] = []; + parsedFhirBundle.observations.forEach((observationGroup) => { + const testDataValue: TestData = { + patientName: parsedFhirBundle.patient?.fullName, + swabCollectionDate: parseDateTime( + observationGroup.specimen.collectionDateTime + ), + testType: observationGroup.observation.testType?.display || "", + testResult: observationGroup.observation.result.display || "", + }; + testData.push(testDataValue); + }); + return testData; +}; + export const sendNotification = async ( result: NotarisationResult, parsedFhirBundle: ParsedBundle, - testData: TestData[], certificateData: PDTHealthCertV2 ) => { /* Send SPM notification using api-notify/wallet when patient is adult (15 years & above) and present NRIC-FIN in OA-Doc. */ @@ -50,6 +69,7 @@ export const sendNotification = async ( }); } else { /* Send SPM notification to recipient (Only if enabled) */ + const testData: TestData[] = getTestDataForNofityPdt(parsedFhirBundle); await notifyPdt({ url: result.url, nric: parsedFhirBundle.patient?.nricFin, diff --git a/src/services/transientStorage/index.ts b/src/services/transientStorage/index.ts index f6a80ec9..a51fb9fd 100644 --- a/src/services/transientStorage/index.ts +++ b/src/services/transientStorage/index.ts @@ -1,10 +1,7 @@ import { Record, String, Number, Runtype } from "runtypes"; import { SignedWrappedDocument } from "@govtechsg/open-attestation"; import axios from "axios"; -import { - SignedNotarizedHealthCert, - EndorsedPDTHealthCertV2, -} from "../../types"; +import { EndorsedPDTHealthCertV2 } from "../../types"; import { config } from "../../config"; import { getLogger } from "../../common/logger"; @@ -72,9 +69,7 @@ export const getQueueNumber = async (reference: string) => { }; export const uploadDocument = async ( - document: - | SignedNotarizedHealthCert - | SignedWrappedDocument, + document: SignedWrappedDocument, id: string, reference: string ) => { diff --git a/src/types.ts b/src/types.ts index 5bce9b1b..0dbffbc3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,123 +1,6 @@ -import { - v2, - SignedWrappedDocument, - WrappedDocument, -} from "@govtechsg/open-attestation"; +import { v2, WrappedDocument } from "@govtechsg/open-attestation"; import { Record, String, Static } from "runtypes"; import { notarise, pdtHealthCertV2 } from "@govtechsg/oa-schemata"; -import { R4 } from "@ahryman40k/ts-fhir-types"; - -/* eslint-disable */ -enum EntryResourceType { - Patient = "Patient", - Observation = "Observation", - Specimen = "Specimen", - Organization = "Organization", - Device = "Device", -} -/* eslint-disable */ - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface Patient { - resourceType: EntryResourceType.Patient; - identifier: [ - { - type: "PPN" | { text: "NRIC" }; - value: string; - } - ]; - name: string; -} - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface Observation { - resourceType: EntryResourceType.Observation; - valueCodeableConcept: { - coding: [{ system: string; code: string; display: string }]; - }; - code: { - coding: [{ system: string; code: string; display: string }]; - }; - specimen: { - reference: string; - }; -} - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface Specimen { - fullUrl?: string; - resourceType: EntryResourceType.Specimen; - collection: { - collectedDateTime: string; - }; -} - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface Organisation { - fullUrl?: string; - type: string; - resourceType: EntryResourceType.Organization; -} - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface Device { - resourceType: EntryResourceType.Device; - type: { - coding: [ - { - system: string; - code: string; - display: string; - } - ]; - text: string; - }; - identifier: [ - { - system: string; - value: string; - } - ]; -} - -/** - * @deprecated This interface should be remove after v1 healthcert deprecate. - */ -export interface fhirBundleV1 { - entry: [Patient | Observation | Specimen | Organisation | Device]; -} - -/** - * @deprecated This interface should be removed when PDT HealthCert v1.0 is deprecated. - */ -export interface HealthCertDocument extends v2.OpenAttestationDocument { - version?: string; - type?: string; - name?: string; - validFrom: string; - fhirVersion: string; - logo: string; - fhirBundle: fhirBundleV1 | R4.IBundle; -} - -/** - * @deprecated This interface should be removed when PDT HealthCert v1.0 is deprecated. - * - * Please use PDTHealthCertV2 instead. - */ -export interface NotarizedHealthCert extends HealthCertDocument { - notarisationMetadata: notarise.NotarisationMetadata; -} /** * ========= HealthCert Types Explained ========= @@ -168,34 +51,6 @@ export const WorkflowContextData = WorkflowReferenceData.And( ); export type WorkflowContextData = Static; -/** - * @deprecated This interface should be removed when PDT HealthCert v1.0 is deprecated. - */ -export type SignedNotarizedHealthCert = - SignedWrappedDocument; - -export interface TestData { - provider: string; - lab?: string; - swabType: string; - swabTypeCode: string; - patientName: string; - swabCollectionDate: string; - performerName: string; - performerMcr: string; - observationDate: string; - nric: string; - passportNumber: string; - birthDate: string; - testType: string; - testCode: string; - nationality: string; - gender: string; - testResult: string; - testResultCode: string; - deviceIdentifier?: string; -} - export interface EuTestParams { tg: string; tt: string; @@ -227,9 +82,7 @@ export interface EuHealthCert extends EuHealthCertDocument { } export interface NotarisationResult { - notarisedDocument: WrappedDocument< - HealthCertDocument | EndorsedPDTHealthCertV2 - >; + notarisedDocument: WrappedDocument; ttl: number; url: string; gpayCovidCardUrl?: string; diff --git a/test/fixtures/v1/example_healthcert_invalid_file.json b/test/fixtures/v1/example_healthcert_invalid_file.json deleted file mode 100644 index af8cc877..00000000 --- a/test/fixtures/v1/example_healthcert_invalid_file.json +++ /dev/null @@ -1,180 +0,0 @@ -{ - "version": "https://schema.openattestation.com/2.0/schema.json", - "data": { - "id": "9355cd12-3a2b-4827-8d86-d21aae8c3905:string:TEST001", - "name": "aa55dbc8-dd12-4903-a3b2-480c1a32b593:string:HealthCert", - "validFrom": "d5a28fcf-7041-4c5c-9090-dc4d6e08ac87:string:2020-11-20", - "fhirVersion": "4d483393-f615-4873-82b6-b918e5409e56:string:4.0.1", - "fhirBundle": { - "resourceType": "2ee47618-18f6-4f6a-b414-33f2f54eb765:string:Bundle", - "type": "9a3d5cd6-6266-4b58-ae10-f48f90670226:string:collection", - "entry": [ - { - "resourceType": "abe4be52-f701-476f-8273-97543cb85b1d:string:Patient", - "extension": [ - { - "url": "635e5434-cd98-4dd8-907d-e2f984c09545:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "da20bb5d-4fa9-4f97-a273-41548edec3e8:string:SG" - } - } - ], - "identifier": [ - { - "type": "1d370be4-9de5-4efb-9551-ef0867dc79a5:string:PPN", - "value": "701f0ea6-d3d5-4dd9-a4d1-a9f1b06e01fe:string:E7831177G" - } - ], - "name": [ - { - "text": "8e965097-44b6-435a-aa3f-ddde2e9f1382:string:Tan Chen Chen" - } - ], - "gender": "ae8fc798-634c-4f84-ba69-238dee70308d:string:female", - "birthDate": "8387329d-486b-4aae-ba45-45ec519ec03f:string:1990-01-15" - }, - { - "resourceType": "68a64f2f-d21b-45ea-ae65-6179f382e6b4:string:Specimen", - "type": { - "coding": [ - { - "system": "2fbb2e36-0d18-4311-a813-03a87c56446f:string:http://snomed.info/sct", - "code": "300459b5-e0ef-4c49-b0dd-2236881fa062:string:258500001", - "display": "363717a4-2aae-4272-98d3-480e965ae2ed:string:Nasopharyngeal swab" - } - ] - }, - "collection": { - "collectedDateTime": "cdf85375-93d8-4b92-b3f0-bb53ee9e34b0:string:2020-09-27T06:15:00Z" - } - }, - { - "specimen": { - "reference": "74440c51-b7e7-4a54-9672-28f364b105cf:string:urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d" - }, - "performerReference": [ - { - "reference": "4e2353ea-0f85-40c7-ad52-b55ecf0dcef7:string:urn:uuid:dddd1321-4af5-424c-a0e1-ed3aab1c349d" - }, - { - "reference": "34e97cb6-2300-4e3f-847b-fcdd21b6d582:string:urn:uuid:eeee1321-4af5-424c-a0e1-ed3aab1c349d" - } - ], - "resourceType": "9846e6ce-53cb-4c44-9c7c-67927708a988:string:Observation", - "identifier": [ - { - "value": "01571165-7a4a-4145-bb9b-1f55e3c9ec50:string:123456789", - "type": "70bcdafd-60c2-4c6b-a199-1ff8f2b8d0cc:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "9412e2fa-6b9b-4a51-80c0-326743b8baeb:string:http://loinc.org", - "code": "420a0c0c-4258-471e-bfcb-14b3ad0bfdc8:string:94531-1", - "display": "9f9e7c83-fbf8-4124-8d0b-f202fb620482:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "a529313b-7dfc-48c1-82b1-beee343e3ac9:string:http://snomed.info/sct", - "code": "140a1908-7933-4579-9b7a-d90f99f3c79a:string:260385009", - "display": "8604525b-f552-4716-b893-c007ff0adecb:string:Negative" - } - ] - }, - "effectiveDateTime": "5db9e744-7c36-4223-927d-37d6cbfa895a:string:2020-09-28T06:15:00Z", - "status": "808b80b2-2bf7-41e9-9d08-7694c94a8c56:string:final", - "performer": { - "name": [ - { - "text": "fdbe10b0-7fce-4c76-8c0e-c85315fed9be:string:Dr Michael Lim" - } - ] - }, - "qualification": [ - { - "identifier": "0fdab35a-fc07-4a17-a04d-dca8e305a67c:string:MCR 123214", - "issuer": "02488cc8-5e22-4d4a-8228-d0bca2df02e4:string:MOH" - } - ] - }, - { - "resourceType": "8e949420-cca2-48f7-9858-1d53cdc2e64e:string:Organization", - "name": "c4b19850-546c-46ab-a9ae-e669c043f795:string:MacRitchie Medical Clinic", - "type": "0d0e454e-bf17-4d45-ac19-bd85353f640a:string:Licensed Healthcare Provider", - "endpoint": { - "address": "46370e33-7c68-4692-91ef-08af3e49f760:string:https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "99656a02-4e37-4e0b-827f-6b8996c9e211:string:phone", - "value": "7b275776-4bee-4a76-a489-c29e2288707f:string:+6563113111" - } - ], - "address": { - "type": "4bc72b01-1d00-4adf-8b81-b915b5c82745:string:physical", - "use": "d30fd7cc-a8aa-4e1e-adce-e1d2cc9446ab:string:work", - "text": "ffaa5d83-3488-41ab-b741-f4fb0d10caf8:string:MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "1f477ccc-4ff7-4df3-aa05-3d977b2100f7:string:Organization", - "name": "d5dbe3b0-bc05-4d39-a673-4be17ec42929:string:MacRitchie Laboratory", - "type": "36919db1-047a-4f4a-af44-4a4a37dd8ed4:string:Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "cd2038f4-549e-41b2-8914-181342ad08b9:string:phone", - "value": "eb5513b2-bc7d-4e2d-b3a8-94ad21169b7c:string:+6562711188" - } - ], - "address": { - "type": "42085642-6fa9-4c9e-9e7f-94427d85d7c1:string:physical", - "use": "ccc9b053-0ae0-43d7-8ca6-a93808828aef:string:work", - "text": "7389b950-89b6-4924-9f69-1388dd33def1:string:2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "id": "a9e8c85a-cd34-4cd7-b55c-f7e12d37772e:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "919375fd-1edb-411e-a3e0-03bc6a80e971:string:NONE" - }, - "name": "2cc9820c-fc70-43e9-82e6-4452923d8020:string:SAMPLE CLINIC", - "identityProof": { - "type": "c8634d5d-663b-4486-bcca-c6f1a9155455:string:DNS-DID", - "location": "20063e56-881f-4060-a07d-d25074f20cc7:string:donotverify.testing.verify.gov.sg", - "key": "3b48a5b2-1084-4cbe-9b8b-b47fb89f255d:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "logo": "17109506-9dfd-4c13-92fc-cae2f98c35ad:string:data:image/png;base64,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", - "$template": { - "name": "5492a3fa-6631-483d-93b6-9f348748feb4:string:HEALTHCERT", - "type": "af63ff92-df8d-41a0-ba22-2f859e1c292c:string:EMBEDDED_RENDERER", - "url": "7698b266-6270-4008-bd73-4658c117f1cd:string:https://moh-healthcert-renderer.netlify.app/" - } - }, - "signature": { - "type": "SHA3MerkleProof", - "targetHash": "99bed561d58419f48aa5a12acd83a3db9037917ceb19b6949623ef16b0b033af", - "proof": [], - "merkleRoot": "99bed561d58419f48aa5a12acd83a3db9037917ceb19b6949623ef16b0b033af" - }, - "proof": [ - { - "type": "OpenAttestationSignature2018", - "created": "2021-03-21T03:09:53.089Z", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - "signature": "0x0fc4e0e82f2423c42c58eb4874070cf8fb68d5a17e39836341b30ca4b323fba942f0763902c4b5f1ddd79e7257128dc827a833f896cfb07025b722de3e96d1651b" - } - ] diff --git a/test/fixtures/v1/example_healthcert_without_everything_multi_unwrapped.json b/test/fixtures/v1/example_healthcert_without_everything_multi_unwrapped.json deleted file mode 100644 index 2ff78717..00000000 --- a/test/fixtures/v1/example_healthcert_without_everything_multi_unwrapped.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "id": "TEST001", - "name": "HealthCert", - "validFrom": "2020-11-20", - "fhirVersion": "4.0.1", - "fhirBundle": { - "resourceType": "Bundle", - "type": "collection", - "entry": [ - { - "resourceType": "Patient", - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "SG" - } - } - ], - "identifier": [ - { - "type": "PPN", - "value": "E7831177G" - } - ], - "name": [ - { - "text": ["Tan Chen Chen"] - } - ] - }, - { - "resourceType": "Specimen", - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "258500001" - } - ] - } - }, - { - "resourceType": "Observation", - "identifier": [ - { - "value": "123456789", - "type": "ACSN" - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "260385009", - "display": "Negative" - } - ] - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "status": "final", - "performer": { - "name": [ - { - "text": null - } - ] - } - }, - { - "resourceType": "Observation", - "identifier": [ - { - "value": "123456789", - "type": "ACSN" - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "260385009", - "display": "Negative" - } - ] - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "status": "final", - "performer": { - "name": [ - { - "text": null - } - ] - } - }, - { - "resourceType": "Organization", - "name": "MacRitchie Medical Clinic", - "endpoint": { - "address": "https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6563113111" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "Organization", - "type": "Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6562711188" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "id": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "NONE" - }, - "name": "SAMPLE CLINIC", - "identityProof": { - "type": "DNS-DID", - "location": "donotverify.testing.verify.gov.sg", - "key": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAM1BMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzeCmiAAAAAEHRSTlMAQL+A7xAgn2DP3zBwr1CPEl+I/QAABwdJREFUeNrsnd122yoQRvkHISHN+z/tyUk9oTECQ1bTBc23byNs0B5GIDARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk+Ik+Idx4g5N4B9GQ/rPA9J/IPfSgwL/MEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwP5ZPoP5r7FJKAf7cufBihPNSkX5hlA9u+DsP7dX/JK1P2VPiSIoebErLwVh5Zx+8C1Y22YtP0Fpf6hdea+mq1Wlixfej6RcDxj09swXbbeBQpijug20aj/SE8bvo5hEuavAuSKpQfJxTG91gUrCV6jSQE0oPke4wuke705EqpLNWxtMtSk4jvXGld+tLlxvVMNnakD7mEndYTVWSnV860WUXl34RMy7BempyGzN7pAbmXEA6bfvK0u32uTFKKVM0r0Yw1MTcFvp8iVLPD0+9gHQy+7rSf3eejp2HuFcsmldiEz0FzKXfSRw3qe08Xqd9dP6QKONnku4lG3NSb/RBtKtKt1ttdBJiYb2VI7brc7tc8IYotJzHUB0c+O+T3rTQuLKsZRqpzkTS7dZI4vo+qJndEGO8Ezecyjac6/ITN2KOWaULIT/aLdeUnqpdi7VW2+Kyc29FL3s7e3hi5LTSheWWpyWlH4XzmvWjniOiFN3YWDivWI92Wuk5ct2C0p3Jzl9YN66WI5IV/VyF86r1a17pH5UMC0pX/DwXVU524Ks5YgDZmL4zGz1w80p33Pj1pMvci+tc2cFIjmhH2dWVfuaVLuLjy9eTzgqOrqewv0vum/1KR4+2a6Dh5pXO7V9O+s4KRJPADuxNjtjFCCk/CltEzgfzSterSvdZQZeDoyyqxQguR1lXmBlI/9PSebZpbOe8bivt2bFK9YaK4eHe7NLNatLP3qGYLfL71RoMvB6Xu96J3TWt9LToQM5zm8YfxbHIESPZXXW/tovTSo+PqFxNeswZqjO/X09OvBgi9OcHw7llUukcv+di0rneqf99uXoKglMMwall7x/my0mlP5piVnv3fuZ+193xnpTYLz3SjejPLXpO6TtXbzXpfIUceJHmPsXAJsbI+aL7fvsppVsOX7uadJ9FvuT63PxsZAQ3UMxygLyWvsk6/luku40fb8ttolDFFb1ZQQ6/mRkv1iW9i1J6C/1aejAcvQPVmUt6FB2cn26JzDO4TsaLcWeaTbo7In04X08696XxTnrkmzGCHimmJpLuNaPi71f+KOkte5IK9OrS74ingPSfJd1oISD9Z0m/hPhB0o+/Ld3MMGUrSU68s9yUzXSO3suhW+Bh+Jj0oyz2snZqgpczd5iwpvRvmKfXpY/P0yeSfsgHOhliwtLS7cBSiR1aZFP30q+Bt3fXbK9hQ2Tr+4rSc+8dflXCO2l6pY+PIs5pF1xs4kmbXVB6z0JWRRdH+6B0w8VeoydeWlV84xaULnvX08vEzNn+HJOu+tfT1cSbKPLewvWkc/c1/Yts4SlJ+DHpunsF3069XSrw7VhQel4gHN3QuHO8jEk/O8cC+Uo/pXR+vG0LSn/ZXxlXyIoc60PSheldwvdzb4HW3I71pO/0wHYqOIp8v41JT52TNjf5jx24fmE96WLrG7/bsoM6ehCGpJ8s0/ZV3k8qnTOdX1B66HOgb4b5KRftl54fC7ovyvZZpXt6Jy4o3ZqedOvMTdslPUhD0rlWxvVMFtS0P1UOnPvWk84Xdb0DIXW/kHiMSLem7rMMKDmt9J0HmgtK/3Bg7GhgOGLCgPT8afp1pdTEx4886ngtKF2c9OpsgVDbOKCJOQaki+1VrFi+wriJpfNa/orShcrW286jLYsyyfZLl8SEtnM65j1SLH+wXVG6jc0DYI986FujKJnQLV0c1Mrw7sO5n/fwwDfkoj9gfD4ozhyFAUVMqBRlYrCd0oUnRrkiyEzOPFNLFzTzT5VlBXd3Om8ozkBtOOdDPZkU9k9/PCpLkHarnZUfIhXOv0/6ISv0SOcvj/1b9tzfkN5G3x7ebdIh34WfF6tpDrrYK6PUpd/4fJS3bpXartOJN+SRDBXOv0l6m6EzZ1z35lw9k3RO01WMFBU4H4+21lMbb8Xs0vlvYVHp3PUqKCcaODUsnbNLSR5cTC+dZ+ppVelCnKa117eNTNQkSVFiU2tP+QrSOVvZZaULqwvtPCh/jdMb3RN99QOkojv8LsQS0k/O7+tKf+NMT96NP0UvLvinRm9Jn24wVrbDCbGIdF4xVBNJ/xJSe6Ueo/Bj/9I/7Dy0PvrnJy5opSIRRZX0aQUAAPzX3h3UAACAQAx7YAD/anFBCNdamIABAAAAAAAAAAAAAAAAAAAAAAAAAADAmmoeK9HziB5I9EBXnx8AAAAAAAAAALBmAIZKmzWInxyOAAAAAElFTkSuQmCC", - "$template": { - "name": "HEALTHCERT", - "type": "EMBEDDED_RENDERER", - "url": "https://moh-healthcert-renderer.netlify.app/" - } -} diff --git a/test/fixtures/v1/example_healthcert_without_everything_multi_wrapped.json b/test/fixtures/v1/example_healthcert_without_everything_multi_wrapped.json deleted file mode 100644 index a98fb78d..00000000 --- a/test/fixtures/v1/example_healthcert_without_everything_multi_wrapped.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "version": "https://schema.openattestation.com/2.0/schema.json", - "data": { - "id": "c4d94541-82df-4b1a-b768-fdefd7ceeaa8:string:TEST001", - "name": "478cd436-2467-46d2-86d4-1c4c03613b87:string:HealthCert", - "validFrom": "29af7db1-cb21-48d4-9778-dd5721bb2f11:string:2020-11-20", - "fhirVersion": "cf62743e-59ad-405c-abc3-1ff4f32e9937:string:4.0.1", - "fhirBundle": { - "resourceType": "ae97701f-c893-4c6d-b8f1-3f80460a0e97:string:Bundle", - "type": "6f5d0a88-9cb7-4acf-87d2-f2c18a971707:string:collection", - "entry": [ - { - "resourceType": "a0cd36fb-068b-4ab8-b45e-e92d1b2bba0d:string:Patient", - "extension": [ - { - "url": "31b0e446-1d4e-42d8-8f84-9ce0d130ed73:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "21185196-64d2-4c3c-bb08-60262ed7f925:string:SG" - } - } - ], - "identifier": [ - { - "type": "5792559a-f90f-4cc7-b3ba-f654838ef359:string:PPN", - "value": "c441d297-286c-4c06-855d-6ca920932ede:string:E7831177G" - } - ], - "name": [ - { - "text": [ - "c69f1d2a-2000-4d55-8829-fe9160a766fe:string:Tan Chen Chen" - ] - } - ] - }, - { - "resourceType": "bba7e640-898d-4f80-b9f6-8d919d4d53ff:string:Specimen", - "type": { - "coding": [ - { - "system": "bcb6b20f-e8af-482e-957a-129a8abb039e:string:http://snomed.info/sct", - "code": "9a02a815-7722-4052-9875-97ce06945e69:string:258500001" - } - ] - } - }, - { - "resourceType": "d16e471a-2194-45ef-9be3-a8c4fd2b8655:string:Observation", - "identifier": [ - { - "value": "6e288515-f752-41d5-b847-4ce1df73624a:string:123456789", - "type": "40493350-4fb9-4405-8fa8-59bf6c5ca7a4:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "a79158e6-4c84-4bd7-9bab-703d9316087f:string:http://loinc.org", - "display": "a2c9c3a2-c65a-4884-a87d-b7beb2c8da20:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "c3fc402d-f50a-46a8-b299-9eebab03ba5a:string:http://snomed.info/sct", - "code": "f6644c70-f29d-41b5-84ac-f1afd9b76857:string:260385009", - "display": "0c173291-9be4-41fa-ab20-5a64d7df8819:string:Negative" - } - ] - }, - "effectiveDateTime": "2fe22ce7-95f0-4bfd-ab8d-7dfa514dd4ba:string:2020-09-28T06:15:00Z", - "status": "f0daba22-c60a-4c92-a009-178ba467eaa1:string:final", - "performer": { - "name": [ - { - "text": "6f0ed560-56f9-4718-8895-f28abf568278:null:null" - } - ] - } - }, - { - "resourceType": "2846762d-1737-431c-919b-e32ff46e05e8:string:Observation", - "identifier": [ - { - "value": "c4dac41d-e92e-471e-b2bd-88720a73eab6:string:123456789", - "type": "9f3148f1-032b-4dd6-b2db-a6fe9da2ded8:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "c724df16-c6bd-4ef5-acb8-77f5f845cadb:string:http://loinc.org", - "display": "dc44be8a-c892-4221-b442-6eb11a23c5e5:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "b456bc70-dba5-410f-b712-340b2a17aa58:string:http://snomed.info/sct", - "code": "f1dd75b3-ef58-4501-8a13-8b57085fd227:string:260385009", - "display": "61fc40ce-bb4b-493e-9805-1e1017c59519:string:Negative" - } - ] - }, - "effectiveDateTime": "29eb2aa2-c106-43e3-bded-6de121601611:string:2020-09-28T06:15:00Z", - "status": "e7a6176e-8bd0-4340-a9cb-493ce1df6664:string:final", - "performer": { - "name": [ - { - "text": "c0cb5441-664a-4289-b019-308b0fc4cd33:null:null" - } - ] - } - }, - { - "resourceType": "99505c86-077a-4973-ba69-51da030530ca:string:Organization", - "name": "41756c65-eb50-4b45-ac27-8edda276e54d:string:MacRitchie Medical Clinic", - "endpoint": { - "address": "8260dd27-9ec6-4e6f-b8fb-ec62488982e2:string:https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "879cf08c-5657-474a-b86b-88ad45a4ea0d:string:phone", - "value": "8f422878-d7e9-4fc1-8c53-3b29d55da230:string:+6563113111" - } - ], - "address": { - "type": "d906873e-cf24-4de0-9e54-72f92d69db30:string:physical", - "use": "c699f363-20f7-45f5-8d7e-6af065828746:string:work", - "text": "5574da57-c967-48a7-b787-77593ae84a06:string:MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "ac571568-fd93-48ac-a1f3-085c16eda5cb:string:Organization", - "type": "abcb1090-810d-4a82-a212-457de7ee5990:string:Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "18e8e65d-7ad4-4f26-a3c2-bdcf87a9a7dc:string:phone", - "value": "de008629-6bfd-4780-9f43-b5f52ff89f50:string:+6562711188" - } - ], - "address": { - "type": "2a67dabc-f901-4c8e-87a2-bcce6b355fee:string:physical", - "use": "dfaf952e-afe6-4222-82d6-488a8cfffe8f:string:work", - "text": "fc018edb-3a7d-4b76-82c0-000b9ead52ec:string:2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "id": "1ec4b1b8-80ea-46c6-991d-a5927f02aa3c:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "e54192df-7c6b-4f56-9753-cf5194b6940b:string:NONE" - }, - "name": "c62e7499-47aa-4ce0-82af-0d7c1ad625cf:string:SAMPLE CLINIC", - "identityProof": { - "type": "903976ae-6ee4-49f0-8e79-828aeab787b1:string:DNS-DID", - "location": "9ca5449b-e5ac-4635-b013-99193952db66:string:donotverify.testing.verify.gov.sg", - "key": "79e749a9-98d6-445e-bf14-5a10154b5941:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "logo": "58edc22e-205c-4b9d-ba79-43cfd0b599bd:string:data:image/png;base64,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", - "$template": { - "name": "9d5dccb9-0dcd-4aeb-940e-5ee9c9bb8970:string:HEALTHCERT", - "type": "104bfffe-c777-40e4-ab43-d6a91ca6dbd0:string:EMBEDDED_RENDERER", - "url": "5d52460a-fdc7-4371-872c-6cb5dec6340a:string:https://moh-healthcert-renderer.netlify.app/" - } - }, - "signature": { - "type": "SHA3MerkleProof", - "targetHash": "19e79f58900ac80946badd6069cd7b75d9e760edef21321874e4050c412aa2f8", - "proof": [], - "merkleRoot": "19e79f58900ac80946badd6069cd7b75d9e760edef21321874e4050c412aa2f8" - }, - "proof": [ - { - "type": "OpenAttestationSignature2018", - "created": "2021-03-20T02:30:45.855Z", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - "signature": "0xda8c9560e01c41c572abca1ecf356531b10fcb9fee28f47995c18284d1d638235e6fcfce9b56ce2994d29dfd7cfeb09b41e43de744304a0ca85fd604eb1ba3a41b" - } - ] -} \ No newline at end of file diff --git a/test/fixtures/v1/example_healthcert_without_everything_unwrapped.json b/test/fixtures/v1/example_healthcert_without_everything_unwrapped.json deleted file mode 100644 index a9c0d2b2..00000000 --- a/test/fixtures/v1/example_healthcert_without_everything_unwrapped.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "id": "TEST001", - "name": "HealthCert", - "validFrom": "2020-11-20", - "fhirVersion": "4.0.1", - "fhirBundle": { - "resourceType": "Bundle", - "type": "collection", - "entry": [ - { - "resourceType": "Patient", - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "SG" - } - } - ], - "identifier": [ - { - "type": "PPN", - "value": "E7831177G" - } - ], - "name": [ - { - "text": ["Tan Chen Chen"] - } - ] - }, - { - "resourceType": "Specimen", - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "258500001" - } - ] - } - }, - { - "specimen": { - "reference": "urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d" - }, - "performerReference": [ - { - "reference": "urn:uuid:dddd1321-4af5-424c-a0e1-ed3aab1c349d" - }, - { - "reference": "urn:uuid:eeee1321-4af5-424c-a0e1-ed3aab1c349d" - } - ], - "resourceType": "Observation", - "identifier": [ - { - "value": "123456789", - "type": "ACSN" - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "260385009", - "display": "Negative" - } - ] - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "status": "final", - "performer": { - "name": [ - { - "text": null - } - ] - } - }, - { - "resourceType": "Organization", - "name": "MacRitchie Medical Clinic", - "endpoint": { - "address": "https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6563113111" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "Organization", - "type": "Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6562711188" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "id": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "NONE" - }, - "name": "SAMPLE CLINIC", - "identityProof": { - "type": "DNS-DID", - "location": "donotverify.testing.verify.gov.sg", - "key": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "logo": "data:image/png;base64,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", - "$template": { - "name": "HEALTHCERT", - "type": "EMBEDDED_RENDERER", - "url": "https://moh-healthcert-renderer.netlify.app/" - } -} diff --git a/test/fixtures/v1/example_healthcert_without_everything_wrapped.json b/test/fixtures/v1/example_healthcert_without_everything_wrapped.json deleted file mode 100644 index b8318cf0..00000000 --- a/test/fixtures/v1/example_healthcert_without_everything_wrapped.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "version": "https://schema.openattestation.com/2.0/schema.json", - "data": { - "id": "f76de451-4821-481a-8838-cd84310eb01b:string:TEST001", - "name": "63d5cd2d-2b75-4c9f-abc4-4945d5e4f3ff:string:HealthCert", - "validFrom": "8a208639-00cd-4372-a235-3158eadc6971:string:2020-11-20", - "fhirVersion": "81a37877-9936-4c6c-a245-239db1f55bdd:string:4.0.1", - "fhirBundle": { - "resourceType": "e94ad12e-f7d7-4f37-9eec-0ddf22e511cf:string:Bundle", - "type": "236154b8-7a78-4296-a466-74602ba16690:string:collection", - "entry": [ - { - "resourceType": "e4822ed1-ac80-4845-b373-d0093c571a45:string:Patient", - "extension": [ - { - "url": "63f7f676-1c13-4f89-ab5f-963b795a9977:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "c0377fae-26f5-44ba-a984-01a6d71c8fd2:string:SG" - } - } - ], - "identifier": [ - { - "type": "700c7304-6025-495d-845b-7b05eae0b9b0:string:PPN", - "value": "b905504d-7c7b-4eb2-8359-ec44128cd76e:string:E7831177G" - } - ], - "name": [ - { - "text": [ - "4b13360f-bd65-4b5f-81d8-8e0e395fcdd3:string:Tan Chen Chen" - ] - } - ] - }, - { - "resourceType": "f99ca7a1-90dd-463a-8c4f-6f9b48481b3d:string:Specimen", - "type": { - "coding": [ - { - "system": "cfca12b0-c2af-450b-8c2e-75fba425f823:string:http://snomed.info/sct", - "code": "8ce3e38b-7b1d-4e83-b863-42bf1122c7c0:string:258500001" - } - ] - } - }, - { - "specimen": { - "reference": "996ea772-8af0-444a-84ba-ff19e85b2050:string:urn:uuid:bbbb1321-4af5-424c-a0e1-ed3aab1c349d" - }, - "performerReference": [ - { - "reference": "00c50ac0-bedc-4c13-af55-79dbd7665515:string:urn:uuid:dddd1321-4af5-424c-a0e1-ed3aab1c349d" - }, - { - "reference": "1fe5aa44-7ebf-46d6-a4bd-b844680b68dd:string:urn:uuid:eeee1321-4af5-424c-a0e1-ed3aab1c349d" - } - ], - "resourceType": "3b15fa01-4bc5-494b-9cc8-f57dbeaa8aa7:string:Observation", - "identifier": [ - { - "value": "07faa943-a12c-4f2f-b870-34777d52b28d:string:123456789", - "type": "8fcb0a4f-5a7f-4acf-9918-f4ea8baf3738:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "96ad77f5-5983-4f0e-a9f0-7096a81c323d:string:http://loinc.org", - "display": "1df06158-9240-4c23-b41c-5585de79ee7e:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "e2417a38-b2a4-4c14-afe8-072518c92533:string:http://snomed.info/sct", - "code": "89a0a028-4a37-4b90-bc9a-b3220bec703f:string:260385009", - "display": "4a6c1a7a-d49a-4126-9ecd-365f87d73cca:string:Negative" - } - ] - }, - "effectiveDateTime": "c27c0317-2463-4103-89b5-ec0e3f5fdf7c:string:2020-09-28T06:15:00Z", - "status": "db28cce4-60fb-47e3-9e44-e1f4736bfdde:string:final", - "performer": { - "name": [ - { - "text": "a049c99b-23af-4f86-8897-82f7e5bab9e9:null:null" - } - ] - } - }, - { - "resourceType": "485e33be-4c34-431e-b32f-dd0eb1077e85:string:Organization", - "name": "ac3816fd-de6f-446d-af58-4970fbd7e09a:string:MacRitchie Medical Clinic", - "endpoint": { - "address": "6a11a51b-3402-4507-9f62-2782c41e298b:string:https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "d097c6c7-2316-4434-9894-c28df34343ed:string:phone", - "value": "68396f0d-d4d6-4e8a-8e0b-09bf40a39968:string:+6563113111" - } - ], - "address": { - "type": "5895c97d-a407-4aa5-b934-f38ec1788007:string:physical", - "use": "82d430ee-f74d-4fb9-a49b-59c16c6fa973:string:work", - "text": "2f4e9358-5bce-4c04-b68c-2d71b2ef0371:string:MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "d153be2e-6cf1-4af8-8af6-3dd43e81d78e:string:Organization", - "type": "c6de8ab6-bc81-4c72-8230-10631f4c16cb:string:Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "432a87bc-d763-4e3c-944c-6592b12945e7:string:phone", - "value": "ac2ffec7-da4c-4ecb-b575-e4f248db125c:string:+6562711188" - } - ], - "address": { - "type": "bcdf5904-b7dc-44ea-bcbf-d6599341adb0:string:physical", - "use": "e76b9dca-e942-4d1e-9c8e-0a0825b9d1c7:string:work", - "text": "eedc4634-9c81-4e91-b623-1b6ba5d307ab:string:2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "id": "b275da75-9414-4f7c-a605-935cf83b2e17:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830", - "revocation": { - "type": "21749900-1416-409f-8ea1-fb32edca6579:string:NONE" - }, - "name": "4bbdc600-b091-4c95-b106-a1fac029d2d5:string:SAMPLE CLINIC", - "identityProof": { - "type": "1543dbe9-166f-432d-b007-e37405c8f744:string:DNS-DID", - "location": "af4c3b4d-ece8-4da7-948e-94f4e25a61a2:string:donotverify.testing.verify.gov.sg", - "key": "d4ce0ecd-8089-4841-a5dc-5b2b1de7aafd:string:did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller" - } - } - ], - "logo": "a806893f-20a7-46d0-b962-134b6bee43dd:string:data:image/png;base64,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", - "$template": { - "name": "a89ad816-e22e-4a79-afd6-a457d0b5f7d5:string:HEALTHCERT", - "type": "1281323a-3079-4a92-b630-23386c9788a4:string:EMBEDDED_RENDERER", - "url": "ecffb2c3-c513-4a66-b801-21a824026f2d:string:https://moh-healthcert-renderer.netlify.app/" - } - }, - "signature": { - "type": "SHA3MerkleProof", - "targetHash": "a29cde639d7695f1d26bec5e7a33cf38b6cfd023b6682134453477e9be2fe681", - "proof": [], - "merkleRoot": "a29cde639d7695f1d26bec5e7a33cf38b6cfd023b6682134453477e9be2fe681" - }, - "proof": [ - { - "type": "OpenAttestationSignature2018", - "created": "2021-03-20T02:31:05.252Z", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:ethr:0xE39479928Cc4EfFE50774488780B9f616bd4B830#controller", - "signature": "0x3599c3f25a3bf8d592a7af746a7c7ee2adb345d1bf1a3cdb6e109453e3be8cae3e8fad0e6f599e9044607448cc014e25a365a3d28bcbddb2ceaee6cd69540b5c1b" - } - ] -} \ No newline at end of file From 1d5b0e3546b04f57257850c0a552ab7c64674c2b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 16 Feb 2022 23:17:33 +0000 Subject: [PATCH 20/20] fix: upgrade @middy/ssm from 2.5.6 to 2.5.7 Snyk has created this PR to upgrade @middy/ssm from 2.5.6 to 2.5.7. See this package in npm: https://www.npmjs.com/package/@middy/ssm See this project in Snyk: https://app.snyk.io/org/notarise-gov-sg/project/1b18c832-9887-428f-a9fc-7d5d1cd77330?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 21 +++++++++++++++------ package.json | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index fbf52595..10d2b595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2837,11 +2837,18 @@ } }, "@middy/ssm": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@middy/ssm/-/ssm-2.5.6.tgz", - "integrity": "sha512-MglG68oQqK+PM+0bwP5cLbRxTbdY0kDDt45jOSV7yMWzVXJhJT9Li2tL344t31eWKm1saTW07i6Wj8ABo3HqSg==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@middy/ssm/-/ssm-2.5.7.tgz", + "integrity": "sha512-mpUxNJt6KNCD2uDi15LaU4qy4w08e/3+GBq3VUd/HPHJOcafUpex5Oa+wKqs52WlZ2k0wlM0eA4Z2cjs6eDe2g==", "requires": { - "@middy/util": "^2.5.6" + "@middy/util": "^2.5.7" + }, + "dependencies": { + "@middy/util": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@middy/util/-/util-2.5.7.tgz", + "integrity": "sha512-4CwEVfUyvF0n1qtEzrcrV56L7iQYyt6zChYQ9N5/uvQgAhdExLzOinW6ki1ZjTMgaMypqdHNUyDAEiAuNJLRUw==" + } } }, "@middy/util": { @@ -5221,7 +5228,8 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -5476,7 +5484,8 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.3.0", diff --git a/package.json b/package.json index c977df45..14b87ae0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@middy/core": "^2.5.6", "@middy/http-error-handler": "^2.5.6", "@middy/http-json-body-parser": "^2.5.6", - "@middy/ssm": "^2.5.6", + "@middy/ssm": "^2.5.7", "@notarise-gov-sg/gpay-covid-cards": "^1.0.5", "@notarise-gov-sg/i18n-nationality": "^1.2.2", "@notarise-gov-sg/sns-notify-recipients": "^1.5.2",