UNPKG

@hsaadawy/ngx-chat

Version:
120 lines 24.9 kB
import { __awaiter } from "tslib"; import { xml } from '@xmpp/client'; import { Subject } from 'rxjs'; import { debounceTime, filter } from 'rxjs/operators'; import { AbstractXmppPlugin } from './abstract-xmpp-plugin'; import { PUBSUB_EVENT_XMLNS } from './publish-subscribe.plugin'; import { MUC_SUB_EVENT_TYPE } from './muc-sub.plugin'; /** * https://xmpp.org/extensions/xep-0313.html * Message Archive Management */ export class MessageArchivePlugin extends AbstractXmppPlugin { constructor(chatService, serviceDiscoveryPlugin, multiUserChatPlugin, logService, messagePlugin) { super(); this.chatService = chatService; this.serviceDiscoveryPlugin = serviceDiscoveryPlugin; this.multiUserChatPlugin = multiUserChatPlugin; this.logService = logService; this.messagePlugin = messagePlugin; this.mamMessageReceived$ = new Subject(); this.chatService.state$ .pipe(filter(state => state === 'online')) .subscribe(() => __awaiter(this, void 0, void 0, function* () { if (yield this.supportsMessageArchiveManagement()) { yield this.requestNewestMessages(); } })); // emit contacts to refresh contact list after receiving mam messages this.mamMessageReceived$ .pipe(debounceTime(10)) .subscribe(() => this.chatService.contacts$.next(this.chatService.contacts$.getValue())); } requestNewestMessages() { return __awaiter(this, void 0, void 0, function* () { yield this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: 'urn:xmpp:mam:2' }, xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, 250), xml('before'))))); }); } loadMostRecentUnloadedMessages(recipient) { return __awaiter(this, void 0, void 0, function* () { // for user-to-user chats no to-attribute is necessary, in case of multi-user-chats it has to be set to the bare room jid const to = recipient.recipientType === 'room' ? recipient.roomJid.toString() : undefined; const request = xml('iq', { type: 'set', to }, xml('query', { xmlns: 'urn:xmpp:mam:2' }, xml('x', { xmlns: 'jabber:x:data', type: 'submit' }, xml('field', { var: 'FORM_TYPE', type: 'hidden' }, xml('value', {}, 'urn:xmpp:mam:2')), recipient.recipientType === 'contact' ? xml('field', { var: 'with' }, xml('value', {}, recipient.jidBare)) : undefined, recipient.oldestMessage ? xml('field', { var: 'end' }, xml('value', {}, recipient.oldestMessage.datetime.toISOString())) : undefined), xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, 100), xml('before')))); yield this.chatService.chatConnectionService.sendIq(request); }); } loadAllMessages() { return __awaiter(this, void 0, void 0, function* () { if (!(yield this.supportsMessageArchiveManagement())) { throw new Error('message archive management not suppported'); } let lastMamResponse = yield this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: 'urn:xmpp:mam:2' }))); while (lastMamResponse.getChild('fin').attrs.complete !== 'true') { const lastReceivedMessageId = lastMamResponse.getChild('fin').getChild('set').getChildText('last'); lastMamResponse = yield this.chatService.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('query', { xmlns: 'urn:xmpp:mam:2' }, xml('set', { xmlns: 'http://jabber.org/protocol/rsm' }, xml('max', {}, 250), xml('after', {}, lastReceivedMessageId))))); } }); } supportsMessageArchiveManagement() { return __awaiter(this, void 0, void 0, function* () { const supportsMessageArchiveManagement = yield this.serviceDiscoveryPlugin.supportsFeature(this.chatService.chatConnectionService.userJid.bare().toString(), 'urn:xmpp:mam:2'); if (!supportsMessageArchiveManagement) { this.logService.info('server doesnt support MAM'); } return supportsMessageArchiveManagement; }); } handleStanza(stanza) { if (this.isMamMessageStanza(stanza)) { this.handleMamMessageStanza(stanza); return true; } return false; } isMamMessageStanza(stanza) { const result = stanza.getChild('result'); return stanza.name === 'message' && (result === null || result === void 0 ? void 0 : result.attrs.xmlns) === 'urn:xmpp:mam:2'; } handleMamMessageStanza(stanza) { const forwardedElement = stanza.getChild('result').getChild('forwarded'); const messageElement = forwardedElement.getChild('message'); const delayElement = forwardedElement.getChild('delay'); const eventElement = messageElement.getChild('event', PUBSUB_EVENT_XMLNS); if (messageElement.getAttr('type') == null && eventElement != null) { this.handlePubSubEvent(eventElement, delayElement); } else { this.handleArchivedMessage(messageElement, delayElement); } } handleArchivedMessage(messageElement, delayEl) { const type = messageElement.getAttr('type'); if (type === 'chat') { const messageHandled = this.messagePlugin.handleStanza(messageElement, delayEl); if (messageHandled) { this.mamMessageReceived$.next(); } } else if (type === 'groupchat') { this.multiUserChatPlugin.handleStanza(messageElement, delayEl); } else { throw new Error(`unknown archived message type: ${type}`); } } handlePubSubEvent(eventElement, delayElement) { const itemsElement = eventElement.getChild('items'); const itemsNode = itemsElement === null || itemsElement === void 0 ? void 0 : itemsElement.attrs.node; if (itemsNode !== MUC_SUB_EVENT_TYPE.messages) { this.logService.warn(`Handling of MUC/Sub message types other than ${MUC_SUB_EVENT_TYPE.messages} isn't implemented yet!`); return; } const itemElements = itemsElement.getChildren('item'); itemElements.forEach((itemEl) => this.handleArchivedMessage(itemEl.getChild('message'), delayElement)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1hcmNoaXZlLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL21lc3NhZ2UtYXJjaGl2ZS5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXREOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxrQkFBa0I7SUFJeEQsWUFDcUIsV0FBNEIsRUFDNUIsc0JBQThDLEVBQzlDLG1CQUF3QyxFQUN4QyxVQUFzQixFQUN0QixhQUE0QjtRQUU3QyxLQUFLLEVBQUUsQ0FBQztRQU5TLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQVBoQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBV3ZELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTthQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFFB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QzNILE9BQU87U0FDVjtRQUVELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMzRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSAnbHR4JztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVjaXBpZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWNpcGllbnQnO1xyXG5pbXBvcnQgeyBTdGFuemEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0YW56YSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9sb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFhtcHBDaGF0QWRhcHRlciB9IGZyb20gJy4uL3htcHAtY2hhdC1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcclxuaW1wb3J0IHsgTXVsdGlVc2VyQ2hhdFBsdWdpbiB9IGZyb20gJy4vbXVsdGktdXNlci1jaGF0LnBsdWdpbic7XHJcbmltcG9ydCB7IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4gfSBmcm9tICcuL3NlcnZpY2UtZGlzY292ZXJ5LnBsdWdpbic7XHJcbmltcG9ydCB7IFBVQlNVQl9FVkVOVF9YTUxOUyB9IGZyb20gJy4vcHVibGlzaC1zdWJzY3JpYmUucGx1Z2luJztcclxuaW1wb3J0IHsgTWVzc2FnZVBsdWdpbiB9IGZyb20gJy4vbWVzc2FnZS5wbHVnaW4nO1xyXG5pbXBvcnQgeyBNVUNfU1VCX0VWRU5UX1RZUEUgfSBmcm9tICcuL211Yy1zdWIucGx1Z2luJztcclxuXHJcbi8qKlxyXG4gKiBodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAzMTMuaHRtbFxyXG4gKiBNZXNzYWdlIEFyY2hpdmUgTWFuYWdlbWVudFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VBcmNoaXZlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hbU1lc3NhZ2VSZWNlaXZlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhdFNlcnZpY2U6IFhtcHBDaGF0QWRhcHRlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VEaXNjb3ZlcnlQbHVnaW46IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4sXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVVzZXJDaGF0UGx1Z2luOiBNdWx0aVVzZXJDaGF0UGx1Z2luLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nU2VydmljZTogTG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VQbHVnaW46IE1lc3NhZ2VQbHVnaW4sXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLnN0YXRlJFxyXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoc3RhdGUgPT4gc3RhdGUgPT09ICdvbmxpbmUnKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5zdXBwb3J0c01lc3NhZ2VBcmNoaXZlTWFuYWdlbWVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0TmV3ZXN0TWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGVtaXQgY29udGFjdHMgdG8gcmVmcmVzaCBjb250YWN0IGxpc3QgYWZ0ZXIgcmVjZWl2aW5nIG1hbSBtZXNzYWdlc1xyXG4gICAgICAgIHRoaXMubWFtTWVzc2FnZVJlY2VpdmVkJFxyXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTApKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhdFNlcnZpY2UuY29udGFjdHMkLm5leHQodGhpcy5jaGF0U2VydmljZS5jb250YWN0cyQuZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdE5ld2VzdE1lc3NhZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hhdFNlcnZpY2UuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcclxuICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXHJcbiAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAndXJuOnhtcHA6bWFtOjInfSxcclxuICAgICAgICAgICAgICAgICAgICB4bWwoJ3NldCcsIHt4bWxuczogJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3JzbSd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ21heCcsIHt9LCAyNTApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2JlZm9yZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE1vc3RSZWNlbnRVbmxvYWRlZE1lc3NhZ2VzKHJlY2lwaWVudDogUmVjaXBpZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gZm9yIHVzZXItdG8tdXNlciBjaGF0cyBubyB0by1hdHRyaWJ1dGUgaXMgbmVjZXNzYXJ5LCBpbiBjYXNlIG9mIG11bHRpLXVzZXItY2hhdHMgaXQgaGFzIHRvIGJlIHNldCB0byB0aGUgYmFyZSByb29tIGppZFxyXG4gICAgICAgIGNvbnN0IHRvID0gcmVjaXBpZW50LnJlY2lwaWVudFR5cGUgPT09ICdyb29tJyA/IHJlY2lwaWVudC5yb29tSmlkLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPVxyXG4gICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdzZXQnLCB0b30sXHJcbiAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAndXJuOnhtcHA6bWFtOjInfSxcclxuICAgICAgICAgICAgICAgICAgICB4bWwoJ3gnLCB7eG1sbnM6ICdqYWJiZXI6eDpkYXRhJywgdHlwZTogJ3N1Ym1pdCd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2ZpZWxkJywge3ZhcjogJ0ZPUk1fVFlQRScsIHR5cGU6ICdoaWRkZW4nfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgndmFsdWUnLCB7fSwgJ3Vybjp4bXBwOm1hbToyJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudC5yZWNpcGllbnRUeXBlID09PSAnY29udGFjdCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdmaWVsZCcsIHt2YXI6ICd3aXRoJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCd2YWx1ZScsIHt9LCByZWNpcGllbnQuamlkQmFyZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50Lm9sZGVzdE1lc3NhZ2UgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdmaWVsZCcsIHt2YXI6ICdlbmQnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3ZhbHVlJywge30sIHJlY2lwaWVudC5vbGRlc3RNZXNzYWdlLmRhdGV0aW1lLnRvSVNPU3RyaW5nKCkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICB4bWwoJ3NldCcsIHt4bWxuczogJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL3JzbSd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ21heCcsIHt9LCAxMDApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2JlZm9yZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEocmVxdWVzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFsbE1lc3NhZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuc3VwcG9ydHNNZXNzYWdlQXJjaGl2ZU1hbmFnZW1lbnQoKSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFyY2hpdmUgbWFuYWdlbWVudCBub3Qgc3VwcHBvcnRlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxhc3RNYW1SZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhdFNlcnZpY2UuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcclxuICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXHJcbiAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAndXJuOnhtcHA6bWFtOjInfSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGxhc3RNYW1SZXNwb25zZS5nZXRDaGlsZCgnZmluJykuYXR0cnMuY29tcGxldGUgIT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjZWl2ZWRNZXNzYWdlSWQgPSBsYXN0TWFtUmVzcG9uc2UuZ2V0Q2hpbGQoJ2ZpbicpLmdldENoaWxkKCdzZXQnKS5nZXRDaGlsZFRleHQoJ2xhc3QnKTtcclxuICAgICAgICAgICAgbGFzdE1hbVJlc3BvbnNlID0gYXdhaXQgdGhpcy5jaGF0U2VydmljZS5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKFxyXG4gICAgICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXHJcbiAgICAgICAgICAgICAgICAgICAgeG1sKCdxdWVyeScsIHt4bWxuczogJ3Vybjp4bXBwOm1hbToyJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgnc2V0Jywge3htbG5zOiAnaHR0cDovL2phYmJlci5vcmcvcHJvdG9jb2wvcnNtJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ21heCcsIHt9LCAyNTApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdhZnRlcicsIHt9LCBsYXN0UmVjZWl2ZWRNZXNzYWdlSWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHN1cHBvcnRzTWVzc2FnZUFyY2hpdmVNYW5hZ2VtZW50KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHN1cHBvcnRzTWVzc2FnZUFyY2hpdmVNYW5hZ2VtZW50ID0gYXdhaXQgdGhpcy5zZXJ2aWNlRGlzY292ZXJ5UGx1Z2luLnN1cHBvcnRzRmVhdHVyZShcclxuICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0Q29ubmVjdGlvblNlcnZpY2UudXNlckppZC5iYXJlKCkudG9TdHJpbmcoKSwgJ3Vybjp4bXBwOm1hbToyJyk7XHJcbiAgICAgICAgaWYgKCFzdXBwb3J0c01lc3NhZ2VBcmNoaXZlTWFuYWdlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuaW5mbygnc2VydmVyIGRvZXNudCBzdXBwb3J0IE1BTScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwcG9ydHNNZXNzYWdlQXJjaGl2ZU1hbmFnZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlU3RhbnphKHN0YW56YTogU3RhbnphKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYW1NZXNzYWdlU3RhbnphKHN0YW56YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVNYW1NZXNzYWdlU3RhbnphKHN0YW56YSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc01hbU1lc3NhZ2VTdGFuemEoc3RhbnphOiBTdGFuemEpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBzdGFuemEuZ2V0Q2hpbGQoJ3Jlc3VsdCcpO1xyXG4gICAgICAgIHJldHVybiBzdGFuemEubmFtZSA9PT0gJ21lc3NhZ2UnICYmIHJlc3VsdD8uYXR0cnMueG1sbnMgPT09ICd1cm46eG1wcDptYW06Mic7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNYW1NZXNzYWdlU3RhbnphKHN0YW56YTogU3RhbnphKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm9yd2FyZGVkRWxlbWVudCA9IHN0YW56YS5nZXRDaGlsZCgncmVzdWx0JykuZ2V0Q2hpbGQoJ2ZvcndhcmRlZCcpO1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZm9yd2FyZGVkRWxlbWVudC5nZXRDaGlsZCgnbWVzc2FnZScpO1xyXG4gICAgICAgIGNvbnN0IGRlbGF5RWxlbWVudCA9IGZvcndhcmRlZEVsZW1lbnQuZ2V0Q2hpbGQoJ2RlbGF5Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RWxlbWVudCA9IG1lc3NhZ2VFbGVtZW50LmdldENoaWxkKCdldmVudCcsIFBVQlNVQl9FVkVOVF9YTUxOUyk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2VFbGVtZW50LmdldEF0dHIoJ3R5cGUnKSA9PSBudWxsICYmIGV2ZW50RWxlbWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHViU3ViRXZlbnQoZXZlbnRFbGVtZW50LCBkZWxheUVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJjaGl2ZWRNZXNzYWdlKG1lc3NhZ2VFbGVtZW50LCBkZWxheUVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUFyY2hpdmVkTWVzc2FnZShtZXNzYWdlRWxlbWVudDogU3RhbnphLCBkZWxheUVsOiBFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IG1lc3NhZ2VFbGVtZW50LmdldEF0dHIoJ3R5cGUnKTtcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NoYXQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVkID0gdGhpcy5tZXNzYWdlUGx1Z2luLmhhbmRsZVN0YW56YShtZXNzYWdlRWxlbWVudCwgZGVsYXlFbCk7XHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlSGFuZGxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYW1NZXNzYWdlUmVjZWl2ZWQkLm5leHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2dyb3VwY2hhdCcpIHtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aVVzZXJDaGF0UGx1Z2luLmhhbmRsZVN0YW56YShtZXNzYWdlRWxlbWVudCwgZGVsYXlFbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGFyY2hpdmVkIG1lc3NhZ2UgdHlwZTogJHt0eXBlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVB1YlN1YkV2ZW50KGV2ZW50RWxlbWVudDogRWxlbWVudCwgZGVsYXlFbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXNFbGVtZW50ID0gZXZlbnRFbGVtZW50LmdldENoaWxkKCdpdGVtcycpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zTm9kZSA9IGl0ZW1zRWxlbWVudD8uYXR0cnMubm9kZTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW1zTm9kZSAhPT0gTVVDX1NVQl9FVkVOVF9UWVBFLm1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS53YXJuKGBIYW5kbGluZyBvZiBNVUMvU3ViIG1lc3NhZ2UgdHlwZXMgb3RoZXIgdGhhbiAke01VQ19TVUJfRVZFTlRfVFlQRS5tZXNzYWdlc30gaXNuJ3QgaW1wbGVtZW50ZWQgeWV0IWApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtRWxlbWVudHMgPSBpdGVtc0VsZW1lbnQuZ2V0Q2hpbGRyZW4oJ2l0ZW0nKTtcclxuICAgICAgICBpdGVtRWxlbWVudHMuZm9yRWFjaCgoaXRlbUVsKSA9PiB0aGlzLmhhbmRsZUFyY2hpdmVkTWVzc2FnZShpdGVtRWwuZ2V0Q2hpbGQoJ21lc3NhZ2UnKSwgZGVsYXlFbGVtZW50KSk7XHJcbiAgICB9XHJcbn1cclxuIl19