UNPKG

ngx-tencent-im

Version:
217 lines 33.5 kB
import { Inject, Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { loginAction, pushCurrentMessageListAction, resetConversationAction, resetUserAction, SDKReadyAction, showAction, updateConversationListAction, updateCurrentConversationAction, updateCurrentUserProfileAction, updateMessageAction } from './store/actions'; import { conversationSelector, } from './store/selectors'; import { resetCurrentMemberListAction, updateCurrentMemberListAction, updateGroupListAction } from './store/actions/group.action'; import { currentMemberListSelector } from './store/selectors/group.selector'; import TIM from 'tim-js-sdk'; import TIMUploadPlugin from 'tim-upload-plugin'; import { MESSAGE_STATUS, NG_Tim_CONFIG } from './shared.data'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; export class TimHelperService { constructor(store, config) { this.store = store; this.config = config; this.eventBus$ = new Subject(); this.totalUnRead = new Subject(); this.initTim(config); // 初始化监听器 this.initListener(); // 获取当前会话 this.store.select(conversationSelector).subscribe(res => { this.conversation = res; }); // 获取当前成员 this.store.select(currentMemberListSelector).subscribe(res => { this.currentMemberList = res; }); } login(userId, userSig) { if (!userSig) { throw new Error('请配置签名!'); } this.tim.login({ userID: userId, userSig }) .then((imResponse) => { this.eventBus$.next('login'); this.store.dispatch(loginAction({ isLogin: true })); // this.store.dispatch(startComputeCurrentAction()); this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.success, message: '登录成功!' })); if (imResponse.data.repeatLogin === true) { // 标识账号已登录,本次登录操作为重复登录。v2.5.1 起支持 console.log(imResponse.data.errorInfo); } }).catch((imError) => { console.warn('login error:', imError); // 登录失败的相关信息 }); } logout() { // 若有当前会话,在退出登录时已读上报 if (this.conversation.currentConversation.conversationID) { this.tim.setMessageRead({ conversationID: this.conversation.currentConversation.conversationID }); } this.tim.logout().then((res) => { this.eventBus$.next('logout'); // this.store.dispatch(stopComputeCurrentAction()); this.store.dispatch(loginAction({ isLogin: false })); this.store.dispatch(resetUserAction()); this.store.dispatch(resetConversationAction()); this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.success, message: '已退出!' })); }); } // 初始化tim监听函数 initListener() { // sdk ready this.tim.on(TIM.EVENT.SDK_READY, this.onReadyStateUpdate, this); // SDK NOT READT this.tim.on(TIM.EVENT.SDK_NOT_READY, this.onReadyStateUpdate, this); // 被踢出 this.tim.on(TIM.EVENT.KICKED_OUT, this.onKickOut, this); // SDK内部出错 this.tim.on(TIM.EVENT.ERROR, this.onError, this); // 收到新消息 this.tim.on(TIM.EVENT.MESSAGE_RECEIVED, this.onReceiveMessage, this); // 会话列表更新 this.tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, this.onUpdateConversationList, this); // 群组列表更新 this.tim.on(TIM.EVENT.GROUP_LIST_UPDATED, this.onUpdateGroupList, this); // 网络监测 this.tim.on(TIM.EVENT.NET_STATE_CHANGE, this.onNetStateChange, this); // 已读回执 this.tim.on(TIM.EVENT.MESSAGE_READ_BY_PEER, this.onMessageReadByPeer, this); } onReadyStateUpdate({ name }) { const isSDKReady = name === TIM.EVENT.SDK_READY ? true : false; this.store.dispatch(SDKReadyAction({ SDKReadyState: isSDKReady })); if (isSDKReady) { this.tim.getMyProfile() .then(({ data }) => { this.store.dispatch(updateCurrentUserProfileAction({ profile: data })); }) .catch(error => { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.warning, message: error.message })); }); } } onKickOut(event) { this.eventBus$.next('logout'); // this.store.dispatch(stopComputeCurrentAction()); this.store.dispatch(loginAction({ isLogin: false })); this.store.dispatch(resetUserAction()); this.store.dispatch(resetConversationAction()); this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.warning, message: '由于多实例登录被踢出,请重新登录!' })); } onError({ data }) { if (data.message !== 'Network Error') { console.log('%c error', 'color:red;font-size:20px;', data); } } onMessageReadByPeer(event) { console.log('已回执', event); } onReceiveMessage({ data: messageList }) { // this.handleVideoMessage(messageList); // this.handleAt(messageList); // this.handleQuitGroupTip(messageList); this.store.dispatch(pushCurrentMessageListAction({ message: messageList })); } // 会话列表更新 onUpdateConversationList(event) { this.store.dispatch(updateConversationListAction({ conversationList: event.data })); } // 群列表更新 onUpdateGroupList(event) { this.store.dispatch(updateGroupListAction({ groupList: event.data })); } onNetStateChange(event) { console.log('网络监测::', event); } /** * 切换会话 * 调用时机:切换会话时 */ checkoutConversation(conversationID) { this.store.dispatch(resetCurrentMemberListAction()); // 1.切换会话前,将切换前的会话进行已读上报 if (this.conversation.currentConversation.conversationID) { const prevConversationID = this.conversation.currentConversation.conversationID; this.tim.setMessageRead({ conversationID: prevConversationID }); } // 2.待切换的会话也进行已读上报 this.tim.setMessageRead({ conversationID }); // 3. 获取会话信息 return this.tim.getConversationProfile(conversationID).then((res) => { // 3.1 更新当前会话 this.store.dispatch(updateCurrentConversationAction({ conversation: res.data.conversation })); // 3.2 获取消息列表 this.getMessageList(conversationID); if (res.data.conversation.type === TIM.TYPES.CONV_GROUP) { this.getGroupMemberList(res.data.conversation.groupProfile.groupID); } return Promise.resolve(); }); // .catch(err => { // this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.error, message: err })); // }); } /** * @description 获取消息 */ getMessageList(conversationID) { if (this.conversation.isCompleted) { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.info, message: '已经没有更多的历史消息了哦' })); return; } const { nextReqMessageID, currentMessageList } = this.conversation; this.tim.getMessageList({ conversationID, nextReqMessageID, count: 15 }) .then((imResponse) => { this.store.dispatch(updateMessageAction({ nextReqMessageID: imResponse.data.nextReqMessageID, isCompleted: imResponse.data.isCompleted, currentMessageList: [...imResponse.data.messageList, ...currentMessageList] })); }); } /** * @description 获取群成员 */ getGroupMemberList(groupID) { this.tim.getGroupMemberList({ groupID, offset: this.currentMemberList.length, count: 30 }).then((imResponse) => { this.store.dispatch(updateCurrentMemberListAction({ currentMemberList: imResponse.data.memberList })); }); } initTim(config) { // const cosImport = await import('cos-js-sdk-v5'); // const timImport = await import('tim-js-sdk'); this.tim = TIM.create({ SDKAppID: config.sdkAppId, oversea: config.oversea, }); // 无日志级别 this.tim.setLogLevel(config.level || 1); // 注册 cos this.tim.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin }); } } TimHelperService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TimHelperService, deps: [{ token: i1.Store }, { token: NG_Tim_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); TimHelperService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TimHelperService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TimHelperService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.Store }, { type: undefined, decorators: [{ type: Inject, args: [NG_Tim_CONFIG] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlbmNlbnQtaW0vc3JjL3RpbS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQ0wsV0FBVyxFQUNYLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGNBQWMsRUFDZCxVQUFVLEVBQ1YsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw4QkFBOEIsRUFDOUIsbUJBQW1CLEVBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLG9CQUFvQixHQUNyQixNQUFNLG1CQUFtQixDQUFDO0FBSzNCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSw2QkFBNkIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdFLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQztBQUU3QixPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTTlELE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsWUFDVSxLQUFZLEVBQ1UsTUFBbUI7UUFEekMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNVLFdBQU0sR0FBTixNQUFNLENBQWE7UUFMbkQsY0FBUyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNDLGdCQUFXLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7UUFPM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQixT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QU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTTtZQUNyQyxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUEyRCxFQUFFLEVBQUU7WUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHTyxPQUFPLENBQUMsTUFBbUI7UUFDakMsbURBQW1EO1FBQ25ELGdEQUFnRDtRQUVoRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDLENBQUM7UUFDSCxRQUFRO1FBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QyxTQUFTO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7OzZHQWhPVSxnQkFBZ0IsdUNBVWpCLGFBQWE7aUhBVlosZ0JBQWdCLGNBRmYsTUFBTTsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFXSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgbG9naW5BY3Rpb24sXHJcbiAgcHVzaEN1cnJlbnRNZXNzYWdlTGlzdEFjdGlvbixcclxuICByZXNldENvbnZlcnNhdGlvbkFjdGlvbixcclxuICByZXNldFVzZXJBY3Rpb24sXHJcbiAgU0RLUmVhZHlBY3Rpb24sXHJcbiAgc2hvd0FjdGlvbixcclxuICB1cGRhdGVDb252ZXJzYXRpb25MaXN0QWN0aW9uLFxyXG4gIHVwZGF0ZUN1cnJlbnRDb252ZXJzYXRpb25BY3Rpb24sXHJcbiAgdXBkYXRlQ3VycmVudFVzZXJQcm9maWxlQWN0aW9uLFxyXG4gIHVwZGF0ZU1lc3NhZ2VBY3Rpb25cclxufSBmcm9tICcuL3N0b3JlL2FjdGlvbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBjb252ZXJzYXRpb25TZWxlY3RvcixcclxufSBmcm9tICcuL3N0b3JlL3NlbGVjdG9ycyc7XHJcblxyXG5pbXBvcnQgVGltLCB7IENvbnZlcnNhdGlvbiwgR3JvdXAsIEdyb3VwTWVtYmVyLCBJTVJlc3BvbnNlLCBNZXNzYWdlIH0gZnJvbSAndGltLWpzLXNkayc7XHJcblxyXG5pbXBvcnQgeyBDb252ZXJzYXRpb25TdGF0ZSB9IGZyb20gJy4vc3RvcmUvcmVkdWNlci9jb252ZXJzYXRpb24ucmVkdWNlcic7XHJcbmltcG9ydCB7IHJlc2V0Q3VycmVudE1lbWJlckxpc3RBY3Rpb24sIHVwZGF0ZUN1cnJlbnRNZW1iZXJMaXN0QWN0aW9uLCB1cGRhdGVHcm91cExpc3RBY3Rpb24gfSBmcm9tICcuL3N0b3JlL2FjdGlvbnMvZ3JvdXAuYWN0aW9uJztcclxuaW1wb3J0IHsgY3VycmVudE1lbWJlckxpc3RTZWxlY3RvciB9IGZyb20gJy4vc3RvcmUvc2VsZWN0b3JzL2dyb3VwLnNlbGVjdG9yJztcclxuXHJcbmltcG9ydCBUSU0gZnJvbSAndGltLWpzLXNkayc7XHJcblxyXG5pbXBvcnQgVElNVXBsb2FkUGx1Z2luIGZyb20gJ3RpbS11cGxvYWQtcGx1Z2luJztcclxuXHJcbmltcG9ydCB7IE1FU1NBR0VfU1RBVFVTLCBOR19UaW1fQ09ORklHIH0gZnJvbSAnLi9zaGFyZWQuZGF0YSc7XHJcbmltcG9ydCB7IE5nVGltQ29uZmlnIH0gZnJvbSAnLi90eXBlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbUhlbHBlclNlcnZpY2Uge1xyXG5cclxuICB0aW06IFRpbTtcclxuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblN0YXRlOyAvLyDlvZPliY3kvJror51cclxuICBjdXJyZW50TWVtYmVyTGlzdDogQXJyYXk8R3JvdXBNZW1iZXI+OyAvLyDlvZPliY3kvJror51cclxuICBldmVudEJ1cyQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgdG90YWxVblJlYWQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXHJcbiAgICBASW5qZWN0KE5HX1RpbV9DT05GSUcpIHB1YmxpYyBjb25maWc6IE5nVGltQ29uZmlnLFxyXG4gICkge1xyXG5cclxuICAgIHRoaXMuaW5pdFRpbShjb25maWcpO1xyXG4gICAgLy8g5Yid5aeL5YyW55uR5ZCs5ZmoXHJcbiAgICB0aGlzLmluaXRMaXN0ZW5lcigpO1xyXG5cclxuICAgIC8vIOiOt+WPluW9k+WJjeS8muivnVxyXG4gICAgdGhpcy5zdG9yZS5zZWxlY3QoY29udmVyc2F0aW9uU2VsZWN0b3IpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbiA9IHJlcztcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOiOt+WPluW9k+WJjeaIkOWRmFxyXG4gICAgdGhpcy5zdG9yZS5zZWxlY3QoY3VycmVudE1lbWJlckxpc3RTZWxlY3Rvcikuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMuY3VycmVudE1lbWJlckxpc3QgPSByZXM7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBsb2dpbih1c2VySWQ6IHN0cmluZywgdXNlclNpZzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXVzZXJTaWcpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCfor7fphY3nva7nrb7lkI3vvIEnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpbS5sb2dpbih7IHVzZXJJRDogdXNlcklkLCB1c2VyU2lnIH0pXHJcbiAgICAgIC50aGVuKChpbVJlc3BvbnNlOiBJTVJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50QnVzJC5uZXh0KCdsb2dpbicpO1xyXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobG9naW5BY3Rpb24oeyBpc0xvZ2luOiB0cnVlIH0pKTtcclxuICAgICAgICAvLyB0aGlzLnN0b3JlLmRpc3BhdGNoKHN0YXJ0Q29tcHV0ZUN1cnJlbnRBY3Rpb24oKSk7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzaG93QWN0aW9uKHsgbXNnVHlwZTogTUVTU0FHRV9TVEFUVVMuc3VjY2VzcywgbWVzc2FnZTogJ+eZu+W9leaIkOWKn++8gScgfSkpO1xyXG4gICAgICAgIGlmIChpbVJlc3BvbnNlLmRhdGEucmVwZWF0TG9naW4gPT09IHRydWUpIHtcclxuICAgICAgICAgIC8vIOagh+ivhui0puWPt+W3sueZu+W9le+8jOacrOasoeeZu+W9leaTjeS9nOS4uumHjeWkjeeZu+W9leOAgnYyLjUuMSDotbfmlK/mjIFcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGltUmVzcG9uc2UuZGF0YS5lcnJvckluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goKGltRXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ2xvZ2luIGVycm9yOicsIGltRXJyb3IpOyAvLyDnmbvlvZXlpLHotKXnmoTnm7jlhbPkv6Hmga9cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2dvdXQoKSB7XHJcbiAgICAvLyDoi6XmnInlvZPliY3kvJror53vvIzlnKjpgIDlh7rnmbvlvZXml7blt7Lor7vkuIrmiqVcclxuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbi5jdXJyZW50Q29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklEKSB7XHJcbiAgICAgIHRoaXMudGltLnNldE1lc3NhZ2VSZWFkKHsgY29udmVyc2F0aW9uSUQ6IHRoaXMuY29udmVyc2F0aW9uLmN1cnJlbnRDb252ZXJzYXRpb24uY29udmVyc2F0aW9uSUQgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRpbS5sb2dvdXQoKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgdGhpcy5ldmVudEJ1cyQubmV4dCgnbG9nb3V0Jyk7XHJcbiAgICAgIC8vIHRoaXMuc3RvcmUuZGlzcGF0Y2goc3RvcENvbXB1dGVDdXJyZW50QWN0aW9uKCkpO1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGxvZ2luQWN0aW9uKHsgaXNMb2dpbjogZmFsc2UgfSkpO1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlc2V0VXNlckFjdGlvbigpKTtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZXNldENvbnZlcnNhdGlvbkFjdGlvbigpKTtcclxuXHJcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2hvd0FjdGlvbih7IG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLnN1Y2Nlc3MsIG1lc3NhZ2U6ICflt7LpgIDlh7rvvIEnIH0pKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yid5aeL5YyWdGlt55uR5ZCs5Ye95pWwXHJcbiAgaW5pdExpc3RlbmVyKCkge1xyXG4gICAgLy8gc2RrIHJlYWR5XHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuU0RLX1JFQURZLCB0aGlzLm9uUmVhZHlTdGF0ZVVwZGF0ZSwgdGhpcyk7XHJcbiAgICAvLyBTREsgTk9UIFJFQURUXHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuU0RLX05PVF9SRUFEWSwgdGhpcy5vblJlYWR5U3RhdGVVcGRhdGUsIHRoaXMpO1xyXG4gICAgLy8g6KKr6Lii5Ye6XHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuS0lDS0VEX09VVCwgdGhpcy5vbktpY2tPdXQsIHRoaXMpO1xyXG4gICAgLy8gU0RL5YaF6YOo5Ye66ZSZXHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyk7XHJcbiAgICAvLyDmlLbliLDmlrDmtojmga9cclxuICAgIHRoaXMudGltLm9uKFRJTS5FVkVOVC5NRVNTQUdFX1JFQ0VJVkVELCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UsIHRoaXMpO1xyXG4gICAgLy8g5Lya6K+d5YiX6KGo5pu05pawXHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuQ09OVkVSU0FUSU9OX0xJU1RfVVBEQVRFRCwgdGhpcy5vblVwZGF0ZUNvbnZlcnNhdGlvbkxpc3QsIHRoaXMpO1xyXG4gICAgLy8g576k57uE5YiX6KGo5pu05pawXHJcbiAgICB0aGlzLnRpbS5vbihUSU0uRVZFTlQuR1JPVVBfTElTVF9VUERBVEVELCB0aGlzLm9uVXBkYXRlR3JvdXBMaXN0LCB0aGlzKTtcclxuICAgIC8vIOe9kee7nOebkea1i1xyXG4gICAgdGhpcy50aW0ub24oVElNLkVWRU5ULk5FVF9TVEFURV9DSEFOR0UsIHRoaXMub25OZXRTdGF0ZUNoYW5nZSwgdGhpcyk7XHJcbiAgICAvLyDlt7Lor7vlm57miadcclxuICAgIHRoaXMudGltLm9uKFRJTS5FVkVOVC5NRVNTQUdFX1JFQURfQllfUEVFUiwgdGhpcy5vbk1lc3NhZ2VSZWFkQnlQZWVyLCB0aGlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZWFkeVN0YXRlVXBkYXRlKHsgbmFtZSB9KSB7XHJcbiAgICBjb25zdCBpc1NES1JlYWR5ID0gbmFtZSA9PT0gVElNLkVWRU5ULlNES19SRUFEWSA/IHRydWUgOiBmYWxzZTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goU0RLUmVhZHlBY3Rpb24oeyBTREtSZWFkeVN0YXRlOiBpc1NES1JlYWR5IH0pKTtcclxuICAgIGlmIChpc1NES1JlYWR5KSB7XHJcbiAgICAgIHRoaXMudGltLmdldE15UHJvZmlsZSgpXHJcbiAgICAgICAgLnRoZW4oKHsgZGF0YSB9KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVwZGF0ZUN1cnJlbnRVc2VyUHJvZmlsZUFjdGlvbih7IHByb2ZpbGU6IGRhdGEgfSkpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2hvd0FjdGlvbih7XHJcbiAgICAgICAgICAgIG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLndhcm5pbmcsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uS2lja091dChldmVudDogeyBuYW1lOiBzdHJpbmcsIGRhdGE6IHsgdHlwZTogc3RyaW5nOyB9OyB9KSB7XHJcbiAgICB0aGlzLmV2ZW50QnVzJC5uZXh0KCdsb2dvdXQnKTtcclxuICAgIC8vIHRoaXMuc3RvcmUuZGlzcGF0Y2goc3RvcENvbXB1dGVDdXJyZW50QWN0aW9uKCkpO1xyXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChsb2dpbkFjdGlvbih7IGlzTG9naW46IGZhbHNlIH0pKTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocmVzZXRVc2VyQWN0aW9uKCkpO1xyXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZXNldENvbnZlcnNhdGlvbkFjdGlvbigpKTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2hvd0FjdGlvbih7IG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLndhcm5pbmcsIG1lc3NhZ2U6ICfnlLHkuo7lpJrlrp7kvovnmbvlvZXooqvouKLlh7rvvIzor7fph43mlrDnmbvlvZUhJyB9KSk7XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKHsgZGF0YSB9KSB7XHJcbiAgICBpZiAoZGF0YS5tZXNzYWdlICE9PSAnTmV0d29yayBFcnJvcicpIHtcclxuICAgICAgY29uc29sZS5sb2coJyVjIGVycm9yJywgJ2NvbG9yOnJlZDtmb250LXNpemU6MjBweDsnLCBkYXRhKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25NZXNzYWdlUmVhZEJ5UGVlcihldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygn5bey5Zue5omnJywgZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25SZWNlaXZlTWVzc2FnZSh7IGRhdGE6IG1lc3NhZ2VMaXN0IH0pIHtcclxuXHJcbiAgICAvLyB0aGlzLmhhbmRsZVZpZGVvTWVzc2FnZShtZXNzYWdlTGlzdCk7XHJcbiAgICAvLyB0aGlzLmhhbmRsZUF0KG1lc3NhZ2VMaXN0KTtcclxuICAgIC8vIHRoaXMuaGFuZGxlUXVpdEdyb3VwVGlwKG1lc3NhZ2VMaXN0KTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocHVzaEN1cnJlbnRNZXNzYWdlTGlzdEFjdGlvbih7IG1lc3NhZ2U6IG1lc3NhZ2VMaXN0IH0pKTtcclxuICB9XHJcblxyXG4gIC8vIOS8muivneWIl+ihqOabtOaWsFxyXG4gIG9uVXBkYXRlQ29udmVyc2F0aW9uTGlzdChldmVudDogeyBkYXRhOiBBcnJheTxDb252ZXJzYXRpb24+OyB9KSB7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVwZGF0ZUNvbnZlcnNhdGlvbkxpc3RBY3Rpb24oeyBjb252ZXJzYXRpb25MaXN0OiBldmVudC5kYXRhIH0pKTtcclxuICB9XHJcblxyXG4gIC8vIOe+pOWIl+ihqOabtOaWsFxyXG4gIG9uVXBkYXRlR3JvdXBMaXN0KGV2ZW50OiB7IGRhdGE6IEFycmF5PEdyb3VwPjsgfSkge1xyXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh1cGRhdGVHcm91cExpc3RBY3Rpb24oeyBncm91cExpc3Q6IGV2ZW50LmRhdGEgfSkpO1xyXG4gIH1cclxuXHJcbiAgb25OZXRTdGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygn572R57uc55uR5rWLOjonLCBldmVudCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIOWIh+aNouS8muivnVxyXG4gICAqIOiwg+eUqOaXtuacuu+8muWIh+aNouS8muivneaXtlxyXG4gICAqL1xyXG4gIGNoZWNrb3V0Q29udmVyc2F0aW9uKGNvbnZlcnNhdGlvbklEOiBzdHJpbmcpIHtcclxuXHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlc2V0Q3VycmVudE1lbWJlckxpc3RBY3Rpb24oKSk7XHJcblxyXG4gICAgLy8gMS7liIfmjaLkvJror53liY3vvIzlsIbliIfmjaLliY3nmoTkvJror53ov5vooYzlt7Lor7vkuIrmiqVcclxuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbi5jdXJyZW50Q29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklEKSB7XHJcbiAgICAgIGNvbnN0IHByZXZDb252ZXJzYXRpb25JRCA9IHRoaXMuY29udmVyc2F0aW9uLmN1cnJlbnRDb252ZXJzYXRpb24uY29udmVyc2F0aW9uSUQ7XHJcbiAgICAgIHRoaXMudGltLnNldE1lc3NhZ2VSZWFkKHsgY29udmVyc2F0aW9uSUQ6IHByZXZDb252ZXJzYXRpb25JRCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLuW+heWIh+aNoueahOS8muivneS5n+i/m+ihjOW3suivu+S4iuaKpVxyXG4gICAgdGhpcy50aW0uc2V0TWVzc2FnZVJlYWQoeyBjb252ZXJzYXRpb25JRCB9KTtcclxuICAgIC8vIDMuIOiOt+WPluS8muivneS/oeaBr1xyXG4gICAgcmV0dXJuIHRoaXMudGltLmdldENvbnZlcnNhdGlvblByb2ZpbGUoY29udmVyc2F0aW9uSUQpLnRoZW4oKHJlczogSU1SZXNwb25zZTx7IGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uOyB9PikgPT4ge1xyXG4gICAgICAvLyAzLjEg5pu05paw5b2T5YmN5Lya6K+dXHJcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXBkYXRlQ3VycmVudENvbnZlcnNhdGlvbkFjdGlvbih7IGNvbnZlcnNhdGlvbjogcmVzLmRhdGEuY29udmVyc2F0aW9uIH0pKTtcclxuICAgICAgLy8gMy4yIOiOt+WPlua2iOaBr+WIl+ihqFxyXG4gICAgICB0aGlzLmdldE1lc3NhZ2VMaXN0KGNvbnZlcnNhdGlvbklEKTtcclxuXHJcbiAgICAgIGlmIChyZXMuZGF0YS5jb252ZXJzYXRpb24udHlwZSA9PT0gVElNLlRZUEVTLkNPTlZfR1JPVVApIHtcclxuICAgICAgICB0aGlzLmdldEdyb3VwTWVtYmVyTGlzdChyZXMuZGF0YS5jb252ZXJzYXRpb24uZ3JvdXBQcm9maWxlLmdyb3VwSUQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuXHJcbiAgICB9KTtcclxuICAgIC8vIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgLy8gICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNob3dBY3Rpb24oeyBtc2dUeXBlOiBNRVNTQUdFX1NUQVRVUy5lcnJvciwgbWVzc2FnZTogZXJyIH0pKTtcclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOiOt+WPlua2iOaBr1xyXG4gICAqL1xyXG4gIGdldE1lc3NhZ2VMaXN0KGNvbnZlcnNhdGlvbklEOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbi5pc0NvbXBsZXRlZCkge1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNob3dBY3Rpb24oe1xyXG4gICAgICAgIG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLmluZm8sXHJcbiAgICAgICAgbWVzc2FnZTogJ+W3sue7j+ayoeacieabtOWkmueahOWOhuWPsua2iOaBr+S6huWTpidcclxuICAgICAgfSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IG5leHRSZXFNZXNzYWdlSUQsIGN1cnJlbnRNZXNzYWdlTGlzdCB9ID0gdGhpcy5jb252ZXJzYXRpb247XHJcbiAgICB0aGlzLnRpbS5nZXRNZXNzYWdlTGlzdCh7IGNvbnZlcnNhdGlvbklELCBuZXh0UmVxTWVzc2FnZUlELCBjb3VudDogMTUgfSlcclxuICAgICAgLnRoZW4oKGltUmVzcG9uc2U6IElNUmVzcG9uc2U8eyBpc0NvbXBsZXRlZDogYm9vbGVhbiwgbmV4dFJlcU1lc3NhZ2VJRDogc3RyaW5nLCBtZXNzYWdlTGlzdDogQXJyYXk8TWVzc2FnZT47IH0+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh1cGRhdGVNZXNzYWdlQWN0aW9uKHtcclxuICAgICAgICAgIG5leHRSZXFNZXNzYWdlSUQ6IGltUmVzcG9uc2UuZGF0YS5uZXh0UmVxTWVzc2FnZUlELFxyXG4gICAgICAgICAgaXNDb21wbGV0ZWQ6IGltUmVzcG9uc2UuZGF0YS5pc0NvbXBsZXRlZCxcclxuICAgICAgICAgIGN1cnJlbnRNZXNzYWdlTGlzdDogWy4uLmltUmVzcG9uc2UuZGF0YS5tZXNzYWdlTGlzdCwgLi4uY3VycmVudE1lc3NhZ2VMaXN0XVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDojrflj5bnvqTmiJDlkZhcclxuICAgKi9cclxuICBnZXRHcm91cE1lbWJlckxpc3QoZ3JvdXBJRDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRpbS5nZXRHcm91cE1lbWJlckxpc3Qoe1xyXG4gICAgICBncm91cElELFxyXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudE1lbWJlckxpc3QubGVuZ3RoLFxyXG4gICAgICBjb3VudDogMzBcclxuICAgIH0pLnRoZW4oKGltUmVzcG9uc2U6IElNUmVzcG9uc2U8eyBtZW1iZXJMaXN0OiBBcnJheTxHcm91cE1lbWJlcj47IH0+KSA9PiB7XHJcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXBkYXRlQ3VycmVudE1lbWJlckxpc3RBY3Rpb24oeyBjdXJyZW50TWVtYmVyTGlzdDogaW1SZXNwb25zZS5kYXRhLm1lbWJlckxpc3QgfSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBpbml0VGltKGNvbmZpZzogTmdUaW1Db25maWcpIHtcclxuICAgIC8vIGNvbnN0IGNvc0ltcG9ydCA9IGF3YWl0IGltcG9ydCgnY29zLWpzLXNkay12NScpO1xyXG4gICAgLy8gY29uc3QgdGltSW1wb3J0ID0gYXdhaXQgaW1wb3J0KCd0aW0tanMtc2RrJyk7XHJcblxyXG4gICAgdGhpcy50aW0gPSBUSU0uY3JlYXRlKHtcclxuICAgICAgU0RLQXBwSUQ6IGNvbmZpZy5zZGtBcHBJZCxcclxuICAgICAgb3ZlcnNlYTogY29uZmlnLm92ZXJzZWEsXHJcbiAgICB9KTtcclxuICAgIC8vIOaXoOaXpeW/l+e6p+WIq1xyXG4gICAgdGhpcy50aW0uc2V0TG9nTGV2ZWwoY29uZmlnLmxldmVsIHx8IDEpO1xyXG4gICAgLy8g5rOo5YaMIGNvc1xyXG4gICAgdGhpcy50aW0ucmVnaXN0ZXJQbHVnaW4oeyAndGltLXVwbG9hZC1wbHVnaW4nOiBUSU1VcGxvYWRQbHVnaW4gfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=