UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

127 lines 19.6 kB
import { Injectable } from "@angular/core"; import isUndefined from "lodash/isUndefined"; import { merge, of } from "rxjs"; import { filter, map, takeWhile, tap } from "rxjs/operators"; import * as i0 from "@angular/core"; /** @ignore */ const DEFAULT_RANGE = { start: 0, end: 0 }; /** * <example-url>./../examples/index.html#/common/virtual-viewport-manager</example-url> */ export class VirtualViewportManager { constructor() { this._currentPageRange = DEFAULT_RANGE; } /** * Entry point for VirtualViewportManager * @param viewportRef - CDK Viewport reference on which you want to perform observations * @returns self (VirtualViewportManager) */ setViewport(viewportRef) { if (this._viewportRef) { throw new Error("Viewport is already set"); } if (!viewportRef) { throw new Error("Invalid viewport provided"); } this._viewportRef = viewportRef; this.checkViewportUntilValid(); return this; } get currentPageRange() { return this._currentPageRange; } /** * Observes the changes of viewport and emits when current range has been rendered * and a new one should be loaded * @param config accepts and IVirtualPageConfig which contains page observer's configuration * It is requiring pageSize prop to be set to delegate responsibility of pagination to ViewportManager * @returns Stream of pages with fixed size */ observeNextPage$(config) { if (!this._viewportRef) { throw new Error("Please provide the viewport"); } this._pageSize = config.pageSize; this.updateCurrentPage({ start: 0, end: config.pageSize }); // Note: renderedRangeStream does not emit "first page" which can be a problem const streamParticipants = [ this._viewportRef.renderedRangeStream, ]; const shouldEmitFirstPage = !isUndefined(config.emitFirstPage) ? config.emitFirstPage : true; if (shouldEmitFirstPage) { streamParticipants.push(of(this.currentPageRange)); } return merge(...streamParticipants).pipe(this.mapToPageSize(config.pageSize)); } getFilters() { return { type: "virtualScroll", value: this.currentPageRange, }; } /** * Resetting viewportManager to initial state * @param options In case VirtualViewportManager is used along with filters (sorting, search...) * we can prevent default behaviour of emitting firstPageEvent and let user to set first batch of data * @returns void */ reset(options = { emitFirstPage: true }) { if (!this._viewportRef) { // Note: If there is no viewportRef or it been invoked // prematurely we will suppress that method call; return; } // Note: Since we're relying on Viewport's renderedRangeStream // we need to scroll on top to be reset the stream to it's starting point this._viewportRef.scrollToOffset(0); // Note: Setting the end value equal to pageSize to avoid ViewportManager // incrementing the current page and emitting first page event this._currentPageRange = { ...DEFAULT_RANGE, end: options.emitFirstPage ? 0 : this._pageSize, }; // Note: Skipping one tick to let CDK Viewport update his internal properties setTimeout(() => { // Note: Resetting the viewport to initial state this._viewportRef.setRenderedRange(DEFAULT_RANGE); this._viewportRef.checkViewportSize(); }); } updateCurrentPage(range) { return (this._currentPageRange = range); } // Note: Temporary fix related to the CDK Viewport bug // https://github.com/angular/components/issues/15622 // To ensure that CDK Viewport got correct parameters // we recheck the viewport size if it is equal to 0 checkViewportUntilValid() { this._viewportRef .elementScrolled() .pipe(takeWhile(() => this._viewportRef.getViewportSize() === 0), tap(() => this._viewportRef.checkViewportSize())) .subscribe(); } mapToPageSize(pageSize) { return (source) => source.pipe( // Note: We have to reduce number of events to only pagination related, // By emitting only when previous page range was scrolled to the end filter((renderedRange) => this.currentPageRange.end <= renderedRange.end), map((range, index) => { // Note: Avoiding incrementation for the first emission if (index === 0) { return this.currentPageRange; } return this.updateCurrentPage({ start: this.currentPageRange.end, end: this.currentPageRange.end + pageSize, }); })); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualViewportManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualViewportManager }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VirtualViewportManager, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC12aWV3cG9ydC1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdmlydHVhbC12aWV3cG9ydC1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBd0MsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLN0QsY0FBYztBQUNkLE1BQU0sYUFBYSxHQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFFdEQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sc0JBQXNCO0lBRG5DO1FBR1ksc0JBQWlCLEdBQWMsYUFBYSxDQUFDO0tBNkl4RDtJQTFJRzs7OztPQUlHO0lBQ0ksV0FBVyxDQUNkLFdBQXFDO1FBRXJDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFFaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0Is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QUUsQ0FDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUNyRCxFQUNELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQix1REFBdUQ7WUFDdkQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUNiLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQ2hDO1lBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRztnQkFDaEMsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsUUFBUTthQUM1QyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ1YsQ0FBQzsrR0E5SVEsc0JBQXNCO21IQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgTGlzdFJhbmdlIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzVW5kZWZpbmVkIGZyb20gXCJsb2Rhc2gvaXNVbmRlZmluZWRcIjtcbmltcG9ydCB7IG1lcmdlLCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlV2hpbGUsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBJRmlsdGVyLCBJRmlsdGVyUHViIH0gZnJvbSBcIi4vZGF0YS1zb3VyY2UvcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgSVZpcnR1YWxQYWdlQ29uZmlnLCBJVmlydHVhbFZpZXdwb3J0UmVzZXRPcHRpb25zIH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgREVGQVVMVF9SQU5HRTogTGlzdFJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbi8qKlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvY29tbW9uL3ZpcnR1YWwtdmlld3BvcnQtbWFuYWdlcjwvZXhhbXBsZS11cmw+XG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsVmlld3BvcnRNYW5hZ2VyIGltcGxlbWVudHMgSUZpbHRlclB1YiB7XG4gICAgcHJpdmF0ZSBfdmlld3BvcnRSZWY6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBwcml2YXRlIF9jdXJyZW50UGFnZVJhbmdlOiBMaXN0UmFuZ2UgPSBERUZBVUxUX1JBTkdFO1xuICAgIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBFbnRyeSBwb2ludCBmb3IgVmlydHVhbFZpZXdwb3J0TWFuYWdlclxuICAgICAqIEBwYXJhbSAgdmlld3BvcnRSZWYgLSBDREsgVmlld3BvcnQgcmVmZXJlbmNlIG9uIHdoaWNoIHlvdSB3YW50IHRvIHBlcmZvcm0gb2JzZXJ2YXRpb25zXG4gICAgICogQHJldHVybnMgc2VsZiAoVmlydHVhbFZpZXdwb3J0TWFuYWdlcilcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vmlld3BvcnQoXG4gICAgICAgIHZpZXdwb3J0UmVmOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRcbiAgICApOiBWaXJ0dWFsVmlld3BvcnRNYW5hZ2VyIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0UmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWaWV3cG9ydCBpcyBhbHJlYWR5IHNldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZpZXdwb3J0UmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZpZXdwb3J0IHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlld3BvcnRSZWYgPSB2aWV3cG9ydFJlZjtcblxuICAgICAgICB0aGlzLmNoZWNrVmlld3BvcnRVbnRpbFZhbGlkKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50UGFnZVJhbmdlKCk6IFJlYWRvbmx5PExpc3RSYW5nZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2VSYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgY2hhbmdlcyBvZiB2aWV3cG9ydCBhbmQgZW1pdHMgd2hlbiBjdXJyZW50IHJhbmdlIGhhcyBiZWVuIHJlbmRlcmVkXG4gICAgICogYW5kIGEgbmV3IG9uZSBzaG91bGQgYmUgbG9hZGVkXG4gICAgICogQHBhcmFtICBjb25maWcgYWNjZXB0cyBhbmQgSVZpcnR1YWxQYWdlQ29uZmlnIHdoaWNoIGNvbnRhaW5zIHBhZ2Ugb2JzZXJ2ZXIncyBjb25maWd1cmF0aW9uXG4gICAgICogSXQgaXMgcmVxdWlyaW5nIHBhZ2VTaXplIHByb3AgdG8gYmUgc2V0IHRvIGRlbGVnYXRlIHJlc3BvbnNpYmlsaXR5IG9mIHBhZ2luYXRpb24gdG8gVmlld3BvcnRNYW5hZ2VyXG4gICAgICogQHJldHVybnMgU3RyZWFtIG9mIHBhZ2VzIHdpdGggZml4ZWQgc2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBvYnNlcnZlTmV4dFBhZ2UkKGNvbmZpZzogSVZpcnR1YWxQYWdlQ29uZmlnKTogT2JzZXJ2YWJsZTxMaXN0UmFuZ2U+IHtcbiAgICAgICAgaWYgKCF0aGlzLl92aWV3cG9ydFJlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgdGhlIHZpZXdwb3J0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGFnZVNpemUgPSBjb25maWcucGFnZVNpemU7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50UGFnZSh7IHN0YXJ0OiAwLCBlbmQ6IGNvbmZpZy5wYWdlU2l6ZSB9KTtcblxuICAgICAgICAvLyBOb3RlOiByZW5kZXJlZFJhbmdlU3RyZWFtIGRvZXMgbm90IGVtaXQgXCJmaXJzdCBwYWdlXCIgd2hpY2ggY2FuIGJlIGEgcHJvYmxlbVxuICAgICAgICBjb25zdCBzdHJlYW1QYXJ0aWNpcGFudHM6IE9ic2VydmFibGU8TGlzdFJhbmdlPltdID0gW1xuICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSZWYucmVuZGVyZWRSYW5nZVN0cmVhbSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgc2hvdWxkRW1pdEZpcnN0UGFnZSA9ICFpc1VuZGVmaW5lZChjb25maWcuZW1pdEZpcnN0UGFnZSlcbiAgICAgICAgICAgID8gY29uZmlnLmVtaXRGaXJzdFBhZ2VcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgaWYgKHNob3VsZEVtaXRGaXJzdFBhZ2UpIHtcbiAgICAgICAgICAgIHN0cmVhbVBhcnRpY2lwYW50cy5wdXNoKG9mKHRoaXMuY3VycmVudFBhZ2VSYW5nZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlKC4uLnN0cmVhbVBhcnRpY2lwYW50cykucGlwZShcbiAgICAgICAgICAgIHRoaXMubWFwVG9QYWdlU2l6ZShjb25maWcucGFnZVNpemUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlcnMoKTogSUZpbHRlcjxMaXN0UmFuZ2U+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFwidmlydHVhbFNjcm9sbFwiLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFBhZ2VSYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHRpbmcgdmlld3BvcnRNYW5hZ2VyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKiBAcGFyYW0gIG9wdGlvbnMgSW4gY2FzZSBWaXJ0dWFsVmlld3BvcnRNYW5hZ2VyIGlzIHVzZWQgYWxvbmcgd2l0aCBmaWx0ZXJzIChzb3J0aW5nLCBzZWFyY2guLi4pXG4gICAgICogd2UgY2FuIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvdXIgb2YgZW1pdHRpbmcgZmlyc3RQYWdlRXZlbnQgYW5kIGxldCB1c2VyIHRvIHNldCBmaXJzdCBiYXRjaCBvZiBkYXRhXG4gICAgICogQHJldHVybnMgdm9pZFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldChcbiAgICAgICAgb3B0aW9uczogSVZpcnR1YWxWaWV3cG9ydFJlc2V0T3B0aW9ucyA9IHsgZW1pdEZpcnN0UGFnZTogdHJ1ZSB9XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdmlld3BvcnRSZWYpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IElmIHRoZXJlIGlzIG5vIHZpZXdwb3J0UmVmIG9yIGl0IGJlZW4gaW52b2tlZFxuICAgICAgICAgICAgLy8gcHJlbWF0dXJlbHkgd2Ugd2lsbCBzdXBwcmVzcyB0aGF0IG1ldGhvZCBjYWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90ZTogU2luY2Ugd2UncmUgcmVseWluZyBvbiBWaWV3cG9ydCdzIHJlbmRlcmVkUmFuZ2VTdHJlYW1cbiAgICAgICAgLy8gd2UgbmVlZCB0byBzY3JvbGwgb24gdG9wIHRvIGJlIHJlc2V0IHRoZSBzdHJlYW0gdG8gaXQncyBzdGFydGluZyBwb2ludFxuICAgICAgICB0aGlzLl92aWV3cG9ydFJlZi5zY3JvbGxUb09mZnNldCgwKTtcbiAgICAgICAgLy8gTm90ZTogU2V0dGluZyB0aGUgZW5kIHZhbHVlIGVxdWFsIHRvIHBhZ2VTaXplIHRvIGF2b2lkIFZpZXdwb3J0TWFuYWdlclxuICAgICAgICAvLyBpbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnQgcGFnZSBhbmQgZW1pdHRpbmcgZmlyc3QgcGFnZSBldmVudFxuICAgICAgICB0aGlzLl9jdXJyZW50UGFnZVJhbmdlID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SQU5HRSxcbiAgICAgICAgICAgIGVuZDogb3B0aW9ucy5lbWl0Rmlyc3RQYWdlID8gMCA6IHRoaXMuX3BhZ2VTaXplLFxuICAgICAgICB9O1xuICAgICAgICAvLyBOb3RlOiBTa2lwcGluZyBvbmUgdGljayB0byBsZXQgQ0RLIFZpZXdwb3J0IHVwZGF0ZSBoaXMgaW50ZXJuYWwgcHJvcGVydGllc1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGU6IFJlc2V0dGluZyB0aGUgdmlld3BvcnQgdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSZWYuc2V0UmVuZGVyZWRSYW5nZShERUZBVUxUX1JBTkdFKTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0UmVmLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudFBhZ2UocmFuZ2U6IExpc3RSYW5nZSk6IExpc3RSYW5nZSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fY3VycmVudFBhZ2VSYW5nZSA9IHJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBUZW1wb3JhcnkgZml4IHJlbGF0ZWQgdG8gdGhlIENESyBWaWV3cG9ydCBidWdcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNTYyMlxuICAgIC8vIFRvIGVuc3VyZSB0aGF0IENESyBWaWV3cG9ydCBnb3QgY29ycmVjdCBwYXJhbWV0ZXJzXG4gICAgLy8gd2UgcmVjaGVjayB0aGUgdmlld3BvcnQgc2l6ZSBpZiBpdCBpcyBlcXVhbCB0byAwXG4gICAgcHJpdmF0ZSBjaGVja1ZpZXdwb3J0VW50aWxWYWxpZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmlld3BvcnRSZWZcbiAgICAgICAgICAgIC5lbGVtZW50U2Nyb2xsZWQoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX3ZpZXdwb3J0UmVmLmdldFZpZXdwb3J0U2l6ZSgpID09PSAwKSxcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5fdmlld3BvcnRSZWYuY2hlY2tWaWV3cG9ydFNpemUoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbWFwVG9QYWdlU2l6ZShcbiAgICAgICAgcGFnZVNpemU6IG51bWJlclxuICAgICk6IE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxMaXN0UmFuZ2U+IHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2U6IE9ic2VydmFibGU8TGlzdFJhbmdlPikgPT5cbiAgICAgICAgICAgIHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGhhdmUgdG8gcmVkdWNlIG51bWJlciBvZiBldmVudHMgdG8gb25seSBwYWdpbmF0aW9uIHJlbGF0ZWQsXG4gICAgICAgICAgICAgICAgLy8gQnkgZW1pdHRpbmcgb25seSB3aGVuIHByZXZpb3VzIHBhZ2UgcmFuZ2Ugd2FzIHNjcm9sbGVkIHRvIHRoZSBlbmRcbiAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChyZW5kZXJlZFJhbmdlOiBMaXN0UmFuZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlUmFuZ2UuZW5kIDw9IHJlbmRlcmVkUmFuZ2UuZW5kXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtYXAoKHJhbmdlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBBdm9pZGluZyBpbmNyZW1lbnRhdGlvbiBmb3IgdGhlIGZpcnN0IGVtaXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDdXJyZW50UGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5jdXJyZW50UGFnZVJhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5jdXJyZW50UGFnZVJhbmdlLmVuZCArIHBhZ2VTaXplLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=