UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

244 lines 19.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { PdfWrapper } from './js-wrapper/pdf-wrapper'; import { PdfAnnotateWrapper } from './js-wrapper/pdf-annotate-wrapper'; import { BehaviorSubject, Subject } from 'rxjs'; import { EmLoggerService } from '../logging/em-logger.service'; import { RotationModel } from '../model/rotation-factory.model'; var PdfRenderService = /** @class */ (function () { function PdfRenderService(pdfWrapper, log, pdfAnnotateWrapper) { this.pdfWrapper = pdfWrapper; this.log = log; this.pdfAnnotateWrapper = pdfAnnotateWrapper; this.listPages = []; this.log.setClass('PdfRenderService'); this.dataLoadedSubject = new BehaviorSubject(false); this.listPagesSubject = new Subject(); } /** * @return {?} */ PdfRenderService.prototype.getDataLoadedSub = /** * @return {?} */ function () { return this.dataLoadedSubject; }; /** * @param {?} isLoaded * @return {?} */ PdfRenderService.prototype.dataLoadedUpdate = /** * @param {?} isLoaded * @return {?} */ function (isLoaded) { this.dataLoadedSubject.next(isLoaded); }; /** * @return {?} */ PdfRenderService.prototype.getRenderOptions = /** * @return {?} */ function () { return Object.assign({}, this.RENDER_OPTIONS); }; /** * @param {?} RENDER_OPTIONS * @return {?} */ PdfRenderService.prototype.setRenderOptions = /** * @param {?} RENDER_OPTIONS * @return {?} */ function (RENDER_OPTIONS) { this.RENDER_OPTIONS = RENDER_OPTIONS; }; /** * @return {?} */ PdfRenderService.prototype.getViewerElementRef = /** * @return {?} */ function () { return this.viewerElementRef; }; /** * @return {?} */ PdfRenderService.prototype.getPdfPages = /** * @return {?} */ function () { return this.pdfPages; }; /** * @param {?=} viewerElementRef * @return {?} */ PdfRenderService.prototype.render = /** * @param {?=} viewerElementRef * @return {?} */ function (viewerElementRef) { var _this = this; if (viewerElementRef != null) { this.viewerElementRef = viewerElementRef; } /** @type {?} */ var renderOptions = this.getRenderOptions(); this.pdfWrapper.getDocument(renderOptions.documentId) .then(function (pdf) { renderOptions.pdfDocument = pdf; /** @type {?} */ var viewer = _this.viewerElementRef.nativeElement; viewer.innerHTML = ''; _this.pdfPages = pdf.pdfInfo.numPages; _this.listPages = []; var _loop_1 = function (i) { /** @type {?} */ var pageDom = _this.pdfAnnotateWrapper.createPage(i); // Create a copy of the render options for each page. /** @type {?} */ var pageOptions = Object.assign({}, renderOptions); viewer.appendChild(pageDom); _this.addDomPage(pageDom, i); pdf.getPage(i).then(function (pdfPage) { // Get current page rotation from page rotation objects pageOptions.rotate = _this.addPageRotation(renderOptions, pageOptions, pdfPage); setTimeout(function () { _this.pdfAnnotateWrapper.renderPage(i, pageOptions).then(function () { if (i === _this.pdfPages) { _this.setRenderOptions(renderOptions); _this.dataLoadedUpdate(true); _this.listPagesSubject.next(_this.listPages); } }); }); }); }; for (var i = 1; i < _this.pdfPages + 1; i++) { _loop_1(i); } }).catch(function (error) { /** @type {?} */ var errorMessage = new Error('Unable to render your supplied PDF. ' + renderOptions.documentId + '. Error is: ' + error); _this.log.error('Encountered error while rendering the PDF:' + errorMessage); }); }; /** * @param {?} pageDom * @param {?} pageNumber * @return {?} */ PdfRenderService.prototype.addDomPage = /** * @param {?} pageDom * @param {?} pageNumber * @return {?} */ function (pageDom, pageNumber) { /** @type {?} */ var pagedetails = new RotationModel(pageNumber, pageDom); /** @type {?} */ var index = this.listPages.findIndex(function (pageElement) { return pageElement.pageNumber === pageNumber; }); if (index > 0) { this.listPages[index] = pagedetails; } else { this.listPages.push(pagedetails); } }; /** * @param {?} renderOptions * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ PdfRenderService.prototype.addPageRotation = /** * @param {?} renderOptions * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ function (renderOptions, pageOptions, pdfPage) { /** @type {?} */ var rotation = this.getPageRotation(pageOptions, pdfPage); if (!rotation) { renderOptions.rotationPages.push({ page: pdfPage.pageNumber, rotate: pdfPage.rotate }); rotation = pdfPage.rotate; } return rotation; }; /** * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ PdfRenderService.prototype.getPageRotation = /** * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ function (pageOptions, pdfPage) { return pageOptions.rotationPages .filter(function (rotateObj) { return rotateObj.page === pdfPage.pageNumber; }) .map(function (rotateObj) { return rotateObj.rotate; })[0]; }; PdfRenderService.decorators = [ { type: Injectable } ]; PdfRenderService.ctorParameters = function () { return [ { type: PdfWrapper }, { type: EmLoggerService }, { type: PdfAnnotateWrapper } ]; }; return PdfRenderService; }()); export { PdfRenderService }; if (false) { /** * @type {?} * @private */ PdfRenderService.prototype.viewerElementRef; /** * @type {?} * @private */ PdfRenderService.prototype.RENDER_OPTIONS; /** * @type {?} * @private */ PdfRenderService.prototype.pdfPages; /** * @type {?} * @private */ PdfRenderService.prototype.dataLoadedSubject; /** @type {?} */ PdfRenderService.prototype.listPagesSubject; /** @type {?} */ PdfRenderService.prototype.listPages; /** * @type {?} * @private */ PdfRenderService.prototype.pdfWrapper; /** * @type {?} * @private */ PdfRenderService.prototype.log; /** * @type {?} * @private */ PdfRenderService.prototype.pdfAnnotateWrapper; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFO0lBV0ksMEJBQW9CLFVBQXNCLEVBQ3RCLEdBQW9CLEVBQ3BCLGtCQUFzQztRQUZ0QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQ3BCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFKMUQsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFLNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVELDJDQUFnQjs7O0lBQWhCO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDOzs7OztJQUVELDJDQUFnQjs7OztJQUFoQixVQUFpQixRQUFpQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxD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LENBQUM7Ozs7OztJQUVELDBDQUFlOzs7OztJQUFmLFVBQWdCLFdBQTBCLEVBQUUsT0FBWTtRQUN0RCxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWE7YUFDN0IsTUFBTSxDQUFDLFVBQUEsU0FBUyxJQUFJLE9BQUEsU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsVUFBVSxFQUFyQyxDQUFxQyxDQUFDO2FBQzFELEdBQUcsQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLFNBQVMsQ0FBQyxNQUFNLEVBQWhCLENBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDOztnQkE1R0osVUFBVTs7O2dCQU5GLFVBQVU7Z0JBR1YsZUFBZTtnQkFGZixrQkFBa0I7O0lBa0gzQix1QkFBQztDQUFBLEFBN0dELElBNkdDO1NBNUdZLGdCQUFnQjs7Ozs7O0lBRXpCLDRDQUFxQzs7Ozs7SUFDckMsMENBQXNDOzs7OztJQUN0QyxvQ0FBeUI7Ozs7O0lBQ3pCLDZDQUFvRDs7SUFFcEQsNENBQTJDOztJQUMzQyxxQ0FBZ0M7Ozs7O0lBRXBCLHNDQUE4Qjs7Ozs7SUFDOUIsK0JBQTRCOzs7OztJQUM1Qiw4Q0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi9qcy13cmFwcGVyL3JlbmRlck9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgUGRmV3JhcHBlciB9IGZyb20gJy4vanMtd3JhcHBlci9wZGYtd3JhcHBlcic7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9yb3RhdGlvbi1mYWN0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBkZlJlbmRlclNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSB2aWV3ZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnM7XG4gICAgcHJpdmF0ZSBwZGZQYWdlczogbnVtYmVyO1xuICAgIHByaXZhdGUgZGF0YUxvYWRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcblxuICAgIGxpc3RQYWdlc1N1YmplY3Q6IFN1YmplY3Q8Um90YXRpb25Nb2RlbFtdPjtcbiAgICBsaXN0UGFnZXM6IFJvdGF0aW9uTW9kZWxbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZXcmFwcGVyOiBQZGZXcmFwcGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZBbm5vdGF0ZVdyYXBwZXI6IFBkZkFubm90YXRlV3JhcHBlcikge1xuICAgICAgICB0aGlzLmxvZy5zZXRDbGFzcygnUGRmUmVuZGVyU2VydmljZScpO1xuICAgICAgICB0aGlzLmRhdGFMb2FkZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgICAgIHRoaXMubGlzdFBhZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUxvYWRlZFN1YigpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGVkU3ViamVjdDtcbiAgICB9XG5cbiAgICBkYXRhTG9hZGVkVXBkYXRlKGlzTG9hZGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1YmplY3QubmV4dChpc0xvYWRlZCk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuUkVOREVSX09QVElPTlMpO1xuICAgIH1cblxuICAgIHNldFJlbmRlck9wdGlvbnMoUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuICAgICAgICB0aGlzLlJFTkRFUl9PUFRJT05TID0gUkVOREVSX09QVElPTlM7XG4gICAgfVxuXG4gICAgZ2V0Vmlld2VyRWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyRWxlbWVudFJlZjtcbiAgICB9XG5cbiAgICBnZXRQZGZQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wZGZQYWdlcztcbiAgICB9XG4gICAgXG4gICAgcmVuZGVyKHZpZXdlckVsZW1lbnRSZWY/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICh2aWV3ZXJFbGVtZW50UmVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyRWxlbWVudFJlZiA9IHZpZXdlckVsZW1lbnRSZWY7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW5kZXJPcHRpb25zID0gdGhpcy5nZXRSZW5kZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucGRmV3JhcHBlci5nZXREb2N1bWVudChyZW5kZXJPcHRpb25zLmRvY3VtZW50SWQpXG4gICAgICAgICAgICAudGhlbihwZGYgPT4ge1xuICAgICAgICAgICAgICAgIHJlbmRlck9wdGlvbnMucGRmRG9jdW1lbnQgPSBwZGY7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdmlld2VyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMucGRmUGFnZXMgPSBwZGYucGRmSW5mby5udW1QYWdlcztcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBkZlBhZ2VzICsgMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VEb20gPSB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5jcmVhdGVQYWdlKGkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSByZW5kZXIgb3B0aW9ucyBmb3IgZWFjaCBwYWdlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJlbmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZURvbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRG9tUGFnZShwYWdlRG9tLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgcGRmLmdldFBhZ2UoaSkudGhlbigocGRmUGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgcGFnZSByb3RhdGlvbiBmcm9tIHBhZ2Ugcm90YXRpb24gb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9wdGlvbnMucm90YXRlID0gdGhpcy5hZGRQYWdlUm90YXRpb24ocmVuZGVyT3B0aW9ucywgcGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIucmVuZGVyUGFnZShpLCBwYWdlT3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLnBkZlBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlck9wdGlvbnMocmVuZGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWRVcGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlc1N1YmplY3QubmV4dCh0aGlzLmxpc3RQYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaChcbiAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlbmRlciB5b3VyIHN1cHBsaWVkIFBERi4gJyArXG4gICAgICAgICAgICAgICAgcmVuZGVyT3B0aW9ucy5kb2N1bWVudElkICsgJy4gRXJyb3IgaXM6ICcgKyBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ0VuY291bnRlcmVkIGVycm9yIHdoaWxlIHJlbmRlcmluZyB0aGUgUERGOicgKyBlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkRG9tUGFnZShwYWdlRG9tOiBhbnksIHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwYWdlZGV0YWlscyA9IG5ldyBSb3RhdGlvbk1vZGVsKHBhZ2VOdW1iZXIsIHBhZ2VEb20pO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdFBhZ2VzLmZpbmRJbmRleChwYWdlRWxlbWVudCA9PiBwYWdlRWxlbWVudC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5saXN0UGFnZXNbaW5kZXhdID0gcGFnZWRldGFpbHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RQYWdlcy5wdXNoKHBhZ2VkZXRhaWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFBhZ2VSb3RhdGlvbihyZW5kZXJPcHRpb25zOiBSZW5kZXJPcHRpb25zLCBwYWdlT3B0aW9uczogUmVuZGVyT3B0aW9ucywgcGRmUGFnZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdGhpcy5nZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICAgICAgICByZW5kZXJPcHRpb25zLnJvdGF0aW9uUGFnZXMucHVzaCh7cGFnZTogcGRmUGFnZS5wYWdlTnVtYmVyLCByb3RhdGU6IHBkZlBhZ2Uucm90YXRlfSk7XG4gICAgICAgICAgICByb3RhdGlvbiA9IHBkZlBhZ2Uucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3RhdGlvbjtcbiAgICB9XG5cbiAgICBnZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnM6IFJlbmRlck9wdGlvbnMsIHBkZlBhZ2U6IGFueSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gcGFnZU9wdGlvbnMucm90YXRpb25QYWdlc1xuICAgICAgICAuZmlsdGVyKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucGFnZSA9PT0gcGRmUGFnZS5wYWdlTnVtYmVyKVxuICAgICAgICAubWFwKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucm90YXRlKVswXTtcbiAgICB9XG59XG4iXX0=