UNPKG

angulartics2

Version:

Vendor-agnostic web analytics for Angular2 applications

303 lines 42.3 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../angulartics2-core"; export class Angulartics2Matomo { constructor(angulartics2) { this.angulartics2 = angulartics2; if (typeof _paq === 'undefined') { console.warn('Matomo not found'); } this.angulartics2.setUsername.subscribe((x) => this.setUsername(x)); this.angulartics2.setUserProperties.subscribe((x) => this.setUserProperties(x)); } startTracking() { this.angulartics2.pageTrack .pipe(this.angulartics2.filterDeveloperMode()) .subscribe(x => this.pageTrack(x.path)); this.angulartics2.eventTrack .pipe(this.angulartics2.filterDeveloperMode()) .subscribe(x => this.eventTrack(x.action, x.properties)); } pageTrack(path, title) { try { if (!window.location.origin) { window.location.origin = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); } _paq.push(['setDocumentTitle', title || window.document.title]); _paq.push(['setCustomUrl', window.location.origin + path]); _paq.push(['trackPageView']); } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } resetUser() { try { _paq.push(['appendToTrackingUrl', 'new_visit=1']); // (1) forces a new visit _paq.push(['deleteCookies']); // (2) deletes existing tracking cookies to start the new visit } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } /** * Track a basic event in Matomo, or send an ecommerce event. * * @param action A string corresponding to the type of event that needs to be tracked. * @param properties The properties that need to be logged with the event. */ eventTrack(action, properties) { let params = []; switch (action) { /** * @description Sets the current page view as a product or category page view. When you call * setEcommerceView it must be followed by a call to trackPageView to record the product or * category page view. * * @link https://matomo.org/docs/ecommerce-analytics/#tracking-product-page-views-category-page-views-optional * @link https://developer.matomo.org/api-reference/tracking-javascript#ecommerce * * @property productSKU (required) SKU: Product unique identifier * @property productName (optional) Product name * @property categoryName (optional) Product category, or array of up to 5 categories * @property price (optional) Product Price as displayed on the page */ case 'setEcommerceView': params = [ 'setEcommerceView', properties.productSKU, properties.productName, properties.categoryName, properties.price, ]; break; /** * @description Adds a product into the ecommerce order. Must be called for each product in * the order. * * @link https://matomo.org/docs/ecommerce-analytics/#tracking-ecommerce-orders-items-purchased-required * @link https://developer.matomo.org/api-reference/tracking-javascript#ecommerce * * @property productSKU (required) SKU: Product unique identifier * @property productName (optional) Product name * @property categoryName (optional) Product category, or array of up to 5 categories * @property price (recommended) Product price * @property quantity (optional, default to 1) Product quantity */ case 'addEcommerceItem': params = [ 'addEcommerceItem', properties.productSKU, properties.productName, properties.productCategory, properties.price, properties.quantity, ]; break; /** * @description Tracks a shopping cart. Call this javascript function every time a user is * adding, updating or deleting a product from the cart. * * @link https://matomo.org/docs/ecommerce-analytics/#tracking-add-to-cart-items-added-to-the-cart-optional * @link https://developer.matomo.org/api-reference/tracking-javascript#ecommerce * * @property grandTotal (required) Cart amount */ case 'trackEcommerceCartUpdate': params = [ 'trackEcommerceCartUpdate', properties.grandTotal, ]; break; /** * @description Tracks an Ecommerce order, including any ecommerce item previously added to * the order. orderId and grandTotal (ie. revenue) are required parameters. * * @link https://matomo.org/docs/ecommerce-analytics/#tracking-ecommerce-orders-items-purchased-required * @link https://developer.matomo.org/api-reference/tracking-javascript#ecommerce * * @property orderId (required) Unique Order ID * @property grandTotal (required) Order Revenue grand total (includes tax, shipping, and subtracted discount) * @property subTotal (optional) Order sub total (excludes shipping) * @property tax (optional) Tax amount * @property shipping (optional) Shipping amount * @property discount (optional) Discount offered (set to false for unspecified parameter) */ case 'trackEcommerceOrder': params = [ 'trackEcommerceOrder', properties.orderId, properties.grandTotal, properties.subTotal, properties.tax, properties.shipping, properties.discount, ]; break; /** * @description To manually trigger an outlink * * @link https://matomo.org/docs/tracking-goals-web-analytics/ * @link https://developer.matomo.org/guides/tracking-javascript-guide#tracking-a-click-as-an-outlink-via-css-or-javascript * * @property url (required) link url * @property linkType (optional) type of link */ case 'trackLink': params = [ 'trackLink', properties.url, properties.linkType, ]; break; /** * @description Tracks an Ecommerce goal * * @link https://matomo.org/docs/tracking-goals-web-analytics/ * @link https://developer.matomo.org/guides/tracking-javascript-guide#manually-trigger-goal-conversions * * @property goalId (required) Unique Goal ID * @property value (optional) passed to goal tracking */ case 'trackGoal': params = [ 'trackGoal', properties.goalId, properties.value, ]; break; /** * @description Tracks a site search * * @link https://matomo.org/docs/site-search/ * @link https://developer.matomo.org/guides/tracking-javascript-guide#internal-search-tracking * * @property keyword (required) Keyword searched for * @property category (optional) Search category * @property searchCount (optional) Number of results */ case 'trackSiteSearch': params = [ 'trackSiteSearch', properties.keyword, properties.category, properties.searchCount, ]; break; /** * @description Logs an event with an event category (Videos, Music, Games...), an event * action (Play, Pause, Duration, Add Playlist, Downloaded, Clicked...), and an optional * event name and optional numeric value. * * @link https://matomo.org/docs/event-tracking/ * @link https://developer.matomo.org/api-reference/tracking-javascript#using-the-tracker-object * * @property category * @property action * @property name (optional, recommended) * @property value (optional) */ default: // PAQ requires that eventValue be an integer, see: http://matomo.org/docs/event-tracking if (properties.value) { const parsed = parseInt(properties.value, 10); properties.value = isNaN(parsed) ? 0 : parsed; } params = [ 'trackEvent', properties.category, action, properties.name || properties.label, properties.value, ]; } try { _paq.push(params); } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } setUsername(userId) { try { _paq.push(['setUserId', userId]); } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } /** * Sets custom dimensions if at least one property has the key "dimension<n>", * e.g. dimension10. If there are custom dimensions, any other property is ignored. * * If there are no custom dimensions in the given properties object, the properties * object is saved as a custom variable. * * If in doubt, prefer custom dimensions. * @link https://matomo.org/docs/custom-variables/ */ setUserProperties(properties) { const dimensions = this.setCustomDimensions(properties); try { if (dimensions.length === 0) { _paq.push([ 'setCustomVariable', properties.index, properties.name, properties.value, properties.scope, ]); } } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } /** * If you created a custom variable and then decide to remove this variable from * a visit or page view, you can use deleteCustomVariable. * * @link https://developer.matomo.org/guides/tracking-javascript-guide#deleting-a-custom-variable */ deletedUserProperties(properties) { try { _paq.push(['deleteCustomVariable', properties.index, properties.scope]); } catch (e) { if (!(e instanceof ReferenceError)) { throw e; } } } setCustomDimensions(properties) { const dimensionRegex = /dimension[1-9]\d*/; const dimensions = Object.keys(properties).filter(key => dimensionRegex.exec(key)); dimensions.forEach(dimension => { const number = Number(dimension.substr(9)); _paq.push(['setCustomDimension', number, properties[dimension]]); }); return dimensions; } } Angulartics2Matomo.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Angulartics2Matomo, deps: [{ token: i1.Angulartics2 }], target: i0.ɵɵFactoryTarget.Injectable }); Angulartics2Matomo.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Angulartics2Matomo, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Angulartics2Matomo, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.Angulartics2 }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0b21vLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlcnMvbWF0b21vL21hdG9tby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUE4STNDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDNUMsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUzthQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQzdDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVO2FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDN0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxF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QUNsQyxNQUFNLENBQUMsQ0FBQzthQUNUO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBMEU7UUFDcEcsTUFBTSxjQUFjLEdBQVcsbUJBQW1CLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkYsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7O2dIQTFUVSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQURMLE1BQU07NEZBQ25CLGtCQUFrQjtrQkFEOUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFuZ3VsYXJ0aWNzMiB9IGZyb20gJy4uLy4uL2FuZ3VsYXJ0aWNzMi1jb3JlJztcblxuZGVjbGFyZSB2YXIgX3BhcTogYW55O1xuXG5leHBvcnQgdHlwZSBFdmVudFRyYWNrQWN0aW9uID1cbiAgfCAnc2V0RWNvbW1lcmNlVmlldydcbiAgfCAnYWRkRWNvbW1lcmNlSXRlbSdcbiAgfCAndHJhY2tFY29tbWVyY2VDYXJ0VXBkYXRlJ1xuICB8ICd0cmFja0Vjb21tZXJjZU9yZGVyJ1xuICB8ICd0cmFja0xpbmsnXG4gIHwgJ3RyYWNrR29hbCdcbiAgfCAndHJhY2tTaXRlU2VhcmNoJ1xuICB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2NvcGVNYXRvbW8gPSAndmlzaXQnIHwgJ3BhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnNNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgZGltZW5zaW9uMT86IHN0cmluZztcbiAgZGltZW5zaW9uMj86IHN0cmluZztcbiAgZGltZW5zaW9uMz86IHN0cmluZztcbiAgZGltZW5zaW9uND86IHN0cmluZztcbiAgZGltZW5zaW9uNT86IHN0cmluZztcbiAgZGltZW5zaW9uNj86IHN0cmluZztcbiAgZGltZW5zaW9uNz86IHN0cmluZztcbiAgZGltZW5zaW9uOD86IHN0cmluZztcbiAgZGltZW5zaW9uOT86IHN0cmluZztcbiAgZGltZW5zaW9uMTA/OiBzdHJpbmc7XG4gIGRpbWVuc2lvbjExPzogc3RyaW5nO1xuICBkaW1lbnNpb24xMj86IHN0cmluZztcbiAgZGltZW5zaW9uMTM/OiBzdHJpbmc7XG4gIGRpbWVuc2lvbjE0Pzogc3RyaW5nO1xuICBkaW1lbnNpb24xNT86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RWNvbW1lcmNlVmlld01hdG9tb1Byb3BlcnRpZXMge1xuICAvKiogQGNsYXNzIFNldEVjb21tZXJjZVZpZXdNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIHByb2R1Y3RTS1U6IHN0cmluZztcbiAgLyoqIEBjbGFzcyBTZXRFY29tbWVyY2VWaWV3TWF0b21vUHJvcGVydGllcyAqL1xuICBwcm9kdWN0TmFtZTogc3RyaW5nO1xuICAvKiogQGNsYXNzIFNldEVjb21tZXJjZVZpZXdNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGNhdGVnb3J5TmFtZTogc3RyaW5nO1xuICAvKiogQGNsYXNzIFNldEVjb21tZXJjZVZpZXdNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIHByaWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkRWNvbW1lcmNlSXRlbVByb3BlcnRpZXMge1xuICAvKiogQGNsYXNzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzICovXG4gIHByb2R1Y3RTS1U6IHN0cmluZztcbiAgLyoqIEBjbGFzcyBBZGRFY29tbWVyY2VJdGVtUHJvcGVydGllcyAqL1xuICBwcm9kdWN0TmFtZTogc3RyaW5nO1xuICAvKiogQGNsYXNzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzICovXG4gIHByb2R1Y3RDYXRlZ29yeTogc3RyaW5nO1xuICAvKiogQGNsYXNzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzICovXG4gIHByaWNlOiBzdHJpbmc7XG4gIC8qKiBAY2xhc3MgQWRkRWNvbW1lcmNlSXRlbVByb3BlcnRpZXMgKi9cbiAgcXVhbnRpdHk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0Vjb21tZXJjZUNhcnRVcGRhdGVNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBUcmFja0Vjb21tZXJjZUNhcnRVcGRhdGVNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGdyYW5kVG90YWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcyB7XG4gIC8qKiBAY2xhc3MgVHJhY2tFY29tbWVyY2VPcmRlck1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgb3JkZXJJZDogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrRWNvbW1lcmNlT3JkZXJNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGdyYW5kVG90YWw6IHN0cmluZztcbiAgLyoqIEBjbGFzcyBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcyAqL1xuICBzdWJUb3RhbDogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrRWNvbW1lcmNlT3JkZXJNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIHRheDogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrRWNvbW1lcmNlT3JkZXJNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIHNoaXBwaW5nOiBzdHJpbmc7XG4gIC8qKiBAY2xhc3MgVHJhY2tFY29tbWVyY2VPcmRlck1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgZGlzY291bnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0xpbmtNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBUcmFja0xpbmtNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrTGlua01hdG9tb1Byb3BlcnRpZXMgKi9cbiAgbGlua1R5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0dvYWxNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBUcmFja0dvYWxNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGdvYWxJZDogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrR29hbE1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja1NpdGVTZWFyY2hNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBUcmFja1NpdGVTZWFyY2hNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGtleXdvcmQ6IHN0cmluZztcbiAgLyoqIEBjbGFzcyBUcmFja1NpdGVTZWFyY2hNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBAY2xhc3MgVHJhY2tTaXRlU2VhcmNoTWF0b21vUHJvcGVydGllcyAqL1xuICBzZWFyY2hDb3VudDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBUcmFja0V2ZW50TWF0b21vUHJvcGVydGllcyAqL1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICAvKiogQGNsYXNzIFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBAY2xhc3MgVHJhY2tFdmVudE1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBAY2xhc3MgVHJhY2tFdmVudE1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgdmFsdWU/OiBudW1iZXIgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0Q3VzdG9tVmFyaWFibGVNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBTZXRDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgaW5kZXg6IG51bWJlcjtcbiAgLyoqIEBjbGFzcyBTZXRDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQGNsYXNzIFNldEN1c3RvbVZhcmlhYmxlTWF0b21vUHJvcGVydGllcyAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiogQGNsYXNzIFNldEN1c3RvbVZhcmlhYmxlTWF0b21vUHJvcGVydGllcyAqL1xuICBzY29wZTogU2NvcGVNYXRvbW87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQ3VzdG9tVmFyaWFibGVNYXRvbW9Qcm9wZXJ0aWVzIHtcbiAgLyoqIEBjbGFzcyBEZWxldGVDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgaW5kZXg6IG51bWJlcjtcbiAgLyoqIEBjbGFzcyBEZWxldGVDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMgKi9cbiAgc2NvcGU6IFNjb3BlTWF0b21vO1xufVxuXG5leHBvcnQgdHlwZSBFdmVudFRyYWNrYWN0aW9uUHJvcGVydGllcyA9XG4gIHwgU2V0RWNvbW1lcmNlVmlld01hdG9tb1Byb3BlcnRpZXNcbiAgfCBBZGRFY29tbWVyY2VJdGVtUHJvcGVydGllc1xuICB8IFRyYWNrRWNvbW1lcmNlQ2FydFVwZGF0ZU1hdG9tb1Byb3BlcnRpZXNcbiAgfCBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllc1xuICB8IFRyYWNrTGlua01hdG9tb1Byb3BlcnRpZXNcbiAgfCBUcmFja0dvYWxNYXRvbW9Qcm9wZXJ0aWVzXG4gIHwgVHJhY2tTaXRlU2VhcmNoTWF0b21vUHJvcGVydGllc1xuICB8IFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJ0aWNzMk1hdG9tbyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ndWxhcnRpY3MyOiBBbmd1bGFydGljczIpIHtcbiAgICBpZiAodHlwZW9mIF9wYXEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ01hdG9tbyBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgdGhpcy5hbmd1bGFydGljczIuc2V0VXNlcm5hbWUuc3Vic2NyaWJlKCh4OiBzdHJpbmcpID0+IHRoaXMuc2V0VXNlcm5hbWUoeCkpO1xuICAgIHRoaXMuYW5ndWxhcnRpY3MyLnNldFVzZXJQcm9wZXJ0aWVzLnN1YnNjcmliZSgoeDogYW55KSA9PlxuICAgICAgdGhpcy5zZXRVc2VyUHJvcGVydGllcyh4KSxcbiAgICApO1xuICB9XG5cbiAgc3RhcnRUcmFja2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmFuZ3VsYXJ0aWNzMi5wYWdlVHJhY2tcbiAgICAgIC5waXBlKHRoaXMuYW5ndWxhcnRpY3MyLmZpbHRlckRldmVsb3Blck1vZGUoKSlcbiAgICAgIC5zdWJzY3JpYmUoeCA9PiB0aGlzLnBhZ2VUcmFjayh4LnBhdGgpKTtcbiAgICB0aGlzLmFuZ3VsYXJ0aWNzMi5ldmVudFRyYWNrXG4gICAgICAucGlwZSh0aGlzLmFuZ3VsYXJ0aWNzMi5maWx0ZXJEZXZlbG9wZXJNb2RlKCkpXG4gICAgICAuc3Vic2NyaWJlKHggPT4gdGhpcy5ldmVudFRyYWNrKHguYWN0aW9uLCB4LnByb3BlcnRpZXMpKTtcbiAgfVxuXG4gIHBhZ2VUcmFjayhwYXRoOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAod2luZG93LmxvY2F0aW9uIGFzIGFueSkub3JpZ2luID1cbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgK1xuICAgICAgICAgICcvLycgK1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArXG4gICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5wb3J0ID8gJzonICsgd2luZG93LmxvY2F0aW9uLnBvcnQgOiAnJyk7XG4gICAgICB9XG4gICAgICBfcGFxLnB1c2goWydzZXREb2N1bWVudFRpdGxlJywgdGl0bGUgfHwgd2luZG93LmRvY3VtZW50LnRpdGxlXSk7XG4gICAgICBfcGFxLnB1c2goWydzZXRDdXN0b21VcmwnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgcGF0aF0pO1xuICAgICAgX3BhcS5wdXNoKFsndHJhY2tQYWdlVmlldyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRVc2VyKCkge1xuICAgIHRyeSB7XG4gICAgICBfcGFxLnB1c2goWydhcHBlbmRUb1RyYWNraW5nVXJsJywgJ25ld192aXNpdD0xJ10pOyAvLyAoMSkgZm9yY2VzIGEgbmV3IHZpc2l0XG4gICAgICBfcGFxLnB1c2goWydkZWxldGVDb29raWVzJ10pOyAvLyAoMikgZGVsZXRlcyBleGlzdGluZyB0cmFja2luZyBjb29raWVzIHRvIHN0YXJ0IHRoZSBuZXcgdmlzaXRcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXZlbnRUcmFjayhhY3Rpb246ICdzZXRFY29tbWVyY2VWaWV3JywgcHJvcGVydGllczogU2V0RWNvbW1lcmNlVmlld01hdG9tb1Byb3BlcnRpZXMpOiB2b2lkO1xuICBldmVudFRyYWNrKGFjdGlvbjogJ2FkZEVjb21tZXJjZUl0ZW0nLCBwcm9wZXJ0aWVzOiBBZGRFY29tbWVyY2VJdGVtUHJvcGVydGllcyk6IHZvaWQ7XG4gIGV2ZW50VHJhY2soXG4gICAgYWN0aW9uOiAndHJhY2tFY29tbWVyY2VDYXJ0VXBkYXRlJyxcbiAgICBwcm9wZXJ0aWVzOiBUcmFja0Vjb21tZXJjZUNhcnRVcGRhdGVNYXRvbW9Qcm9wZXJ0aWVzLFxuICApOiB2b2lkO1xuICBldmVudFRyYWNrKGFjdGlvbjogJ3RyYWNrRWNvbW1lcmNlT3JkZXInLCBwcm9wZXJ0aWVzOiBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcyk6IHZvaWQ7XG4gIGV2ZW50VHJhY2soYWN0aW9uOiAndHJhY2tMaW5rJywgcHJvcGVydGllczogVHJhY2tMaW5rTWF0b21vUHJvcGVydGllcyk6IHZvaWQ7XG4gIGV2ZW50VHJhY2soYWN0aW9uOiAndHJhY2tHb2FsJywgcHJvcGVydGllczogVHJhY2tHb2FsTWF0b21vUHJvcGVydGllcyk6IHZvaWQ7XG4gIGV2ZW50VHJhY2soYWN0aW9uOiAndHJhY2tTaXRlU2VhcmNoJywgcHJvcGVydGllczogVHJhY2tTaXRlU2VhcmNoTWF0b21vUHJvcGVydGllcyk6IHZvaWQ7XG4gIGV2ZW50VHJhY2soYWN0aW9uOiBzdHJpbmcsIHByb3BlcnRpZXM6IFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzKTogdm9pZDtcblxuICAvKipcbiAgICogVHJhY2sgYSBiYXNpYyBldmVudCBpbiBNYXRvbW8sIG9yIHNlbmQgYW4gZWNvbW1lcmNlIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIEEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBuZWVkcyB0byBiZSB0cmFja2VkLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgbG9nZ2VkIHdpdGggdGhlIGV2ZW50LlxuICAgKi9cbiAgZXZlbnRUcmFjayhhY3Rpb246IEV2ZW50VHJhY2tBY3Rpb24sIHByb3BlcnRpZXM/OiBFdmVudFRyYWNrYWN0aW9uUHJvcGVydGllcykge1xuICAgIGxldCBwYXJhbXMgPSBbXTtcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3VycmVudCBwYWdlIHZpZXcgYXMgYSBwcm9kdWN0IG9yIGNhdGVnb3J5IHBhZ2Ugdmlldy4gV2hlbiB5b3UgY2FsbFxuICAgICAgICogc2V0RWNvbW1lcmNlVmlldyBpdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byB0cmFja1BhZ2VWaWV3IHRvIHJlY29yZCB0aGUgcHJvZHVjdCBvclxuICAgICAgICogY2F0ZWdvcnkgcGFnZSB2aWV3LlxuICAgICAgICpcbiAgICAgICAqIEBsaW5rIGh0dHBzOi8vbWF0b21vLm9yZy9kb2NzL2Vjb21tZXJjZS1hbmFseXRpY3MvI3RyYWNraW5nLXByb2R1Y3QtcGFnZS12aWV3cy1jYXRlZ29yeS1wYWdlLXZpZXdzLW9wdGlvbmFsXG4gICAgICAgKiBAbGluayBodHRwczovL2RldmVsb3Blci5tYXRvbW8ub3JnL2FwaS1yZWZlcmVuY2UvdHJhY2tpbmctamF2YXNjcmlwdCNlY29tbWVyY2VcbiAgICAgICAqXG4gICAgICAgKiBAcHJvcGVydHkgcHJvZHVjdFNLVSAocmVxdWlyZWQpIFNLVTogUHJvZHVjdCB1bmlxdWUgaWRlbnRpZmllclxuICAgICAgICogQHByb3BlcnR5IHByb2R1Y3ROYW1lIChvcHRpb25hbCkgUHJvZHVjdCBuYW1lXG4gICAgICAgKiBAcHJvcGVydHkgY2F0ZWdvcnlOYW1lIChvcHRpb25hbCkgUHJvZHVjdCBjYXRlZ29yeSwgb3IgYXJyYXkgb2YgdXAgdG8gNSBjYXRlZ29yaWVzXG4gICAgICAgKiBAcHJvcGVydHkgcHJpY2UgKG9wdGlvbmFsKSBQcm9kdWN0IFByaWNlIGFzIGRpc3BsYXllZCBvbiB0aGUgcGFnZVxuICAgICAgICovXG4gICAgICBjYXNlICdzZXRFY29tbWVyY2VWaWV3JzpcbiAgICAgICAgcGFyYW1zID0gW1xuICAgICAgICAgICdzZXRFY29tbWVyY2VWaWV3JyxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBTZXRFY29tbWVyY2VWaWV3TWF0b21vUHJvcGVydGllcykucHJvZHVjdFNLVSxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBTZXRFY29tbWVyY2VWaWV3TWF0b21vUHJvcGVydGllcykucHJvZHVjdE5hbWUsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgU2V0RWNvbW1lcmNlVmlld01hdG9tb1Byb3BlcnRpZXMpLmNhdGVnb3J5TmFtZSxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBTZXRFY29tbWVyY2VWaWV3TWF0b21vUHJvcGVydGllcykucHJpY2UsXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvKipcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgcHJvZHVjdCBpbnRvIHRoZSBlY29tbWVyY2Ugb3JkZXIuIE11c3QgYmUgY2FsbGVkIGZvciBlYWNoIHByb2R1Y3QgaW5cbiAgICAgICAqIHRoZSBvcmRlci5cbiAgICAgICAqXG4gICAgICAgKiBAbGluayBodHRwczovL21hdG9tby5vcmcvZG9jcy9lY29tbWVyY2UtYW5hbHl0aWNzLyN0cmFja2luZy1lY29tbWVyY2Utb3JkZXJzLWl0ZW1zLXB1cmNoYXNlZC1yZXF1aXJlZFxuICAgICAgICogQGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubWF0b21vLm9yZy9hcGktcmVmZXJlbmNlL3RyYWNraW5nLWphdmFzY3JpcHQjZWNvbW1lcmNlXG4gICAgICAgKlxuICAgICAgICogQHByb3BlcnR5IHByb2R1Y3RTS1UgKHJlcXVpcmVkKSBTS1U6IFByb2R1Y3QgdW5pcXVlIGlkZW50aWZpZXJcbiAgICAgICAqIEBwcm9wZXJ0eSBwcm9kdWN0TmFtZSAob3B0aW9uYWwpIFByb2R1Y3QgbmFtZVxuICAgICAgICogQHByb3BlcnR5IGNhdGVnb3J5TmFtZSAob3B0aW9uYWwpIFByb2R1Y3QgY2F0ZWdvcnksIG9yIGFycmF5IG9mIHVwIHRvIDUgY2F0ZWdvcmllc1xuICAgICAgICogQHByb3BlcnR5IHByaWNlIChyZWNvbW1lbmRlZCkgUHJvZHVjdCBwcmljZVxuICAgICAgICogQHByb3BlcnR5IHF1YW50aXR5IChvcHRpb25hbCwgZGVmYXVsdCB0byAxKSBQcm9kdWN0IHF1YW50aXR5XG4gICAgICAgKi9cbiAgICAgIGNhc2UgJ2FkZEVjb21tZXJjZUl0ZW0nOlxuICAgICAgICBwYXJhbXMgPSBbXG4gICAgICAgICAgJ2FkZEVjb21tZXJjZUl0ZW0nLFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzKS5wcm9kdWN0U0tVLFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzKS5wcm9kdWN0TmFtZSxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBBZGRFY29tbWVyY2VJdGVtUHJvcGVydGllcykucHJvZHVjdENhdGVnb3J5LFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIEFkZEVjb21tZXJjZUl0ZW1Qcm9wZXJ0aWVzKS5wcmljZSxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBBZGRFY29tbWVyY2VJdGVtUHJvcGVydGllcykucXVhbnRpdHksXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvKipcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBUcmFja3MgYSBzaG9wcGluZyBjYXJ0LiBDYWxsIHRoaXMgamF2YXNjcmlwdCBmdW5jdGlvbiBldmVyeSB0aW1lIGEgdXNlciBpc1xuICAgICAgICogYWRkaW5nLCB1cGRhdGluZyBvciBkZWxldGluZyBhIHByb2R1Y3QgZnJvbSB0aGUgY2FydC5cbiAgICAgICAqXG4gICAgICAgKiBAbGluayBodHRwczovL21hdG9tby5vcmcvZG9jcy9lY29tbWVyY2UtYW5hbHl0aWNzLyN0cmFja2luZy1hZGQtdG8tY2FydC1pdGVtcy1hZGRlZC10by10aGUtY2FydC1vcHRpb25hbFxuICAgICAgICogQGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubWF0b21vLm9yZy9hcGktcmVmZXJlbmNlL3RyYWNraW5nLWphdmFzY3JpcHQjZWNvbW1lcmNlXG4gICAgICAgKlxuICAgICAgICogQHByb3BlcnR5IGdyYW5kVG90YWwgKHJlcXVpcmVkKSBDYXJ0IGFtb3VudFxuICAgICAgICovXG4gICAgICBjYXNlICd0cmFja0Vjb21tZXJjZUNhcnRVcGRhdGUnOlxuICAgICAgICBwYXJhbXMgPSBbXG4gICAgICAgICAgJ3RyYWNrRWNvbW1lcmNlQ2FydFVwZGF0ZScsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tFY29tbWVyY2VDYXJ0VXBkYXRlTWF0b21vUHJvcGVydGllcykuZ3JhbmRUb3RhbCxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8qKlxuICAgICAgICogQGRlc2NyaXB0aW9uIFRyYWNrcyBhbiBFY29tbWVyY2Ugb3JkZXIsIGluY2x1ZGluZyBhbnkgZWNvbW1lcmNlIGl0ZW0gcHJldmlvdXNseSBhZGRlZCB0b1xuICAgICAgICogdGhlIG9yZGVyLiBvcmRlcklkIGFuZCBncmFuZFRvdGFsIChpZS4gcmV2ZW51ZSkgYXJlIHJlcXVpcmVkIHBhcmFtZXRlcnMuXG4gICAgICAgKlxuICAgICAgICogQGxpbmsgaHR0cHM6Ly9tYXRvbW8ub3JnL2RvY3MvZWNvbW1lcmNlLWFuYWx5dGljcy8jdHJhY2tpbmctZWNvbW1lcmNlLW9yZGVycy1pdGVtcy1wdXJjaGFzZWQtcmVxdWlyZWRcbiAgICAgICAqIEBsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1hdG9tby5vcmcvYXBpLXJlZmVyZW5jZS90cmFja2luZy1qYXZhc2NyaXB0I2Vjb21tZXJjZVxuICAgICAgICpcbiAgICAgICAqIEBwcm9wZXJ0eSBvcmRlcklkIChyZXF1aXJlZCkgVW5pcXVlIE9yZGVyIElEXG4gICAgICAgKiBAcHJvcGVydHkgZ3JhbmRUb3RhbCAocmVxdWlyZWQpIE9yZGVyIFJldmVudWUgZ3JhbmQgdG90YWwgKGluY2x1ZGVzIHRheCwgc2hpcHBpbmcsIGFuZCBzdWJ0cmFjdGVkIGRpc2NvdW50KVxuICAgICAgICogQHByb3BlcnR5IHN1YlRvdGFsIChvcHRpb25hbCkgT3JkZXIgc3ViIHRvdGFsIChleGNsdWRlcyBzaGlwcGluZylcbiAgICAgICAqIEBwcm9wZXJ0eSB0YXggKG9wdGlvbmFsKSBUYXggYW1vdW50XG4gICAgICAgKiBAcHJvcGVydHkgc2hpcHBpbmcgKG9wdGlvbmFsKSBTaGlwcGluZyBhbW91bnRcbiAgICAgICAqIEBwcm9wZXJ0eSBkaXNjb3VudCAob3B0aW9uYWwpIERpc2NvdW50IG9mZmVyZWQgKHNldCB0byBmYWxzZSBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyKVxuICAgICAgICovXG4gICAgICBjYXNlICd0cmFja0Vjb21tZXJjZU9yZGVyJzpcbiAgICAgICAgcGFyYW1zID0gW1xuICAgICAgICAgICd0cmFja0Vjb21tZXJjZU9yZGVyJyxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcykub3JkZXJJZCxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcykuZ3JhbmRUb3RhbCxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcykuc3ViVG90YWwsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tFY29tbWVyY2VPcmRlck1hdG9tb1Byb3BlcnRpZXMpLnRheCxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0Vjb21tZXJjZU9yZGVyTWF0b21vUHJvcGVydGllcykuc2hpcHBpbmcsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tFY29tbWVyY2VPcmRlck1hdG9tb1Byb3BlcnRpZXMpLmRpc2NvdW50LFxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gVG8gbWFudWFsbHkgdHJpZ2dlciBhbiBvdXRsaW5rXG4gICAgICAgKlxuICAgICAgICogQGxpbmsgaHR0cHM6Ly9tYXRvbW8ub3JnL2RvY3MvdHJhY2tpbmctZ29hbHMtd2ViLWFuYWx5dGljcy9cbiAgICAgICAqIEBsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1hdG9tby5vcmcvZ3VpZGVzL3RyYWNraW5nLWphdmFzY3JpcHQtZ3VpZGUjdHJhY2tpbmctYS1jbGljay1hcy1hbi1vdXRsaW5rLXZpYS1jc3Mtb3ItamF2YXNjcmlwdFxuICAgICAgICpcbiAgICAgICAqIEBwcm9wZXJ0eSB1cmwgKHJlcXVpcmVkKSBsaW5rIHVybFxuICAgICAgICogQHByb3BlcnR5IGxpbmtUeXBlIChvcHRpb25hbCkgdHlwZSBvZiBsaW5rXG4gICAgICAgKi9cbiAgICAgIGNhc2UgJ3RyYWNrTGluayc6XG4gICAgICAgIHBhcmFtcyA9IFtcbiAgICAgICAgICAndHJhY2tMaW5rJyxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0xpbmtNYXRvbW9Qcm9wZXJ0aWVzKS51cmwsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tMaW5rTWF0b21vUHJvcGVydGllcykubGlua1R5cGUsXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvKipcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBUcmFja3MgYW4gRWNvbW1lcmNlIGdvYWxcbiAgICAgICAqXG4gICAgICAgKiBAbGluayBodHRwczovL21hdG9tby5vcmcvZG9jcy90cmFja2luZy1nb2Fscy13ZWItYW5hbHl0aWNzL1xuICAgICAgICogQGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubWF0b21vLm9yZy9ndWlkZXMvdHJhY2tpbmctamF2YXNjcmlwdC1ndWlkZSNtYW51YWxseS10cmlnZ2VyLWdvYWwtY29udmVyc2lvbnNcbiAgICAgICAqXG4gICAgICAgKiBAcHJvcGVydHkgZ29hbElkIChyZXF1aXJlZCkgVW5pcXVlIEdvYWwgSURcbiAgICAgICAqIEBwcm9wZXJ0eSB2YWx1ZSAob3B0aW9uYWwpIHBhc3NlZCB0byBnb2FsIHRyYWNraW5nXG4gICAgICAgKi9cbiAgICAgIGNhc2UgJ3RyYWNrR29hbCc6XG4gICAgICAgIHBhcmFtcyA9IFtcbiAgICAgICAgICAndHJhY2tHb2FsJyxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0dvYWxNYXRvbW9Qcm9wZXJ0aWVzKS5nb2FsSWQsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tHb2FsTWF0b21vUHJvcGVydGllcykudmFsdWUsXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvKipcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBUcmFja3MgYSBzaXRlIHNlYXJjaFxuICAgICAgICpcbiAgICAgICAqIEBsaW5rIGh0dHBzOi8vbWF0b21vLm9yZy9kb2NzL3NpdGUtc2VhcmNoL1xuICAgICAgICogQGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubWF0b21vLm9yZy9ndWlkZXMvdHJhY2tpbmctamF2YXNjcmlwdC1ndWlkZSNpbnRlcm5hbC1zZWFyY2gtdHJhY2tpbmdcbiAgICAgICAqXG4gICAgICAgKiBAcHJvcGVydHkga2V5d29yZCAocmVxdWlyZWQpIEtleXdvcmQgc2VhcmNoZWQgZm9yXG4gICAgICAgKiBAcHJvcGVydHkgY2F0ZWdvcnkgKG9wdGlvbmFsKSBTZWFyY2ggY2F0ZWdvcnlcbiAgICAgICAqIEBwcm9wZXJ0eSBzZWFyY2hDb3VudCAob3B0aW9uYWwpIE51bWJlciBvZiByZXN1bHRzXG4gICAgICAgKi9cbiAgICAgIGNhc2UgJ3RyYWNrU2l0ZVNlYXJjaCc6XG4gICAgICAgIHBhcmFtcyA9IFtcbiAgICAgICAgICAndHJhY2tTaXRlU2VhcmNoJyxcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja1NpdGVTZWFyY2hNYXRvbW9Qcm9wZXJ0aWVzKS5rZXl3b3JkLFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIFRyYWNrU2l0ZVNlYXJjaE1hdG9tb1Byb3BlcnRpZXMpLmNhdGVnb3J5LFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIFRyYWNrU2l0ZVNlYXJjaE1hdG9tb1Byb3BlcnRpZXMpLnNlYXJjaENvdW50LFxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBldmVudCB3aXRoIGFuIGV2ZW50IGNhdGVnb3J5IChWaWRlb3MsIE11c2ljLCBHYW1lcy4uLiksIGFuIGV2ZW50XG4gICAgICAgKiBhY3Rpb24gKFBsYXksIFBhdXNlLCBEdXJhdGlvbiwgQWRkIFBsYXlsaXN0LCBEb3dubG9hZGVkLCBDbGlja2VkLi4uKSwgYW5kIGFuIG9wdGlvbmFsXG4gICAgICAgKiBldmVudCBuYW1lIGFuZCBvcHRpb25hbCBudW1lcmljIHZhbHVlLlxuICAgICAgICpcbiAgICAgICAqIEBsaW5rIGh0dHBzOi8vbWF0b21vLm9yZy9kb2NzL2V2ZW50LXRyYWNraW5nL1xuICAgICAgICogQGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubWF0b21vLm9yZy9hcGktcmVmZXJlbmNlL3RyYWNraW5nLWphdmFzY3JpcHQjdXNpbmctdGhlLXRyYWNrZXItb2JqZWN0XG4gICAgICAgKlxuICAgICAgICogQHByb3BlcnR5IGNhdGVnb3J5XG4gICAgICAgKiBAcHJvcGVydHkgYWN0aW9uXG4gICAgICAgKiBAcHJvcGVydHkgbmFtZSAob3B0aW9uYWwsIHJlY29tbWVuZGVkKVxuICAgICAgICogQHByb3BlcnR5IHZhbHVlIChvcHRpb25hbClcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gUEFRIHJlcXVpcmVzIHRoYXQgZXZlbnRWYWx1ZSBiZSBhbiBpbnRlZ2VyLCBzZWU6IGh0dHA6Ly9tYXRvbW8ub3JnL2RvY3MvZXZlbnQtdHJhY2tpbmdcbiAgICAgICAgaWYgKChwcm9wZXJ0aWVzIGFzIFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzKS52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KChwcm9wZXJ0aWVzIGFzIFRyYWNrRXZlbnRNYXRvbW9Qcm9wZXJ0aWVzKS52YWx1ZSBhcyBhbnksIDEwKTtcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0V2ZW50TWF0b21vUHJvcGVydGllcykudmFsdWUgPSBpc05hTihwYXJzZWQpID8gMCA6IHBhcnNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtcyA9IFtcbiAgICAgICAgICAndHJhY2tFdmVudCcsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tFdmVudE1hdG9tb1Byb3BlcnRpZXMpLmNhdGVnb3J5LFxuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0V2ZW50TWF0b21vUHJvcGVydGllcykubmFtZSB8fFxuICAgICAgICAgICAgKHByb3BlcnRpZXMgYXMgVHJhY2tFdmVudE1hdG9tb1Byb3BlcnRpZXMpLmxhYmVsLCAvLyBDaGFuZ2VkIGluIGZhdm91ciBvZiBNYXRvbW8gZG9jdW1lbnRhdGlvbi4gQWRkZWQgZmFsbGJhY2sgc28gaXQncyBiYWNrd2FyZHMgY29tcGF0aWJsZS5cbiAgICAgICAgICAocHJvcGVydGllcyBhcyBUcmFja0V2ZW50TWF0b21vUHJvcGVydGllcykudmFsdWUsXG4gICAgICAgIF07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBfcGFxLnB1c2gocGFyYW1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0VXNlcm5hbWUodXNlcklkOiBzdHJpbmcgfCBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIF9wYXEucHVzaChbJ3NldFVzZXJJZCcsIHVzZXJJZF0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gZGltZW5zaW9ucyBpZiBhdCBsZWFzdCBvbmUgcHJvcGVydHkgaGFzIHRoZSBrZXkgXCJkaW1lbnNpb248bj5cIixcbiAgICogZS5nLiBkaW1lbnNpb24xMC4gSWYgdGhlcmUgYXJlIGN1c3RvbSBkaW1lbnNpb25zLCBhbnkgb3RoZXIgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAgICpcbiAgICogSWYgdGhlcmUgYXJlIG5vIGN1c3RvbSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIG9iamVjdCwgdGhlIHByb3BlcnRpZXNcbiAgICogb2JqZWN0IGlzIHNhdmVkIGFzIGEgY3VzdG9tIHZhcmlhYmxlLlxuICAgKlxuICAgKiBJZiBpbiBkb3VidCwgcHJlZmVyIGN1c3RvbSBkaW1lbnNpb25zLlxuICAgKiBAbGluayBodHRwczovL21hdG9tby5vcmcvZG9jcy9jdXN0b20tdmFyaWFibGVzL1xuICAgKi9cbiAgc2V0VXNlclByb3BlcnRpZXMocHJvcGVydGllczogU2V0Q3VzdG9tVmFyaWFibGVNYXRvbW9Qcm9wZXJ0aWVzIHwgRGltZW5zaW9uc01hdG9tb1Byb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5zZXRDdXN0b21EaW1lbnNpb25zKHByb3BlcnRpZXMpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoZGltZW5zaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgX3BhcS5wdXNoKFtcbiAgICAgICAgICAnc2V0Q3VzdG9tVmFyaWFibGUnLFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIFNldEN1c3RvbVZhcmlhYmxlTWF0b21vUHJvcGVydGllcykuaW5kZXgsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgU2V0Q3VzdG9tVmFyaWFibGVNYXRvbW9Qcm9wZXJ0aWVzKS5uYW1lLFxuICAgICAgICAgIChwcm9wZXJ0aWVzIGFzIFNldEN1c3RvbVZhcmlhYmxlTWF0b21vUHJvcGVydGllcykudmFsdWUsXG4gICAgICAgICAgKHByb3BlcnRpZXMgYXMgU2V0Q3VzdG9tVmFyaWFibGVNYXRvbW9Qcm9wZXJ0aWVzKS5zY29wZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB5b3UgY3JlYXRlZCBhIGN1c3RvbSB2YXJpYWJsZSBhbmQgdGhlbiBkZWNpZGUgdG8gcmVtb3ZlIHRoaXMgdmFyaWFibGUgZnJvbVxuICAgKiBhIHZpc2l0IG9yIHBhZ2UgdmlldywgeW91IGNhbiB1c2UgZGVsZXRlQ3VzdG9tVmFyaWFibGUuXG4gICAqXG4gICAqIEBsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1hdG9tby5vcmcvZ3VpZGVzL3RyYWNraW5nLWphdmFzY3JpcHQtZ3VpZGUjZGVsZXRpbmctYS1jdXN0b20tdmFyaWFibGVcbiAgICovXG4gIGRlbGV0ZWRVc2VyUHJvcGVydGllcyhwcm9wZXJ0aWVzOiBEZWxldGVDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMpIHtcbiAgICB0cnkge1xuICAgICAgX3BhcS5wdXNoKFsnZGVsZXRlQ3VzdG9tVmFyaWFibGUnLCBwcm9wZXJ0aWVzLmluZGV4LCBwcm9wZXJ0aWVzLnNjb3BlXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q3VzdG9tRGltZW5zaW9ucyhwcm9wZXJ0aWVzOiBTZXRDdXN0b21WYXJpYWJsZU1hdG9tb1Byb3BlcnRpZXMgfCBEaW1lbnNpb25zTWF0b21vUHJvcGVydGllcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkaW1lbnNpb25SZWdleDogUmVnRXhwID0gL2RpbWVuc2lvblsxLTldXFxkKi87XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZpbHRlcihrZXkgPT4gZGltZW5zaW9uUmVnZXguZXhlYyhrZXkpKTtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IG51bWJlciA9IE51bWJlcihkaW1lbnNpb24uc3Vic3RyKDkpKTtcbiAgICAgIF9wYXEucHVzaChbJ3NldEN1c3RvbURpbWVuc2lvbicsIG51bWJlciwgcHJvcGVydGllc1tkaW1lbnNpb25dXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cbn1cbiJdfQ==