stream-chat-angular 6.4.1 → 7.0.0-rc.1
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/{esm2020 → esm2022}/assets/version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +232 -0
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/avatar/avatar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
- package/esm2022/lib/channel/channel.component.mjs +45 -0
- package/{esm2020 → esm2022}/lib/channel-header/channel-header.component.mjs +6 -6
- package/esm2022/lib/channel-list/channel-list.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/channel-preview/channel-preview.component.mjs +6 -6
- package/esm2022/lib/channel.service.mjs +1575 -0
- package/{esm2020 → esm2022}/lib/chat-client.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
- package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
- package/esm2022/lib/message/message.component.mjs +501 -0
- package/{esm2020 → esm2022}/lib/message-actions-box/message-actions-box.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-blocked/message-blocked.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/message-input.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/esm2022/lib/message-list/message-list.component.mjs +717 -0
- package/{esm2020 → esm2022}/lib/message-reactions/message-reactions.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-reactions-selector/message-reactions-selector.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/modal/stream-modal.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/notification-list/notification-list.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/notification-list/stream-notification.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/paginated-list/paginated-list.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/paginated-list/stream-paginated-list.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/base-poll.component.mjs +5 -5
- package/esm2022/lib/polls/poll/poll.component.mjs +34 -0
- package/{esm2020 → esm2022}/lib/polls/poll-actions/add-option/add-option.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-actions.component.mjs +6 -6
- package/esm2022/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +82 -0
- package/esm2022/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +63 -0
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-actions/upsert-answer/upsert-answer.component.mjs +4 -4
- package/esm2022/lib/polls/poll-composer/poll-composer.component.mjs +134 -0
- package/{esm2020 → esm2022}/lib/polls/poll-header/poll-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/poll-option-selector/poll-option-selector.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-options-list/poll-options-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/polls/poll-preview/poll-preview.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/polls/stream-polls.module.mjs +41 -41
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +67 -67
- package/esm2022/lib/stream-i18n.service.mjs +34 -0
- package/esm2022/lib/stream-textarea.module.mjs +31 -0
- package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/transcoder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +463 -470
- package/fesm2022/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-list/attachment-list.component.d.ts +1 -1
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/avatar/avatar.component.d.ts +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
- package/lib/channel-preview/channel-preview.component.d.ts +1 -1
- package/lib/chat-client.service.d.ts +1 -1
- package/lib/custom-templates.service.d.ts +1 -0
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/message/message.component.d.ts +1 -1
- package/lib/message-actions-box/message-actions-box.component.d.ts +1 -1
- package/lib/message-blocked/message-blocked.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 +1 -1
- 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 +1 -1
- package/lib/message-reactions/message-reactions.component.d.ts +1 -1
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -1
- package/lib/message-text/message-text.component.d.ts +2 -2
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/paginated-list/paginated-list.component.d.ts +5 -2
- package/lib/polls/base-poll.component.d.ts +1 -1
- package/lib/polls/poll-actions/add-option/add-option.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-actions.component.d.ts +2 -2
- package/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.d.ts +1 -1
- package/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.d.ts +1 -1
- package/lib/polls/poll-actions/upsert-answer/upsert-answer.component.d.ts +1 -1
- package/lib/polls/poll-composer/poll-composer.component.d.ts +2 -2
- package/lib/polls/poll-header/poll-header.component.d.ts +1 -1
- package/lib/polls/poll-option-selector/poll-option-selector.component.d.ts +1 -1
- package/lib/polls/poll-options-list/poll-options-list.component.d.ts +1 -1
- package/lib/types.d.ts +79 -79
- package/lib/user-list/user-list.component.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder.component.d.ts +1 -1
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +1 -1
- package/lib/voice-recording/voice-recording.component.d.ts +1 -1
- package/package.json +11 -17
- package/src/assets/version.ts +1 -1
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -232
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2020/lib/channel/channel.component.mjs +0 -45
- package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
- package/esm2020/lib/channel.service.mjs +0 -1575
- package/esm2020/lib/message/message.component.mjs +0 -501
- package/esm2020/lib/message-list/message-list.component.mjs +0 -717
- package/esm2020/lib/polls/poll/poll.component.mjs +0 -34
- package/esm2020/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +0 -82
- package/esm2020/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +0 -63
- package/esm2020/lib/polls/poll-composer/poll-composer.component.mjs +0 -134
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2020/lib/stream-i18n.service.mjs +0 -41
- package/esm2020/lib/stream-textarea.module.mjs +0 -31
- package/fesm2015/stream-chat-angular.mjs +0 -10596
- package/fesm2015/stream-chat-angular.mjs.map +0 -1
- package/fesm2020/stream-chat-angular.mjs.map +0 -1
- /package/{esm2020 → esm2022}/assets/i18n/en.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/channel-query.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/file-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/get-message-translation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/list-users.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-preview.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/parse-date.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/polls/poll-composer/validators.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/polls/unique.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/read-by.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/types-custom.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/virtualized-list.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/voice-recorder/mp3-transcoder.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
- /package/{esm2020 → esm2022}/stream-chat.mjs +0 -0
package/assets/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "
|
|
1
|
+
export declare const version = "7.0.0-rc.1";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export const version = '7.0.0-rc.1';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2Fzc2V0cy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdmVyc2lvbiA9ICc3LjAuMC1yYy4xJztcbiJdfQ==
|
|
@@ -170,13 +170,13 @@ export class AttachmentConfigurationService {
|
|
|
170
170
|
getValueRepresentationOfCSSProperty(property) {
|
|
171
171
|
return Number(property.replace('px', '')) || undefined;
|
|
172
172
|
}
|
|
173
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
174
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentConfigurationService, providedIn: 'root' }); }
|
|
173
175
|
}
|
|
174
|
-
|
|
175
|
-
AttachmentConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentConfigurationService, providedIn: 'root' });
|
|
176
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentConfigurationService, decorators: [{
|
|
176
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentConfigurationService, decorators: [{
|
|
177
177
|
type: Injectable,
|
|
178
178
|
args: [{
|
|
179
179
|
providedIn: 'root',
|
|
180
180
|
}]
|
|
181
181
|
}] });
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFRM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sOEJBQThCO0lBSDNDO1FBK0JFOztXQUVHO1FBQ0gsaUNBQTRCLEdBQUcsSUFBSSxDQUFDO0tBOE9yQztJQTVPQzs7Ozs7T0FLRztJQUNILCtCQUErQixDQUM3QixVQUFzQixFQUN0QixRQUEyQyxFQUMzQyxPQUFvQjtRQUVwQixJQUFJLElBQUksQ0FBQyx5Q0FBeUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyx5Q0FBeUMsQ0FDbkQsVUFBVSxFQUNWLFFBQVEsRUFDUixPQUFPLENBQ1IsQ0FBQztTQUNIO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQ2IsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQzNFLElBQUksR0FBUSxDQUFDO1FBQ2IsSUFBSTtZQUNGLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTztnQkFDTCxHQUFHLEVBQUUsU0FBUztnQkFDZCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxNQUFNLEVBQUUsRUFBRTtnQkFDVixjQUFjLEVBQUUsd0JBQXdCO2dCQUN4QyxhQUFhLEVBQUUsd0JBQXdCO2FBQ3hDLENBQUM7U0FDSDtRQUNELE1BQU0sY0FBYyxHQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVks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LElBQUksU0FBUyxDQUFDO0lBQ3pELENBQUM7OzJIQTVRVSw4QkFBOEI7K0hBQTlCLDhCQUE4QixjQUY3QixNQUFNOzJGQUVQLDhCQUE4QjtrQkFIMUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudENvbmZpZ3JhdGlvbixcbiAgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbixcbiAgVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2VgIHByb3ZpZGVzIGN1c3RvbWl6YXRpb24gZm9yIGNlcnRhaW4gYXR0cmlidXRlcyBvZiBhdHRhY2htZW50cyBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBtZXNzYWdlIGNvbXBvbmVudC4gSWYgeW91J3JlIHVzaW5nIHlvdXIgb3duIENETiwgeW91IGNhbiBpbnRlZ3JhdGUgcmVzaXppbmcgZmVhdHVyZXMgb2YgaXQgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGhhbmRsZXJzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGhhbmRsZXIgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIGF0dGFjaG1lbnQgKGltYWdlcyB1cGxvYWRlZCBmcm9tIGZpbGVzKSBjb25maWd1cmF0aW9uLiBCeSBkZWZhdWx0IHRoZSBTREsgdXNlcyBmaXhlZCBpbWFnZSBoZWlnaHQgKGEgc2l6ZSB0aGF0J3Mga25vd24gYmVmb3JlIGltYWdlIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBpbWFnZSBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudCxcbiAgICB0eXBlOiAnZ2FsbGVyeScgfCAnc2luZ2xlJyB8ICdjYXJvdXNlbCcsXG4gICAgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKSA9PiBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogQSBjdXN0b20gaGFuZGxlciBjYW4gYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlkZW8gYXR0YWNobWVudCAodmlkZW9zIHVwbG9hZGVkIGZyb20gZmlsZXMpIGNvbmZpZ3VyYXRpb24uIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGZpeGVkIGhlaWdodCAoYSBzaXplIHRoYXQncyBrbm93biBiZWZvcmUgdmlkZW8gaXMgbG9hZGVkKSwgaWYgeW91IG92ZXJyaWRlIHRoYXQgd2l0aCBkeW5hbWljIGhlaWdodCAoZm9yIGV4YW1wbGU6IGhlaWdodDogMTAwJSkgdGhlIHNjcm9sbGluZyBsb2dpYyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCBjYW4gYnJlYWsuXG4gICAqL1xuICBjdXN0b21WaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcj86IChcbiAgICBhOiBBdHRhY2htZW50LFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkgPT4gVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGhhbmRsZXIgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdpcGh5IGF0dGFjaG1lbnQgKEdJRnMgc2VudCB3aXRoIHRoZSAvZ2lwaHkgY29tbWFuZCkgY29uZmlndXJhdGlvbi4gQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgZml4ZWQgaGVpZ2h0IChhIHNpemUgdGhhdCdzIGtub3duIGJlZm9yZSB0aGUgR0lGIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudFxuICApID0+IEF0dGFjaG1lbnRDb25maWdyYXRpb247XG4gIC8qKlxuICAgKiBBIGN1c3RvbSBoYW5kbGVyIGNhbiBiZSBwcm92aWRlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzY3JhcGVkIGltYWdlIGF0dGFjaG1lbnQgKGltYWdlcyBmb3VuZCBpbiBsaW5rcyBpbnNpZGUgbWVzc2FnZXMpIGNvbmZpZ3VyYXRpb24uIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGZpeGVkIGhlaWdodCAoYSBzaXplIHRoYXQncyBrbm93biBiZWZvcmUgaW1hZ2UgaXMgbG9hZGVkKSwgaWYgeW91IG92ZXJyaWRlIHRoYXQgd2l0aCBkeW5hbWljIGhlaWdodCAoZm9yIGV4YW1wbGU6IGhlaWdodDogMTAwJSkgdGhlIHNjcm9sbGluZyBsb2dpYyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCBjYW4gYnJlYWsuXG4gICAqL1xuICBjdXN0b21TY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudFxuICApID0+IEF0dGFjaG1lbnRDb25maWdyYXRpb247XG4gIC8qKlxuICAgKiBZb3UgY2FuIHR1cm4gb24vb2ZmIHRodW1ibmFpbCBnZW5lcmF0aW9uIGZvciB2aWRlbyBhdHRhY2htZW50c1xuICAgKi9cbiAgc2hvdWxkR2VuZXJhdGVWaWRlb1RodW1ibmFpbCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGltYWdlIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiBTcGVjaWZpZXMgd2hlcmUgdGhlIGltYWdlIGlzIGJlaW5nIGRpc3BsYXllZFxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZGVmYXVsdCByZXNpemluZyBsb2dpY3MgcmVhZHMgdGhlIGhlaWdodC9tYXgtaGVpZ2h0IGFuZCBtYXgtd2lkdGggcHJvcHBlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGFuZCByZWR1Y2VzIGZpbGUgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdmFsdWVzLiBGaWxlIHNpemUgcmVkdWN0aW9uIGlzIGRvbmUgYnkgU3RyZWFtJ3MgQ0ROLlxuICAgKi9cbiAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50LFxuICAgIGxvY2F0aW9uOiAnZ2FsbGVyeScgfCAnc2luZ2xlJyB8ICdjYXJvdXNlbCcsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgZWxlbWVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb24gPSAxMDAwMDAwO1xuICAgIGNvbnN0IHVybFN0cmluZyA9XG4gICAgICBhdHRhY2htZW50LmltZ191cmwgfHwgYXR0YWNobWVudC50aHVtYl91cmwgfHwgYXR0YWNobWVudC5pbWFnZV91cmwgfHwgJyc7XG4gICAgbGV0IHVybDogVVJMO1xuICAgIHRyeSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogdXJsU3RyaW5nLFxuICAgICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICAgIGhlaWdodDogJycsIC8vIFNldCBmcm9tIENTU1xuICAgICAgICBvcmlnaW5hbEhlaWdodDogZGVmYXVsdE9yaWdpbmFsRGltZW5zaW9uLFxuICAgICAgICBvcmlnaW5hbFdpZHRoOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb2gnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb3cnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3QgZGlzcGxheVdhcm5pbmcgPSBsb2NhdGlvbiA9PT0gJ2dhbGxlcnknIHx8IGxvY2F0aW9uID09PSAnc2luZ2xlJztcbiAgICBjb25zdCBzaXplUmVzdHJpY3Rpb24gPSB0aGlzLmdldFNpemluZ1Jlc3RyaWN0aW9ucyhcbiAgICAgIHVybCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBkaXNwbGF5V2FybmluZ1xuICAgICk7XG5cbiAgICBpZiAoc2l6ZVJlc3RyaWN0aW9uKSB7XG4gICAgICAvLyBBcHBseSAyeCBmb3IgcmV0aW5hIGRpc3BsYXlzXG4gICAgICBzaXplUmVzdHJpY3Rpb24uaGVpZ2h0ICo9IDI7XG4gICAgICBzaXplUmVzdHJpY3Rpb24ud2lkdGggKj0gMjtcbiAgICAgIHRoaXMuYWRkUmVzaXppbmdQYXJhbXNUb1VybChzaXplUmVzdHJpY3Rpb24sIHVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogdXJsLmhyZWYsXG4gICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICBoZWlnaHQ6ICcnLCAvLyBTZXQgZnJvbSBDU1NcbiAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHZpZGVvIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBkZWZhdWx0IHJlc2l6aW5nIGxvZ2ljcyByZWFkcyB0aGUgaGVpZ2h0L21heC1oZWlnaHQgYW5kIG1heC13aWR0aCBwcm9wcGVydGllcyBvZiB0aGlzIGVsZW1lbnQgYW5kIHJlZHVjZXMgZmlsZSBzaXplIGJhc2VkIG9uIHRoZSBnaXZlbiB2YWx1ZXMuIEZpbGUgc2l6ZSByZWR1Y3Rpb24gaXMgZG9uZSBieSBTdHJlYW0ncyBDRE4uXG4gICAqL1xuICBnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbVZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICBlbGVtZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB0aHVtYlVybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBvcmlnaW5hbEhlaWdodCA9IDEwMDAwMDA7XG4gICAgbGV0IG9yaWdpbmFsV2lkdGggPSAxMDAwMDAwO1xuICAgIGlmIChhdHRhY2htZW50LnRodW1iX3VybCAmJiB0aGlzLnNob3VsZEdlbmVyYXRlVmlkZW9UaHVtYm5haWwpIHtcbiAgICAgIGxldCB1cmw6IFVSTDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVybCA9IG5ldyBVUkwoYXR0YWNobWVudC50aHVtYl91cmwpO1xuXG4gICAgICAgIG9yaWdpbmFsSGVpZ2h0ID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsSGVpZ2h0O1xuICAgICAgICBvcmlnaW5hbFdpZHRoID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZVJlc3RyaWN0aW9uID0gdGhpcy5nZXRTaXppbmdSZXN0cmljdGlvbnMoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgZGlzcGxheVdhcm5pbmdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNpemVSZXN0cmljdGlvbikge1xuICAgICAgICAgIHNpemVSZXN0cmljdGlvbi5oZWlnaHQgKj0gMjtcbiAgICAgICAgICBzaXplUmVzdHJpY3Rpb24ud2lkdGggKj0gMjtcbiAgICAgICAgICB0aGlzLmFkZFJlc2l6aW5nUGFyYW1zVG9Vcmwoc2l6ZVJlc3RyaWN0aW9uLCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHRodW1iVXJsID0gdXJsLmhyZWY7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGh1bWJVcmwgPSBhdHRhY2htZW50LnRodW1iX3VybDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogYXR0YWNobWVudC5hc3NldF91cmwgfHwgJycsXG4gICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICBoZWlnaHQ6ICcnLCAvLyBTZXQgZnJvbSBDU1NcbiAgICAgIHRodW1iVXJsOiB0aHVtYlVybCxcbiAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGdpcGh5IGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqL1xuICBnZXRHaXBoeUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRcbiAgKTogQXR0YWNobWVudENvbmZpZ3JhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUdpcGh5QXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKGF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGdpcGh5ID0gYXR0YWNobWVudC5naXBoeT8uZml4ZWRfaGVpZ2h0X2Rvd25zYW1wbGVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogZ2lwaHk/LnVybCB8fCBhdHRhY2htZW50LmltYWdlX3VybCB8fCBhdHRhY2htZW50LnRodW1iX3VybCB8fCAnJyxcbiAgICAgIGhlaWdodDogZ2lwaHk/LmhlaWdodCA/IGAke2dpcGh5Py5oZWlnaHR9cHhgIDogJzMwMHB4JyxcbiAgICAgIHdpZHRoOiBnaXBoeT8ud2lkdGggPyBgJHtnaXBoeT8ud2lkdGh9cHhgIDogJycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb25maWd1cmF0aW9uIGZvciBzY3JhcGVkIGltYWdlIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqL1xuICBnZXRTY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50XG4gICk6IEF0dGFjaG1lbnRDb25maWdyYXRpb24ge1xuICAgIGlmICh0aGlzLmN1c3RvbVNjcmFwZWRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tU2NyYXBlZEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKGF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8IGF0dGFjaG1lbnQudGh1bWJfdXJsIHx8ICcnLFxuICAgICAgd2lkdGg6ICcnLFxuICAgICAgaGVpZ2h0OiAnJywgLy8gU2V0IGZyb20gQ1NTXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVzaXppbmdQYXJhbXNUb1VybChcbiAgICBzaXplUmVzdHJpY3Rpb246IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICB1cmw6IFVSTFxuICApIHtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnaCcsIHNpemVSZXN0cmljdGlvbi5oZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3cnLCBzaXplUmVzdHJpY3Rpb24ud2lkdGgudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNpemluZ1Jlc3RyaWN0aW9ucyhcbiAgICB1cmw6IFVSTCxcbiAgICBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgZGlzcGxheVdhcm5pbmcgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuICAgIGNvbnN0IG9yaWdpbmFsSGVpZ2h0ID0gTnVtYmVyKHVybFBhcmFtcy5nZXQoJ29oJykpIHx8IDE7XG4gICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IE51bWJlcih1cmxQYXJhbXMuZ2V0KCdvdycpKSB8fCAxO1xuICAgIGNvbnN0IGNzc1NpemVSZXN0cmljdGlvbiA9IHRoaXMuZ2V0Q1NTU2l6ZVJlc3RyaWN0aW9uKGh0bWxFbGVtZW50KTtcbiAgICBsZXQgc2l6ZVJlc3RyaWN0aW9uOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoXG4gICAgICAoY3NzU2l6ZVJlc3RyaWN0aW9uLm1heEhlaWdodCB8fCBjc3NTaXplUmVzdHJpY3Rpb24uaGVpZ2h0KSAmJlxuICAgICAgY3NzU2l6ZVJlc3RyaWN0aW9uLm1heFdpZHRoXG4gICAgKSB7XG4gICAgICBzaXplUmVzdHJpY3Rpb24gPSB0aGlzLmdldFNpemVSZXN0cmljdGlvbnMoXG4gICAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICBvcmlnaW5hbFdpZHRoLFxuICAgICAgICAoY3NzU2l6ZVJlc3RyaWN0aW9uLm1heEhlaWdodCB8fCBjc3NTaXplUmVzdHJpY3Rpb24uaGVpZ2h0KSEsXG4gICAgICAgIGNzc1NpemVSZXN0cmljdGlvbi5tYXhXaWR0aFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2l6ZVJlc3RyaWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpc3BsYXlXYXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBzZXQgZm9yIGhlaWdodC9tYXgtaGVpZ2h0IGFuZC9vciBtYXgtd2lkdGggZm9yIEhUTUwgZWxlbWVudCwgdGhpcyBjYW4gY2F1c2Ugc2Nyb2xsaW5nIGlzc3VlcyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCwgbW9yZSBpbmZvIGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9jb21wb25lbnRzL0F0dGFjaG1lbnRMaXN0Q29tcG9uZW50LyNpbWFnZS1hbmQtdmlkZW8tc2l6aW5nLCBhdHRhY2htZW50IFVSTDogJHt1cmwudG9TdHJpbmcoKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemVSZXN0cmljdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2l6ZVJlc3RyaWN0aW9ucyhcbiAgICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuICAgIG9yaWdpbmFsV2lkdGg6IG51bWJlcixcbiAgICBtYXhIZWlnaHQ6IG51bWJlcixcbiAgICBtYXhXaWR0aDogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IE1hdGgucm91bmQoXG4gICAgICAgIE1hdGgubWF4KG1heEhlaWdodCwgKG1heFdpZHRoIC8gb3JpZ2luYWxXaWR0aCkgKiBvcmlnaW5hbEhlaWdodClcbiAgICAgICksXG4gICAgICB3aWR0aDogTWF0aC5yb3VuZChcbiAgICAgICAgTWF0aC5tYXgobWF4SGVpZ2h0LCAobWF4V2lkdGggLyBvcmlnaW5hbEhlaWdodCkgKiBvcmlnaW5hbFdpZHRoKVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDU1NTaXplUmVzdHJpY3Rpb24oaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZXNoZWV0ID0gZ2V0Q29tcHV0ZWRTdHlsZShodG1sRWxlbWVudCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKVxuICAgICk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdtYXgtaGVpZ2h0JylcbiAgICApO1xuICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdtYXgtd2lkdGgnKVxuICAgICk7XG5cbiAgICByZXR1cm4geyBoZWlnaHQsIG1heEhlaWdodCwgbWF4V2lkdGggfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVSZXByZXNlbnRhdGlvbk9mQ1NTUHJvcGVydHkocHJvcGVydHk6IHN0cmluZykge1xuICAgIHJldHVybiBOdW1iZXIocHJvcGVydHkucmVwbGFjZSgncHgnLCAnJykpIHx8IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvYXR0YWNobWVudC1jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFRM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sOEJBQThCO0lBSDNDO1FBK0JFOztXQUVHO1FBQ0gsaUNBQTRCLEdBQUcsSUFBSSxDQUFDO0tBOE9yQztJQTVPQzs7Ozs7T0FLRztJQUNILCtCQUErQixDQUM3QixVQUFzQixFQUN0QixRQUEyQyxFQUMzQyxPQUFvQjtRQUVwQixJQUFJLElBQUksQ0FBQyx5Q0FBeUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyx5Q0FBeUMsQ0FDbkQsVUFBVSxFQUNWLFFBQVEsRUFDUixPQUFPLENBQ1IsQ0FBQztTQUNIO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQ2IsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQzNFLElBQUksR0FBUSxDQUFDO1FBQ2IsSUFBSTtZQUNGLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTztnQkFDTCxHQUFHLEVBQUUsU0FBUztnQkFDZCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxNQUFNLEVBQUUsRUFBRTtnQkFDVixjQUFjLEVBQUUsd0JBQXdCO2dCQUN4QyxhQUFhLEVBQUUsd0JBQXdCO2FBQ3hDLENBQUM7U0FDSDtRQUNELE1BQU0sY0FBYyxHQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVks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LElBQUksU0FBUyxDQUFDO0lBQ3pELENBQUM7K0dBNVFVLDhCQUE4QjttSEFBOUIsOEJBQThCLGNBRjdCLE1BQU07OzRGQUVQLDhCQUE4QjtrQkFIMUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudENvbmZpZ3JhdGlvbixcbiAgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbixcbiAgVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2VgIHByb3ZpZGVzIGN1c3RvbWl6YXRpb24gZm9yIGNlcnRhaW4gYXR0cmlidXRlcyBvZiBhdHRhY2htZW50cyBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBtZXNzYWdlIGNvbXBvbmVudC4gSWYgeW91J3JlIHVzaW5nIHlvdXIgb3duIENETiwgeW91IGNhbiBpbnRlZ3JhdGUgcmVzaXppbmcgZmVhdHVyZXMgb2YgaXQgYnkgcHJvdmlkaW5nIHlvdXIgb3duIGhhbmRsZXJzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGhhbmRsZXIgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIGF0dGFjaG1lbnQgKGltYWdlcyB1cGxvYWRlZCBmcm9tIGZpbGVzKSBjb25maWd1cmF0aW9uLiBCeSBkZWZhdWx0IHRoZSBTREsgdXNlcyBmaXhlZCBpbWFnZSBoZWlnaHQgKGEgc2l6ZSB0aGF0J3Mga25vd24gYmVmb3JlIGltYWdlIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBpbWFnZSBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudCxcbiAgICB0eXBlOiAnZ2FsbGVyeScgfCAnc2luZ2xlJyB8ICdjYXJvdXNlbCcsXG4gICAgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKSA9PiBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogQSBjdXN0b20gaGFuZGxlciBjYW4gYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlkZW8gYXR0YWNobWVudCAodmlkZW9zIHVwbG9hZGVkIGZyb20gZmlsZXMpIGNvbmZpZ3VyYXRpb24uIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGZpeGVkIGhlaWdodCAoYSBzaXplIHRoYXQncyBrbm93biBiZWZvcmUgdmlkZW8gaXMgbG9hZGVkKSwgaWYgeW91IG92ZXJyaWRlIHRoYXQgd2l0aCBkeW5hbWljIGhlaWdodCAoZm9yIGV4YW1wbGU6IGhlaWdodDogMTAwJSkgdGhlIHNjcm9sbGluZyBsb2dpYyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCBjYW4gYnJlYWsuXG4gICAqL1xuICBjdXN0b21WaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcj86IChcbiAgICBhOiBBdHRhY2htZW50LFxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkgPT4gVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGhhbmRsZXIgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdpcGh5IGF0dGFjaG1lbnQgKEdJRnMgc2VudCB3aXRoIHRoZSAvZ2lwaHkgY29tbWFuZCkgY29uZmlndXJhdGlvbi4gQnkgZGVmYXVsdCB0aGUgU0RLIHVzZXMgZml4ZWQgaGVpZ2h0IChhIHNpemUgdGhhdCdzIGtub3duIGJlZm9yZSB0aGUgR0lGIGlzIGxvYWRlZCksIGlmIHlvdSBvdmVycmlkZSB0aGF0IHdpdGggZHluYW1pYyBoZWlnaHQgKGZvciBleGFtcGxlOiBoZWlnaHQ6IDEwMCUpIHRoZSBzY3JvbGxpbmcgbG9naWMgaW5zaWRlIHRoZSBtZXNzYWdlIGxpc3QgY2FuIGJyZWFrLlxuICAgKi9cbiAgY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudFxuICApID0+IEF0dGFjaG1lbnRDb25maWdyYXRpb247XG4gIC8qKlxuICAgKiBBIGN1c3RvbSBoYW5kbGVyIGNhbiBiZSBwcm92aWRlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzY3JhcGVkIGltYWdlIGF0dGFjaG1lbnQgKGltYWdlcyBmb3VuZCBpbiBsaW5rcyBpbnNpZGUgbWVzc2FnZXMpIGNvbmZpZ3VyYXRpb24uIEJ5IGRlZmF1bHQgdGhlIFNESyB1c2VzIGZpeGVkIGhlaWdodCAoYSBzaXplIHRoYXQncyBrbm93biBiZWZvcmUgaW1hZ2UgaXMgbG9hZGVkKSwgaWYgeW91IG92ZXJyaWRlIHRoYXQgd2l0aCBkeW5hbWljIGhlaWdodCAoZm9yIGV4YW1wbGU6IGhlaWdodDogMTAwJSkgdGhlIHNjcm9sbGluZyBsb2dpYyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCBjYW4gYnJlYWsuXG4gICAqL1xuICBjdXN0b21TY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXI/OiAoXG4gICAgYTogQXR0YWNobWVudFxuICApID0+IEF0dGFjaG1lbnRDb25maWdyYXRpb247XG4gIC8qKlxuICAgKiBZb3UgY2FuIHR1cm4gb24vb2ZmIHRodW1ibmFpbCBnZW5lcmF0aW9uIGZvciB2aWRlbyBhdHRhY2htZW50c1xuICAgKi9cbiAgc2hvdWxkR2VuZXJhdGVWaWRlb1RodW1ibmFpbCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGltYWdlIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiBTcGVjaWZpZXMgd2hlcmUgdGhlIGltYWdlIGlzIGJlaW5nIGRpc3BsYXllZFxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZGVmYXVsdCByZXNpemluZyBsb2dpY3MgcmVhZHMgdGhlIGhlaWdodC9tYXgtaGVpZ2h0IGFuZCBtYXgtd2lkdGggcHJvcHBlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGFuZCByZWR1Y2VzIGZpbGUgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdmFsdWVzLiBGaWxlIHNpemUgcmVkdWN0aW9uIGlzIGRvbmUgYnkgU3RyZWFtJ3MgQ0ROLlxuICAgKi9cbiAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50LFxuICAgIGxvY2F0aW9uOiAnZ2FsbGVyeScgfCAnc2luZ2xlJyB8ICdjYXJvdXNlbCcsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgZWxlbWVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb24gPSAxMDAwMDAwO1xuICAgIGNvbnN0IHVybFN0cmluZyA9XG4gICAgICBhdHRhY2htZW50LmltZ191cmwgfHwgYXR0YWNobWVudC50aHVtYl91cmwgfHwgYXR0YWNobWVudC5pbWFnZV91cmwgfHwgJyc7XG4gICAgbGV0IHVybDogVVJMO1xuICAgIHRyeSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogdXJsU3RyaW5nLFxuICAgICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICAgIGhlaWdodDogJycsIC8vIFNldCBmcm9tIENTU1xuICAgICAgICBvcmlnaW5hbEhlaWdodDogZGVmYXVsdE9yaWdpbmFsRGltZW5zaW9uLFxuICAgICAgICBvcmlnaW5hbFdpZHRoOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb2gnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9XG4gICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICA/IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldCgnb3cnKSlcbiAgICAgICAgOiBkZWZhdWx0T3JpZ2luYWxEaW1lbnNpb247XG4gICAgY29uc3QgZGlzcGxheVdhcm5pbmcgPSBsb2NhdGlvbiA9PT0gJ2dhbGxlcnknIHx8IGxvY2F0aW9uID09PSAnc2luZ2xlJztcbiAgICBjb25zdCBzaXplUmVzdHJpY3Rpb24gPSB0aGlzLmdldFNpemluZ1Jlc3RyaWN0aW9ucyhcbiAgICAgIHVybCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBkaXNwbGF5V2FybmluZ1xuICAgICk7XG5cbiAgICBpZiAoc2l6ZVJlc3RyaWN0aW9uKSB7XG4gICAgICAvLyBBcHBseSAyeCBmb3IgcmV0aW5hIGRpc3BsYXlzXG4gICAgICBzaXplUmVzdHJpY3Rpb24uaGVpZ2h0ICo9IDI7XG4gICAgICBzaXplUmVzdHJpY3Rpb24ud2lkdGggKj0gMjtcbiAgICAgIHRoaXMuYWRkUmVzaXppbmdQYXJhbXNUb1VybChzaXplUmVzdHJpY3Rpb24sIHVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogdXJsLmhyZWYsXG4gICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICBoZWlnaHQ6ICcnLCAvLyBTZXQgZnJvbSBDU1NcbiAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHZpZGVvIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBkZWZhdWx0IHJlc2l6aW5nIGxvZ2ljcyByZWFkcyB0aGUgaGVpZ2h0L21heC1oZWlnaHQgYW5kIG1heC13aWR0aCBwcm9wcGVydGllcyBvZiB0aGlzIGVsZW1lbnQgYW5kIHJlZHVjZXMgZmlsZSBzaXplIGJhc2VkIG9uIHRoZSBnaXZlbiB2YWx1ZXMuIEZpbGUgc2l6ZSByZWR1Y3Rpb24gaXMgZG9uZSBieSBTdHJlYW0ncyBDRE4uXG4gICAqL1xuICBnZXRWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbVZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICBlbGVtZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB0aHVtYlVybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBvcmlnaW5hbEhlaWdodCA9IDEwMDAwMDA7XG4gICAgbGV0IG9yaWdpbmFsV2lkdGggPSAxMDAwMDAwO1xuICAgIGlmIChhdHRhY2htZW50LnRodW1iX3VybCAmJiB0aGlzLnNob3VsZEdlbmVyYXRlVmlkZW9UaHVtYm5haWwpIHtcbiAgICAgIGxldCB1cmw6IFVSTDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVybCA9IG5ldyBVUkwoYXR0YWNobWVudC50aHVtYl91cmwpO1xuXG4gICAgICAgIG9yaWdpbmFsSGVpZ2h0ID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ29oJykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsSGVpZ2h0O1xuICAgICAgICBvcmlnaW5hbFdpZHRoID1cbiAgICAgICAgICBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpID4gMVxuICAgICAgICAgICAgPyBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoJ293JykpXG4gICAgICAgICAgICA6IG9yaWdpbmFsV2lkdGg7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZVJlc3RyaWN0aW9uID0gdGhpcy5nZXRTaXppbmdSZXN0cmljdGlvbnMoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgZGlzcGxheVdhcm5pbmdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNpemVSZXN0cmljdGlvbikge1xuICAgICAgICAgIHNpemVSZXN0cmljdGlvbi5oZWlnaHQgKj0gMjtcbiAgICAgICAgICBzaXplUmVzdHJpY3Rpb24ud2lkdGggKj0gMjtcbiAgICAgICAgICB0aGlzLmFkZFJlc2l6aW5nUGFyYW1zVG9Vcmwoc2l6ZVJlc3RyaWN0aW9uLCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHRodW1iVXJsID0gdXJsLmhyZWY7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGh1bWJVcmwgPSBhdHRhY2htZW50LnRodW1iX3VybDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogYXR0YWNobWVudC5hc3NldF91cmwgfHwgJycsXG4gICAgICB3aWR0aDogJycsIC8vIE5vdCBzZXQgdG8gcmVzcGVjdCByZXNwb25zaXZlIHdpZHRoXG4gICAgICBoZWlnaHQ6ICcnLCAvLyBTZXQgZnJvbSBDU1NcbiAgICAgIHRodW1iVXJsOiB0aHVtYlVybCxcbiAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgb3JpZ2luYWxXaWR0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGdpcGh5IGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqL1xuICBnZXRHaXBoeUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRcbiAgKTogQXR0YWNobWVudENvbmZpZ3JhdGlvbiB7XG4gICAgaWYgKHRoaXMuY3VzdG9tR2lwaHlBdHRhY2htZW50Q29uZmlndXJhdGlvbkhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUdpcGh5QXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKGF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGdpcGh5ID0gYXR0YWNobWVudC5naXBoeT8uZml4ZWRfaGVpZ2h0X2Rvd25zYW1wbGVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogZ2lwaHk/LnVybCB8fCBhdHRhY2htZW50LmltYWdlX3VybCB8fCBhdHRhY2htZW50LnRodW1iX3VybCB8fCAnJyxcbiAgICAgIGhlaWdodDogZ2lwaHk/LmhlaWdodCA/IGAke2dpcGh5Py5oZWlnaHR9cHhgIDogJzMwMHB4JyxcbiAgICAgIHdpZHRoOiBnaXBoeT8ud2lkdGggPyBgJHtnaXBoeT8ud2lkdGh9cHhgIDogJycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb25maWd1cmF0aW9uIGZvciBzY3JhcGVkIGltYWdlIGF0dGFjaG1lbnRzLCBpdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgeW91ciBvd24gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9naWNcbiAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGF0dGFjaG1lbnQgdG8gY29uZmlndXJlXG4gICAqL1xuICBnZXRTY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50XG4gICk6IEF0dGFjaG1lbnRDb25maWdyYXRpb24ge1xuICAgIGlmICh0aGlzLmN1c3RvbVNjcmFwZWRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tU2NyYXBlZEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb25IYW5kbGVyKGF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8IGF0dGFjaG1lbnQudGh1bWJfdXJsIHx8ICcnLFxuICAgICAgd2lkdGg6ICcnLFxuICAgICAgaGVpZ2h0OiAnJywgLy8gU2V0IGZyb20gQ1NTXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVzaXppbmdQYXJhbXNUb1VybChcbiAgICBzaXplUmVzdHJpY3Rpb246IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICB1cmw6IFVSTFxuICApIHtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnaCcsIHNpemVSZXN0cmljdGlvbi5oZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3cnLCBzaXplUmVzdHJpY3Rpb24ud2lkdGgudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNpemluZ1Jlc3RyaWN0aW9ucyhcbiAgICB1cmw6IFVSTCxcbiAgICBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgZGlzcGxheVdhcm5pbmcgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuICAgIGNvbnN0IG9yaWdpbmFsSGVpZ2h0ID0gTnVtYmVyKHVybFBhcmFtcy5nZXQoJ29oJykpIHx8IDE7XG4gICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IE51bWJlcih1cmxQYXJhbXMuZ2V0KCdvdycpKSB8fCAxO1xuICAgIGNvbnN0IGNzc1NpemVSZXN0cmljdGlvbiA9IHRoaXMuZ2V0Q1NTU2l6ZVJlc3RyaWN0aW9uKGh0bWxFbGVtZW50KTtcbiAgICBsZXQgc2l6ZVJlc3RyaWN0aW9uOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoXG4gICAgICAoY3NzU2l6ZVJlc3RyaWN0aW9uLm1heEhlaWdodCB8fCBjc3NTaXplUmVzdHJpY3Rpb24uaGVpZ2h0KSAmJlxuICAgICAgY3NzU2l6ZVJlc3RyaWN0aW9uLm1heFdpZHRoXG4gICAgKSB7XG4gICAgICBzaXplUmVzdHJpY3Rpb24gPSB0aGlzLmdldFNpemVSZXN0cmljdGlvbnMoXG4gICAgICAgIG9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICBvcmlnaW5hbFdpZHRoLFxuICAgICAgICAoY3NzU2l6ZVJlc3RyaWN0aW9uLm1heEhlaWdodCB8fCBjc3NTaXplUmVzdHJpY3Rpb24uaGVpZ2h0KSEsXG4gICAgICAgIGNzc1NpemVSZXN0cmljdGlvbi5tYXhXaWR0aFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2l6ZVJlc3RyaWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpc3BsYXlXYXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBzZXQgZm9yIGhlaWdodC9tYXgtaGVpZ2h0IGFuZC9vciBtYXgtd2lkdGggZm9yIEhUTUwgZWxlbWVudCwgdGhpcyBjYW4gY2F1c2Ugc2Nyb2xsaW5nIGlzc3VlcyBpbnNpZGUgdGhlIG1lc3NhZ2UgbGlzdCwgbW9yZSBpbmZvIGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9jb21wb25lbnRzL0F0dGFjaG1lbnRMaXN0Q29tcG9uZW50LyNpbWFnZS1hbmQtdmlkZW8tc2l6aW5nLCBhdHRhY2htZW50IFVSTDogJHt1cmwudG9TdHJpbmcoKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemVSZXN0cmljdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2l6ZVJlc3RyaWN0aW9ucyhcbiAgICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuICAgIG9yaWdpbmFsV2lkdGg6IG51bWJlcixcbiAgICBtYXhIZWlnaHQ6IG51bWJlcixcbiAgICBtYXhXaWR0aDogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IE1hdGgucm91bmQoXG4gICAgICAgIE1hdGgubWF4KG1heEhlaWdodCwgKG1heFdpZHRoIC8gb3JpZ2luYWxXaWR0aCkgKiBvcmlnaW5hbEhlaWdodClcbiAgICAgICksXG4gICAgICB3aWR0aDogTWF0aC5yb3VuZChcbiAgICAgICAgTWF0aC5tYXgobWF4SGVpZ2h0LCAobWF4V2lkdGggLyBvcmlnaW5hbEhlaWdodCkgKiBvcmlnaW5hbFdpZHRoKVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDU1NTaXplUmVzdHJpY3Rpb24oaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZXNoZWV0ID0gZ2V0Q29tcHV0ZWRTdHlsZShodG1sRWxlbWVudCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKVxuICAgICk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdtYXgtaGVpZ2h0JylcbiAgICApO1xuICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5nZXRWYWx1ZVJlcHJlc2VudGF0aW9uT2ZDU1NQcm9wZXJ0eShcbiAgICAgIGNvbXB1dGVkU3R5bGVzaGVldC5nZXRQcm9wZXJ0eVZhbHVlKCdtYXgtd2lkdGgnKVxuICAgICk7XG5cbiAgICByZXR1cm4geyBoZWlnaHQsIG1heEhlaWdodCwgbWF4V2lkdGggfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVSZXByZXNlbnRhdGlvbk9mQ1NTUHJvcGVydHkocHJvcGVydHk6IHN0cmluZykge1xuICAgIHJldHVybiBOdW1iZXIocHJvcGVydHkucmVwbGFjZSgncHgnLCAnJykpIHx8IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import prettybytes from 'pretty-bytes';
|
|
3
|
+
import { isImageAttachment } from '../is-image-attachment';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../custom-templates.service";
|
|
6
|
+
import * as i2 from "../channel.service";
|
|
7
|
+
import * as i3 from "../attachment-configuration.service";
|
|
8
|
+
import * as i4 from "../message.service";
|
|
9
|
+
import * as i5 from "@angular/common";
|
|
10
|
+
import * as i6 from "../voice-recording/voice-recording.component";
|
|
11
|
+
import * as i7 from "../icon/icon-placeholder/icon-placeholder.component";
|
|
12
|
+
import * as i8 from "../modal/modal.component";
|
|
13
|
+
import * as i9 from "@ngx-translate/core";
|
|
14
|
+
/**
|
|
15
|
+
* The `AttachmentList` component displays the attachments of a message
|
|
16
|
+
*/
|
|
17
|
+
export class AttachmentListComponent {
|
|
18
|
+
constructor(customTemplatesService, channelService, attachmentConfigurationService, messageService) {
|
|
19
|
+
this.customTemplatesService = customTemplatesService;
|
|
20
|
+
this.channelService = channelService;
|
|
21
|
+
this.attachmentConfigurationService = attachmentConfigurationService;
|
|
22
|
+
this.messageService = messageService;
|
|
23
|
+
/**
|
|
24
|
+
* The attachments to display
|
|
25
|
+
*/
|
|
26
|
+
this.attachments = [];
|
|
27
|
+
/**
|
|
28
|
+
* Emits the state of the image carousel window
|
|
29
|
+
*/
|
|
30
|
+
this.imageModalStateChange = new EventEmitter();
|
|
31
|
+
this.class = 'str-chat__attachment-list-angular-host';
|
|
32
|
+
this.orderedAttachments = [];
|
|
33
|
+
this.customAttachments = [];
|
|
34
|
+
this.imagesToView = [];
|
|
35
|
+
this.imagesToViewCurrentIndex = 0;
|
|
36
|
+
this.attachmentConfigurations = new Map();
|
|
37
|
+
this.subscriptions = [];
|
|
38
|
+
this.trackByUrl = (_, attachment) => {
|
|
39
|
+
return this.isGalleryType(attachment)
|
|
40
|
+
? attachment.images.map(this.getAttachmentUrl).join(',')
|
|
41
|
+
: this.getAttachmentUrl(attachment);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.subscriptions.push(this.customTemplatesService.customAttachmentListTemplate$.subscribe((t) => (this.customAttachmentsTemplate = t)));
|
|
46
|
+
}
|
|
47
|
+
ngOnChanges(changes) {
|
|
48
|
+
if (changes.attachments) {
|
|
49
|
+
const builtInAttachments = [];
|
|
50
|
+
const customAttachments = [];
|
|
51
|
+
this.attachments.forEach((a) => {
|
|
52
|
+
if (this.messageService.isCustomAttachment(a)) {
|
|
53
|
+
customAttachments.push(a);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
builtInAttachments.push(a);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const images = builtInAttachments.filter(this.isImage);
|
|
60
|
+
const containsGallery = images.length >= 2;
|
|
61
|
+
this.orderedAttachments = [
|
|
62
|
+
...(containsGallery ? this.createGallery(images) : images),
|
|
63
|
+
...builtInAttachments.filter((a) => this.isVideo(a)),
|
|
64
|
+
...builtInAttachments.filter((a) => this.isVoiceMessage(a)),
|
|
65
|
+
...builtInAttachments.filter((a) => this.isFile(a)),
|
|
66
|
+
];
|
|
67
|
+
this.attachmentConfigurations = new Map();
|
|
68
|
+
// Display link attachments only if there are no other attachments
|
|
69
|
+
// Giphy-s always sent without other attachments
|
|
70
|
+
if (this.orderedAttachments.length === 0) {
|
|
71
|
+
this.orderedAttachments.push(...builtInAttachments.filter((a) => this.isCard(a)));
|
|
72
|
+
}
|
|
73
|
+
this.customAttachments = customAttachments;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ngOnDestroy() {
|
|
77
|
+
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
78
|
+
}
|
|
79
|
+
isImage(attachment) {
|
|
80
|
+
return isImageAttachment(attachment);
|
|
81
|
+
}
|
|
82
|
+
isSvg(attachment) {
|
|
83
|
+
const filename = attachment.fallback || '';
|
|
84
|
+
return !!filename.toLowerCase().endsWith('.svg');
|
|
85
|
+
}
|
|
86
|
+
isFile(attachment) {
|
|
87
|
+
return attachment.type === 'file';
|
|
88
|
+
}
|
|
89
|
+
isGallery(attachment) {
|
|
90
|
+
return attachment.type === 'gallery';
|
|
91
|
+
}
|
|
92
|
+
isVideo(attachment) {
|
|
93
|
+
return (attachment.type === 'video' &&
|
|
94
|
+
attachment.asset_url &&
|
|
95
|
+
!attachment.og_scrape_url);
|
|
96
|
+
}
|
|
97
|
+
isCard(attachment) {
|
|
98
|
+
return (!attachment.type ||
|
|
99
|
+
(attachment.type === 'image' && !this.isImage(attachment)) ||
|
|
100
|
+
attachment.type === 'giphy' ||
|
|
101
|
+
(attachment.type === 'video' && attachment.og_scrape_url));
|
|
102
|
+
}
|
|
103
|
+
isVoiceMessage(attachment) {
|
|
104
|
+
return attachment.type === 'voiceRecording';
|
|
105
|
+
}
|
|
106
|
+
hasFileSize(attachment) {
|
|
107
|
+
return (attachment.file_size && Number.isFinite(Number(attachment.file_size)));
|
|
108
|
+
}
|
|
109
|
+
getFileSize(attachment) {
|
|
110
|
+
return prettybytes(Number(attachment.file_size));
|
|
111
|
+
}
|
|
112
|
+
getModalContext() {
|
|
113
|
+
return {
|
|
114
|
+
isOpen: this.imagesToView && this.imagesToView.length > 0,
|
|
115
|
+
isOpenChangeHandler: (isOpen) => (isOpen ? null : this.closeImageModal()),
|
|
116
|
+
content: this.modalContent,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
trimUrl(url) {
|
|
120
|
+
if (url !== undefined && url !== null) {
|
|
121
|
+
const [trimmedUrl] = url
|
|
122
|
+
.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '')
|
|
123
|
+
.split('/');
|
|
124
|
+
return trimmedUrl;
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
sendAction(action) {
|
|
129
|
+
void this.channelService.sendAction(this.messageId, {
|
|
130
|
+
[action.name]: action.value,
|
|
131
|
+
}, this.parentMessageId);
|
|
132
|
+
}
|
|
133
|
+
trackByActionValue(_, item) {
|
|
134
|
+
return item.value;
|
|
135
|
+
}
|
|
136
|
+
openImageModal(attachments, selectedIndex = 0) {
|
|
137
|
+
this.imageModalStateChange.next('opened');
|
|
138
|
+
this.imagesToView = attachments;
|
|
139
|
+
this.imagesToViewCurrentIndex = selectedIndex;
|
|
140
|
+
}
|
|
141
|
+
stepImages(dir) {
|
|
142
|
+
this.imagesToViewCurrentIndex += dir * 1;
|
|
143
|
+
}
|
|
144
|
+
trackByImageUrl(_, item) {
|
|
145
|
+
return item.image_url || item.img_url || item.thumb_url;
|
|
146
|
+
}
|
|
147
|
+
getAttachmentContext(attachment) {
|
|
148
|
+
return { attachment };
|
|
149
|
+
}
|
|
150
|
+
getImageAttachmentConfiguration(attachment, type, element) {
|
|
151
|
+
const existingConfiguration = this.attachmentConfigurations.get(attachment);
|
|
152
|
+
if (existingConfiguration) {
|
|
153
|
+
return existingConfiguration;
|
|
154
|
+
}
|
|
155
|
+
const configuration = this.attachmentConfigurationService.getImageAttachmentConfiguration(attachment, type, element);
|
|
156
|
+
this.attachmentConfigurations.set(attachment, configuration);
|
|
157
|
+
return configuration;
|
|
158
|
+
}
|
|
159
|
+
getCarouselImageAttachmentConfiguration(attachment, element) {
|
|
160
|
+
return this.attachmentConfigurationService.getImageAttachmentConfiguration(attachment, 'carousel', element);
|
|
161
|
+
}
|
|
162
|
+
getVideoAttachmentConfiguration(attachment, element) {
|
|
163
|
+
const existingConfiguration = this.attachmentConfigurations.get(attachment);
|
|
164
|
+
if (existingConfiguration) {
|
|
165
|
+
return existingConfiguration;
|
|
166
|
+
}
|
|
167
|
+
const configuration = this.attachmentConfigurationService.getVideoAttachmentConfiguration(attachment, element);
|
|
168
|
+
this.attachmentConfigurations.set(attachment, configuration);
|
|
169
|
+
return configuration;
|
|
170
|
+
}
|
|
171
|
+
getCardAttachmentConfiguration(attachment) {
|
|
172
|
+
const existingConfiguration = this.attachmentConfigurations.get(attachment);
|
|
173
|
+
if (existingConfiguration) {
|
|
174
|
+
return existingConfiguration;
|
|
175
|
+
}
|
|
176
|
+
if (attachment.type === 'giphy') {
|
|
177
|
+
return this.attachmentConfigurationService.getGiphyAttachmentConfiguration(attachment);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const configuration = this.attachmentConfigurationService.getScrapedImageAttachmentConfiguration(attachment);
|
|
181
|
+
this.attachmentConfigurations.set(attachment, configuration);
|
|
182
|
+
return configuration;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
isGalleryType(attachment) {
|
|
186
|
+
return attachment.type === 'gallery';
|
|
187
|
+
}
|
|
188
|
+
get isImageModalPrevButtonVisible() {
|
|
189
|
+
return this.imagesToViewCurrentIndex !== 0;
|
|
190
|
+
}
|
|
191
|
+
get isImageModalNextButtonVisible() {
|
|
192
|
+
return this.imagesToViewCurrentIndex !== this.imagesToView.length - 1;
|
|
193
|
+
}
|
|
194
|
+
createGallery(images) {
|
|
195
|
+
return [
|
|
196
|
+
{
|
|
197
|
+
type: 'gallery',
|
|
198
|
+
images,
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
}
|
|
202
|
+
closeImageModal() {
|
|
203
|
+
this.imageModalStateChange.next('closed');
|
|
204
|
+
this.imagesToView = [];
|
|
205
|
+
}
|
|
206
|
+
getAttachmentUrl(attachment) {
|
|
207
|
+
return (attachment.image_url ||
|
|
208
|
+
attachment.img_url ||
|
|
209
|
+
attachment.asset_url ||
|
|
210
|
+
attachment.thumb_url);
|
|
211
|
+
}
|
|
212
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentListComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.ChannelService }, { token: i3.AttachmentConfigurationService }, { token: i4.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
213
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", parentMessageId: "parentMessageId", attachments: "attachments" }, outputs: { imageModalStateChange: "imageModalStateChange" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"\n orderedAttachments.length > 0 ||\n (customAttachments.length > 0 && customAttachmentsTemplate)\n \"\n class=\"str-chat__attachment-list\"\n>\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n />\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n />\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n />\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <a\n *ngIf=\"attachmentContext.type === 'video'; else cardImage\"\n [href]=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n target=\"_blank\"\n data-testclass=\"scraped-video\"\n >\n <ng-content *ngTemplateOutlet=\"cardImage\"></ng-content>\n <div\n class=\"str-chat__message-attachment-card--video-play\"\n ></div>\n <stream-icon-placeholder icon=\"play\" />\n </a>\n <ng-template #cardImage>\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </ng-template>\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"customAttachmentsTemplate\">\n <ng-template\n *ngTemplateOutlet=\"\n customAttachmentsTemplate;\n context: {\n messageId: messageId!,\n parentMessageId: parentMessageId,\n attachments: customAttachments\n }\n \"\n ></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n />\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n />\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\" />\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\" />\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.VoiceRecordingComponent, selector: "stream-voice-recording", inputs: ["attachment"] }, { kind: "component", type: i7.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i8.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }] }); }
|
|
214
|
+
}
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentListComponent, decorators: [{
|
|
216
|
+
type: Component,
|
|
217
|
+
args: [{ selector: 'stream-attachment-list', template: "<div\n *ngIf=\"\n orderedAttachments.length > 0 ||\n (customAttachments.length > 0 && customAttachmentsTemplate)\n \"\n class=\"str-chat__attachment-list\"\n>\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n />\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n />\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n />\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <a\n *ngIf=\"attachmentContext.type === 'video'; else cardImage\"\n [href]=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n target=\"_blank\"\n data-testclass=\"scraped-video\"\n >\n <ng-content *ngTemplateOutlet=\"cardImage\"></ng-content>\n <div\n class=\"str-chat__message-attachment-card--video-play\"\n ></div>\n <stream-icon-placeholder icon=\"play\" />\n </a>\n <ng-template #cardImage>\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </ng-template>\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n !isGalleryType(attachment) &&\n attachment.actions &&\n attachment.actions.length > 0\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n />\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"customAttachmentsTemplate\">\n <ng-template\n *ngTemplateOutlet=\"\n customAttachmentsTemplate;\n context: {\n messageId: messageId!,\n parentMessageId: parentMessageId,\n attachments: customAttachments\n }\n \"\n ></ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n />\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n />\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\" />\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\" />\n </button>\n </div>\n </div>\n</ng-template>\n" }]
|
|
218
|
+
}], ctorParameters: () => [{ type: i1.CustomTemplatesService }, { type: i2.ChannelService }, { type: i3.AttachmentConfigurationService }, { type: i4.MessageService }], propDecorators: { messageId: [{
|
|
219
|
+
type: Input
|
|
220
|
+
}], parentMessageId: [{
|
|
221
|
+
type: Input
|
|
222
|
+
}], attachments: [{
|
|
223
|
+
type: Input
|
|
224
|
+
}], imageModalStateChange: [{
|
|
225
|
+
type: Output
|
|
226
|
+
}], class: [{
|
|
227
|
+
type: HostBinding
|
|
228
|
+
}], modalContent: [{
|
|
229
|
+
type: ViewChild,
|
|
230
|
+
args: ['modalContent', { static: true }]
|
|
231
|
+
}] } });
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LWxpc3QvYXR0YWNobWVudC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQVd2QixPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7O0FBTzNEOztHQUVHO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQW1DbEMsWUFDa0Isc0JBQThDLEVBQ3RELGNBQThCLEVBQzlCLDhCQUE4RCxFQUM5RCxjQUE4QjtRQUh0QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3RELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQ0FBOEIsR0FBOUIsOEJBQThCLENBQWdDO1FBQzlELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTlCeEM7O1dBRUc7UUFDTSxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDeEM7O1dBRUc7UUFDZ0IsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBRXhELENBQUM7UUFDVyxVQUFLLEdBQUcsd0NBQXdDLENBQUM7UUFDaEUsdUJBQWtCLEdBQXVDLEVBQUUsQ0FBQztRQUM1RCxzQkFBaUIsR0FBaUIsRUFBRSxDQUFDO1FBQ3JDLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztRQUNoQyw2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O0lBRUQsSUFBSSw2QkFBNkI7UUFDL0IsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLDZCQUE2QjtRQUMvQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFvQjtRQUN4QyxPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsTUFBTTthQUNQO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFVBQXNCO1FBQzdDLE9BQU8sQ0FDTCxVQUFVLENBQUMsU0FBUztZQUNwQixVQUFVLENBQUMsT0FBTztZQUNsQixVQUFVLENBQUMsU0FBUztZQUNwQixVQUFVLENBQUMsU0FBUyxDQUNyQixDQUFDO0lBQ0osQ0FBQzsrR0FuU1UsdUJBQXVCO21HQUF2Qix1QkFBdUIsaWFDdkNwQyx5Nm1CQW9pQkE7OzRGRDdmYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usd0JBQXdCO2tNQVF6QixTQUFTO3NCQUFqQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJYSxxQkFBcUI7c0JBQXZDLE1BQU07Z0JBR1EsS0FBSztzQkFBbkIsV0FBVztnQkFPSixZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBBdHRhY2htZW50IH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHtcbiAgTW9kYWxDb250ZXh0LFxuICBBdHRhY2htZW50Q29uZmlncmF0aW9uLFxuICBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uLFxuICBJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uLFxuICBBdHRhY2htZW50Q29udGV4dCxcbiAgQ3VzdG9tQXR0YWNobWVudExpc3RDb250ZXh0LFxuICBHYWxsZXJ5QXR0YWNobWVudCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHByZXR0eWJ5dGVzIGZyb20gJ3ByZXR0eS1ieXRlcyc7XG5pbXBvcnQgeyBpc0ltYWdlQXR0YWNobWVudCB9IGZyb20gJy4uL2lzLWltYWdlLWF0dGFjaG1lbnQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hdHRhY2htZW50LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYEF0dGFjaG1lbnRMaXN0YCBjb21wb25lbnQgZGlzcGxheXMgdGhlIGF0dGFjaG1lbnRzIG9mIGEgbWVzc2FnZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tYXR0YWNobWVudC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdGhlIGF0dGFjaG1lbnRzIGJlbG9uZyB0b1xuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IGlkIG9mIHRoZSBtZXNzYWdlIHRoZSBhdHRhY2htZW50cyBiZWxvbmcgdG9cbiAgICovXG4gIEBJbnB1dCgpIHBhcmVudE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGF0dGFjaG1lbnRzIHRvIGRpc3BsYXlcbiAgICovXG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gPSBbXTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzdGF0ZSBvZiB0aGUgaW1hZ2UgY2Fyb3VzZWwgd2luZG93XG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICAnb3BlbmVkJyB8ICdjbG9zZWQnXG4gID4oKTtcbiAgQEhvc3RCaW5kaW5nKCkgY2xhc3MgPSAnc3RyLWNoYXRfX2F0dGFjaG1lbnQtbGlzdC1hbmd1bGFyLWhvc3QnO1xuICBvcmRlcmVkQXR0YWNobWVudHM6IChBdHRhY2htZW50IHwgR2FsbGVyeUF0dGFjaG1lbnQpW10gPSBbXTtcbiAgY3VzdG9tQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICBpbWFnZXNUb1ZpZXc6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICBpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXggPSAwO1xuICBjdXN0b21BdHRhY2htZW50c1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q3VzdG9tQXR0YWNobWVudExpc3RDb250ZXh0PjtcbiAgQFZpZXdDaGlsZCgnbW9kYWxDb250ZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBtb2RhbENvbnRlbnQhOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgcHJpdmF0ZSBhdHRhY2htZW50Q29uZmlndXJhdGlvbnM6IE1hcDxcbiAgICBBdHRhY2htZW50LFxuICAgIHwgQXR0YWNobWVudENvbmZpZ3JhdGlvblxuICAgIHwgVmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvblxuICAgIHwgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvblxuICA+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdHRhY2htZW50Q29uZmlndXJhdGlvblNlcnZpY2U6IEF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICApIHt9XG5cbiAgdHJhY2tCeVVybCA9IChfOiBudW1iZXIsIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgfCBHYWxsZXJ5QXR0YWNobWVudCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmlzR2FsbGVyeVR5cGUoYXR0YWNobWVudClcbiAgICAgID8gYXR0YWNobWVudC5pbWFnZXMubWFwKHRoaXMuZ2V0QXR0YWNobWVudFVybCkuam9pbignLCcpXG4gICAgICA6IHRoaXMuZ2V0QXR0YWNobWVudFVybChhdHRhY2htZW50KTtcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5jdXN0b21BdHRhY2htZW50TGlzdFRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0KSA9PiAodGhpcy5jdXN0b21BdHRhY2htZW50c1RlbXBsYXRlID0gdClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBidWlsdEluQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgICAgY29uc3QgY3VzdG9tQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgICAgdGhpcy5hdHRhY2htZW50cy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VTZXJ2aWNlLmlzQ3VzdG9tQXR0YWNobWVudChhKSkge1xuICAgICAgICAgIGN1c3RvbUF0dGFjaG1lbnRzLnB1c2goYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbHRJbkF0dGFjaG1lbnRzLnB1c2goYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgaW1hZ2VzID0gYnVpbHRJbkF0dGFjaG1lbnRzLmZpbHRlcih0aGlzLmlzSW1hZ2UpO1xuICAgICAgY29uc3QgY29udGFpbnNHYWxsZXJ5ID0gaW1hZ2VzLmxlbmd0aCA+PSAyO1xuICAgICAgdGhpcy5vcmRlcmVkQXR0YWNobWVudHMgPSBbXG4gICAgICAgIC4uLihjb250YWluc0dhbGxlcnkgPyB0aGlzLmNyZWF0ZUdhbGxlcnkoaW1hZ2VzKSA6IGltYWdlcyksXG4gICAgICAgIC4uLmJ1aWx0SW5BdHRhY2htZW50cy5maWx0ZXIoKGEpID0+IHRoaXMuaXNWaWRlbyhhKSksXG4gICAgICAgIC4uLmJ1aWx0SW5BdHRhY2htZW50cy5maWx0ZXIoKGEpID0+IHRoaXMuaXNWb2ljZU1lc3NhZ2UoYSkpLFxuICAgICAgICAuLi5idWlsdEluQXR0YWNobWVudHMuZmlsdGVyKChhKSA9PiB0aGlzLmlzRmlsZShhKSksXG4gICAgICBdO1xuICAgICAgdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAvLyBEaXNwbGF5IGxpbmsgYXR0YWNobWVudHMgb25seSBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgYXR0YWNobWVudHNcbiAgICAgIC8vIEdpcGh5LXMgYWx3YXlzIHNlbnQgd2l0aG91dCBvdGhlciBhdHRhY2htZW50c1xuICAgICAgaWYgKHRoaXMub3JkZXJlZEF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLm9yZGVyZWRBdHRhY2htZW50cy5wdXNoKFxuICAgICAgICAgIC4uLmJ1aWx0SW5BdHRhY2htZW50cy5maWx0ZXIoKGEpID0+IHRoaXMuaXNDYXJkKGEpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXN0b21BdHRhY2htZW50cyA9IGN1c3RvbUF0dGFjaG1lbnRzO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgaXNJbWFnZShhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIGlzSW1hZ2VBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICB9XG5cbiAgaXNTdmcoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYXR0YWNobWVudC5mYWxsYmFjayB8fCAnJztcbiAgICByZXR1cm4gISFmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuc3ZnJyk7XG4gIH1cblxuICBpc0ZpbGUoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiBhdHRhY2htZW50LnR5cGUgPT09ICdmaWxlJztcbiAgfVxuXG4gIGlzR2FsbGVyeShhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnQudHlwZSA9PT0gJ2dhbGxlcnknO1xuICB9XG5cbiAgaXNWaWRlbyhhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF0dGFjaG1lbnQudHlwZSA9PT0gJ3ZpZGVvJyAmJlxuICAgICAgYXR0YWNobWVudC5hc3NldF91cmwgJiZcbiAgICAgICFhdHRhY2htZW50Lm9nX3NjcmFwZV91cmxcbiAgICApO1xuICB9XG5cbiAgaXNDYXJkKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWF0dGFjaG1lbnQudHlwZSB8fFxuICAgICAgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ltYWdlJyAmJiAhdGhpcy5pc0ltYWdlKGF0dGFjaG1lbnQpKSB8fFxuICAgICAgYXR0YWNobWVudC50eXBlID09PSAnZ2lwaHknIHx8XG4gICAgICAoYXR0YWNobWVudC50eXBlID09PSAndmlkZW8nICYmIGF0dGFjaG1lbnQub2dfc2NyYXBlX3VybClcbiAgICApO1xuICB9XG5cbiAgaXNWb2ljZU1lc3NhZ2UoYXR0YWNobWVudDogQXR0YWNobWVudCkge1xuICAgIHJldHVybiBhdHRhY2htZW50LnR5cGUgPT09ICd2b2ljZVJlY29yZGluZyc7XG4gIH1cblxuICBoYXNGaWxlU2l6ZShhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF0dGFjaG1lbnQuZmlsZV9zaXplICYmIE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYXR0YWNobWVudC5maWxlX3NpemUpKVxuICAgICk7XG4gIH1cblxuICBnZXRGaWxlU2l6ZShhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIHByZXR0eWJ5dGVzKE51bWJlcihhdHRhY2htZW50LmZpbGVfc2l6ZSEpKTtcbiAgfVxuXG4gIGdldE1vZGFsQ29udGV4dCgpOiBNb2RhbENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBpc09wZW46IHRoaXMuaW1hZ2VzVG9WaWV3ICYmIHRoaXMuaW1hZ2VzVG9WaWV3Lmxlbmd0aCA+IDAsXG4gICAgICBpc09wZW5DaGFuZ2VIYW5kbGVyOiAoaXNPcGVuKSA9PiAoaXNPcGVuID8gbnVsbCA6IHRoaXMuY2xvc2VJbWFnZU1vZGFsKCkpLFxuICAgICAgY29udGVudDogdGhpcy5tb2RhbENvbnRlbnQsXG4gICAgfTtcbiAgfVxuXG4gIHRyaW1VcmwodXJsPzogc3RyaW5nIHwgbnVsbCkge1xuICAgIGlmICh1cmwgIT09IHVuZGVmaW5lZCAmJiB1cmwgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IFt0cmltbWVkVXJsXSA9IHVybFxuICAgICAgICAucmVwbGFjZSgvXig/Omh0dHBzPzpcXC9cXC8pPyg/Ond3d1xcLik/L2ksICcnKVxuICAgICAgICAuc3BsaXQoJy8nKTtcblxuICAgICAgcmV0dXJuIHRyaW1tZWRVcmw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2VuZEFjdGlvbihhY3Rpb246IEFjdGlvbikge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5zZW5kQWN0aW9uKFxuICAgICAgdGhpcy5tZXNzYWdlSWQhLFxuICAgICAge1xuICAgICAgICBbYWN0aW9uLm5hbWUhXTogYWN0aW9uLnZhbHVlISxcbiAgICAgIH0sXG4gICAgICB0aGlzLnBhcmVudE1lc3NhZ2VJZFxuICAgICk7XG4gIH1cblxuICB0cmFja0J5QWN0aW9uVmFsdWUoXzogbnVtYmVyLCBpdGVtOiBBY3Rpb24pIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgfVxuXG4gIG9wZW5JbWFnZU1vZGFsKGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10sIHNlbGVjdGVkSW5kZXggPSAwKSB7XG4gICAgdGhpcy5pbWFnZU1vZGFsU3RhdGVDaGFuZ2UubmV4dCgnb3BlbmVkJyk7XG4gICAgdGhpcy5pbWFnZXNUb1ZpZXcgPSBhdHRhY2htZW50cztcbiAgICB0aGlzLmltYWdlc1RvVmlld0N1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gIH1cblxuICBzdGVwSW1hZ2VzKGRpcjogLTEgfCAxKSB7XG4gICAgdGhpcy5pbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXggKz0gZGlyICogMTtcbiAgfVxuXG4gIHRyYWNrQnlJbWFnZVVybChfOiBudW1iZXIsIGl0ZW06IEF0dGFjaG1lbnQpIHtcbiAgICByZXR1cm4gaXRlbS5pbWFnZV91cmwgfHwgaXRlbS5pbWdfdXJsIHx8IGl0ZW0udGh1bWJfdXJsO1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudENvbnRleHQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IEF0dGFjaG1lbnRDb250ZXh0IHtcbiAgICByZXR1cm4geyBhdHRhY2htZW50IH07XG4gIH1cblxuICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQsXG4gICAgdHlwZTogJ2dhbGxlcnknIHwgJ3NpbmdsZScsXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25maWd1cmF0aW9uID0gdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMuZ2V0KGF0dGFjaG1lbnQpO1xuICAgIGlmIChleGlzdGluZ0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0NvbmZpZ3VyYXRpb24gYXMgSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9XG4gICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICBhdHRhY2htZW50LFxuICAgICAgICB0eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgICApO1xuICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25zLnNldChhdHRhY2htZW50LCBjb25maWd1cmF0aW9uKTtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgfVxuXG4gIGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICBhdHRhY2htZW50OiBBdHRhY2htZW50LFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkge1xuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgYXR0YWNobWVudCxcbiAgICAgICdjYXJvdXNlbCcsXG4gICAgICBlbGVtZW50XG4gICAgKTtcbiAgfVxuXG4gIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgYXR0YWNobWVudDogQXR0YWNobWVudCxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uIHtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5nZXQoYXR0YWNobWVudCk7XG4gICAgaWYgKGV4aXN0aW5nQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlndXJhdGlvbiBhcyBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID1cbiAgICAgIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgIGF0dGFjaG1lbnQsXG4gICAgICAgIGVsZW1lbnRcbiAgICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50Q29uZmlndXJhdGlvbnMuc2V0KGF0dGFjaG1lbnQsIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICB9XG5cbiAgZ2V0Q2FyZEF0dGFjaG1lbnRDb25maWd1cmF0aW9uKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5nZXQoYXR0YWNobWVudCk7XG4gICAgaWYgKGV4aXN0aW5nQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlndXJhdGlvbjtcbiAgICB9XG4gICAgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2dpcGh5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEdpcGh5QXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgIGF0dGFjaG1lbnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPVxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9uU2VydmljZS5nZXRTY3JhcGVkSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBhdHRhY2htZW50XG4gICAgICAgICk7XG4gICAgICB0aGlzLmF0dGFjaG1lbnRDb25maWd1cmF0aW9ucy5zZXQoYXR0YWNobWVudCwgY29uZmlndXJhdGlvbik7XG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICBpc0dhbGxlcnlUeXBlKFxuICAgIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgfCBHYWxsZXJ5QXR0YWNobWVudFxuICApOiBhdHRhY2htZW50IGlzIEdhbGxlcnlBdHRhY2htZW50IHtcbiAgICByZXR1cm4gYXR0YWNobWVudC50eXBlID09PSAnZ2FsbGVyeSc7XG4gIH1cblxuICBnZXQgaXNJbWFnZU1vZGFsUHJldkJ1dHRvblZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4ICE9PSAwO1xuICB9XG5cbiAgZ2V0IGlzSW1hZ2VNb2RhbE5leHRCdXR0b25WaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmltYWdlc1RvVmlld0N1cnJlbnRJbmRleCAhPT0gdGhpcy5pbWFnZXNUb1ZpZXcubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR2FsbGVyeShpbWFnZXM6IEF0dGFjaG1lbnRbXSk6IEdhbGxlcnlBdHRhY2htZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgICAgaW1hZ2VzLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUltYWdlTW9kYWwoKSB7XG4gICAgdGhpcy5pbWFnZU1vZGFsU3RhdGVDaGFuZ2UubmV4dCgnY2xvc2VkJyk7XG4gICAgdGhpcy5pbWFnZXNUb1ZpZXcgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXR0YWNobWVudFVybChhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF0dGFjaG1lbnQuaW1hZ2VfdXJsIHx8XG4gICAgICBhdHRhY2htZW50LmltZ191cmwgfHxcbiAgICAgIGF0dGFjaG1lbnQuYXNzZXRfdXJsIHx8XG4gICAgICBhdHRhY2htZW50LnRodW1iX3VybFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJcbiAgICBvcmRlcmVkQXR0YWNobWVudHMubGVuZ3RoID4gMCB8fFxuICAgIChjdXN0b21BdHRhY2htZW50cy5sZW5ndGggPiAwICYmIGN1c3RvbUF0dGFjaG1lbnRzVGVtcGxhdGUpXG4gIFwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtbGlzdFwiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJsZXQgYXR0YWNobWVudCBvZiBvcmRlcmVkQXR0YWNobWVudHM7IHRyYWNrQnk6IHRyYWNrQnlVcmxcIlxuICA+XG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWNvbnRhaW5lclwiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQgc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0te3tcbiAgICAgICAgYXR0YWNobWVudC50eXBlXG4gICAgICB9fSBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWR5bmFtaWMtc2l6ZVwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0tY2FyZF09XCJpc0NhcmQoYXR0YWNobWVudClcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLXNpbmdsZV09XCJcbiAgICAgICAgaXNGaWxlKGF0dGFjaG1lbnQpXG4gICAgICBcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtLXZvaWNlLXJlY29yZGluZ109XCJcbiAgICAgICAgaXNWb2ljZU1lc3NhZ2UoYXR0YWNobWVudClcbiAgICAgIFwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC13aXRoLWFjdGlvbnNdPVwiXG4gICAgICAgICFpc0dhbGxlcnlUeXBlKGF0dGFjaG1lbnQpICYmXG4gICAgICAgIGF0dGFjaG1lbnQuYWN0aW9ucyAmJlxuICAgICAgICBhdHRhY2htZW50LmFjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LS1zdmctaW1hZ2VdPVwiaXNTdmcoYXR0YWNobWVudClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ltYWdlKGF0dGFjaG1lbnQpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuaW1hZ2VBdHRhY2htZW50VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRJbWFnZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRDb250ZXh0KGF0dGFjaG1lbnQpXG4gICAgICAgICAgXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW1hZ2UgbGV0LWF0dGFjaG1lbnRDb250ZXh0PVwiYXR0YWNobWVudFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICNpbWdFbGVtZW50XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtLWltZ1wiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImltYWdlXCJcbiAgICAgICAgICAgIFtzcmNdPVwiXG4gICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudENvbnRleHQsXG4gICAgICAgICAgICAgICAgJ3NpbmdsZScsXG4gICAgICAgICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICAgICAgICApLnVybFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthbHRdPVwiYXR0YWNobWVudENvbnRleHQ/LmZhbGxiYWNrXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgaGVpZ2h0OiBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICdzaW5nbGUnLFxuICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgKS5oZWlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoOiBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICdzaW5nbGUnLFxuICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgKS53aWR0aCxcbiAgICAgICAgICAgICAgJy0tb3JpZ2luYWwtaGVpZ2h0JzogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50Q29udGV4dCxcbiAgICAgICAgICAgICAgICAnc2luZ2xlJyxcbiAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICkub3JpZ2luYWxIZWlnaHQsXG4gICAgICAgICAgICAgICctLW9yaWdpbmFsLXdpZHRoJzogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50Q29udGV4dCxcbiAgICAgICAgICAgICAgICAnc2luZ2xlJyxcbiAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICkub3JpZ2luYWxXaWR0aFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlTW9kYWwoW2F0dGFjaG1lbnRDb250ZXh0XSlcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9wZW5JbWFnZU1vZGFsKFthdHRhY2htZW50Q29udGV4dF0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNHYWxsZXJ5KGF0dGFjaG1lbnQpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZ2FsbGVyeUF0dGFjaG1lbnRUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEdhbGxlcnk7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50Q29udGV4dChhdHRhY2htZW50KVxuICAgICAgICAgIFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdhbGxlcnkgbGV0LWF0dGFjaG1lbnRDb250ZXh0PVwiYXR0YWNobWVudFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2dhbGxlcnlcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpbWFnZS1nYWxsZXJ5XCJcbiAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fZ2FsbGVyeS0tc3F1YXJlXT1cIlxuICAgICAgICAgICAgICAoYXR0YWNobWVudENvbnRleHQ/LmltYWdlcykhLmxlbmd0aCA+IDNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX2dhbGxlcnktdHdvLXJvd3NdPVwiXG4gICAgICAgICAgICAgIChhdHRhY2htZW50Q29udGV4dD8uaW1hZ2VzKSEubGVuZ3RoID4gMlxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBnYWxsZXJ5SW1hZ2Ugb2YgYXR0YWNobWVudENvbnRleHQuaW1hZ2VzO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlJbWFnZVVybFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpbmRleCA8IDMgfHwgKGluZGV4ID09PSAzICYmIGlzTGFzdClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2dhbGxlcnktaW1hZ2VcIlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiZ2FsbGVyeS1pbWFnZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtLXN2Zy1pbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgIGlzU3ZnKGdhbGxlcnlJbWFnZSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW1hZ2VNb2RhbChhdHRhY2htZW50Q29udGV4dC5pbWFnZXMhLCBpbmRleClcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvcGVuSW1hZ2VNb2RhbChhdHRhY2htZW50Q29udGV4dC5pbWFnZXMhLCBpbmRleClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgI2ltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgIGZldGNocHJpb3JpdHk9XCJsb3dcIlxuICAgICAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgW3NyY109XCJcbiAgICAgICAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgKS51cmxcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbYWx0XT1cImdhbGxlcnlJbWFnZS5mYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC1oZWlnaHRdPVwiXG4gICAgICAgICAgICAgICAgICAgIGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkub3JpZ2luYWxIZWlnaHRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgKS5vcmlnaW5hbFdpZHRoXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICdnYWxsZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5SW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgKS53aWR0aFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImluZGV4ID09PSAzICYmICFpc0xhc3RcIlxuICAgICAgICAgICAgICAgICNlbGVtZW50XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZ2FsbGVyeS1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJnYWxsZXJ5LWltYWdlXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1vcmUtaW1hZ2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC0tc3ZnLWltYWdlXT1cIlxuICAgICAgICAgICAgICAgICAgaXNTdmcoZ2FsbGVyeUltYWdlKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOlxuICAgICAgICAgICAgICAgICAgICAndXJsKCcgK1xuICAgICAgICAgICAgICAgICAgICBnZXRJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICApLnVybCArXG4gICAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICkuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgICApLndpZHRoLFxuICAgICAgICAgICAgICAgICAgJy0tb3JpZ2luYWwtaGVpZ2h0JzogZ2V0SW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeUltYWdlLFxuICAgICAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICkub3JpZ2luYWxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAnLS1vcmlnaW5hbC13aWR0aCc6IGdldEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgIGdhbGxlcnlJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgJ2dhbGxlcnknLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgICApLm9yaWdpbmFsV2lkdGhcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlTW9kYWwoYXR0YWNobWVudENvbnRleHQuaW1hZ2VzISwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib3BlbkltYWdlTW9kYWwoYXR0YWNobWVudENvbnRleHQuaW1hZ2VzISwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAnc3RyZWFtQ2hhdC57eyBpbWFnZUNvdW50IH19IG1vcmUnXG4gICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyBpbWFnZUNvdW50OiBhdHRhY2htZW50Q29udGV4dCEuaW1hZ2VzIS5sZW5ndGggLSA0IH1cbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVmlkZW8oYXR0YWNobWVudClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS52aWRlb0F0dGFjaG1lbnRUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdFZpZGVvO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0QXR0YWNobWVudENvbnRleHQoYXR0YWNobWVudClcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWaWRlbyBsZXQtYXR0YWNobWVudENvbnRleHQ9XCJhdHRhY2htZW50XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcGxheWVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJ2aWRlby1hdHRhY2htZW50LXBhcmVudFwiXG4gICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC1oZWlnaHRdPVwiXG4gICAgICAgICAgICAgIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudENvbnRleHQsIHZpZGVvRWxlbWVudClcbiAgICAgICAgICAgICAgICAub3JpZ2luYWxIZWlnaHRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbc3R5bGUuLS1vcmlnaW5hbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50Q29udGV4dCwgdmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgICAgIC5vcmlnaW5hbFdpZHRoXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICBoZWlnaHQ6IGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudENvbnRleHQsXG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50XG4gICAgICAgICAgICAgICkuaGVpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50Q29udGV4dCxcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnRcbiAgICAgICAgICAgICAgKS53aWR0aFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICN2aWRlb0VsZW1lbnRcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdmlkZW8tYW5ndWxhclwiXG4gICAgICAgICAgICAgIGNvbnRyb2xzXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidmlkZW8tYXR0YWNobWVudFwiXG4gICAgICAgICAgICAgIFtzcmNdPVwiXG4gICAgICAgICAgICAgICAgZ2V0VmlkZW9BdHRhY2htZW50Q29uZmlndXJhdGlvbihhdHRhY2htZW50Q29udGV4dCwgdmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgICAgICAgLnVybFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbcG9zdGVyXT1cIlxuICAgICAgICAgICAgICAgIGdldFZpZGVvQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudENvbnRleHQsIHZpZGVvRWxlbWVudClcbiAgICAgICAgICAgICAgICAgIC50aHVtYlVybFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ZpbGUoYXR0YWNobWVudClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5maWxlQXR0YWNobWVudFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0RmlsZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRDb250ZXh0KGF0dGFjaG1lbnQpXG4gICAgICAgICAgXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RmlsZSBsZXQtYXR0YWNobWVudENvbnRleHQ9XCJhdHRhY2htZW50XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0gc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtc2luZ2xlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC10eXBlLWljb25cIlxuICAgICAgICAgICAgICBpY29uPVwidW5zcGVjaWZpZWQtZmlsZXR5cGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tdGV4dFwiPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1maWxlLS1pdGVtLWZpcnN0LXJvd1wiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJmaWxlLWxpbmtcIlxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnRDb250ZXh0LmFzc2V0X3VybCB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImZpbGUtdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWZpbGUtLWl0ZW0tbmFtZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgYXR0YWNobWVudENvbnRleHQudGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1kb3dubG9hZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJkb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzRmlsZVNpemUoYXR0YWNobWVudENvbnRleHQpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtZmlsZS0taXRlbS1zaXplXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInNpemVcIlxuICAgICAgICAgICAgICAgID57eyBnZXRGaWxlU2l6ZShhdHRhY2htZW50Q29udGV4dCkgfX08L3NwYW5cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZvaWNlTWVzc2FnZShhdHRhY2htZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnZvaWNlUmVjb3JkaW5nQXR0YWNobWVudFRlbXBsYXRlJFxuICAgICAgICAgICAgICB8IGFzeW5jKSB8fCBkZWZhdWx0UmVjb3JkaW5nO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0QXR0YWNobWVudENvbnRleHQoYXR0YWNobWVudClcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWNvcmRpbmc+XG4gICAgICAgICAgPHN0cmVhbS12b2ljZS1yZWNvcmRpbmdcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidm9pY2UtcmVjb3JkaW5nXCJcbiAgICAgICAgICAgIFthdHRhY2htZW50XT1cImF0dGFjaG1lbnRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpc0NhcmQoYXR0YWNobWVudCkgJiZcbiAgICAgICAgICBnZXRDYXJkQXR0YWNobWVudENvbmZpZ3VyYXRpb24oYXR0YWNobWVudCkgYXMgYXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5jYXJkQXR0YWNobWVudFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0Q2FyZDtcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRDb250ZXh0KGF0dGFjaG1lbnQpXG4gICAgICAgICAgXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2FyZCBsZXQtYXR0YWNobWVudENvbnRleHQ9XCJhdHRhY2htZW50XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQgc3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS17e1xuICAgICAgICAgICAgICBhdHRhY2htZW50Q29udGV4dC50eXBlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnRDb25maWd1cmF0aW9uLnVybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS1oZWFkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudENvbnRleHQudHlwZSA9PT0gJ3ZpZGVvJzsgZWxzZSBjYXJkSW1hZ2VcIlxuICAgICAgICAgICAgICAgIFtocmVmXT1cIlxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvbnRleHQudGl0bGVfbGluayB8fFxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvbnRleHQub2dfc2NyYXBlX3VybFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cInNjcmFwZWQtdmlkZW9cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkSW1hZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQtLXZpZGVvLXBsYXlcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInBsYXlcIiAvPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FyZEltYWdlPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGZldGNocHJpb3JpdHk9XCJsb3dcIlxuICAgICAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJjYXJkLWltZ1wiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyBhdHRhY2htZW50Q29uZmlndXJhdGlvbi51cmwgfX1cIlxuICAgICAgICAgICAgICAgICAgc3JjPVwie3sgYXR0YWNobWVudENvbmZpZ3VyYXRpb24udXJsIH19XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdHRhY2htZW50Q29uZmlndXJhdGlvbi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhdHRhY2htZW50Q29uZmlndXJhdGlvbi53aWR0aFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1jYXJkLS1mbGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50Q29udGV4dC50aXRsZVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWNhcmQtLXRpdGxlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBhdHRhY2htZW50Q29udGV4dC50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudENvbnRleHQudGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tdGV4dFwiXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImNhcmQtdGV4dFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgYXR0YWNobWVudENvbnRleHQudGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50Q29udGV4dC50aXRsZV9saW5rIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0Lm9nX3NjcmFwZV91cmxcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWF0dGFjaG1lbnQtY2FyZC0tdXJsXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwidXJsLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgbm9vcGVuZXJcbiAgICAgICAgICAgICAgICAgIG5vcmVmZXJyZXJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICBocmVmPVwie3tcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudENvbnRleHQudGl0bGVfbGluayB8fFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0Lm9nX3NjcmFwZV91cmxcbiAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICB0cmltVXJsKFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0LnRpdGxlX2xpbmsgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRDb250ZXh0Lm9nX3NjcmFwZV91cmxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAhaXNHYWxsZXJ5VHlwZShhdHRhY2htZW50KSAmJlxuICAgICAgICAgIGF0dGFjaG1lbnQuYWN0aW9ucyAmJlxuICAgICAgICAgIGF0dGFjaG1lbnQuYWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuYXR0YWNobWVudEFjdGlvbnNUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbnM7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50Q29udGV4dChhdHRhY2htZW50KVxuICAgICAgICAgIFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFjdGlvbnMgbGV0LWF0dGFjaG1lbnRDb250ZXh0PVwiYXR0YWNobWVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnMtZm9ybVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICBsZXQgYWN0aW9uIG9mIGF0dGFjaG1lbnRDb250ZXh0LmFjdGlvbnM7XG4gICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5QWN0aW9uVmFsdWVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXR0YWNobWVudC1hY3Rpb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYXR0YWNobWVudC1hY3Rpb25zLWJ1dHRvbiBzdHItY2hhdF9fbWVzc2FnZS1hdHRhY2htZW50LWFjdGlvbnMtYnV0dG9uLS17e1xuICAgICAgICAgICAgICAgICAgYWN0aW9uLnN0eWxlXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW5kQWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZW5kQWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgYWN0aW9uLnRleHQgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbUF0dGFjaG1lbnRzVGVtcGxhdGVcIj5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGN1c3RvbUF0dGFjaG1lbnRzVGVtcGxhdGU7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBtZXNzYWdlSWQ6IG1lc3NhZ2VJZCEsXG4gICAgICAgICAgcGFyZW50TWVzc2FnZUlkOiBwYXJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgYXR0YWNobWVudHM6IGN1c3RvbUF0dGFjaG1lbnRzXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZXNUb1ZpZXcgJiYgaW1hZ2VzVG9WaWV3Lmxlbmd0aCA+IDBcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tb2RhbFRlbXBsYXRlJCB8IGFzeW5jKSB8fCBkZWZhdWx0TW9kYWw7XG4gICAgICAgIGNvbnRleHQ6IGdldE1vZGFsQ29udGV4dCgpXG4gICAgICBcIlxuICAgIC8+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGVmYXVsdE1vZGFsXG4gIGxldC1pc09wZW49XCJpc09wZW5cIlxuICBsZXQtaXNPcGVuQ2hhbmdlSGFuZGxlcj1cImlzT3BlbkNoYW5nZUhhbmRsZXJcIlxuICBsZXQtY29udGVudD1cImNvbnRlbnRcIlxuPlxuICA8c3RyZWFtLW1vZGFsXG4gICAgY2xhc3M9XCJzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1ob3N0XCJcbiAgICBbaXNPcGVuXT1cImlzT3BlblwiXG4gICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgKGlzT3BlbkNoYW5nZSk9XCJpc09wZW5DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAvPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbENvbnRlbnQ+XG4gIDxkaXYgY2xhc3M9XCJzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbCBzdHItY2hhdF9faW1hZ2UtY2Fyb3VzZWxcIj5cbiAgICA8aW1nXG4gICAgICAjaW1nRWxlbWVudFxuICAgICAgY2xhc3M9XCJzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1pbWFnZSBzdHItY2hhdF9faW1hZ2UtY2Fyb3VzZWwtaW1hZ2VcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJtb2RhbC1pbWFnZVwiXG4gICAgICBbc3JjXT1cIlxuICAgICAgICBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLnVybFxuICAgICAgXCJcbiAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLWhlaWdodF09XCJcbiAgICAgICAgZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLFxuICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgKS5vcmlnaW5hbEhlaWdodFxuICAgICAgXCJcbiAgICAgIFtzdHlsZS4tLW9yaWdpbmFsLXdpZHRoXT1cIlxuICAgICAgICBnZXRDYXJvdXNlbEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgaW1hZ2VzVG9WaWV3W2ltYWdlc1RvVmlld0N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgaW1nRWxlbWVudFxuICAgICAgICApLm9yaWdpbmFsV2lkdGhcbiAgICAgIFwiXG4gICAgICBbYWx0XT1cImltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLmZhbGxiYWNrXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgd2lkdGg6IGdldENhcm91c2VsSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbihcbiAgICAgICAgICBpbWFnZXNUb1ZpZXdbaW1hZ2VzVG9WaWV3Q3VycmVudEluZGV4XSxcbiAgICAgICAgICBpbWdFbGVtZW50XG4gICAgICAgICkud2lkdGgsXG4gICAgICAgIGhlaWdodDogZ2V0Q2Fyb3VzZWxJbWFnZUF0dGFjaG1lbnRDb25maWd1cmF0aW9uKFxuICAgICAgICAgIGltYWdlc1RvVmlld1tpbWFnZXNUb1ZpZXdDdXJyZW50SW5kZXhdLFxuICAgICAgICAgIGltZ0VsZW1lbnRcbiAgICAgICAgKS5oZWlnaHRcbiAgICAgIH1cIlxuICAgIC8+XG4gICAgPGRpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1zdGVwcGVyIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbC1zdGVwcGVyIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbC1zdGVwcGVyLXByZXZcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImltYWdlLW1vZGFsLXByZXZcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgIHZpc2liaWxpdHk6IGlzSW1hZ2VNb2RhbFByZXZCdXR0b25WaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcbiAgICAgICAgfVwiXG4gICAgICAgIChjbGljayk9XCJzdGVwSW1hZ2VzKC0xKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzdGVwSW1hZ2VzKC0xKVwiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiYXJyb3ctbGVmdFwiIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJzdHJlYW0tY2hhdC1hbmd1bGFyX19pbWFnZS1tb2RhbC1zdGVwcGVyIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbC1zdGVwcGVyIHN0ci1jaGF0X19pbWFnZS1jYXJvdXNlbC1zdGVwcGVyLW5leHRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJpbWFnZS1tb2RhbC1uZXh0XCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgIHZpc2liaWxpdHk6IGlzSW1hZ2VNb2RhbE5leHRCdXR0b25WaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcbiAgICAgICAgfVwiXG4gICAgICAgIChjbGljayk9XCJzdGVwSW1hZ2VzKDEpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInN0ZXBJbWFnZXMoMSlcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImFycm93LXJpZ2h0XCIgLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|