diff options
author | Nick Van Doorn <vandoorn.nick@gmail.com> | 2019-03-02 04:18:49 -0800 |
---|---|---|
committer | Nick Van Doorn <vandoorn.nick@gmail.com> | 2019-03-02 04:18:49 -0800 |
commit | a39676b7f7d575f7d293794c4d9f05c349258164 (patch) | |
tree | 40578a9bf2becc32192cece2d38c3fa78e74aaef | |
parent | 3852df353ba1d9e767c2435e19ad887306d36fa1 (diff) |
Update sample apps
-rw-r--r-- | sample-apps/angular-chat/package-lock.json | 102 | ||||
-rw-r--r-- | sample-apps/angular-chat/package.json | 5 | ||||
-rw-r--r-- | sample-apps/angular-chat/src/app/app.component.ts | 7 | ||||
-rw-r--r-- | sample-apps/angular-chat/src/app/app.module.ts | 19 | ||||
-rw-r--r-- | sample-apps/angular-chat/src/app/chat-message.model.ts | 4 | ||||
-rw-r--r-- | sample-apps/angular-chat/src/app/messaging.service.spec.ts | 12 | ||||
-rw-r--r-- | sample-apps/angular-chat/src/app/messaging.service.ts | 42 | ||||
-rw-r--r-- | sample-apps/angular-chat/tsconfig.json | 9 | ||||
-rw-r--r-- | sample-apps/react-chat/package.json | 1 | ||||
-rwxr-xr-x | sample-apps/react-chat/yarn.lock | 24 |
10 files changed, 180 insertions, 45 deletions
diff --git a/sample-apps/angular-chat/package-lock.json b/sample-apps/angular-chat/package-lock.json index 6657bba..4f8dd8f 100644 --- a/sample-apps/angular-chat/package-lock.json +++ b/sample-apps/angular-chat/package-lock.json @@ -662,8 +662,15 @@ "@types/node": { "version": "8.9.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", - "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", - "dev": true + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==" + }, + "@types/node-fetch": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.1.6.tgz", + "integrity": "sha512-Hv1jgh3pfpUEl2F2mqUd1AfLSk1YbUCeBJFaP36t7esAO617dErqdxWb5cdG2NfJGOofkmBW36fdx0dVewxDRg==", + "requires": { + "@types/node": "*" + } }, "@types/q": { "version": "0.0.32", @@ -1060,6 +1067,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2255,7 +2263,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "constants-browserify": { "version": "1.0.0", @@ -2651,7 +2660,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "dev": true, + "optional": true }, "depd": { "version": "1.1.2", @@ -3589,7 +3599,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3610,12 +3621,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3630,17 +3643,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3757,7 +3773,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3769,6 +3786,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3783,6 +3801,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3790,12 +3809,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3814,6 +3835,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3894,7 +3916,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3906,6 +3929,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3991,7 +4015,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4027,6 +4052,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4046,6 +4072,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4089,12 +4116,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4103,6 +4132,7 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4115,6 +4145,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4152,7 +4183,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "dev": true, + "optional": true }, "get-stream": { "version": "3.0.0", @@ -4332,7 +4364,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "optional": true }, "has-value": { "version": "1.0.0", @@ -5052,7 +5085,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -5618,6 +5652,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -5630,7 +5665,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -5905,7 +5941,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "optional": true }, "map-visit": { "version": "1.0.0", @@ -6225,6 +6262,15 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "naive-client": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/naive-client/-/naive-client-2.3.4.tgz", + "integrity": "sha512-8JqQ++jBOjGLFMzo0iNJwIrM5tu5omKwFLubQOcIXFdKc1rq3qJlJlpVs4Dgz3fRSRmaovG6CzX4pRoSG7l2fQ==", + "requires": { + "@types/node-fetch": "^2.1.4", + "node-fetch": "^2.3.0" + } + }, "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", @@ -6269,6 +6315,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + }, "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", @@ -6526,6 +6577,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7520,6 +7572,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, + "optional": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -7531,6 +7584,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -7541,7 +7595,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -7550,6 +7605,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, + "optional": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -7560,6 +7616,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, + "optional": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -7570,6 +7627,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, + "optional": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -8850,6 +8908,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, + "optional": true, "requires": { "is-utf8": "^0.2.0" } @@ -10170,6 +10229,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.2 || 2" } diff --git a/sample-apps/angular-chat/package.json b/sample-apps/angular-chat/package.json index 6b2a7cf..1444f55 100644 --- a/sample-apps/angular-chat/package.json +++ b/sample-apps/angular-chat/package.json @@ -20,8 +20,9 @@ "@angular/platform-browser-dynamic": "~7.2.0", "@angular/router": "~7.2.0", "core-js": "^2.5.4", + "naive-client": "^2.3.4", "rxjs": "~6.3.3", - "tslib": "^1.9.0", + "tslib": "^1.9.3", "zone.js": "~0.8.26" }, "devDependencies": { @@ -29,9 +30,9 @@ "@angular/cli": "~7.3.4", "@angular/compiler-cli": "~7.2.0", "@angular/language-service": "~7.2.0", - "@types/node": "~8.9.4", "@types/jasmine": "~2.8.8", "@types/jasminewd2": "~2.0.3", + "@types/node": "~8.9.4", "codelyzer": "~4.5.0", "jasmine-core": "~2.99.1", "jasmine-spec-reporter": "~4.2.1", diff --git a/sample-apps/angular-chat/src/app/app.component.ts b/sample-apps/angular-chat/src/app/app.component.ts index 0db5358..bb844c1 100644 --- a/sample-apps/angular-chat/src/app/app.component.ts +++ b/sample-apps/angular-chat/src/app/app.component.ts @@ -1,4 +1,6 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' + +import { MessagingService } from './messaging.service' @Component({ selector: 'app-root', @@ -6,5 +8,6 @@ import { Component } from '@angular/core'; styleUrls: ['./app.component.scss'] }) export class AppComponent { - title = 'angular-chat'; + constructor(private MessagingService) {} + title = 'angular-chat' } diff --git a/sample-apps/angular-chat/src/app/app.module.ts b/sample-apps/angular-chat/src/app/app.module.ts index f657163..1e8805c 100644 --- a/sample-apps/angular-chat/src/app/app.module.ts +++ b/sample-apps/angular-chat/src/app/app.module.ts @@ -1,16 +1,13 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser' +import { NgModule } from '@angular/core' -import { AppComponent } from './app.component'; +import { AppComponent } from './app.component' +import { MessagingService } from './messaging.service' @NgModule({ - declarations: [ - AppComponent - ], - imports: [ - BrowserModule - ], - providers: [], + declarations: [AppComponent], + imports: [BrowserModule], + providers: [MessagingService], bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule {} diff --git a/sample-apps/angular-chat/src/app/chat-message.model.ts b/sample-apps/angular-chat/src/app/chat-message.model.ts new file mode 100644 index 0000000..84baea0 --- /dev/null +++ b/sample-apps/angular-chat/src/app/chat-message.model.ts @@ -0,0 +1,4 @@ +export interface ChatMessage { + user: string + message: string +} diff --git a/sample-apps/angular-chat/src/app/messaging.service.spec.ts b/sample-apps/angular-chat/src/app/messaging.service.spec.ts new file mode 100644 index 0000000..135881a --- /dev/null +++ b/sample-apps/angular-chat/src/app/messaging.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { MessagingService } from './messaging.service'; + +describe('MessagingService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: MessagingService = TestBed.get(MessagingService); + expect(service).toBeTruthy(); + }); +}); diff --git a/sample-apps/angular-chat/src/app/messaging.service.ts b/sample-apps/angular-chat/src/app/messaging.service.ts new file mode 100644 index 0000000..4330a23 --- /dev/null +++ b/sample-apps/angular-chat/src/app/messaging.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' + +// TODO use npm/yarn +import { dbFactory, DatabaseConnection } from '../../../../client/src' + +import { ChatMessage } from './chat-message.model' + +const wsUrl = 'http://localhost:5001' +const httpUrl = 'http://localhost:5000' + +@Injectable({ + providedIn: 'root' +}) +export class MessagingService { + private db: DatabaseConnection + constructor() { + this.db = dbFactory({ wsUrl, httpUrl }) + } + + async makeChatRoom(userId: string): Promise<string> { + const chatRoomId = Date.now().toString() + await this.db.write(`/chatRooms/${chatRoomId}`, { + user: 'admin', + message: `Oh no she better don't` + }) + return chatRoomId + } + + getChatRoom(chatRoomId: string): Observable<ChatMessage[]> { + return Observable.create(observer => { + this.db.subscribe(`/chatRooms/${chatRoomId}`, data => observer.next(data)) + }) + } + + sendMessage(userId: string, chatRoomId: string, message: string) { + return this.db.write(`/chatRooms/${chatRoomId}`, { + user: userId, + message + }) + } +} diff --git a/sample-apps/angular-chat/tsconfig.json b/sample-apps/angular-chat/tsconfig.json index b271fd9..2404571 100644 --- a/sample-apps/angular-chat/tsconfig.json +++ b/sample-apps/angular-chat/tsconfig.json @@ -11,12 +11,7 @@ "experimentalDecorators": true, "importHelpers": true, "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2018", - "dom" - ] + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"] } } diff --git a/sample-apps/react-chat/package.json b/sample-apps/react-chat/package.json index 2f2e194..e66362a 100644 --- a/sample-apps/react-chat/package.json +++ b/sample-apps/react-chat/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "naive-client": "^2.3.4", "react": "^16.8.3", "react-dom": "^16.8.3", "react-scripts": "2.1.5" diff --git a/sample-apps/react-chat/yarn.lock b/sample-apps/react-chat/yarn.lock index dd90178..a1f776e 100755 --- a/sample-apps/react-chat/yarn.lock +++ b/sample-apps/react-chat/yarn.lock @@ -878,6 +878,13 @@ "@svgr/plugin-svgo" "^4.0.3" loader-utils "^1.1.0" +"@types/node-fetch@^2.1.4": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.1.6.tgz#4326288b49f352a142f03c63526ebce0f4c50877" + integrity sha512-Hv1jgh3pfpUEl2F2mqUd1AfLSk1YbUCeBJFaP36t7esAO617dErqdxWb5cdG2NfJGOofkmBW36fdx0dVewxDRg== + dependencies: + "@types/node" "*" + "@types/node@*": version "10.12.24" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.24.tgz#b13564af612a22a20b5d95ca40f1bffb3af315cf" @@ -6193,6 +6200,14 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +naive-client@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/naive-client/-/naive-client-2.3.4.tgz#6efbda9c71494bf8e060e35e7e9c0679c1437dcd" + integrity sha512-8JqQ++jBOjGLFMzo0iNJwIrM5tu5omKwFLubQOcIXFdKc1rq3qJlJlpVs4Dgz3fRSRmaovG6CzX4pRoSG7l2fQ== + dependencies: + "@types/node-fetch" "^2.1.4" + node-fetch "^2.3.0" + nan@^2.9.2: version "2.12.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" @@ -6251,6 +6266,11 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" @@ -7840,7 +7860,7 @@ react-dev-utils@^7.0.3: strip-ansi "5.0.0" text-table "0.2.0" -react-dom@16.8.3: +react-dom@^16.8.3: version "16.8.3" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.3.tgz#ae236029e66210783ac81999d3015dfc475b9c32" integrity sha512-ttMem9yJL4/lpItZAQ2NTFAbV7frotHk5DZEHXUOws2rMmrsvh1Na7ThGT0dTzUIl6pqTOi5tYREfL8AEna3lA== @@ -7915,7 +7935,7 @@ react-scripts@2.1.5: optionalDependencies: fsevents "1.2.4" -react@16.8.3: +react@^16.8.3: version "16.8.3" resolved "https://registry.yarnpkg.com/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9" integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA== |