fmode-ng 0.0.113 → 0.0.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs
CHANGED
|
@@ -1,195 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { IonButton, IonIcon, IonSpinner, ModalController, Platform, ToastController } from '@ionic/angular/standalone';
|
|
3
|
-
import { FmodeVoiceService } from '../../../voice/fmode-voice.service';
|
|
4
|
-
import { FmodeChat } from '../../../service-fmai/service-chat';
|
|
5
|
-
import { CommonModule } from '@angular/common';
|
|
6
|
-
import { NovaUploadService } from '../../../../storage/service-upload/nova-upload.service';
|
|
7
|
-
import Parse from "parse";
|
|
8
|
-
import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@ionic/angular/standalone";
|
|
11
|
-
import * as i2 from "../../../../storage/service-upload/nova-upload.service";
|
|
12
|
-
import * as i3 from "@awesome-cordova-plugins/diagnostic/ngx";
|
|
13
|
-
import * as i4 from "@angular/common";
|
|
14
|
-
export class ModalAudioMessageComponent {
|
|
15
|
-
constructor(toastCtrl, uploadServ, platform, diagnostic) {
|
|
16
|
-
this.toastCtrl = toastCtrl;
|
|
17
|
-
this.uploadServ = uploadServ;
|
|
18
|
-
this.platform = platform;
|
|
19
|
-
this.diagnostic = diagnostic;
|
|
20
|
-
this.isRecording = false;
|
|
21
|
-
/**
|
|
22
|
-
* 语音听写服务 ==============================================
|
|
23
|
-
*/
|
|
24
|
-
/**
|
|
25
|
-
* 音频提示音播放
|
|
26
|
-
*/
|
|
27
|
-
this.player = new Audio();
|
|
28
|
-
/**
|
|
29
|
-
* 计时器
|
|
30
|
-
*/
|
|
31
|
-
this.durationStr = "0:00";
|
|
32
|
-
this.voiceServ = new FmodeVoiceService(this.platform, this.diagnostic);
|
|
33
|
-
}
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
// setTimeout(() => {
|
|
36
|
-
this.chat.userInput = ``;
|
|
37
|
-
this.initVoiceSevice();
|
|
38
|
-
this.voiceServ.startTalk();
|
|
39
|
-
// }, 500);
|
|
40
|
-
}
|
|
41
|
-
playMusic(action) {
|
|
42
|
-
if (!this.player) {
|
|
43
|
-
this.player = new Audio();
|
|
44
|
-
}
|
|
45
|
-
this.player.src = `/assets/avatar/voice/${action}.mp3`;
|
|
46
|
-
try {
|
|
47
|
-
this.player?.play();
|
|
48
|
-
}
|
|
49
|
-
catch (err) { }
|
|
50
|
-
}
|
|
1
|
+
|
|
51
2
|
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* 嵌入动画
|
|
57
|
-
* 嵌入唤醒词切换逻辑
|
|
58
|
-
*/
|
|
59
|
-
initVoiceSevice() {
|
|
60
|
-
this.chat.userInput = this.voiceServ.resultText;
|
|
61
|
-
this.voiceServ.requestPermission().then(() => {
|
|
62
|
-
this.voiceServ.openWithPriviledge();
|
|
63
|
-
});
|
|
64
|
-
// 开始录音前 播放倾听动画
|
|
65
|
-
// 开始录音前 播放提示音
|
|
66
|
-
this.voiceServ.onBeforeStartTalk = () => {
|
|
67
|
-
this.chat.playAnimation("listening");
|
|
68
|
-
this.playMusic("start-talk");
|
|
69
|
-
};
|
|
70
|
-
// 开始录音后 加载计时器
|
|
71
|
-
this.voiceServ.onAfterRecordStart = () => {
|
|
72
|
-
this.isRecording = true;
|
|
73
|
-
};
|
|
74
|
-
// 计时器显示文本
|
|
75
|
-
this.voiceServ.onDurationStrChange = (durationStr) => {
|
|
76
|
-
this.durationStr = durationStr;
|
|
77
|
-
};
|
|
78
|
-
// 用户取消录音前 播放提示音
|
|
79
|
-
this.voiceServ.onBeforeCancelTalk = () => {
|
|
80
|
-
this.playMusic("interupt-talk");
|
|
81
|
-
this.chat.playAnimation("waiting");
|
|
82
|
-
};
|
|
83
|
-
// 用户取消录音后 麦克风实时监听唤醒词
|
|
84
|
-
this.voiceServ.onAfterCancelTalk = () => {
|
|
85
|
-
// this.startASRAwake() // 监听与麦克风冲突,需要重启
|
|
86
|
-
};
|
|
87
|
-
// 完成录音前 播放提示音
|
|
88
|
-
// 完成录音后 执行处理过程
|
|
89
|
-
this.voiceServ.onBeforeFinishTalk = () => {
|
|
90
|
-
this.chat.playAnimation("thinking");
|
|
91
|
-
this.playMusic("stop-talk");
|
|
92
|
-
};
|
|
93
|
-
this.voiceServ.onAfterFinishTalk = async () => {
|
|
94
|
-
console.log("onAfterFinishTalk1", this.voiceServ?.resultText);
|
|
95
|
-
console.log("onAfterFinishTalk2", this.voiceServ?.resultTextTemp);
|
|
96
|
-
this.chat.userInput = "" + (this.voiceServ?.resultTextTemp || this.voiceServ?.resultText);
|
|
97
|
-
if (this.chat?.userInput) {
|
|
98
|
-
await this.saveChatVoice();
|
|
99
|
-
}
|
|
100
|
-
this.sendMessage(); // 发送消息
|
|
101
|
-
// this.startASRAwake() // 监听与麦克风冲突,需要重启
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
async saveChatVoice() {
|
|
105
|
-
let blob = this.voiceServ.recordWavBlob;
|
|
106
|
-
let duration = this.voiceServ.recordDuration;
|
|
107
|
-
if (blob) {
|
|
108
|
-
// 创建声音数据对象
|
|
109
|
-
let ChatVoice = Parse.Object.extend("ChatVoice");
|
|
110
|
-
this.chatVoice = new ChatVoice();
|
|
111
|
-
this.chatVoice.set("content", this.chat.userInput);
|
|
112
|
-
this.chatVoice.set("role", "user");
|
|
113
|
-
this.chatVoice.set("duration", duration);
|
|
114
|
-
let company = localStorage.getItem("company");
|
|
115
|
-
company && this.chatVoice.set("company", { __type: "Pointer", className: "Company", objectId: company });
|
|
116
|
-
Parse.User.current()?.id && this.chatVoice.set("user", Parse.User.current().toPointer());
|
|
117
|
-
// 上传音频文件并保存
|
|
118
|
-
let id = this.chatVoice?.id || this.uploadServ?.genMd5(this.chatVoice?.get("content") || this.chatVoice?.get("ssml"));
|
|
119
|
-
let now = new Date();
|
|
120
|
-
let filename = id + now.getFullYear() + (now.getMonth() + 1) + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds() + ".wav";
|
|
121
|
-
let file = new File([blob], filename, { type: 'audio/wav' });
|
|
122
|
-
this.uploadServ.maxSize = 1024 * 1024 * 1024; // 1G上限
|
|
123
|
-
let fileResult = await this.uploadServ.upload(file, (res) => {
|
|
124
|
-
console.log(res); // 上传进度,可以同步更新页面上传百分比
|
|
125
|
-
});
|
|
126
|
-
let attachPointer = { __type: "Pointer", className: "Attachment", objectId: fileResult?.id };
|
|
127
|
-
if (attachPointer?.objectId) {
|
|
128
|
-
this.chatVoice.set("voiceFile", attachPointer);
|
|
129
|
-
this.chatVoice = await this.chatVoice.save();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
async sendMessage() {
|
|
135
|
-
// 检测用户登录情况
|
|
136
|
-
// let isLoginLock = await this.authServ.checkLoginLock()
|
|
137
|
-
// if(!isLoginLock) return false
|
|
138
|
-
// 检测余额及模型付费限制
|
|
139
|
-
// let payCheck = await this.checkBalance()
|
|
140
|
-
// if(!payCheck) return false
|
|
141
|
-
// 检测用户输入内容空值
|
|
142
|
-
if (!this.chat.userInput) {
|
|
143
|
-
let toast = await this.toastCtrl.create({
|
|
144
|
-
message: `内容不能为空`,
|
|
145
|
-
position: "top",
|
|
146
|
-
icon: 'alert',
|
|
147
|
-
color: "warning-circle",
|
|
148
|
-
duration: 1000
|
|
149
|
-
});
|
|
150
|
-
toast.present();
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
// 正常发送消息
|
|
154
|
-
// this.chat.isTalkMode = true;
|
|
155
|
-
this.chat?.sendMessage("" + this.chat?.userInput, this.chat?.userImage, (msg) => {
|
|
156
|
-
}, {
|
|
157
|
-
onSSMLComplete: (voice) => {
|
|
158
|
-
console.log(voice);
|
|
159
|
-
}
|
|
160
|
-
}, { id: this.chatVoice?.id, duration: this.chatVoice?.get("duration") });
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* 操作区
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs
|
|
164
7
|
*/
|
|
165
|
-
cancel() {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
this.modal?.dismiss(null, "cancel");
|
|
169
|
-
}
|
|
170
|
-
send() {
|
|
171
|
-
this.clear();
|
|
172
|
-
this.voiceServ.finishTalk();
|
|
173
|
-
this.modal?.dismiss(null, "send");
|
|
174
|
-
}
|
|
175
|
-
clear() {
|
|
176
|
-
this.now = undefined;
|
|
177
|
-
this.isRecording = false;
|
|
178
|
-
}
|
|
179
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ModalAudioMessageComponent, deps: [{ token: i1.ToastController }, { token: i2.NovaUploadService }, { token: i1.Platform }, { token: i3.Diagnostic }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
180
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ModalAudioMessageComponent, isStandalone: true, selector: "fm-modal-audio-message", inputs: { chat: "chat", modal: "modal" }, providers: [ModalController], ngImport: i0, template: "<!-- <div style=\"background:#FFFFFF;color:#000000;width:100%\">\r\n {{this.chat.userInput}}\r\n</div> -->\r\n<div class=\"modal-area\">\r\n\r\n <!-- \u52A0\u8F7DWebSockets\u52A8\u753B -->\r\n <ng-container *ngIf=\"!isRecording\">\r\n <div class=\"row\">\r\n <ion-spinner name=\"crescent\" color=\"success\" style=\"width:80px;height:80px;\"></ion-spinner>\r\n </div>\r\n </ng-container>\r\n <!-- \u5F55\u97F3\u4E2D\u52A8\u753B -->\r\n <ng-container *ngIf=\"isRecording\">\r\n <div class=\"actions row\">\r\n <!-- \u53D6\u6D88 -->\r\n <ion-button (click)=\"cancel()\" size=\"large\" shape=\"round\" color=\"light\">\r\n <ion-icon name=\"close-outline\"></ion-icon>\r\n </ion-button>\r\n <!-- \u97F3\u9891 -->\r\n <div class=\"audio-input\">\r\n <div class=\"timer row\">\r\n {{durationStr || \"00:00\"}}\r\n </div>\r\n <div class=\"audio-wave row\">\r\n <div class=\"audio\">\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- \u53D1\u9001 -->\r\n <ion-button (click)=\"send()\" size=\"large\" shape=\"round\" color=\"success\">\r\n <ion-icon name=\"send-outline\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n \r\n <div class=\"tips row\">\r\n \u8BF7\u60A8\u8BB2\u8BDD\uFF0CAI\u4F1A\u8BC6\u522B\uFF01\r\n </div>\r\n </ng-container>\r\n</div>", styles: [":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
|
|
181
|
-
}
|
|
182
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ModalAudioMessageComponent, decorators: [{
|
|
183
|
-
type: Component,
|
|
184
|
-
args: [{ selector: 'fm-modal-audio-message', standalone: true, imports: [
|
|
185
|
-
CommonModule,
|
|
186
|
-
IonButton,
|
|
187
|
-
IonIcon,
|
|
188
|
-
IonSpinner
|
|
189
|
-
], providers: [ModalController], template: "<!-- <div style=\"background:#FFFFFF;color:#000000;width:100%\">\r\n {{this.chat.userInput}}\r\n</div> -->\r\n<div class=\"modal-area\">\r\n\r\n <!-- \u52A0\u8F7DWebSockets\u52A8\u753B -->\r\n <ng-container *ngIf=\"!isRecording\">\r\n <div class=\"row\">\r\n <ion-spinner name=\"crescent\" color=\"success\" style=\"width:80px;height:80px;\"></ion-spinner>\r\n </div>\r\n </ng-container>\r\n <!-- \u5F55\u97F3\u4E2D\u52A8\u753B -->\r\n <ng-container *ngIf=\"isRecording\">\r\n <div class=\"actions row\">\r\n <!-- \u53D6\u6D88 -->\r\n <ion-button (click)=\"cancel()\" size=\"large\" shape=\"round\" color=\"light\">\r\n <ion-icon name=\"close-outline\"></ion-icon>\r\n </ion-button>\r\n <!-- \u97F3\u9891 -->\r\n <div class=\"audio-input\">\r\n <div class=\"timer row\">\r\n {{durationStr || \"00:00\"}}\r\n </div>\r\n <div class=\"audio-wave row\">\r\n <div class=\"audio\">\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n <div class=\"wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- \u53D1\u9001 -->\r\n <ion-button (click)=\"send()\" size=\"large\" shape=\"round\" color=\"success\">\r\n <ion-icon name=\"send-outline\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n \r\n <div class=\"tips row\">\r\n \u8BF7\u60A8\u8BB2\u8BDD\uFF0CAI\u4F1A\u8BC6\u522B\uFF01\r\n </div>\r\n </ng-container>\r\n</div>", styles: [":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"] }]
|
|
190
|
-
}], ctorParameters: () => [{ type: i1.ToastController }, { type: i2.NovaUploadService }, { type: i1.Platform }, { type: i3.Diagnostic }], propDecorators: { chat: [{
|
|
191
|
-
type: Input
|
|
192
|
-
}], modal: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}] } });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtYXVkaW8tbWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvY2hhdC9jaGF0LW1vZGFsLWlucHV0L21vZGFsLWF1ZGlvLW1lc3NhZ2UvbW9kYWwtYXVkaW8tbWVzc2FnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvY2hhdC9jaGF0LW1vZGFsLWlucHV0L21vZGFsLWF1ZGlvLW1lc3NhZ2UvbW9kYWwtYXVkaW8tbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFDLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7OztBQWVyRSxNQUFNLE9BQU8sMEJBQTBCO0lBUXJDLFlBQ1UsU0FBeUIsRUFDekIsVUFBNEIsRUFDNUIsUUFBaUIsRUFDakIsVUFBcUI7UUFIckIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBTi9CLGdCQUFXLEdBQVcsS0FBSyxDQUFDO1FBcUI1Qjs7V0FFRztRQUVIOztXQUVHO1FBQ0YsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUEwSXRCOztXQUVHO1FBQ0gsZ0JBQVcsR0FBVSxNQUFNLENBQUE7UUEvSnpCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4RSxDQUFDO0lBQ0QsUUFBUTtRQUNOLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsV0FBVztJQUNiLENBQUM7SUFXQSxTQUFTLENBQUMsTUFBTTtRQUNmLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLHdCQUF3QixNQUFNLE1BQU0sQ0FBQTtRQUN0RCxJQUFHLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQSxPQUFNLEdBQUcsRUFBQyxDQUFDLENBQUEsQ0FBQztJQUNkLENBQUM7SUFHRDs7Ozs7OztRQU9JO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFBO1FBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUNyQyxDQUFDLENBQUMsQ0FBQTtRQUVGLGVBQWU7UUFDZixjQUFjO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM5QixDQUFDLENBQUE7UUFFRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxHQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDekIsQ0FBQyxDQUFBO1FBQ0QsVUFBVTtRQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxXQUFXLEVBQUMsRUFBRTtZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDLENBQUE7UUFDRCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxHQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUE7UUFDRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFFLEVBQUU7WUFDckMsd0NBQXdDO1FBQzFDLENBQUMsQ0FBQTtRQUNELGNBQWM7UUFDZCxlQUFlO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxHQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM3QixDQUFDLENBQUE7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLEtBQUssSUFBRyxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUE7WUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLElBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUVyRixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBQyxPQUFPO1lBQzFCLHdDQUF3QztRQUMxQyxDQUFDLENBQUE7SUFDSCxDQUFDO0lBR0QsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUE7UUFDdkMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7UUFDNUMsSUFBRyxJQUFJLEVBQUMsQ0FBQztZQUNQLFdBQVc7WUFDWCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzdDLE9BQU8sSUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUMsRUFBQyxNQUFNLEVBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxTQUFTLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUM7WUFDL0YsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUV0RixZQUFZO1lBQ1osSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUNuSCxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQTtZQUNoSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFBLENBQUMsT0FBTztZQUNoRCxJQUFJLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dCQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUMscUJBQXFCO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxhQUFhLEdBQUcsRUFBQyxNQUFNLEVBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxZQUFZLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUMsQ0FBQTtZQUNyRixJQUFHLGFBQWEsRUFBRSxRQUFRLEVBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFFZixXQUFXO1FBQ1gseURBQXlEO1FBQ3pELGdDQUFnQztRQUVoQyxjQUFjO1FBQ2QsMkNBQTJDO1FBQzNDLDZCQUE2QjtRQUU3QixhQUFhO1FBQ2IsSUFBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUM7WUFDdkIsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsT0FBTyxFQUFDLFFBQVE7Z0JBQ2hCLFFBQVEsRUFBQyxLQUFLO2dCQUNkLElBQUksRUFBQyxPQUFPO2dCQUNaLEtBQUssRUFBQyxnQkFBZ0I7Z0JBQ3RCLFFBQVEsRUFBQyxJQUFJO2FBQ2QsQ0FBQyxDQUFBO1lBQ0YsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE9BQU07UUFDUixDQUFDO1FBRUQsU0FBUztRQUNULCtCQUErQjtRQUMvQixJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQyxHQUFPLEVBQUMsRUFBRTtRQUUvRSxDQUFDLEVBQUM7WUFDQSxjQUFjLEVBQUMsQ0FBQyxLQUFTLEVBQUMsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNwQixDQUFDO1NBQ0YsRUFBQyxFQUFDLEVBQUUsRUFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFPSDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBQ0QsSUFBSTtRQUNGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQzsrR0FqTVUsMEJBQTBCO21HQUExQiwwQkFBMEIsK0dBSjNCLENBQUMsZUFBZSxDQUFDLDBCQ2xCN0IsbzZEQTJDTSwreUNEOUJGLFlBQVksbUlBQ1osU0FBUyxvUEFDVCxPQUFPLDJKQUNQLFVBQVU7OzRGQU1ELDBCQUEwQjtrQkFidEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFVBQVU7cUJBQ1gsYUFDUyxDQUFDLGVBQWUsQ0FBQztvS0FNbEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCxJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24sIElvblNwaW5uZXIsIE1vZGFsQ29udHJvbGxlciwgUGxhdGZvcm0sIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xyXG5pbXBvcnQgeyBGbW9kZVZvaWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3ZvaWNlL2Ztb2RlLXZvaWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGbW9kZUNoYXQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlLWZtYWkvc2VydmljZS1jaGF0JztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTm92YVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2UnO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCB7IERpYWdub3N0aWMgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZGlhZ25vc3RpYy9uZ3gnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmbS1tb2RhbC1hdWRpby1tZXNzYWdlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIElvbkJ1dHRvbixcclxuICAgIElvbkljb24sXHJcbiAgICBJb25TcGlubmVyXHJcbiAgXSxcclxuICBwcm92aWRlcnM6W01vZGFsQ29udHJvbGxlcl0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLWF1ZGlvLW1lc3NhZ2UuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9tb2RhbC1hdWRpby1tZXNzYWdlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9kYWxBdWRpb01lc3NhZ2VDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBjaGF0OkZtb2RlQ2hhdDtcclxuICBASW5wdXQoKSBtb2RhbDpNb2RhbENvbnRyb2xsZXJcclxuICBub3c6RGF0ZXx1bmRlZmluZWQ7XHJcblxyXG4gIGlzUmVjb3JkaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICB2b2ljZVNlcnY6Rm1vZGVWb2ljZVNlcnZpY2VcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdG9hc3RDdHJsOlRvYXN0Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgdXBsb2FkU2VydjpOb3ZhVXBsb2FkU2VydmljZSxcclxuICAgIHByaXZhdGUgcGxhdGZvcm06UGxhdGZvcm0sXHJcbiAgICBwcml2YXRlIGRpYWdub3N0aWM6RGlhZ25vc3RpY1xyXG4gICAgXHJcbiAgKXsgICAgICBcclxuICBcclxuICAgIHRoaXMudm9pY2VTZXJ2ID0gbmV3IEZtb2RlVm9pY2VTZXJ2aWNlKHRoaXMucGxhdGZvcm0sdGhpcy5kaWFnbm9zdGljKTtcclxuICAgIFxyXG4gIH1cclxuICBuZ09uSW5pdCgpe1xyXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICB0aGlzLmNoYXQudXNlcklucHV0ID0gYGBcclxuICAgIHRoaXMuaW5pdFZvaWNlU2V2aWNlKClcclxuICAgIHRoaXMudm9pY2VTZXJ2LnN0YXJ0VGFsaygpO1xyXG4gICAgLy8gfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOivremfs+WQrOWGmeacjeWKoSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcbiAgXHJcbiAgLyoqXHJcbiAgICog6Z+z6aKR5o+Q56S66Z+z5pKt5pS+XHJcbiAgICovXHJcbiAgIHBsYXllciA9IG5ldyBBdWRpbygpO1xyXG5cclxuICAgcGxheU11c2ljKGFjdGlvbil7XHJcbiAgICBpZighdGhpcy5wbGF5ZXIpe1xyXG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBBdWRpbygpO1xyXG4gICAgfVxyXG4gICAgIHRoaXMucGxheWVyLnNyYyA9IGAvYXNzZXRzL2F2YXRhci92b2ljZS8ke2FjdGlvbn0ubXAzYFxyXG4gICAgIHRyeXtcclxuICAgICAgIHRoaXMucGxheWVyPy5wbGF5KCk7XHJcbiAgICB9Y2F0Y2goZXJyKXt9XHJcbiAgIH1cclxuXHJcblxyXG4gICAvKipcclxuICAgICAqIOWIneWni+WMluW9lemfs+i9rOW9leacjeWKoVxyXG4gICAgICogQGRlc2NcclxuICAgICAqIOagueaNruaVsOWtl+inkuiJsuWvueivneeKtuaAge+8jOiuvuiuoeivremfs+i9rOW9leWQhOS6i+S7tuWkhOeQhui/h+eoi1xyXG4gICAgICog5bWM5YWl5o+Q56S66Z+zXHJcbiAgICAgKiDltYzlhaXliqjnlLtcclxuICAgICAqIOW1jOWFpeWUpOmGkuivjeWIh+aNoumAu+i+kVxyXG4gICAgICovXHJcbiAgICBpbml0Vm9pY2VTZXZpY2UoKXtcclxuICAgICAgdGhpcy5jaGF0LnVzZXJJbnB1dCA9IHRoaXMudm9pY2VTZXJ2LnJlc3VsdFRleHRcclxuICAgICAgdGhpcy52b2ljZVNlcnYucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKCgpPT57XHJcbiAgICAgICAgdGhpcy52b2ljZVNlcnYub3BlbldpdGhQcml2aWxlZGdlKClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIOW8gOWni+W9lemfs+WJjSDmkq3mlL7lgL7lkKzliqjnlLtcclxuICAgICAgLy8g5byA5aeL5b2V6Z+z5YmNIOaSreaUvuaPkOekuumfs1xyXG4gICAgICB0aGlzLnZvaWNlU2Vydi5vbkJlZm9yZVN0YXJ0VGFsayA9ICgpPT57XHJcbiAgICAgICAgdGhpcy5jaGF0LnBsYXlBbmltYXRpb24oXCJsaXN0ZW5pbmdcIilcclxuICAgICAgICB0aGlzLnBsYXlNdXNpYyhcInN0YXJ0LXRhbGtcIilcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5byA5aeL5b2V6Z+z5ZCOIOWKoOi9veiuoeaXtuWZqFxyXG4gICAgICB0aGlzLnZvaWNlU2Vydi5vbkFmdGVyUmVjb3JkU3RhcnQgPSAoKT0+e1xyXG4gICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlXHJcbiAgICAgIH1cclxuICAgICAgLy8g6K6h5pe25Zmo5pi+56S65paH5pysXHJcbiAgICAgIHRoaXMudm9pY2VTZXJ2Lm9uRHVyYXRpb25TdHJDaGFuZ2UgPSAoZHVyYXRpb25TdHIpPT57XHJcbiAgICAgICAgdGhpcy5kdXJhdGlvblN0ciA9IGR1cmF0aW9uU3RyO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOeUqOaIt+WPlua2iOW9lemfs+WJjSDmkq3mlL7mj5DnpLrpn7NcclxuICAgICAgdGhpcy52b2ljZVNlcnYub25CZWZvcmVDYW5jZWxUYWxrID0gKCk9PntcclxuICAgICAgICB0aGlzLnBsYXlNdXNpYyhcImludGVydXB0LXRhbGtcIilcclxuICAgICAgICB0aGlzLmNoYXQucGxheUFuaW1hdGlvbihcIndhaXRpbmdcIilcclxuICAgICAgfVxyXG4gICAgICAvLyDnlKjmiLflj5bmtojlvZXpn7PlkI4g6bqm5YWL6aOO5a6e5pe255uR5ZCs5ZSk6YaS6K+NXHJcbiAgICAgIHRoaXMudm9pY2VTZXJ2Lm9uQWZ0ZXJDYW5jZWxUYWxrID0gKCk9PntcclxuICAgICAgICAvLyB0aGlzLnN0YXJ0QVNSQXdha2UoKSAvLyDnm5HlkKzkuI7puqblhYvpo47lhrLnqoHvvIzpnIDopoHph43lkK9cclxuICAgICAgfVxyXG4gICAgICAvLyDlrozmiJDlvZXpn7PliY0g5pKt5pS+5o+Q56S66Z+zXHJcbiAgICAgIC8vIOWujOaIkOW9lemfs+WQjiDmiafooYzlpITnkIbov4fnqItcclxuICAgICAgdGhpcy52b2ljZVNlcnYub25CZWZvcmVGaW5pc2hUYWxrID0gKCk9PntcclxuICAgICAgICB0aGlzLmNoYXQucGxheUFuaW1hdGlvbihcInRoaW5raW5nXCIpXHJcbiAgICAgICAgdGhpcy5wbGF5TXVzaWMoXCJzdG9wLXRhbGtcIilcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZvaWNlU2Vydi5vbkFmdGVyRmluaXNoVGFsayA9IGFzeW5jICgpPT57XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJvbkFmdGVyRmluaXNoVGFsazFcIix0aGlzLnZvaWNlU2Vydj8ucmVzdWx0VGV4dClcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm9uQWZ0ZXJGaW5pc2hUYWxrMlwiLHRoaXMudm9pY2VTZXJ2Py5yZXN1bHRUZXh0VGVtcClcclxuICAgICAgICB0aGlzLmNoYXQudXNlcklucHV0ID0gXCJcIisodGhpcy52b2ljZVNlcnY/LnJlc3VsdFRleHRUZW1wfHx0aGlzLnZvaWNlU2Vydj8ucmVzdWx0VGV4dClcclxuICAgICAgICBcclxuICAgICAgICBpZih0aGlzLmNoYXQ/LnVzZXJJbnB1dCl7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVDaGF0Vm9pY2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoKSAvLyDlj5HpgIHmtojmga9cclxuICAgICAgICAvLyB0aGlzLnN0YXJ0QVNSQXdha2UoKSAvLyDnm5HlkKzkuI7puqblhYvpo47lhrLnqoHvvIzpnIDopoHph43lkK9cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoYXRWb2ljZTpQYXJzZS5PYmplY3RcclxuICAgIGFzeW5jIHNhdmVDaGF0Vm9pY2UoKXtcclxuICAgICAgbGV0IGJsb2IgPSB0aGlzLnZvaWNlU2Vydi5yZWNvcmRXYXZCbG9iXHJcbiAgICAgIGxldCBkdXJhdGlvbiA9IHRoaXMudm9pY2VTZXJ2LnJlY29yZER1cmF0aW9uXHJcbiAgICAgIGlmKGJsb2Ipe1xyXG4gICAgICAgIC8vIOWIm+W7uuWjsOmfs+aVsOaNruWvueixoVxyXG4gICAgICAgIGxldCBDaGF0Vm9pY2UgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiQ2hhdFZvaWNlXCIpO1xyXG4gICAgICAgIHRoaXMuY2hhdFZvaWNlID0gbmV3IENoYXRWb2ljZSgpO1xyXG4gICAgICAgIHRoaXMuY2hhdFZvaWNlLnNldChcImNvbnRlbnRcIix0aGlzLmNoYXQudXNlcklucHV0KTtcclxuICAgICAgICB0aGlzLmNoYXRWb2ljZS5zZXQoXCJyb2xlXCIsXCJ1c2VyXCIpO1xyXG4gICAgICAgIHRoaXMuY2hhdFZvaWNlLnNldChcImR1cmF0aW9uXCIsZHVyYXRpb24pO1xyXG4gICAgICAgIGxldCBjb21wYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICAgICAgY29tcGFueSYmdGhpcy5jaGF0Vm9pY2Uuc2V0KFwiY29tcGFueVwiLHtfX3R5cGU6XCJQb2ludGVyXCIsY2xhc3NOYW1lOlwiQ29tcGFueVwiLG9iamVjdElkOmNvbXBhbnl9KTtcclxuICAgICAgICBQYXJzZS5Vc2VyLmN1cnJlbnQoKT8uaWQmJnRoaXMuY2hhdFZvaWNlLnNldChcInVzZXJcIixQYXJzZS5Vc2VyLmN1cnJlbnQoKS50b1BvaW50ZXIoKSk7XHJcblxyXG4gICAgICAgIC8vIOS4iuS8oOmfs+mikeaWh+S7tuW5tuS/neWtmFxyXG4gICAgICAgIGxldCBpZCA9IHRoaXMuY2hhdFZvaWNlPy5pZCB8fCB0aGlzLnVwbG9hZFNlcnY/Lmdlbk1kNSh0aGlzLmNoYXRWb2ljZT8uZ2V0KFwiY29udGVudFwiKXx8dGhpcy5jaGF0Vm9pY2U/LmdldChcInNzbWxcIikpXHJcbiAgICAgICAgbGV0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgbGV0IGZpbGVuYW1lID0gaWQgKyBub3cuZ2V0RnVsbFllYXIoKSsobm93LmdldE1vbnRoKCkrMSkrbm93LmdldERhdGUoKStub3cuZ2V0SG91cnMoKStub3cuZ2V0TWludXRlcygpK25vdy5nZXRTZWNvbmRzKCkgKyBcIi53YXZcIlxyXG4gICAgICAgIGxldCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiAnYXVkaW8vd2F2JyB9KTtcclxuICAgICAgICB0aGlzLnVwbG9hZFNlcnYubWF4U2l6ZSA9IDEwMjQqMTAyNCoxMDI0IC8vIDFH5LiK6ZmQXHJcbiAgICAgICAgbGV0IGZpbGVSZXN1bHQgPSBhd2FpdCB0aGlzLnVwbG9hZFNlcnYudXBsb2FkKGZpbGUsKHJlcyk9PntcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKSAvLyDkuIrkvKDov5vluqbvvIzlj6/ku6XlkIzmraXmm7TmlrDpobXpnaLkuIrkvKDnmb7liIbmr5RcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgYXR0YWNoUG9pbnRlciA9IHtfX3R5cGU6XCJQb2ludGVyXCIsY2xhc3NOYW1lOlwiQXR0YWNobWVudFwiLG9iamVjdElkOmZpbGVSZXN1bHQ/LmlkfVxyXG4gICAgICAgIGlmKGF0dGFjaFBvaW50ZXI/Lm9iamVjdElkKXtcclxuICAgICAgICAgICAgdGhpcy5jaGF0Vm9pY2Uuc2V0KFwidm9pY2VGaWxlXCIsYXR0YWNoUG9pbnRlcilcclxuICAgICAgICAgICAgdGhpcy5jaGF0Vm9pY2UgPSBhd2FpdCB0aGlzLmNoYXRWb2ljZS5zYXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKCl7XHJcblxyXG4gICAgICAvLyDmo4DmtYvnlKjmiLfnmbvlvZXmg4XlhrVcclxuICAgICAgLy8gbGV0IGlzTG9naW5Mb2NrID0gYXdhaXQgdGhpcy5hdXRoU2Vydi5jaGVja0xvZ2luTG9jaygpXHJcbiAgICAgIC8vIGlmKCFpc0xvZ2luTG9jaykgcmV0dXJuIGZhbHNlXHJcbiAgXHJcbiAgICAgIC8vIOajgOa1i+S9memineWPiuaooeWei+S7mOi0uemZkOWItlxyXG4gICAgICAvLyBsZXQgcGF5Q2hlY2sgPSBhd2FpdCB0aGlzLmNoZWNrQmFsYW5jZSgpXHJcbiAgICAgIC8vIGlmKCFwYXlDaGVjaykgcmV0dXJuIGZhbHNlXHJcbiAgXHJcbiAgICAgIC8vIOajgOa1i+eUqOaIt+i+k+WFpeWGheWuueepuuWAvFxyXG4gICAgICBpZighdGhpcy5jaGF0LnVzZXJJbnB1dCl7XHJcbiAgICAgICAgbGV0IHRvYXN0ID0gYXdhaXQgdGhpcy50b2FzdEN0cmwuY3JlYXRlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6YOWGheWuueS4jeiDveS4uuepumAsXHJcbiAgICAgICAgICBwb3NpdGlvbjpcInRvcFwiLFxyXG4gICAgICAgICAgaWNvbjonYWxlcnQnLFxyXG4gICAgICAgICAgY29sb3I6XCJ3YXJuaW5nLWNpcmNsZVwiLFxyXG4gICAgICAgICAgZHVyYXRpb246MTAwMFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdG9hc3QucHJlc2VudCgpO1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIOato+W4uOWPkemAgea2iOaBr1xyXG4gICAgICAvLyB0aGlzLmNoYXQuaXNUYWxrTW9kZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2hhdD8uc2VuZE1lc3NhZ2UoXCJcIit0aGlzLmNoYXQ/LnVzZXJJbnB1dCx0aGlzLmNoYXQ/LnVzZXJJbWFnZSwobXNnOmFueSk9PntcclxuICAgICAgICBcclxuICAgICAgfSx7XHJcbiAgICAgICAgb25TU01MQ29tcGxldGU6KHZvaWNlOmFueSk9PntcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHZvaWNlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSx7aWQ6dGhpcy5jaGF0Vm9pY2U/LmlkLGR1cmF0aW9uOnRoaXMuY2hhdFZvaWNlPy5nZXQoXCJkdXJhdGlvblwiKX0pO1xyXG4gICAgfVxyXG5cclxuICAvKipcclxuICAgKiDorqHml7blmahcclxuICAgKi9cclxuICBkdXJhdGlvblN0cjpzdHJpbmcgPSBcIjA6MDBcIlxyXG5cclxuICAvKipcclxuICAgKiDmk43kvZzljLpcclxuICAgKi9cclxuICBjYW5jZWwoKXtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIHRoaXMudm9pY2VTZXJ2LmNhbmNlbFRhbGsoKTtcclxuICAgIHRoaXMubW9kYWw/LmRpc21pc3MobnVsbCxcImNhbmNlbFwiKVxyXG4gIH1cclxuICBzZW5kKCl7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnZvaWNlU2Vydi5maW5pc2hUYWxrKCk7XHJcbiAgICB0aGlzLm1vZGFsPy5kaXNtaXNzKG51bGwsXCJzZW5kXCIpXHJcbiAgfVxyXG4gIGNsZWFyKCl7XHJcbiAgICB0aGlzLm5vdyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIiwiPCEtLSA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDojRkZGRkZGO2NvbG9yOiMwMDAwMDA7d2lkdGg6MTAwJVwiPlxyXG4gICAge3t0aGlzLmNoYXQudXNlcklucHV0fX1cclxuPC9kaXY+IC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWwtYXJlYVwiPlxyXG5cclxuICAgIDwhLS0g5Yqg6L29V2ViU29ja2V0c+WKqOeUuyAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNSZWNvcmRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIiBjb2xvcj1cInN1Y2Nlc3NcIiBzdHlsZT1cIndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7XCI+PC9pb24tc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSDlvZXpn7PkuK3liqjnlLsgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNSZWNvcmRpbmdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSDlj5bmtoggLS0+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsKClcIiBzaXplPVwibGFyZ2VcIiBzaGFwZT1cInJvdW5kXCIgY29sb3I9XCJsaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2Utb3V0bGluZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8IS0tIOmfs+mikSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdWRpby1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lciByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tkdXJhdGlvblN0ciB8fCBcIjAwOjAwXCJ9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdWRpby13YXZlIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXVkaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhdmVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSDlj5HpgIEgLS0+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwic2VuZCgpXCIgc2l6ZT1cImxhcmdlXCIgc2hhcGU9XCJyb3VuZFwiIGNvbG9yPVwic3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic2VuZC1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGlwcyByb3dcIj5cclxuICAgICAgICAgICAgICAgIOivt+aCqOiusuivne+8jEFJ5Lya6K+G5Yir77yBXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==
|
|
8
|
+
import{Component,Input}from"@angular/core";import{IonButton,IonIcon,IonSpinner,ModalController,Platform,ToastController}from"@ionic/angular/standalone";import{FmodeVoiceService}from"../../../voice/fmode-voice.service";import{FmodeChat}from"../../../service-fmai/service-chat";import{CommonModule}from"@angular/common";import{NovaUploadService}from"../../../../storage/service-upload/nova-upload.service";import{FmodeParse}from"@fmode/parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular/standalone";import*as i2 from"../../../../storage/service-upload/nova-upload.service";import*as i3 from"@awesome-cordova-plugins/diagnostic/ngx";import*as i4 from"@angular/common";const Parse=FmodeParse.with("nova");export class ModalAudioMessageComponent{constructor(e,i,t,n){this.toastCtrl=e,this.uploadServ=i,this.platform=t,this.diagnostic=n,this.isRecording=!1,this.player=new Audio,this.durationStr="0:00",this.voiceServ=new FmodeVoiceService(this.platform,this.diagnostic)}ngOnInit(){this.chat.userInput="",this.initVoiceSevice(),this.voiceServ.startTalk()}playMusic(e){this.player||(this.player=new Audio),this.player.src=`/assets/avatar/voice/${e}.mp3`;try{this.player?.play()}catch(e){}}initVoiceSevice(){this.chat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.chat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onAfterRecordStart=()=>{this.isRecording=!0},this.voiceServ.onDurationStrChange=e=>{this.durationStr=e},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.chat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{},this.voiceServ.onBeforeFinishTalk=()=>{this.chat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=async()=>{console.log("onAfterFinishTalk1",this.voiceServ?.resultText),console.log("onAfterFinishTalk2",this.voiceServ?.resultTextTemp),this.chat.userInput=""+(this.voiceServ?.resultTextTemp||this.voiceServ?.resultText),this.chat?.userInput&&await this.saveChatVoice(),this.sendMessage()}}async saveChatVoice(){let e=this.voiceServ.recordWavBlob,i=this.voiceServ.recordDuration;if(e){let t=Parse.Object.extend("ChatVoice");this.chatVoice=new t,this.chatVoice.set("content",this.chat.userInput),this.chatVoice.set("role","user"),this.chatVoice.set("duration",i);let n=localStorage.getItem("company");n&&this.chatVoice.set("company",{__type:"Pointer",className:"Company",objectId:n}),Parse.User.current()?.id&&this.chatVoice.set("user",Parse.User.current().toPointer());let o=this.chatVoice?.id||this.uploadServ?.genMd5(this.chatVoice?.get("content")||this.chatVoice?.get("ssml")),a=new Date,s=o+a.getFullYear()+(a.getMonth()+1)+a.getDate()+a.getHours()+a.getMinutes()+a.getSeconds()+".wav",r=new File([e],s,{type:"audio/wav"});this.uploadServ.maxSize=1073741824;let c=await this.uploadServ.upload(r,(e=>{console.log(e)})),d={__type:"Pointer",className:"Attachment",objectId:c?.id};d?.objectId&&(this.chatVoice.set("voiceFile",d),this.chatVoice=await this.chatVoice.save())}}async sendMessage(){if(this.chat.userInput)this.chat?.sendMessage(""+this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}},{id:this.chatVoice?.id,duration:this.chatVoice?.get("duration")});else{(await this.toastCtrl.create({message:"内容不能为空",position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}}cancel(){this.clear(),this.voiceServ.cancelTalk(),this.modal?.dismiss(null,"cancel")}send(){this.clear(),this.voiceServ.finishTalk(),this.modal?.dismiss(null,"send")}clear(){this.now=void 0,this.isRecording=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,deps:[{token:i1.ToastController},{token:i2.NovaUploadService},{token:i1.Platform},{token:i3.Diagnostic}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalAudioMessageComponent,isStandalone:!0,selector:"fm-modal-audio-message",inputs:{chat:"chat",modal:"modal"},providers:[ModalController],ngImport:i0,template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i4.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonSpinner,selector:"ion-spinner",inputs:["color","duration","name","paused"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,decorators:[{type:Component,args:[{selector:"fm-modal-audio-message",standalone:!0,imports:[CommonModule,IonButton,IonIcon,IonSpinner],providers:[ModalController],template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"]}]}],ctorParameters:()=>[{type:i1.ToastController},{type:i2.NovaUploadService},{type:i1.Platform},{type:i3.Diagnostic}],propDecorators:{chat:[{type:Input}],modal:[{type:Input}]}});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1tb2RhbC1pbnB1dC9tb2RhbC1hdWRpby1tZXNzYWdlL21vZGFsLWF1ZGlvLW1lc3NhZ2UuY29tcG9uZW50Lm1qcw==`
|
|
10
|
+
|