UNPKG

angular-bootstrap-datetimepicker

Version:

Native Angular (8+) datetime picker component styled by Twitter Bootstrap 4.

277 lines 34.9 kB
/** * @license * Copyright 2013-present Dale Lotts All Rights Reserved. * http://www.dalelotts.com * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/dalelotts/angular-bootstrap-datetimepicker/blob/master/LICENSE */ import * as _moment from 'moment'; /** * Work around for moment namespace conflict when used with webpack and rollup. * See https://github.com/dherges/ng-packagr/issues/163 * * Depending on whether rollup is used, moment needs to be imported differently. * Since Moment.js doesn't have a default export, we normally need to import using * the `* as`syntax. * * rollup creates a synthetic default module and we thus need to import it using * the `default as` syntax. * * @internal **/ var moment = _moment; /** * Default implementation for the `year` view. */ var DlYearModelProvider = /** @class */ (function () { function DlYearModelProvider() { } /** * Create a moment at midnight january 1 at the start of the current decade. * The start of the decade is always a year ending in zero. * * @param fromMilliseconds * the moment in time from which the start of the decade will be determined. * @returns * moment at midnight january 1 at the start of the current decade. * @internal */ DlYearModelProvider.getStartOfDecade = function (fromMilliseconds) { // Truncate the last digit from the current year to get the start of the decade var startDecade = (Math.trunc(moment(fromMilliseconds).year() / 10) * 10); return moment({ year: startDecade }).startOf('year'); }; /** * Receives input changes detected by Angular. * * @param changes * the input changes detected by Angular. */ DlYearModelProvider.prototype.onChanges = function ( // @ts-ignore changes) { }; /** * Returns the `year` model for the specified moment in `local` time with the * `active` year set to January 1 of the specified year. * * The `year` model represents a decade (10 years) as two rows with five columns. * * The decade always starts on a year ending with zero. * * Each cell represents midnight January 1 of the indicated year. * * The `active` year will be the January 1 of year of the specified milliseconds. * * @param milliseconds * the moment in time from which the year model will be created. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * the model representing the specified moment in time. */ DlYearModelProvider.prototype.getModel = function (milliseconds, selectedMilliseconds) { var rowNumbers = [0, 1]; var columnNumbers = [0, 1, 2, 3, 4]; var startYear = moment(milliseconds).startOf('year'); var startDate = DlYearModelProvider.getStartOfDecade(milliseconds); var futureYear = startDate.year() + 9; var pastYear = startDate.year(); var activeValue = startYear.valueOf(); var selectedValue = selectedMilliseconds === null || selectedMilliseconds === undefined ? selectedMilliseconds : moment(selectedMilliseconds).startOf('year').valueOf(); return { viewName: 'year', viewLabel: pastYear + "-" + futureYear, activeDate: activeValue, leftButton: { value: moment(startDate).subtract(10, 'years').valueOf(), ariaLabel: "Go to " + (pastYear - 10) + "-" + (pastYear - 1), classes: {}, }, rightButton: { value: moment(startDate).add(10, 'years').valueOf(), ariaLabel: "Go to " + (futureYear + 1) + "-" + (futureYear + 10), classes: {}, }, rows: rowNumbers.map(rowOfYears.bind(this)) }; function rowOfYears(rowNumber) { var currentMoment = moment(); var cells = columnNumbers.map(function (columnNumber) { var yearMoment = moment(startDate).add((rowNumber * columnNumbers.length) + columnNumber, 'years'); return { display: yearMoment.format('YYYY'), value: yearMoment.valueOf(), classes: { 'dl-abdtp-active': activeValue === yearMoment.valueOf(), 'dl-abdtp-selected': selectedValue === yearMoment.valueOf(), 'dl-abdtp-now': yearMoment.isSame(currentMoment, 'year'), } }; }); return { cells: cells }; } }; /** * Move the active `year` one row `down` from the specified moment in time. * * The `active` year will be the January 1 `five (5) years after` the specified milliseconds. * This moves the `active` date one row `down` in the current `year` view. * * Moving `down` can result in the `active` year being part of a different decade than * the specified `fromMilliseconds`, in this case the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the next `year` model `down` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one row `down` from the specified moment in time. */ DlYearModelProvider.prototype.goDown = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).add(5, 'year').valueOf(), selectedMilliseconds); }; /** * Move the active `year` one row `up` from the specified moment in time. * * The `active` year will be the January 1 `five (5) years before` the specified milliseconds. * This moves the `active` date one row `up` in the current `year` view. * * Moving `up` can result in the `active` year being part of a different decade than * the specified `fromMilliseconds`, in this case the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the previous `year` model `up` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one row `up` from the specified moment in time. */ DlYearModelProvider.prototype.goUp = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).subtract(5, 'year').valueOf(), selectedMilliseconds); }; /** * Move the `active` `year` one (1) year to the `left` of the specified moment in time. * * The `active` year will be the January 1 `one (1) year before` the specified milliseconds. * This moves the `active` date one year `left` in the current `year` view. * * Moving `left` can result in the `active` year being part of a different decade than * the specified `fromMilliseconds`, in this case the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the `year` model to the `left` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one year to the `left` of the specified moment in time. */ DlYearModelProvider.prototype.goLeft = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).subtract(1, 'year').valueOf(), selectedMilliseconds); }; /** * Move the `active` `year` one (1) year to the `right` of the specified moment in time. * * The `active` year will be the January 1 `one (1) year after` the specified milliseconds. * This moves the `active` date one year `right` in the current `year` view. * * Moving `right` can result in the `active` year being part of a different decade than * the specified `fromMilliseconds`, in this case the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the `year` model to the `right` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one year to the `right` of the specified moment in time. */ DlYearModelProvider.prototype.goRight = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).add(1, 'year').valueOf(), selectedMilliseconds); }; /** * Move the active `year` one decade `down` from the specified moment in time. * * The `active` year will be the January 1 `ten (10) years after` the specified milliseconds. * This moves the `active` date one `page` `down` from the current `year` view. * * Paging `down` will result in the `active` year being part of a different decade than * the specified `fromMilliseconds`. As a result, the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the next `year` model page `down` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one decade `down` from the specified moment in time. */ DlYearModelProvider.prototype.pageDown = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).add(10, 'year').valueOf(), selectedMilliseconds); }; /** * Move the active `year` one decade `up` from the specified moment in time. * * The `active` year will be the January 1 `ten (10) years before` the specified milliseconds. * This moves the `active` date one `page-up` from the current `year` view. * * Paging `up` will result in the `active` year being part of a different decade than * the specified `fromMilliseconds`. As a result, the decade represented by the model * will change to show the correct decade. * * @param fromMilliseconds * the moment in time from which the next `year` model page `up` will be constructed. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * model containing an `active` `year` one decade `up` from the specified moment in time. */ DlYearModelProvider.prototype.pageUp = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(moment(fromMilliseconds).subtract(10, 'year').valueOf(), selectedMilliseconds); }; /** * Move the `active` `year` to the `last` year in the decade. * * The view or time range will not change unless the `fromMilliseconds` value * is in a different decade than the displayed decade. * * @param fromMilliseconds * the moment in time from which the `last` active `year` will be calculated. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * a model with the `last` cell in the view as the active `year`. */ DlYearModelProvider.prototype.goEnd = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(DlYearModelProvider.getStartOfDecade(fromMilliseconds) .add(9, 'years') .endOf('year') .valueOf(), selectedMilliseconds); }; /** * Move the `active` `year` to the `first` year in the decade. * * The view or time range will not change unless the `fromMilliseconds` value * is in a different decade than the displayed decade. * * @param fromMilliseconds * the moment in time from which the `first` active `year` will be calculated. * @param selectedMilliseconds * the current value of the date/time picker. * @returns * a model with the `first` cell in the view as the active `year`. */ DlYearModelProvider.prototype.goHome = function (fromMilliseconds, selectedMilliseconds) { return this.getModel(DlYearModelProvider.getStartOfDecade(fromMilliseconds) .startOf('year') .valueOf(), selectedMilliseconds); }; return DlYearModelProvider; }()); export { DlYearModelProvider }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGwtbW9kZWwtcHJvdmlkZXIteWVhci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyIsInNvdXJjZXMiOlsiZGwtZGF0ZS10aW1lLXBpY2tlci9kbC1tb2RlbC1wcm92aWRlci15ZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFHSCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUtsQzs7Ozs7Ozs7Ozs7O0lBWUk7QUFDSixJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFdkI7O0dBRUc7QUFDSDtJQUFBO0lBNFFBLENBQUM7SUExUUM7Ozs7Ozs7OztPQVNHO0lBQ1ksb0NBQWdCLEdBQS9CLFVBQWdDLGdCQUF3QjtRQUN0RCwrRUFBK0U7UUFDL0UsSUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHVDQUFTLEdBQVQ7SUFDRSxhQUFhO0lBQ2IsT0FBc0IsSUFDZixDQUFDO0lBRVY7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNILHNDQUFRLEdBQVIsVUFBUyxZQUFvQixFQUFFLG9CQUE0QjtRQUN6RCxJQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0QyxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMs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QyxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILG1DQUFLLEdBQUwsVUFBTSxnQkFBd0IsRUFBRSxvQkFBNEI7UUFDMUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNsQixtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNuRCxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQzthQUNmLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDYixPQUFPLEVBQUUsRUFDWixvQkFBb0IsQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxvQ0FBTSxHQUFOLFVBQU8sZ0JBQXdCLEVBQUUsb0JBQTRCO1FBQzNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FDbEIsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7YUFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNmLE9BQU8sRUFBRSxFQUNaLG9CQUFvQixDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxBQTVRRCxJQTRRQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQgRGFsZSBMb3R0cyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogaHR0cDovL3d3dy5kYWxlbG90dHMuY29tXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2RhbGVsb3R0cy9hbmd1bGFyLWJvb3RzdHJhcC1kYXRldGltZXBpY2tlci9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF9tb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtEbERhdGVUaW1lUGlja2VyTW9kZWx9IGZyb20gJy4vZGwtZGF0ZS10aW1lLXBpY2tlci1tb2RlbCc7XG5pbXBvcnQge0RsTW9kZWxQcm92aWRlcn0gZnJvbSAnLi9kbC1tb2RlbC1wcm92aWRlcic7XG5cbi8qKlxuICogV29yayBhcm91bmQgZm9yIG1vbWVudCBuYW1lc3BhY2UgY29uZmxpY3Qgd2hlbiB1c2VkIHdpdGggd2VicGFjayBhbmQgcm9sbHVwLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGVyZ2VzL25nLXBhY2thZ3IvaXNzdWVzLzE2M1xuICpcbiAqIERlcGVuZGluZyBvbiB3aGV0aGVyIHJvbGx1cCBpcyB1c2VkLCBtb21lbnQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgZGlmZmVyZW50bHkuXG4gKiBTaW5jZSBNb21lbnQuanMgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBleHBvcnQsIHdlIG5vcm1hbGx5IG5lZWQgdG8gaW1wb3J0IHVzaW5nXG4gKiB0aGUgYCogYXNgc3ludGF4LlxuICpcbiAqIHJvbGx1cCBjcmVhdGVzIGEgc3ludGhldGljIGRlZmF1bHQgbW9kdWxlIGFuZCB3ZSB0aHVzIG5lZWQgdG8gaW1wb3J0IGl0IHVzaW5nXG4gKiB0aGUgYGRlZmF1bHQgYXNgIHN5bnRheC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqKi9cbmNvbnN0IG1vbWVudCA9IF9tb21lbnQ7XG5cbi8qKlxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGB5ZWFyYCB2aWV3LlxuICovXG5leHBvcnQgY2xhc3MgRGxZZWFyTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIERsTW9kZWxQcm92aWRlciB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1vbWVudCBhdCBtaWRuaWdodCBqYW51YXJ5IDEgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGRlY2FkZS5cbiAgICogVGhlIHN0YXJ0IG9mIHRoZSBkZWNhZGUgaXMgYWx3YXlzIGEgeWVhciBlbmRpbmcgaW4gemVyby5cbiAgICpcbiAgICogQHBhcmFtIGZyb21NaWxsaXNlY29uZHNcbiAgICogIHRoZSBtb21lbnQgaW4gdGltZSBmcm9tIHdoaWNoIHRoZSBzdGFydCBvZiB0aGUgZGVjYWRlIHdpbGwgYmUgZGV0ZXJtaW5lZC5cbiAgICogQHJldHVybnNcbiAgICogIG1vbWVudCBhdCBtaWRuaWdodCBqYW51YXJ5IDEgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGRlY2FkZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRTdGFydE9mRGVjYWRlKGZyb21NaWxsaXNlY29uZHM6IG51bWJlcik6IE1vbWVudCB7XG4gICAgLy8gVHJ1bmNhdGUgdGhlIGxhc3QgZGlnaXQgZnJvbSB0aGUgY3VycmVudCB5ZWFyIHRvIGdldCB0aGUgc3RhcnQgb2YgdGhlIGRlY2FkZVxuICAgIGNvbnN0IHN0YXJ0RGVjYWRlID0gKE1hdGgudHJ1bmMobW9tZW50KGZyb21NaWxsaXNlY29uZHMpLnllYXIoKSAvIDEwKSAqIDEwKTtcbiAgICByZXR1cm4gbW9tZW50KHt5ZWFyOiBzdGFydERlY2FkZX0pLnN0YXJ0T2YoJ3llYXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNlaXZlcyBpbnB1dCBjaGFuZ2VzIGRldGVjdGVkIGJ5IEFuZ3VsYXIuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAqICB0aGUgaW5wdXQgY2hhbmdlcyBkZXRlY3RlZCBieSBBbmd1bGFyLlxuICAgKi9cbiAgb25DaGFuZ2VzKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzXG4gICk6IHZvaWQge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYHllYXJgIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIG1vbWVudCBpbiBgbG9jYWxgIHRpbWUgd2l0aCB0aGVcbiAgICogYGFjdGl2ZWAgeWVhciBzZXQgdG8gSmFudWFyeSAxIG9mIHRoZSBzcGVjaWZpZWQgeWVhci5cbiAgICpcbiAgICogVGhlIGB5ZWFyYCBtb2RlbCByZXByZXNlbnRzIGEgZGVjYWRlICgxMCB5ZWFycykgYXMgdHdvIHJvd3Mgd2l0aCBmaXZlIGNvbHVtbnMuXG4gICAqXG4gICAqIFRoZSBkZWNhZGUgYWx3YXlzIHN0YXJ0cyBvbiBhIHllYXIgZW5kaW5nIHdpdGggemVyby5cbiAgICpcbiAgICogRWFjaCBjZWxsIHJlcHJlc2VudHMgbWlkbmlnaHQgSmFudWFyeSAxIG9mIHRoZSBpbmRpY2F0ZWQgeWVhci5cbiAgICpcbiAgICogVGhlIGBhY3RpdmVgIHllYXIgd2lsbCBiZSB0aGUgSmFudWFyeSAxIG9mIHllYXIgb2YgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBtaWxsaXNlY29uZHNcbiAgICogIHRoZSBtb21lbnQgaW4gdGltZSBmcm9tIHdoaWNoIHRoZSB5ZWFyIG1vZGVsIHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIHBpY2tlci5cbiAgICogQHJldHVybnNcbiAgICogIHRoZSBtb2RlbCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICovXG4gIGdldE1vZGVsKG1pbGxpc2Vjb25kczogbnVtYmVyLCBzZWxlY3RlZE1pbGxpc2Vjb25kczogbnVtYmVyKTogRGxEYXRlVGltZVBpY2tlck1vZGVsIHtcbiAgICBjb25zdCByb3dOdW1iZXJzID0gWzAsIDFdO1xuICAgIGNvbnN0IGNvbHVtbk51bWJlcnMgPSBbMCwgMSwgMiwgMywgNF07XG5cbiAgICBjb25zdCBzdGFydFllYXIgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5zdGFydE9mKCd5ZWFyJyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gRGxZZWFyTW9kZWxQcm92aWRlci5nZXRTdGFydE9mRGVjYWRlKG1pbGxpc2Vjb25kcyk7XG5cbiAgICBjb25zdCBmdXR1cmVZZWFyID0gc3RhcnREYXRlLnllYXIoKSArIDk7XG4gICAgY29uc3QgcGFzdFllYXIgPSBzdGFydERhdGUueWVhcigpO1xuICAgIGNvbnN0IGFjdGl2ZVZhbHVlID0gc3RhcnRZZWFyLnZhbHVlT2YoKTtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRNaWxsaXNlY29uZHMgPT09IG51bGwgfHwgc2VsZWN0ZWRNaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZFxuICAgICAgPyBzZWxlY3RlZE1pbGxpc2Vjb25kc1xuICAgICAgOiBtb21lbnQoc2VsZWN0ZWRNaWxsaXNlY29uZHMpLnN0YXJ0T2YoJ3llYXInKS52YWx1ZU9mKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlld05hbWU6ICd5ZWFyJyxcbiAgICAgIHZpZXdMYWJlbDogYCR7cGFzdFllYXJ9LSR7ZnV0dXJlWWVhcn1gLFxuICAgICAgYWN0aXZlRGF0ZTogYWN0aXZlVmFsdWUsXG4gICAgICBsZWZ0QnV0dG9uOiB7XG4gICAgICAgIHZhbHVlOiBtb21lbnQoc3RhcnREYXRlKS5zdWJ0cmFjdCgxMCwgJ3llYXJzJykudmFsdWVPZigpLFxuICAgICAgICBhcmlhTGFiZWw6IGBHbyB0byAke3Bhc3RZZWFyIC0gMTB9LSR7cGFzdFllYXIgLSAxfWAsXG4gICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgfSxcbiAgICAgIHJpZ2h0QnV0dG9uOiB7XG4gICAgICAgIHZhbHVlOiBtb21lbnQoc3RhcnREYXRlKS5hZGQoMTAsICd5ZWFycycpLnZhbHVlT2YoKSxcbiAgICAgICAgYXJpYUxhYmVsOiBgR28gdG8gJHtmdXR1cmVZZWFyICsgMX0tJHtmdXR1cmVZZWFyICsgMTB9YCxcbiAgICAgICAgY2xhc3Nlczoge30sXG4gICAgICB9LFxuICAgICAgcm93czogcm93TnVtYmVycy5tYXAocm93T2ZZZWFycy5iaW5kKHRoaXMpKVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiByb3dPZlllYXJzKHJvd051bWJlcikge1xuXG4gICAgICBjb25zdCBjdXJyZW50TW9tZW50ID0gbW9tZW50KCk7XG4gICAgICBjb25zdCBjZWxscyA9IGNvbHVtbk51bWJlcnMubWFwKChjb2x1bW5OdW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgeWVhck1vbWVudCA9IG1vbWVudChzdGFydERhdGUpLmFkZCgocm93TnVtYmVyICogY29sdW1uTnVtYmVycy5sZW5ndGgpICsgY29sdW1uTnVtYmVyLCAneWVhcnMnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXNwbGF5OiB5ZWFyTW9tZW50LmZvcm1hdCgnWVlZWScpLFxuICAgICAgICAgIHZhbHVlOiB5ZWFyTW9tZW50LnZhbHVlT2YoKSxcbiAgICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgICAnZGwtYWJkdHAtYWN0aXZlJzogYWN0aXZlVmFsdWUgPT09IHllYXJNb21lbnQudmFsdWVPZigpLFxuICAgICAgICAgICAgJ2RsLWFiZHRwLXNlbGVjdGVkJzogc2VsZWN0ZWRWYWx1ZSA9PT0geWVhck1vbWVudC52YWx1ZU9mKCksXG4gICAgICAgICAgICAnZGwtYWJkdHAtbm93JzogeWVhck1vbWVudC5pc1NhbWUoY3VycmVudE1vbWVudCwgJ3llYXInKSxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7Y2VsbHN9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBhY3RpdmUgYHllYXJgIG9uZSByb3cgYGRvd25gIGZyb20gdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICpcbiAgICogVGhlIGBhY3RpdmVgIHllYXIgd2lsbCBiZSB0aGUgSmFudWFyeSAxIGBmaXZlICg1KSB5ZWFycyBhZnRlcmAgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gICAqIFRoaXMgbW92ZXMgdGhlIGBhY3RpdmVgIGRhdGUgb25lIHJvdyBgZG93bmAgaW4gdGhlIGN1cnJlbnQgYHllYXJgIHZpZXcuXG4gICAqXG4gICAqIE1vdmluZyBgZG93bmAgY2FuIHJlc3VsdCBpbiB0aGUgYGFjdGl2ZWAgeWVhciBiZWluZyBwYXJ0IG9mIGEgZGlmZmVyZW50IGRlY2FkZSB0aGFuXG4gICAqIHRoZSBzcGVjaWZpZWQgYGZyb21NaWxsaXNlY29uZHNgLCBpbiB0aGlzIGNhc2UgdGhlIGRlY2FkZSByZXByZXNlbnRlZCBieSB0aGUgbW9kZWxcbiAgICogd2lsbCBjaGFuZ2UgdG8gc2hvdyB0aGUgY29ycmVjdCBkZWNhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgbW9tZW50IGluIHRpbWUgZnJvbSB3aGljaCB0aGUgbmV4dCBgeWVhcmAgbW9kZWwgYGRvd25gIHdpbGwgYmUgY29uc3RydWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIuXG4gICAqIEByZXR1cm5zXG4gICAqICBtb2RlbCBjb250YWluaW5nIGFuIGBhY3RpdmVgIGB5ZWFyYCBvbmUgcm93IGBkb3duYCBmcm9tIHRoZSBzcGVjaWZpZWQgbW9tZW50IGluIHRpbWUuXG4gICAqL1xuICBnb0Rvd24oZnJvbU1pbGxpc2Vjb25kczogbnVtYmVyLCBzZWxlY3RlZE1pbGxpc2Vjb25kczogbnVtYmVyKTogRGxEYXRlVGltZVBpY2tlck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNb2RlbChtb21lbnQoZnJvbU1pbGxpc2Vjb25kcykuYWRkKDUsICd5ZWFyJykudmFsdWVPZigpLCBzZWxlY3RlZE1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgYWN0aXZlIGB5ZWFyYCBvbmUgcm93IGB1cGAgZnJvbSB0aGUgc3BlY2lmaWVkIG1vbWVudCBpbiB0aW1lLlxuICAgKlxuICAgKiBUaGUgYGFjdGl2ZWAgeWVhciB3aWxsIGJlIHRoZSBKYW51YXJ5IDEgYGZpdmUgKDUpIHllYXJzIGJlZm9yZWAgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gICAqIFRoaXMgbW92ZXMgdGhlIGBhY3RpdmVgIGRhdGUgb25lIHJvdyBgdXBgIGluIHRoZSBjdXJyZW50IGB5ZWFyYCB2aWV3LlxuICAgKlxuICAgKiBNb3ZpbmcgYHVwYCBjYW4gcmVzdWx0IGluIHRoZSBgYWN0aXZlYCB5ZWFyIGJlaW5nIHBhcnQgb2YgYSBkaWZmZXJlbnQgZGVjYWRlIHRoYW5cbiAgICogdGhlIHNwZWNpZmllZCBgZnJvbU1pbGxpc2Vjb25kc2AsIGluIHRoaXMgY2FzZSB0aGUgZGVjYWRlIHJlcHJlc2VudGVkIGJ5IHRoZSBtb2RlbFxuICAgKiB3aWxsIGNoYW5nZSB0byBzaG93IHRoZSBjb3JyZWN0IGRlY2FkZS5cbiAgICpcbiAgICogQHBhcmFtIGZyb21NaWxsaXNlY29uZHNcbiAgICogIHRoZSBtb21lbnQgaW4gdGltZSBmcm9tIHdoaWNoIHRoZSBwcmV2aW91cyBgeWVhcmAgbW9kZWwgYHVwYCB3aWxsIGJlIGNvbnN0cnVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNaWxsaXNlY29uZHNcbiAgICogIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkYXRlL3RpbWUgcGlja2VyLlxuICAgKiBAcmV0dXJuc1xuICAgKiAgbW9kZWwgY29udGFpbmluZyBhbiBgYWN0aXZlYCBgeWVhcmAgb25lIHJvdyBgdXBgIGZyb20gdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICovXG4gIGdvVXAoZnJvbU1pbGxpc2Vjb25kczogbnVtYmVyLCBzZWxlY3RlZE1pbGxpc2Vjb25kczogbnVtYmVyKTogRGxEYXRlVGltZVBpY2tlck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNb2RlbChtb21lbnQoZnJvbU1pbGxpc2Vjb25kcykuc3VidHJhY3QoNSwgJ3llYXInKS52YWx1ZU9mKCksIHNlbGVjdGVkTWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBgYWN0aXZlYCBgeWVhcmAgb25lICgxKSB5ZWFyIHRvIHRoZSBgbGVmdGAgb2YgdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICpcbiAgICogVGhlIGBhY3RpdmVgIHllYXIgd2lsbCBiZSB0aGUgSmFudWFyeSAxIGBvbmUgKDEpIHllYXIgYmVmb3JlYCB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kcy5cbiAgICogVGhpcyBtb3ZlcyB0aGUgYGFjdGl2ZWAgZGF0ZSBvbmUgeWVhciBgbGVmdGAgaW4gdGhlIGN1cnJlbnQgYHllYXJgIHZpZXcuXG4gICAqXG4gICAqIE1vdmluZyBgbGVmdGAgY2FuIHJlc3VsdCBpbiB0aGUgYGFjdGl2ZWAgeWVhciBiZWluZyBwYXJ0IG9mIGEgZGlmZmVyZW50IGRlY2FkZSB0aGFuXG4gICAqIHRoZSBzcGVjaWZpZWQgYGZyb21NaWxsaXNlY29uZHNgLCBpbiB0aGlzIGNhc2UgdGhlIGRlY2FkZSByZXByZXNlbnRlZCBieSB0aGUgbW9kZWxcbiAgICogd2lsbCBjaGFuZ2UgdG8gc2hvdyB0aGUgY29ycmVjdCBkZWNhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgbW9tZW50IGluIHRpbWUgZnJvbSB3aGljaCB0aGUgYHllYXJgIG1vZGVsIHRvIHRoZSBgbGVmdGAgd2lsbCBiZSBjb25zdHJ1Y3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIHBpY2tlci5cbiAgICogQHJldHVybnNcbiAgICogIG1vZGVsIGNvbnRhaW5pbmcgYW4gYGFjdGl2ZWAgYHllYXJgIG9uZSB5ZWFyIHRvIHRoZSBgbGVmdGAgb2YgdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICovXG4gIGdvTGVmdChmcm9tTWlsbGlzZWNvbmRzOiBudW1iZXIsIHNlbGVjdGVkTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBEbERhdGVUaW1lUGlja2VyTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldE1vZGVsKG1vbWVudChmcm9tTWlsbGlzZWNvbmRzKS5zdWJ0cmFjdCgxLCAneWVhcicpLnZhbHVlT2YoKSwgc2VsZWN0ZWRNaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGBhY3RpdmVgIGB5ZWFyYCBvbmUgKDEpIHllYXIgdG8gdGhlIGByaWdodGAgb2YgdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICpcbiAgICogVGhlIGBhY3RpdmVgIHllYXIgd2lsbCBiZSB0aGUgSmFudWFyeSAxIGBvbmUgKDEpIHllYXIgYWZ0ZXJgIHRoZSBzcGVjaWZpZWQgbWlsbGlzZWNvbmRzLlxuICAgKiBUaGlzIG1vdmVzIHRoZSBgYWN0aXZlYCBkYXRlIG9uZSB5ZWFyIGByaWdodGAgaW4gdGhlIGN1cnJlbnQgYHllYXJgIHZpZXcuXG4gICAqXG4gICAqIE1vdmluZyBgcmlnaHRgIGNhbiByZXN1bHQgaW4gdGhlIGBhY3RpdmVgIHllYXIgYmVpbmcgcGFydCBvZiBhIGRpZmZlcmVudCBkZWNhZGUgdGhhblxuICAgKiB0aGUgc3BlY2lmaWVkIGBmcm9tTWlsbGlzZWNvbmRzYCwgaW4gdGhpcyBjYXNlIHRoZSBkZWNhZGUgcmVwcmVzZW50ZWQgYnkgdGhlIG1vZGVsXG4gICAqIHdpbGwgY2hhbmdlIHRvIHNob3cgdGhlIGNvcnJlY3QgZGVjYWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbU1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIG1vbWVudCBpbiB0aW1lIGZyb20gd2hpY2ggdGhlIGB5ZWFyYCBtb2RlbCB0byB0aGUgYHJpZ2h0YCB3aWxsIGJlIGNvbnN0cnVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNaWxsaXNlY29uZHNcbiAgICogIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkYXRlL3RpbWUgcGlja2VyLlxuICAgKiBAcmV0dXJuc1xuICAgKiAgbW9kZWwgY29udGFpbmluZyBhbiBgYWN0aXZlYCBgeWVhcmAgb25lIHllYXIgdG8gdGhlIGByaWdodGAgb2YgdGhlIHNwZWNpZmllZCBtb21lbnQgaW4gdGltZS5cbiAgICovXG4gIGdvUmlnaHQoZnJvbU1pbGxpc2Vjb25kczogbnVtYmVyLCBzZWxlY3RlZE1pbGxpc2Vjb25kczogbnVtYmVyKTogRGxEYXRlVGltZVBpY2tlck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNb2RlbChtb21lbnQoZnJvbU1pbGxpc2Vjb25kcykuYWRkKDEsICd5ZWFyJykudmFsdWVPZigpLCBzZWxlY3RlZE1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgYWN0aXZlIGB5ZWFyYCBvbmUgZGVjYWRlIGBkb3duYCBmcm9tIHRoZSBzcGVjaWZpZWQgbW9tZW50IGluIHRpbWUuXG4gICAqXG4gICAqIFRoZSBgYWN0aXZlYCB5ZWFyIHdpbGwgYmUgdGhlIEphbnVhcnkgMSBgdGVuICgxMCkgeWVhcnMgYWZ0ZXJgIHRoZSBzcGVjaWZpZWQgbWlsbGlzZWNvbmRzLlxuICAgKiBUaGlzIG1vdmVzIHRoZSBgYWN0aXZlYCBkYXRlIG9uZSBgcGFnZWAgYGRvd25gIGZyb20gdGhlIGN1cnJlbnQgYHllYXJgIHZpZXcuXG4gICAqXG4gICAqIFBhZ2luZyBgZG93bmAgd2lsbCByZXN1bHQgaW4gdGhlIGBhY3RpdmVgIHllYXIgYmVpbmcgcGFydCBvZiBhIGRpZmZlcmVudCBkZWNhZGUgdGhhblxuICAgKiB0aGUgc3BlY2lmaWVkIGBmcm9tTWlsbGlzZWNvbmRzYC4gQXMgYSByZXN1bHQsIHRoZSBkZWNhZGUgcmVwcmVzZW50ZWQgYnkgdGhlIG1vZGVsXG4gICAqIHdpbGwgY2hhbmdlIHRvIHNob3cgdGhlIGNvcnJlY3QgZGVjYWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbU1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIG1vbWVudCBpbiB0aW1lIGZyb20gd2hpY2ggdGhlIG5leHQgYHllYXJgIG1vZGVsIHBhZ2UgYGRvd25gIHdpbGwgYmUgY29uc3RydWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIuXG4gICAqIEByZXR1cm5zXG4gICAqICBtb2RlbCBjb250YWluaW5nIGFuIGBhY3RpdmVgIGB5ZWFyYCBvbmUgZGVjYWRlIGBkb3duYCBmcm9tIHRoZSBzcGVjaWZpZWQgbW9tZW50IGluIHRpbWUuXG4gICAqL1xuICBwYWdlRG93bihmcm9tTWlsbGlzZWNvbmRzOiBudW1iZXIsIHNlbGVjdGVkTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBEbERhdGVUaW1lUGlja2VyTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldE1vZGVsKG1vbWVudChmcm9tTWlsbGlzZWNvbmRzKS5hZGQoMTAsICd5ZWFyJykudmFsdWVPZigpLCBzZWxlY3RlZE1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgYWN0aXZlIGB5ZWFyYCBvbmUgZGVjYWRlIGB1cGAgZnJvbSB0aGUgc3BlY2lmaWVkIG1vbWVudCBpbiB0aW1lLlxuICAgKlxuICAgKiBUaGUgYGFjdGl2ZWAgeWVhciB3aWxsIGJlIHRoZSBKYW51YXJ5IDEgYHRlbiAoMTApIHllYXJzIGJlZm9yZWAgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gICAqIFRoaXMgbW92ZXMgdGhlIGBhY3RpdmVgIGRhdGUgb25lIGBwYWdlLXVwYCBmcm9tIHRoZSBjdXJyZW50IGB5ZWFyYCB2aWV3LlxuICAgKlxuICAgKiBQYWdpbmcgYHVwYCB3aWxsIHJlc3VsdCBpbiB0aGUgYGFjdGl2ZWAgeWVhciBiZWluZyBwYXJ0IG9mIGEgZGlmZmVyZW50IGRlY2FkZSB0aGFuXG4gICAqIHRoZSBzcGVjaWZpZWQgYGZyb21NaWxsaXNlY29uZHNgLiBBcyBhIHJlc3VsdCwgdGhlIGRlY2FkZSByZXByZXNlbnRlZCBieSB0aGUgbW9kZWxcbiAgICogd2lsbCBjaGFuZ2UgdG8gc2hvdyB0aGUgY29ycmVjdCBkZWNhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgbW9tZW50IGluIHRpbWUgZnJvbSB3aGljaCB0aGUgbmV4dCBgeWVhcmAgbW9kZWwgcGFnZSBgdXBgIHdpbGwgYmUgY29uc3RydWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIuXG4gICAqIEByZXR1cm5zXG4gICAqICBtb2RlbCBjb250YWluaW5nIGFuIGBhY3RpdmVgIGB5ZWFyYCBvbmUgZGVjYWRlIGB1cGAgZnJvbSB0aGUgc3BlY2lmaWVkIG1vbWVudCBpbiB0aW1lLlxuICAgKi9cbiAgcGFnZVVwKGZyb21NaWxsaXNlY29uZHM6IG51bWJlciwgc2VsZWN0ZWRNaWxsaXNlY29uZHM6IG51bWJlcik6IERsRGF0ZVRpbWVQaWNrZXJNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWwobW9tZW50KGZyb21NaWxsaXNlY29uZHMpLnN1YnRyYWN0KDEwLCAneWVhcicpLnZhbHVlT2YoKSwgc2VsZWN0ZWRNaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGBhY3RpdmVgIGB5ZWFyYCB0byB0aGUgYGxhc3RgIHllYXIgaW4gdGhlIGRlY2FkZS5cbiAgICpcbiAgICogVGhlIHZpZXcgb3IgdGltZSByYW5nZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIHRoZSBgZnJvbU1pbGxpc2Vjb25kc2AgdmFsdWVcbiAgICogaXMgaW4gYSBkaWZmZXJlbnQgZGVjYWRlIHRoYW4gdGhlIGRpc3BsYXllZCBkZWNhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tTWlsbGlzZWNvbmRzXG4gICAqICB0aGUgbW9tZW50IGluIHRpbWUgZnJvbSB3aGljaCB0aGUgYGxhc3RgIGFjdGl2ZSBgeWVhcmAgd2lsbCBiZSBjYWxjdWxhdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNaWxsaXNlY29uZHNcbiAgICogIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkYXRlL3RpbWUgcGlja2VyLlxuICAgKiBAcmV0dXJuc1xuICAgKiAgYSBtb2RlbCB3aXRoIHRoZSBgbGFzdGAgY2VsbCBpbiB0aGUgdmlldyBhcyB0aGUgYWN0aXZlIGB5ZWFyYC5cbiAgICovXG4gIGdvRW5kKGZyb21NaWxsaXNlY29uZHM6IG51bWJlciwgc2VsZWN0ZWRNaWxsaXNlY29uZHM6IG51bWJlcik6IERsRGF0ZVRpbWVQaWNrZXJNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWwoXG4gICAgICBEbFllYXJNb2RlbFByb3ZpZGVyLmdldFN0YXJ0T2ZEZWNhZGUoZnJvbU1pbGxpc2Vjb25kcylcbiAgICAgICAgLmFkZCg5LCAneWVhcnMnKVxuICAgICAgICAuZW5kT2YoJ3llYXInKVxuICAgICAgICAudmFsdWVPZigpLFxuICAgICAgc2VsZWN0ZWRNaWxsaXNlY29uZHNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGBhY3RpdmVgIGB5ZWFyYCB0byB0aGUgYGZpcnN0YCB5ZWFyIGluIHRoZSBkZWNhZGUuXG4gICAqXG4gICAqIFRoZSB2aWV3IG9yIHRpbWUgcmFuZ2Ugd2lsbCBub3QgY2hhbmdlIHVubGVzcyB0aGUgYGZyb21NaWxsaXNlY29uZHNgIHZhbHVlXG4gICAqIGlzIGluIGEgZGlmZmVyZW50IGRlY2FkZSB0aGFuIHRoZSBkaXNwbGF5ZWQgZGVjYWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbU1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIG1vbWVudCBpbiB0aW1lIGZyb20gd2hpY2ggdGhlIGBmaXJzdGAgYWN0aXZlIGB5ZWFyYCB3aWxsIGJlIGNhbGN1bGF0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE1pbGxpc2Vjb25kc1xuICAgKiAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIuXG4gICAqIEByZXR1cm5zXG4gICAqICBhIG1vZGVsIHdpdGggdGhlIGBmaXJzdGAgY2VsbCBpbiB0aGUgdmlldyBhcyB0aGUgYWN0aXZlIGB5ZWFyYC5cbiAgICovXG4gIGdvSG9tZShmcm9tTWlsbGlzZWNvbmRzOiBudW1iZXIsIHNlbGVjdGVkTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBEbERhdGVUaW1lUGlja2VyTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldE1vZGVsKFxuICAgICAgRGxZZWFyTW9kZWxQcm92aWRlci5nZXRTdGFydE9mRGVjYWRlKGZyb21NaWxsaXNlY29uZHMpXG4gICAgICAgIC5zdGFydE9mKCd5ZWFyJylcbiAgICAgICAgLnZhbHVlT2YoKSxcbiAgICAgIHNlbGVjdGVkTWlsbGlzZWNvbmRzXG4gICAgKTtcbiAgfVxufVxuIl19