stream-chat-angular 4.66.1 → 5.0.0-v5.2
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/assets/version.d.ts +1 -1
- package/{esm2015/assets/version.js → esm2020/assets/version.mjs} +2 -2
- package/esm2020/lib/attachment-configuration.service.mjs +185 -0
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +205 -0
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +45 -0
- package/esm2020/lib/attachment.service.mjs +262 -0
- package/esm2020/lib/avatar/avatar.component.mjs +163 -0
- package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +74 -0
- package/esm2020/lib/channel/channel.component.mjs +46 -0
- package/esm2020/lib/channel-header/channel-header.component.mjs +79 -0
- package/esm2020/lib/channel-list/channel-list-toggle.service.mjs +72 -0
- package/esm2020/lib/channel-list/channel-list.component.mjs +60 -0
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
- package/esm2020/lib/channel.service.mjs +1460 -0
- package/esm2020/lib/chat-client.service.mjs +206 -0
- package/{esm2015/lib/custom-templates.service.js → esm2020/lib/custom-templates.service.mjs} +3 -3
- package/{esm2015/lib/date-parser.service.js → esm2020/lib/date-parser.service.mjs} +3 -3
- package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +83 -0
- package/esm2020/lib/get-channel-display-text.mjs +14 -0
- package/esm2020/lib/get-message-translation.mjs +12 -0
- package/esm2020/lib/icon/icon.component.mjs +21 -0
- package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +31 -0
- package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +31 -0
- package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +38 -0
- package/esm2020/lib/message/message.component.mjs +418 -0
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +130 -0
- package/esm2020/lib/message-actions.service.mjs +119 -0
- package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +262 -0
- package/{esm2015/lib/message-input/emoji-input.service.js → esm2020/lib/message-input/emoji-input.service.mjs} +3 -3
- package/{esm2015/lib/message-input/message-input-config.service.js → esm2020/lib/message-input/message-input-config.service.mjs} +3 -3
- package/esm2020/lib/message-input/message-input.component.mjs +443 -0
- package/{esm2015/lib/message-input/textarea/textarea.component.js → esm2020/lib/message-input/textarea/textarea.component.mjs} +5 -9
- package/esm2020/lib/message-input/textarea.directive.mjs +89 -0
- package/esm2020/lib/message-list/group-styles.mjs +52 -0
- package/{esm2015/lib/message-list/image-load.service.js → esm2020/lib/message-list/image-load.service.mjs} +3 -3
- package/esm2020/lib/message-list/message-list.component.mjs +699 -0
- package/esm2020/lib/message-preview.mjs +21 -0
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +252 -0
- package/{esm2015/lib/message-reactions.service.js → esm2020/lib/message-reactions.service.mjs} +3 -3
- package/{esm2015/lib/message.service.js → esm2020/lib/message.service.mjs} +4 -4
- package/esm2020/lib/modal/modal.component.mjs +69 -0
- package/esm2020/lib/notification/notification.component.mjs +20 -0
- package/esm2020/lib/notification-list/notification-list.component.mjs +37 -0
- package/esm2020/lib/notification.service.mjs +79 -0
- package/esm2020/lib/read-by.mjs +12 -0
- package/{esm2015/lib/stream-autocomplete-textarea.module.js → esm2020/lib/stream-autocomplete-textarea.module.mjs} +6 -6
- package/{esm2015/lib/stream-avatar.module.js → esm2020/lib/stream-avatar.module.mjs} +5 -5
- package/{esm2015/lib/stream-chat.module.js → esm2020/lib/stream-chat.module.mjs} +14 -16
- package/{esm2015/lib/stream-i18n.service.js → esm2020/lib/stream-i18n.service.mjs} +5 -5
- package/{esm2015/lib/stream-textarea.module.js → esm2020/lib/stream-textarea.module.mjs} +6 -6
- package/esm2020/lib/theme.service.mjs +123 -0
- package/esm2020/lib/thread/thread.component.mjs +51 -0
- package/{esm2015/lib/transliteration.service.js → esm2020/lib/transliteration.service.mjs} +3 -3
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +183 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +102 -0
- package/fesm2015/{stream-chat-angular.js → stream-chat-angular.mjs} +313 -426
- package/fesm2015/stream-chat-angular.mjs.map +1 -0
- package/fesm2020/stream-chat-angular.mjs +7123 -0
- package/fesm2020/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-list/attachment-list.component.d.ts +3 -3
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/attachment.service.d.ts +0 -1
- package/lib/avatar/avatar.component.d.ts +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
- package/lib/channel/channel.component.d.ts +1 -1
- package/lib/channel-header/channel-header.component.d.ts +1 -1
- package/lib/channel-list/channel-list-toggle.service.d.ts +0 -1
- package/lib/channel-list/channel-list.component.d.ts +1 -1
- package/lib/channel-preview/channel-preview.component.d.ts +1 -1
- package/lib/channel.service.d.ts +7 -7
- package/lib/chat-client.service.d.ts +1 -1
- package/lib/edit-message-form/edit-message-form.component.d.ts +1 -1
- package/lib/get-message-translation.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -1
- package/lib/loading-indicator/loading-indicator.component.d.ts +1 -1
- package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/message/message.component.d.ts +3 -7
- package/lib/message-actions-box/message-actions-box.component.d.ts +2 -4
- package/lib/message-actions.service.d.ts +0 -1
- package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
- package/lib/message-input/message-input.component.d.ts +2 -2
- package/lib/message-input/textarea/textarea.component.d.ts +1 -1
- package/lib/message-input/textarea.directive.d.ts +1 -1
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +4 -5
- package/lib/message-reactions/message-reactions.component.d.ts +1 -4
- package/lib/message.service.d.ts +0 -1
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/notification-list/notification-list.component.d.ts +2 -2
- package/lib/notification.service.d.ts +2 -5
- package/lib/stream-chat.module.d.ts +3 -3
- package/lib/theme.service.d.ts +1 -2
- package/lib/thread/thread.component.d.ts +1 -1
- package/lib/types.d.ts +18 -18
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording.component.d.ts +1 -1
- package/package.json +31 -17
- package/src/assets/styles/v2/css/index.css +1 -1
- package/src/assets/styles/v2/css/index.layout.css +1 -1
- package/src/assets/styles/v2/scss/_base.scss +2 -2
- package/src/assets/version.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +0 -8445
- package/bundles/stream-chat-angular.umd.js.map +0 -1
- package/esm2015/lib/attachment-configuration.service.js +0 -186
- package/esm2015/lib/attachment-list/attachment-list.component.js +0 -209
- package/esm2015/lib/attachment-preview-list/attachment-preview-list.component.js +0 -49
- package/esm2015/lib/attachment.service.js +0 -276
- package/esm2015/lib/avatar/avatar.component.js +0 -172
- package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +0 -78
- package/esm2015/lib/channel/channel.component.js +0 -50
- package/esm2015/lib/channel-header/channel-header.component.js +0 -86
- package/esm2015/lib/channel-list/channel-list-toggle.service.js +0 -73
- package/esm2015/lib/channel-list/channel-list.component.js +0 -67
- package/esm2015/lib/channel-preview/channel-preview.component.js +0 -167
- package/esm2015/lib/channel.service.js +0 -1487
- package/esm2015/lib/chat-client.service.js +0 -211
- package/esm2015/lib/edit-message-form/edit-message-form.component.js +0 -87
- package/esm2015/lib/get-channel-display-text.js +0 -15
- package/esm2015/lib/get-message-translation.js +0 -13
- package/esm2015/lib/icon/icon.component.js +0 -25
- package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +0 -35
- package/esm2015/lib/loading-indicator/loading-indicator.component.js +0 -35
- package/esm2015/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.js +0 -42
- package/esm2015/lib/message/message.component.js +0 -436
- package/esm2015/lib/message-actions-box/message-actions-box.component.js +0 -137
- package/esm2015/lib/message-actions.service.js +0 -114
- package/esm2015/lib/message-bounce-prompt/message-bounce-prompt.component.js +0 -80
- package/esm2015/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.js +0 -262
- package/esm2015/lib/message-input/message-input.component.js +0 -455
- package/esm2015/lib/message-input/textarea.directive.js +0 -90
- package/esm2015/lib/message-list/group-styles.js +0 -53
- package/esm2015/lib/message-list/message-list.component.js +0 -726
- package/esm2015/lib/message-preview.js +0 -7
- package/esm2015/lib/message-reactions/message-reactions.component.js +0 -266
- package/esm2015/lib/modal/modal.component.js +0 -74
- package/esm2015/lib/notification/notification.component.js +0 -24
- package/esm2015/lib/notification-list/notification-list.component.js +0 -38
- package/esm2015/lib/notification.service.js +0 -79
- package/esm2015/lib/read-by.js +0 -13
- package/esm2015/lib/theme.service.js +0 -122
- package/esm2015/lib/thread/thread.component.js +0 -55
- package/esm2015/lib/types.js +0 -2
- package/esm2015/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.js +0 -192
- package/esm2015/lib/voice-recording/voice-recording.component.js +0 -115
- package/fesm2015/stream-chat-angular.js.map +0 -1
- /package/{esm2015/assets/i18n/en.js → esm2020/assets/i18n/en.mjs} +0 -0
- /package/{esm2015/lib/injection-tokens.js → esm2020/lib/injection-tokens.mjs} +0 -0
- /package/{esm2015/lib/is-image-attachment.js → esm2020/lib/is-image-attachment.mjs} +0 -0
- /package/{esm2015/lib/is-image-file.js → esm2020/lib/is-image-file.mjs} +0 -0
- /package/{esm2015/lib/is-on-separate-date.js → esm2020/lib/is-on-separate-date.mjs} +0 -0
- /package/{esm2015/lib/list-users.js → esm2020/lib/list-users.mjs} +0 -0
- /package/{esm2015/lib/message-input/textarea.interface.js → esm2020/lib/message-input/textarea.interface.mjs} +0 -0
- /package/{esm2015/lib/parse-date.js → esm2020/lib/parse-date.mjs} +0 -0
- /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- /package/{esm2015/stream-chat-angular.js → esm2020/stream-chat-angular.mjs} +0 -0
- /package/{stream-chat-angular.d.ts → index.d.ts} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIENoYW5uZWxGaWx0ZXJzLFxuICBDaGFubmVsTWVtYmVyUmVzcG9uc2UsXG4gIENvbW1hbmRSZXNwb25zZSxcbiAgRXZlbnQsXG4gIEV4dGVuZGFibGVHZW5lcmljcyxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBMaXRlcmFsU3RyaW5nRm9yVW5pb24sXG4gIE1lc3NhZ2VSZXNwb25zZUJhc2UsXG4gIE11dGUsXG4gIFJlYWN0aW9uUmVzcG9uc2UsXG4gIFVzZXIsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuL2F0dGFjaG1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJY29uIH0gZnJvbSAnLi9pY29uL2ljb24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgVW5rbm93blR5cGUgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tVHJpZ2dlciA9IHtcbiAgW2tleTogc3RyaW5nXToge1xuICAgIGNvbXBvbmVudFByb3BzOiBVbmtub3duVHlwZTtcbiAgICBkYXRhOiBVbmtub3duVHlwZTtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBFeHRlbmRhYmxlR2VuZXJpY3MgJiB7XG4gIGF0dGFjaG1lbnRUeXBlOiBEZWZhdWx0QXR0YWNobWVudFR5cGU7XG4gIGNoYW5uZWxUeXBlOiBEZWZhdWx0Q2hhbm5lbFR5cGU7XG4gIGNvbW1hbmRUeXBlOiBMaXRlcmFsU3RyaW5nRm9yVW5pb247XG4gIGV2ZW50VHlwZTogVW5rbm93blR5cGU7XG4gIG1lc3NhZ2VUeXBlOiBEZWZhdWx0TWVzc2FnZVR5cGU7XG4gIHJlYWN0aW9uVHlwZTogVW5rbm93blR5cGU7XG4gIHVzZXJUeXBlOiBEZWZhdWx0VXNlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0QXR0YWNobWVudFR5cGUgPSBVbmtub3duVHlwZSAmIHtcbiAgYXNzZXRfdXJsPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaW1hZ2VzPzogQXJyYXk8QXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPj47XG4gIG1pbWVfdHlwZT86IHN0cmluZztcbiAgaXNDdXN0b21BdHRhY2htZW50PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRDaGFubmVsVHlwZSA9IFVua25vd25UeXBlICYge1xuICBpbWFnZT86IHN0cmluZztcbiAgbWVtYmVyX2NvdW50PzogbnVtYmVyO1xuICBzdWJ0aXRsZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRDb21tYW5kVHlwZSA9IExpdGVyYWxTdHJpbmdGb3JVbmlvbjtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdE1lc3NhZ2VUeXBlID0gVW5rbm93blR5cGUgJiB7XG4gIGN1c3RvbVR5cGU/OiAnY2hhbm5lbC5pbnRybycgfCAnbWVzc2FnZS5kYXRlJztcbiAgZGF0ZT86IHN0cmluZyB8IERhdGU7XG4gIGVycm9yU3RhdHVzQ29kZT86IG51bWJlcjtcbiAgZXZlbnQ/OiBFdmVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbiAgdW5yZWFkPzogYm9vbGVhbjtcbiAgcmVhZEJ5OiBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXTtcbiAgdHJhbnNsYXRpb24/OiBzdHJpbmc7XG4gIHF1b3RlZF9tZXNzYWdlPzogTWVzc2FnZVJlc3BvbnNlQmFzZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRVc2VyVHlwZUludGVybmFsID0ge1xuICBpbWFnZT86IHN0cmluZztcbiAgc3RhdHVzPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFVzZXJUeXBlID0gVW5rbm93blR5cGUgJlxuICBEZWZhdWx0VXNlclR5cGVJbnRlcm5hbCAmIHtcbiAgICBtdXRlcz86IEFycmF5PE11dGU8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBTdHJlYW1NZXNzYWdlPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSBGb3JtYXRNZXNzYWdlUmVzcG9uc2U8VD47XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRVcGxvYWRFcnJvclJlYXNvbiA9XG4gIHwgJ2ZpbGUtc2l6ZSdcbiAgfCAnZmlsZS1leHRlbnNpb24nXG4gIHwgJ3Vua25vd24nO1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50VXBsb2FkPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIGZpbGU6IEZpbGU7XG4gIHN0YXRlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnIHwgJ3VwbG9hZGluZyc7XG4gIGVycm9yUmVhc29uPzogQXR0YWNobWVudFVwbG9hZEVycm9yUmVhc29uO1xuICBlcnJvckV4dHJhSW5mbz86IHsgcGFyYW06IHN0cmluZyB9W107XG4gIHVybD86IHN0cmluZztcbiAgdHlwZTogJ2ltYWdlJyB8ICdmaWxlJyB8ICd2aWRlbyc7XG4gIHByZXZpZXdVcmk/OiBzdHJpbmcgfCBBcnJheUJ1ZmZlcjtcbiAgdGh1bWJfdXJsPzogc3RyaW5nO1xuICBmcm9tQXR0YWNobWVudD86IEF0dGFjaG1lbnQ8VD47XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbUNvbnRleHQgPSB7XG4gIGl0ZW06IE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tbWFuZEF1dG9jb21wbGV0ZUxpc3RJdGVtQ29udGV4dCA9IHtcbiAgaXRlbTogQ29tYW5kQXV0b2NvbXBsZXRlTGlzdEl0ZW07XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbSA9IChcbiAgfCBDaGFubmVsTWVtYmVyUmVzcG9uc2VcbiAgfCBVc2VyUmVzcG9uc2VcbikgJiB7XG4gIGF1dG9jb21wbGV0ZUxhYmVsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb21hbmRBdXRvY29tcGxldGVMaXN0SXRlbSA9IENvbW1hbmRSZXNwb25zZSAmIHtcbiAgYXV0b2NvbXBsZXRlTGFiZWw6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25QYXlsb2FkPFQgPSBvYmplY3Q+ID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0cmFuc2xhdGVQYXJhbXM/OiBvYmplY3Q7XG4gIHRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VD47XG4gIHRlbXBsYXRlQ29udGV4dD86IFQ7XG4gIGRpc21pc3NGbjogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxQcmV2aWV3Q29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICBjaGFubmVsOiBDaGFubmVsPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbm5lbFByZXZpZXdJbmZvQ29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gQ2hhbm5lbFByZXZpZXdDb250ZXh0ICYge1xuICBsYXRlc3RNZXNzYWdlPzogU3RyZWFtTWVzc2FnZTxUPjtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBsYXRlc3QgbWVzc2FnZSwgb3Igc29tZSBtZXRhIGluZm9ybWF0aW9uIChmb3IgZXhhbXBsZTogXCJOb3RoaW5nIHlldFwiKVxuICAgKi9cbiAgbGF0ZXN0TWVzc2FnZVRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgY2hhbm5lbCwgb3IgdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgbWVtYmVyc1xuICAgKi9cbiAgY2hhbm5lbERpc3BsYXlUaXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBtZXNzYWdlIChvbmx5IGF2YWlsYWJsZSBpZiB0aGUgbGFzdCBtZXNzYWdlIHdhcyBzZW50IGJ5IHRoZSBjdXJyZW50IHVzZXIpXG4gICAqL1xuICBsYXRlc3RNZXNzYWdlU3RhdHVzPzogJ2RlbGl2ZXJlZCcgfCAncmVhZCc7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBvZiB0aGUgbGFzdCBtZXNzYWdlIChmb3JtYXR0ZWQgdG8gYSB1c2VyLWZyaWVuZGx5IHN0cmluZylcbiAgICovXG4gIGxhdGVzdE1lc3NhZ2VUaW1lPzogc3RyaW5nO1xuICB1bnJlYWRDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUlucHV0Q29udGV4dCA9IHtcbiAgaXNGaWxlVXBsb2FkRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgYXJlTWVudGlvbnNFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBtZW50aW9uU2NvcGU6ICdjaGFubmVsJyB8ICdhcHBsaWNhdGlvbicgfCB1bmRlZmluZWQ7XG4gIG1vZGU6ICd0aHJlYWQnIHwgJ21haW4nIHwgdW5kZWZpbmVkO1xuICBpc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIG1lc3NhZ2VVcGRhdGVIYW5kbGVyOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBzZW5kTWVzc2FnZSQ6IE9ic2VydmFibGU8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uVGVtcGxhdGVDb250ZXh0ID0ge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHVzZXI6IFVzZXJSZXNwb25zZTtcbn07XG5cbmV4cG9ydCB0eXBlIEVtb2ppUGlja2VyQ29udGV4dCA9IHtcbiAgZW1vamlJbnB1dCQ6IFN1YmplY3Q8c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFR5cGluZ0luZGljYXRvckNvbnRleHQgPSB7XG4gIHVzZXJzVHlwaW5nJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXT47XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQ29udGV4dCA9IHtcbiAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBzdHJpbmdbXTtcbiAgaXNMYXN0U2VudE1lc3NhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIG1vZGU6ICd0aHJlYWQnIHwgJ21haW4nO1xuICBpc0hpZ2hsaWdodGVkOiBib29sZWFuO1xuICBjdXN0b21BY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbm5lbEFjdGlvbnNDb250ZXh0PFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7IGNoYW5uZWw6IENoYW5uZWw8VD4gfTtcblxuZXhwb3J0IHR5cGUgQXR0YWNobWVudExpc3RDb250ZXh0ID0ge1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnQ8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXTtcbiAgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nO1xuICBpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPzogKHN0YXRlOiAnb3BlbmVkJyB8ICdjbG9zZWQnKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgQXZhdGFyVHlwZSA9ICdjaGFubmVsJyB8ICd1c2VyJztcblxuZXhwb3J0IHR5cGUgQXZhdGFyTG9jYXRpb24gPVxuICB8ICdjaGFubmVsLXByZXZpZXcnXG4gIHwgJ2NoYW5uZWwtaGVhZGVyJ1xuICB8ICdtZXNzYWdlLXNlbmRlcidcbiAgfCAnbWVzc2FnZS1yZWFkZXInXG4gIHwgJ3F1b3RlZC1tZXNzYWdlLXNlbmRlcidcbiAgfCAnYXV0b2NvbXBsZXRlLWl0ZW0nXG4gIHwgJ3R5cGluZy1pbmRpY2F0b3InXG4gIHwgJ3JlYWN0aW9uJztcblxuZXhwb3J0IHR5cGUgQXZhdGFyQ29udGV4dCA9IHtcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpbWFnZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHR5cGU6IEF2YXRhclR5cGUgfCB1bmRlZmluZWQ7XG4gIGxvY2F0aW9uOiBBdmF0YXJMb2NhdGlvbiB8IHVuZGVmaW5lZDtcbiAgY2hhbm5lbD86IENoYW5uZWw8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz47XG4gIHVzZXI/OiBVc2VyPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICBpbml0aWFsc1R5cGU/OiAnZmlyc3QtbGV0dGVyLW9mLWZpcnN0LXdvcmQnIHwgJ2ZpcnN0LWxldHRlci1vZi1lYWNoLXdvcmQnO1xuICBzaG93T25saW5lSW5kaWNhdG9yPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRQcmV2aWV3TGlzdENvbnRleHQgPSB7XG4gIGF0dGFjaG1lbnRVcGxvYWRzJDogT2JzZXJ2YWJsZTxBdHRhY2htZW50VXBsb2FkW10+IHwgdW5kZWZpbmVkO1xuICByZXRyeVVwbG9hZEhhbmRsZXI6IChmOiBGaWxlKSA9PiB2b2lkO1xuICBkZWxldGVVcGxvYWRIYW5kbGVyOiAodTogQXR0YWNobWVudFVwbG9hZCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIEljb25Db250ZXh0ID0ge1xuICBpY29uOiBJY29uIHwgdW5kZWZpbmVkO1xuICBzaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBMb2FkaW5nSW5kaWNhdG9yQ29udGV4dCA9IHtcbiAgc2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb2xvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0ID0ge1xuICBpc09wZW46IGJvb2xlYW47XG4gIGlzTWluZTogYm9vbGVhbjtcbiAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgZW5hYmxlZEFjdGlvbnM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBgbWVzc2FnZVJlYWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyRgXG4gICAqXG4gICAqIE1vcmUgaW5mb3JtYXRpb246IGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlQWN0aW9uc1NlcnZpY2VcbiAgICovXG4gIGN1c3RvbUFjdGlvbnM6IEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtW107XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBiZWNhdXNlIHRoZSBuYW1lIGNvbnRhaW5zIHR5cG9zLCB1c2UgdGhlIGBkaXNwbGF5ZWRBY3Rpb25zQ291bnRDaGFuZ2VIYW5kbGVyYCBpbnN0ZWFkXG4gICAqL1xuICBkaXNwbGF5ZWRBY3Rpb25zQ291bnRDaGFuZUhhbmxlcjogKGNvdW50OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBjb21wb25lbnRzIHNob3VsZCB1c2UgYG1lc3NhZ2VSZWFjdGlvbnNTZXJ2aWNlLmdldEF1dGhvcml6ZWRNZXNzYWdlQWN0aW9uc0NvdW50YCBtZXRob2RcbiAgICpcbiAgICogTW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VBY3Rpb25zU2VydmljZVxuICAgKi9cbiAgZGlzcGxheWVkQWN0aW9uc0NvdW50Q2hhbmdlSGFuZGxlcjogKGNvdW50OiBudW1iZXIpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uQm94SXRlbUNvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXk6ICgobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPikgPT4gc3RyaW5nKSB8IHN0cmluZztcbiAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPjtcbiAgaXNNaW5lOiBib29sZWFuO1xuICBhY3Rpb25IYW5kbGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPiwgaXNNaW5lOiBib29sZWFuKSA9PiB2b2lkO1xufTtcblxudHlwZSBNZXNzYWdlQWN0aW9uSXRlbUJhc2U8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAoKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4pID0+IHN0cmluZykgfCBzdHJpbmc7XG4gIGlzVmlzaWJsZTogKFxuICAgIGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBpc01pbmU6IGJvb2xlYW4sXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPlxuICApID0+IGJvb2xlYW47XG4gIGFjdGlvbkhhbmRsZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+LCBpc01pbmU6IGJvb2xlYW4pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uSXRlbTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gTWVzc2FnZUFjdGlvbkl0ZW1CYXNlPFQ+ICYge1xuICBhY3Rpb25OYW1lOiAncXVvdGUnIHwgJ3BpbicgfCAnZmxhZycgfCAnZWRpdCcgfCAnZGVsZXRlJyB8ICdtYXJrLXVucmVhZCc7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gTWVzc2FnZUFjdGlvbkl0ZW1CYXNlPFQ+ICYge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCA9IHtcbiAgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1lc3NhZ2VSZWFjdGlvbkNvdW50czogeyBba2V5IGluIE1lc3NhZ2VSZWFjdGlvblR5cGVdPzogbnVtYmVyIH07XG4gIGlzU2VsZWN0b3JPcGVuOiBib29sZWFuO1xuICBsYXRlc3RSZWFjdGlvbnM6IFJlYWN0aW9uUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXTtcbiAgb3duUmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W107XG4gIGlzU2VsZWN0b3JPcGVuQ2hhbmdlSGFuZGxlcjogKGlzT3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGFsQ29udGV4dCA9IHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBpc09wZW5DaGFuZ2VIYW5kbGVyOiAoaXNPcGVuOiBib29sZWFuKSA9PiB2b2lkO1xuICBjb250ZW50OiBUZW1wbGF0ZVJlZjx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbkNvbnRleHQgPSB7XG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgfCB1bmRlZmluZWQ7XG4gIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgVGhyZWFkSGVhZGVyQ29udGV4dCA9IHtcbiAgcGFyZW50TWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgY2xvc2VUaHJlYWRIYW5kbGVyOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVJlYWN0aW9uVHlwZSA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgQXR0YWNobWVudENvbmZpZ3JhdGlvbiA9IHtcbiAgdXJsOiBzdHJpbmc7XG4gIGhlaWdodDogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiA9IEF0dGFjaG1lbnRDb25maWdyYXRpb24gJiB7XG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXI7XG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24gPSBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uICYge1xuICB0aHVtYlVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlbGl2ZXJlZFN0YXR1c0NvbnRleHQgPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U7XG59O1xuXG5leHBvcnQgdHlwZSBTZW5kaW5nU3RhdHVzQ29udGV4dCA9IHtcbiAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTtcbn07XG5cbmV4cG9ydCB0eXBlIEN1c3RvbU1ldGFkYXRhQ29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgUmVhZFN0YXR1c0NvbnRleHQgPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U7XG4gIHJlYWRCeVRleHQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxIZWFkZXJJbmZvQ29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0geyBjaGFubmVsOiBDaGFubmVsPFQ+IH07XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUF0dGFjaG1lbnRVcGxvYWRDb250ZXh0ID0ge1xuICBpc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGF0dGFjaG1lbnRTZXJ2aWNlOiBBdHRhY2htZW50U2VydmljZTtcbn07XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRDb250ZXh0ID0ge1xuICBhdHRhY2htZW50OiBBdHRhY2htZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xufTtcblxuZXhwb3J0IHR5cGUgU3lzdGVtTWVzc2FnZUNvbnRleHQgPSBNZXNzYWdlQ29udGV4dCAmIHtcbiAgcGFyc2VkRGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0ZVNlcGFyYXRvckNvbnRleHQgPSB7XG4gIGRhdGU6IERhdGU7XG4gIHBhcnNlZERhdGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFVucmVhZE1lc3NhZ2VzSW5kaWNhdG9yQ29udGV4dCA9IHtcbiAgdW5yZWFkQ291bnQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFVucmVhZE1lc3NhZ2VzTm90aWZpY2F0aW9uQ29udGV4dCA9XG4gIFVucmVhZE1lc3NhZ2VzSW5kaWNhdG9yQ29udGV4dCAmIHtcbiAgICBvbkp1bXA6ICgpID0+IHZvaWQ7XG4gICAgb25EaXNtaXNzOiAoKSA9PiB2b2lkO1xuICB9O1xuXG5leHBvcnQgdHlwZSBDaGFubmVsUXVlcnlTdGF0ZSA9IHtcbiAgc3RhdGU6ICdpbi1wcm9ncmVzcycgfCAnc3VjY2VzcycgfCAnZXJyb3InO1xuICAvLyBObyB0eXBlIGRlZiBmcm9tIHN0cmVhbS1jaGF0XG4gIGVycm9yPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VJbnB1dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PFQ+W107XG4gIG1lbnRpb25lZFVzZXJzOiBVc2VyUmVzcG9uc2U8VD5bXTtcbiAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcXVvdGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGE6IHVuZGVmaW5lZCB8IFBhcnRpYWw8VFsnbWVzc2FnZVR5cGUnXT47XG59O1xuXG5leHBvcnQgdHlwZSBPZmZzZXROZXh0UGFnZUNvbmZpZ3VyYXRpb24gPSB7XG4gIHR5cGU6ICdvZmZzZXQnO1xuICBvZmZzZXQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlcnROZXh0UGFnZUNvbmZpZ3VyYXRpb248XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgdHlwZTogJ2ZpbHRlcic7XG4gIHBhZ2luYXRpb25GaWx0ZXI6IENoYW5uZWxGaWx0ZXJzPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgTmV4dFBhZ2VDb25maWd1cmF0aW9uID1cbiAgfCBPZmZzZXROZXh0UGFnZUNvbmZpZ3VyYXRpb25cbiAgfCBGaWx0ZXJ0TmV4dFBhZ2VDb25maWd1cmF0aW9uO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlUmVhY3Rpb25DbGlja0RldGFpbHMgPSB7XG4gIG1lc3NhZ2VJZDogc3RyaW5nO1xuICByZWFjdGlvblR5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VBY3Rpb25zQ2xpY2tEZXRhaWxzPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD47XG4gIGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXTtcbiAgaXNNaW5lOiBib29sZWFuO1xuICBjdXN0b21BY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdO1xufTtcblxuZXhwb3J0IHR5cGUgR3JvdXBTdHlsZU9wdGlvbnMgPSB7XG4gIG5vR3JvdXBCeVVzZXI/OiBib29sZWFuO1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgbm9Hcm91cEJ5UmVhZFN0YXRlPzogYm9vbGVhbjtcbn07XG4iXX0=
|
package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
/**
|
|
5
|
+
* This component can be used to visualize the wave bar of a voice recording
|
|
6
|
+
*/
|
|
7
|
+
export class VoiceRecordingWavebarComponent {
|
|
8
|
+
constructor(ngZone, cdRef) {
|
|
9
|
+
this.ngZone = ngZone;
|
|
10
|
+
this.cdRef = cdRef;
|
|
11
|
+
/**
|
|
12
|
+
* The waveform data to visualize
|
|
13
|
+
*/
|
|
14
|
+
this.waveFormData = [];
|
|
15
|
+
this.resampledWaveFormData = [];
|
|
16
|
+
this.progress = 0;
|
|
17
|
+
this.isDragging = false;
|
|
18
|
+
this.sampleSize = 40;
|
|
19
|
+
this.isViewInited = false;
|
|
20
|
+
this.upsample = () => {
|
|
21
|
+
if (this.sampleSize === this.waveFormData.length)
|
|
22
|
+
return this.waveFormData;
|
|
23
|
+
// eslint-disable-next-line prefer-const
|
|
24
|
+
let [bucketSize, remainder] = this.divMod(this.sampleSize, this.waveFormData.length);
|
|
25
|
+
const result = [];
|
|
26
|
+
for (let i = 0; i < this.waveFormData.length; i++) {
|
|
27
|
+
const extra = remainder && remainder-- ? 1 : 0;
|
|
28
|
+
result.push(...Array(bucketSize + extra).fill(this.waveFormData[i]));
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
this.getNextBucketMean = (data, currentBucketIndex, bucketSize) => {
|
|
33
|
+
const nextBucketStartIndex = Math.floor(currentBucketIndex * bucketSize) + 1;
|
|
34
|
+
let nextNextBucketStartIndex = Math.floor((currentBucketIndex + 1) * bucketSize) + 1;
|
|
35
|
+
nextNextBucketStartIndex =
|
|
36
|
+
nextNextBucketStartIndex < data.length
|
|
37
|
+
? nextNextBucketStartIndex
|
|
38
|
+
: data.length;
|
|
39
|
+
return this.mean(data.slice(nextBucketStartIndex, nextNextBucketStartIndex));
|
|
40
|
+
};
|
|
41
|
+
this.mean = (values) => values.reduce((acc, value) => acc + value, 0) / values.length;
|
|
42
|
+
this.triangleAreaHeron = (a, b, c) => {
|
|
43
|
+
const s = (a + b + c) / 2;
|
|
44
|
+
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
|
|
45
|
+
};
|
|
46
|
+
this.triangleBase = (a, b) => Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
|
|
47
|
+
this.divMod = (num, divisor) => {
|
|
48
|
+
return [Math.floor(num / divisor), num % divisor];
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
ngOnInit() {
|
|
52
|
+
this.containerSizeChanged();
|
|
53
|
+
if (this.container?.nativeElement) {
|
|
54
|
+
this.ngZone.runOutsideAngular(() => {
|
|
55
|
+
new ResizeObserver(() => {
|
|
56
|
+
this.containerSizeChanged();
|
|
57
|
+
}).observe(this.container.nativeElement);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
ngOnChanges(changes) {
|
|
62
|
+
if (changes.waveFormData) {
|
|
63
|
+
this.resampledWaveFormData =
|
|
64
|
+
this.waveFormData.length > this.sampleSize
|
|
65
|
+
? this.downsample()
|
|
66
|
+
: this.upsample();
|
|
67
|
+
}
|
|
68
|
+
if (changes.audioElement) {
|
|
69
|
+
this.ngZone.runOutsideAngular(() => {
|
|
70
|
+
this.audioElement?.addEventListener('timeupdate', () => {
|
|
71
|
+
const progress = (this.audioElement?.currentTime || 0) / (this.duration || 0) || 0;
|
|
72
|
+
if (Math.abs(progress - this.progress) >= 0.02) {
|
|
73
|
+
this.ngZone.run(() => {
|
|
74
|
+
this.progress = progress;
|
|
75
|
+
this.cdRef.detectChanges();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
ngAfterViewInit() {
|
|
83
|
+
this.isViewInited = true;
|
|
84
|
+
}
|
|
85
|
+
seek(event) {
|
|
86
|
+
const containerWidth = this.container?.nativeElement?.getBoundingClientRect().width || 0;
|
|
87
|
+
const containerStart = this.container?.nativeElement?.getBoundingClientRect()?.x || 0;
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
89
|
+
const progress = (event.x - containerStart) / containerWidth;
|
|
90
|
+
if (!isNaN(progress) && this.audioElement) {
|
|
91
|
+
const duration = this.duration || 0;
|
|
92
|
+
const time = duration * progress;
|
|
93
|
+
this.audioElement.currentTime = time;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
trackByIndex(index) {
|
|
97
|
+
return index;
|
|
98
|
+
}
|
|
99
|
+
containerSizeChanged() {
|
|
100
|
+
if (!this.container?.nativeElement) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const containerWidth = this.container.nativeElement.clientWidth;
|
|
104
|
+
if (containerWidth === 0) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const barWidth = +getComputedStyle(this.container.nativeElement)
|
|
108
|
+
.getPropertyValue('--str-chat__voice-recording-amplitude-bar-width')
|
|
109
|
+
.replace('px', '');
|
|
110
|
+
const barGap = +getComputedStyle(this.container.nativeElement)
|
|
111
|
+
.getPropertyValue('--str-chat__voice-recording-amplitude-bar-gap-width')
|
|
112
|
+
.replace('px', '');
|
|
113
|
+
if (!isNaN(barWidth) && !isNaN(barGap)) {
|
|
114
|
+
const sampleSize = Math.floor(containerWidth / (barWidth + barGap));
|
|
115
|
+
if (sampleSize !== this.sampleSize &&
|
|
116
|
+
!isNaN(sampleSize) &&
|
|
117
|
+
sampleSize !== Infinity) {
|
|
118
|
+
this.ngZone.run(() => {
|
|
119
|
+
this.sampleSize = sampleSize;
|
|
120
|
+
this.resampledWaveFormData =
|
|
121
|
+
this.waveFormData.length > this.sampleSize
|
|
122
|
+
? this.downsample()
|
|
123
|
+
: this.upsample();
|
|
124
|
+
if (this.isViewInited) {
|
|
125
|
+
this.cdRef.detectChanges();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
downsample() {
|
|
132
|
+
if (this.waveFormData.length <= this.sampleSize) {
|
|
133
|
+
return this.waveFormData;
|
|
134
|
+
}
|
|
135
|
+
if (this.sampleSize === 1)
|
|
136
|
+
return [this.mean(this.waveFormData)];
|
|
137
|
+
const result = [];
|
|
138
|
+
// bucket size adjusted due to the fact that the first and the last item in the original data array is kept in target output
|
|
139
|
+
const bucketSize = (this.waveFormData.length - 2) / (this.sampleSize - 2);
|
|
140
|
+
let lastSelectedPointIndex = 0;
|
|
141
|
+
result.push(this.waveFormData[lastSelectedPointIndex]); // Always add the first point
|
|
142
|
+
let maxAreaPoint, maxArea, triangleArea;
|
|
143
|
+
for (let bucketIndex = 1; bucketIndex < this.sampleSize - 1; bucketIndex++) {
|
|
144
|
+
const previousBucketRefPoint = this.waveFormData[lastSelectedPointIndex];
|
|
145
|
+
const nextBucketMean = this.getNextBucketMean(this.waveFormData, bucketIndex, bucketSize);
|
|
146
|
+
const currentBucketStartIndex = Math.floor((bucketIndex - 1) * bucketSize) + 1;
|
|
147
|
+
const nextBucketStartIndex = Math.floor(bucketIndex * bucketSize) + 1;
|
|
148
|
+
const countUnitsBetweenAtoC = 1 + nextBucketStartIndex - currentBucketStartIndex;
|
|
149
|
+
maxArea = triangleArea = -1;
|
|
150
|
+
for (let currentPointIndex = currentBucketStartIndex; currentPointIndex < nextBucketStartIndex; currentPointIndex++) {
|
|
151
|
+
const countUnitsBetweenAtoB = Math.abs(currentPointIndex - currentBucketStartIndex) + 1;
|
|
152
|
+
const countUnitsBetweenBtoC = countUnitsBetweenAtoC - countUnitsBetweenAtoB;
|
|
153
|
+
const currentPointValue = this.waveFormData[currentPointIndex];
|
|
154
|
+
triangleArea = this.triangleAreaHeron(this.triangleBase(Math.abs(previousBucketRefPoint - currentPointValue), countUnitsBetweenAtoB), this.triangleBase(Math.abs(currentPointValue - nextBucketMean), countUnitsBetweenBtoC), this.triangleBase(Math.abs(previousBucketRefPoint - nextBucketMean), countUnitsBetweenAtoC));
|
|
155
|
+
if (triangleArea > maxArea) {
|
|
156
|
+
maxArea = triangleArea;
|
|
157
|
+
maxAreaPoint = this.waveFormData[currentPointIndex];
|
|
158
|
+
lastSelectedPointIndex = currentPointIndex;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (typeof maxAreaPoint !== 'undefined')
|
|
162
|
+
result.push(maxAreaPoint);
|
|
163
|
+
}
|
|
164
|
+
result.push(this.waveFormData[this.waveFormData.length - 1]); // Always add the last point
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
VoiceRecordingWavebarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: VoiceRecordingWavebarComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
169
|
+
VoiceRecordingWavebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: VoiceRecordingWavebarComponent, selector: "stream-voice-recording-wavebar", inputs: { audioElement: "audioElement", waveFormData: "waveFormData", duration: "duration" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!--eslint-disable @angular-eslint/template/click-events-have-key-events-->\n<div\n #container\n class=\"str-chat__wave-progress-bar__track\"\n data-testid=\"wave-progress-bar-track\"\n role=\"progressbar\"\n (mousedown)=\"isDragging = true\"\n (mouseup)=\"isDragging = false\"\n (mouseleave)=\"isDragging = false\"\n (mousemove)=\"isDragging ? seek($event) : null\"\n (click)=\"seek($event)\"\n>\n <!--eslint-enable @angular-eslint/template/click-events-have-key-events-->\n <div\n *ngFor=\"\n let dataPoint of resampledWaveFormData;\n let i = index;\n trackBy: trackByIndex\n \"\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [class.str-chat__wave-progress-bar__amplitude-bar--active]=\"\n progress > i / resampledWaveFormData.length\n \"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n dataPoint ? dataPoint * 100 + '%' : '0%'\n \"\n ></div>\n <div\n class=\"str-chat__wave-progress-bar__progress-indicator\"\n data-testid=\"wave-progress-bar-progress-indicator\"\n [ngStyle]=\"{ 'inset-inline-start': progress * 100 + '%' }\"\n ></div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
170
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: VoiceRecordingWavebarComponent, decorators: [{
|
|
171
|
+
type: Component,
|
|
172
|
+
args: [{ selector: 'stream-voice-recording-wavebar', template: "<!--eslint-disable @angular-eslint/template/click-events-have-key-events-->\n<div\n #container\n class=\"str-chat__wave-progress-bar__track\"\n data-testid=\"wave-progress-bar-track\"\n role=\"progressbar\"\n (mousedown)=\"isDragging = true\"\n (mouseup)=\"isDragging = false\"\n (mouseleave)=\"isDragging = false\"\n (mousemove)=\"isDragging ? seek($event) : null\"\n (click)=\"seek($event)\"\n>\n <!--eslint-enable @angular-eslint/template/click-events-have-key-events-->\n <div\n *ngFor=\"\n let dataPoint of resampledWaveFormData;\n let i = index;\n trackBy: trackByIndex\n \"\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [class.str-chat__wave-progress-bar__amplitude-bar--active]=\"\n progress > i / resampledWaveFormData.length\n \"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n dataPoint ? dataPoint * 100 + '%' : '0%'\n \"\n ></div>\n <div\n class=\"str-chat__wave-progress-bar__progress-indicator\"\n data-testid=\"wave-progress-bar-progress-indicator\"\n [ngStyle]=\"{ 'inset-inline-start': progress * 100 + '%' }\"\n ></div>\n</div>\n" }]
|
|
173
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { audioElement: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], waveFormData: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}], duration: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], container: [{
|
|
180
|
+
type: ViewChild,
|
|
181
|
+
args: ['container', { static: true }]
|
|
182
|
+
}] } });
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb3JkaW5nLXdhdmViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZvaWNlLXJlY29yZGluZy92b2ljZS1yZWNvcmRpbmctd2F2ZWJhci92b2ljZS1yZWNvcmRpbmctd2F2ZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkaW5nL3ZvaWNlLXJlY29yZGluZy13YXZlYmFyL3ZvaWNlLXJlY29yZGluZy13YXZlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsS0FBSyxFQUtMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCOztHQUVHO0FBTUgsTUFBTSxPQUFPLDhCQUE4QjtJQXVCekMsWUFBb0IsTUFBYyxFQUFVLEtBQXdCO1FBQWhELFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQWhCcEU7O1dBRUc7UUFDTSxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUtyQywwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFDckMsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ1gsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUd4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQTJLckIsYUFBUSxHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztZQUUzRSx5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJ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LENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7UUFFMUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7MkhBOUxVLDhCQUE4QjsrR0FBOUIsOEJBQThCLCtTQ3JCM0MsNm5DQWlDQTsyRkRaYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsZ0NBQWdDOzZIQVVqQyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFNRSxTQUFTO3NCQURoQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byB2aXN1YWxpemUgdGhlIHdhdmUgYmFyIG9mIGEgdm9pY2UgcmVjb3JkaW5nXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS12b2ljZS1yZWNvcmRpbmctd2F2ZWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi92b2ljZS1yZWNvcmRpbmctd2F2ZWJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjb3JkaW5nV2F2ZWJhckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZWxlbWVudCB0aGF0IHBsYXlzIHRoZSB2b2ljZSByZWNvcmRpbmdcbiAgICovXG4gIEBJbnB1dCgpIGF1ZGlvRWxlbWVudD86IEhUTUxBdWRpb0VsZW1lbnQ7XG4gIC8qKlxuICAgKiBUaGUgd2F2ZWZvcm0gZGF0YSB0byB2aXN1YWxpemVcbiAgICovXG4gIEBJbnB1dCgpIHdhdmVGb3JtRGF0YTogbnVtYmVyW10gPSBbXTtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdm9pY2UgcmVjb3JkaW5nIGluIHNlY29uZHNcbiAgICovXG4gIEBJbnB1dCgpIGR1cmF0aW9uPzogbnVtYmVyO1xuICByZXNhbXBsZWRXYXZlRm9ybURhdGE6IG51bWJlcltdID0gW107XG4gIHByb2dyZXNzOiBudW1iZXIgPSAwO1xuICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgc2FtcGxlU2l6ZTogbnVtYmVyID0gNDA7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgY29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgaXNWaWV3SW5pdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJTaXplQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyU2l6ZUNoYW5nZWQoKTtcbiAgICAgICAgfSkub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lciEubmF0aXZlRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMud2F2ZUZvcm1EYXRhKSB7XG4gICAgICB0aGlzLnJlc2FtcGxlZFdhdmVGb3JtRGF0YSA9XG4gICAgICAgIHRoaXMud2F2ZUZvcm1EYXRhLmxlbmd0aCA+IHRoaXMuc2FtcGxlU2l6ZVxuICAgICAgICAgID8gdGhpcy5kb3duc2FtcGxlKClcbiAgICAgICAgICA6IHRoaXMudXBzYW1wbGUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuYXVkaW9FbGVtZW50KSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuYXVkaW9FbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID1cbiAgICAgICAgICAgICh0aGlzLmF1ZGlvRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMCkgLyAodGhpcy5kdXJhdGlvbiB8fCAwKSB8fCAwO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhwcm9ncmVzcyAtIHRoaXMucHJvZ3Jlc3MpID49IDAuMDIpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHNlZWsoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9XG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgMDtcbiAgICBjb25zdCBjb250YWluZXJTdGFydCA9XG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk/LnggfHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgY29uc3QgcHJvZ3Jlc3MgPSAoZXZlbnQueCAtIGNvbnRhaW5lclN0YXJ0KSAvIGNvbnRhaW5lcldpZHRoO1xuXG4gICAgaWYgKCFpc05hTihwcm9ncmVzcykgJiYgdGhpcy5hdWRpb0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgdGltZSA9IGR1cmF0aW9uICogcHJvZ3Jlc3M7XG4gICAgICB0aGlzLmF1ZGlvRWxlbWVudC5jdXJyZW50VGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGNvbnRhaW5lclNpemVDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiYXJXaWR0aCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zdHItY2hhdF9fdm9pY2UtcmVjb3JkaW5nLWFtcGxpdHVkZS1iYXItd2lkdGgnKVxuICAgICAgLnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIGNvbnN0IGJhckdhcCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zdHItY2hhdF9fdm9pY2UtcmVjb3JkaW5nLWFtcGxpdHVkZS1iYXItZ2FwLXdpZHRoJylcbiAgICAgIC5yZXBsYWNlKCdweCcsICcnKTtcbiAgICBpZiAoIWlzTmFOKGJhcldpZHRoKSAmJiAhaXNOYU4oYmFyR2FwKSkge1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyAoYmFyV2lkdGggKyBiYXJHYXApKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2FtcGxlU2l6ZSAhPT0gdGhpcy5zYW1wbGVTaXplICYmXG4gICAgICAgICFpc05hTihzYW1wbGVTaXplKSAmJlxuICAgICAgICBzYW1wbGVTaXplICE9PSBJbmZpbml0eVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICAgICAgICB0aGlzLnJlc2FtcGxlZFdhdmVGb3JtRGF0YSA9XG4gICAgICAgICAgICB0aGlzLndhdmVGb3JtRGF0YS5sZW5ndGggPiB0aGlzLnNhbXBsZVNpemVcbiAgICAgICAgICAgICAgPyB0aGlzLmRvd25zYW1wbGUoKVxuICAgICAgICAgICAgICA6IHRoaXMudXBzYW1wbGUoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkb3duc2FtcGxlKCkge1xuICAgIGlmICh0aGlzLndhdmVGb3JtRGF0YS5sZW5ndGggPD0gdGhpcy5zYW1wbGVTaXplKSB7XG4gICAgICByZXR1cm4gdGhpcy53YXZlRm9ybURhdGE7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2FtcGxlU2l6ZSA9PT0gMSkgcmV0dXJuIFt0aGlzLm1lYW4odGhpcy53YXZlRm9ybURhdGEpXTtcblxuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICAvLyBidWNrZXQgc2l6ZSBhZGp1c3RlZCBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIG9yaWdpbmFsIGRhdGEgYXJyYXkgaXMga2VwdCBpbiB0YXJnZXQgb3V0cHV0XG4gICAgY29uc3QgYnVja2V0U2l6ZSA9ICh0aGlzLndhdmVGb3JtRGF0YS5sZW5ndGggLSAyKSAvICh0aGlzLnNhbXBsZVNpemUgLSAyKTtcbiAgICBsZXQgbGFzdFNlbGVjdGVkUG9pbnRJbmRleCA9IDA7XG4gICAgcmVzdWx0LnB1c2godGhpcy53YXZlRm9ybURhdGFbbGFzdFNlbGVjdGVkUG9pbnRJbmRleF0pOyAvLyBBbHdheXMgYWRkIHRoZSBmaXJzdCBwb2ludFxuICAgIGxldCBtYXhBcmVhUG9pbnQsIG1heEFyZWEsIHRyaWFuZ2xlQXJlYTtcblxuICAgIGZvciAoXG4gICAgICBsZXQgYnVja2V0SW5kZXggPSAxO1xuICAgICAgYnVja2V0SW5kZXggPCB0aGlzLnNhbXBsZVNpemUgLSAxO1xuICAgICAgYnVja2V0SW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgcHJldmlvdXNCdWNrZXRSZWZQb2ludCA9IHRoaXMud2F2ZUZvcm1EYXRhW2xhc3RTZWxlY3RlZFBvaW50SW5kZXhdO1xuICAgICAgY29uc3QgbmV4dEJ1Y2tldE1lYW4gPSB0aGlzLmdldE5leHRCdWNrZXRNZWFuKFxuICAgICAgICB0aGlzLndhdmVGb3JtRGF0YSxcbiAgICAgICAgYnVja2V0SW5kZXgsXG4gICAgICAgIGJ1Y2tldFNpemVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRCdWNrZXRTdGFydEluZGV4ID1cbiAgICAgICAgTWF0aC5mbG9vcigoYnVja2V0SW5kZXggLSAxKSAqIGJ1Y2tldFNpemUpICsgMTtcbiAgICAgIGNvbnN0IG5leHRCdWNrZXRTdGFydEluZGV4ID0gTWF0aC5mbG9vcihidWNrZXRJbmRleCAqIGJ1Y2tldFNpemUpICsgMTtcbiAgICAgIGNvbnN0IGNvdW50VW5pdHNCZXR3ZWVuQXRvQyA9XG4gICAgICAgIDEgKyBuZXh0QnVja2V0U3RhcnRJbmRleCAtIGN1cnJlbnRCdWNrZXRTdGFydEluZGV4O1xuXG4gICAgICBtYXhBcmVhID0gdHJpYW5nbGVBcmVhID0gLTE7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBjdXJyZW50UG9pbnRJbmRleCA9IGN1cnJlbnRCdWNrZXRTdGFydEluZGV4O1xuICAgICAgICBjdXJyZW50UG9pbnRJbmRleCA8IG5leHRCdWNrZXRTdGFydEluZGV4O1xuICAgICAgICBjdXJyZW50UG9pbnRJbmRleCsrXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY291bnRVbml0c0JldHdlZW5BdG9CID1cbiAgICAgICAgICBNYXRoLmFicyhjdXJyZW50UG9pbnRJbmRleCAtIGN1cnJlbnRCdWNrZXRTdGFydEluZGV4KSArIDE7XG4gICAgICAgIGNvbnN0IGNvdW50VW5pdHNCZXR3ZWVuQnRvQyA9XG4gICAgICAgICAgY291bnRVbml0c0JldHdlZW5BdG9DIC0gY291bnRVbml0c0JldHdlZW5BdG9CO1xuICAgICAgICBjb25zdCBjdXJyZW50UG9pbnRWYWx1ZSA9IHRoaXMud2F2ZUZvcm1EYXRhW2N1cnJlbnRQb2ludEluZGV4XTtcblxuICAgICAgICB0cmlhbmdsZUFyZWEgPSB0aGlzLnRyaWFuZ2xlQXJlYUhlcm9uKFxuICAgICAgICAgIHRoaXMudHJpYW5nbGVCYXNlKFxuICAgICAgICAgICAgTWF0aC5hYnMocHJldmlvdXNCdWNrZXRSZWZQb2ludCAtIGN1cnJlbnRQb2ludFZhbHVlKSxcbiAgICAgICAgICAgIGNvdW50VW5pdHNCZXR3ZWVuQXRvQlxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy50cmlhbmdsZUJhc2UoXG4gICAgICAgICAgICBNYXRoLmFicyhjdXJyZW50UG9pbnRWYWx1ZSAtIG5leHRCdWNrZXRNZWFuKSxcbiAgICAgICAgICAgIGNvdW50VW5pdHNCZXR3ZWVuQnRvQ1xuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy50cmlhbmdsZUJhc2UoXG4gICAgICAgICAgICBNYXRoLmFicyhwcmV2aW91c0J1Y2tldFJlZlBvaW50IC0gbmV4dEJ1Y2tldE1lYW4pLFxuICAgICAgICAgICAgY291bnRVbml0c0JldHdlZW5BdG9DXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmlhbmdsZUFyZWEgPiBtYXhBcmVhKSB7XG4gICAgICAgICAgbWF4QXJlYSA9IHRyaWFuZ2xlQXJlYTtcbiAgICAgICAgICBtYXhBcmVhUG9pbnQgPSB0aGlzLndhdmVGb3JtRGF0YVtjdXJyZW50UG9pbnRJbmRleF07XG4gICAgICAgICAgbGFzdFNlbGVjdGVkUG9pbnRJbmRleCA9IGN1cnJlbnRQb2ludEluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbWF4QXJlYVBvaW50ICE9PSAndW5kZWZpbmVkJykgcmVzdWx0LnB1c2gobWF4QXJlYVBvaW50KTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaCh0aGlzLndhdmVGb3JtRGF0YVt0aGlzLndhdmVGb3JtRGF0YS5sZW5ndGggLSAxXSk7IC8vIEFsd2F5cyBhZGQgdGhlIGxhc3QgcG9pbnRcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHVwc2FtcGxlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnNhbXBsZVNpemUgPT09IHRoaXMud2F2ZUZvcm1EYXRhLmxlbmd0aCkgcmV0dXJuIHRoaXMud2F2ZUZvcm1EYXRhO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBwcmVmZXItY29uc3RcbiAgICBsZXQgW2J1Y2tldFNpemUsIHJlbWFpbmRlcl0gPSB0aGlzLmRpdk1vZChcbiAgICAgIHRoaXMuc2FtcGxlU2l6ZSxcbiAgICAgIHRoaXMud2F2ZUZvcm1EYXRhLmxlbmd0aFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndhdmVGb3JtRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0cmEgPSByZW1haW5kZXIgJiYgcmVtYWluZGVyLS0gPyAxIDogMDtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAuLi5BcnJheTxudW1iZXI+KGJ1Y2tldFNpemUgKyBleHRyYSkuZmlsbCh0aGlzLndhdmVGb3JtRGF0YVtpXSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXROZXh0QnVja2V0TWVhbiA9IChcbiAgICBkYXRhOiBudW1iZXJbXSxcbiAgICBjdXJyZW50QnVja2V0SW5kZXg6IG51bWJlcixcbiAgICBidWNrZXRTaXplOiBudW1iZXJcbiAgKSA9PiB7XG4gICAgY29uc3QgbmV4dEJ1Y2tldFN0YXJ0SW5kZXggPVxuICAgICAgTWF0aC5mbG9vcihjdXJyZW50QnVja2V0SW5kZXggKiBidWNrZXRTaXplKSArIDE7XG4gICAgbGV0IG5leHROZXh0QnVja2V0U3RhcnRJbmRleCA9XG4gICAgICBNYXRoLmZsb29yKChjdXJyZW50QnVja2V0SW5kZXggKyAxKSAqIGJ1Y2tldFNpemUpICsgMTtcbiAgICBuZXh0TmV4dEJ1Y2tldFN0YXJ0SW5kZXggPVxuICAgICAgbmV4dE5leHRCdWNrZXRTdGFydEluZGV4IDwgZGF0YS5sZW5ndGhcbiAgICAgICAgPyBuZXh0TmV4dEJ1Y2tldFN0YXJ0SW5kZXhcbiAgICAgICAgOiBkYXRhLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLm1lYW4oXG4gICAgICBkYXRhLnNsaWNlKG5leHRCdWNrZXRTdGFydEluZGV4LCBuZXh0TmV4dEJ1Y2tldFN0YXJ0SW5kZXgpXG4gICAgKTtcbiAgfTtcblxuICBwcml2YXRlIG1lYW4gPSAodmFsdWVzOiBudW1iZXJbXSkgPT5cbiAgICB2YWx1ZXMucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MgKyB2YWx1ZSwgMCkgLyB2YWx1ZXMubGVuZ3RoO1xuXG4gIHByaXZhdGUgdHJpYW5nbGVBcmVhSGVyb24gPSAoYTogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHMgPSAoYSArIGIgKyBjKSAvIDI7XG4gICAgcmV0dXJuIE1hdGguc3FydChzICogKHMgLSBhKSAqIChzIC0gYikgKiAocyAtIGMpKTtcbiAgfTtcblxuICBwcml2YXRlIHRyaWFuZ2xlQmFzZSA9IChhOiBudW1iZXIsIGI6IG51bWJlcikgPT5cbiAgICBNYXRoLnNxcnQoTWF0aC5wb3coYSwgMikgKyBNYXRoLnBvdyhiLCAyKSk7XG5cbiAgcHJpdmF0ZSBkaXZNb2QgPSAobnVtOiBudW1iZXIsIGRpdmlzb3I6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBbTWF0aC5mbG9vcihudW0gLyBkaXZpc29yKSwgbnVtICUgZGl2aXNvcl07XG4gIH07XG59XG4iLCI8IS0tZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMtLT5cbjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cInN0ci1jaGF0X193YXZlLXByb2dyZXNzLWJhcl9fdHJhY2tcIlxuICBkYXRhLXRlc3RpZD1cIndhdmUtcHJvZ3Jlc3MtYmFyLXRyYWNrXCJcbiAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgKG1vdXNlZG93bik9XCJpc0RyYWdnaW5nID0gdHJ1ZVwiXG4gIChtb3VzZXVwKT1cImlzRHJhZ2dpbmcgPSBmYWxzZVwiXG4gIChtb3VzZWxlYXZlKT1cImlzRHJhZ2dpbmcgPSBmYWxzZVwiXG4gIChtb3VzZW1vdmUpPVwiaXNEcmFnZ2luZyA/IHNlZWsoJGV2ZW50KSA6IG51bGxcIlxuICAoY2xpY2spPVwic2VlaygkZXZlbnQpXCJcbj5cbiAgPCEtLWVzbGludC1lbmFibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMtLT5cbiAgPGRpdlxuICAgICpuZ0Zvcj1cIlxuICAgICAgbGV0IGRhdGFQb2ludCBvZiByZXNhbXBsZWRXYXZlRm9ybURhdGE7XG4gICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgdHJhY2tCeTogdHJhY2tCeUluZGV4XG4gICAgXCJcbiAgICBjbGFzcz1cInN0ci1jaGF0X193YXZlLXByb2dyZXNzLWJhcl9fYW1wbGl0dWRlLWJhclwiXG4gICAgW2NsYXNzLnN0ci1jaGF0X193YXZlLXByb2dyZXNzLWJhcl9fYW1wbGl0dWRlLWJhci0tYWN0aXZlXT1cIlxuICAgICAgcHJvZ3Jlc3MgPiBpIC8gcmVzYW1wbGVkV2F2ZUZvcm1EYXRhLmxlbmd0aFxuICAgIFwiXG4gICAgW3N0eWxlLi0tc3RyLWNoYXRfX3dhdmUtcHJvZ3Jlc3MtYmFyX19hbXBsaXR1ZGUtYmFyLWhlaWdodF09XCJcbiAgICAgIGRhdGFQb2ludCA/IGRhdGFQb2ludCAqIDEwMCArICclJyA6ICcwJSdcbiAgICBcIlxuICA+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInN0ci1jaGF0X193YXZlLXByb2dyZXNzLWJhcl9fcHJvZ3Jlc3MtaW5kaWNhdG9yXCJcbiAgICBkYXRhLXRlc3RpZD1cIndhdmUtcHJvZ3Jlc3MtYmFyLXByb2dyZXNzLWluZGljYXRvclwiXG4gICAgW25nU3R5bGVdPVwieyAnaW5zZXQtaW5saW5lLXN0YXJ0JzogcHJvZ3Jlc3MgKiAxMDAgKyAnJScgfVwiXG4gID48L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
+
import prettybytes from 'pretty-bytes';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "../icon-placeholder/icon-placeholder.component";
|
|
6
|
+
import * as i3 from "./voice-recording-wavebar/voice-recording-wavebar.component";
|
|
7
|
+
import * as i4 from "@ngx-translate/core";
|
|
8
|
+
/**
|
|
9
|
+
* This component can be used to display an attachment with type `voiceRecording`. The component allows playing the attachment inside the browser.
|
|
10
|
+
*/
|
|
11
|
+
export class VoiceRecordingComponent {
|
|
12
|
+
constructor(ngZone, cdRef) {
|
|
13
|
+
this.ngZone = ngZone;
|
|
14
|
+
this.cdRef = cdRef;
|
|
15
|
+
this.fileSize = '';
|
|
16
|
+
this.durationFormatted = '';
|
|
17
|
+
this.secondsElapsed = 0;
|
|
18
|
+
this.isError = false;
|
|
19
|
+
this.secondsElapsedFormatted = this.getFormattedDuration(this.secondsElapsed);
|
|
20
|
+
}
|
|
21
|
+
ngOnChanges(changes) {
|
|
22
|
+
if (changes.attachment) {
|
|
23
|
+
this.fileSize = this.getFileSize();
|
|
24
|
+
this.durationFormatted = this.getFormattedDuration(this.attachment?.duration);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
ngAfterViewInit() {
|
|
28
|
+
// timeupdate fired frequntly so we optimize change detections
|
|
29
|
+
this.ngZone.runOutsideAngular(() => {
|
|
30
|
+
this.audioElement?.nativeElement.addEventListener('timeupdate', () => {
|
|
31
|
+
const secondsElapsed = this.audioElement?.nativeElement?.ended
|
|
32
|
+
? this.attachment?.duration || 0
|
|
33
|
+
: Math.round(this.audioElement?.nativeElement?.currentTime || 0);
|
|
34
|
+
if (this.secondsElapsed !== secondsElapsed) {
|
|
35
|
+
this.ngZone.run(() => {
|
|
36
|
+
this.secondsElapsed = secondsElapsed;
|
|
37
|
+
this.secondsElapsedFormatted = this.getFormattedDuration(this.secondsElapsed);
|
|
38
|
+
this.cdRef.detectChanges();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async togglePlay() {
|
|
45
|
+
if (!this.audioElement || !this.attachment?.asset_url) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
this.audioElement?.nativeElement.paused
|
|
50
|
+
? await this.audioElement.nativeElement.play()
|
|
51
|
+
: this.audioElement.nativeElement.pause();
|
|
52
|
+
this.isError = false;
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
this.isError = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
setPlaybackRate() {
|
|
59
|
+
if (!this.audioElement?.nativeElement) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
let playbackRate = this.audioElement?.nativeElement?.playbackRate + 0.5;
|
|
63
|
+
if (playbackRate > 2) {
|
|
64
|
+
playbackRate = 1;
|
|
65
|
+
}
|
|
66
|
+
this.audioElement.nativeElement.playbackRate = playbackRate;
|
|
67
|
+
}
|
|
68
|
+
getFormattedDuration(duration) {
|
|
69
|
+
if (duration === undefined || duration <= 0)
|
|
70
|
+
return '00:00';
|
|
71
|
+
const [hours, hoursLeftover] = this.divMod(duration, 3600);
|
|
72
|
+
const [minutes, seconds] = this.divMod(hoursLeftover, 60);
|
|
73
|
+
const roundedSeconds = Math.ceil(seconds);
|
|
74
|
+
const prependHrsZero = hours.toString().length === 1 ? '0' : '';
|
|
75
|
+
const prependMinZero = minutes.toString().length === 1 ? '0' : '';
|
|
76
|
+
const prependSecZero = roundedSeconds.toString().length === 1 ? '0' : '';
|
|
77
|
+
const minSec = `${prependMinZero}${minutes}:${prependSecZero}${roundedSeconds}`;
|
|
78
|
+
return hours ? `${prependHrsZero}${hours}:` + minSec : minSec;
|
|
79
|
+
}
|
|
80
|
+
getFileSize() {
|
|
81
|
+
if (this.attachment?.file_size === undefined ||
|
|
82
|
+
this.attachment?.file_size === null) {
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
return prettybytes(Number(this.attachment.file_size || 0));
|
|
86
|
+
}
|
|
87
|
+
divMod(num, divisor) {
|
|
88
|
+
return [Math.floor(num / divisor), num % divisor];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
VoiceRecordingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: VoiceRecordingComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
+
VoiceRecordingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: VoiceRecordingComponent, selector: "stream-voice-recording", inputs: { attachment: "attachment" }, viewQueries: [{ propertyName: "audioElement", first: true, predicate: ["audioElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"str-chat__message-attachment__voice-recording-widget\"\n data-testid=\"voice-recording-widget\"\n [class.str-chat__message-attachment__voice-recording-widget--error]=\"isError\"\n>\n <!-- Empty event handlers to trigger change detection -->\n <audio\n #audioElement\n (play)=\"(null)\"\n (pause)=\"(null)\"\n (ended)=\"(null)\"\n (error)=\"isError = true\"\n (abort)=\"isError = true\"\n >\n <source\n data-testid=\"audio-source\"\n [src]=\"attachment?.asset_url\"\n [type]=\"attachment?.mime_type\"\n />\n </audio>\n <button\n class=\"str-chat__message-attachment-audio-widget--play-button\"\n data-testid=\"play-button\"\n (click)=\"togglePlay()\"\n >\n <stream-icon-placeholder\n [icon]=\"audioElement?.paused ? 'play' : 'pause'\"\n ></stream-icon-placeholder>\n </button>\n <div class=\"str-chat__message-attachment__voice-recording-widget__metadata\">\n <div class=\"str-chat__message-attachment-voice-recording-widget--first-row\">\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__title\"\n data-testid=\"voice-recording-title\"\n [title]=\"attachment?.title\"\n >\n {{ attachment?.title }}\n </div>\n </div>\n\n <ng-container *ngIf=\"isError; else state\">\n <div\n class=\"\n str-chat__message-attachment__voice-recording-widget__error-message\n \"\n >\n <stream-icon-placeholder\n icon=\"error\"\n [size]=\"20\"\n ></stream-icon-placeholder>\n <span data-testid=\"error-message\">{{\n \"streamChat.Error playing audio\" | translate\n }}</span>\n </div>\n </ng-container>\n <ng-template #state>\n <div\n class=\"\n str-chat__message-attachment__voice-recording-widget__audio-state\n \"\n >\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__timer\"\n >\n <span\n *ngIf=\"!!attachment?.duration; else fileSizeTemplate\"\n data-testid=\"duration\"\n >\n {{\n secondsElapsed > 0 || !audioElement.paused\n ? secondsElapsedFormatted\n : durationFormatted\n }}</span\n >\n <ng-template #fileSizeTemplate>\n <span\n class=\"str-chat__message-attachment-file--item-size\"\n data-testid=\"file-size-indicator\"\n >\n {{ fileSize }}\n </span>\n </ng-template>\n </div>\n <stream-voice-recording-wavebar\n *ngIf=\"attachment?.waveform_data && attachment?.duration\"\n [waveFormData]=\"attachment?.waveform_data || []\"\n [duration]=\"attachment?.duration\"\n [audioElement]=\"audioElement\"\n ></stream-voice-recording-wavebar>\n </div>\n </ng-template>\n </div>\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__right-section\"\n >\n <button\n *ngIf=\"!audioElement?.paused; else fileIcon\"\n class=\"str-chat__message_attachment__playback-rate-button\"\n data-testid=\"playback-rate-button\"\n (click)=\"setPlaybackRate()\"\n >\n {{ audioElement?.playbackRate | number: \"1.1-1\" }}x\n </button>\n <ng-template #fileIcon>\n <stream-icon-placeholder\n icon=\"audio-file\"\n [size]=\"40\"\n ></stream-icon-placeholder>\n </ng-template>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { kind: "component", type: i3.VoiceRecordingWavebarComponent, selector: "stream-voice-recording-wavebar", inputs: ["audioElement", "waveFormData", "duration"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: VoiceRecordingComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'stream-voice-recording', template: "<div\n class=\"str-chat__message-attachment__voice-recording-widget\"\n data-testid=\"voice-recording-widget\"\n [class.str-chat__message-attachment__voice-recording-widget--error]=\"isError\"\n>\n <!-- Empty event handlers to trigger change detection -->\n <audio\n #audioElement\n (play)=\"(null)\"\n (pause)=\"(null)\"\n (ended)=\"(null)\"\n (error)=\"isError = true\"\n (abort)=\"isError = true\"\n >\n <source\n data-testid=\"audio-source\"\n [src]=\"attachment?.asset_url\"\n [type]=\"attachment?.mime_type\"\n />\n </audio>\n <button\n class=\"str-chat__message-attachment-audio-widget--play-button\"\n data-testid=\"play-button\"\n (click)=\"togglePlay()\"\n >\n <stream-icon-placeholder\n [icon]=\"audioElement?.paused ? 'play' : 'pause'\"\n ></stream-icon-placeholder>\n </button>\n <div class=\"str-chat__message-attachment__voice-recording-widget__metadata\">\n <div class=\"str-chat__message-attachment-voice-recording-widget--first-row\">\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__title\"\n data-testid=\"voice-recording-title\"\n [title]=\"attachment?.title\"\n >\n {{ attachment?.title }}\n </div>\n </div>\n\n <ng-container *ngIf=\"isError; else state\">\n <div\n class=\"\n str-chat__message-attachment__voice-recording-widget__error-message\n \"\n >\n <stream-icon-placeholder\n icon=\"error\"\n [size]=\"20\"\n ></stream-icon-placeholder>\n <span data-testid=\"error-message\">{{\n \"streamChat.Error playing audio\" | translate\n }}</span>\n </div>\n </ng-container>\n <ng-template #state>\n <div\n class=\"\n str-chat__message-attachment__voice-recording-widget__audio-state\n \"\n >\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__timer\"\n >\n <span\n *ngIf=\"!!attachment?.duration; else fileSizeTemplate\"\n data-testid=\"duration\"\n >\n {{\n secondsElapsed > 0 || !audioElement.paused\n ? secondsElapsedFormatted\n : durationFormatted\n }}</span\n >\n <ng-template #fileSizeTemplate>\n <span\n class=\"str-chat__message-attachment-file--item-size\"\n data-testid=\"file-size-indicator\"\n >\n {{ fileSize }}\n </span>\n </ng-template>\n </div>\n <stream-voice-recording-wavebar\n *ngIf=\"attachment?.waveform_data && attachment?.duration\"\n [waveFormData]=\"attachment?.waveform_data || []\"\n [duration]=\"attachment?.duration\"\n [audioElement]=\"audioElement\"\n ></stream-voice-recording-wavebar>\n </div>\n </ng-template>\n </div>\n <div\n class=\"str-chat__message-attachment__voice-recording-widget__right-section\"\n >\n <button\n *ngIf=\"!audioElement?.paused; else fileIcon\"\n class=\"str-chat__message_attachment__playback-rate-button\"\n data-testid=\"playback-rate-button\"\n (click)=\"setPlaybackRate()\"\n >\n {{ audioElement?.playbackRate | number: \"1.1-1\" }}x\n </button>\n <ng-template #fileIcon>\n <stream-icon-placeholder\n icon=\"audio-file\"\n [size]=\"40\"\n ></stream-icon-placeholder>\n </ng-template>\n </div>\n</div>\n" }]
|
|
96
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { attachment: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], audioElement: [{
|
|
99
|
+
type: ViewChild,
|
|
100
|
+
args: ['audioElement']
|
|
101
|
+
}] } });
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb3JkaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi92b2ljZS1yZWNvcmRpbmcvdm9pY2UtcmVjb3JkaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi92b2ljZS1yZWNvcmRpbmcvdm9pY2UtcmVjb3JkaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsS0FBSyxFQUlMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7Ozs7OztBQUV2Qzs7R0FFRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFhbEMsWUFBb0IsTUFBYyxFQUFVLEtBQXdCO1FBQWhELFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQVJwRSxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBRXRCLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBS2QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDdEQsSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ2hELElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUMxQixDQUFDO1NBQ0g7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QUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLGNBQWMsR0FBRyxPQUFPLElBQUksY0FBYyxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBRWhGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxLQUFLLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoRSxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUNFLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxLQUFLLFNBQVM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLEtBQUssSUFBSSxFQUNuQztZQUNBLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVcsRUFBRSxPQUFlO1FBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7b0hBcEdVLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLHVPQ3ZCcEMsNDlHQStHQTsyRkR4RmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHdCQUF3Qjs2SEFRekIsVUFBVTtzQkFBbEIsS0FBSztnQkFPRSxZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwcmV0dHlieXRlcyBmcm9tICdwcmV0dHktYnl0ZXMnO1xuXG4vKipcbiAqIFRoaXMgY29tcG9uZW50IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gYXR0YWNobWVudCB3aXRoIHR5cGUgYHZvaWNlUmVjb3JkaW5nYC4gVGhlIGNvbXBvbmVudCBhbGxvd3MgcGxheWluZyB0aGUgYXR0YWNobWVudCBpbnNpZGUgdGhlIGJyb3dzZXIuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS12b2ljZS1yZWNvcmRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdm9pY2UtcmVjb3JkaW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgVm9pY2VSZWNvcmRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICAvKipcbiAgICogVGhlIHZvaWNlIHJlY29yZGluZyBhdHRhY2htZW50XG4gICAqL1xuICBASW5wdXQoKSBhdHRhY2htZW50PzogQXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbiAgZmlsZVNpemU6IHN0cmluZyA9ICcnO1xuICBzZWNvbmRzRWxhcHNlZEZvcm1hdHRlZDogc3RyaW5nO1xuICBkdXJhdGlvbkZvcm1hdHRlZDogc3RyaW5nID0gJyc7XG4gIHNlY29uZHNFbGFwc2VkID0gMDtcbiAgaXNFcnJvciA9IGZhbHNlO1xuICBAVmlld0NoaWxkKCdhdWRpb0VsZW1lbnQnKVxuICBwcml2YXRlIGF1ZGlvRWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTEF1ZGlvRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB0aGlzLnNlY29uZHNFbGFwc2VkRm9ybWF0dGVkID0gdGhpcy5nZXRGb3JtYXR0ZWREdXJhdGlvbihcbiAgICAgIHRoaXMuc2Vjb25kc0VsYXBzZWRcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmF0dGFjaG1lbnQpIHtcbiAgICAgIHRoaXMuZmlsZVNpemUgPSB0aGlzLmdldEZpbGVTaXplKCk7XG4gICAgICB0aGlzLmR1cmF0aW9uRm9ybWF0dGVkID0gdGhpcy5nZXRGb3JtYXR0ZWREdXJhdGlvbihcbiAgICAgICAgdGhpcy5hdHRhY2htZW50Py5kdXJhdGlvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gdGltZXVwZGF0ZSBmaXJlZCBmcmVxdW50bHkgc28gd2Ugb3B0aW1pemUgY2hhbmdlIGRldGVjdGlvbnNcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmF1ZGlvRWxlbWVudD8ubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWNvbmRzRWxhcHNlZCA9IHRoaXMuYXVkaW9FbGVtZW50Py5uYXRpdmVFbGVtZW50Py5lbmRlZFxuICAgICAgICAgID8gdGhpcy5hdHRhY2htZW50Py5kdXJhdGlvbiB8fCAwXG4gICAgICAgICAgOiBNYXRoLnJvdW5kKHRoaXMuYXVkaW9FbGVtZW50Py5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKTtcbiAgICAgICAgaWYgKHRoaXMuc2Vjb25kc0VsYXBzZWQgIT09IHNlY29uZHNFbGFwc2VkKSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kc0VsYXBzZWQgPSBzZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kc0VsYXBzZWRGb3JtYXR0ZWQgPSB0aGlzLmdldEZvcm1hdHRlZER1cmF0aW9uKFxuICAgICAgICAgICAgICB0aGlzLnNlY29uZHNFbGFwc2VkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdG9nZ2xlUGxheSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9FbGVtZW50IHx8ICF0aGlzLmF0dGFjaG1lbnQ/LmFzc2V0X3VybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb0VsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQucGF1c2VkXG4gICAgICAgID8gYXdhaXQgdGhpcy5hdWRpb0VsZW1lbnQubmF0aXZlRWxlbWVudC5wbGF5KClcbiAgICAgICAgOiB0aGlzLmF1ZGlvRWxlbWVudC5uYXRpdmVFbGVtZW50LnBhdXNlKCk7XG4gICAgICB0aGlzLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmlzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldFBsYXliYWNrUmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9FbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwbGF5YmFja1JhdGUgPSB0aGlzLmF1ZGlvRWxlbWVudD8ubmF0aXZlRWxlbWVudD8ucGxheWJhY2tSYXRlICsgMC41O1xuICAgIGlmIChwbGF5YmFja1JhdGUgPiAyKSB7XG4gICAgICBwbGF5YmFja1JhdGUgPSAxO1xuICAgIH1cbiAgICB0aGlzLmF1ZGlvRWxlbWVudC5uYXRpdmVFbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oZHVyYXRpb24/OiBudW1iZXIpIHtcbiAgICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCB8fCBkdXJhdGlvbiA8PSAwKSByZXR1cm4gJzAwOjAwJztcblxuICAgIGNvbnN0IFtob3VycywgaG91cnNMZWZ0b3Zlcl0gPSB0aGlzLmRpdk1vZChkdXJhdGlvbiwgMzYwMCk7XG4gICAgY29uc3QgW21pbnV0ZXMsIHNlY29uZHNdID0gdGhpcy5kaXZNb2QoaG91cnNMZWZ0b3ZlciwgNjApO1xuICAgIGNvbnN0IHJvdW5kZWRTZWNvbmRzID0gTWF0aC5jZWlsKHNlY29uZHMpO1xuXG4gICAgY29uc3QgcHJlcGVuZEhyc1plcm8gPSBob3Vycy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/ICcwJyA6ICcnO1xuICAgIGNvbnN0IHByZXBlbmRNaW5aZXJvID0gbWludXRlcy50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/ICcwJyA6ICcnO1xuICAgIGNvbnN0IHByZXBlbmRTZWNaZXJvID0gcm91bmRlZFNlY29uZHMudG9TdHJpbmcoKS5sZW5ndGggPT09IDEgPyAnMCcgOiAnJztcbiAgICBjb25zdCBtaW5TZWMgPSBgJHtwcmVwZW5kTWluWmVyb30ke21pbnV0ZXN9OiR7cHJlcGVuZFNlY1plcm99JHtyb3VuZGVkU2Vjb25kc31gO1xuXG4gICAgcmV0dXJuIGhvdXJzID8gYCR7cHJlcGVuZEhyc1plcm99JHtob3Vyc306YCArIG1pblNlYyA6IG1pblNlYztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsZVNpemUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5hdHRhY2htZW50Py5maWxlX3NpemUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5hdHRhY2htZW50Py5maWxlX3NpemUgPT09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHByZXR0eWJ5dGVzKE51bWJlcih0aGlzLmF0dGFjaG1lbnQuZmlsZV9zaXplIHx8IDApKTtcbiAgfVxuXG4gIHByaXZhdGUgZGl2TW9kKG51bTogbnVtYmVyLCBkaXZpc29yOiBudW1iZXIpIHtcbiAgICByZXR1cm4gW01hdGguZmxvb3IobnVtIC8gZGl2aXNvciksIG51bSAlIGRpdmlzb3JdO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudF9fdm9pY2UtcmVjb3JkaW5nLXdpZGdldFwiXG4gIGRhdGEtdGVzdGlkPVwidm9pY2UtcmVjb3JkaW5nLXdpZGdldFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50X192b2ljZS1yZWNvcmRpbmctd2lkZ2V0LS1lcnJvcl09XCJpc0Vycm9yXCJcbj5cbiAgPCEtLSBFbXB0eSBldmVudCBoYW5kbGVycyB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gIDxhdWRpb1xuICAgICNhdWRpb0VsZW1lbnRcbiAgICAocGxheSk9XCIobnVsbClcIlxuICAgIChwYXVzZSk9XCIobnVsbClcIlxuICAgIChlbmRlZCk9XCIobnVsbClcIlxuICAgIChlcnJvcik9XCJpc0Vycm9yID0gdHJ1ZVwiXG4gICAgKGFib3J0KT1cImlzRXJyb3IgPSB0cnVlXCJcbiAgPlxuICAgIDxzb3VyY2VcbiAgICAgIGRhdGEtdGVzdGlkPVwiYXVkaW8tc291cmNlXCJcbiAgICAgIFtzcmNdPVwiYXR0YWNobWVudD8uYXNzZXRfdXJsXCJcbiAgICAgIFt0eXBlXT1cImF0dGFjaG1lbnQ/Lm1pbWVfdHlwZVwiXG4gICAgLz5cbiAgPC9hdWRpbz5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1hdWRpby13aWRnZXQtLXBsYXktYnV0dG9uXCJcbiAgICBkYXRhLXRlc3RpZD1cInBsYXktYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgW2ljb25dPVwiYXVkaW9FbGVtZW50Py5wYXVzZWQgPyAncGxheScgOiAncGF1c2UnXCJcbiAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50X192b2ljZS1yZWNvcmRpbmctd2lkZ2V0X19tZXRhZGF0YVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LXZvaWNlLXJlY29yZGluZy13aWRnZXQtLWZpcnN0LXJvd1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnRfX3ZvaWNlLXJlY29yZGluZy13aWRnZXRfX3RpdGxlXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ2b2ljZS1yZWNvcmRpbmctdGl0bGVcIlxuICAgICAgICBbdGl0bGVdPVwiYXR0YWNobWVudD8udGl0bGVcIlxuICAgICAgPlxuICAgICAgICB7eyBhdHRhY2htZW50Py50aXRsZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFcnJvcjsgZWxzZSBzdGF0ZVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnRfX3ZvaWNlLXJlY29yZGluZy13aWRnZXRfX2Vycm9yLW1lc3NhZ2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgaWNvbj1cImVycm9yXCJcbiAgICAgICAgICBbc2l6ZV09XCIyMFwiXG4gICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImVycm9yLW1lc3NhZ2VcIj57e1xuICAgICAgICAgIFwic3RyZWFtQ2hhdC5FcnJvciBwbGF5aW5nIGF1ZGlvXCIgfCB0cmFuc2xhdGVcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3N0YXRlPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnRfX3ZvaWNlLXJlY29yZGluZy13aWRnZXRfX2F1ZGlvLXN0YXRlXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnRfX3ZvaWNlLXJlY29yZGluZy13aWRnZXRfX3RpbWVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiEhYXR0YWNobWVudD8uZHVyYXRpb247IGVsc2UgZmlsZVNpemVUZW1wbGF0ZVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImR1cmF0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICBzZWNvbmRzRWxhcHNlZCA+IDAgfHwgIWF1ZGlvRWxlbWVudC5wYXVzZWRcbiAgICAgICAgICAgICAgICA/IHNlY29uZHNFbGFwc2VkRm9ybWF0dGVkXG4gICAgICAgICAgICAgICAgOiBkdXJhdGlvbkZvcm1hdHRlZFxuICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlU2l6ZVRlbXBsYXRlPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tc2l6ZVwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZmlsZS1zaXplLWluZGljYXRvclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGZpbGVTaXplIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzdHJlYW0tdm9pY2UtcmVjb3JkaW5nLXdhdmViYXJcbiAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnQ/LndhdmVmb3JtX2RhdGEgJiYgYXR0YWNobWVudD8uZHVyYXRpb25cIlxuICAgICAgICAgIFt3YXZlRm9ybURhdGFdPVwiYXR0YWNobWVudD8ud2F2ZWZvcm1fZGF0YSB8fCBbXVwiXG4gICAgICAgICAgW2R1cmF0aW9uXT1cImF0dGFjaG1lbnQ/LmR1cmF0aW9uXCJcbiAgICAgICAgICBbYXVkaW9FbGVtZW50XT1cImF1ZGlvRWxlbWVudFwiXG4gICAgICAgID48L3N0cmVhbS12b2ljZS1yZWNvcmRpbmctd2F2ZWJhcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50X192b2ljZS1yZWNvcmRpbmctd2lkZ2V0X19yaWdodC1zZWN0aW9uXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiIWF1ZGlvRWxlbWVudD8ucGF1c2VkOyBlbHNlIGZpbGVJY29uXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2VfYXR0YWNobWVudF9fcGxheWJhY2stcmF0ZS1idXR0b25cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJwbGF5YmFjay1yYXRlLWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2V0UGxheWJhY2tSYXRlKClcIlxuICAgID5cbiAgICAgIHt7IGF1ZGlvRWxlbWVudD8ucGxheWJhY2tSYXRlIHwgbnVtYmVyOiBcIjEuMS0xXCIgfX14XG4gICAgPC9idXR0b24+XG4gICAgPG5nLXRlbXBsYXRlICNmaWxlSWNvbj5cbiAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICBpY29uPVwiYXVkaW8tZmlsZVwiXG4gICAgICAgIFtzaXplXT1cIjQwXCJcbiAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|