ng-plyr
Version:
An HTML5 media player for developers, built using Angular, having interface similar to Youtube player.
148 lines • 18.3 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class CastService {
constructor() {
this.isInitialized = false;
}
isSdkAvailable() {
return !!cast?.framework;
}
initializeCastApi() {
// Check if the Cast SDK is already initialized
if (this.isInitialized)
return;
console.log('Initializing Cast API...');
// Initialize the Cast SDK
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
// Store the CastContext object
this.castContext = cast.framework.CastContext.getInstance();
// Initializing Remote Player
this.player = new cast.framework.RemotePlayer();
this.playerController = new cast.framework.RemotePlayerController(this.player);
this.isInitialized = true;
}
// Cast Media to receiver
loadMedia(mediaURL, contentType = 'video/mp4') {
if (!mediaURL) {
this.currentSession.endSession(false);
}
let mediaInfo = new chrome.cast.media.MediaInfo(mediaURL, contentType);
let request = new chrome.cast.media.LoadRequest(mediaInfo);
this.currentSession = this.castContext.getCurrentSession();
if (this.currentSession) {
this.currentSession.loadMedia(request).then(() => {
console.log('Media load succeed');
}).catch((error) => {
console.error('Error in casting media: ' + error);
});
}
else {
console.log('Session ended or not present.');
}
}
getCastContext() {
return this.castContext;
}
// getCurrentSession(): any {
// return this.currentSession;
// }
isCasting() {
return !!this.currentSession;
}
// Stop casting or just stop session
endCurrentSession(stopCasting) {
this.currentSession?.endSession(stopCasting);
this.stopListeningRemotePlayerEvents();
}
// Remote Player controls
playOrPauseCasting() {
if (this.currentSession && !this.player.isPlayingBreak) {
this.playerController.playOrPause();
}
}
play() {
if (this.player?.isPaused) {
this.playOrPauseCasting();
}
}
pause() {
if (!this.player?.isPaused) {
this.playOrPauseCasting();
}
}
stopCasting() {
if (this.currentSession) {
this.playerController.stop();
}
}
// Seeks the media item to player currentTime value
seekTo(toSec) {
if (this.currentSession && this.player.canSeek) {
this.player.currentTime = toSec;
this.playerController.seek();
}
}
muteOrUnmute() {
if (this.currentSession) {
this.playerController.muteOrUnmute();
}
}
mute() {
if (!this.player?.isMuted) {
this.muteOrUnmute();
}
}
unmute() {
if (this.player?.isMuted) {
this.muteOrUnmute();
}
}
setVolumeLevel(volume) {
if (this.currentSession) {
// Sets the volume level of the connected device to the player volumeLevel value.
this.player.volumeLevel = volume;
this.playerController.setVolumeLevel();
}
}
// Skip the ad currently playing on the receiver
skipAd() {
if (this.currentSession) {
this.playerController.skipAd();
}
}
// Create RemotePlayer events
onCastEvent(eventName, cb) {
return new Promise((resolve, reject) => {
this.playerController.addEventListener(cast.framework.RemotePlayerEventType[eventName], () => {
try {
cb();
}
catch (error) {
reject(error);
}
});
resolve('Added event listener on ' + eventName);
});
}
// Stop all event listeners on playerController
stopListeningRemotePlayerEvents() {
console.info('Stopped listening to cast events');
this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, () => { });
this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, () => { });
this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, () => { });
this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, () => { });
this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, () => { });
}
}
CastService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: CastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
CastService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: CastService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: CastService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGx5ci9zcmMvbGliL3NlcnZpY2VzL2Nhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVEzQyxNQUFNLE9BQU8sV0FBVztJQU90QjtRQU5RLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBTWYsQ0FBQztJQUdoQixjQUFjO1FBQ1osT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRS9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUV4QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ2xELHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDZCQUE2QjtZQUN0RSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtTQUN6RCxDQUFDLENBQUM7UUFFSCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU1RCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLGFBQWEsR0FBRyxJ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SSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLEVBQUUsR0FBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLEVBQUUsR0FBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLEVBQUUsR0FBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLEVBQUUsR0FBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQzs7d0dBdEtVLFdBQVc7NEdBQVgsV0FBVyxjQUZWLE1BQU07MkZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGNhc3Q6IGFueTtcclxuZGVjbGFyZSBjb25zdCBjaHJvbWU6IGFueTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENhc3RTZXJ2aWNlIHtcclxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGNhc3RDb250ZXh0OiBhbnk7XHJcbiAgcHJpdmF0ZSBjdXJyZW50U2Vzc2lvbjogYW55O1xyXG4gIHBsYXllcjphbnk7XHJcbiAgcGxheWVyQ29udHJvbGxlcjphbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgXHJcbiAgaXNTZGtBdmFpbGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISFjYXN0Py5mcmFtZXdvcms7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBDYXN0IFNESyBpcyBhbHJlYWR5IGluaXRpYWxpemVkXHJcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc29sZS5sb2coJ0luaXRpYWxpemluZyBDYXN0IEFQSS4uLicpO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgdGhlIENhc3QgU0RLXHJcbiAgICBjYXN0LmZyYW1ld29yay5DYXN0Q29udGV4dC5nZXRJbnN0YW5jZSgpLnNldE9wdGlvbnMoe1xyXG4gICAgICByZWNlaXZlckFwcGxpY2F0aW9uSWQ6IGNocm9tZS5jYXN0Lm1lZGlhLkRFRkFVTFRfTUVESUFfUkVDRUlWRVJfQVBQX0lELFxyXG4gICAgICBhdXRvSm9pblBvbGljeTogY2hyb21lLmNhc3QuQXV0b0pvaW5Qb2xpY3kuT1JJR0lOX1NDT1BFRFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU3RvcmUgdGhlIENhc3RDb250ZXh0IG9iamVjdFxyXG4gICAgdGhpcy5jYXN0Q29udGV4dCA9IGNhc3QuZnJhbWV3b3JrLkNhc3RDb250ZXh0LmdldEluc3RhbmNlKCk7XHJcbiAgICBcclxuICAgIC8vIEluaXRpYWxpemluZyBSZW1vdGUgUGxheWVyXHJcbiAgICB0aGlzLnBsYXllciA9IG5ldyBjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXIoKTtcclxuICAgIHRoaXMucGxheWVyQ29udHJvbGxlciA9IG5ldyBjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJDb250cm9sbGVyKHRoaXMucGxheWVyKTtcclxuICAgIFxyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcbiAgXHJcbiAgLy8gQ2FzdCBNZWRpYSB0byByZWNlaXZlclxyXG4gIGxvYWRNZWRpYShtZWRpYVVSTD86c3RyaW5nLCBjb250ZW50VHlwZTpzdHJpbmcgPSAndmlkZW8vbXA0Jykge1xyXG4gICAgaWYgKCFtZWRpYVVSTCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTZXNzaW9uLmVuZFNlc3Npb24oZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtZWRpYUluZm8gPSBuZXcgY2hyb21lLmNhc3QubWVkaWEuTWVkaWFJbmZvKG1lZGlhVVJMLCBjb250ZW50VHlwZSk7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBjaHJvbWUuY2FzdC5tZWRpYS5Mb2FkUmVxdWVzdChtZWRpYUluZm8pO1xyXG5cclxuICAgIHRoaXMuY3VycmVudFNlc3Npb24gPSB0aGlzLmNhc3RDb250ZXh0LmdldEN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmN1cnJlbnRTZXNzaW9uKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFNlc3Npb24ubG9hZE1lZGlhKHJlcXVlc3QpLnRoZW4oXHJcbiAgICAgICAgKCk9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnTWVkaWEgbG9hZCBzdWNjZWVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKS5jYXRjaCgoZXJyb3I6IHN0cmluZyk9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gY2FzdGluZyBtZWRpYTogJyArIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnU2Vzc2lvbiBlbmRlZCBvciBub3QgcHJlc2VudC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENhc3RDb250ZXh0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYXN0Q29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vIGdldEN1cnJlbnRTZXNzaW9uKCk6IGFueSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5jdXJyZW50U2Vzc2lvbjtcclxuICAvLyB9XHJcblxyXG4gIGlzQ2FzdGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudFNlc3Npb247XHJcbiAgfVxyXG5cclxuICAvLyBTdG9wIGNhc3Rpbmcgb3IganVzdCBzdG9wIHNlc3Npb25cclxuICBlbmRDdXJyZW50U2Vzc2lvbihzdG9wQ2FzdGluZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jdXJyZW50U2Vzc2lvbj8uZW5kU2Vzc2lvbihzdG9wQ2FzdGluZyk7XHJcbiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdSZW1vdGVQbGF5ZXJFdmVudHMoKTtcclxuICB9XHJcblxyXG5cdC8vIFJlbW90ZSBQbGF5ZXIgY29udHJvbHNcclxuXHRwcml2YXRlIHBsYXlPclBhdXNlQ2FzdGluZygpIHtcclxuXHRcdGlmICh0aGlzLmN1cnJlbnRTZXNzaW9uICYmICF0aGlzLnBsYXllci5pc1BsYXlpbmdCcmVhaykge1xyXG5cdFx0XHR0aGlzLnBsYXllckNvbnRyb2xsZXIucGxheU9yUGF1c2UoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gIHBsYXkoKSB7XHJcbiAgICBpZiAodGhpcy5wbGF5ZXI/LmlzUGF1c2VkKSB7XHJcbiAgICAgIHRoaXMucGxheU9yUGF1c2VDYXN0aW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXVzZSgpIHtcclxuICAgIGlmICghdGhpcy5wbGF5ZXI/LmlzUGF1c2VkKSB7XHJcbiAgICAgIHRoaXMucGxheU9yUGF1c2VDYXN0aW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cdFxyXG5cdHN0b3BDYXN0aW5nKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb24pIHtcclxuICAgICAgdGhpcy5wbGF5ZXJDb250cm9sbGVyLnN0b3AoKTtcclxuICAgIH1cclxuXHR9XHJcblxyXG4gIC8vIFNlZWtzIHRoZSBtZWRpYSBpdGVtIHRvIHBsYXllciBjdXJyZW50VGltZSB2YWx1ZVxyXG5cdHNlZWtUbyh0b1NlYzogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U2Vzc2lvbiAmJiB0aGlzLnBsYXllci5jYW5TZWVrKSB7XHJcbiAgICAgIHRoaXMucGxheWVyLmN1cnJlbnRUaW1lID0gdG9TZWM7XHJcbiAgICAgIHRoaXMucGxheWVyQ29udHJvbGxlci5zZWVrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgbXV0ZU9yVW5tdXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb24pIHtcclxuICAgICAgdGhpcy5wbGF5ZXJDb250cm9sbGVyLm11dGVPclVubXV0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBtdXRlKCkge1xyXG4gICAgaWYgKCF0aGlzLnBsYXllcj8uaXNNdXRlZCkge1xyXG4gICAgICB0aGlzLm11dGVPclVubXV0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICB1bm11dGUoKSB7XHJcbiAgICBpZiAodGhpcy5wbGF5ZXI/LmlzTXV0ZWQpIHtcclxuICAgICAgdGhpcy5tdXRlT3JVbm11dGUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgc2V0Vm9sdW1lTGV2ZWwodm9sdW1lOm51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb24pIHtcclxuICAgICAgLy8gU2V0cyB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBjb25uZWN0ZWQgZGV2aWNlIHRvIHRoZSBwbGF5ZXIgdm9sdW1lTGV2ZWwgdmFsdWUuXHJcbiAgICAgIHRoaXMucGxheWVyLnZvbHVtZUxldmVsID0gdm9sdW1lO1xyXG4gICAgICB0aGlzLnBsYXllckNvbnRyb2xsZXIuc2V0Vm9sdW1lTGV2ZWwoKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gU2tpcCB0aGUgYWQgY3VycmVudGx5IHBsYXlpbmcgb24gdGhlIHJlY2VpdmVyXHJcbiAgc2tpcEFkKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb24pIHtcclxuICAgICAgdGhpcy5wbGF5ZXJDb250cm9sbGVyLnNraXBBZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ3JlYXRlIFJlbW90ZVBsYXllciBldmVudHNcclxuICBvbkNhc3RFdmVudChldmVudE5hbWU6c3RyaW5nLCBjYjpGdW5jdGlvbikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT4ge1xyXG4gICAgICB0aGlzLnBsYXllckNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJFdmVudFR5cGVbZXZlbnROYW1lXSwgKCk9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNiKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmVzb2x2ZSgnQWRkZWQgZXZlbnQgbGlzdGVuZXIgb24gJyArIGV2ZW50TmFtZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFN0b3AgYWxsIGV2ZW50IGxpc3RlbmVycyBvbiBwbGF5ZXJDb250cm9sbGVyXHJcbiAgc3RvcExpc3RlbmluZ1JlbW90ZVBsYXllckV2ZW50cygpIHtcclxuICAgIGNvbnNvbGUuaW5mbygnU3RvcHBlZCBsaXN0ZW5pbmcgdG8gY2FzdCBldmVudHMnKTtcclxuICAgIHRoaXMucGxheWVyQ29udHJvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5JU19QQVVTRURfQ0hBTkdFRCwgKCk9PiB7fSk7XHJcbiAgICB0aGlzLnBsYXllckNvbnRyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJFdmVudFR5cGUuSVNfUExBWUlOR19CUkVBS19DSEFOR0VELCAoKT0+IHt9KTtcclxuICAgIHRoaXMucGxheWVyQ29udHJvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKGNhc3QuZnJhbWV3b3JrLlJlbW90ZVBsYXllckV2ZW50VHlwZS5DVVJSRU5UX1RJTUVfQ0hBTkdFRCwgKCk9PiB7fSk7XHJcbiAgICB0aGlzLnBsYXllckNvbnRyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihjYXN0LmZyYW1ld29yay5SZW1vdGVQbGF5ZXJFdmVudFR5cGUuVk9MVU1FX0xFVkVMX0NIQU5HRUQsICgpPT4ge30pO1xyXG4gICAgdGhpcy5wbGF5ZXJDb250cm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoY2FzdC5mcmFtZXdvcmsuUmVtb3RlUGxheWVyRXZlbnRUeXBlLklTX01VVEVEX0NIQU5HRUQsICgpPT4ge30pO1xyXG4gIH1cclxufVxyXG4iXX0=