smoosic 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/smoosic.js CHANGED
@@ -325,7 +325,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
325
325
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
326
326
 
327
327
  "use strict";
328
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreView: () => (/* binding */ SuiScoreView)\n/* harmony export */ });\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/xform/copypaste */ \"./src/smo/xform/copypaste.ts\");\n/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scroller */ \"./src/render/sui/scroller.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _tracker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tracker */ \"./src/render/sui/tracker.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _renderState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./renderState */ \"./src/render/sui/renderState.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Base class for all operations on the rendered score. The base class handles the following:\n * 1. Undo and recording actions for the operation\n * 2. Maintain/change which staves in the score are displayed (staff map)\n * 3. Mapping between the displayed score and the data representation\n * @category SuiRender\n */\nclass SuiScoreView {\n constructor(config, svgContainer, score, scrollSelector, undoBuffer) {\n this.score = score;\n const renderParams = {\n elementId: svgContainer,\n score,\n config,\n undoBuffer\n };\n this.audioAnimation = config.audioAnimation;\n this.renderer = new _renderState__WEBPACK_IMPORTED_MODULE_12__.SuiRenderState(renderParams);\n this.config = config;\n const scoreJson = score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true });\n this.scroller = new _scroller__WEBPACK_IMPORTED_MODULE_8__.SuiScroller(scrollSelector, this.renderer.renderer.vexContainers);\n this.storePaste = new _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__.PasteBuffer();\n this.tracker = new _tracker__WEBPACK_IMPORTED_MODULE_10__.SuiTracker(this.renderer, this.scroller);\n this.renderer.setMeasureMapper(this.tracker);\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(scoreJson));\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.storeUndo = new _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer();\n this.staffMap = this.defaultStaffMap;\n SuiScoreView.Instance = this; // for debugging\n this.setMappedStaffIds();\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__.createTopDomContainer)('.saveLink'); // for file upload\n }\n /**\n * Await on the full update of the score\n * @returns\n */\n renderPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.renderPromise();\n });\n }\n /**\n * Await on the partial update of the score in the view\n * @returns\n */\n updatePromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.updatePromise();\n });\n }\n awaitRender() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * await on the full update of the score, also resetting the viewport (to reflect layout changes)\n * @returns\n */\n refreshViewport() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.preserveScroll();\n this.renderer.setViewport();\n this.renderer.setRefresh();\n yield this.renderer.renderPromise();\n });\n }\n handleScrollEvent(scrollLeft, scrollTop) {\n this.tracker.scroller.handleScroll(scrollLeft, scrollTop);\n }\n getPartMap() {\n let keepNext = false;\n let partCount = 0;\n let partMap = {};\n const keys = [];\n this.storeScore.staves.forEach((staff) => {\n const partInfo = staff.partInfo;\n partInfo.associatedStaff = staff.staffId;\n if (!keepNext) {\n partMap[partCount] = partInfo;\n keys.push(partCount);\n partCount += 1;\n if (partInfo.stavesAfter > 0) {\n keepNext = true;\n }\n }\n else {\n keepNext = false;\n }\n });\n return { keys, partMap };\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifyCurrentSelections(label, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelections = this._getEquivalentSelections(this.tracker.selections);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, this.tracker.selections);\n actor(this.storeScore, altSelections);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelection(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, [selection]);\n if (altSelection) {\n actor(this.storeScore, [altSelection]);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelectionNoWait(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n });\n }\n /**\n * Modifiy a set of columns, e.g. tempo, time, key. This has different undo behavior, don't\n * pend on the result because there may be a combination of operations.\n * @param label\n * @param selections\n * @param actor\n */\n modifyColumnsSelectionsNoWait(label, selections, actor) {\n this.undoColumnRange(label, selections);\n selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n });\n this._renderChangedMeasures(selections);\n }\n /**\n * This is used in some Smoosic demos and pens.\n * @param action any action, but most usefully a SuiScoreView method\n * @param repetition number of times to repeat, waiting on render promise between\n * if not specified, defaults to 1\n * @returns promise, resolved action has been completed and score is updated.\n */\n waitableAction(action, repetition) {\n return __awaiter(this, void 0, void 0, function* () {\n const rep = repetition !== null && repetition !== void 0 ? repetition : 1;\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (count) => __awaiter(this, void 0, void 0, function* () {\n if (count > 0) {\n action();\n yield self.renderer.updatePromise();\n fc(count - 1);\n }\n else {\n resolve();\n }\n });\n fc(rep);\n });\n return promise;\n });\n }\n /**\n * The plural form of _getEquivalentSelection\n * @param selections\n * @returns\n */\n _getEquivalentSelections(selections) {\n const rv = [];\n selections.forEach((selection) => {\n const sel = this._getEquivalentSelection(selection);\n if (sel !== null) {\n rv.push(sel);\n }\n });\n return rv;\n }\n // Get a long enough list of measures to paste into\n getPasteMeasureList() {\n // The length of the paste buffer, in ticks\n const ticksToPaste = this.storePaste.getCopyBufferTickCount();\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n const tm = selections[0].measure.tickmapForVoice(selections[0].selector.voice);\n // The last measure selected\n const lastSelection = this.tracker.selections[this.tracker.selections.length - 1];\n // length of first selected measure, in ticks\n const measureTicks = this.tracker.selections[0].measure.getTicksFromVoice(this.tracker.selections[0].selector.voice);\n // remaining ticks after first selection. This is our starting point.\n let startTick = measureTicks - tm.durationMap[this.tracker.selections[0].selector.tick];\n // Add ticks for all remaining measures\n for (let i = 1; i < selections.length; ++i) {\n const sel = selections[i];\n startTick += sel.measure.getTicksFromVoice(0);\n }\n // if we are short, and there are measures left, add them to the selection list\n if (startTick < ticksToPaste && lastSelection.selector.measure < (this.score.staves[0].measures.length + 1)) {\n const newSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, selections[0].selector.staff, lastSelection.selector.measure + 1);\n if (newSel) {\n selections.push(newSel);\n }\n }\n return selections;\n }\n /**\n * A staff modifier has changed, create undo operations for the measures affected\n * @param label\n * @param staffModifier\n * @param subtype\n */\n undoStaffModifier(label, staffModifier, subtype) {\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase.deserialize(staffModifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const copySer = copy.serialize();\n // Copy ID so we can undo properly\n copySer.attrs = JSON.parse(JSON.stringify(staffModifier.attrs));\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.STAFF_MODIFIER, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, copySer, subtype);\n }\n /**\n * Return the index of the page that is in the center of the client screen.\n */\n getFocusedPage() {\n if (this.score.layoutManager === undefined) {\n return 0;\n }\n const scrollAvg = this.tracker.scroller.netScroll.y + (this.tracker.scroller.viewport.height / 2);\n const midY = scrollAvg;\n const layoutManager = this.score.layoutManager.getGlobalLayout();\n const lh = layoutManager.pageHeight / layoutManager.svgScale;\n const lw = layoutManager.pageWidth / layoutManager.svgScale;\n const pt = this.renderer.pageMap.svgToClient(_svgHelpers__WEBPACK_IMPORTED_MODULE_9__.SvgHelpers.smoBox({ x: lw, y: lh }));\n return Math.round(midY / pt.y);\n }\n /**\n * Create a rectangle undo, like a multiple columns but not necessarily the whole\n * score.\n */\n _undoColumn(label, measureIndex) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.COLUMN, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, { score: this.storeScore, measureIndex }, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Score preferences don't affect the display, but they do have an undo\n * @param label\n */\n _undoScorePreferences(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE_ATTRIBUTES, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n undoColumnRange(label, measureSelections) {\n const checked = {};\n measureSelections.forEach((measureSelection) => {\n if (!checked[measureSelection.selector.measure]) {\n checked[measureSelection.selector.measure] = true;\n this._undoColumn(label, measureSelection.selector.measure);\n }\n });\n }\n undoMeasureRange(label, measureSelections) {\n measureSelections.forEach((measureSelection) => {\n const equiv = this._getEquivalentSelection(measureSelection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n });\n return measureSelections;\n }\n /**\n * Add to the undo buffer the current set of measures selected.\n * @param label\n * @returns\n */\n undoTrackerMeasureSelections(label) {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n return this.undoMeasureRange(label, measureSelections);\n }\n /**\n * operation that only affects the first selection. Setup undo for the measure\n */\n _undoFirstMeasureSelection(label) {\n const sel = this.tracker.selections[0];\n const equiv = this._getEquivalentSelection(sel);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n return sel;\n }\n /**\n * Add the selection to the undo buffer\n * @param label\n * @param selection\n */\n _undoSelection(label, selection) {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n }\n /**\n * Add multiple selections to the undo buffer as a group\n * @param label\n * @param selections\n */\n _undoSelections(label, selections) {\n this.storeUndo.grouping = true;\n selections.forEach((selection) => {\n this._undoSelection(label, selection);\n });\n this.storeUndo.grouping = false;\n }\n /**\n * Update renderer for measures that have changed\n */\n _renderChangedMeasures(measureSelections) {\n if (!Array.isArray(measureSelections)) {\n measureSelections = [measureSelections];\n }\n measureSelections.forEach((measureSelection) => {\n this.renderer.addToReplaceQueue(measureSelection);\n });\n }\n /**\n * Update renderer for some columns\n * @param fromSelector\n * @param toSelector\n */\n _renderRectangle(fromSelector, toSelector) {\n this._getRectangleSelections(fromSelector, toSelector).forEach((s) => {\n this.renderer.addToReplaceQueue(s);\n });\n }\n /**\n * Setup undo for operation that affects the whole score\n * @param label\n */\n _undoScore(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Get the selector from this.storeScore that maps to the displayed selector from this.score\n * @param selector\n * @returns\n */\n _getEquivalentSelector(selector) {\n const rv = JSON.parse(JSON.stringify(selector));\n rv.staff = this.staffMap[selector.staff];\n return rv;\n }\n /**\n * Get the equivalent staff id from this.storeScore that maps to the displayed selector from this.score\n * @param staffId\n * @returns\n */\n _getEquivalentStaff(staffId) {\n return this.staffMap[staffId];\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentSelection(selection) {\n try {\n if (typeof (selection.selector.tick) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure);\n }\n if (typeof (selection.selector.pitches) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.noteSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick);\n }\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.pitchSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick, selection.selector.pitches);\n }\n catch (ex) {\n console.warn(ex);\n return null;\n }\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentGraceNote(selection, gn) {\n if (selection.note !== null) {\n const rv = selection.note.getGraceNotes().find((gg) => gg.attrs.id === gn.attrs.id);\n if (rv) {\n return rv;\n }\n }\n return gn;\n }\n /**\n * Get the rectangle of selections indicated by the parameters from the score\n * @param startSelector\n * @param endSelector\n * @param score\n * @returns\n */\n _getRectangleSelections(startSelector, endSelector) {\n const rv = [];\n let i = 0;\n let j = 0;\n for (i = startSelector.staff; i <= endSelector.staff; i++) {\n for (j = startSelector.measure; j <= endSelector.measure; j++) {\n const target = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, i, j);\n if (target !== null) {\n rv.push(target);\n }\n }\n }\n return rv;\n }\n /**\n * set the grouping flag for undo operations\n * @param val\n */\n groupUndo(val) {\n this.storeUndo.grouping = val;\n }\n /**\n * Show all staves, 1:1 mapping of view score staff to stored score staff\n */\n get defaultStaffMap() {\n let i = 0;\n const rv = [];\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n rv.push(i);\n }\n return rv;\n }\n /**\n * Bootstrapping function, creates the renderer and associated timers\n */\n startRenderingEngine() {\n if (!this.renderer.score) {\n // If there is only one part, display the part.\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n // If the score is transposing, hide the instrument xpose settings\n this._setTransposing();\n this.renderer.score = this.score;\n this.renderer.setViewport();\n }\n this.renderer.startDemon();\n }\n /**\n * Gets the current mapping of displayed staves to score staves (this.storeScore)\n * @returns\n */\n getView() {\n const rv = [];\n let i = 0;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const show = this.staffMap.indexOf(i) >= 0;\n rv.push({ show });\n }\n return rv;\n }\n /**\n * Update the staff ID when the view changes\n */\n setMappedStaffIds() {\n this.score.staves.forEach((staff) => {\n if (!this.isPartExposed()) {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n }\n else {\n staff.partInfo.displayCues = false;\n }\n staff.setMappedStaffId(this.staffMap[staff.staffId]);\n });\n }\n resetPartView() {\n if (this.staffMap.length === 1) {\n const staff = this.storeScore.staves[this.staffMap[0]];\n this.exposePart(staff);\n }\n }\n /**\n * Exposes a part: hides non-part staves, shows part staves.\n * Note this will reset the view. After this operation, staff 0 will\n * be the selected part.\n * @param staff\n */\n exposePart(staff) {\n let i = 0;\n const exposeMap = [];\n let pushNext = false;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const tS = this.storeScore.staves[i];\n const show = tS.staffId === staff.staffId;\n if (pushNext) {\n exposeMap.push({ show: true });\n pushNext = false;\n }\n else {\n exposeMap.push({ show });\n if (tS.partInfo.stavesAfter > 0 && show) {\n pushNext = true;\n }\n }\n }\n this.setView(exposeMap);\n }\n /**\n * Indicates if the score is displaying in part-mode vs. score mode.\n * @returns\n */\n isPartExposed() {\n return this.score.isPartExposed();\n }\n /**\n * Parts have different formatting options from the parent score, indluding layout. Reset\n * them when exposing a part.\n */\n _mapPartFormatting() {\n this.score.layoutManager = this.score.staves[0].partInfo.layoutManager;\n let replacedText = false;\n this.score.staves.forEach((staff) => {\n staff.updateMeasureFormatsForPart();\n if (staff.partInfo.preserveTextGroups && !replacedText) {\n const tga = [];\n replacedText = true;\n staff.partInfo.textGroups.forEach((tg) => {\n tga.push(tg);\n });\n this.score.textGroups = tga;\n }\n });\n }\n /**\n * Update the list of staves in the score that are displayed.\n */\n setView(rows) {\n let i = 0;\n const any = rows.find((row) => row.show === true);\n if (!any) {\n return;\n }\n const nscore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: true, useDictionary: false, preserveStaffIds: false })));\n const staffMap = [];\n for (i = 0; i < rows.length; ++i) {\n const row = rows[i];\n if (row.show) {\n const srcStave = this.storeScore.staves[i];\n const jsonObj = srcStave.serialize({ skipMaps: false, preserveIds: true });\n jsonObj.staffId = staffMap.length;\n const nStave = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__.SmoSystemStaff.deserialize(jsonObj);\n nStave.mapStaffFromTo(i, nscore.staves.length);\n nscore.staves.push(nStave);\n if (srcStave.keySignatureMap) {\n nStave.keySignatureMap = JSON.parse(JSON.stringify(srcStave.keySignatureMap));\n }\n nStave.measures.forEach((measure, ix) => {\n const srcMeasure = srcStave.measures[ix];\n measure.tempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.SmoTempoText(srcMeasure.tempo.serialize());\n measure.timeSignature = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.TimeSignature(srcMeasure.timeSignature);\n measure.keySignature = srcMeasure.keySignature;\n });\n staffMap.push(i);\n }\n }\n nscore.numberStaves();\n this.staffMap = staffMap;\n this.score = nscore;\n // Indicate which score staff view staves are mapped to, to decide to display\n // modifiers.\n this.setMappedStaffIds();\n // TODO: add part-specific measure formatting, etc.\n this._setTransposing();\n this.renderer.score = nscore;\n // If this current view is a part, show the part layout\n if (this.isPartExposed()) {\n this._mapPartFormatting();\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = false;\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__.SmoOperation.computeMultipartRest(nscore);\n }\n else {\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n });\n }\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * view all the staffs in score mode.\n */\n viewAll() {\n this.score = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this._setTransposing();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.score = this.score;\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * Update score based on transposing flag.\n */\n _setTransposing() {\n var _a;\n if (!this.isPartExposed()) {\n const xpose = (_a = this.score.preferences) === null || _a === void 0 ? void 0 : _a.transposingScore;\n if (xpose) {\n this.score.setTransposing();\n }\n }\n }\n /**\n * Update the view after loading or restoring a completely new score\n * @param score\n * @returns\n */\n changeScore(score) {\n return __awaiter(this, void 0, void 0, function* () {\n this.storeUndo.reset();\n _audio_player__WEBPACK_IMPORTED_MODULE_14__.SuiAudioPlayer.stopPlayer();\n this.renderer.score = score;\n this.renderer.setViewport();\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.score = score;\n // If the score is non-transposing, hide the instrument xpose settings\n this._setTransposing();\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n const rv = yield this.awaitRender();\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n return rv;\n });\n }\n replaceMeasureView(measureRange) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.score.staves.forEach((staff) => {\n var _a, _b;\n const staffId = staff.staffId;\n const altStaff = this.storeScore.staves[this._getEquivalentStaff(staffId)];\n if (altStaff) {\n staff.syncStaffModifiers(i, altStaff);\n }\n // Get a copy of the backing score, and map it to the score stave. this.score may have fewer staves\n // than this.storeScore\n const svg = JSON.parse(JSON.stringify(staff.measures[i].svg));\n const serialized = _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.serializeMeasure(this.storeScore.staves[this.staffMap[staffId]].measures[i]);\n serialized.measureNumber.staffId = staffId;\n const xpose = (_a = serialized.transposeIndex) !== null && _a !== void 0 ? _a : 0;\n const concertKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.vexKeySigWithOffset((_b = serialized.keySignature) !== null && _b !== void 0 ? _b : 'c', -1 * xpose);\n serialized.keySignature = concertKey;\n const rmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(serialized);\n rmeasure.svg = svg;\n const selector = { staff: staffId, measure: i, voice: 0, tick: 0, pitches: [] };\n this.score.replaceMeasure(selector, rmeasure);\n });\n this.renderer.addColumnToReplaceQueue(i);\n }\n }\n /**\n * for the view score, the renderer decides what to render\n * depending on what is undone.\n * @returns\n */\n undo() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.renderer.score) {\n return;\n }\n if (!this.storeUndo.buffersAvailable()) {\n return;\n }\n const staffMap = {};\n const identityMap = {};\n this.defaultStaffMap.forEach((nn) => identityMap[nn] = nn);\n this.staffMap.forEach((mm, ix) => staffMap[mm] = ix);\n // A score-level undo might have changed the score.\n const fullScore = this.storeUndo.undoScorePeek();\n // text undo is handled differently since there is usually not\n // an associated measure.\n const scoreText = this.storeUndo.undoScoreTextGroupPeek();\n const partText = this.storeUndo.undoPartTextGroupPeek();\n if (scoreText || partText) {\n yield this.renderer.unrenderTextGroups();\n }\n const measureRange = this.storeUndo.getMeasureRange();\n if (!(fullScore || scoreText || partText)) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n }\n this.storeScore = this.storeUndo.undo(this.storeScore, identityMap, true);\n if (fullScore) {\n this.viewAll();\n this.renderer.setRefresh();\n }\n else if (partText) {\n this.setView(this.getView());\n }\n else if (scoreText) {\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.rerenderTextGroups();\n }\n else {\n this.replaceMeasureView(measureRange);\n }\n yield this.renderer.updatePromise();\n });\n }\n}\nSuiScoreView.Instance = null;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsQ0FBQztpQkFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLENBQUM7S0FBQTs7QUF6dEJNLHFCQUFRLEdBQXdCLElBQUksQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvc3VpL3Njb3JlVmlldy50cz8wOTdiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTbW9TY29yZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmUnO1xyXG5pbXBvcnQgeyBTbW9UZXh0R3JvdXAgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZVRleHQnO1xyXG5pbXBvcnQgeyBTbW9HcmFjZU5vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IFNtb1N5c3RlbVN0YWZmIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3lzdGVtU3RhZmYnO1xyXG5pbXBvcnQgeyBTbW9QYXJ0SW5mbyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3BhcnRJbmZvJztcclxuaW1wb3J0IHsgU3RhZmZNb2RpZmllckJhc2UgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zdGFmZk1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiwgU21vU2VsZWN0b3IgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFVuZG9CdWZmZXIsIGNvcHlVbmRvIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3VuZG8nO1xyXG5pbXBvcnQgeyBQYXN0ZUJ1ZmZlciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9jb3B5cGFzdGUnO1xyXG5pbXBvcnQgeyBTdWlTY3JvbGxlciB9IGZyb20gJy4vc2Nyb2xsZXInO1xyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpVHJhY2tlciB9IGZyb20gJy4vdHJhY2tlcic7XHJcbmltcG9ydCB7IGNyZWF0ZVRvcERvbUNvbnRhaW5lciB9IGZyb20gJy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFNtb1JlbmRlckNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBTdWlSZW5kZXJTdGF0ZSwgc2NvcmVDaGFuZ2VFdmVudCB9IGZyb20gJy4vcmVuZGVyU3RhdGUnO1xyXG5pbXBvcnQgeyBTY29yZVJlbmRlclBhcmFtcyB9IGZyb20gJy4vc2NvcmVSZW5kZXInO1xyXG5pbXBvcnQgeyBTbW9PcGVyYXRpb24gfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vb3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IFN1aUF1ZGlvUGxheWVyIH0gZnJvbSAnLi4vYXVkaW8vcGxheWVyJztcclxuaW1wb3J0IHsgU3VpQXVkaW9BbmltYXRpb25QYXJhbXMgfSBmcm9tICcuLi9hdWRpby9tdXNpY0N1cnNvcic7XHJcbmltcG9ydCB7IFNtb1RlbXBvVGV4dCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBUaW1lU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogSW5kaWNhdGVzIGEgc3RhdmUgaXMvaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgc2NvcmVcclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWaWV3TWFwRW50cnkge1xyXG4gIHNob3c6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIHVwZGF0ZVNlbGVjdGlvbkZ1bmMgPSAoc2NvcmU6IFNtb1Njb3JlLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkgPT4gdm9pZDtcclxuZXhwb3J0IHR5cGUgdXBkYXRlU2luZ2xlU2VsZWN0aW9uRnVuYyA9IChzY29yZTogU21vU2NvcmUsIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKSA9PiB2b2lkO1xyXG5leHBvcnQgdHlwZSB1cGRhdGVTdGFmZk1vZGlmaWVyRnVuYyA9IChzY29yZTogU21vU2NvcmUsIGZyb21TZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgdG9TZWxlY3Rpb246IFNtb1NlbGVjdGlvbikgPT4gdm9pZDtcclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBvcGVyYXRpb25zIG9uIHRoZSByZW5kZXJlZCBzY29yZS4gIFRoZSBiYXNlIGNsYXNzIGhhbmRsZXMgdGhlIGZvbGxvd2luZzpcclxuICogMS4gVW5kbyBhbmQgcmVjb3JkaW5nIGFjdGlvbnMgZm9yIHRoZSBvcGVyYXRpb25cclxuICogMi4gTWFpbnRhaW4vY2hhbmdlIHdoaWNoIHN0YXZlcyBpbiB0aGUgc2NvcmUgYXJlIGRpc3BsYXllZCAoc3RhZmYgbWFwKVxyXG4gKiAzLiBNYXBwaW5nIGJldHdlZW4gdGhlIGRpc3BsYXllZCBzY29yZSBhbmQgdGhlIGRhdGEgcmVwcmVzZW50YXRpb25cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aVNjb3JlVmlldyB7XHJcbiAgc3RhdGljIEluc3RhbmNlOiBTdWlTY29yZVZpZXcgfCBudWxsID0gbnVsbDtcclxuICBzY29yZTogU21vU2NvcmU7IC8vIFRoZSBzY29yZSB0aGF0IGlzIGRpc3BsYXllZFxyXG4gIHN0b3JlU2NvcmU6IFNtb1Njb3JlOyAgLy8gdGhlIGZ1bGwgc2NvcmUsIGluY2x1ZGluZyBpbnZpc2libGUgc3RhdmVzXHJcbiAgc3RhZmZNYXA6IG51bWJlcltdOyAvLyBtYXBwaW5nIHRoZSAyIHRoaW5ncyBhYm92ZVxyXG4gIHN0b3JlVW5kbzogVW5kb0J1ZmZlcjsgLy8gdW5kbyBidWZmZXIgZm9yIG9wZXJhdGlvbnMgdG8gYWJvdmVcclxuICB0cmFja2VyOiBTdWlUcmFja2VyOyAvLyBVSSBzZWxlY3Rpb25zXHJcbiAgcmVuZGVyZXI6IFN1aVJlbmRlclN0YXRlO1xyXG4gIHNjcm9sbGVyOiBTdWlTY3JvbGxlcjtcclxuICBzdG9yZVBhc3RlOiBQYXN0ZUJ1ZmZlcjtcclxuICBjb25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb247XHJcbiAgYXVkaW9BbmltYXRpb246IFN1aUF1ZGlvQW5pbWF0aW9uUGFyYW1zO1xyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU21vUmVuZGVyQ29uZmlndXJhdGlvbiwgc3ZnQ29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2NvcmU6IFNtb1Njb3JlLCBzY3JvbGxTZWxlY3RvcjogSFRNTEVsZW1lbnQsIHVuZG9CdWZmZXI6IFVuZG9CdWZmZXIpIHtcclxuICAgIHRoaXMuc2NvcmUgPSBzY29yZTtcclxuICAgIGNvbnN0IHJlbmRlclBhcmFtczogU2NvcmVSZW5kZXJQYXJhbXMgPSB7XHJcbiAgICAgIGVsZW1lbnRJZDogc3ZnQ29udGFpbmVyLFxyXG4gICAgICBzY29yZSxcclxuICAgICAgY29uZmlnLFxyXG4gICAgICB1bmRvQnVmZmVyXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hdWRpb0FuaW1hdGlvbiA9IGNvbmZpZy5hdWRpb0FuaW1hdGlvbjtcclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3VpUmVuZGVyU3RhdGUocmVuZGVyUGFyYW1zKTtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgY29uc3Qgc2NvcmVKc29uID0gc2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5zY3JvbGxlciA9IG5ldyBTdWlTY3JvbGxlcihzY3JvbGxTZWxlY3RvciwgdGhpcy5yZW5kZXJlci5yZW5kZXJlci52ZXhDb250YWluZXJzKTtcclxuICAgIHRoaXMuc3RvcmVQYXN0ZSA9IG5ldyBQYXN0ZUJ1ZmZlcigpO1xyXG4gICAgdGhpcy50cmFja2VyID0gbmV3IFN1aVRyYWNrZXIodGhpcy5yZW5kZXJlciwgdGhpcy5zY3JvbGxlcik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldE1lYXN1cmVNYXBwZXIodGhpcy50cmFja2VyKTtcclxuXHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShzY29yZUpzb24pKTtcclxuICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgIHRoaXMuc3RvcmVVbmRvID0gbmV3IFVuZG9CdWZmZXIoKTtcclxuICAgIHRoaXMuc3RhZmZNYXAgPSB0aGlzLmRlZmF1bHRTdGFmZk1hcDtcclxuICAgIFN1aVNjb3JlVmlldy5JbnN0YW5jZSA9IHRoaXM7IC8vIGZvciBkZWJ1Z2dpbmdcclxuICAgIHRoaXMuc2V0TWFwcGVkU3RhZmZJZHMoKTtcclxuICAgIGNyZWF0ZVRvcERvbUNvbnRhaW5lcignLnNhdmVMaW5rJyk7IC8vIGZvciBmaWxlIHVwbG9hZFxyXG4gIH1cclxuICAvKipcclxuICAgKiBBd2FpdCBvbiB0aGUgZnVsbCB1cGRhdGUgb2YgdGhlIHNjb3JlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVuZGVyUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBd2FpdCBvbiB0aGUgcGFydGlhbCB1cGRhdGUgb2YgdGhlIHNjb3JlIGluIHRoZSB2aWV3XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyBhd2FpdFJlbmRlcigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZXJlbmRlckFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhd2FpdCBvbiB0aGUgZnVsbCB1cGRhdGUgb2YgdGhlIHNjb3JlLCBhbHNvIHJlc2V0dGluZyB0aGUgdmlld3BvcnQgKHRvIHJlZmxlY3QgbGF5b3V0IGNoYW5nZXMpXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVmcmVzaFZpZXdwb3J0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVuZGVyUHJvbWlzZSgpO1xyXG4gIH1cclxuICBoYW5kbGVTY3JvbGxFdmVudChzY3JvbGxMZWZ0OiBudW1iZXIsIHNjcm9sbFRvcDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2Nyb2xsZXIuaGFuZGxlU2Nyb2xsKHNjcm9sbExlZnQsIHNjcm9sbFRvcCk7XHJcbiAgfVxyXG4gIGdldFBhcnRNYXAoKTogeyBrZXlzOiBudW1iZXJbXSwgcGFydE1hcDogUmVjb3JkPG51bWJlciwgU21vUGFydEluZm8+IH0ge1xyXG4gICAgbGV0IGtlZXBOZXh0ID0gZmFsc2U7XHJcbiAgICBsZXQgcGFydENvdW50ID0gMDtcclxuICAgIGxldCBwYXJ0TWFwOiBSZWNvcmQ8bnVtYmVyLCBTbW9QYXJ0SW5mbz4gPSB7fTtcclxuICAgIGNvbnN0IGtleXM6IG51bWJlcltdID0gW107XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcnRJbmZvID0gc3RhZmYucGFydEluZm87XHJcbiAgICAgIHBhcnRJbmZvLmFzc29jaWF0ZWRTdGFmZiA9IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgIGlmICgha2VlcE5leHQpIHtcclxuICAgICAgICBwYXJ0TWFwW3BhcnRDb3VudF0gPSBwYXJ0SW5mbztcclxuICAgICAgICBrZXlzLnB1c2gocGFydENvdW50KTtcclxuICAgICAgICBwYXJ0Q291bnQgKz0gMTtcclxuICAgICAgICBpZiAocGFydEluZm8uc3RhdmVzQWZ0ZXIgPiAwKSB7XHJcbiAgICAgICAgICBrZWVwTmV4dCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGtlZXBOZXh0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsga2V5cywgcGFydE1hcCB9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbnkgbWV0aG9kIHRoYXQgbW9kaWZpZXMgYSBzZXQgb2Ygc2VsZWN0aW9ucyBjYW4gY2FsbCB0aGlzIHRvIHVwZGF0ZSBcclxuICAgKiB0aGUgc2NvcmUgdmlldyBhbmQgdGhlIGJhY2tpbmcgc2NvcmUuXHJcbiAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcsIGFjdG9yOiB1cGRhdGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnModGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsKTtcclxuICAgIGFjdG9yKHRoaXMuc2NvcmUsIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKSk7XHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW55IG1ldGhvZCB0aGF0IG1vZGlmaWVzIGEgc2V0IG9mIHNlbGVjdGlvbnMgY2FuIGNhbGwgdGhpcyB0byB1cGRhdGUgXHJcbiAgICogdGhlIHNjb3JlIHZpZXcgYW5kIHRoZSBiYWNraW5nIHNjb3JlLlxyXG4gICAqIEBwYXJhbSBhY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKi9cclxuICBhc3luYyBtb2RpZnlTZWxlY3Rpb24obGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGFjdG9yOiB1cGRhdGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMobGFiZWwpO1xyXG4gICAgYWN0b3IodGhpcy5zY29yZSwgW3NlbGVjdGlvbl0pO1xyXG4gICAgaWYgKGFsdFNlbGVjdGlvbikge1xyXG4gICAgICBhY3Rvcih0aGlzLnN0b3JlU2NvcmUsIFthbHRTZWxlY3Rpb25dKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QoW3NlbGVjdGlvbl0pKTtcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAgIC8qKlxyXG4gICAqIEFueSBtZXRob2QgdGhhdCBtb2RpZmllcyBhIHNldCBvZiBzZWxlY3Rpb25zIGNhbiBjYWxsIHRoaXMgdG8gdXBkYXRlIFxyXG4gICAqIHRoZSBzY29yZSB2aWV3IGFuZCB0aGUgYmFja2luZyBzY29yZS5cclxuICAgKiBAcGFyYW0gYWN0b3IgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgICBhc3luYyBtb2RpZnlTZWxlY3Rpb25Ob1dhaXQobGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGFjdG9yOiB1cGRhdGVTaW5nbGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsKTtcclxuICAgICAgYWN0b3IodGhpcy5zY29yZSwgc2VsZWN0aW9uKTtcclxuICAgICAgaWYgKGFsdFNlbGVjdGlvbikge1xyXG4gICAgICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KFtzZWxlY3Rpb25dKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmaXkgYSBzZXQgb2YgY29sdW1ucywgZS5nLiB0ZW1wbywgdGltZSwga2V5LiAgVGhpcyBoYXMgZGlmZmVyZW50IHVuZG8gYmVoYXZpb3IsIGRvbid0IFxyXG4gICAgICogcGVuZCBvbiB0aGUgcmVzdWx0IGJlY2F1c2UgdGhlcmUgbWF5IGJlIGEgY29tYmluYXRpb24gb2Ygb3BlcmF0aW9ucy5cclxuICAgICAqIEBwYXJhbSBsYWJlbCBcclxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAgICovXHJcbiAgICBtb2RpZnlDb2x1bW5zU2VsZWN0aW9uc05vV2FpdChsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSwgYWN0b3I6IHVwZGF0ZVNpbmdsZVNlbGVjdGlvbkZ1bmMpIHtcclxuICAgICAgdGhpcy51bmRvQ29sdW1uUmFuZ2UobGFiZWwsIHNlbGVjdGlvbnMpO1xyXG4gICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgICBhY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rpb24pO1xyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24pIHtcclxuICAgICAgICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9uKTtcclxuICAgICAgICB9ICBcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhzZWxlY3Rpb25zKTtcclxuICAgIH1cclxuICAvKipcclxuICAgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBTbW9vc2ljIGRlbW9zIGFuZCBwZW5zLlxyXG4gICAqIEBwYXJhbSBhY3Rpb24gYW55IGFjdGlvbiwgYnV0IG1vc3QgdXNlZnVsbHkgYSBTdWlTY29yZVZpZXcgbWV0aG9kXHJcbiAgICogQHBhcmFtIHJlcGV0aXRpb24gbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCwgd2FpdGluZyBvbiByZW5kZXIgcHJvbWlzZSBiZXR3ZWVuXHJcbiAgICogaWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gMVxyXG4gICAqIEByZXR1cm5zIHByb21pc2UsIHJlc29sdmVkIGFjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIHNjb3JlIGlzIHVwZGF0ZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgd2FpdGFibGVBY3Rpb24oYWN0aW9uOiAoKSA9PiB2b2lkLCByZXBldGl0aW9uPzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXAgPSByZXBldGl0aW9uID8/IDE7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZjID0gYXN5bmMgKGNvdW50OiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBhY3Rpb24oKTtcclxuICAgICAgICAgIGF3YWl0IHNlbGYucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gICAgICAgICAgZmMoY291bnQgLSAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZmMocmVwKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGx1cmFsIGZvcm0gb2YgX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25cclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10pOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBydjogU21vU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgaWYgKHNlbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJ2LnB1c2goc2VsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8vIEdldCBhIGxvbmcgZW5vdWdoIGxpc3Qgb2YgbWVhc3VyZXMgdG8gcGFzdGUgaW50b1xyXG4gIGdldFBhc3RlTWVhc3VyZUxpc3QoKSB7XHJcbiAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwYXN0ZSBidWZmZXIsIGluIHRpY2tzXHJcbiAgICBjb25zdCB0aWNrc1RvUGFzdGUgPSB0aGlzLnN0b3JlUGFzdGUuZ2V0Q29weUJ1ZmZlclRpY2tDb3VudCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IHRtID0gc2VsZWN0aW9uc1swXS5tZWFzdXJlLnRpY2ttYXBGb3JWb2ljZShzZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnZvaWNlKTtcclxuICAgIC8vIFRoZSBsYXN0IG1lYXN1cmUgc2VsZWN0ZWRcclxuICAgIGNvbnN0IGxhc3RTZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1t0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGggLSAxXTtcclxuICAgIC8vIGxlbmd0aCBvZiBmaXJzdCBzZWxlY3RlZCBtZWFzdXJlLCBpbiB0aWNrc1xyXG4gICAgY29uc3QgbWVhc3VyZVRpY2tzID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5nZXRUaWNrc0Zyb21Wb2ljZSh0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXS5zZWxlY3Rvci52b2ljZSk7XHJcbiAgICAvLyByZW1haW5pbmcgdGlja3MgYWZ0ZXIgZmlyc3Qgc2VsZWN0aW9uLiAgVGhpcyBpcyBvdXIgc3RhcnRpbmcgcG9pbnQuXHJcbiAgICBsZXQgc3RhcnRUaWNrID0gbWVhc3VyZVRpY2tzIC0gdG0uZHVyYXRpb25NYXBbdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IudGlja107XHJcbiAgICAvLyBBZGQgdGlja3MgZm9yIGFsbCByZW1haW5pbmcgbWVhc3VyZXNcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzZWwgPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBzdGFydFRpY2sgKz0gc2VsLm1lYXN1cmUuZ2V0VGlja3NGcm9tVm9pY2UoMCk7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB3ZSBhcmUgc2hvcnQsIGFuZCB0aGVyZSBhcmUgbWVhc3VyZXMgbGVmdCwgYWRkIHRoZW0gdG8gdGhlIHNlbGVjdGlvbiBsaXN0XHJcbiAgICBpZiAoc3RhcnRUaWNrIDwgdGlja3NUb1Bhc3RlICYmIGxhc3RTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSA8ICh0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGggKyAxKSkge1xyXG4gICAgICBjb25zdCBuZXdTZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCBzZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnN0YWZmLCBsYXN0U2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUgKyAxKTtcclxuICAgICAgaWYgKG5ld1NlbCkge1xyXG4gICAgICAgIHNlbGVjdGlvbnMucHVzaChuZXdTZWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsZWN0aW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBzdGFmZiBtb2RpZmllciBoYXMgY2hhbmdlZCwgY3JlYXRlIHVuZG8gb3BlcmF0aW9ucyBmb3IgdGhlIG1lYXN1cmVzIGFmZmVjdGVkXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzdGFmZk1vZGlmaWVyIFxyXG4gICAqIEBwYXJhbSBzdWJ0eXBlIFxyXG4gICAqL1xyXG4gIHVuZG9TdGFmZk1vZGlmaWVyKGxhYmVsOiBzdHJpbmcsIHN0YWZmTW9kaWZpZXI6IFN0YWZmTW9kaWZpZXJCYXNlLCBzdWJ0eXBlOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvcHkgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShzdGFmZk1vZGlmaWVyLnNlcmlhbGl6ZSgpKTtcclxuICAgIGNvcHkuc3RhcnRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rvcihjb3B5LnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29weS5lbmRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rvcihjb3B5LmVuZFNlbGVjdG9yKTtcclxuICAgIGNvbnN0IGNvcHlTZXIgPSBjb3B5LnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gQ29weSBJRCBzbyB3ZSBjYW4gdW5kbyBwcm9wZXJseVxyXG4gICAgY29weVNlci5hdHRycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3RhZmZNb2RpZmllci5hdHRycykpO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNUQUZGX01PRElGSUVSLCBTbW9TZWxlY3Rvci5kZWZhdWx0LFxyXG4gICAgICBjb3B5U2VyLCBzdWJ0eXBlKTtcclxuICB9XHJcbiAgLyoqIFxyXG4gICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHBhZ2UgdGhhdCBpcyBpbiB0aGUgY2VudGVyIG9mIHRoZSBjbGllbnQgc2NyZWVuLlxyXG4gICAqL1xyXG4gIGdldEZvY3VzZWRQYWdlKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxBdmcgPSB0aGlzLnRyYWNrZXIuc2Nyb2xsZXIubmV0U2Nyb2xsLnkgKyAodGhpcy50cmFja2VyLnNjcm9sbGVyLnZpZXdwb3J0LmhlaWdodCAvIDIpO1xyXG4gICAgY29uc3QgbWlkWSA9IHNjcm9sbEF2ZztcclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXIgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIuZ2V0R2xvYmFsTGF5b3V0KCk7XHJcbiAgICBjb25zdCBsaCA9IGxheW91dE1hbmFnZXIucGFnZUhlaWdodCAvIGxheW91dE1hbmFnZXIuc3ZnU2NhbGU7XHJcbiAgICBjb25zdCBsdyA9IGxheW91dE1hbmFnZXIucGFnZVdpZHRoIC8gbGF5b3V0TWFuYWdlci5zdmdTY2FsZTtcclxuICAgIGNvbnN0IHB0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLnN2Z1RvQ2xpZW50KFN2Z0hlbHBlcnMuc21vQm94KHsgeDogbHcsIHk6IGxoIH0pKTtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKG1pZFkgLyBwdC55KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgcmVjdGFuZ2xlIHVuZG8sIGxpa2UgYSBtdWx0aXBsZSBjb2x1bW5zIGJ1dCBub3QgbmVjZXNzYXJpbHkgdGhlIHdob2xlXHJcbiAgICogc2NvcmUuXHJcbiAgICovXHJcbiAgX3VuZG9Db2x1bW4obGFiZWw6IHN0cmluZywgbWVhc3VyZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5DT0xVTU4sIFNtb1NlbGVjdG9yLmRlZmF1bHQsXHJcbiAgICAgIHsgc2NvcmU6IHRoaXMuc3RvcmVTY29yZSwgbWVhc3VyZUluZGV4IH0sIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNjb3JlIHByZWZlcmVuY2VzIGRvbid0IGFmZmVjdCB0aGUgZGlzcGxheSwgYnV0IHRoZXkgZG8gaGF2ZSBhbiB1bmRvXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqL1xyXG4gIF91bmRvU2NvcmVQcmVmZXJlbmNlcyhsYWJlbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkVfQVRUUklCVVRFUywgU21vU2VsZWN0b3IuZGVmYXVsdCwgdGhpcy5zdG9yZVNjb3JlLCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gIH1cclxuICB1bmRvQ29sdW1uUmFuZ2UobGFiZWw6IHN0cmluZywgbWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBjb25zdCBjaGVja2VkOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiA9IHt9O1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAoIWNoZWNrZWRbbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlXSkge1xyXG4gICAgICAgIGNoZWNrZWRbbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHVuZG9NZWFzdXJlUmFuZ2UobGFiZWw6IHN0cmluZywgbWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtZWFzdXJlU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtZWFzdXJlU2VsZWN0aW9uKTtcclxuICAgICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWVhc3VyZVNlbGVjdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCB0byB0aGUgdW5kbyBidWZmZXIgdGhlIGN1cnJlbnQgc2V0IG9mIG1lYXN1cmVzIHNlbGVjdGVkLlxyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICB1bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy51bmRvTWVhc3VyZVJhbmdlKGxhYmVsLCBtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIG9wZXJhdGlvbiB0aGF0IG9ubHkgYWZmZWN0cyB0aGUgZmlyc3Qgc2VsZWN0aW9uLiAgU2V0dXAgdW5kbyBmb3IgdGhlIG1lYXN1cmVcclxuICAgKi9cclxuICBfdW5kb0ZpcnN0TWVhc3VyZVNlbGVjdGlvbihsYWJlbDogc3RyaW5nKTogU21vU2VsZWN0aW9uIHtcclxuICAgIGNvbnN0IHNlbCA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICBpZiAoZXF1aXYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgdGhlIHNlbGVjdGlvbiB0byB0aGUgdW5kbyBidWZmZXJcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKi9cclxuICBfdW5kb1NlbGVjdGlvbihsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbikge1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBpZiAoZXF1aXYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuTUVBU1VSRSwgZXF1aXYuc2VsZWN0b3IsIGVxdWl2Lm1lYXN1cmUsXHJcbiAgICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIG11bHRpcGxlIHNlbGVjdGlvbnMgdG8gdGhlIHVuZG8gYnVmZmVyIGFzIGEgZ3JvdXBcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgX3VuZG9TZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcsIHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLl91bmRvU2VsZWN0aW9uKGxhYmVsLCBzZWxlY3Rpb24pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIFVwZGF0ZSByZW5kZXJlciBmb3IgbWVhc3VyZXMgdGhhdCBoYXZlIGNoYW5nZWRcclxuICAqL1xyXG4gIF9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobWVhc3VyZVNlbGVjdGlvbnMpKSB7XHJcbiAgICAgIG1lYXN1cmVTZWxlY3Rpb25zID0gW21lYXN1cmVTZWxlY3Rpb25zXTtcclxuICAgIH1cclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG1lYXN1cmVTZWxlY3Rpb24pID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShtZWFzdXJlU2VsZWN0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgcmVuZGVyZXIgZm9yIHNvbWUgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBmcm9tU2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIHRvU2VsZWN0b3IgXHJcbiAgICovXHJcbiAgX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3I6IFNtb1NlbGVjdG9yLCB0b1NlbGVjdG9yOiBTbW9TZWxlY3Rvcikge1xyXG4gICAgdGhpcy5fZ2V0UmVjdGFuZ2xlU2VsZWN0aW9ucyhmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpLmZvckVhY2goKHMpID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdW5kbyBmb3Igb3BlcmF0aW9uIHRoYXQgYWZmZWN0cyB0aGUgd2hvbGUgc2NvcmVcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICovXHJcbiAgX3VuZG9TY29yZShsYWJlbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkUsIFNtb1NlbGVjdG9yLmRlZmF1bHQsIHRoaXMuc3RvcmVTY29yZSxcclxuICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzZWxlY3RvciBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3RvciBmcm9tIHRoaXMuc2NvcmVcclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgX2dldEVxdWl2YWxlbnRTZWxlY3RvcihzZWxlY3RvcjogU21vU2VsZWN0b3IpIHtcclxuICAgIGNvbnN0IHJ2ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3RvcikpO1xyXG4gICAgcnYuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHN0YWZmIGlkIGZyb20gdGhpcy5zdG9yZVNjb3JlIHRoYXQgbWFwcyB0byB0aGUgZGlzcGxheWVkIHNlbGVjdG9yIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzdGFmZklkIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRFcXVpdmFsZW50U3RhZmYoc3RhZmZJZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZk1hcFtzdGFmZklkXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHNlbGVjdGlvbiBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3Rpb24gZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pOiBTbW9TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0eXBlb2YgKHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCB0aGlzLnN0YWZmTWFwW3NlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZl0sIHNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIChzZWxlY3Rpb24uc2VsZWN0b3IucGl0Y2hlcykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIFNtb1NlbGVjdGlvbi5ub3RlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgc2VsZWN0aW9uLnNlbGVjdG9yLnZvaWNlLFxyXG4gICAgICAgICAgc2VsZWN0aW9uLnNlbGVjdG9yLnRpY2spO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBTbW9TZWxlY3Rpb24ucGl0Y2hTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCB0aGlzLnN0YWZmTWFwW3NlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZl0sIHNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlLCBzZWxlY3Rpb24uc2VsZWN0b3Iudm9pY2UsXHJcbiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdG9yLnRpY2ssIHNlbGVjdGlvbi5zZWxlY3Rvci5waXRjaGVzKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihleCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHNlbGVjdGlvbiBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3Rpb24gZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGduOiBTbW9HcmFjZU5vdGUpOiBTbW9HcmFjZU5vdGUge1xyXG4gICAgaWYgKHNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHJ2ID0gc2VsZWN0aW9uLm5vdGUuZ2V0R3JhY2VOb3RlcygpLmZpbmQoKGdnKSA9PiBnZy5hdHRycy5pZCA9PT0gZ24uYXR0cnMuaWQpO1xyXG4gICAgICBpZiAocnYpIHtcclxuICAgICAgICByZXR1cm4gcnY7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBnbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSByZWN0YW5nbGUgb2Ygc2VsZWN0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2NvcmVcclxuICAgKiBAcGFyYW0gc3RhcnRTZWxlY3RvciBcclxuICAgKiBAcGFyYW0gZW5kU2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIHNjb3JlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRSZWN0YW5nbGVTZWxlY3Rpb25zKHN0YXJ0U2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBlbmRTZWxlY3RvcjogU21vU2VsZWN0b3IpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBydjogU21vU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGZvciAoaSA9IHN0YXJ0U2VsZWN0b3Iuc3RhZmY7IGkgPD0gZW5kU2VsZWN0b3Iuc3RhZmY7IGkrKykge1xyXG4gICAgICBmb3IgKGogPSBzdGFydFNlbGVjdG9yLm1lYXN1cmU7IGogPD0gZW5kU2VsZWN0b3IubWVhc3VyZTsgaisrKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgaSwgaik7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcnYucHVzaCh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBzZXQgdGhlIGdyb3VwaW5nIGZsYWcgZm9yIHVuZG8gb3BlcmF0aW9uc1xyXG4gICAqIEBwYXJhbSB2YWwgXHJcbiAgICovXHJcbiAgZ3JvdXBVbmRvKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFsbCBzdGF2ZXMsIDE6MSBtYXBwaW5nIG9mIHZpZXcgc2NvcmUgc3RhZmYgdG8gc3RvcmVkIHNjb3JlIHN0YWZmXHJcbiAgICovXHJcbiAgZ2V0IGRlZmF1bHRTdGFmZk1hcCgpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBydjogbnVtYmVyW10gPSBbXTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHJ2LnB1c2goaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEJvb3RzdHJhcHBpbmcgZnVuY3Rpb24sIGNyZWF0ZXMgdGhlIHJlbmRlcmVyIGFuZCBhc3NvY2lhdGVkIHRpbWVyc1xyXG4gICAqL1xyXG4gIHN0YXJ0UmVuZGVyaW5nRW5naW5lKCkge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyLnNjb3JlKSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcnQsIGRpc3BsYXkgdGhlIHBhcnQuXHJcbiAgICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgICAgdGhpcy5leHBvc2VQYXJ0KHRoaXMuc2NvcmUuc3RhdmVzWzBdKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBJZiB0aGUgc2NvcmUgaXMgdHJhbnNwb3NpbmcsIGhpZGUgdGhlIGluc3RydW1lbnQgeHBvc2Ugc2V0dGluZ3NcclxuICAgICAgdGhpcy5fc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IHRoaXMuc2NvcmU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc3RhcnREZW1vbigpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgZGlzcGxheWVkIHN0YXZlcyB0byBzY29yZSBzdGF2ZXMgKHRoaXMuc3RvcmVTY29yZSlcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRWaWV3KCk6IFZpZXdNYXBFbnRyeVtdIHtcclxuICAgIGNvbnN0IHJ2ID0gW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzaG93ID0gdGhpcy5zdGFmZk1hcC5pbmRleE9mKGkpID49IDA7XHJcbiAgICAgIHJ2LnB1c2goeyBzaG93IH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHN0YWZmIElEIHdoZW4gdGhlIHZpZXcgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHNldE1hcHBlZFN0YWZmSWRzKCkge1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmRpc3BsYXlDdWVzID0gc3RhZmYucGFydEluZm8uY3VlSW5TY29yZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHN0YWZmLnNldE1hcHBlZFN0YWZmSWQodGhpcy5zdGFmZk1hcFtzdGFmZi5zdGFmZklkXSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmVzZXRQYXJ0VmlldygpIHtcclxuICAgIGlmICh0aGlzLnN0YWZmTWFwLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBjb25zdCBzdGFmZiA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5zdGFmZk1hcFswXV07XHJcbiAgICAgIHRoaXMuZXhwb3NlUGFydChzdGFmZik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEV4cG9zZXMgYSBwYXJ0OiAgaGlkZXMgbm9uLXBhcnQgc3RhdmVzLCBzaG93cyBwYXJ0IHN0YXZlcy5cclxuICAgKiBOb3RlIHRoaXMgd2lsbCByZXNldCB0aGUgdmlldy4gIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCBzdGFmZiAwIHdpbGxcclxuICAgKiBiZSB0aGUgc2VsZWN0ZWQgcGFydC5cclxuICAgKiBAcGFyYW0gc3RhZmYgXHJcbiAgICovXHJcbiAgZXhwb3NlUGFydChzdGFmZjogU21vU3lzdGVtU3RhZmYpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGV4cG9zZU1hcDogVmlld01hcEVudHJ5W10gPSBbXTtcclxuICAgIGxldCBwdXNoTmV4dCA9IGZhbHNlO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdFMgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW2ldO1xyXG4gICAgICBjb25zdCBzaG93ID0gdFMuc3RhZmZJZCA9PT0gc3RhZmYuc3RhZmZJZDtcclxuICAgICAgaWYgKHB1c2hOZXh0KSB7XHJcbiAgICAgICAgZXhwb3NlTWFwLnB1c2goeyBzaG93OiB0cnVlIH0pO1xyXG4gICAgICAgIHB1c2hOZXh0ID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSAge1xyXG4gICAgICAgIGV4cG9zZU1hcC5wdXNoKHsgc2hvdyB9KTtcclxuICAgICAgICBpZiAodFMucGFydEluZm8uc3RhdmVzQWZ0ZXIgPiAwICYmIHNob3cpIHtcclxuICAgICAgICAgIHB1c2hOZXh0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2V0VmlldyhleHBvc2VNYXApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHNjb3JlIGlzIGRpc3BsYXlpbmcgaW4gcGFydC1tb2RlIHZzLiBzY29yZSBtb2RlLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGlzUGFydEV4cG9zZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29yZS5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBhcnRzIGhhdmUgZGlmZmVyZW50IGZvcm1hdHRpbmcgb3B0aW9ucyBmcm9tIHRoZSBwYXJlbnQgc2NvcmUsIGluZGx1ZGluZyBsYXlvdXQuICBSZXNldFxyXG4gICAqIHRoZW0gd2hlbiBleHBvc2luZyBhIHBhcnQuXHJcbiAgICovXHJcbiAgX21hcFBhcnRGb3JtYXR0aW5nKCkge1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8ubGF5b3V0TWFuYWdlcjtcclxuICAgIGxldCByZXBsYWNlZFRleHQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnVwZGF0ZU1lYXN1cmVGb3JtYXRzRm9yUGFydCgpO1xyXG4gICAgICBpZiAoc3RhZmYucGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzICYmICFyZXBsYWNlZFRleHQpIHtcclxuICAgICAgICBjb25zdCB0Z2E6IFNtb1RleHRHcm91cFtdID0gW107XHJcbiAgICAgICAgcmVwbGFjZWRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby50ZXh0R3JvdXBzLmZvckVhY2goKHRnKSA9PiB7XHJcbiAgICAgICAgICB0Z2EucHVzaCh0Zyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zY29yZS50ZXh0R3JvdXBzID0gdGdhO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBsaXN0IG9mIHN0YXZlcyBpbiB0aGUgc2NvcmUgdGhhdCBhcmUgZGlzcGxheWVkLlxyXG4gICovXHJcbiAgc2V0Vmlldyhyb3dzOiBWaWV3TWFwRW50cnlbXSkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgYW55ID0gcm93cy5maW5kKChyb3cpID0+IHJvdy5zaG93ID09PSB0cnVlKTtcclxuICAgIGlmICghYW55KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5zY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVTY29yZS5zZXJpYWxpemUoXHJcbiAgICAgIHsgc2tpcFN0YXZlczogdHJ1ZSwgdXNlRGljdGlvbmFyeTogZmFsc2UsIHByZXNlcnZlU3RhZmZJZHM6IGZhbHNlIH0pKSk7XHJcbiAgICBjb25zdCBzdGFmZk1hcCA9IFtdO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcclxuICAgICAgaWYgKHJvdy5zaG93KSB7XHJcbiAgICAgICAgY29uc3Qgc3JjU3RhdmUgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW2ldO1xyXG4gICAgICAgIGNvbnN0IGpzb25PYmogPSBzcmNTdGF2ZS5zZXJpYWxpemUoeyBza2lwTWFwczogZmFsc2UsIHByZXNlcnZlSWRzOiB0cnVlIH0pO1xyXG4gICAgICAgIGpzb25PYmouc3RhZmZJZCA9IHN0YWZmTWFwLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuU3RhdmUgPSBTbW9TeXN0ZW1TdGFmZi5kZXNlcmlhbGl6ZShqc29uT2JqKTtcclxuICAgICAgICBuU3RhdmUubWFwU3RhZmZGcm9tVG8oaSwgbnNjb3JlLnN0YXZlcy5sZW5ndGgpO1xyXG4gICAgICAgIG5zY29yZS5zdGF2ZXMucHVzaChuU3RhdmUpO1xyXG4gICAgICAgIGlmIChzcmNTdGF2ZS5rZXlTaWduYXR1cmVNYXApIHtcclxuICAgICAgICAgIG5TdGF2ZS5rZXlTaWduYXR1cmVNYXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNyY1N0YXZlLmtleVNpZ25hdHVyZU1hcCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuU3RhdmUubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZTogU21vTWVhc3VyZSwgaXgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNyY01lYXN1cmUgPSBzcmNTdGF2ZS5tZWFzdXJlc1tpeF07XHJcbiAgICAgICAgICBtZWFzdXJlLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChzcmNNZWFzdXJlLnRlbXBvLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICAgIG1lYXN1cmUudGltZVNpZ25hdHVyZSA9IG5ldyBUaW1lU2lnbmF0dXJlKHNyY01lYXN1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICAgICAgICBtZWFzdXJlLmtleVNpZ25hdHVyZSA9IHNyY01lYXN1cmUua2V5U2lnbmF0dXJlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHN0YWZmTWFwLnB1c2goaSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG5zY29yZS5udW1iZXJTdGF2ZXMoKTtcclxuICAgIHRoaXMuc3RhZmZNYXAgPSBzdGFmZk1hcDtcclxuICAgIHRoaXMuc2NvcmUgPSBuc2NvcmU7XHJcbiAgICAvLyBJbmRpY2F0ZSB3aGljaCBzY29yZSBzdGFmZiB2aWV3IHN0YXZlcyBhcmUgbWFwcGVkIHRvLCB0byBkZWNpZGUgdG8gZGlzcGxheVxyXG4gICAgLy8gbW9kaWZpZXJzLlxyXG4gICAgdGhpcy5zZXRNYXBwZWRTdGFmZklkcygpO1xyXG4gICAgLy8gVE9ETzogYWRkIHBhcnQtc3BlY2lmaWMgbWVhc3VyZSBmb3JtYXR0aW5nLCBldGMuXHJcbiAgICB0aGlzLl9zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IG5zY29yZTtcclxuICAgIC8vIElmIHRoaXMgY3VycmVudCB2aWV3IGlzIGEgcGFydCwgc2hvdyB0aGUgcGFydCBsYXlvdXRcclxuICAgIGlmICh0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICB0aGlzLl9tYXBQYXJ0Rm9ybWF0dGluZygpOyAgICAgIFxyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmRpc3BsYXlDdWVzID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uY29tcHV0ZU11bHRpcGFydFJlc3QobnNjb3JlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBzdGFmZi5wYXJ0SW5mby5jdWVJblNjb3JlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChzY29yZUNoYW5nZUV2ZW50LCB7IGRldGFpbDogeyB2aWV3OiB0aGlzIH0gfSkpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRWaWV3cG9ydCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB2aWV3IGFsbCB0aGUgc3RhZmZzIGluIHNjb3JlIG1vZGUuXHJcbiAgICovXHJcbiAgdmlld0FsbCgpIHtcclxuICAgIHRoaXMuc2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnNlcmlhbGl6ZSh7IHNraXBTdGF2ZXM6IGZhbHNlLCB1c2VEaWN0aW9uYXJ5OiBmYWxzZSwgcHJlc2VydmVTdGFmZklkczogdHJ1ZSB9KSkpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHRoaXMuZGVmYXVsdFN0YWZmTWFwO1xyXG4gICAgdGhpcy5zZXRNYXBwZWRTdGFmZklkcygpO1xyXG4gICAgdGhpcy5fc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2NvcmUgPSB0aGlzLnNjb3JlO1xyXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHNjb3JlQ2hhbmdlRXZlbnQsIHsgZGV0YWlsOiB7IHZpZXc6IHRoaXMgfSB9KSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBzY29yZSBiYXNlZCBvbiB0cmFuc3Bvc2luZyBmbGFnLlxyXG4gICAqL1xyXG4gIF9zZXRUcmFuc3Bvc2luZygpIHtcclxuICAgIGlmICghdGhpcy5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgY29uc3QgeHBvc2UgPSB0aGlzLnNjb3JlLnByZWZlcmVuY2VzPy50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gICAgICBpZiAoeHBvc2UpIHtcclxuICAgICAgICB0aGlzLnNjb3JlLnNldFRyYW5zcG9zaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgdmlldyBhZnRlciBsb2FkaW5nIG9yIHJlc3RvcmluZyBhIGNvbXBsZXRlbHkgbmV3IHNjb3JlXHJcbiAgICogQHBhcmFtIHNjb3JlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGNoYW5nZVNjb3JlKHNjb3JlOiBTbW9TY29yZSkge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8ucmVzZXQoKTtcclxuICAgIFN1aUF1ZGlvUGxheWVyLnN0b3BQbGF5ZXIoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2NvcmUgPSBzY29yZTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICBzY29yZS5zZXJpYWxpemUoeyBza2lwU3RhdmVzOiBmYWxzZSwgdXNlRGljdGlvbmFyeTogZmFsc2UsIHByZXNlcnZlU3RhZmZJZHM6IHRydWUgfSkpKTtcclxuICAgIHRoaXMuc2NvcmUgPSBzY29yZTtcclxuICAgIC8vIElmIHRoZSBzY29yZSBpcyBub24tdHJhbnNwb3NpbmcsIGhpZGUgdGhlIGluc3RydW1lbnQgeHBvc2Ugc2V0dGluZ3NcclxuICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICB0aGlzLnN0YWZmTWFwID0gdGhpcy5kZWZhdWx0U3RhZmZNYXA7XHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICB0aGlzLnNjb3JlLnN5bmNocm9uaXplVGV4dEdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcyk7XHJcbiAgICBpZiAodGhpcy5zdG9yZVNjb3JlLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICB0aGlzLmV4cG9zZVBhcnQodGhpcy5zY29yZS5zdGF2ZXNbMF0pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcnYgPSBhd2FpdCB0aGlzLmF3YWl0UmVuZGVyKCk7XHJcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoc2NvcmVDaGFuZ2VFdmVudCwgeyBkZXRhaWw6IHsgdmlldzogdGhpcyB9IH0pKTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgcmVwbGFjZU1lYXN1cmVWaWV3KG1lYXN1cmVSYW5nZTogbnVtYmVyW10pIHtcclxuICAgIGZvciAobGV0IGkgPSBtZWFzdXJlUmFuZ2VbMF07IGkgPD0gbWVhc3VyZVJhbmdlWzFdOyArK2kpIHtcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICBjb25zdCBzdGFmZklkID0gc3RhZmYuc3RhZmZJZDtcclxuICAgICAgICBjb25zdCBhbHRTdGFmZiA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5fZ2V0RXF1aXZhbGVudFN0YWZmKHN0YWZmSWQpXTtcclxuICAgICAgICBpZiAoYWx0U3RhZmYpIHtcclxuICAgICAgICAgIHN0YWZmLnN5bmNTdGFmZk1vZGlmaWVycyhpLCBhbHRTdGFmZik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCBhIGNvcHkgb2YgdGhlIGJhY2tpbmcgc2NvcmUsIGFuZCBtYXAgaXQgdG8gdGhlIHNjb3JlIHN0YXZlLiAgdGhpcy5zY29yZSBtYXkgaGF2ZSBmZXdlciBzdGF2ZXNcclxuICAgICAgICAvLyB0aGFuIHRoaXMuc3RvcmVTY29yZVxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3RhZmYubWVhc3VyZXNbaV0uc3ZnKSk7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFVuZG9CdWZmZXIuc2VyaWFsaXplTWVhc3VyZSh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbc3RhZmZJZF1dLm1lYXN1cmVzW2ldKTtcclxuICAgICAgICBzZXJpYWxpemVkLm1lYXN1cmVOdW1iZXIuc3RhZmZJZCA9IHN0YWZmSWQ7XHJcbiAgICAgICAgY29uc3QgeHBvc2UgPSBzZXJpYWxpemVkLnRyYW5zcG9zZUluZGV4ID8/IDA7XHJcbiAgICAgICAgY29uc3QgY29uY2VydEtleSA9IFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQoc2VyaWFsaXplZC5rZXlTaWduYXR1cmUgPz8gJ2MnLCAtMSAqIHhwb3NlKTtcclxuICAgICAgICBzZXJpYWxpemVkLmtleVNpZ25hdHVyZSA9IGNvbmNlcnRLZXk7XHJcbiAgICAgICAgY29uc3Qgcm1lYXN1cmUgPSBTbW9NZWFzdXJlLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWQpO1xyXG4gICAgICAgIHJtZWFzdXJlLnN2ZyA9IHN2ZztcclxuICAgICAgICBjb25zdCBzZWxlY3RvcjogU21vU2VsZWN0b3IgPSB7IHN0YWZmOiBzdGFmZklkLCBtZWFzdXJlOiBpLCB2b2ljZTogMCwgdGljazogMCwgcGl0Y2hlczogW10gfTtcclxuICAgICAgICB0aGlzLnNjb3JlLnJlcGxhY2VNZWFzdXJlKHNlbGVjdG9yLCBybWVhc3VyZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENvbHVtblRvUmVwbGFjZVF1ZXVlKGkpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBmb3IgdGhlIHZpZXcgc2NvcmUsIHRoZSByZW5kZXJlciBkZWNpZGVzIHdoYXQgdG8gcmVuZGVyXHJcbiAgICogZGVwZW5kaW5nIG9uIHdoYXQgaXMgdW5kb25lLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVuZG8oKSB7XHJcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIuc2NvcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoIXRoaXMuc3RvcmVVbmRvLmJ1ZmZlcnNBdmFpbGFibGUoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdGFmZk1hcDogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xyXG4gICAgY29uc3QgaWRlbnRpdHlNYXA6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTtcclxuICAgIHRoaXMuZGVmYXVsdFN0YWZmTWFwLmZvckVhY2goKG5uKSA9PiBpZGVudGl0eU1hcFtubl0gPSBubik7XHJcbiAgICB0aGlzLnN0YWZmTWFwLmZvckVhY2goKG1tLCBpeCkgPT4gc3RhZmZNYXBbbW1dID0gaXgpO1xyXG4gICAgLy8gQSBzY29yZS1sZXZlbCB1bmRvIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgc2NvcmUuXHJcbiAgICBjb25zdCBmdWxsU2NvcmUgPSB0aGlzLnN0b3JlVW5kby51bmRvU2NvcmVQZWVrKCk7XHJcbiAgICAvLyB0ZXh0IHVuZG8gaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBzaW5jZSB0aGVyZSBpcyB1c3VhbGx5IG5vdFxyXG4gICAgLy8gYW4gYXNzb2NpYXRlZCBtZWFzdXJlLlxyXG4gICAgY29uc3Qgc2NvcmVUZXh0ID0gdGhpcy5zdG9yZVVuZG8udW5kb1Njb3JlVGV4dEdyb3VwUGVlaygpO1xyXG4gICAgY29uc3QgcGFydFRleHQgPSB0aGlzLnN0b3JlVW5kby51bmRvUGFydFRleHRHcm91cFBlZWsoKTtcclxuICAgIGlmIChzY29yZVRleHQgfHwgcGFydFRleHQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJlci51bnJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1lYXN1cmVSYW5nZSA9IHRoaXMuc3RvcmVVbmRvLmdldE1lYXN1cmVSYW5nZSgpO1xyXG4gICAgaWYgKCEoZnVsbFNjb3JlIHx8IHNjb3JlVGV4dCB8fCBwYXJ0VGV4dCkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJDb2x1bW4odGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSB0aGlzLnN0b3JlVW5kby51bmRvKHRoaXMuc3RvcmVTY29yZSwgaWRlbnRpdHlNYXAsIHRydWUpO1xyXG4gICAgaWYgKGZ1bGxTY29yZSkge1xyXG4gICAgICB0aGlzLnZpZXdBbGwoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICB9IGVsc2UgaWYgKHBhcnRUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2V0Vmlldyh0aGlzLmdldFZpZXcoKSk7XHJcbiAgICB9IGVsc2UgaWYgKHNjb3JlVGV4dCkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN5bmNocm9uaXplVGV4dEdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/render/sui/scoreView.ts\n");
328
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreView: () => (/* binding */ SuiScoreView)\n/* harmony export */ });\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/xform/copypaste */ \"./src/smo/xform/copypaste.ts\");\n/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scroller */ \"./src/render/sui/scroller.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _tracker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tracker */ \"./src/render/sui/tracker.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _renderState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./renderState */ \"./src/render/sui/renderState.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Base class for all operations on the rendered score. The base class handles the following:\n * 1. Undo and recording actions for the operation\n * 2. Maintain/change which staves in the score are displayed (staff map)\n * 3. Mapping between the displayed score and the data representation\n * @category SuiRender\n */\nclass SuiScoreView {\n constructor(config, svgContainer, score, scrollSelector, undoBuffer) {\n this.score = score;\n const renderParams = {\n elementId: svgContainer,\n score,\n config,\n undoBuffer\n };\n this.audioAnimation = config.audioAnimation;\n this.renderer = new _renderState__WEBPACK_IMPORTED_MODULE_12__.SuiRenderState(renderParams);\n this.config = config;\n const scoreJson = score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true });\n this.scroller = new _scroller__WEBPACK_IMPORTED_MODULE_8__.SuiScroller(scrollSelector, this.renderer.renderer.vexContainers);\n this.storePaste = new _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__.PasteBuffer();\n this.tracker = new _tracker__WEBPACK_IMPORTED_MODULE_10__.SuiTracker(this.renderer, this.scroller);\n this.renderer.setMeasureMapper(this.tracker);\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(scoreJson));\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.storeUndo = new _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer();\n this.staffMap = this.defaultStaffMap;\n SuiScoreView.Instance = this; // for debugging\n this.setMappedStaffIds();\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__.createTopDomContainer)('.saveLink'); // for file upload\n }\n /**\n * Await on the full update of the score\n * @returns\n */\n renderPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.renderPromise();\n });\n }\n /**\n * Await on the partial update of the score in the view\n * @returns\n */\n updatePromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.updatePromise();\n });\n }\n awaitRender() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * await on the full update of the score, also resetting the viewport (to reflect layout changes)\n * @returns\n */\n refreshViewport() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.preserveScroll();\n this.renderer.setViewport();\n this.renderer.setRefresh();\n yield this.renderer.renderPromise();\n });\n }\n handleScrollEvent(scrollLeft, scrollTop) {\n this.tracker.scroller.handleScroll(scrollLeft, scrollTop);\n }\n getPartMap() {\n let keepNext = false;\n let partCount = 0;\n let partMap = {};\n const keys = [];\n this.storeScore.staves.forEach((staff) => {\n const partInfo = staff.partInfo;\n partInfo.associatedStaff = staff.staffId;\n if (!keepNext) {\n partMap[partCount] = partInfo;\n keys.push(partCount);\n partCount += 1;\n if (partInfo.stavesAfter > 0) {\n keepNext = true;\n }\n }\n else {\n keepNext = false;\n }\n });\n return { keys, partMap };\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifyCurrentSelections(label, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelections = this._getEquivalentSelections(this.tracker.selections);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, this.tracker.selections);\n actor(this.storeScore, altSelections);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelection(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, [selection]);\n if (altSelection) {\n actor(this.storeScore, [altSelection]);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelectionNoWait(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n });\n }\n /**\n * Modifiy a set of columns, e.g. tempo, time, key. This has different undo behavior, don't\n * pend on the result because there may be a combination of operations.\n * @param label\n * @param selections\n * @param actor\n */\n modifyColumnsSelectionsNoWait(label, selections, actor) {\n this.undoColumnRange(label, selections);\n selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n });\n this._renderChangedMeasures(selections);\n }\n /**\n * This is used in some Smoosic demos and pens.\n * @param action any action, but most usefully a SuiScoreView method\n * @param repetition number of times to repeat, waiting on render promise between\n * if not specified, defaults to 1\n * @returns promise, resolved action has been completed and score is updated.\n */\n waitableAction(action, repetition) {\n return __awaiter(this, void 0, void 0, function* () {\n const rep = repetition !== null && repetition !== void 0 ? repetition : 1;\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (count) => __awaiter(this, void 0, void 0, function* () {\n if (count > 0) {\n action();\n yield self.renderer.updatePromise();\n fc(count - 1);\n }\n else {\n resolve();\n }\n });\n fc(rep);\n });\n return promise;\n });\n }\n /**\n * The plural form of _getEquivalentSelection\n * @param selections\n * @returns\n */\n _getEquivalentSelections(selections) {\n const rv = [];\n selections.forEach((selection) => {\n const sel = this._getEquivalentSelection(selection);\n if (sel !== null) {\n rv.push(sel);\n }\n });\n return rv;\n }\n // Get a long enough list of measures to paste into\n getPasteMeasureList() {\n // The length of the paste buffer, in ticks\n const ticksToPaste = this.storePaste.getCopyBufferTickCount();\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n const tm = selections[0].measure.tickmapForVoice(selections[0].selector.voice);\n // The last measure selected\n const lastSelection = this.tracker.selections[this.tracker.selections.length - 1];\n // length of first selected measure, in ticks\n const measureTicks = this.tracker.selections[0].measure.getTicksFromVoice(this.tracker.selections[0].selector.voice);\n // remaining ticks after first selection. This is our starting point.\n let startTick = measureTicks - tm.durationMap[this.tracker.selections[0].selector.tick];\n // Add ticks for all remaining measures\n for (let i = 1; i < selections.length; ++i) {\n const sel = selections[i];\n startTick += sel.measure.getTicksFromVoice(0);\n }\n // if we are short, and there are measures left, add them to the selection list\n if (startTick < ticksToPaste && lastSelection.selector.measure < (this.score.staves[0].measures.length + 1)) {\n const newSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, selections[0].selector.staff, lastSelection.selector.measure + 1);\n if (newSel) {\n selections.push(newSel);\n }\n }\n return selections;\n }\n /**\n * A staff modifier has changed, create undo operations for the measures affected\n * @param label\n * @param staffModifier\n * @param subtype\n */\n undoStaffModifier(label, staffModifier, subtype) {\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase.deserialize(staffModifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const copySer = copy.serialize();\n // Copy ID so we can undo properly\n copySer.attrs = JSON.parse(JSON.stringify(staffModifier.attrs));\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.STAFF_MODIFIER, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, copySer, subtype);\n }\n /**\n * Return the index of the page that is in the center of the client screen.\n */\n getFocusedPage() {\n if (this.score.layoutManager === undefined) {\n return 0;\n }\n const scrollAvg = this.tracker.scroller.netScroll.y + (this.tracker.scroller.viewport.height / 2);\n const midY = scrollAvg;\n const layoutManager = this.score.layoutManager.getGlobalLayout();\n const lh = layoutManager.pageHeight / layoutManager.svgScale;\n const lw = layoutManager.pageWidth / layoutManager.svgScale;\n const pt = this.renderer.pageMap.svgToClient(_svgHelpers__WEBPACK_IMPORTED_MODULE_9__.SvgHelpers.smoBox({ x: lw, y: lh }));\n return Math.round(midY / pt.y);\n }\n /**\n * Create a rectangle undo, like a multiple columns but not necessarily the whole\n * score.\n */\n _undoColumn(label, measureIndex) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.COLUMN, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, { score: this.storeScore, measureIndex }, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Score preferences don't affect the display, but they do have an undo\n * @param label\n */\n _undoScorePreferences(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE_ATTRIBUTES, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n undoColumnRange(label, measureSelections) {\n const checked = {};\n measureSelections.forEach((measureSelection) => {\n if (!checked[measureSelection.selector.measure]) {\n checked[measureSelection.selector.measure] = true;\n this._undoColumn(label, measureSelection.selector.measure);\n }\n });\n }\n undoMeasureRange(label, measureSelections) {\n measureSelections.forEach((measureSelection) => {\n const equiv = this._getEquivalentSelection(measureSelection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n });\n return measureSelections;\n }\n /**\n * Add to the undo buffer the current set of measures selected.\n * @param label\n * @returns\n */\n undoTrackerMeasureSelections(label) {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n return this.undoMeasureRange(label, measureSelections);\n }\n /**\n * operation that only affects the first selection. Setup undo for the measure\n */\n _undoFirstMeasureSelection(label) {\n const sel = this.tracker.selections[0];\n const equiv = this._getEquivalentSelection(sel);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n return sel;\n }\n /**\n * Add the selection to the undo buffer\n * @param label\n * @param selection\n */\n _undoSelection(label, selection) {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n }\n /**\n * Add multiple selections to the undo buffer as a group\n * @param label\n * @param selections\n */\n _undoSelections(label, selections) {\n this.storeUndo.grouping = true;\n selections.forEach((selection) => {\n this._undoSelection(label, selection);\n });\n this.storeUndo.grouping = false;\n }\n /**\n * Update renderer for measures that have changed\n */\n _renderChangedMeasures(measureSelections) {\n if (!Array.isArray(measureSelections)) {\n measureSelections = [measureSelections];\n }\n measureSelections.forEach((measureSelection) => {\n this.renderer.addToReplaceQueue(measureSelection);\n });\n }\n /**\n * Update renderer for some columns\n * @param fromSelector\n * @param toSelector\n */\n _renderRectangle(fromSelector, toSelector) {\n this._getRectangleSelections(fromSelector, toSelector).forEach((s) => {\n this.renderer.addToReplaceQueue(s);\n });\n }\n /**\n * Setup undo for operation that affects the whole score\n * @param label\n */\n _undoScore(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Get the selector from this.storeScore that maps to the displayed selector from this.score\n * @param selector\n * @returns\n */\n _getEquivalentSelector(selector) {\n const rv = JSON.parse(JSON.stringify(selector));\n rv.staff = this.staffMap[selector.staff];\n return rv;\n }\n /**\n * Get the equivalent staff id from this.storeScore that maps to the displayed selector from this.score\n * @param staffId\n * @returns\n */\n _getEquivalentStaff(staffId) {\n return this.staffMap[staffId];\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentSelection(selection) {\n try {\n if (typeof (selection.selector.tick) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure);\n }\n if (typeof (selection.selector.pitches) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.noteSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick);\n }\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.pitchSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick, selection.selector.pitches);\n }\n catch (ex) {\n console.warn(ex);\n return null;\n }\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentGraceNote(selection, gn) {\n if (selection.note !== null) {\n const rv = selection.note.getGraceNotes().find((gg) => gg.attrs.id === gn.attrs.id);\n if (rv) {\n return rv;\n }\n }\n return gn;\n }\n /**\n * Get the rectangle of selections indicated by the parameters from the score\n * @param startSelector\n * @param endSelector\n * @param score\n * @returns\n */\n _getRectangleSelections(startSelector, endSelector) {\n const rv = [];\n let i = 0;\n let j = 0;\n for (i = startSelector.staff; i <= endSelector.staff; i++) {\n for (j = startSelector.measure; j <= endSelector.measure; j++) {\n const target = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, i, j);\n if (target !== null) {\n rv.push(target);\n }\n }\n }\n return rv;\n }\n /**\n * set the grouping flag for undo operations\n * @param val\n */\n groupUndo(val) {\n this.storeUndo.grouping = val;\n }\n /**\n * Show all staves, 1:1 mapping of view score staff to stored score staff\n */\n get defaultStaffMap() {\n let i = 0;\n const rv = [];\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n rv.push(i);\n }\n return rv;\n }\n /**\n * Bootstrapping function, creates the renderer and associated timers\n */\n startRenderingEngine() {\n if (!this.renderer.score) {\n // If there is only one part, display the part.\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n // If the score is transposing, hide the instrument xpose settings\n this._setTransposing();\n this.renderer.score = this.score;\n this.renderer.setViewport();\n }\n this.renderer.startDemon();\n }\n /**\n * Gets the current mapping of displayed staves to score staves (this.storeScore)\n * @returns\n */\n getView() {\n const rv = [];\n let i = 0;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const show = this.staffMap.indexOf(i) >= 0;\n rv.push({ show });\n }\n return rv;\n }\n /**\n * Update the staff ID when the view changes\n */\n setMappedStaffIds() {\n this.score.staves.forEach((staff) => {\n if (!this.isPartExposed()) {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n }\n else {\n staff.partInfo.displayCues = false;\n }\n staff.setMappedStaffId(this.staffMap[staff.staffId]);\n });\n }\n resetPartView() {\n if (this.staffMap.length === 1) {\n const staff = this.storeScore.staves[this.staffMap[0]];\n this.exposePart(staff);\n }\n }\n /**\n * Exposes a part: hides non-part staves, shows part staves.\n * Note this will reset the view. After this operation, staff 0 will\n * be the selected part.\n * @param staff\n */\n exposePart(staff) {\n let i = 0;\n const exposeMap = [];\n let pushNext = false;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const tS = this.storeScore.staves[i];\n const show = tS.staffId === staff.staffId;\n if (pushNext) {\n exposeMap.push({ show: true });\n pushNext = false;\n }\n else {\n exposeMap.push({ show });\n if (tS.partInfo.stavesAfter > 0 && show) {\n pushNext = true;\n }\n }\n }\n this.setView(exposeMap);\n }\n /**\n * Indicates if the score is displaying in part-mode vs. score mode.\n * @returns\n */\n isPartExposed() {\n return this.score.isPartExposed();\n }\n /**\n * Parts have different formatting options from the parent score, indluding layout. Reset\n * them when exposing a part.\n */\n _mapPartFormatting() {\n this.score.layoutManager = this.score.staves[0].partInfo.layoutManager;\n let replacedText = false;\n this.score.staves.forEach((staff) => {\n staff.updateMeasureFormatsForPart();\n if (staff.partInfo.preserveTextGroups && !replacedText) {\n const tga = [];\n replacedText = true;\n staff.partInfo.textGroups.forEach((tg) => {\n tga.push(tg);\n });\n this.score.textGroups = tga;\n }\n });\n }\n /**\n * Update the list of staves in the score that are displayed.\n */\n setView(rows) {\n let i = 0;\n const any = rows.find((row) => row.show === true);\n if (!any) {\n return;\n }\n const nscore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: true, useDictionary: false, preserveStaffIds: false })));\n const staffMap = [];\n for (i = 0; i < rows.length; ++i) {\n const row = rows[i];\n if (row.show) {\n const srcStave = this.storeScore.staves[i];\n const jsonObj = srcStave.serialize({ skipMaps: false, preserveIds: true });\n jsonObj.staffId = staffMap.length;\n const nStave = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__.SmoSystemStaff.deserialize(jsonObj);\n nStave.mapStaffFromTo(i, nscore.staves.length);\n nscore.staves.push(nStave);\n if (srcStave.keySignatureMap) {\n nStave.keySignatureMap = JSON.parse(JSON.stringify(srcStave.keySignatureMap));\n }\n nStave.measures.forEach((measure, ix) => {\n const srcMeasure = srcStave.measures[ix];\n measure.tempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.SmoTempoText(srcMeasure.tempo.serialize());\n measure.timeSignature = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.TimeSignature(srcMeasure.timeSignature);\n measure.keySignature = srcMeasure.keySignature;\n });\n staffMap.push(i);\n }\n }\n nscore.numberStaves();\n this.staffMap = staffMap;\n this.score = nscore;\n // Indicate which score staff view staves are mapped to, to decide to display\n // modifiers.\n this.setMappedStaffIds();\n // TODO: add part-specific measure formatting, etc.\n this._setTransposing();\n this.renderer.score = nscore;\n // If this current view is a part, show the part layout\n if (this.isPartExposed()) {\n this._mapPartFormatting();\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = false;\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__.SmoOperation.computeMultipartRest(nscore);\n }\n else {\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n });\n }\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * view all the staffs in score mode.\n */\n viewAll() {\n this.score = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this._setTransposing();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.score = this.score;\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * Update score based on transposing flag.\n */\n _setTransposing() {\n var _a;\n if (!this.isPartExposed()) {\n const xpose = (_a = this.score.preferences) === null || _a === void 0 ? void 0 : _a.transposingScore;\n if (xpose) {\n this.score.setTransposing();\n }\n }\n }\n /**\n * Update the view after loading or restoring a completely new score\n * @param score\n * @returns\n */\n changeScore(score) {\n return __awaiter(this, void 0, void 0, function* () {\n this.storeUndo.reset();\n _audio_player__WEBPACK_IMPORTED_MODULE_14__.SuiAudioPlayer.stopPlayer();\n this.renderer.score = score;\n this.renderer.setViewport();\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.score = score;\n // If the score is non-transposing, hide the instrument xpose settings\n this._setTransposing();\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n const rv = yield this.awaitRender();\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n return rv;\n });\n }\n replaceMeasureView(measureRange) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.score.staves.forEach((staff) => {\n var _a, _b;\n const staffId = staff.staffId;\n const altStaff = this.storeScore.staves[this._getEquivalentStaff(staffId)];\n if (altStaff) {\n staff.syncStaffModifiers(i, altStaff);\n }\n // Get a copy of the backing score, and map it to the score stave. this.score may have fewer staves\n // than this.storeScore\n const svg = JSON.parse(JSON.stringify(staff.measures[i].svg));\n const serialized = _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.serializeMeasure(this.storeScore.staves[this.staffMap[staffId]].measures[i]);\n serialized.measureNumber.staffId = staffId;\n const xpose = (_a = serialized.transposeIndex) !== null && _a !== void 0 ? _a : 0;\n const concertKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.vexKeySigWithOffset((_b = serialized.keySignature) !== null && _b !== void 0 ? _b : 'c', -1 * xpose);\n serialized.keySignature = concertKey;\n const rmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(serialized);\n rmeasure.svg = svg;\n // If this is a tranposed score, the displayed score needs to be in 'C'.\n // We do this step last since serialize/unserialize work in a pitch transposed\n // for the instrument\n if (this.score.preferences.transposingScore && !this.score.isPartExposed()) {\n rmeasure.transposeToOffset(-1 * xpose, 'c');\n rmeasure.keySignature = 'c';\n rmeasure.transposeIndex = 0;\n }\n const selector = { staff: staffId, measure: i, voice: 0, tick: 0, pitches: [] };\n this.score.replaceMeasure(selector, rmeasure);\n });\n this.renderer.addColumnToReplaceQueue(i);\n }\n }\n /**\n * for the view score, the renderer decides what to render\n * depending on what is undone.\n * @returns\n */\n undo() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.renderer.score) {\n return;\n }\n if (!this.storeUndo.buffersAvailable()) {\n return;\n }\n const staffMap = {};\n const identityMap = {};\n this.defaultStaffMap.forEach((nn) => identityMap[nn] = nn);\n this.staffMap.forEach((mm, ix) => staffMap[mm] = ix);\n // A score-level undo might have changed the score.\n const fullScore = this.storeUndo.undoScorePeek();\n // text undo is handled differently since there is usually not\n // an associated measure.\n const scoreText = this.storeUndo.undoScoreTextGroupPeek();\n const partText = this.storeUndo.undoPartTextGroupPeek();\n if (scoreText || partText) {\n yield this.renderer.unrenderTextGroups();\n }\n const measureRange = this.storeUndo.getMeasureRange();\n if (!(fullScore || scoreText || partText)) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n }\n this.storeScore = this.storeUndo.undo(this.storeScore, identityMap, true);\n if (fullScore) {\n this.viewAll();\n this.renderer.setRefresh();\n }\n else if (partText) {\n this.setView(this.getView());\n }\n else if (scoreText) {\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.rerenderTextGroups();\n }\n else {\n this.replaceMeasureView(measureRange);\n }\n yield this.renderer.updatePromise();\n });\n }\n}\nSuiScoreView.Instance = null;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7O0FBanVCTSxxQkFBUSxHQUF3QixJQUFJLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3N1aS9zY29yZVZpZXcudHM/MDk3YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU21vU2NvcmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlJztcclxuaW1wb3J0IHsgU21vVGV4dEdyb3VwIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVUZXh0JztcclxuaW1wb3J0IHsgU21vR3JhY2VOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbXVzaWMnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N5c3RlbVN0YWZmJztcclxuaW1wb3J0IHsgU21vUGFydEluZm8gfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9wYXJ0SW5mbyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3Rpb24sIFNtb1NlbGVjdG9yIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBVbmRvQnVmZmVyLCBjb3B5VW5kbyB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS91bmRvJztcclxuaW1wb3J0IHsgUGFzdGVCdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vY29weXBhc3RlJztcclxuaW1wb3J0IHsgU3VpU2Nyb2xsZXIgfSBmcm9tICcuL3Njcm9sbGVyJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4vc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aVRyYWNrZXIgfSBmcm9tICcuL3RyYWNrZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVUb3BEb21Db250YWluZXIgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTbW9SZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU3VpUmVuZGVyU3RhdGUsIHNjb3JlQ2hhbmdlRXZlbnQgfSBmcm9tICcuL3JlbmRlclN0YXRlJztcclxuaW1wb3J0IHsgU2NvcmVSZW5kZXJQYXJhbXMgfSBmcm9tICcuL3Njb3JlUmVuZGVyJztcclxuaW1wb3J0IHsgU21vT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBTdWlBdWRpb1BsYXllciB9IGZyb20gJy4uL2F1ZGlvL3BsYXllcic7XHJcbmltcG9ydCB7IFN1aUF1ZGlvQW5pbWF0aW9uUGFyYW1zIH0gZnJvbSAnLi4vYXVkaW8vbXVzaWNDdXJzb3InO1xyXG5pbXBvcnQgeyBTbW9UZW1wb1RleHQgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgVGltZVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuLyoqXHJcbiAqIEluZGljYXRlcyBhIHN0YXZlIGlzL2lzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIHNjb3JlXHJcbiAqIEBjYXRlZ29yeSBTdWlSZW5kZXJcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlld01hcEVudHJ5IHtcclxuICBzaG93OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSB1cGRhdGVTZWxlY3Rpb25GdW5jID0gKHNjb3JlOiBTbW9TY29yZSwgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10pID0+IHZvaWQ7XHJcbmV4cG9ydCB0eXBlIHVwZGF0ZVNpbmdsZVNlbGVjdGlvbkZ1bmMgPSAoc2NvcmU6IFNtb1Njb3JlLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbikgPT4gdm9pZDtcclxuZXhwb3J0IHR5cGUgdXBkYXRlU3RhZmZNb2RpZmllckZ1bmMgPSAoc2NvcmU6IFNtb1Njb3JlLCBmcm9tU2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIHRvU2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pID0+IHZvaWQ7XHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgb3BlcmF0aW9ucyBvbiB0aGUgcmVuZGVyZWQgc2NvcmUuICBUaGUgYmFzZSBjbGFzcyBoYW5kbGVzIHRoZSBmb2xsb3dpbmc6XHJcbiAqIDEuIFVuZG8gYW5kIHJlY29yZGluZyBhY3Rpb25zIGZvciB0aGUgb3BlcmF0aW9uXHJcbiAqIDIuIE1haW50YWluL2NoYW5nZSB3aGljaCBzdGF2ZXMgaW4gdGhlIHNjb3JlIGFyZSBkaXNwbGF5ZWQgKHN0YWZmIG1hcClcclxuICogMy4gTWFwcGluZyBiZXR3ZWVuIHRoZSBkaXNwbGF5ZWQgc2NvcmUgYW5kIHRoZSBkYXRhIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBjYXRlZ29yeSBTdWlSZW5kZXJcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdWlTY29yZVZpZXcge1xyXG4gIHN0YXRpYyBJbnN0YW5jZTogU3VpU2NvcmVWaWV3IHwgbnVsbCA9IG51bGw7XHJcbiAgc2NvcmU6IFNtb1Njb3JlOyAvLyBUaGUgc2NvcmUgdGhhdCBpcyBkaXNwbGF5ZWRcclxuICBzdG9yZVNjb3JlOiBTbW9TY29yZTsgIC8vIHRoZSBmdWxsIHNjb3JlLCBpbmNsdWRpbmcgaW52aXNpYmxlIHN0YXZlc1xyXG4gIHN0YWZmTWFwOiBudW1iZXJbXTsgLy8gbWFwcGluZyB0aGUgMiB0aGluZ3MgYWJvdmVcclxuICBzdG9yZVVuZG86IFVuZG9CdWZmZXI7IC8vIHVuZG8gYnVmZmVyIGZvciBvcGVyYXRpb25zIHRvIGFib3ZlXHJcbiAgdHJhY2tlcjogU3VpVHJhY2tlcjsgLy8gVUkgc2VsZWN0aW9uc1xyXG4gIHJlbmRlcmVyOiBTdWlSZW5kZXJTdGF0ZTtcclxuICBzY3JvbGxlcjogU3VpU2Nyb2xsZXI7XHJcbiAgc3RvcmVQYXN0ZTogUGFzdGVCdWZmZXI7XHJcbiAgY29uZmlnOiBTbW9SZW5kZXJDb25maWd1cmF0aW9uO1xyXG4gIGF1ZGlvQW5pbWF0aW9uOiBTdWlBdWRpb0FuaW1hdGlvblBhcmFtcztcclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb24sIHN2Z0NvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNjb3JlOiBTbW9TY29yZSwgc2Nyb2xsU2VsZWN0b3I6IEhUTUxFbGVtZW50LCB1bmRvQnVmZmVyOiBVbmRvQnVmZmVyKSB7XHJcbiAgICB0aGlzLnNjb3JlID0gc2NvcmU7XHJcbiAgICBjb25zdCByZW5kZXJQYXJhbXM6IFNjb3JlUmVuZGVyUGFyYW1zID0ge1xyXG4gICAgICBlbGVtZW50SWQ6IHN2Z0NvbnRhaW5lcixcclxuICAgICAgc2NvcmUsXHJcbiAgICAgIGNvbmZpZyxcclxuICAgICAgdW5kb0J1ZmZlclxyXG4gICAgfTtcclxuICAgIHRoaXMuYXVkaW9BbmltYXRpb24gPSBjb25maWcuYXVkaW9BbmltYXRpb247XHJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFN1aVJlbmRlclN0YXRlKHJlbmRlclBhcmFtcyk7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuICAgIGNvbnN0IHNjb3JlSnNvbiA9IHNjb3JlLnNlcmlhbGl6ZSh7IHNraXBTdGF2ZXM6IGZhbHNlLCB1c2VEaWN0aW9uYXJ5OiBmYWxzZSwgcHJlc2VydmVTdGFmZklkczogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc2Nyb2xsZXIgPSBuZXcgU3VpU2Nyb2xsZXIoc2Nyb2xsU2VsZWN0b3IsIHRoaXMucmVuZGVyZXIucmVuZGVyZXIudmV4Q29udGFpbmVycyk7XHJcbiAgICB0aGlzLnN0b3JlUGFzdGUgPSBuZXcgUGFzdGVCdWZmZXIoKTtcclxuICAgIHRoaXMudHJhY2tlciA9IG5ldyBTdWlUcmFja2VyKHRoaXMucmVuZGVyZXIsIHRoaXMuc2Nyb2xsZXIpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRNZWFzdXJlTWFwcGVyKHRoaXMudHJhY2tlcik7XHJcblxyXG4gICAgdGhpcy5zdG9yZVNjb3JlID0gU21vU2NvcmUuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoc2NvcmVKc29uKSk7XHJcbiAgICB0aGlzLnNjb3JlLnN5bmNocm9uaXplVGV4dEdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcyk7XHJcbiAgICB0aGlzLnN0b3JlVW5kbyA9IG5ldyBVbmRvQnVmZmVyKCk7XHJcbiAgICB0aGlzLnN0YWZmTWFwID0gdGhpcy5kZWZhdWx0U3RhZmZNYXA7XHJcbiAgICBTdWlTY29yZVZpZXcuSW5zdGFuY2UgPSB0aGlzOyAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICBjcmVhdGVUb3BEb21Db250YWluZXIoJy5zYXZlTGluaycpOyAvLyBmb3IgZmlsZSB1cGxvYWRcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQXdhaXQgb24gdGhlIGZ1bGwgdXBkYXRlIG9mIHRoZSBzY29yZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbmRlclByb21pc2UoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlclByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQXdhaXQgb24gdGhlIHBhcnRpYWwgdXBkYXRlIG9mIHRoZSBzY29yZSBpbiB0aGUgdmlld1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVByb21pc2UoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgYXdhaXRSZW5kZXIoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogYXdhaXQgb24gdGhlIGZ1bGwgdXBkYXRlIG9mIHRoZSBzY29yZSwgYWxzbyByZXNldHRpbmcgdGhlIHZpZXdwb3J0ICh0byByZWZsZWN0IGxheW91dCBjaGFuZ2VzKVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlZnJlc2hWaWV3cG9ydCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRWaWV3cG9ydCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlbmRlclByb21pc2UoKTtcclxuICB9XHJcbiAgaGFuZGxlU2Nyb2xsRXZlbnQoc2Nyb2xsTGVmdDogbnVtYmVyLCBzY3JvbGxUb3A6IG51bWJlcikge1xyXG4gICAgdGhpcy50cmFja2VyLnNjcm9sbGVyLmhhbmRsZVNjcm9sbChzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApO1xyXG4gIH1cclxuICBnZXRQYXJ0TWFwKCk6IHsga2V5czogbnVtYmVyW10sIHBhcnRNYXA6IFJlY29yZDxudW1iZXIsIFNtb1BhcnRJbmZvPiB9IHtcclxuICAgIGxldCBrZWVwTmV4dCA9IGZhbHNlO1xyXG4gICAgbGV0IHBhcnRDb3VudCA9IDA7XHJcbiAgICBsZXQgcGFydE1hcDogUmVjb3JkPG51bWJlciwgU21vUGFydEluZm8+ID0ge307XHJcbiAgICBjb25zdCBrZXlzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBjb25zdCBwYXJ0SW5mbyA9IHN0YWZmLnBhcnRJbmZvO1xyXG4gICAgICBwYXJ0SW5mby5hc3NvY2lhdGVkU3RhZmYgPSBzdGFmZi5zdGFmZklkO1xyXG4gICAgICBpZiAoIWtlZXBOZXh0KSB7XHJcbiAgICAgICAgcGFydE1hcFtwYXJ0Q291bnRdID0gcGFydEluZm87XHJcbiAgICAgICAga2V5cy5wdXNoKHBhcnRDb3VudCk7XHJcbiAgICAgICAgcGFydENvdW50ICs9IDE7XHJcbiAgICAgICAgaWYgKHBhcnRJbmZvLnN0YXZlc0FmdGVyID4gMCkge1xyXG4gICAgICAgICAga2VlcE5leHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBrZWVwTmV4dCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IGtleXMsIHBhcnRNYXAgfTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW55IG1ldGhvZCB0aGF0IG1vZGlmaWVzIGEgc2V0IG9mIHNlbGVjdGlvbnMgY2FuIGNhbGwgdGhpcyB0byB1cGRhdGUgXHJcbiAgICogdGhlIHNjb3JlIHZpZXcgYW5kIHRoZSBiYWNraW5nIHNjb3JlLlxyXG4gICAqIEBwYXJhbSBhY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKi9cclxuICBhc3luYyBtb2RpZnlDdXJyZW50U2VsZWN0aW9ucyhsYWJlbDogc3RyaW5nLCBhY3RvcjogdXBkYXRlU2VsZWN0aW9uRnVuYykge1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhsYWJlbCk7XHJcbiAgICBhY3Rvcih0aGlzLnNjb3JlLCB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICBhY3Rvcih0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucykpO1xyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFueSBtZXRob2QgdGhhdCBtb2RpZmllcyBhIHNldCBvZiBzZWxlY3Rpb25zIGNhbiBjYWxsIHRoaXMgdG8gdXBkYXRlIFxyXG4gICAqIHRoZSBzY29yZSB2aWV3IGFuZCB0aGUgYmFja2luZyBzY29yZS5cclxuICAgKiBAcGFyYW0gYWN0b3IgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW9kaWZ5U2VsZWN0aW9uKGxhYmVsOiBzdHJpbmcsIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBhY3RvcjogdXBkYXRlU2VsZWN0aW9uRnVuYykge1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsKTtcclxuICAgIGFjdG9yKHRoaXMuc2NvcmUsIFtzZWxlY3Rpb25dKTtcclxuICAgIGlmIChhbHRTZWxlY3Rpb24pIHtcclxuICAgICAgYWN0b3IodGhpcy5zdG9yZVNjb3JlLCBbYWx0U2VsZWN0aW9uXSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KFtzZWxlY3Rpb25dKSk7XHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgICAvKipcclxuICAgKiBBbnkgbWV0aG9kIHRoYXQgbW9kaWZpZXMgYSBzZXQgb2Ygc2VsZWN0aW9ucyBjYW4gY2FsbCB0aGlzIHRvIHVwZGF0ZSBcclxuICAgKiB0aGUgc2NvcmUgdmlldyBhbmQgdGhlIGJhY2tpbmcgc2NvcmUuXHJcbiAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gICAgYXN5bmMgbW9kaWZ5U2VsZWN0aW9uTm9XYWl0KGxhYmVsOiBzdHJpbmcsIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBhY3RvcjogdXBkYXRlU2luZ2xlU2VsZWN0aW9uRnVuYykge1xyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhsYWJlbCk7XHJcbiAgICAgIGFjdG9yKHRoaXMuc2NvcmUsIHNlbGVjdGlvbik7XHJcbiAgICAgIGlmIChhbHRTZWxlY3Rpb24pIHtcclxuICAgICAgICBhY3Rvcih0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdChbc2VsZWN0aW9uXSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RpZml5IGEgc2V0IG9mIGNvbHVtbnMsIGUuZy4gdGVtcG8sIHRpbWUsIGtleS4gIFRoaXMgaGFzIGRpZmZlcmVudCB1bmRvIGJlaGF2aW9yLCBkb24ndCBcclxuICAgICAqIHBlbmQgb24gdGhlIHJlc3VsdCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhIGNvbWJpbmF0aW9uIG9mIG9wZXJhdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgICAqIEBwYXJhbSBhY3RvciBcclxuICAgICAqL1xyXG4gICAgbW9kaWZ5Q29sdW1uc1NlbGVjdGlvbnNOb1dhaXQobGFiZWw6IHN0cmluZywgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10sIGFjdG9yOiB1cGRhdGVTaW5nbGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICAgIHRoaXMudW5kb0NvbHVtblJhbmdlKGxhYmVsLCBzZWxlY3Rpb25zKTtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgICAgYWN0b3IodGhpcy5zY29yZSwgc2VsZWN0aW9uKTtcclxuICAgICAgICBpZiAoYWx0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBhY3Rvcih0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbik7XHJcbiAgICAgICAgfSAgXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoc2VsZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGluIHNvbWUgU21vb3NpYyBkZW1vcyBhbmQgcGVucy5cclxuICAgKiBAcGFyYW0gYWN0aW9uIGFueSBhY3Rpb24sIGJ1dCBtb3N0IHVzZWZ1bGx5IGEgU3VpU2NvcmVWaWV3IG1ldGhvZFxyXG4gICAqIEBwYXJhbSByZXBldGl0aW9uIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQsIHdhaXRpbmcgb24gcmVuZGVyIHByb21pc2UgYmV0d2VlblxyXG4gICAqIGlmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIDFcclxuICAgKiBAcmV0dXJucyBwcm9taXNlLCByZXNvbHZlZCBhY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkIGFuZCBzY29yZSBpcyB1cGRhdGVkLlxyXG4gICAqL1xyXG4gIGFzeW5jIHdhaXRhYmxlQWN0aW9uKGFjdGlvbjogKCkgPT4gdm9pZCwgcmVwZXRpdGlvbj86IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVwID0gcmVwZXRpdGlvbiA/PyAxO1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmYyA9IGFzeW5jIChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgYWN0aW9uKCk7XHJcbiAgICAgICAgICBhd2FpdCBzZWxmLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICAgICAgICAgIGZjKGNvdW50IC0gMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGZjKHJlcCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBwcm9taXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHBsdXJhbCBmb3JtIG9mIF9nZXRFcXVpdmFsZW50U2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgcnY6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIGlmIChzZWwgIT09IG51bGwpIHtcclxuICAgICAgICBydi5wdXNoKHNlbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvLyBHZXQgYSBsb25nIGVub3VnaCBsaXN0IG9mIG1lYXN1cmVzIHRvIHBhc3RlIGludG9cclxuICBnZXRQYXN0ZU1lYXN1cmVMaXN0KCkge1xyXG4gICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcGFzdGUgYnVmZmVyLCBpbiB0aWNrc1xyXG4gICAgY29uc3QgdGlja3NUb1Bhc3RlID0gdGhpcy5zdG9yZVBhc3RlLmdldENvcHlCdWZmZXJUaWNrQ291bnQoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdICA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCB0bSA9IHNlbGVjdGlvbnNbMF0ubWVhc3VyZS50aWNrbWFwRm9yVm9pY2Uoc2VsZWN0aW9uc1swXS5zZWxlY3Rvci52b2ljZSk7XHJcbiAgICAvLyBUaGUgbGFzdCBtZWFzdXJlIHNlbGVjdGVkXHJcbiAgICBjb25zdCBsYXN0U2VsZWN0aW9uID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbdGhpcy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoIC0gMV07XHJcbiAgICAvLyBsZW5ndGggb2YgZmlyc3Qgc2VsZWN0ZWQgbWVhc3VyZSwgaW4gdGlja3NcclxuICAgIGNvbnN0IG1lYXN1cmVUaWNrcyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuZ2V0VGlja3NGcm9tVm9pY2UodGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3Iudm9pY2UpO1xyXG4gICAgLy8gcmVtYWluaW5nIHRpY2tzIGFmdGVyIGZpcnN0IHNlbGVjdGlvbi4gIFRoaXMgaXMgb3VyIHN0YXJ0aW5nIHBvaW50LlxyXG4gICAgbGV0IHN0YXJ0VGljayA9IG1lYXN1cmVUaWNrcyAtIHRtLmR1cmF0aW9uTWFwW3RoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2tdO1xyXG4gICAgLy8gQWRkIHRpY2tzIGZvciBhbGwgcmVtYWluaW5nIG1lYXN1cmVzXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgc3RhcnRUaWNrICs9IHNlbC5tZWFzdXJlLmdldFRpY2tzRnJvbVZvaWNlKDApO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgd2UgYXJlIHNob3J0LCBhbmQgdGhlcmUgYXJlIG1lYXN1cmVzIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBzZWxlY3Rpb24gbGlzdFxyXG4gICAgaWYgKHN0YXJ0VGljayA8IHRpY2tzVG9QYXN0ZSAmJiBsYXN0U2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUgPCAodGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoICsgMSkpIHtcclxuICAgICAgY29uc3QgbmV3U2VsID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZiwgbGFzdFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlICsgMSk7XHJcbiAgICAgIGlmIChuZXdTZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb25zLnB1c2gobmV3U2VsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgc3RhZmYgbW9kaWZpZXIgaGFzIGNoYW5nZWQsIGNyZWF0ZSB1bmRvIG9wZXJhdGlvbnMgZm9yIHRoZSBtZWFzdXJlcyBhZmZlY3RlZFxyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKiBAcGFyYW0gc3RhZmZNb2RpZmllciBcclxuICAgKiBAcGFyYW0gc3VidHlwZSBcclxuICAgKi9cclxuICB1bmRvU3RhZmZNb2RpZmllcihsYWJlbDogc3RyaW5nLCBzdGFmZk1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSwgc3VidHlwZTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3B5ID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUoc3RhZmZNb2RpZmllci5zZXJpYWxpemUoKSk7XHJcbiAgICBjb3B5LnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvcHkuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBjb3B5U2VyID0gY29weS5zZXJpYWxpemUoKTtcclxuICAgIC8vIENvcHkgSUQgc28gd2UgY2FuIHVuZG8gcHJvcGVybHlcclxuICAgIGNvcHlTZXIuYXR0cnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YWZmTW9kaWZpZXIuYXR0cnMpKTtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TVEFGRl9NT0RJRklFUiwgU21vU2VsZWN0b3IuZGVmYXVsdCxcclxuICAgICAgY29weVNlciwgc3VidHlwZSk7XHJcbiAgfVxyXG4gIC8qKiBcclxuICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBwYWdlIHRoYXQgaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2xpZW50IHNjcmVlbi5cclxuICAgKi9cclxuICBnZXRGb2N1c2VkUGFnZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2Nyb2xsQXZnID0gdGhpcy50cmFja2VyLnNjcm9sbGVyLm5ldFNjcm9sbC55ICsgKHRoaXMudHJhY2tlci5zY3JvbGxlci52aWV3cG9ydC5oZWlnaHQgLyAyKTtcclxuICAgIGNvbnN0IG1pZFkgPSBzY3JvbGxBdmc7XHJcbiAgICBjb25zdCBsYXlvdXRNYW5hZ2VyID0gdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgY29uc3QgbGggPSBsYXlvdXRNYW5hZ2VyLnBhZ2VIZWlnaHQgLyBsYXlvdXRNYW5hZ2VyLnN2Z1NjYWxlO1xyXG4gICAgY29uc3QgbHcgPSBsYXlvdXRNYW5hZ2VyLnBhZ2VXaWR0aCAvIGxheW91dE1hbmFnZXIuc3ZnU2NhbGU7XHJcbiAgICBjb25zdCBwdCA9IHRoaXMucmVuZGVyZXIucGFnZU1hcC5zdmdUb0NsaWVudChTdmdIZWxwZXJzLnNtb0JveCh7IHg6IGx3LCB5OiBsaCB9KSk7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtaWRZIC8gcHQueSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIHJlY3RhbmdsZSB1bmRvLCBsaWtlIGEgbXVsdGlwbGUgY29sdW1ucyBidXQgbm90IG5lY2Vzc2FyaWx5IHRoZSB3aG9sZVxyXG4gICAqIHNjb3JlLlxyXG4gICAqL1xyXG4gIF91bmRvQ29sdW1uKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuQ09MVU1OLCBTbW9TZWxlY3Rvci5kZWZhdWx0LFxyXG4gICAgICB7IHNjb3JlOiB0aGlzLnN0b3JlU2NvcmUsIG1lYXN1cmVJbmRleCB9LCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTY29yZSBwcmVmZXJlbmNlcyBkb24ndCBhZmZlY3QgdGhlIGRpc3BsYXksIGJ1dCB0aGV5IGRvIGhhdmUgYW4gdW5kb1xyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKi9cclxuICBfdW5kb1Njb3JlUHJlZmVyZW5jZXMobGFiZWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX0FUVFJJQlVURVMsIFNtb1NlbGVjdG9yLmRlZmF1bHQsIHRoaXMuc3RvcmVTY29yZSwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICB9XHJcbiAgdW5kb0NvbHVtblJhbmdlKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgY29uc3QgY2hlY2tlZDogUmVjb3JkPG51bWJlciwgYm9vbGVhbj4gPSB7fTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG1lYXN1cmVTZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKCFjaGVja2VkW21lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZV0pIHtcclxuICAgICAgICBjaGVja2VkW21lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZV0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3VuZG9Db2x1bW4obGFiZWwsIG1lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICB1bmRvTWVhc3VyZVJhbmdlKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obWVhc3VyZVNlbGVjdGlvbik7XHJcbiAgICAgIGlmIChlcXVpdiAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5NRUFTVVJFLCBlcXVpdi5zZWxlY3RvciwgZXF1aXYubWVhc3VyZSxcclxuICAgICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1lYXN1cmVTZWxlY3Rpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgdG8gdGhlIHVuZG8gYnVmZmVyIHRoZSBjdXJyZW50IHNldCBvZiBtZWFzdXJlcyBzZWxlY3RlZC5cclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgdW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhsYWJlbDogc3RyaW5nKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgcmV0dXJuIHRoaXMudW5kb01lYXN1cmVSYW5nZShsYWJlbCwgbWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBvcGVyYXRpb24gdGhhdCBvbmx5IGFmZmVjdHMgdGhlIGZpcnN0IHNlbGVjdGlvbi4gIFNldHVwIHVuZG8gZm9yIHRoZSBtZWFzdXJlXHJcbiAgICovXHJcbiAgX3VuZG9GaXJzdE1lYXN1cmVTZWxlY3Rpb24obGFiZWw6IHN0cmluZyk6IFNtb1NlbGVjdGlvbiB7XHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5NRUFTVVJFLCBlcXVpdi5zZWxlY3RvciwgZXF1aXYubWVhc3VyZSxcclxuICAgICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBzZWxlY3Rpb24gdG8gdGhlIHVuZG8gYnVmZmVyXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICovXHJcbiAgX3VuZG9TZWxlY3Rpb24obGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pIHtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCxcclxuICAgICAgICBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBtdWx0aXBsZSBzZWxlY3Rpb25zIHRvIHRoZSB1bmRvIGJ1ZmZlciBhcyBhIGdyb3VwXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gIF91bmRvU2VsZWN0aW9ucyhsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSB0cnVlO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb1NlbGVjdGlvbihsYWJlbCwgc2VsZWN0aW9uKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBVcGRhdGUgcmVuZGVyZXIgZm9yIG1lYXN1cmVzIHRoYXQgaGF2ZSBjaGFuZ2VkXHJcbiAgKi9cclxuICBfcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1lYXN1cmVTZWxlY3Rpb25zKSkge1xyXG4gICAgICBtZWFzdXJlU2VsZWN0aW9ucyA9IFttZWFzdXJlU2VsZWN0aW9uc107XHJcbiAgICB9XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtZWFzdXJlU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUobWVhc3VyZVNlbGVjdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHJlbmRlcmVyIGZvciBzb21lIGNvbHVtbnNcclxuICAgKiBAcGFyYW0gZnJvbVNlbGVjdG9yIFxyXG4gICAqIEBwYXJhbSB0b1NlbGVjdG9yIFxyXG4gICAqL1xyXG4gIF9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yOiBTbW9TZWxlY3RvciwgdG9TZWxlY3RvcjogU21vU2VsZWN0b3IpIHtcclxuICAgIHRoaXMuX2dldFJlY3RhbmdsZVNlbGVjdGlvbnMoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKS5mb3JFYWNoKChzKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUocyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHVuZG8gZm9yIG9wZXJhdGlvbiB0aGF0IGFmZmVjdHMgdGhlIHdob2xlIHNjb3JlXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqL1xyXG4gIF91bmRvU2NvcmUobGFiZWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFLCBTbW9TZWxlY3Rvci5kZWZhdWx0LCB0aGlzLnN0b3JlU2NvcmUsXHJcbiAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgc2VsZWN0b3IgZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0b3IgZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdG9yIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRFcXVpdmFsZW50U2VsZWN0b3Ioc2VsZWN0b3I6IFNtb1NlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBydiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3IpKTtcclxuICAgIHJ2LnN0YWZmID0gdGhpcy5zdGFmZk1hcFtzZWxlY3Rvci5zdGFmZl07XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzdGFmZiBpZCBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3RvciBmcm9tIHRoaXMuc2NvcmVcclxuICAgKiBAcGFyYW0gc3RhZmZJZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0RXF1aXZhbGVudFN0YWZmKHN0YWZmSWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhZmZNYXBbc3RhZmZJZF07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzZWxlY3Rpb24gZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0aW9uIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIF9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKTogU21vU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodHlwZW9mIChzZWxlY3Rpb24uc2VsZWN0b3IudGljaykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiAoc2VsZWN0aW9uLnNlbGVjdG9yLnBpdGNoZXMpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBTbW9TZWxlY3Rpb24ubm90ZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIHRoaXMuc3RhZmZNYXBbc2VsZWN0aW9uLnNlbGVjdG9yLnN0YWZmXSwgc2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdGlvbi5zZWxlY3Rvci52b2ljZSxcclxuICAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gU21vU2VsZWN0aW9uLnBpdGNoU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgc2VsZWN0aW9uLnNlbGVjdG9yLnZvaWNlLFxyXG4gICAgICAgIHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrLCBzZWxlY3Rpb24uc2VsZWN0b3IucGl0Y2hlcyk7XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oZXgpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzZWxlY3Rpb24gZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0aW9uIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIF9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBnbjogU21vR3JhY2VOb3RlKTogU21vR3JhY2VOb3RlIHtcclxuICAgIGlmIChzZWxlY3Rpb24ubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBydiA9IHNlbGVjdGlvbi5ub3RlLmdldEdyYWNlTm90ZXMoKS5maW5kKChnZykgPT4gZ2cuYXR0cnMuaWQgPT09IGduLmF0dHJzLmlkKTtcclxuICAgICAgaWYgKHJ2KSB7XHJcbiAgICAgICAgcmV0dXJuIHJ2O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ247XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcmVjdGFuZ2xlIG9mIHNlbGVjdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjb3JlXHJcbiAgICogQHBhcmFtIHN0YXJ0U2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIGVuZFNlbGVjdG9yIFxyXG4gICAqIEBwYXJhbSBzY29yZSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0UmVjdGFuZ2xlU2VsZWN0aW9ucyhzdGFydFNlbGVjdG9yOiBTbW9TZWxlY3RvciwgZW5kU2VsZWN0b3I6IFNtb1NlbGVjdG9yKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgcnY6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBmb3IgKGkgPSBzdGFydFNlbGVjdG9yLnN0YWZmOyBpIDw9IGVuZFNlbGVjdG9yLnN0YWZmOyBpKyspIHtcclxuICAgICAgZm9yIChqID0gc3RhcnRTZWxlY3Rvci5tZWFzdXJlOyBqIDw9IGVuZFNlbGVjdG9yLm1lYXN1cmU7IGorKykge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIGksIGopO1xyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJ2LnB1c2godGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogc2V0IHRoZSBncm91cGluZyBmbGFnIGZvciB1bmRvIG9wZXJhdGlvbnNcclxuICAgKiBAcGFyYW0gdmFsIFxyXG4gICAqL1xyXG4gIGdyb3VwVW5kbyh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbGwgc3RhdmVzLCAxOjEgbWFwcGluZyBvZiB2aWV3IHNjb3JlIHN0YWZmIHRvIHN0b3JlZCBzY29yZSBzdGFmZlxyXG4gICAqL1xyXG4gIGdldCBkZWZhdWx0U3RhZmZNYXAoKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgcnY6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBydi5wdXNoKGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBCb290c3RyYXBwaW5nIGZ1bmN0aW9uLCBjcmVhdGVzIHRoZSByZW5kZXJlciBhbmQgYXNzb2NpYXRlZCB0aW1lcnNcclxuICAgKi9cclxuICBzdGFydFJlbmRlcmluZ0VuZ2luZSgpIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlci5zY29yZSkge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0LCBkaXNwbGF5IHRoZSBwYXJ0LlxyXG4gICAgICBpZiAodGhpcy5zdG9yZVNjb3JlLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICAgIHRoaXMuZXhwb3NlUGFydCh0aGlzLnNjb3JlLnN0YXZlc1swXSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhlIHNjb3JlIGlzIHRyYW5zcG9zaW5nLCBoaWRlIHRoZSBpbnN0cnVtZW50IHhwb3NlIHNldHRpbmdzXHJcbiAgICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2NvcmUgPSB0aGlzLnNjb3JlO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnN0YXJ0RGVtb24oKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY3VycmVudCBtYXBwaW5nIG9mIGRpc3BsYXllZCBzdGF2ZXMgdG8gc2NvcmUgc3RhdmVzICh0aGlzLnN0b3JlU2NvcmUpXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0VmlldygpOiBWaWV3TWFwRW50cnlbXSB7XHJcbiAgICBjb25zdCBydiA9IFtdO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuc3RhZmZNYXAuaW5kZXhPZihpKSA+PSAwO1xyXG4gICAgICBydi5wdXNoKHsgc2hvdyB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBzdGFmZiBJRCB3aGVuIHRoZSB2aWV3IGNoYW5nZXNcclxuICAgKi9cclxuICBzZXRNYXBwZWRTdGFmZklkcygpIHtcclxuICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IHN0YWZmLnBhcnRJbmZvLmN1ZUluU2NvcmU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBzdGFmZi5zZXRNYXBwZWRTdGFmZklkKHRoaXMuc3RhZmZNYXBbc3RhZmYuc3RhZmZJZF0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJlc2V0UGFydFZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5zdGFmZk1hcC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgY29uc3Qgc3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbMF1dO1xyXG4gICAgICB0aGlzLmV4cG9zZVBhcnQoc3RhZmYpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHBvc2VzIGEgcGFydDogIGhpZGVzIG5vbi1wYXJ0IHN0YXZlcywgc2hvd3MgcGFydCBzdGF2ZXMuXHJcbiAgICogTm90ZSB0aGlzIHdpbGwgcmVzZXQgdGhlIHZpZXcuICBBZnRlciB0aGlzIG9wZXJhdGlvbiwgc3RhZmYgMCB3aWxsXHJcbiAgICogYmUgdGhlIHNlbGVjdGVkIHBhcnQuXHJcbiAgICogQHBhcmFtIHN0YWZmIFxyXG4gICAqL1xyXG4gIGV4cG9zZVBhcnQoc3RhZmY6IFNtb1N5c3RlbVN0YWZmKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBleHBvc2VNYXA6IFZpZXdNYXBFbnRyeVtdID0gW107XHJcbiAgICBsZXQgcHVzaE5leHQgPSBmYWxzZTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHRTID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1tpXTtcclxuICAgICAgY29uc3Qgc2hvdyA9IHRTLnN0YWZmSWQgPT09IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgIGlmIChwdXNoTmV4dCkge1xyXG4gICAgICAgIGV4cG9zZU1hcC5wdXNoKHsgc2hvdzogdHJ1ZSB9KTtcclxuICAgICAgICBwdXNoTmV4dCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgIHtcclxuICAgICAgICBleHBvc2VNYXAucHVzaCh7IHNob3cgfSk7XHJcbiAgICAgICAgaWYgKHRTLnBhcnRJbmZvLnN0YXZlc0FmdGVyID4gMCAmJiBzaG93KSB7XHJcbiAgICAgICAgICBwdXNoTmV4dCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFZpZXcoZXhwb3NlTWFwKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBzY29yZSBpcyBkaXNwbGF5aW5nIGluIHBhcnQtbW9kZSB2cy4gc2NvcmUgbW9kZS5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBpc1BhcnRFeHBvc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmUuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQYXJ0cyBoYXZlIGRpZmZlcmVudCBmb3JtYXR0aW5nIG9wdGlvbnMgZnJvbSB0aGUgcGFyZW50IHNjb3JlLCBpbmRsdWRpbmcgbGF5b3V0LiAgUmVzZXRcclxuICAgKiB0aGVtIHdoZW4gZXhwb3NpbmcgYSBwYXJ0LlxyXG4gICAqL1xyXG4gIF9tYXBQYXJ0Rm9ybWF0dGluZygpIHtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLmxheW91dE1hbmFnZXI7XHJcbiAgICBsZXQgcmVwbGFjZWRUZXh0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi51cGRhdGVNZWFzdXJlRm9ybWF0c0ZvclBhcnQoKTtcclxuICAgICAgaWYgKHN0YWZmLnBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyAmJiAhcmVwbGFjZWRUZXh0KSB7XHJcbiAgICAgICAgY29uc3QgdGdhOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gICAgICAgIHJlcGxhY2VkVGV4dCA9IHRydWU7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8udGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZykgPT4ge1xyXG4gICAgICAgICAgdGdhLnB1c2godGcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2NvcmUudGV4dEdyb3VwcyA9IHRnYTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBzdGF2ZXMgaW4gdGhlIHNjb3JlIHRoYXQgYXJlIGRpc3BsYXllZC5cclxuICAqL1xyXG4gIHNldFZpZXcocm93czogVmlld01hcEVudHJ5W10pIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGFueSA9IHJvd3MuZmluZCgocm93KSA9PiByb3cuc2hvdyA9PT0gdHJ1ZSk7XHJcbiAgICBpZiAoIWFueSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuc2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKFxyXG4gICAgICB7IHNraXBTdGF2ZXM6IHRydWUsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiBmYWxzZSB9KSkpO1xyXG4gICAgY29uc3Qgc3RhZmZNYXAgPSBbXTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XHJcbiAgICAgIGlmIChyb3cuc2hvdykge1xyXG4gICAgICAgIGNvbnN0IHNyY1N0YXZlID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1tpXTtcclxuICAgICAgICBjb25zdCBqc29uT2JqID0gc3JjU3RhdmUuc2VyaWFsaXplKHsgc2tpcE1hcHM6IGZhbHNlLCBwcmVzZXJ2ZUlkczogdHJ1ZSB9KTtcclxuICAgICAgICBqc29uT2JqLnN0YWZmSWQgPSBzdGFmZk1hcC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgblN0YXZlID0gU21vU3lzdGVtU3RhZmYuZGVzZXJpYWxpemUoanNvbk9iaik7XHJcbiAgICAgICAgblN0YXZlLm1hcFN0YWZmRnJvbVRvKGksIG5zY29yZS5zdGF2ZXMubGVuZ3RoKTtcclxuICAgICAgICBuc2NvcmUuc3RhdmVzLnB1c2goblN0YXZlKTtcclxuICAgICAgICBpZiAoc3JjU3RhdmUua2V5U2lnbmF0dXJlTWFwKSB7XHJcbiAgICAgICAgICBuU3RhdmUua2V5U2lnbmF0dXJlTWFwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzcmNTdGF2ZS5rZXlTaWduYXR1cmVNYXApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgblN0YXZlLm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmU6IFNtb01lYXN1cmUsIGl4KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzcmNNZWFzdXJlID0gc3JjU3RhdmUubWVhc3VyZXNbaXhdO1xyXG4gICAgICAgICAgbWVhc3VyZS50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoc3JjTWVhc3VyZS50ZW1wby5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgICBtZWFzdXJlLnRpbWVTaWduYXR1cmUgPSBuZXcgVGltZVNpZ25hdHVyZShzcmNNZWFzdXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgICAgICAgbWVhc3VyZS5rZXlTaWduYXR1cmUgPSBzcmNNZWFzdXJlLmtleVNpZ25hdHVyZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzdGFmZk1hcC5wdXNoKGkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBuc2NvcmUubnVtYmVyU3RhdmVzKCk7XHJcbiAgICB0aGlzLnN0YWZmTWFwID0gc3RhZmZNYXA7XHJcbiAgICB0aGlzLnNjb3JlID0gbnNjb3JlO1xyXG4gICAgLy8gSW5kaWNhdGUgd2hpY2ggc2NvcmUgc3RhZmYgdmlldyBzdGF2ZXMgYXJlIG1hcHBlZCB0bywgdG8gZGVjaWRlIHRvIGRpc3BsYXlcclxuICAgIC8vIG1vZGlmaWVycy5cclxuICAgIHRoaXMuc2V0TWFwcGVkU3RhZmZJZHMoKTtcclxuICAgIC8vIFRPRE86IGFkZCBwYXJ0LXNwZWNpZmljIG1lYXN1cmUgZm9ybWF0dGluZywgZXRjLlxyXG4gICAgdGhpcy5fc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2NvcmUgPSBuc2NvcmU7XHJcbiAgICAvLyBJZiB0aGlzIGN1cnJlbnQgdmlldyBpcyBhIHBhcnQsIHNob3cgdGhlIHBhcnQgbGF5b3V0XHJcbiAgICBpZiAodGhpcy5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgdGhpcy5fbWFwUGFydEZvcm1hdHRpbmcoKTsgICAgICBcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgICAgU21vT3BlcmF0aW9uLmNvbXB1dGVNdWx0aXBhcnRSZXN0KG5zY29yZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmRpc3BsYXlDdWVzID0gc3RhZmYucGFydEluZm8uY3VlSW5TY29yZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoc2NvcmVDaGFuZ2VFdmVudCwgeyBkZXRhaWw6IHsgdmlldzogdGhpcyB9IH0pKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdmlldyBhbGwgdGhlIHN0YWZmcyBpbiBzY29yZSBtb2RlLlxyXG4gICAqL1xyXG4gIHZpZXdBbGwoKSB7XHJcbiAgICB0aGlzLnNjb3JlID0gU21vU2NvcmUuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zZXJpYWxpemUoeyBza2lwU3RhdmVzOiBmYWxzZSwgdXNlRGljdGlvbmFyeTogZmFsc2UsIHByZXNlcnZlU3RhZmZJZHM6IHRydWUgfSkpKTtcclxuICAgIHRoaXMuc3RhZmZNYXAgPSB0aGlzLmRlZmF1bHRTdGFmZk1hcDtcclxuICAgIHRoaXMuc2V0TWFwcGVkU3RhZmZJZHMoKTtcclxuICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICB0aGlzLnNjb3JlLnN5bmNocm9uaXplVGV4dEdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNjb3JlID0gdGhpcy5zY29yZTtcclxuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChzY29yZUNoYW5nZUV2ZW50LCB7IGRldGFpbDogeyB2aWV3OiB0aGlzIH0gfSkpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRWaWV3cG9ydCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgc2NvcmUgYmFzZWQgb24gdHJhbnNwb3NpbmcgZmxhZy5cclxuICAgKi9cclxuICBfc2V0VHJhbnNwb3NpbmcoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgIGNvbnN0IHhwb3NlID0gdGhpcy5zY29yZS5wcmVmZXJlbmNlcz8udHJhbnNwb3NpbmdTY29yZTtcclxuICAgICAgaWYgKHhwb3NlKSB7XHJcbiAgICAgICAgdGhpcy5zY29yZS5zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHZpZXcgYWZ0ZXIgbG9hZGluZyBvciByZXN0b3JpbmcgYSBjb21wbGV0ZWx5IG5ldyBzY29yZVxyXG4gICAqIEBwYXJhbSBzY29yZSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBjaGFuZ2VTY29yZShzY29yZTogU21vU2NvcmUpIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLnJlc2V0KCk7XHJcbiAgICBTdWlBdWRpb1BsYXllci5zdG9wUGxheWVyKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNjb3JlID0gc2NvcmU7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgc2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pKSk7XHJcbiAgICB0aGlzLnNjb3JlID0gc2NvcmU7XHJcbiAgICAvLyBJZiB0aGUgc2NvcmUgaXMgbm9uLXRyYW5zcG9zaW5nLCBoaWRlIHRoZSBpbnN0cnVtZW50IHhwb3NlIHNldHRpbmdzXHJcbiAgICB0aGlzLl9zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHRoaXMuZGVmYXVsdFN0YWZmTWFwO1xyXG4gICAgdGhpcy5zZXRNYXBwZWRTdGFmZklkcygpO1xyXG4gICAgdGhpcy5zY29yZS5zeW5jaHJvbml6ZVRleHRHcm91cHModGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMpO1xyXG4gICAgaWYgKHRoaXMuc3RvcmVTY29yZS5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgdGhpcy5leHBvc2VQYXJ0KHRoaXMuc2NvcmUuc3RhdmVzWzBdKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJ2ID0gYXdhaXQgdGhpcy5hd2FpdFJlbmRlcigpO1xyXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHNjb3JlQ2hhbmdlRXZlbnQsIHsgZGV0YWlsOiB7IHZpZXc6IHRoaXMgfSB9KSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2U6IG51bWJlcltdKSB7XHJcbiAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RhZmZJZCA9IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgICAgY29uc3QgYWx0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZihzdGFmZklkKV07XHJcbiAgICAgICAgaWYgKGFsdFN0YWZmKSB7XHJcbiAgICAgICAgICBzdGFmZi5zeW5jU3RhZmZNb2RpZmllcnMoaSwgYWx0U3RhZmYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBiYWNraW5nIHNjb3JlLCBhbmQgbWFwIGl0IHRvIHRoZSBzY29yZSBzdGF2ZS4gIHRoaXMuc2NvcmUgbWF5IGhhdmUgZmV3ZXIgc3RhdmVzXHJcbiAgICAgICAgLy8gdGhhbiB0aGlzLnN0b3JlU2NvcmVcclxuICAgICAgICBjb25zdCBzdmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YWZmLm1lYXN1cmVzW2ldLnN2ZykpO1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBVbmRvQnVmZmVyLnNlcmlhbGl6ZU1lYXN1cmUodGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLnN0YWZmTWFwW3N0YWZmSWRdXS5tZWFzdXJlc1tpXSk7XHJcbiAgICAgICAgc2VyaWFsaXplZC5tZWFzdXJlTnVtYmVyLnN0YWZmSWQgPSBzdGFmZklkO1xyXG4gICAgICAgIGNvbnN0IHhwb3NlID0gc2VyaWFsaXplZC50cmFuc3Bvc2VJbmRleCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IGNvbmNlcnRLZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KHNlcmlhbGl6ZWQua2V5U2lnbmF0dXJlID8/ICdjJywgLTEgKiB4cG9zZSk7XHJcbiAgICAgICAgc2VyaWFsaXplZC5rZXlTaWduYXR1cmUgPSBjb25jZXJ0S2V5O1xyXG4gICAgICAgIGNvbnN0IHJtZWFzdXJlID0gU21vTWVhc3VyZS5kZXNlcmlhbGl6ZShzZXJpYWxpemVkKTtcclxuICAgICAgICBybWVhc3VyZS5zdmcgPSBzdmc7XHJcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHRyYW5wb3NlZCBzY29yZSwgdGhlIGRpc3BsYXllZCBzY29yZSBuZWVkcyB0byBiZSBpbiAnQycuXHJcbiAgICAgICAgLy8gV2UgZG8gdGhpcyBzdGVwIGxhc3Qgc2luY2Ugc2VyaWFsaXplL3Vuc2VyaWFsaXplIHdvcmsgaW4gYSBwaXRjaCB0cmFuc3Bvc2VkXHJcbiAgICAgICAgLy8gZm9yIHRoZSBpbnN0cnVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuc2NvcmUucHJlZmVyZW5jZXMudHJhbnNwb3NpbmdTY29yZSAmJiAhdGhpcy5zY29yZS5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgICAgIHJtZWFzdXJlLnRyYW5zcG9zZVRvT2Zmc2V0KC0xICogeHBvc2UsICdjJyk7XHJcbiAgICAgICAgICBybWVhc3VyZS5rZXlTaWduYXR1cmUgPSAnYyc7XHJcbiAgICAgICAgICBybWVhc3VyZS50cmFuc3Bvc2VJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yOiBTbW9TZWxlY3RvciA9IHsgc3RhZmY6IHN0YWZmSWQsIG1lYXN1cmU6IGksIHZvaWNlOiAwLCB0aWNrOiAwLCBwaXRjaGVzOiBbXSB9O1xyXG4gICAgICAgIHRoaXMuc2NvcmUucmVwbGFjZU1lYXN1cmUoc2VsZWN0b3IsIHJtZWFzdXJlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ29sdW1uVG9SZXBsYWNlUXVldWUoaSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGZvciB0aGUgdmlldyBzY29yZSwgdGhlIHJlbmRlcmVyIGRlY2lkZXMgd2hhdCB0byByZW5kZXJcclxuICAgKiBkZXBlbmRpbmcgb24gd2hhdCBpcyB1bmRvbmUuXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdW5kbygpIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlci5zY29yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICghdGhpcy5zdG9yZVVuZG8uYnVmZmVyc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0YWZmTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgICBjb25zdCBpZGVudGl0eU1hcDogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xyXG4gICAgdGhpcy5kZWZhdWx0U3RhZmZNYXAuZm9yRWFjaCgobm4pID0+IGlkZW50aXR5TWFwW25uXSA9IG5uKTtcclxuICAgIHRoaXMuc3RhZmZNYXAuZm9yRWFjaCgobW0sIGl4KSA9PiBzdGFmZk1hcFttbV0gPSBpeCk7XHJcbiAgICAvLyBBIHNjb3JlLWxldmVsIHVuZG8gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZSBzY29yZS5cclxuICAgIGNvbnN0IGZ1bGxTY29yZSA9IHRoaXMuc3RvcmVVbmRvLnVuZG9TY29yZVBlZWsoKTtcclxuICAgIC8vIHRleHQgdW5kbyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IHNpbmNlIHRoZXJlIGlzIHVzdWFsbHkgbm90XHJcbiAgICAvLyBhbiBhc3NvY2lhdGVkIG1lYXN1cmUuXHJcbiAgICBjb25zdCBzY29yZVRleHQgPSB0aGlzLnN0b3JlVW5kby51bmRvU2NvcmVUZXh0R3JvdXBQZWVrKCk7XHJcbiAgICBjb25zdCBwYXJ0VGV4dCA9IHRoaXMuc3RvcmVVbmRvLnVuZG9QYXJ0VGV4dEdyb3VwUGVlaygpO1xyXG4gICAgaWYgKHNjb3JlVGV4dCB8fCBwYXJ0VGV4dCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVucmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZVJhbmdlID0gdGhpcy5zdG9yZVVuZG8uZ2V0TWVhc3VyZVJhbmdlKCk7XHJcbiAgICBpZiAoIShmdWxsU2NvcmUgfHwgc2NvcmVUZXh0IHx8IHBhcnRUZXh0KSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlckNvbHVtbih0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVTY29yZSA9IHRoaXMuc3RvcmVVbmRvLnVuZG8odGhpcy5zdG9yZVNjb3JlLCBpZGVudGl0eU1hcCwgdHJ1ZSk7XHJcbiAgICBpZiAoZnVsbFNjb3JlKSB7XHJcbiAgICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIH0gZWxzZSBpZiAocGFydFRleHQpIHtcclxuICAgICAgdGhpcy5zZXRWaWV3KHRoaXMuZ2V0VmlldygpKTtcclxuICAgIH0gZWxzZSBpZiAoc2NvcmVUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVwbGFjZU1lYXN1cmVWaWV3KG1lYXN1cmVSYW5nZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/sui/scoreView.ts\n");
329
329
 
330
330
  /***/ }),
331
331
 
@@ -446,7 +446,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
446
446
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
447
447
 
448
448
  "use strict";
449
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n vexNote.setStyle({ fillStyle: \"#115511\" });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3ZleC92eE1lYXN1cmUudHM/Y2MxMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLy8gIyMgRGVzY3JpcHRpb246XHJcbi8vIFRoaXMgZmlsZSBjYWxscyB0aGUgdmV4ZmxvdyByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IHJlbmRlciBhXHJcbi8vIG1lYXN1cmUgb2YgbXVzaWMuICBJZiBtdWx0aXBsZSBtZWFzdXJlcyBhcmUganVzdGlmaWVkIGluIGFcclxuLy8gY29sdW1uLCB0aGUgcmVuZGVyaW5nIGlzIGRlZmVycmVkIHVudGlsIGFsbCB0aGUgbWVhc3VyZXMgaGF2ZSBiZWVuXHJcbi8vIHByZWZvcm1hdHRlZC5cclxuaW1wb3J0IHsgU21vTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTbW9SZXBlYXRTeW1ib2wsIFNtb01lYXN1cmVUZXh0LCBTbW9CYXJsaW5lLCBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLCBTbW9SZWhlYXJzYWxNYXJrIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNvdXJjZVNlcmlmUHJvRm9udCB9IGZyb20gJy4uLy4uL3N0eWxlcy9mb250X21ldHJpY3Mvc3NwLXNlcmlmLW1ldHJpY3MnO1xyXG5pbXBvcnQgeyBTbW9Pcm5hbWVudCwgU21vQXJ0aWN1bGF0aW9uLCBTbW9EeW5hbWljVGV4dCwgU21vTHlyaWMsIFxyXG4gIFNtb0FycGVnZ2lvLCBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBWZXhBbm5vdGF0aW9uUGFyYW1zLCBTbW9UYWJOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSwgTWVhc3VyZVRpY2ttYXBzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuLi9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IENsZWYsIElzQ2xlZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN2Z1BhZ2UgfSBmcm9tICcuLi9zdWkvc3ZnUGFnZU1hcCc7XHJcbmltcG9ydCB7IFNtb1RhYlN0YXZlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyB0b1ZleEJhcmxpbmVUeXBlLCB2ZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVBvc2l0aW9uLCB0b1ZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhTeW1ib2wsXHJcbiAgdG9WZXhUZXh0SnVzdGlmaWNhdGlvbiwgdG9WZXhUZXh0UG9zaXRpb24sIGdldFZleENob3JkQmxvY2tzLCB0b1ZleFN0ZW1EaXJlY3Rpb24sXHJcbiAgVmV4VGFiTm90ZVBvc2l0aW9ucyB9IGZyb20gJy4vc21vQWRhcHRlcic7XHJcbmltcG9ydCB7IFZleEZsb3csIFN0YXZlLFN0ZW1tYWJsZU5vdGUsIE5vdGUsIEJlYW0sIFR1cGxldCwgVm9pY2UsXHJcbiAgRm9ybWF0dGVyLCBBY2NpZGVudGFsLCBBbm5vdGF0aW9uLCBTdGF2ZU5vdGVTdHJ1Y3QsIFN0YXZlVGV4dCwgU3RhdmVNb2RpZmllcixcclxuICBjcmVhdGVTdGF2ZVRleHQsIHJlbmRlckR5bmFtaWNzLCBhcHBseVN0ZW1EaXJlY3Rpb24sXHJcbiAgZ2V0VmV4Tm90ZVBhcmFtZXRlcnMsIGRlZmF1bHROb3RlU2NhbGUsIGRlZmF1bHRDdWVTY2FsZSwgZ2V0VmV4VHVwbGV0cyxcclxuICBjcmVhdGVTdGF2ZSwgY3JlYXRlVm9pY2UsIGdldE9ybmFtZW50R2x5cGgsIGdldFNsYXNoR2x5cGgsIGdldFJlcGVhdEJhciwgZ2V0TXVsdGltZWFzdXJlUmVzdCxcclxuICBjcmVhdGVUZXh0Tm90ZSwgVGFiU3RhdmUsIGNyZWF0ZVRhYlN0YXZlLCBUYWJOb3RlUG9zaXRpb24sIFRhYk5vdGVTdHJ1Y3QsXHJcbiAgQ3JlYXRlVmV4Tm90ZVBhcmFtcywgVGFiTm90ZSwgUGVkYWxNYXJraW5nXHJcbiAgIH0gZnJvbSAnLi4vLi4vY29tbW9uL3ZleCc7XHJcblxyXG5pbXBvcnQgeyBWeE1lYXN1cmVJZiwgVmV4Tm90ZU1vZGlmaWVySWYsIFZ4Tm90ZSB9IGZyb20gJy4vdnhOb3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0IH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvdHVwbGV0JztcclxuaW1wb3J0IHsgdmV4R2x5cGggfSBmcm9tICcuL2dseXBoRGltZW5zaW9ucyc7XHJcbmNvbnN0IFZGID0gVmV4RmxvdztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLy8gY29uc3QgVkYgPSBldmFsKCdWZXguRmxvdycpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgVmV4RmxvdyBsaWJyYXJ5IHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgZW5ncmF2aW5nLlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVnhNZWFzdXJlIGltcGxlbWVudHMgVnhNZWFzdXJlSWYge1xyXG4gIGNvbnRleHQ6IFN2Z1BhZ2U7XHJcbiAgcHJpbnRpbmc6IGJvb2xlYW47XHJcbiAgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb247XHJcbiAgc29mdG1heDogbnVtYmVyO1xyXG4gIHNtb01lYXN1cmU6IFNtb01lYXN1cmU7XHJcbiAgc21vVGFiU3RhdmU/OiBTbW9UYWJTdGF2ZTtcclxuICB0YWJTdGF2ZT86IFRhYlN0YXZlO1xyXG4gIHJlbmRlcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm90ZVRvVmV4TWFwOiBSZWNvcmQ8c3RyaW5nLCBOb3RlPiA9IHt9O1xyXG4gIGJlYW1Ub1ZleE1hcDogUmVjb3JkPHN0cmluZywgQmVhbT4gPSB7fTtcclxuICB0dXBsZXRUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgVHVwbGV0PiA9IHt9O1xyXG4gIG11bHRpbWVhc3VyZVJlc3Q6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIHZleE5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2ZXhCZWFtR3JvdXBzOiBCZWFtW10gPSBbXTtcclxuICB2ZXhUdXBsZXRzOiBUdXBsZXRbXSA9IFtdO1xyXG4gIHRpY2ttYXBPYmplY3Q6IE1lYXN1cmVUaWNrbWFwcyB8IG51bGwgPSBudWxsO1xyXG4gIHN0YXZlOiBTdGF2ZSB8IG51bGwgPSBudWxsOyAvLyB2ZXggc3RhdmVcclxuICB2b2ljZU5vdGVzOiBOb3RlW10gPSBbXTsgLy8gbm90ZXMgZm9yIGN1cnJlbnQgdm9pY2UsIGFzIHJlbmRlcmluZ1xyXG4gIHRhYk5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2b2ljZUFyOiBWb2ljZVtdID0gW107XHJcbiAgdGFiVm9pY2U6IFZvaWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgZm9ybWF0dGVyOiBGb3JtYXR0ZXIgfCBudWxsID0gbnVsbDtcclxuICBhbGxDdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbW9kaWZpZXJzVG9Cb3g6IFNtb05vdGVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gIGNvbGxpc2lvbk1hcDogUmVjb3JkPG51bWJlciwgU21vTm90ZVtdPiA9IHt9O1xyXG4gIGRiZ0xlZnRYOiBudW1iZXIgPSAwO1xyXG4gIGRiZ1dpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdmdQYWdlLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgcHJpbnRpbmc6IGJvb2xlYW4sIHNvZnRtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xyXG4gICAgdGhpcy5zbW9NZWFzdXJlID0gdGhpcy5zZWxlY3Rpb24ubWVhc3VyZTtcclxuICAgIHRoaXMucHJpbnRpbmcgPSBwcmludGluZztcclxuICAgIHRoaXMuYWxsQ3VlcyA9IHNlbGVjdGlvbi5zdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcztcclxuICAgIHRoaXMudHVwbGV0VG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy52ZXhCZWFtR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmJlYW1Ub1ZleE1hcCA9IHt9O1xyXG4gICAgdGhpcy5zb2Z0bWF4ID0gc29mdG1heDtcclxuICAgIHRoaXMuc21vVGFiU3RhdmUgPSBzZWxlY3Rpb24uc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKHNlbGVjdGlvbi5zZWxlY3Rvcik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IGZpbGxTdHlsZSgpIHtcclxuICAgIHJldHVybiAnIzAwMCc7XHJcbiAgfVxyXG4gIC8vIFRyZWF0IGEgcmVzdCBsaWtlIGEgd2hvbGUgcmVzdCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJlc3QgaW4gdGhlIG1lYXN1cmVcclxuICAvLyBhbmQgdGhlIG1lYXN1cmUgbGVuZ3RoIGlzIG5vdCBhIHBpY2t1cFxyXG4gIGlzV2hvbGVSZXN0KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzWzBdLmlzUmVzdCgpICYmXHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5nZXRNYXhUaWNrc1ZvaWNlKCkgPiA0MDk2XHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBpZiAoIXRoaXMudGlja21hcE9iamVjdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0bSA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRtLmR1cmF0aW9uTWFwLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXS5wdXNoKHRoaXMuc21vTWVhc3VyZS52b2ljZXNbaV0ubm90ZXNbal0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQ29sbGlzaW9uKHZvaWNlSXg6IG51bWJlciwgdGlja0l4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBrID0gMDtcclxuICAgIGxldCBzdGFmZkxpbmVzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGljayA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1t2b2ljZUl4XS5kdXJhdGlvbk1hcFt0aWNrSXhdO1xyXG4gICAgLy8gSnVzdCBvbmUgbm90ZSwgbm8gY29sbGlzaW9uXHJcbiAgICBpZiAodGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbm90ZS5waXRjaGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgY2xlZjogQ2xlZiA9IElzQ2xlZihub3RlLmNsZWYpID8gbm90ZS5jbGVmIDogJ3RyZWJsZSc7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBub3RlLnBpdGNoZXNbal07XHJcbiAgICAgICAgY29uc3QgY3VyTGluZSA9IFNtb011c2ljLnBpdGNoVG9TdGFmZkxpbmUoY2xlZiwgcGl0Y2gpO1xyXG4gICAgICAgIGZvciAoayA9IDA7ayA8IHN0YWZmTGluZXMubGVuZ3RoOyArK2spIHtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXJMaW5lIC0gc3RhZmZMaW5lc1trXSkgPCAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFmZkxpbmVzLnB1c2goY3VyTGluZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgYSBzbW9Ob3RlIGludG8gYSB2eE5vdGUgc28gaXQgY2FuIGJlIHJhc3Rlcml6ZWRcclxuICAgKiBAcGFyYW0gc21vTm90ZSBcclxuICAgKiBAcGFyYW0gdGlja0luZGV4IC0gdXNlZCB0byBjYWxjdWxhdGUgYWNjaWRlbnRhbFxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGUoc21vTm90ZTogU21vTm90ZSwgdGlja0luZGV4OiBudW1iZXIsIHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IHZleE5vdGU6IE5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzbW9UYWJOb3RlOiBTbW9UYWJOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICBjb25zdCBzdGVtVGlja3MgPSBTbW9NdXNpYy50aWNrc1RvRHVyYXRpb25bc21vTm90ZS5zdGVtVGlja3NdO1xyXG4gICAgbGV0IHRhYk5vdGU6IFN0ZW1tYWJsZU5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGNvbnN0IG5vdGVIZWFkID0gc21vTm90ZS5pc1Jlc3QoKSA/ICdyJyA6IHNtb05vdGUubm90ZUhlYWQ7XHJcbiAgICBjb25zdCBrZXlzID0gU21vTXVzaWMuc21vUGl0Y2hlc1RvVmV4S2V5cyhzbW9Ob3RlLnBpdGNoZXMsIDAsIG5vdGVIZWFkKTtcclxuICAgIGNvbnN0IHNtb05vdGVQYXJhbXMgPSB7XHJcbiAgICAgIGlzVHVwbGV0OiBzbW9Ob3RlLmlzVHVwbGV0LFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCxcclxuICAgICAgY2xlZjogc21vTm90ZS5jbGVmLFxyXG4gICAgICBzdGVtVGlja3MsXHJcbiAgICAgIGtleXMsXHJcbiAgICAgIG5vdGVUeXBlOiBzbW9Ob3RlLm5vdGVUeXBlXHJcbiAgICB9O1xyXG4gICAgY29uc3QgeyBub3RlUGFyYW1zLCBkdXJhdGlvbiB9ID0gZ2V0VmV4Tm90ZVBhcmFtZXRlcnMoc21vTm90ZVBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy50YWJTdGF2ZSAmJiB0aGlzLnNtb1RhYlN0YXZlKSB7XHJcbiAgICAgIHNtb1RhYk5vdGUgPSB0aGlzLnNtb1RhYlN0YXZlLmdldFRhYk5vdGVGcm9tTm90ZShzbW9Ob3RlLCB0aGlzLnNtb01lYXN1cmUudHJhbnNwb3NlSW5kZXgpO1xyXG4gICAgICBpZiAoc21vVGFiTm90ZSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uczogVGFiTm90ZVBvc2l0aW9uW10gPSBWZXhUYWJOb3RlUG9zaXRpb25zKHRoaXMuc21vVGFiU3RhdmUsIHNtb1RhYk5vdGUsIHNtb05vdGUpO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAoIXNtb05vdGUuaXNSZXN0KCkpIHtcclxuICAgICAgICAgICAgdGFiTm90ZSA9IG5ldyBWRi5UYWJOb3RlKHsgcG9zaXRpb25zLCBkdXJhdGlvbjogZHVyYXRpb24gfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNtb1RhYlN0YXZlLnNob3dTdGVtcykge1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19zdGVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfZG90cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X3N0ZW1fdGhyb3VnaF9zdGF2ZSA9IHNtb1RhYk5vdGUuZmxhZ1Rocm91Z2g7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhYk5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNtb05vdGUubm90ZVR5cGUgPT09ICcvJykge1xyXG4gICAgICAvLyB2ZXhOb3RlID0gbmV3IFZGLkdseXBoTm90ZSgnXFx1RTUwNCcsIHsgZHVyYXRpb24gfSk7XHJcbiAgICAgIHZleE5vdGUgPSBnZXRTbGFzaEdseXBoKCk7XHJcbiAgICAgIHNtb05vdGUucmVuZGVySWQgPSAndmYtJyArIHZleE5vdGUuZ2V0QXR0cmlidXRlKCdpZCcpOyAvLyB3aGVyZSBkb2VzICd2ZicgY29tZSBmcm9tP1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc21vVmV4U3RlbVBhcmFtcyA9IHtcclxuICAgICAgICB2b2ljZUNvdW50OiB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCxcclxuICAgICAgICB2b2ljZUl4LFxyXG4gICAgICAgIGlzQXV0bzogc21vTm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvLFxyXG4gICAgICAgIGlzVXA6IHNtb05vdGUuZmxhZ1N0YXRlID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMudXBcclxuICAgICAgfVxyXG4gICAgICBhcHBseVN0ZW1EaXJlY3Rpb24oc21vVmV4U3RlbVBhcmFtcywgbm90ZVBhcmFtcyk7XHJcbiAgICAgIGlmIChzbW9UYWJOb3RlICYmIHRhYk5vdGUpIHtcclxuICAgICAgICB0YWJOb3RlLnNldFN0ZW1EaXJlY3Rpb24obm90ZVBhcmFtcy5zdGVtX2RpcmVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEEsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICAgICAgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICAgIHZleE5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICBpZiAodm9pY2VJeCA+IDAgJiYgdGhpcy5pc0NvbGxpc2lvbih2b2ljZUl4LCB0aWNrSW5kZXgpKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRYU2hpZnQoLTEwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pc1dob2xlUmVzdCgpKSB7XHJcbiAgICAgICAgbm90ZVBhcmFtcy5kdXJhdGlvbiA9ICd3cic7XHJcbiAgICAgICAgdmV4Tm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRDZW50ZXJBbGlnbm1lbnQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEIsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICAgICAgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICAgIGlmIChzbW9Ob3RlLmZpbGxTdHlsZSAmJiAhdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IHNtb05vdGUuZmlsbFN0eWxlIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHZvaWNlSXggPiAwICYmICF0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogXCIjMTE1NTExXCIgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc21vTm90ZS5pc0hpZGRlbigpICYmIHRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBcIiNmZmZmZmYwMFwiIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHNtb05vdGUucmVuZGVySWQgPSAndmYtJyArIHZleE5vdGUuZ2V0QXR0cmlidXRlKCdpZCcpOyAvLyB3aGVyZSBkb2VzICd2ZicgY29tZSBmcm9tP1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm90ZURhdGE6IFZleE5vdGVNb2RpZmllcklmID0ge1xyXG4gICAgICBzbW9NZWFzdXJlOiB0aGlzLnNtb01lYXN1cmUsXHJcbiAgICAgIHZ4TWVhc3VyZTogdGhpcyxcclxuICAgICAgc21vTm90ZTogc21vTm90ZSxcclxuICAgICAgc3RhdmVOb3RlOiB2ZXhOb3RlLFxyXG4gICAgICB2b2ljZUluZGV4OiB2b2ljZUl4LFxyXG4gICAgICB0aWNrSW5kZXg6IHRpY2tJbmRleFxyXG4gICAgfVxyXG4gICAgaWYgKHRhYk5vdGUpIHtcclxuICAgICAgbm90ZURhdGEudGFiTm90ZSA9IHRhYk5vdGU7XHJcbiAgICAgIHRoaXMudGFiTm90ZXMucHVzaCh0YWJOb3RlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vZE9iaiA9IG5ldyBWeE5vdGUobm90ZURhdGEpO1xyXG4gICAgbW9kT2JqLmFkZE1vZGlmaWVycygpO1xyXG4gICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEMsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICByZXR1cm4gbW9kT2JqO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm90ZUdseXBoKHNtb05vdGU6IFNtb05vdGUsIHRleHRPYmo6IFNtb0R5bmFtaWNUZXh0KSB7XHJcbiAgICB2YXIgeCA9IHRoaXMubm90ZVRvVmV4TWFwW3Ntb05vdGUuYXR0cnMuaWRdLmdldEFic29sdXRlWCgpICsgdGV4dE9iai54T2Zmc2V0O1xyXG4gICAgLy8gdGhlIC0zIGlzIGNvcGllZCBmcm9tIHZleGZsb3cgdGV4dER5bmFtaWNzXHJcbiAgICB2YXIgeSA9IHRoaXMuc3RhdmUhLmdldFlGb3JMaW5lKHRleHRPYmoueU9mZnNldExpbmUgLSAzKSArIHRleHRPYmoueU9mZnNldFBpeGVscztcclxuICAgIGxldCBtYXhoID0gMDtcclxuICAgIGNvbnN0IG1pbnggPSB4O1xyXG4gICAgdmFyIGdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKTtcclxuICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGV4dE9iai5hdHRycy5pZCArICctJyArIHNtb05vdGUuYXR0cnMuaWQpO1xyXG4gICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCh0ZXh0T2JqLmF0dHJzLmlkKTtcclxuICAgIC8vIGNvbnN0IGR1cmF0aW9uID0gU21vTXVzaWMuY2xvc2VzdFZleER1cmF0aW9uKHNtb05vdGUudGlja0NvdW50KTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dE9iai50ZXh0Lmxlbmd0aDsgaSArPSAxICkge1xyXG4gICAgICBjb25zdCB7IHdpZHRoICwgaGVpZ2h0IH0gPSByZW5kZXJEeW5hbWljcyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCBWRi5UZXh0RHluYW1pY3MuR0xZUEhTW3RleHRPYmoudGV4dFtpXV0uY29kZSxcclxuICAgICAgICB0ZXh0T2JqLmZvbnRTaXplLCB4LCB5KTtcclxuICAgICAgLyogY29uc3QgeyB3aWR0aCAsIGhlaWdodCB9ID0gcmVuZGVyRHluYW1pY3ModGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgVkYuVGV4dER5bmFtaWNzLkdMWVBIU1t0ZXh0T2JqLnRleHRbaV1dLFxyXG4gICAgICAgIHRleHRPYmouZm9udFNpemUsIHgsIHkpOyAqL1xyXG4gICAgICB4ICs9IHdpZHRoO1xyXG4gICAgICBtYXhoID0gTWF0aC5tYXgoaGVpZ2h0LCBtYXhoKTsgICAgICBcclxuICAgIH1cclxuICAgIHRleHRPYmoubG9naWNhbEJveCA9IFN2Z0hlbHBlcnMuYm94UG9pbnRzKG1pbngsIHkgKyB0aGlzLmNvbnRleHQuYm94LnksIHggLSBtaW54LCBtYXhoKTtcclxuICAgIHRleHRPYmouZWxlbWVudCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RpZmllcnNUb0JveC5wdXNoKHRleHRPYmopO1xyXG4gICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJEeW5hbWljcygpIHtcclxuICAgIHRoaXMuc21vTWVhc3VyZS52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgoc21vTm90ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHMgPSBzbW9Ob3RlLnRleHRNb2RpZmllcnMuZmlsdGVyKChtb2QpID0+XHJcbiAgICAgICAgICBtb2QuYXR0cnMudHlwZSA9PT0gJ1Ntb0R5bmFtaWNUZXh0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbW9kcy5mb3JFYWNoKChidG0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRtID0gYnRtIGFzIFNtb0R5bmFtaWNUZXh0O1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJOb3RlR2x5cGgoc21vTm90ZSwgdG0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBjcmVhdGVSZXBlYXRTeW1ib2woKSB7XHJcbiAgICB0aGlzLnZvaWNlTm90ZXMgPSBbXTtcclxuICAgIC8vIGNvbnN0IHZleE5vdGUgPSBuZXcgVkYuR2x5cGhOb3RlKCdcXHVFNTAwJywgeyBkdXJhdGlvbjogJ3cnIH0sIHsgbGluZTogMiB9KTtcclxuICAgIGNvbnN0IHZleE5vdGUgPSBnZXRSZXBlYXRCYXIoKTtcclxuICAgIHZleE5vdGUuc2V0Q2VudGVyQWxpZ25tZW50KHRydWUpO1xyXG4gICAgdGhpcy52ZXhOb3Rlcy5wdXNoKHZleE5vdGUpO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSBhbiBhIGFycmF5IG9mIFZGLlN0YXZlTm90ZSBvYmplY3RzIHRvIHJlbmRlciB0aGUgYWN0aXZlIHZvaWNlLlxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGVzKHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzID0gW107XHJcbiAgICBjb25zdCB2b2ljZSA9IHRoaXMuc21vTWVhc3VyZS52b2ljZXNbdm9pY2VJeF07XHJcbiAgICBsZXQgY2xlZk5vdGVBZGRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAoaSA9IDA7XHJcbiAgICAgIGkgPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbaV07XHJcbiAgICAgIGNvbnN0IHRleHROb3RlcyA9IHNtb05vdGUuZ2V0VGV4dE9ybmFtZW50cygpO1xyXG4gICAgICBjb25zdCB2ZXhOb3RlID0gdGhpcy5jcmVhdGVWZXhOb3RlKHNtb05vdGUsIGksIHZvaWNlSXgpO1xyXG4gICAgICB0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSA9IHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlO1xyXG4gICAgICB0aGlzLnZleE5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG5cclxuICAgICAgaWYgKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZSAmJiAhY2xlZk5vdGVBZGRlZCkge1xyXG4gICAgICAgIGNvbnN0IGNmID0gbmV3IFZGLkNsZWZOb3RlKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZS5jbGVmLCAnc21hbGwnKTtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjZik7XHJcbiAgICAgICAgY2xlZk5vdGVBZGRlZCA9IHRydWU7IC8vIGlnbm9yZSAybmQgaW4gYSBtZWFzdXJlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG4gICAgICB0ZXh0Tm90ZXMuZm9yRWFjaCgodG4pID0+IHtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjcmVhdGVUZXh0Tm90ZShTbW9Pcm5hbWVudC50ZXh0Tm90ZU9ybmFtZW50c1t0bi5vcm5hbWVudF0pKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc05hTihzbW9Ob3RlLnRpY2tzLm51bWVyYXRvcikgfHwgaXNOYU4oc21vTm90ZS50aWNrcy5kZW5vbWluYXRvcilcclxuICAgICAgICB8fCBpc05hTihzbW9Ob3RlLnRpY2tzLnJlbWFpbmRlcikpIHtcclxuICAgICAgICB0aHJvdyAoJ3Z4TWVhc3VyZTogTmFOIGluIHRpY2tzJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdyb3VwIHRoZSBub3RlcyBmb3IgYmVhbWluZyBhbmQgY3JlYXRlIFZleCBiZWFtIG9iamVjdHNcclxuICAgKiBAcGFyYW0gdml4IC0gdm9pY2UgaW5kZXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjcmVhdGVWZXhCZWFtR3JvdXBzKHZpeDogbnVtYmVyKSB7XHJcbiAgICBsZXQga2V5Tm90ZUl4ID0gLTE7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgc3RlbURpcmVjdGlvbiA9IFZGLlN0ZW0uRE9XTjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUuYmVhbUdyb3Vwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBiZyA9IHRoaXMuc21vTWVhc3VyZS5iZWFtR3JvdXBzW2ldO1xyXG4gICAgICBpZiAoYmcudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZleE5vdGVzOiBTdGVtbWFibGVOb3RlW10gPSBbXTtcclxuICAgICAga2V5Tm90ZUl4ID0gYmcubm90ZXMuZmluZEluZGV4KChubikgPT4gbm4ubm90ZVR5cGUgPT09ICduJyk7XHJcblxyXG4gICAgICAvLyBGaXggc3RlbSBidWc6IGtleSBvZmYgZmlyc3Qgbm9uLXJlc3Qgbm90ZS5cclxuICAgICAga2V5Tm90ZUl4ID0gKGtleU5vdGVJeCA+PSAwKSA/IGtleU5vdGVJeCA6IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBiZy5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSBiZy5ub3Rlc1tqXTtcclxuICAgICAgICBpZiAobm90ZS5ub3RlVHlwZSA9PT0gJy8nKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4Tm90ZSA9IHRoaXMubm90ZVRvVmV4TWFwW25vdGUuYXR0cnMuaWRdO1xyXG4gICAgICAgIC8vIHNvbWUgdHlwZSBvZiByZWRyYXcgY29uZGl0aW9uP1xyXG4gICAgICAgIGlmICghKHZleE5vdGUgaW5zdGFuY2VvZiBWRi5TdGF2ZU5vdGUgfHwgdmV4Tm90ZSBpbnN0YW5jZW9mIFZGLkdyYWNlTm90ZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vdGUudGlja0NvdW50ID49IDQwOTYgfHwgdmV4Tm90ZS5nZXRJbnRyaW5zaWNUaWNrcygpID49IDQwOTYpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignYmFkIGxlbmd0aCBpbiBiZWFtIGdyb3VwJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChrZXlOb3RlSXggPT09IGopIHtcclxuICAgICAgICAgIHN0ZW1EaXJlY3Rpb24gPSBub3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8gP1xyXG4gICAgICAgICAgICB2ZXhOb3RlLmdldFN0ZW1EaXJlY3Rpb24oKSA6IHRvVmV4U3RlbURpcmVjdGlvbihub3RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdGVtRGlyZWN0aW9uKHN0ZW1EaXJlY3Rpb24pO1xyXG4gICAgICAgIHZleE5vdGVzLnB1c2godmV4Tm90ZSk7ICBcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2ZXhCZWFtID0gbmV3IFZGLkJlYW0odmV4Tm90ZXMpO1xyXG4gICAgICB0aGlzLmJlYW1Ub1ZleE1hcFtiZy5hdHRycy5pZF0gPSB2ZXhCZWFtO1xyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMucHVzaCh2ZXhCZWFtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZVZleFR1cGxldHModml4OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmV4VHVwbGV0cyA9IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUb1ZleE1hcCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUudHVwbGV0VHJlZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IHRoaXMuc21vTWVhc3VyZS50dXBsZXRUcmVlc1tpXTtcclxuICAgICAgaWYgKHR1cGxldFRyZWUudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyYXZlcnNlVHVwbGV0VHJlZSA9ICggcGFyZW50VHVwbGV0OiBTbW9UdXBsZXQpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCB2ZXhOb3RlcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHNtb05vdGUgb2YgdGhpcy5zbW9NZWFzdXJlLnR1cGxldE5vdGVzKHBhcmVudFR1cGxldCkpIHtcclxuICAgICAgICAgIHZleE5vdGVzLnB1c2godGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGVtRGlyZWN0aW9uRm9yVHVwbGV0KHBhcmVudFR1cGxldCkgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy51cCA/XHJcbiAgICAgICAgICBWRi5UdXBsZXQuTE9DQVRJT05fVE9QIDogVkYuVHVwbGV0LkxPQ0FUSU9OX0JPVFRPTTtcclxuICAgICAgICBjb25zdCBzbW9UdXBsZXRQYXJhbXMgPSB7XHJcbiAgICAgICAgICB2ZXhOb3RlcyxcclxuICAgICAgICAgIG51bU5vdGVzOiBwYXJlbnRUdXBsZXQubnVtTm90ZXMsXHJcbiAgICAgICAgICBub3Rlc09jY3VwaWVkOiBwYXJlbnRUdXBsZXQubm90ZXNPY2N1cGllZCxcclxuICAgICAgICAgIHJhdGlvZWQ6IHBhcmVudFR1cGxldC5yYXRpb2VkLFxyXG4gICAgICAgICAgYnJhY2tldGVkOiBwYXJlbnRUdXBsZXQuYnJhY2tldGVkLFxyXG4gICAgICAgICAgbG9jYXRpb25cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4VHVwbGV0ID0gZ2V0VmV4VHVwbGV0cyhzbW9UdXBsZXRQYXJhbXMpO1xyXG5cclxuICAgICAgICB0aGlzLnR1cGxldFRvVmV4TWFwW3BhcmVudFR1cGxldC5hdHRycy5pZF0gPSB2ZXhUdXBsZXQ7XHJcbiAgICAgICAgdGhpcy52ZXhUdXBsZXRzLnB1c2godmV4VHVwbGV0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHR1cGxldCA9IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHNbaV07XHJcbiAgICAgICAgICB0cmF2ZXJzZVR1cGxldFRyZWUodHVwbGV0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdHJhdmVyc2VUdXBsZXRUcmVlKHR1cGxldFRyZWUudHVwbGV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSB0aGUgbW9kaWZpZXJzIGZvciB0aGUgc3RhdmUgaXRzZWxmLCBiYXIgbGluZXMgZXRjLlxyXG4gICAqL1xyXG4gIGNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKSB7XHJcbiAgICBjb25zdCBzYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGFydEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IGViID0gdGhpcy5zbW9NZWFzdXJlLmdldEVuZEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IHN5bSA9IHRoaXMuc21vTWVhc3VyZS5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmICghdGhpcy5zdGF2ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZG9uJ3QgY3JlYXRlIGEgYmVnaW4gYmFyIGZvciBhbnkgYnV0IHRoZSAxc3QgbWVhc3VyZS5cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5zeXN0ZW1JbmRleCAhPT0gMCAmJiBzYi5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgICAmJiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgPT09IDApIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRCZWdCYXJUeXBlKFZGLkJhcmxpbmUudHlwZS5OT05FKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0QmVnQmFyVHlwZSh0b1ZleEJhcmxpbmVUeXBlKHNiKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwICYmICF0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVNdWx0aW1lYXN1cmUpIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRFbmRCYXJUeXBlKHZleEJhcmxpbmVUeXBlW3RoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlRW5kQmFybGluZV0pO1xyXG4gICAgfSBlbHNlIGlmIChlYi5iYXJsaW5lICE9PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEVuZEJhclR5cGUodG9WZXhCYXJsaW5lVHlwZShlYikpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN5bSAmJiBzeW0uc3ltYm9sICE9PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9scy5Ob25lKSB7XHJcbiAgICAgIGNvbnN0IHJlcCA9IG5ldyBWRi5SZXBldGl0aW9uKHRvVmV4U3ltYm9sKHN5bSksIHN5bS54T2Zmc2V0ICsgdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCwgc3ltLnlPZmZzZXQpO1xyXG4gICAgICB0aGlzLnN0YXZlLmdldE1vZGlmaWVycygpLnB1c2gocmVwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRtcyA9IHRoaXMuc21vTWVhc3VyZS5nZXRNZWFzdXJlVGV4dCgpO1xyXG4gICAgLy8gVE9ETzogc2V0IGZvbnRcclxuICAgIHRtcy5mb3JFYWNoKCh0bWI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpID0+IHtcclxuICAgICAgY29uc3QgdG0gPSB0bWIgYXMgU21vTWVhc3VyZVRleHQ7XHJcbiAgICAgIGNvbnN0IG9mZnNldCA9IHRtLnBvc2l0aW9uID09PSBTbW9NZWFzdXJlVGV4dC5wb3NpdGlvbnMubGVmdCA/IHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCA6IDA7XHJcbiAgICAgIGNvbnN0IHN0YXZlVGV4dCA9IGNyZWF0ZVN0YXZlVGV4dCh0bS50ZXh0LCB0b1ZleFRleHRQb3NpdGlvbih0bSksIFxyXG4gICAgICB7XHJcbiAgICAgICAgc2hpZnRYOiB0bS5hZGp1c3RYICsgb2Zmc2V0LCBzaGlmdFk6IHRtLmFkanVzdFksIGp1c3RpZmljYXRpb246IHRvVmV4VGV4dEp1c3RpZmljYXRpb24odG0pXHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdGF2ZT8uYWRkTW9kaWZpZXIoc3RhdmVUZXh0KTtcclxuXHJcbiAgICAgIC8vIGhhY2sgLSB3ZSBjYW4ndCBjcmVhdGUgc3RhdmVUZXh0IGRpcmVjdGx5IHNvIHRoaXMgaXMgdGhlIG9ubHkgd2F5IEkgY291bGQgc2V0IHRoZSBmb250XHJcbiAgICAgIGNvbnN0IGFyID0gdGhpcy5zdGF2ZSEuZ2V0TW9kaWZpZXJzKCk7XHJcbiAgICAgIGNvbnN0IHZtID0gYXJbYXIubGVuZ3RoIC0gMV07XHJcbiAgICAgIHZtLnNldEZvbnQodG0uZm9udEluZm8pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5yb3dJblN5c3RlbSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBybWIgPSB0aGlzLnNtb01lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpO1xyXG4gICAgICBjb25zdCBybSA9IHJtYiBhcyBTbW9SZWhlYXJzYWxNYXJrO1xyXG4gICAgICBpZiAocm0pIHtcclxuICAgICAgICB0aGlzLnN0YXZlLnNldFNlY3Rpb24ocm0uc3ltYm9sLCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRlbXBvID0gdGhpcy5zbW9NZWFzdXJlLmdldFRlbXBvKCk7XHJcbiAgICBpZiAodGVtcG8gJiYgdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRlbXBvKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0VGVtcG8odGVtcG8udG9WZXhUZW1wbygpLCAtMSAqIHRlbXBvLnlPZmZzZXQpO1xyXG4gICAgICBjb25zdCB2ZXhUZW1wbyA9IHRoaXMuc3RhdmUuZ2V0TW9kaWZpZXJzKCkuZmluZCgobW9kOiBTdGF2ZU1vZGlmaWVyKSA9PiBtb2QuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdTdGF2ZVRlbXBvJyk7XHJcbiAgICAgIGlmICh2ZXhUZW1wbykge1xyXG4gICAgICAgIHZleFRlbXBvLnNldEZvbnQoeyBmYW1pbHk6IFNvdXJjZVNlcmlmUHJvRm9udC5mb250RmFtaWx5LCBzaXplOiAxMywgd2VpZ2h0OiAnYm9sZCcgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbGwgVmV4IG5vdGVzIGFuZCBtb2RpZmllcnMuICBXZSBkZWZlciB0aGUgZm9ybWF0IGFuZCByZW5kZXJpbmcgc29cclxuICAgKiB3ZSBjYW4gYWxpZ24gYWNyb3NzIG11bHRpcGxlIHN0YXZlc1xyXG4gICAqL1xyXG4gIHByZUZvcm1hdCgpIHtcclxuICAgIHZhciBqID0gMDtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBOb3RlOiBuZWVkIHRvIGRvIHRoaXMgdG8gZ2V0IGl0IGludG8gVkVYIEtTIGZvcm1hdFxyXG4gICAgY29uc3Qgc3RhZmZYID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdDtcclxuICAgIGNvbnN0IHN0YWZmWSA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlkgLSB0aGlzLmNvbnRleHQuYm94Lnk7XHJcbiAgICBjb25zdCBrZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWduYXR1cmVUcmFuc3Bvc2UodGhpcy5zbW9NZWFzdXJlLmtleVNpZ25hdHVyZSwgMCk7XHJcbiAgICBjb25zdCBjYW5jZWxlZEtleSA9IFNtb011c2ljLnZleEtleVNpZ25hdHVyZVRyYW5zcG9zZSh0aGlzLnNtb01lYXN1cmUuY2FuY2VsZWRLZXlTaWduYXR1cmUsIDApO1xyXG4gICAgY29uc3Qgc21vVmV4U3RhdmVQYXJhbXMgPSB7XHJcbiAgICAgIHg6IHN0YWZmWCxcclxuICAgICAgeTogc3RhZmZZLFxyXG4gICAgICBwYWRMZWZ0OiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQsXHJcbiAgICAgIGlkOiB0aGlzLnNtb01lYXN1cmUuaWQsXHJcbiAgICAgIHN0YWZmWDogdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCxcclxuICAgICAgc3RhZmZZOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZZLFxyXG4gICAgICBzdGFmZldpZHRoOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aCxcclxuICAgICAgZm9yY2VDbGVmOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlQ2xlZixcclxuICAgICAgY2xlZjogdGhpcy5zbW9NZWFzdXJlLmNsZWYsXHJcbiAgICAgIGZvcmNlS2V5OiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlS2V5U2lnbmF0dXJlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGNhbmNlbGVkS2V5LFxyXG4gICAgICBzdGFydFg6IHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYLFxyXG4gICAgICBhZGpYOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalgsXHJcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KClcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdmUgPSBjcmVhdGVTdGF2ZShzbW9WZXhTdGF2ZVBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRpbWVTaWduYXR1cmUpIHtcclxuICAgICAgY29uc3QgdHMgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZTtcclxuICAgICAgbGV0IHRzU3RyaW5nID0gdHMudGltZVNpZ25hdHVyZTtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLnVzZVN5bWJvbCAmJiB0cy5hY3R1YWxCZWF0cyA9PT0gNCAmJiB0cy5iZWF0RHVyYXRpb24gPT09IDQpIHtcclxuICAgICAgICB0c1N0cmluZyA9ICdDJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS51c2VTeW1ib2wgJiYgdHMuYWN0dWFsQmVhdHMgPT09IDIgJiYgdHMuYmVhdER1cmF0aW9uID09PSA0KSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSAnQ3wnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmRpc3BsYXlTdHJpbmcubGVuZ3RoKSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdmUuYWRkVGltZVNpZ25hdHVyZSh0c1N0cmluZyk7XHJcbiAgICB9XHJcbiAgICAvLyBDb25uZWN0IGl0IHRvIHRoZSByZW5kZXJpbmcgY29udGV4dCBhbmQgZHJhdyFcclxuICAgIHRoaXMuc3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIGlmICh0aGlzLnNtb1RhYlN0YXZlICYmIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g/LndpZHRoKSB7XHJcbiAgICAgIGNvbnN0IGJveCA9IHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g7XHJcbiAgICAgIGxldCB0YWJXaWR0aCA9IDA7XHJcbiAgICAgIGJveC55IC09IHRoaXMuY29udGV4dC5ib3gueTtcclxuICAgICAgYm94LnggPSBzdGFmZlggLSB0aGlzLmNvbnRleHQuYm94Lng7XHJcbiAgICAgIGJveC53aWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoO1xyXG4gICAgICB0aGlzLnRhYlN0YXZlID0gY3JlYXRlVGFiU3RhdmUoYm94LCB0aGlzLnNtb1RhYlN0YXZlLnNwYWNpbmcsIHRoaXMuc21vVGFiU3RhdmUubnVtTGluZXMpO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUNsZWYpIHtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmFkZFRhYkdseXBoKCk7XHJcbiAgICAgICAgdGFiV2lkdGggPSB2ZXhHbHlwaC5kaW1lbnNpb25zWyd0YWInXS53aWR0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhYlN0YXZlLnNldE5vdGVTdGFydFgodGhpcy50YWJTdGF2ZS5nZXROb3RlU3RhcnRYKCkgKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalggLSB0YWJXaWR0aCk7XHJcbiAgICAgIHRoaXMudGFiU3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKTtcclxuXHJcbiAgICB0aGlzLnRpY2ttYXBPYmplY3QgPSB0aGlzLnNtb01lYXN1cmUuY3JlYXRlTWVhc3VyZVRpY2ttYXBzKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKTtcclxuXHJcbiAgICB0aGlzLnZvaWNlQXIgPSBbXTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMubm90ZVRvVmV4TWFwID0ge307XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZvaWNlcywgYWRkIHRoZW0gYWxsIHRvIHRoZSBmb3JtYXR0ZXIgYXQgdGhlIHNhbWUgdGltZSBzbyB0aGV5IGRvbid0IGNvbGxpZGVcclxuICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHNtb1ZleFZvaWNlUGFyYW1zID0ge1xyXG4gICAgICAgIGFjdHVhbEJlYXRzOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyxcclxuICAgICAgICBiZWF0RHVyYXRpb246IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbixcclxuICAgICAgICBub3RlczogdGhpcy52ZXhOb3Rlc1xyXG4gICAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoICYmICF0aGlzLnNtb01lYXN1cmUucmVwZWF0U3ltYm9sKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhOb3RlcyhqKTtcclxuICAgICAgICBzbW9WZXhWb2ljZVBhcmFtcy5ub3RlcyA9IHRoaXMudm9pY2VOb3RlcztcclxuICAgICAgICB0aGlzLmNyZWF0ZVZleFR1cGxldHMoaik7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhCZWFtR3JvdXBzKGopO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSB2b2ljZSBpbiA0LzQgYW5kIGFkZCBhYm92ZSBub3Rlc1xyXG4gICAgICAgIGNvbnN0IHZvaWNlID0gY3JlYXRlVm9pY2Uoc21vVmV4Vm9pY2VQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMudm9pY2VBci5wdXNoKHZvaWNlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnJlcGVhdFN5bWJvbCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVwZWF0U3ltYm9sKCk7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgdm9pY2UgaW4gNC80IGFuZCBhZGQgYWJvdmUgbm90ZXNcclxuICAgICAgICBjb25zdCB2b2ljZSA9IGNyZWF0ZVZvaWNlKHNtb1ZleFZvaWNlUGFyYW1zKTtcclxuICAgICAgICB0aGlzLnZvaWNlQXIucHVzaCh2b2ljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE5lZWQgdG8gZm9ybWF0IGZvciB4IHBvc2l0aW9uLCB0aGVuIHNldCB5IHBvc2l0aW9uIGJlZm9yZSBkcmF3aW5nIGR5bmFtaWNzLlxyXG4gICAgdGhpcy5mb3JtYXR0ZXIgPSBuZXcgVkYuRm9ybWF0dGVyKHsgc29mdG1heEZhY3RvcjogdGhpcy5zb2Z0bWF4LCBnbG9iYWxTb2Z0bWF4OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuZm9ybWF0dGVyLmpvaW5Wb2ljZXModGhpcy52b2ljZUFyKTtcclxuICAgIGlmICh0aGlzLnRhYlN0YXZlKSB7XHJcbiAgICAgIHRoaXMudGFiVm9pY2UgPSBjcmVhdGVWb2ljZSh7XHJcbiAgICAgICAgYWN0dWFsQmVhdHM6IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzLFxyXG4gICAgICAgIGJlYXREdXJhdGlvbjogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uLFxyXG4gICAgICAgIG5vdGVzOiB0aGlzLnRhYk5vdGVzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5qb2luVm9pY2VzKFt0aGlzLnRhYlZvaWNlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgVmV4IGZvcm1hdHRlciB0aGF0IGNhbGN1bGF0ZXMgdGhlIFggYW5kIFkgcG9zaXRpb25zIG9mIHRoZSBub3Rlcy4gIEEgZm9ybWF0dGVyXHJcbiAgICogbWF5IGFjdHVhbGx5IHNwYW4gbXVsdGlwbGUgc3RhdmVzIGZvciBqdXN0aWZpZWQgc3RhdmVzLiAgVGhlIG5vdGVzIGFyZSBkcmF3biBpbiB0aGVpclxyXG4gICAqIGluZGl2aWR1YWwgdnhNZWFzdXJlIG9iamVjdHMgYnV0IGZvcm1hdHRpbmcgaXMgZG9uZSBvbmNlIGZvciBhbGwganVzdGlmaWVkIHN0YXZlc1xyXG4gICAqIEBwYXJhbSB2b2ljZXMgVm9pY2Ugb2JqZWN0cyBmcm9tIFZleEZsb3dcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBmb3JtYXQodm9pY2VzOiBWb2ljZVtdKSB7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlRW1wdHlNZWFzdXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdCA9IGdldE11bHRpbWVhc3VyZVJlc3QodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGgpO1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3Quc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LnNldFN0YXZlKHRoaXMuc3RhdmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybWF0dGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgY29uc3Qgc3RhZmZXaWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoIC1cclxuICAgICAgKHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpSaWdodCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCkgLSAxMDtcclxuICAgIHRoaXMuZGJnTGVmdFggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZYICsgIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqWDtcclxuICAgIHRoaXMuZGJnV2lkdGggPSBzdGFmZldpZHRoO1xyXG4gICAgdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KHZvaWNlcywgc3RhZmZXaWR0aCk7XHJcbiAgICBpZiAodGhpcy50YWJWb2ljZSAmJiB0aGlzLnRhYk5vdGVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5mb3JtYXQoW3RoaXMudGFiVm9pY2VdLCBzdGFmZldpZHRoKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5GT1JNQVQsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVuZGVyIGlzIGNhbGxlZCBhZnRlciBmb3JtYXQuICBBY3R1YWxseSBkcmF3IHRoZSB0aGluZ3MuXHJcbiAgICovXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKSBhcyBTVkdTVkdFbGVtZW50O1xyXG4gICAgdmFyIG1tQ2xhc3MgPSB0aGlzLnNtb01lYXN1cmUuZ2V0Q2xhc3NJZCgpO1xyXG4gICAgdmFyIGogPSAwO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gYm91bmQgZWFjaCBtZWFzdXJlIGluIGl0cyBvd24gU1ZHIGdyb3VwIGZvciBlYXN5IGRlbGV0aW9uIGFuZCBtYXBwaW5nIHRvIHNjcmVlbiBjb29yZGluYXRlXHJcbiAgICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGhpcy5zbW9NZWFzdXJlLmlkKTtcclxuICAgICAgZ3JvdXAuY2xhc3NMaXN0LmFkZChtbUNsYXNzKTtcclxuICAgICAgZ3JvdXAuaWQgPSB0aGlzLnNtb01lYXN1cmUuaWQ7XHJcbiAgICAgIHRoaXMuc3RhdmUhLmRyYXcoKTtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ID0gZ3JvdXA7XHJcblxyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZUFyLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyW2pdLmRyYXcodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgdGhpcy5zdGF2ZSEpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmV4QmVhbUdyb3Vwcy5mb3JFYWNoKChiKSA9PiB7XHJcbiAgICAgICAgYi5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpLmRyYXcoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnZleFR1cGxldHMuZm9yRWFjaCgodHVwbGV0KSA9PiB7XHJcbiAgICAgICAgdHVwbGV0LnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSkuZHJhdygpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHRoaXMubXVsdGltZWFzdXJlUmVzdCkge1xyXG4gICAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5kcmF3KCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5fdXBkYXRlTHlyaWNEb21TZWxlY3RvcnMoKTtcclxuICAgICAgdGhpcy5yZW5kZXJEeW5hbWljcygpO1xyXG4gICAgICAvLyB0aGlzLnNtb01lYXN1cmUuYWRqWCA9IHRoaXMuc3RhdmUuc3RhcnRfeCAtICh0aGlzLnNtb01lYXN1cmUuc3RhZmZYKTtcclxuXHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICBpZiAodGhpcy50YWJTdGF2ZSkge1xyXG4gICAgICAgIGNvbnN0IHRhYlN0YXZlSWQgPSBgJHt0aGlzLnNtb01lYXN1cmUuaWR9LXRhYmA7XHJcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLm9wZW5Hcm91cCgpIGFzIFNWR1NWR0VsZW1lbnQ7XHJcbiAgICAgICAgdGFiR3JvdXAuY2xhc3NMaXN0LmFkZCh0YWJTdGF2ZUlkKTtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmRyYXcoKTtcclxuICAgICAgICB0aGlzLnRhYlZvaWNlPy5kcmF3KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIHRoaXMudGFiU3RhdmUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHRhYkdyb3VwO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5SRU5ERVIsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlO1xyXG4gICAgICBpZiAobGF5b3V0RGVidWcubWFzayAmIGxheW91dERlYnVnLnZhbHVlc1snYWRqdXN0J10pIHtcclxuICAgICAgICBTdmdIZWxwZXJzLmRlYnVnQm94Tm9UZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuc3ZnLFxyXG4gICAgICAgIFN2Z0hlbHBlcnMuYm94UG9pbnRzKHRoaXMuZGJnTGVmdFgsIFxyXG4gICAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5zdGFmZlksIHRoaXMuZGJnV2lkdGgsIDQwKSwgJ3JlbmRlci14LWRiZycsIDApO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleGMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCd1bmFibGUgdG8gcmVuZGVyIG1lYXN1cmUgJyArIHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n");
449
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n vexNote.setStyle({ fillStyle: \"#115511\" });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcmVuZGVyL3ZleC92eE1lYXN1cmUudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDekMsa0JBQWtCO0FBQ2xCLDhEQUE4RDtBQUM5RCw2REFBNkQ7QUFDN0QscUVBQXFFO0FBQ3JFLGdCQUFnQjtBQUM4QjtBQUNFO0FBQ0M7QUFDdUY7QUFDdkQ7QUFFeUI7QUFHM0Q7QUFDTTtBQUtUO0FBUWY7QUFFcUM7QUFFckI7QUFDN0MsTUFBTSxFQUFFLEdBQUcsZ0RBQU8sQ0FBQztBQUduQiwrQkFBK0I7QUFFL0I7OztHQUdHO0FBQ0ksTUFBTSxTQUFTO0lBNkJwQixZQUFZLE9BQWdCLEVBQUUsU0FBdUIsRUFBRSxRQUFpQixFQUFFLE9BQWU7UUFyQnpGLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBeUIsRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxtQkFBYyxHQUEyQixFQUFFLENBQUM7UUFDNUMscUJBQWdCLEdBQWUsSUFBSSxDQUFDO1FBQ3BDLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUEyQixJQUFJLENBQUM7UUFDN0MsVUFBSyxHQUFpQixJQUFJLENBQUMsQ0FBQyxZQUFZO1FBQ3hDLGVBQVUsR0FBVyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7UUFDakUsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixZQUFPLEdBQVksRUFBRSxDQUFDO1FBQ3RCLGFBQVEsR0FBaUIsSUFBSSxDQUFDO1FBQzlCLGNBQVMsR0FBcUIsSUFBSSxDQUFDO1FBQ25DLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsbUJBQWMsR0FBMEIsRUFBRSxDQUFDO1FBQzNDLGlCQUFZLEdBQThCLEVBQUUsQ0FBQztRQUM3QyxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFHbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxNQUFNLEtBQUssU0FBUztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsK0VBQStFO0lBQy9FLHlDQUF5QztJQUN6QyxXQUFXO1FBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQ3hDLENBQUM7SUFDTixDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxPQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM1QyxDQUFDO2dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxXQUFXLENBQUMsT0FBZSxFQUFFLE1BQWM7UUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEdBQVMsd0RBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxPQUFPLEdBQUcscURBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN0QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMxQyxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWEsQ0FBQyxPQUFnQixFQUFFLFNBQWlCLEVBQUUsT0FBZTtRQUNoRSxJQUFJLE9BQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQ2hDLElBQUksVUFBVSxHQUFzQixJQUFJLENBQUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxxREFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxPQUFPLEdBQXlCLElBQUksQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUMzRCxNQUFNLElBQUksR0FBRyxxREFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWTtZQUN4RCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsU0FBUztZQUNULElBQUk7WUFDSixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7U0FDM0IsQ0FBQztRQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsaUVBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxRixJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sU0FBUyxHQUFzQixnRUFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEcsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzt3QkFDdEIsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDNUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUMvQixPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7NEJBQ3hDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs0QkFDeEMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO3dCQUMxRSxDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN6QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM3QixzREFBc0Q7WUFDdEQsT0FBTyxHQUFHLDBEQUFhLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsUUFBUSxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ3RGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU07Z0JBQ3pDLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEtBQUssbURBQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtnQkFDckQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEtBQUssbURBQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTthQUNsRDtZQUNELCtEQUFrQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELElBQUksVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCx5REFBVyxDQUFDLFlBQVksQ0FBQyx5REFBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUMvRixTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELHlEQUFXLENBQUMsWUFBWSxDQUFDLHlEQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQy9GLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNyRCxDQUFDO2lCQUFNLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELE9BQU8sQ0FBQyxRQUFRLEdBQUcsS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7UUFDdEYsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFzQjtZQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsT0FBTztZQUNoQixTQUFTLEVBQUUsT0FBTztZQUNsQixVQUFVLEVBQUUsT0FBTztZQUNuQixTQUFTLEVBQUUsU0FBUztTQUNyQjtRQUNELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSw0Q0FBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0Qix5REFBVyxDQUFDLFlBQVksQ0FBQyx5REFBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUUvRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWdCLEVBQUUsT0FBdUI7UUFDdkQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDN0UsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNqRixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xELEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsbUVBQW1FO1FBQ25FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFHLENBQUM7WUFDakQsTUFBTSxFQUFFLEtBQUssRUFBRyxNQUFNLEVBQUUsR0FBRywyREFBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDL0csT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUI7eUNBQzZCO1lBQzdCLENBQUMsSUFBSSxLQUFLLENBQUM7WUFDWCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxVQUFVLEdBQUcsdURBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNoRCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FDcEMsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ25CLE1BQU0sRUFBRSxHQUFHLEdBQXFCLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLDhFQUE4RTtRQUM5RSxNQUFNLE9BQU8sR0FBRyx5REFBWSxFQUFFLENBQUM7UUFDL0IsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFMUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNSLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRS9DLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekIsYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLDJEQUFjLENBQUMsZ0VBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7bUJBQ2pFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxHQUFXO1FBQzdCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7WUFDckMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRTVELDZDQUE2QztZQUM3QyxTQUFTLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUMxQixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxFQUFFLENBQUMsU0FBUyxJQUFJLE9BQU8sWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDMUUsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztvQkFDekMsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQixhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxtREFBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDMUQsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLCtEQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzdCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFFLFlBQXVCLEVBQVEsRUFBRTtnQkFDNUQsTUFBTSxRQUFRLEdBQVcsRUFBRSxDQUFDO2dCQUM1QixLQUFLLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQzlELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxtREFBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbEcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUNyRCxNQUFNLGVBQWUsR0FBRztvQkFDdEIsUUFBUTtvQkFDUixRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVE7b0JBQy9CLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYTtvQkFDekMsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPO29CQUM3QixTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7b0JBQ2pDLFFBQVE7aUJBQ1Q7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsMERBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM3RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLGtFQUFVLENBQUMsUUFBUSxDQUFDLFNBQVM7ZUFDOUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsNkRBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hGLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHVEQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssa0VBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsNkRBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyx1RUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsd0RBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QyxpQkFBaUI7UUFDakIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQTJCLEVBQUUsRUFBRTs7WUFDMUMsTUFBTSxFQUFFLEdBQUcsR0FBcUIsQ0FBQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxLQUFLLHNFQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsTUFBTSxTQUFTLEdBQUcsNERBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDhEQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUNoRTtnQkFDRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLG1FQUFzQixDQUFDLEVBQUUsQ0FBQzthQUMzRixDQUNBLENBQUM7WUFDRixVQUFJLENBQUMsS0FBSywwQ0FBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFbkMseUZBQXlGO1lBQ3pGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDL0MsTUFBTSxFQUFFLEdBQUcsR0FBdUIsQ0FBQztZQUNuQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFrQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ25ILElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxzRkFBa0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTOztRQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELHFEQUFxRDtRQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLHFEQUFRLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsTUFBTSxXQUFXLEdBQUcscURBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsQ0FBQyxFQUFFLE1BQU07WUFDVCxDQUFDLEVBQUUsTUFBTTtZQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUM5QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1lBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVU7WUFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDeEMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCO1lBQy9DLEdBQUc7WUFDSCxXQUFXO1lBQ1gsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWU7WUFDM0MsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyx3REFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLFdBQVcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0YsUUFBUSxHQUFHLEdBQUcsQ0FBQztZQUNqQixDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3BHLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDbEIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUQsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUksVUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVywwQ0FBRSxLQUFLLEdBQUUsQ0FBQztZQUMvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDNUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsMkRBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixRQUFRLEdBQUcsdURBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRXZCLHFHQUFxRztRQUNyRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3hCLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXO2dCQUN0RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWTtnQkFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3JCO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1Qiw0Q0FBNEM7Z0JBQzVDLE1BQU0sS0FBSyxHQUFHLHdEQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLDRDQUE0QztnQkFDNUMsTUFBTSxLQUFLLEdBQUcsd0RBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLHdEQUFXLENBQUM7Z0JBQzFCLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXO2dCQUN0RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWTtnQkFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3JCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFDRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsTUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnRUFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVO1lBQzNDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0csSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3BHLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QseURBQVcsQ0FBQyxZQUFZLENBQUMseURBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUNEOztPQUVHO0lBQ0gsTUFBTTs7UUFDSixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBbUIsQ0FBQztRQUNuRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQztZQUNILDZGQUE2RjtZQUM3RixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBRXBDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBTSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsQ0FBQztZQUNELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsd0VBQXdFO1lBRXhFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztnQkFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLEVBQW1CLENBQUM7Z0JBQ3hFLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyQixVQUFJLENBQUMsUUFBUSwwQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7WUFDNUMsQ0FBQztZQUNELDhGQUE4RjtZQUU5RixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLHlEQUFXLENBQUMsSUFBSSxHQUFHLHlEQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELHVEQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUN2RCx1REFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3ZleC92eE1lYXN1cmUudHM/Y2MxMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLy8gIyMgRGVzY3JpcHRpb246XHJcbi8vIFRoaXMgZmlsZSBjYWxscyB0aGUgdmV4ZmxvdyByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IHJlbmRlciBhXHJcbi8vIG1lYXN1cmUgb2YgbXVzaWMuICBJZiBtdWx0aXBsZSBtZWFzdXJlcyBhcmUganVzdGlmaWVkIGluIGFcclxuLy8gY29sdW1uLCB0aGUgcmVuZGVyaW5nIGlzIGRlZmVycmVkIHVudGlsIGFsbCB0aGUgbWVhc3VyZXMgaGF2ZSBiZWVuXHJcbi8vIHByZWZvcm1hdHRlZC5cclxuaW1wb3J0IHsgU21vTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTbW9SZXBlYXRTeW1ib2wsIFNtb01lYXN1cmVUZXh0LCBTbW9CYXJsaW5lLCBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLCBTbW9SZWhlYXJzYWxNYXJrIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNvdXJjZVNlcmlmUHJvRm9udCB9IGZyb20gJy4uLy4uL3N0eWxlcy9mb250X21ldHJpY3Mvc3NwLXNlcmlmLW1ldHJpY3MnO1xyXG5pbXBvcnQgeyBTbW9Pcm5hbWVudCwgU21vQXJ0aWN1bGF0aW9uLCBTbW9EeW5hbWljVGV4dCwgU21vTHlyaWMsIFxyXG4gIFNtb0FycGVnZ2lvLCBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBWZXhBbm5vdGF0aW9uUGFyYW1zLCBTbW9UYWJOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSwgTWVhc3VyZVRpY2ttYXBzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuLi9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IENsZWYsIElzQ2xlZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN2Z1BhZ2UgfSBmcm9tICcuLi9zdWkvc3ZnUGFnZU1hcCc7XHJcbmltcG9ydCB7IFNtb1RhYlN0YXZlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyB0b1ZleEJhcmxpbmVUeXBlLCB2ZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVBvc2l0aW9uLCB0b1ZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhTeW1ib2wsXHJcbiAgdG9WZXhUZXh0SnVzdGlmaWNhdGlvbiwgdG9WZXhUZXh0UG9zaXRpb24sIGdldFZleENob3JkQmxvY2tzLCB0b1ZleFN0ZW1EaXJlY3Rpb24sXHJcbiAgVmV4VGFiTm90ZVBvc2l0aW9ucyB9IGZyb20gJy4vc21vQWRhcHRlcic7XHJcbmltcG9ydCB7IFZleEZsb3csIFN0YXZlLFN0ZW1tYWJsZU5vdGUsIE5vdGUsIEJlYW0sIFR1cGxldCwgVm9pY2UsXHJcbiAgRm9ybWF0dGVyLCBBY2NpZGVudGFsLCBBbm5vdGF0aW9uLCBTdGF2ZU5vdGVTdHJ1Y3QsIFN0YXZlVGV4dCwgU3RhdmVNb2RpZmllcixcclxuICBjcmVhdGVTdGF2ZVRleHQsIHJlbmRlckR5bmFtaWNzLCBhcHBseVN0ZW1EaXJlY3Rpb24sXHJcbiAgZ2V0VmV4Tm90ZVBhcmFtZXRlcnMsIGRlZmF1bHROb3RlU2NhbGUsIGRlZmF1bHRDdWVTY2FsZSwgZ2V0VmV4VHVwbGV0cyxcclxuICBjcmVhdGVTdGF2ZSwgY3JlYXRlVm9pY2UsIGdldE9ybmFtZW50R2x5cGgsIGdldFNsYXNoR2x5cGgsIGdldFJlcGVhdEJhciwgZ2V0TXVsdGltZWFzdXJlUmVzdCxcclxuICBjcmVhdGVUZXh0Tm90ZSwgVGFiU3RhdmUsIGNyZWF0ZVRhYlN0YXZlLCBUYWJOb3RlUG9zaXRpb24sIFRhYk5vdGVTdHJ1Y3QsXHJcbiAgQ3JlYXRlVmV4Tm90ZVBhcmFtcywgVGFiTm90ZSwgUGVkYWxNYXJraW5nXHJcbiAgIH0gZnJvbSAnLi4vLi4vY29tbW9uL3ZleCc7XHJcblxyXG5pbXBvcnQgeyBWeE1lYXN1cmVJZiwgVmV4Tm90ZU1vZGlmaWVySWYsIFZ4Tm90ZSB9IGZyb20gJy4vdnhOb3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0IH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvdHVwbGV0JztcclxuaW1wb3J0IHsgdmV4R2x5cGggfSBmcm9tICcuL2dseXBoRGltZW5zaW9ucyc7XHJcbmNvbnN0IFZGID0gVmV4RmxvdztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLy8gY29uc3QgVkYgPSBldmFsKCdWZXguRmxvdycpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgVmV4RmxvdyBsaWJyYXJ5IHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgZW5ncmF2aW5nLlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVnhNZWFzdXJlIGltcGxlbWVudHMgVnhNZWFzdXJlSWYge1xyXG4gIGNvbnRleHQ6IFN2Z1BhZ2U7XHJcbiAgcHJpbnRpbmc6IGJvb2xlYW47XHJcbiAgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb247XHJcbiAgc29mdG1heDogbnVtYmVyO1xyXG4gIHNtb01lYXN1cmU6IFNtb01lYXN1cmU7XHJcbiAgc21vVGFiU3RhdmU/OiBTbW9UYWJTdGF2ZTtcclxuICB0YWJTdGF2ZT86IFRhYlN0YXZlO1xyXG4gIHJlbmRlcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm90ZVRvVmV4TWFwOiBSZWNvcmQ8c3RyaW5nLCBOb3RlPiA9IHt9O1xyXG4gIGJlYW1Ub1ZleE1hcDogUmVjb3JkPHN0cmluZywgQmVhbT4gPSB7fTtcclxuICB0dXBsZXRUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgVHVwbGV0PiA9IHt9O1xyXG4gIG11bHRpbWVhc3VyZVJlc3Q6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIHZleE5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2ZXhCZWFtR3JvdXBzOiBCZWFtW10gPSBbXTtcclxuICB2ZXhUdXBsZXRzOiBUdXBsZXRbXSA9IFtdO1xyXG4gIHRpY2ttYXBPYmplY3Q6IE1lYXN1cmVUaWNrbWFwcyB8IG51bGwgPSBudWxsO1xyXG4gIHN0YXZlOiBTdGF2ZSB8IG51bGwgPSBudWxsOyAvLyB2ZXggc3RhdmVcclxuICB2b2ljZU5vdGVzOiBOb3RlW10gPSBbXTsgLy8gbm90ZXMgZm9yIGN1cnJlbnQgdm9pY2UsIGFzIHJlbmRlcmluZ1xyXG4gIHRhYk5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2b2ljZUFyOiBWb2ljZVtdID0gW107XHJcbiAgdGFiVm9pY2U6IFZvaWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgZm9ybWF0dGVyOiBGb3JtYXR0ZXIgfCBudWxsID0gbnVsbDtcclxuICBhbGxDdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbW9kaWZpZXJzVG9Cb3g6IFNtb05vdGVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gIGNvbGxpc2lvbk1hcDogUmVjb3JkPG51bWJlciwgU21vTm90ZVtdPiA9IHt9O1xyXG4gIGRiZ0xlZnRYOiBudW1iZXIgPSAwO1xyXG4gIGRiZ1dpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdmdQYWdlLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgcHJpbnRpbmc6IGJvb2xlYW4sIHNvZnRtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xyXG4gICAgdGhpcy5zbW9NZWFzdXJlID0gdGhpcy5zZWxlY3Rpb24ubWVhc3VyZTtcclxuICAgIHRoaXMucHJpbnRpbmcgPSBwcmludGluZztcclxuICAgIHRoaXMuYWxsQ3VlcyA9IHNlbGVjdGlvbi5zdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcztcclxuICAgIHRoaXMudHVwbGV0VG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy52ZXhCZWFtR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmJlYW1Ub1ZleE1hcCA9IHt9O1xyXG4gICAgdGhpcy5zb2Z0bWF4ID0gc29mdG1heDtcclxuICAgIHRoaXMuc21vVGFiU3RhdmUgPSBzZWxlY3Rpb24uc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKHNlbGVjdGlvbi5zZWxlY3Rvcik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IGZpbGxTdHlsZSgpIHtcclxuICAgIHJldHVybiAnIzAwMCc7XHJcbiAgfVxyXG4gIC8vIFRyZWF0IGEgcmVzdCBsaWtlIGEgd2hvbGUgcmVzdCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJlc3QgaW4gdGhlIG1lYXN1cmVcclxuICAvLyBhbmQgdGhlIG1lYXN1cmUgbGVuZ3RoIGlzIG5vdCBhIHBpY2t1cFxyXG4gIGlzV2hvbGVSZXN0KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzWzBdLmlzUmVzdCgpICYmXHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5nZXRNYXhUaWNrc1ZvaWNlKCkgPiA0MDk2XHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBpZiAoIXRoaXMudGlja21hcE9iamVjdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0bSA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRtLmR1cmF0aW9uTWFwLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXS5wdXNoKHRoaXMuc21vTWVhc3VyZS52b2ljZXNbaV0ubm90ZXNbal0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQ29sbGlzaW9uKHZvaWNlSXg6IG51bWJlciwgdGlja0l4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBrID0gMDtcclxuICAgIGxldCBzdGFmZkxpbmVzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGljayA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1t2b2ljZUl4XS5kdXJhdGlvbk1hcFt0aWNrSXhdO1xyXG4gICAgLy8gSnVzdCBvbmUgbm90ZSwgbm8gY29sbGlzaW9uXHJcbiAgICBpZiAodGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbm90ZS5waXRjaGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgY2xlZjogQ2xlZiA9IElzQ2xlZihub3RlLmNsZWYpID8gbm90ZS5jbGVmIDogJ3RyZWJsZSc7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBub3RlLnBpdGNoZXNbal07XHJcbiAgICAgICAgY29uc3QgY3VyTGluZSA9IFNtb011c2ljLnBpdGNoVG9TdGFmZkxpbmUoY2xlZiwgcGl0Y2gpO1xyXG4gICAgICAgIGZvciAoayA9IDA7ayA8IHN0YWZmTGluZXMubGVuZ3RoOyArK2spIHtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXJMaW5lIC0gc3RhZmZMaW5lc1trXSkgPCAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFmZkxpbmVzLnB1c2goY3VyTGluZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgYSBzbW9Ob3RlIGludG8gYSB2eE5vdGUgc28gaXQgY2FuIGJlIHJhc3Rlcml6ZWRcclxuICAgKiBAcGFyYW0gc21vTm90ZSBcclxuICAgKiBAcGFyYW0gdGlja0luZGV4IC0gdXNlZCB0byBjYWxjdWxhdGUgYWNjaWRlbnRhbFxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGUoc21vTm90ZTogU21vTm90ZSwgdGlja0luZGV4OiBudW1iZXIsIHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IHZleE5vdGU6IE5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzbW9UYWJOb3RlOiBTbW9UYWJOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICBjb25zdCBzdGVtVGlja3MgPSBTbW9NdXNpYy50aWNrc1RvRHVyYXRpb25bc21vTm90ZS5zdGVtVGlja3NdO1xyXG4gICAgbGV0IHRhYk5vdGU6IFN0ZW1tYWJsZU5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGNvbnN0IG5vdGVIZWFkID0gc21vTm90ZS5pc1Jlc3QoKSA/ICdyJyA6IHNtb05vdGUubm90ZUhlYWQ7XHJcbiAgICBjb25zdCBrZXlzID0gU21vTXVzaWMuc21vUGl0Y2hlc1RvVmV4S2V5cyhzbW9Ob3RlLnBpdGNoZXMsIDAsIG5vdGVIZWFkKTtcclxuICAgIGNvbnN0IHNtb05vdGVQYXJhbXMgPSB7XHJcbiAgICAgIGlzVHVwbGV0OiBzbW9Ob3RlLmlzVHVwbGV0LFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCxcclxuICAgICAgY2xlZjogc21vTm90ZS5jbGVmLFxyXG4gICAgICBzdGVtVGlja3MsXHJcbiAgICAgIGtleXMsXHJcbiAgICAgIG5vdGVUeXBlOiBzbW9Ob3RlLm5vdGVUeXBlXHJcbiAgICB9O1xyXG4gICAgY29uc3QgeyBub3RlUGFyYW1zLCBkdXJhdGlvbiB9ID0gZ2V0VmV4Tm90ZVBhcmFtZXRlcnMoc21vTm90ZVBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy50YWJTdGF2ZSAmJiB0aGlzLnNtb1RhYlN0YXZlKSB7XHJcbiAgICAgIHNtb1RhYk5vdGUgPSB0aGlzLnNtb1RhYlN0YXZlLmdldFRhYk5vdGVGcm9tTm90ZShzbW9Ob3RlLCB0aGlzLnNtb01lYXN1cmUudHJhbnNwb3NlSW5kZXgpO1xyXG4gICAgICBpZiAoc21vVGFiTm90ZSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uczogVGFiTm90ZVBvc2l0aW9uW10gPSBWZXhUYWJOb3RlUG9zaXRpb25zKHRoaXMuc21vVGFiU3RhdmUsIHNtb1RhYk5vdGUsIHNtb05vdGUpO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAoIXNtb05vdGUuaXNSZXN0KCkpIHtcclxuICAgICAgICAgICAgdGFiTm90ZSA9IG5ldyBWRi5UYWJOb3RlKHsgcG9zaXRpb25zLCBkdXJhdGlvbjogZHVyYXRpb24gfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNtb1RhYlN0YXZlLnNob3dTdGVtcykge1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19zdGVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfZG90cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X3N0ZW1fdGhyb3VnaF9zdGF2ZSA9IHNtb1RhYk5vdGUuZmxhZ1Rocm91Z2g7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhYk5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNtb05vdGUubm90ZVR5cGUgPT09ICcvJykge1xyXG4gICAgICAvLyB2ZXhOb3RlID0gbmV3IFZGLkdseXBoTm90ZSgnXFx1RTUwNCcsIHsgZHVyYXRpb24gfSk7XHJcbiAgICAgIHZleE5vdGUgPSBnZXRTbGFzaEdseXBoKCk7XHJcbiAgICAgIHNtb05vdGUucmVuZGVySWQgPSAndmYtJyArIHZleE5vdGUuZ2V0QXR0cmlidXRlKCdpZCcpOyAvLyB3aGVyZSBkb2VzICd2ZicgY29tZSBmcm9tP1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc21vVmV4U3RlbVBhcmFtcyA9IHtcclxuICAgICAgICB2b2ljZUNvdW50OiB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCxcclxuICAgICAgICB2b2ljZUl4LFxyXG4gICAgICAgIGlzQXV0bzogc21vTm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvLFxyXG4gICAgICAgIGlzVXA6IHNtb05vdGUuZmxhZ1N0YXRlID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMudXBcclxuICAgICAgfVxyXG4gICAgICBhcHBseVN0ZW1EaXJlY3Rpb24oc21vVmV4U3RlbVBhcmFtcywgbm90ZVBhcmFtcyk7XHJcbiAgICAgIGlmIChzbW9UYWJOb3RlICYmIHRhYk5vdGUpIHtcclxuICAgICAgICB0YWJOb3RlLnNldFN0ZW1EaXJlY3Rpb24obm90ZVBhcmFtcy5zdGVtX2RpcmVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEEsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICAgICAgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICAgIHZleE5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICBpZiAodm9pY2VJeCA+IDAgJiYgdGhpcy5pc0NvbGxpc2lvbih2b2ljZUl4LCB0aWNrSW5kZXgpKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRYU2hpZnQoLTEwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pc1dob2xlUmVzdCgpKSB7XHJcbiAgICAgICAgbm90ZVBhcmFtcy5kdXJhdGlvbiA9ICd3cic7XHJcbiAgICAgICAgdmV4Tm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRDZW50ZXJBbGlnbm1lbnQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEIsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICAgICAgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICAgIGlmIChzbW9Ob3RlLmZpbGxTdHlsZSAmJiAhdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IHNtb05vdGUuZmlsbFN0eWxlIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHZvaWNlSXggPiAwICYmICF0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogXCIjMTE1NTExXCIgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc21vTm90ZS5pc0hpZGRlbigpICYmIHRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBcIiNmZmZmZmYwMFwiIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHNtb05vdGUucmVuZGVySWQgPSAndmYtJyArIHZleE5vdGUuZ2V0QXR0cmlidXRlKCdpZCcpOyAvLyB3aGVyZSBkb2VzICd2ZicgY29tZSBmcm9tP1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm90ZURhdGE6IFZleE5vdGVNb2RpZmllcklmID0ge1xyXG4gICAgICBzbW9NZWFzdXJlOiB0aGlzLnNtb01lYXN1cmUsXHJcbiAgICAgIHZ4TWVhc3VyZTogdGhpcyxcclxuICAgICAgc21vTm90ZTogc21vTm90ZSxcclxuICAgICAgc3RhdmVOb3RlOiB2ZXhOb3RlLFxyXG4gICAgICB2b2ljZUluZGV4OiB2b2ljZUl4LFxyXG4gICAgICB0aWNrSW5kZXg6IHRpY2tJbmRleFxyXG4gICAgfVxyXG4gICAgaWYgKHRhYk5vdGUpIHtcclxuICAgICAgbm90ZURhdGEudGFiTm90ZSA9IHRhYk5vdGU7XHJcbiAgICAgIHRoaXMudGFiTm90ZXMucHVzaCh0YWJOb3RlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vZE9iaiA9IG5ldyBWeE5vdGUobm90ZURhdGEpO1xyXG4gICAgbW9kT2JqLmFkZE1vZGlmaWVycygpO1xyXG4gICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEMsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICByZXR1cm4gbW9kT2JqO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm90ZUdseXBoKHNtb05vdGU6IFNtb05vdGUsIHRleHRPYmo6IFNtb0R5bmFtaWNUZXh0KSB7XHJcbiAgICB2YXIgeCA9IHRoaXMubm90ZVRvVmV4TWFwW3Ntb05vdGUuYXR0cnMuaWRdLmdldEFic29sdXRlWCgpICsgdGV4dE9iai54T2Zmc2V0O1xyXG4gICAgLy8gdGhlIC0zIGlzIGNvcGllZCBmcm9tIHZleGZsb3cgdGV4dER5bmFtaWNzXHJcbiAgICB2YXIgeSA9IHRoaXMuc3RhdmUhLmdldFlGb3JMaW5lKHRleHRPYmoueU9mZnNldExpbmUgLSAzKSArIHRleHRPYmoueU9mZnNldFBpeGVscztcclxuICAgIGxldCBtYXhoID0gMDtcclxuICAgIGNvbnN0IG1pbnggPSB4O1xyXG4gICAgdmFyIGdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKTtcclxuICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGV4dE9iai5hdHRycy5pZCArICctJyArIHNtb05vdGUuYXR0cnMuaWQpO1xyXG4gICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCh0ZXh0T2JqLmF0dHJzLmlkKTtcclxuICAgIC8vIGNvbnN0IGR1cmF0aW9uID0gU21vTXVzaWMuY2xvc2VzdFZleER1cmF0aW9uKHNtb05vdGUudGlja0NvdW50KTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dE9iai50ZXh0Lmxlbmd0aDsgaSArPSAxICkge1xyXG4gICAgICBjb25zdCB7IHdpZHRoICwgaGVpZ2h0IH0gPSByZW5kZXJEeW5hbWljcyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCBWRi5UZXh0RHluYW1pY3MuR0xZUEhTW3RleHRPYmoudGV4dFtpXV0uY29kZSxcclxuICAgICAgICB0ZXh0T2JqLmZvbnRTaXplLCB4LCB5KTtcclxuICAgICAgLyogY29uc3QgeyB3aWR0aCAsIGhlaWdodCB9ID0gcmVuZGVyRHluYW1pY3ModGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgVkYuVGV4dER5bmFtaWNzLkdMWVBIU1t0ZXh0T2JqLnRleHRbaV1dLFxyXG4gICAgICAgIHRleHRPYmouZm9udFNpemUsIHgsIHkpOyAqL1xyXG4gICAgICB4ICs9IHdpZHRoO1xyXG4gICAgICBtYXhoID0gTWF0aC5tYXgoaGVpZ2h0LCBtYXhoKTsgICAgICBcclxuICAgIH1cclxuICAgIHRleHRPYmoubG9naWNhbEJveCA9IFN2Z0hlbHBlcnMuYm94UG9pbnRzKG1pbngsIHkgKyB0aGlzLmNvbnRleHQuYm94LnksIHggLSBtaW54LCBtYXhoKTtcclxuICAgIHRleHRPYmouZWxlbWVudCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RpZmllcnNUb0JveC5wdXNoKHRleHRPYmopO1xyXG4gICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJEeW5hbWljcygpIHtcclxuICAgIHRoaXMuc21vTWVhc3VyZS52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgoc21vTm90ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHMgPSBzbW9Ob3RlLnRleHRNb2RpZmllcnMuZmlsdGVyKChtb2QpID0+XHJcbiAgICAgICAgICBtb2QuYXR0cnMudHlwZSA9PT0gJ1Ntb0R5bmFtaWNUZXh0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbW9kcy5mb3JFYWNoKChidG0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRtID0gYnRtIGFzIFNtb0R5bmFtaWNUZXh0O1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJOb3RlR2x5cGgoc21vTm90ZSwgdG0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBjcmVhdGVSZXBlYXRTeW1ib2woKSB7XHJcbiAgICB0aGlzLnZvaWNlTm90ZXMgPSBbXTtcclxuICAgIC8vIGNvbnN0IHZleE5vdGUgPSBuZXcgVkYuR2x5cGhOb3RlKCdcXHVFNTAwJywgeyBkdXJhdGlvbjogJ3cnIH0sIHsgbGluZTogMiB9KTtcclxuICAgIGNvbnN0IHZleE5vdGUgPSBnZXRSZXBlYXRCYXIoKTtcclxuICAgIHZleE5vdGUuc2V0Q2VudGVyQWxpZ25tZW50KHRydWUpO1xyXG4gICAgdGhpcy52ZXhOb3Rlcy5wdXNoKHZleE5vdGUpO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSBhbiBhIGFycmF5IG9mIFZGLlN0YXZlTm90ZSBvYmplY3RzIHRvIHJlbmRlciB0aGUgYWN0aXZlIHZvaWNlLlxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGVzKHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzID0gW107XHJcbiAgICBjb25zdCB2b2ljZSA9IHRoaXMuc21vTWVhc3VyZS52b2ljZXNbdm9pY2VJeF07XHJcbiAgICBsZXQgY2xlZk5vdGVBZGRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAoaSA9IDA7XHJcbiAgICAgIGkgPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbaV07XHJcbiAgICAgIGNvbnN0IHRleHROb3RlcyA9IHNtb05vdGUuZ2V0VGV4dE9ybmFtZW50cygpO1xyXG4gICAgICBjb25zdCB2ZXhOb3RlID0gdGhpcy5jcmVhdGVWZXhOb3RlKHNtb05vdGUsIGksIHZvaWNlSXgpO1xyXG4gICAgICB0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSA9IHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlO1xyXG4gICAgICB0aGlzLnZleE5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG5cclxuICAgICAgaWYgKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZSAmJiAhY2xlZk5vdGVBZGRlZCkge1xyXG4gICAgICAgIGNvbnN0IGNmID0gbmV3IFZGLkNsZWZOb3RlKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZS5jbGVmLCAnc21hbGwnKTtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjZik7XHJcbiAgICAgICAgY2xlZk5vdGVBZGRlZCA9IHRydWU7IC8vIGlnbm9yZSAybmQgaW4gYSBtZWFzdXJlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG4gICAgICB0ZXh0Tm90ZXMuZm9yRWFjaCgodG4pID0+IHtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjcmVhdGVUZXh0Tm90ZShTbW9Pcm5hbWVudC50ZXh0Tm90ZU9ybmFtZW50c1t0bi5vcm5hbWVudF0pKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc05hTihzbW9Ob3RlLnRpY2tzLm51bWVyYXRvcikgfHwgaXNOYU4oc21vTm90ZS50aWNrcy5kZW5vbWluYXRvcilcclxuICAgICAgICB8fCBpc05hTihzbW9Ob3RlLnRpY2tzLnJlbWFpbmRlcikpIHtcclxuICAgICAgICB0aHJvdyAoJ3Z4TWVhc3VyZTogTmFOIGluIHRpY2tzJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdyb3VwIHRoZSBub3RlcyBmb3IgYmVhbWluZyBhbmQgY3JlYXRlIFZleCBiZWFtIG9iamVjdHNcclxuICAgKiBAcGFyYW0gdml4IC0gdm9pY2UgaW5kZXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjcmVhdGVWZXhCZWFtR3JvdXBzKHZpeDogbnVtYmVyKSB7XHJcbiAgICBsZXQga2V5Tm90ZUl4ID0gLTE7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgc3RlbURpcmVjdGlvbiA9IFZGLlN0ZW0uRE9XTjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUuYmVhbUdyb3Vwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBiZyA9IHRoaXMuc21vTWVhc3VyZS5iZWFtR3JvdXBzW2ldO1xyXG4gICAgICBpZiAoYmcudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZleE5vdGVzOiBTdGVtbWFibGVOb3RlW10gPSBbXTtcclxuICAgICAga2V5Tm90ZUl4ID0gYmcubm90ZXMuZmluZEluZGV4KChubikgPT4gbm4ubm90ZVR5cGUgPT09ICduJyk7XHJcblxyXG4gICAgICAvLyBGaXggc3RlbSBidWc6IGtleSBvZmYgZmlyc3Qgbm9uLXJlc3Qgbm90ZS5cclxuICAgICAga2V5Tm90ZUl4ID0gKGtleU5vdGVJeCA+PSAwKSA/IGtleU5vdGVJeCA6IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBiZy5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSBiZy5ub3Rlc1tqXTtcclxuICAgICAgICBpZiAobm90ZS5ub3RlVHlwZSA9PT0gJy8nKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4Tm90ZSA9IHRoaXMubm90ZVRvVmV4TWFwW25vdGUuYXR0cnMuaWRdO1xyXG4gICAgICAgIC8vIHNvbWUgdHlwZSBvZiByZWRyYXcgY29uZGl0aW9uP1xyXG4gICAgICAgIGlmICghKHZleE5vdGUgaW5zdGFuY2VvZiBWRi5TdGF2ZU5vdGUgfHwgdmV4Tm90ZSBpbnN0YW5jZW9mIFZGLkdyYWNlTm90ZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vdGUudGlja0NvdW50ID49IDQwOTYgfHwgdmV4Tm90ZS5nZXRJbnRyaW5zaWNUaWNrcygpID49IDQwOTYpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignYmFkIGxlbmd0aCBpbiBiZWFtIGdyb3VwJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChrZXlOb3RlSXggPT09IGopIHtcclxuICAgICAgICAgIHN0ZW1EaXJlY3Rpb24gPSBub3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8gP1xyXG4gICAgICAgICAgICB2ZXhOb3RlLmdldFN0ZW1EaXJlY3Rpb24oKSA6IHRvVmV4U3RlbURpcmVjdGlvbihub3RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdGVtRGlyZWN0aW9uKHN0ZW1EaXJlY3Rpb24pO1xyXG4gICAgICAgIHZleE5vdGVzLnB1c2godmV4Tm90ZSk7ICBcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2ZXhCZWFtID0gbmV3IFZGLkJlYW0odmV4Tm90ZXMpO1xyXG4gICAgICB0aGlzLmJlYW1Ub1ZleE1hcFtiZy5hdHRycy5pZF0gPSB2ZXhCZWFtO1xyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMucHVzaCh2ZXhCZWFtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZVZleFR1cGxldHModml4OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmV4VHVwbGV0cyA9IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUb1ZleE1hcCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUudHVwbGV0VHJlZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IHRoaXMuc21vTWVhc3VyZS50dXBsZXRUcmVlc1tpXTtcclxuICAgICAgaWYgKHR1cGxldFRyZWUudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyYXZlcnNlVHVwbGV0VHJlZSA9ICggcGFyZW50VHVwbGV0OiBTbW9UdXBsZXQpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCB2ZXhOb3RlczogTm90ZVtdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgc21vTm90ZSBvZiB0aGlzLnNtb01lYXN1cmUudHVwbGV0Tm90ZXMocGFyZW50VHVwbGV0KSkge1xyXG4gICAgICAgICAgdmV4Tm90ZXMucHVzaCh0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5zbW9NZWFzdXJlLmdldFN0ZW1EaXJlY3Rpb25Gb3JUdXBsZXQocGFyZW50VHVwbGV0KSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLnVwID9cclxuICAgICAgICAgIFZGLlR1cGxldC5MT0NBVElPTl9UT1AgOiBWRi5UdXBsZXQuTE9DQVRJT05fQk9UVE9NO1xyXG4gICAgICAgIGNvbnN0IHNtb1R1cGxldFBhcmFtcyA9IHtcclxuICAgICAgICAgIHZleE5vdGVzLFxyXG4gICAgICAgICAgbnVtTm90ZXM6IHBhcmVudFR1cGxldC5udW1Ob3RlcyxcclxuICAgICAgICAgIG5vdGVzT2NjdXBpZWQ6IHBhcmVudFR1cGxldC5ub3Rlc09jY3VwaWVkLFxyXG4gICAgICAgICAgcmF0aW9lZDogcGFyZW50VHVwbGV0LnJhdGlvZWQsXHJcbiAgICAgICAgICBicmFja2V0ZWQ6IHBhcmVudFR1cGxldC5icmFja2V0ZWQsXHJcbiAgICAgICAgICBsb2NhdGlvblxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZXhUdXBsZXQgPSBnZXRWZXhUdXBsZXRzKHNtb1R1cGxldFBhcmFtcyk7XHJcblxyXG4gICAgICAgIHRoaXMudHVwbGV0VG9WZXhNYXBbcGFyZW50VHVwbGV0LmF0dHJzLmlkXSA9IHZleFR1cGxldDtcclxuICAgICAgICB0aGlzLnZleFR1cGxldHMucHVzaCh2ZXhUdXBsZXQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VHVwbGV0LmNoaWxkcmVuVHVwbGV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHVwbGV0ID0gcGFyZW50VHVwbGV0LmNoaWxkcmVuVHVwbGV0c1tpXTtcclxuICAgICAgICAgIHRyYXZlcnNlVHVwbGV0VHJlZSh0dXBsZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0cmF2ZXJzZVR1cGxldFRyZWUodHVwbGV0VHJlZS50dXBsZXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY3JlYXRlIHRoZSBtb2RpZmllcnMgZm9yIHRoZSBzdGF2ZSBpdHNlbGYsIGJhciBsaW5lcyBldGMuXHJcbiAgICovXHJcbiAgY3JlYXRlTWVhc3VyZU1vZGlmaWVycygpIHtcclxuICAgIGNvbnN0IHNiID0gdGhpcy5zbW9NZWFzdXJlLmdldFN0YXJ0QmFybGluZSgpO1xyXG4gICAgY29uc3QgZWIgPSB0aGlzLnNtb01lYXN1cmUuZ2V0RW5kQmFybGluZSgpO1xyXG4gICAgY29uc3Qgc3ltID0gdGhpcy5zbW9NZWFzdXJlLmdldFJlcGVhdFN5bWJvbCgpO1xyXG4gICAgaWYgKCF0aGlzLnN0YXZlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkb24ndCBjcmVhdGUgYSBiZWdpbiBiYXIgZm9yIGFueSBidXQgdGhlIDFzdCBtZWFzdXJlLlxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLnN5c3RlbUluZGV4ICE9PSAwICYmIHNiLmJhcmxpbmUgPT09IFNtb0JhcmxpbmUuYmFybGluZXMuc2luZ2xlQmFyXHJcbiAgICAgICYmIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEJlZ0JhclR5cGUoVkYuQmFybGluZS50eXBlLk5PTkUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRCZWdCYXJUeXBlKHRvVmV4QmFybGluZVR5cGUoc2IpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCA+IDAgJiYgIXRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZU11bHRpbWVhc3VyZSkge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEVuZEJhclR5cGUodmV4QmFybGluZVR5cGVbdGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVFbmRCYXJsaW5lXSk7XHJcbiAgICB9IGVsc2UgaWYgKGViLmJhcmxpbmUgIT09IFNtb0JhcmxpbmUuYmFybGluZXMuc2luZ2xlQmFyKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0RW5kQmFyVHlwZSh0b1ZleEJhcmxpbmVUeXBlKGViKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3ltICYmIHN5bS5zeW1ib2wgIT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzLk5vbmUpIHtcclxuICAgICAgY29uc3QgcmVwID0gbmV3IFZGLlJlcGV0aXRpb24odG9WZXhTeW1ib2woc3ltKSwgc3ltLnhPZmZzZXQgKyB0aGlzLnNtb01lYXN1cmUuc3RhZmZYLCBzeW0ueU9mZnNldCk7XHJcbiAgICAgIHRoaXMuc3RhdmUuZ2V0TW9kaWZpZXJzKCkucHVzaChyZXApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG1zID0gdGhpcy5zbW9NZWFzdXJlLmdldE1lYXN1cmVUZXh0KCk7XHJcbiAgICAvLyBUT0RPOiBzZXQgZm9udFxyXG4gICAgdG1zLmZvckVhY2goKHRtYjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSkgPT4ge1xyXG4gICAgICBjb25zdCB0bSA9IHRtYiBhcyBTbW9NZWFzdXJlVGV4dDtcclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gdG0ucG9zaXRpb24gPT09IFNtb01lYXN1cmVUZXh0LnBvc2l0aW9ucy5sZWZ0ID8gdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0IDogMDtcclxuICAgICAgY29uc3Qgc3RhdmVUZXh0ID0gY3JlYXRlU3RhdmVUZXh0KHRtLnRleHQsIHRvVmV4VGV4dFBvc2l0aW9uKHRtKSwgXHJcbiAgICAgIHtcclxuICAgICAgICBzaGlmdFg6IHRtLmFkanVzdFggKyBvZmZzZXQsIHNoaWZ0WTogdG0uYWRqdXN0WSwganVzdGlmaWNhdGlvbjogdG9WZXhUZXh0SnVzdGlmaWNhdGlvbih0bSlcclxuICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN0YXZlPy5hZGRNb2RpZmllcihzdGF2ZVRleHQpO1xyXG5cclxuICAgICAgLy8gaGFjayAtIHdlIGNhbid0IGNyZWF0ZSBzdGF2ZVRleHQgZGlyZWN0bHkgc28gdGhpcyBpcyB0aGUgb25seSB3YXkgSSBjb3VsZCBzZXQgdGhlIGZvbnRcclxuICAgICAgY29uc3QgYXIgPSB0aGlzLnN0YXZlIS5nZXRNb2RpZmllcnMoKTtcclxuICAgICAgY29uc3Qgdm0gPSBhclthci5sZW5ndGggLSAxXTtcclxuICAgICAgdm0uc2V0Rm9udCh0bS5mb250SW5mbyk7XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLnJvd0luU3lzdGVtID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHJtYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRSZWhlYXJzYWxNYXJrKCk7XHJcbiAgICAgIGNvbnN0IHJtID0gcm1iIGFzIFNtb1JlaGVhcnNhbE1hcms7XHJcbiAgICAgIGlmIChybSkge1xyXG4gICAgICAgIHRoaXMuc3RhdmUuc2V0U2VjdGlvbihybS5zeW1ib2wsIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGVtcG8gPSB0aGlzLnNtb01lYXN1cmUuZ2V0VGVtcG8oKTtcclxuICAgIGlmICh0ZW1wbyAmJiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlVGVtcG8pIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRUZW1wbyh0ZW1wby50b1ZleFRlbXBvKCksIC0xICogdGVtcG8ueU9mZnNldCk7XHJcbiAgICAgIGNvbnN0IHZleFRlbXBvID0gdGhpcy5zdGF2ZS5nZXRNb2RpZmllcnMoKS5maW5kKChtb2Q6IFN0YXZlTW9kaWZpZXIpID0+IG1vZC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ1N0YXZlVGVtcG8nKTtcclxuICAgICAgaWYgKHZleFRlbXBvKSB7XHJcbiAgICAgICAgdmV4VGVtcG8uc2V0Rm9udCh7IGZhbWlseTogU291cmNlU2VyaWZQcm9Gb250LmZvbnRGYW1pbHksIHNpemU6IDEzLCB3ZWlnaHQ6ICdib2xkJyB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFsbCBWZXggbm90ZXMgYW5kIG1vZGlmaWVycy4gIFdlIGRlZmVyIHRoZSBmb3JtYXQgYW5kIHJlbmRlcmluZyBzb1xyXG4gICAqIHdlIGNhbiBhbGlnbiBhY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXHJcbiAgICovXHJcbiAgcHJlRm9ybWF0KCkge1xyXG4gICAgdmFyIGogPSAwO1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudCA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlRW1wdHlNZWFzdXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIE5vdGU6IG5lZWQgdG8gZG8gdGhpcyB0byBnZXQgaXQgaW50byBWRVggS1MgZm9ybWF0XHJcbiAgICBjb25zdCBzdGFmZlggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZYICsgdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0O1xyXG4gICAgY29uc3Qgc3RhZmZZID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWSAtIHRoaXMuY29udGV4dC5ib3gueTtcclxuICAgIGNvbnN0IGtleSA9IFNtb011c2ljLnZleEtleVNpZ25hdHVyZVRyYW5zcG9zZSh0aGlzLnNtb01lYXN1cmUua2V5U2lnbmF0dXJlLCAwKTtcclxuICAgIGNvbnN0IGNhbmNlbGVkS2V5ID0gU21vTXVzaWMudmV4S2V5U2lnbmF0dXJlVHJhbnNwb3NlKHRoaXMuc21vTWVhc3VyZS5jYW5jZWxlZEtleVNpZ25hdHVyZSwgMCk7XHJcbiAgICBjb25zdCBzbW9WZXhTdGF2ZVBhcmFtcyA9IHtcclxuICAgICAgeDogc3RhZmZYLFxyXG4gICAgICB5OiBzdGFmZlksXHJcbiAgICAgIHBhZExlZnQ6IHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCxcclxuICAgICAgaWQ6IHRoaXMuc21vTWVhc3VyZS5pZCxcclxuICAgICAgc3RhZmZYOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZYLFxyXG4gICAgICBzdGFmZlk6IHRoaXMuc21vTWVhc3VyZS5zdGFmZlksXHJcbiAgICAgIHN0YWZmV2lkdGg6IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoLFxyXG4gICAgICBmb3JjZUNsZWY6IHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VDbGVmLFxyXG4gICAgICBjbGVmOiB0aGlzLnNtb01lYXN1cmUuY2xlZixcclxuICAgICAgZm9yY2VLZXk6IHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VLZXlTaWduYXR1cmUsXHJcbiAgICAgIGtleSxcclxuICAgICAgY2FuY2VsZWRLZXksXHJcbiAgICAgIHN0YXJ0WDogdGhpcy5zbW9NZWFzdXJlLnN2Zy5tYXhDb2x1bW5TdGFydFgsXHJcbiAgICAgIGFkalg6IHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqWCxcclxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LmdldENvbnRleHQoKVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF2ZSA9IGNyZWF0ZVN0YXZlKHNtb1ZleFN0YXZlUGFyYW1zKTtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlVGltZVNpZ25hdHVyZSkge1xyXG4gICAgICBjb25zdCB0cyA9IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlO1xyXG4gICAgICBsZXQgdHNTdHJpbmcgPSB0cy50aW1lU2lnbmF0dXJlO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUudXNlU3ltYm9sICYmIHRzLmFjdHVhbEJlYXRzID09PSA0ICYmIHRzLmJlYXREdXJhdGlvbiA9PT0gNCkge1xyXG4gICAgICAgIHRzU3RyaW5nID0gJ0MnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLnVzZVN5bWJvbCAmJiB0cy5hY3R1YWxCZWF0cyA9PT0gMiAmJiB0cy5iZWF0RHVyYXRpb24gPT09IDQpIHtcclxuICAgICAgICB0c1N0cmluZyA9ICdDfCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuZGlzcGxheVN0cmluZy5sZW5ndGgpIHtcclxuICAgICAgICB0c1N0cmluZyA9IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmRpc3BsYXlTdHJpbmc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF2ZS5hZGRUaW1lU2lnbmF0dXJlKHRzU3RyaW5nKTtcclxuICAgIH1cclxuICAgIC8vIENvbm5lY3QgaXQgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0IGFuZCBkcmF3IVxyXG4gICAgdGhpcy5zdGF2ZS5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpO1xyXG4gICAgaWYgKHRoaXMuc21vVGFiU3RhdmUgJiYgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJTdGF2ZUJveD8ud2lkdGgpIHtcclxuICAgICAgY29uc3QgYm94ID0gdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJTdGF2ZUJveDtcclxuICAgICAgbGV0IHRhYldpZHRoID0gMDtcclxuICAgICAgYm94LnkgLT0gdGhpcy5jb250ZXh0LmJveC55O1xyXG4gICAgICBib3gueCA9IHN0YWZmWCAtIHRoaXMuY29udGV4dC5ib3gueDtcclxuICAgICAgYm94LndpZHRoID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmV2lkdGg7XHJcbiAgICAgIHRoaXMudGFiU3RhdmUgPSBjcmVhdGVUYWJTdGF2ZShib3gsIHRoaXMuc21vVGFiU3RhdmUuc3BhY2luZywgdGhpcy5zbW9UYWJTdGF2ZS5udW1MaW5lcyk7XHJcbiAgICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlQ2xlZikge1xyXG4gICAgICAgIHRoaXMudGFiU3RhdmUuYWRkVGFiR2x5cGgoKTtcclxuICAgICAgICB0YWJXaWR0aCA9IHZleEdseXBoLmRpbWVuc2lvbnNbJ3RhYiddLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFiU3RhdmUuc2V0Tm90ZVN0YXJ0WCh0aGlzLnRhYlN0YXZlLmdldE5vdGVTdGFydFgoKSArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqWCAtIHRhYldpZHRoKTtcclxuICAgICAgdGhpcy50YWJTdGF2ZS5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlTWVhc3VyZU1vZGlmaWVycygpO1xyXG5cclxuICAgIHRoaXMudGlja21hcE9iamVjdCA9IHRoaXMuc21vTWVhc3VyZS5jcmVhdGVNZWFzdXJlVGlja21hcHMoKTtcclxuICAgIHRoaXMuY3JlYXRlQ29sbGlzaW9uVGlja21hcCgpO1xyXG5cclxuICAgIHRoaXMudm9pY2VBciA9IFtdO1xyXG4gICAgdGhpcy52ZXhOb3RlcyA9IFtdO1xyXG4gICAgdGhpcy5ub3RlVG9WZXhNYXAgPSB7fTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdm9pY2VzLCBhZGQgdGhlbSBhbGwgdG8gdGhlIGZvcm1hdHRlciBhdCB0aGUgc2FtZSB0aW1lIHNvIHRoZXkgZG9uJ3QgY29sbGlkZVxyXG4gICAgZm9yIChqID0gMDsgaiA8IHRoaXMuc21vTWVhc3VyZS52b2ljZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgY29uc3Qgc21vVmV4Vm9pY2VQYXJhbXMgPSB7XHJcbiAgICAgICAgYWN0dWFsQmVhdHM6IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzLFxyXG4gICAgICAgIGJlYXREdXJhdGlvbjogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uLFxyXG4gICAgICAgIG5vdGVzOiB0aGlzLnZleE5vdGVzXHJcbiAgICAgIH1cclxuICAgIGlmICghdGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggJiYgIXRoaXMuc21vTWVhc3VyZS5yZXBlYXRTeW1ib2wpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVZleE5vdGVzKGopO1xyXG4gICAgICAgIHNtb1ZleFZvaWNlUGFyYW1zLm5vdGVzID0gdGhpcy52b2ljZU5vdGVzO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmV4VHVwbGV0cyhqKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVZleEJlYW1Hcm91cHMoaik7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIHZvaWNlIGluIDQvNCBhbmQgYWRkIGFib3ZlIG5vdGVzXHJcbiAgICAgICAgY29uc3Qgdm9pY2UgPSBjcmVhdGVWb2ljZShzbW9WZXhWb2ljZVBhcmFtcyk7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyLnB1c2godm9pY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnNtb01lYXN1cmUucmVwZWF0U3ltYm9sKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVSZXBlYXRTeW1ib2woKTtcclxuICAgICAgICAvLyBDcmVhdGUgYSB2b2ljZSBpbiA0LzQgYW5kIGFkZCBhYm92ZSBub3Rlc1xyXG4gICAgICAgIGNvbnN0IHZvaWNlID0gY3JlYXRlVm9pY2Uoc21vVmV4Vm9pY2VQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMudm9pY2VBci5wdXNoKHZvaWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTmVlZCB0byBmb3JtYXQgZm9yIHggcG9zaXRpb24sIHRoZW4gc2V0IHkgcG9zaXRpb24gYmVmb3JlIGRyYXdpbmcgZHluYW1pY3MuXHJcbiAgICB0aGlzLmZvcm1hdHRlciA9IG5ldyBWRi5Gb3JtYXR0ZXIoeyBzb2Z0bWF4RmFjdG9yOiB0aGlzLnNvZnRtYXgsIGdsb2JhbFNvZnRtYXg6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5mb3JtYXR0ZXIuam9pblZvaWNlcyh0aGlzLnZvaWNlQXIpO1xyXG4gICAgaWYgKHRoaXMudGFiU3RhdmUpIHtcclxuICAgICAgdGhpcy50YWJWb2ljZSA9IGNyZWF0ZVZvaWNlKHtcclxuICAgICAgICBhY3R1YWxCZWF0czogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYWN0dWFsQmVhdHMsXHJcbiAgICAgICAgYmVhdER1cmF0aW9uOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24sXHJcbiAgICAgICAgbm90ZXM6IHRoaXMudGFiTm90ZXNcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9ybWF0dGVyLmpvaW5Wb2ljZXMoW3RoaXMudGFiVm9pY2VdKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSBWZXggZm9ybWF0dGVyIHRoYXQgY2FsY3VsYXRlcyB0aGUgWCBhbmQgWSBwb3NpdGlvbnMgb2YgdGhlIG5vdGVzLiAgQSBmb3JtYXR0ZXJcclxuICAgKiBtYXkgYWN0dWFsbHkgc3BhbiBtdWx0aXBsZSBzdGF2ZXMgZm9yIGp1c3RpZmllZCBzdGF2ZXMuICBUaGUgbm90ZXMgYXJlIGRyYXduIGluIHRoZWlyXHJcbiAgICogaW5kaXZpZHVhbCB2eE1lYXN1cmUgb2JqZWN0cyBidXQgZm9ybWF0dGluZyBpcyBkb25lIG9uY2UgZm9yIGFsbCBqdXN0aWZpZWQgc3RhdmVzXHJcbiAgICogQHBhcmFtIHZvaWNlcyBWb2ljZSBvYmplY3RzIGZyb20gVmV4Rmxvd1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGZvcm1hdCh2b2ljZXM6IFZvaWNlW10pIHtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVFbXB0eU1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0ID0gZ2V0TXVsdGltZWFzdXJlUmVzdCh0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCk7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpO1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3Quc2V0U3RhdmUodGhpcy5zdGF2ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtYXR0ZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICBjb25zdCBzdGFmZldpZHRoID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmV2lkdGggLVxyXG4gICAgICAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tYXhDb2x1bW5TdGFydFggKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalJpZ2h0ICsgdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0KSAtIDEwO1xyXG4gICAgdGhpcy5kYmdMZWZ0WCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlggKyAgdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0ICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpYO1xyXG4gICAgdGhpcy5kYmdXaWR0aCA9IHN0YWZmV2lkdGg7XHJcbiAgICB0aGlzLmZvcm1hdHRlci5mb3JtYXQodm9pY2VzLCBzdGFmZldpZHRoKTtcclxuICAgIGlmICh0aGlzLnRhYlZvaWNlICYmIHRoaXMudGFiTm90ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0dGVyLmZvcm1hdChbdGhpcy50YWJWb2ljZV0sIHN0YWZmV2lkdGgpO1xyXG4gICAgfVxyXG4gICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLkZPUk1BVCwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiByZW5kZXIgaXMgY2FsbGVkIGFmdGVyIGZvcm1hdC4gIEFjdHVhbGx5IGRyYXcgdGhlIHRoaW5ncy5cclxuICAgKi9cclxuICByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlRW1wdHlNZWFzdXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLm9wZW5Hcm91cCgpIGFzIFNWR1NWR0VsZW1lbnQ7XHJcbiAgICB2YXIgbW1DbGFzcyA9IHRoaXMuc21vTWVhc3VyZS5nZXRDbGFzc0lkKCk7XHJcbiAgICB2YXIgaiA9IDA7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBib3VuZCBlYWNoIG1lYXN1cmUgaW4gaXRzIG93biBTVkcgZ3JvdXAgZm9yIGVhc3kgZGVsZXRpb24gYW5kIG1hcHBpbmcgdG8gc2NyZWVuIGNvb3JkaW5hdGVcclxuICAgICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCh0aGlzLnNtb01lYXN1cmUuaWQpO1xyXG4gICAgICBncm91cC5jbGFzc0xpc3QuYWRkKG1tQ2xhc3MpO1xyXG4gICAgICBncm91cC5pZCA9IHRoaXMuc21vTWVhc3VyZS5pZDtcclxuICAgICAgdGhpcy5zdGF2ZSEuZHJhdygpO1xyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgPSBncm91cDtcclxuXHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnZvaWNlQXIubGVuZ3RoOyArK2opIHtcclxuICAgICAgICB0aGlzLnZvaWNlQXJbal0uZHJhdyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCB0aGlzLnN0YXZlISk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52ZXhCZWFtR3JvdXBzLmZvckVhY2goKGIpID0+IHtcclxuICAgICAgICBiLnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSkuZHJhdygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudmV4VHVwbGV0cy5mb3JFYWNoKCh0dXBsZXQpID0+IHtcclxuICAgICAgICB0dXBsZXQuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKS5kcmF3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5tdWx0aW1lYXN1cmVSZXN0KSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LmRyYXcoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLl91cGRhdGVMeXJpY0RvbVNlbGVjdG9ycygpO1xyXG4gICAgICB0aGlzLnJlbmRlckR5bmFtaWNzKCk7XHJcbiAgICAgIC8vIHRoaXMuc21vTWVhc3VyZS5hZGpYID0gdGhpcy5zdGF2ZS5zdGFydF94IC0gKHRoaXMuc21vTWVhc3VyZS5zdGFmZlgpO1xyXG5cclxuICAgICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgICAgIGlmICh0aGlzLnRhYlN0YXZlKSB7XHJcbiAgICAgICAgY29uc3QgdGFiU3RhdmVJZCA9IGAke3RoaXMuc21vTWVhc3VyZS5pZH0tdGFiYDtcclxuICAgICAgICBjb25zdCB0YWJHcm91cCA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkub3Blbkdyb3VwKCkgYXMgU1ZHU1ZHRWxlbWVudDtcclxuICAgICAgICB0YWJHcm91cC5jbGFzc0xpc3QuYWRkKHRhYlN0YXZlSWQpO1xyXG4gICAgICAgIHRoaXMudGFiU3RhdmUuZHJhdygpO1xyXG4gICAgICAgIHRoaXMudGFiVm9pY2U/LmRyYXcodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgdGhpcy50YWJTdGF2ZSk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50ID0gdGFiR3JvdXA7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlJFTkRFUiwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7XHJcbiAgICAgIGlmIChsYXlvdXREZWJ1Zy5tYXNrICYgbGF5b3V0RGVidWcudmFsdWVzWydhZGp1c3QnXSkge1xyXG4gICAgICAgIFN2Z0hlbHBlcnMuZGVidWdCb3hOb1RleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5zdmcsXHJcbiAgICAgICAgU3ZnSGVscGVycy5ib3hQb2ludHModGhpcy5kYmdMZWZ0WCwgXHJcbiAgICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnN0YWZmWSwgdGhpcy5kYmdXaWR0aCwgNDApLCAncmVuZGVyLXgtZGJnJywgMCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGV4Yykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3VuYWJsZSB0byByZW5kZXIgbWVhc3VyZSAnICsgdGhpcy5zbW9NZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4KTtcclxuICAgICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n");
450
450
 
451
451
  /***/ }),
452
452
 
@@ -490,7 +490,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
490
490
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
491
491
 
492
492
  "use strict";
493
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoMeasure: () => (/* binding */ SmoMeasure),\n/* harmony export */ SmoMeasureNumberParams: () => (/* binding */ SmoMeasureNumberParams),\n/* harmony export */ SmoMeasureStringParams: () => (/* binding */ SmoMeasureStringParams)\n/* harmony export */ });\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ \"./src/smo/data/tuplet.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../xform/tickMap */ \"./src/smo/xform/tickMap.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _xform_selections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../xform/selections */ \"./src/smo/xform/selections.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Contains definition and supporting classes for {@link SmoMeasure}.\n * Most of the engraving is done at the measure level. Measure contains multiple (at least 1)\n * voices, which in turn contain notes. Each measure also contains formatting information. This\n * is mostly serialized outside of measure (in score), since columns and often an entire region\n * share measure formatting. Measures also contain modifiers like barlines. Tuplets and beam groups\n * are contained at the measure level.\n * @module /smo/data/measure\n */\n\n\n\n\n\n\n\n\n\n\n// @internal\nconst SmoMeasureNumberParams = ['transposeIndex', 'activeVoice', 'lines', 'repeatCount'];\n// @internal\nconst SmoMeasureStringParams = ['keySignature'];\n/**\n * Only arrays and measure numbers are serilialized with default values.\n * @param params - result of serialization\n * @returns\n */\nfunction isSmoMeasureParamsSer(params) {\n var _a;\n if (!Array.isArray(params.voices) ||\n !Array.isArray(params.tupletTrees) || !Array.isArray(params.modifiers) ||\n typeof ((_a = params === null || params === void 0 ? void 0 : params.measureNumber) === null || _a === void 0 ? void 0 : _a.measureIndex) !== 'number') {\n return false;\n }\n return true;\n}\n/**\n * Data for a measure of music. Many rules of musical engraving are\n * enforced at a measure level: the duration of notes, accidentals, etc.\n *\n * Measures contain {@link SmoNote}, {@link SmoTuplet}, and {@link SmoBeamGroup}\n * Measures are contained in {@link SmoSystemStaff}\n * @category SmoObject\n */\nclass SmoMeasure {\n static get timeSignatureDefault() {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n }\n /**\n * Default constructor parameters. Defaults are always copied so the\n * caller can modify them to create a new measure.\n * @returns constructor params for a new measure\n */\n static get defaults() {\n const proto = JSON.parse(JSON.stringify(SmoMeasure._defaults));\n proto.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n proto.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n return proto;\n }\n // @ignore\n static convertLegacyTimeSignature(ts) {\n const rv = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n rv.timeSignature = ts;\n return rv;\n }\n /**\n * Fill in components. We assume the modifiers are already constructed,\n * e.g. by deserialize or the calling function.\n * @param params\n */\n constructor(params) {\n this.timeSignature = SmoMeasure.timeSignatureDefault;\n /**\n * Overrides display of actual time signature, in the case of\n * pick-up notes where the actual and displayed durations are different\n */\n this.keySignature = '';\n this.canceledKeySignature = '';\n this.tupletTrees = [];\n this.repeatSymbol = false;\n this.repeatCount = 0;\n this.ctor = 'SmoMeasure';\n /**\n * Adjust for non-concert pitch intstruments\n */\n this.transposeIndex = 0;\n this.modifiers = [];\n /**\n * Row, column, and custom numbering information about this measure.\n */\n this.measureNumber = {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n };\n this.clef = 'treble';\n this.voices = [];\n /**\n * the active voice in the editor, if there are multiple voices\n * */\n this.activeVoice = 0;\n this.beamGroups = [];\n this.lines = 5;\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n this.svg = {\n staffWidth: 0,\n unjustifiedWidth: 0,\n staffX: 0,\n staffY: 0,\n logicalBox: {\n x: 0, y: 0, width: 0, height: 0\n },\n yTop: 0,\n adjX: 0,\n maxColumnStartX: 0,\n adjRight: 0,\n history: [],\n lineIndex: 0,\n pageIndex: 0,\n rowInSystem: 0,\n forceClef: false,\n forceKeySignature: false,\n forceTimeSignature: false,\n forceTempo: false,\n hideEmptyMeasure: false,\n hideMultimeasure: false,\n multimeasureLength: 0,\n multimeasureEndBarline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines['singleBar'],\n element: null\n };\n const defaults = SmoMeasure.defaults;\n SmoMeasureNumberParams.forEach((param) => {\n if (typeof (params[param]) !== 'undefined') {\n this[param] = params[param];\n }\n });\n SmoMeasureStringParams.forEach((param) => {\n this[param] = params[param] ? params[param] : defaults[param];\n });\n this.clef = params.clef;\n this.repeatSymbol = params.repeatSymbol;\n this.measureNumber = JSON.parse(JSON.stringify(params.measureNumber));\n if (params.tempo) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params.tempo);\n }\n // Handle legacy time signature format\n if (params.timeSignature) {\n const tsAny = params.timeSignature;\n if (typeof (tsAny) === 'string') {\n this.timeSignature = SmoMeasure.convertLegacyTimeSignature(tsAny);\n }\n else {\n this.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(tsAny);\n }\n }\n this.voices = params.voices ? params.voices : [];\n this.tupletTrees = params.tupletTrees ? params.tupletTrees : [];\n this.modifiers = params.modifiers ? params.modifiers : defaults.modifiers;\n this.setDefaultBarlines();\n this.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(this.keySignature, this.transposeIndex);\n if (!(params.format)) {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n this.format.measureIndex = this.measureNumber.measureIndex;\n }\n else {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(params.format);\n }\n this.id = (0,_common__WEBPACK_IMPORTED_MODULE_8__.getId)().toString();\n this.updateClefChangeNotes();\n }\n // @internal\n // used for serialization\n static get defaultAttributes() {\n return [\n 'keySignature',\n 'measureNumber',\n 'activeVoice', 'clef', 'transposeIndex',\n 'format', 'rightMargin', 'lines', 'repeatSymbol', 'repeatCount'\n ];\n }\n // @internal\n // used for serialization\n static get formattingOptions() {\n return ['customStretch', 'customProportion', 'autoJustify', 'systemBreak',\n 'pageBreak', 'padLeft'];\n }\n // @internal\n // used for serialization\n static get columnMappedAttributes() {\n return ['timeSignature', 'keySignature', 'tempo'];\n }\n static get serializableAttributes() {\n const rv = [];\n SmoMeasure.defaultAttributes.forEach((attr) => {\n if (SmoMeasure.columnMappedAttributes.indexOf(attr) < 0 && attr !== 'format') {\n rv.push(attr);\n }\n });\n return rv;\n }\n /**\n // Return true if the time signatures are the same, for display purposes (e.g. if a time sig change\n // is required)\n */\n static timeSigEqual(o1, o2) {\n return o1.timeSignature === o2.timeSignature && o1.useSymbol === o2.useSymbol;\n }\n /**\n * If there is a clef change mid-measure, update the actual clefs of the notes\n * so they display correctly.\n */\n updateClefChangeNotes() {\n let changed = false;\n let curTick = 0;\n let clefChange = this.clef;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n smoNote.clef = this.clef;\n if (smoNote.clefNote && smoNote.clefNote.clef !== this.clef) {\n clefChange = smoNote.clefNote.clef;\n curTick += smoNote.tickCount;\n changed = true;\n break;\n }\n curTick += smoNote.tickCount;\n }\n if (changed) {\n break;\n }\n }\n if (!changed) {\n return;\n }\n // clefChangeTick is where the change goes. We only support\n // one per measure, others are ignored.\n const clefChangeTick = curTick;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n const noteTicks = smoNote.tickCount;\n if (curTick + noteTicks >= clefChangeTick) {\n smoNote.clef = clefChange;\n }\n // Remove any redundant clef changes later in the measure\n if (curTick + noteTicks > clefChangeTick) {\n if (smoNote.clefNote && smoNote.clefNote.clef === clefChange) {\n smoNote.clefNote = null;\n }\n }\n curTick += noteTicks;\n }\n }\n }\n /**\n * @internal\n * @returns column mapped parameters, serialized. caller will\n * decide if the parameters need to be persisted\n */\n serializeColumnMapped() {\n //\n return {\n timeSignature: this.timeSignature.serialize(),\n keySignature: this.keySignature,\n tempo: this.tempo.serialize()\n };\n }\n getColumnMapped() {\n return {\n timeSignature: this.timeSignature,\n keySignature: this.keySignature,\n tempo: this.tempo\n };\n }\n /**\n * Convert this measure object to a JSON object, recursively serializing all the notes,\n * note modifiers, etc.\n */\n serialize() {\n const params = { \"ctor\": \"SmoMeasure\" };\n let ser = true;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoMeasure.defaults, SmoMeasure.serializableAttributes, this, params);\n // Don't serialize default things\n const fmt = this.format.serialize();\n // measure number can't be defaulted b/c tempos etc. can map to default measure\n params.measureNumber = JSON.parse(JSON.stringify(this.measureNumber));\n params.tupletTrees = [];\n params.voices = [];\n params.modifiers = [];\n this.tupletTrees.forEach((tupletTree) => {\n params.tupletTrees.push(tupletTree.serialize());\n });\n this.voices.forEach((voice) => {\n const obj = {\n notes: []\n };\n voice.notes.forEach((note) => {\n obj.notes.push(note.serialize());\n });\n params.voices.push(obj);\n });\n this.modifiers.forEach((modifier) => {\n ser = true;\n /* don't serialize default modifiers */\n if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start &&\n modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end\n && modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoTempoText') {\n // we don't save tempo text as a modifier anymore\n ser = false;\n }\n else if (modifier.ctor === 'SmoRepeatSymbol' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.positions.start\n && modifier.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols.None) {\n ser = false;\n }\n if (ser) {\n params.modifiers.push(modifier.serialize());\n }\n });\n // ['timeSignature', 'keySignature', 'tempo']\n if (!isSmoMeasureParamsSer(params)) {\n throw 'invalid measure';\n }\n return params;\n }\n /**\n * restore a serialized measure object. Usually called as part of deserializing a score,\n * but can also be used to restore a measure due to an undo operation. Recursively\n * deserialize all the notes and modifiers to construct a new measure.\n * @param jsonObj the serialized SmoMeasure\n * @returns\n */\n static deserialize(jsonObj) {\n var _a;\n let j = 0;\n let i = 0;\n const voices = [];\n for (j = 0; j < jsonObj.voices.length; ++j) {\n const voice = jsonObj.voices[j];\n const notes = [];\n voices.push({\n notes\n });\n for (i = 0; i < voice.notes.length; ++i) {\n const noteParams = voice.notes[i];\n const smoNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.deserialize(noteParams);\n notes.push(smoNote);\n }\n }\n const modifiers = [];\n jsonObj.modifiers.forEach((modParams) => {\n const modifier = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modParams);\n modifiers.push(modifier);\n });\n const params = SmoMeasure.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, jsonObj, params);\n // explode column-mapped\n if (jsonObj.tempo) {\n params.tempo = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.deserialize(jsonObj.tempo);\n }\n else {\n params.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n // timeSignatureString is now part of timeSignature. upconvert old scores\n let timeSignatureString = '';\n const jsonLegacy = jsonObj;\n if (typeof (jsonLegacy.timeSignatureString) === 'string' && jsonLegacy.timeSignatureString.length > 0) {\n timeSignatureString = jsonLegacy.timeSignatureString;\n }\n if (jsonObj.timeSignature) {\n if (timeSignatureString.length) {\n jsonObj.timeSignature.displayString = timeSignatureString;\n }\n params.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.deserialize(jsonObj.timeSignature);\n }\n else {\n const tparams = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults;\n if (timeSignatureString.length) {\n tparams.displayString = timeSignatureString;\n }\n params.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(tparams);\n }\n params.keySignature = (_a = jsonObj.keySignature) !== null && _a !== void 0 ? _a : 'C';\n params.voices = voices;\n if (jsonObj.tupletTrees !== undefined) {\n for (j = 0; j < jsonObj.tupletTrees.length; ++j) {\n const tupletTreeJson = jsonObj.tupletTrees[j];\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.deserialize(tupletTreeJson);\n params.tupletTrees.push(tupletTree);\n }\n }\n //deserialization of a legacy tuplets\n //legacy schema had measure.tuplets, it is measure.tupletTrees now\n if (jsonObj.tuplets !== undefined) {\n for (j = 0; j < jsonObj.tuplets.length; ++j) {\n const tupJson = jsonObj.tuplets[j];\n // Legacy schema had attrs.id, now it is just id\n if (tupJson.attrs && tupJson.attrs.id) {\n tupJson.id = tupJson.attrs.id;\n }\n const tupletNotes = [];\n let startIndex = null;\n params.voices.forEach((voice) => {\n voice.notes.forEach((note, index) => {\n if (note.isTuplet && note.tupletId === tupJson.attrs.id) {\n tupletNotes.push(note);\n //we cannot trust startIndex coming from legacy json\n //we need to count index of the first note in the tuplet\n if (startIndex === null) {\n startIndex = index;\n }\n }\n });\n });\n // Bug fix: A tuplet with no notes may be been overwritten\n // in a copy/paste operation\n if (tupletNotes.length > 0) {\n tupJson.notes = tupletNotes;\n tupJson.startIndex = startIndex;\n tupJson.endIndex = tupJson.startIndex + tupletNotes.length - 1;\n }\n const tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTuplet.deserialize(tupJson);\n const tupletTree = new _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree({ tuplet: tuplet });\n params.tupletTrees.push(tupletTree);\n }\n }\n if (params.tupletTrees.length) {\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.syncTupletIds(params.tupletTrees, voices);\n }\n params.modifiers = modifiers;\n const measure = new SmoMeasure(params);\n // Handle migration for measure-mapped parameters\n measure.modifiers.forEach((mod) => {\n if (mod.ctor === 'SmoTempoText') {\n measure.tempo = mod;\n }\n });\n if (!measure.tempo) {\n measure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return measure;\n }\n static clone(measure) {\n return SmoMeasure.deserialize(measure.serialize());\n }\n static cloneForPasteOrUndo(measure) {\n const clonedMeasure = SmoMeasure.clone(measure);\n clonedMeasure.svg = measure.svg;\n // Ordinarily, the key/tempo/time is mapped to the stave, but since we are pasting measure-by\n // measure here, we want to preserve it.\n clonedMeasure.keySignature = measure.keySignature;\n clonedMeasure.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(measure.timeSignature);\n clonedMeasure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(measure.tempo);\n return clonedMeasure;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the default pitch\n * for a clef (appears on 3rd line)\n */\n static get defaultPitchForClef() {\n return {\n 'treble': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'bass': {\n letter: 'd',\n accidental: 'n',\n octave: 3\n },\n 'tenor': {\n letter: 'a',\n accidental: 'n',\n octave: 3\n },\n 'alto': {\n letter: 'c',\n accidental: 'n',\n octave: 4\n },\n 'soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'percussion': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'mezzo-soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'baritone-c': {\n letter: 'b',\n accidental: 'n',\n octave: 3\n },\n 'baritone-f': {\n letter: 'e',\n accidental: 'n',\n octave: 3\n },\n 'subbass': {\n letter: 'd',\n accidental: '',\n octave: 2\n },\n 'french': {\n letter: 'b',\n accidental: '',\n octave: 4\n } // no idea\n };\n }\n static set emptyMeasureNoteType(tt) {\n SmoMeasure._emptyMeasureNoteType = tt;\n }\n static get emptyMeasureNoteType() {\n return SmoMeasure._emptyMeasureNoteType;\n }\n static timeSignatureNotes(timeSignature, clef) {\n const pitch = SmoMeasure.defaultPitchForClef[clef];\n const maxTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(timeSignature.timeSignature);\n const noteTick = 8192 / (timeSignature.beatDuration / 2);\n let ticks = 0;\n const pnotes = [];\n while (ticks < maxTicks) {\n const nextNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n nextNote.pitches = [JSON.parse(JSON.stringify(pitch))];\n nextNote.noteType = 'r';\n nextNote.clef = clef;\n nextNote.ticks.numerator = noteTick;\n nextNote.stemTicks = noteTick;\n pnotes.push(new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(nextNote));\n ticks += noteTick;\n }\n if (timeSignature.beatDuration === 8 && (timeSignature.actualBeats % 3 === 0 || timeSignature.actualBeats % 2 !== 0)) {\n let ix = 0;\n pnotes.forEach((pnote) => {\n if ((ix + 1) % 3 === 0) {\n pnote.endBeam = true;\n }\n pnote.beamBeats = 2048 * 3;\n ix += 1;\n });\n }\n return pnotes;\n }\n /**\n * Get a measure full of default notes for a given timeSignature/clef.\n * returns 8th notes for triple-time meters, etc.\n * @param params\n * @returns\n */\n static getDefaultNotes(params) {\n return SmoMeasure.timeSignatureNotes(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature), params.clef);\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n * This version returns params with no notes, for callers that want to use their own notes.\n * If you want the default notes, see {@link getDefaultMeasureWithNotes}\n *\n * @param params\n * @returns\n */\n static getDefaultMeasure(params) {\n const obj = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, SmoMeasure.defaults, obj);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, params, obj);\n // Don't copy column-formatting options to new measure in new column\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.formattingOptions, SmoMeasure.defaults, obj);\n obj.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature);\n // The measure expects to get concert KS in constructor and adjust for instrument. So do the\n // opposite.\n obj.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(obj.keySignature, -1 * obj.transposeIndex);\n // Don't redisplay tempo for a new measure\n const rv = new SmoMeasure(obj);\n if (rv.tempo && rv.tempo.display) {\n rv.tempo.display = false;\n }\n return rv;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n *\n * @param params\n * @returns\n */\n static getDefaultMeasureWithNotes(params) {\n var measure = SmoMeasure.getDefaultMeasure(params);\n measure.voices.push({\n notes: SmoMeasure.getDefaultNotes(params)\n });\n // fix a bug.\n // new measures only have 1 voice, make sure active voice is 0\n measure.activeVoice = 0;\n return measure;\n }\n /**\n * used by xml export\n * @internal\n * @param val\n */\n getForceSystemBreak() {\n return this.format.systemBreak;\n }\n // @internal\n setDefaultBarlines() {\n if (!this.getStartBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n if (!this.getEndBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n }\n get containsSound() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n let j = 0;\n const voice = this.voices[i];\n for (j = 0; j < this.voices.length; ++j) {\n if (voice.notes[j].noteType === 'n') {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * The rendered width of the measure, or estimate of same\n */\n get staffWidth() {\n return this.svg.staffWidth;\n }\n /**\n * set the rendered width of the measure, or estimate of same\n */\n setWidth(width, description) {\n if (_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.flagSet(_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.values.measureHistory)) {\n this.svg.history.push('setWidth ' + this.staffWidth + '=> ' + width + ' ' + description);\n }\n if (isNaN(width)) {\n throw ('NAN in setWidth');\n }\n this.svg.staffWidth = width;\n }\n /**\n * Get rendered or estimated start x\n */\n get staffX() {\n return this.svg.staffX;\n }\n /**\n * Set rendered or estimated start x\n */\n setX(x, description) {\n if (isNaN(x)) {\n throw ('NAN in setX');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffX', x, description);\n this.svg.staffX = Math.round(x);\n }\n /**\n * A time signature has possibly changed. add/remove notes to\n * match the new length\n */\n alignNotesWithTimeSignature() {\n const tsTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n if (tsTicks === this.getMaxTicksVoice()) {\n return;\n }\n const replaceNoteWithDuration = (target, ar, note) => {\n const fitNote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n const duration = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.closestDurationTickLtEq(target);\n if (duration > 128) {\n fitNote.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n fitNote.stemTicks = duration;\n fitNote.pitches = note.pitches;\n fitNote.noteType = note.noteType;\n fitNote.clef = note.clef;\n ar.push(fitNote);\n }\n };\n const voices = [];\n const tuplets = [];\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n const newNotes = [];\n let voiceTicks = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n // if a tuplet, make sure the whole tuplet fits.\n if (note.isTuplet) {\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.getTupletTreeForNoteIndex(this.tupletTrees, i, j);\n if (tupletTree) {\n // remaining notes of an approved tuplet, just add them\n if (tupletTree.startIndex !== j) {\n newNotes.push(note);\n continue;\n }\n else if (tupletTree.totalTicks + voiceTicks <= tsTicks) {\n // first note of the tuplet, it fits, add it\n voiceTicks += tupletTree.totalTicks;\n newNotes.push(note);\n }\n else {\n // tuplet will not fit. Replace tuplet with a note as close to remainder as possible and add it\n // remove tuplet\n note.tupletId = null;\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.removeTupletForNoteIndex(this, i, j);\n break;\n }\n }\n else { // missing tuplet, now what?\n console.warn('missing tuplet info');\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n }\n }\n else {\n if (note.tickCount + voiceTicks <= tsTicks) {\n newNotes.push(note);\n voiceTicks += note.tickCount;\n }\n else {\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n break;\n }\n }\n }\n if (tsTicks - voiceTicks > 128) {\n const np = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n np.clef = this.clef;\n const nnote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(np);\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, nnote);\n }\n voices.push({ notes: newNotes });\n }\n this.voices = voices;\n }\n get measureNumberDbg() {\n return `${this.measureNumber.measureIndex}/${this.measureNumber.systemIndex}/${this.measureNumber.staffId}`;\n }\n /**\n * Get rendered or estimated start y\n */\n get staffY() {\n return this.svg.staffY;\n }\n /**\n * Set rendered or estimated start y\n */\n setY(y, description) {\n if (isNaN(y)) {\n throw ('NAN in setY');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffY', y, description);\n this.svg.staffY = Math.round(y);\n }\n /**\n * Return actual or estimated highest point in score\n */\n get yTop() {\n return this.svg.yTop;\n }\n /**\n * return the lowest y (highest value) in this measure svg\n *\n * @readonly\n */\n get lowestY() {\n if (this.svg.tabStaveBox) {\n return this.svg.tabStaveBox.y + this.svg.tabStaveBox.height;\n }\n else {\n return this.svg.logicalBox.y + this.svg.logicalBox.height;\n }\n }\n /**\n * adjust the y for the render boxes to account for the page and margins\n */\n adjustY(yOffset) {\n this.svg.logicalBox.y += yOffset;\n if (this.svg.tabStaveBox) {\n this.svg.tabStaveBox.y += yOffset;\n }\n }\n /**\n * WHen setting an instrument, offset the pitches to match the instrument key\n * @param offset\n * @param newClef\n */\n transposeToOffset(offset, targetKey, newClef) {\n const diff = offset - this.transposeIndex;\n newClef = newClef !== null && newClef !== void 0 ? newClef : this.clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n const pitches = [...Array(note.pitches.length).keys()];\n // when the note is a rest, preserve the rest but match the new clef.\n if (newClef !== this.clef && note.noteType === 'r') {\n // @ts-ignore\n const defp = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[newClef]));\n note.pitches = [defp];\n }\n else {\n note.transpose(pitches, diff, this.keySignature, targetKey);\n note.getGraceNotes().forEach((gn) => {\n const gpitch = [...Array(gn.pitches.length).keys()];\n const xpose = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.transpose(gn, gpitch, diff, this.keySignature, targetKey);\n gn.pitches = xpose.pitches;\n });\n }\n });\n });\n }\n /**\n * Return actual or estimated highest point in score\n */\n setYTop(y, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'yTop', y, description);\n this.svg.yTop = y;\n }\n /**\n * Return actual or estimated bounding box\n */\n setBox(box, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'logicalBox', box, description);\n this.svg.logicalBox = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.smoBox(box);\n }\n /**\n * @returns the DOM identifier for this measure when rendered\n */\n getClassId() {\n return 'mm-' + this.measureNumber.staffId + '-' + this.measureNumber.measureIndex;\n }\n /**\n *\n * @param id\n * @returns\n */\n getRenderedNote(id) {\n let j = 0;\n let i = 0;\n for (j = 0; j < this.voices.length; ++j) {\n const voice = this.voices[j];\n for (i = 0; i < voice.notes.length; ++i) {\n const note = voice.notes[i];\n if (note.renderId === id) {\n return {\n smoNote: note,\n voice: j,\n tick: i\n };\n }\n }\n }\n return null;\n }\n getNotes() {\n return this.voices[this.activeVoice].notes;\n }\n getActiveVoice() {\n return this.activeVoice;\n }\n setActiveVoice(vix) {\n if (vix >= 0 && vix < this.voices.length) {\n this.activeVoice = vix;\n }\n }\n tickmapForVoice(voiceIx) {\n return new _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__.TickMap(this, voiceIx);\n }\n // ### createMeasureTickmaps\n // A tickmap is a map of notes to ticks for the measure. It is speciifc per-voice\n // since each voice may have different numbers of ticks. The accidental map is\n // overall since accidentals in one voice apply to accidentals in the other\n // voices. So we return the tickmaps and the overall accidental map.\n createMeasureTickmaps() {\n let i = 0;\n const tickmapArray = [];\n const accidentalMap = {};\n for (i = 0; i < this.voices.length; ++i) {\n tickmapArray.push(this.tickmapForVoice(i));\n }\n for (i = 0; i < this.voices.length; ++i) {\n const tickmap = tickmapArray[i];\n const durationKeys = Object.keys((tickmap.durationAccidentalMap));\n durationKeys.forEach((durationKey) => {\n if (!accidentalMap[durationKey]) {\n accidentalMap[durationKey] = tickmap.durationAccidentalMap[durationKey];\n }\n else {\n const amap = accidentalMap[durationKey];\n const tickable = tickmap.durationAccidentalMap[durationKey];\n const letterKeys = Object.keys(tickable);\n letterKeys.forEach((pitchKey) => {\n if (!amap[pitchKey]) {\n amap[pitchKey] = tickmap.durationAccidentalMap[durationKey][pitchKey];\n }\n });\n }\n });\n }\n // duration: duration, pitches: Record<PitchLetter,TickAccidental>\n const accidentalArray = [];\n Object.keys(accidentalMap).forEach((durationKey) => {\n accidentalArray.push({ duration: durationKey, pitches: accidentalMap[durationKey] });\n });\n return {\n tickmaps: tickmapArray,\n accidentalMap,\n accidentalArray\n };\n }\n // ### createRestNoteWithDuration\n // pad some duration of music with rests.\n static createRestNoteWithDuration(duration, clef) {\n const pitch = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[clef]));\n const note = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n note.pitches = [pitch];\n note.noteType = 'r';\n note.hidden = true;\n note.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n return note;\n }\n /**\n * Count the number of ticks in each voice and return max\n * @returns\n */\n getMaxTicksVoice() {\n let i = 0;\n let max = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voiceTicks = this.getTicksFromVoice(i);\n max = Math.max(voiceTicks, max);\n }\n return max;\n }\n /**\n * Count the number of ticks in a specific voice\n * @param voiceIndex\n * @returns\n */\n getTicksFromVoice(voiceIndex) {\n let ticks = 0;\n this.voices[voiceIndex].notes.forEach((note) => {\n ticks += note.tickCount;\n });\n return ticks;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getNotePositionInTicks(voiceIndex, tickIndex) {\n let rv = 0;\n for (let i = 0; i < tickIndex; i++) {\n const note = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getTickCountForNote(voiceIndex, note) {\n let rv = 0;\n for (let i = 0; i < this.voices[voiceIndex].notes.length; i++) {\n const currentNote = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n getClosestIndexFromTickCount(voiceIndex, tickCount) {\n let i = 0;\n let rv = 0;\n for (i = 0; i < this.voices[voiceIndex].notes.length; ++i) {\n const note = this.voices[voiceIndex].notes[i];\n if (note.tickCount + rv >= tickCount) {\n return i;\n }\n rv += note.tickCount;\n }\n return i;\n }\n isPickup() {\n const ticks = this.getTicksFromVoice(0);\n const goal = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n return (ticks < goal);\n }\n clearBeamGroups() {\n this.beamGroups = [];\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setLyricFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricFont(fontInfo);\n });\n });\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricAdjustWidth(adjustNoteWidth);\n });\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordAdjustWidth(adjustNoteWidth);\n });\n });\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setChordFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordFont(fontInfo);\n });\n });\n }\n tupletNotes(smoTuplet) {\n let tupletNotes = [];\n for (let i = smoTuplet.startIndex; i <= smoTuplet.endIndex; i++) {\n const note = this.voices[smoTuplet.voice].notes[i];\n tupletNotes.push(note);\n }\n return tupletNotes;\n }\n getStemDirectionForTuplet(smoTuplet) {\n let note = null;\n for (let currentNote of this.tupletNotes(smoTuplet)) {\n if (currentNote.noteType === 'n') {\n note = currentNote;\n break;\n }\n }\n if (!note) {\n return _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n if (note.flagState !== _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.auto) {\n return note.flagState;\n }\n return _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToLedgerLine(this.clef, note.pitches[0])\n >= 2 ? _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.up : _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n getNoteById(id) {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.attrs.id === id) {\n return note;\n }\n }\n }\n return null;\n }\n setClef(clef) {\n const oldClef = this.clef;\n this.clef = clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.clef = clef;\n });\n });\n }\n /**\n * Get the clef that this measure ends with.\n * @returns\n */\n getLastClef() {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.clefNote && note.clefNote.clef !== this.clef) {\n return note.clefNote.clef;\n }\n }\n }\n return this.clef;\n }\n isRest() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n if (!voice.notes[j].isRest()) {\n return false;\n }\n }\n }\n return true;\n }\n // ### populateVoice\n // Create a new voice in this measure, and populate it with the default note\n // for this measure/key/clef\n populateVoice(index) {\n if (index !== this.voices.length) {\n return;\n }\n this.voices.push({ notes: SmoMeasure.getDefaultNotes(this) });\n this.activeVoice = index;\n }\n _removeSingletonModifier(name) {\n const ar = this.modifiers.filter(obj => obj.attrs.type !== name);\n this.modifiers = ar;\n }\n addRehearsalMark(parameters) {\n this._removeSingletonModifier('SmoRehearsalMark');\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRehearsalMark(parameters));\n }\n removeRehearsalMark() {\n this._removeSingletonModifier('SmoRehearsalMark');\n }\n getRehearsalMark() {\n return this.modifiers.find(obj => obj.attrs.type === 'SmoRehearsalMark');\n }\n getModifiersByType(type) {\n return this.modifiers.filter((mm) => type === mm.attrs.type);\n }\n setTempo(params) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params);\n }\n /**\n * Set measure tempo to the default {@link SmoTempoText}\n */\n resetTempo() {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n getTempo() {\n if (typeof (this.tempo) === 'undefined') {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return this.tempo;\n }\n /**\n * Measure text is deprecated, and may not be supported in the future.\n * Better to use SmoTextGroup and attach to the measure.\n * @param mod\n * @returns\n */\n addMeasureText(mod) {\n var exist = this.modifiers.filter((mm) => mm.attrs.id === mod.attrs.id);\n if (exist.length) {\n return;\n }\n this.modifiers.push(mod);\n }\n getMeasureText() {\n return this.modifiers.filter(obj => obj.ctor === 'SmoMeasureText');\n }\n removeMeasureText(id) {\n var ar = this.modifiers.filter(obj => obj.attrs.id !== id);\n this.modifiers = ar;\n }\n setRepeatSymbol(rs) {\n const ar = [];\n let toAdd = true;\n const exSymbol = this.getRepeatSymbol();\n if (exSymbol && exSymbol.symbol === rs.symbol) {\n toAdd = false;\n }\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n if (toAdd) {\n ar.push(rs);\n }\n }\n getRepeatSymbol() {\n const rv = this.modifiers.filter(obj => obj.ctor === 'SmoRepeatSymbol');\n if (rv.length > 0) {\n return rv[0];\n }\n return null;\n }\n clearRepeatSymbols() {\n const ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n }\n setBarline(barline) {\n var ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline') {\n const o = modifier;\n if (o.position !== barline.position) {\n ar.push(o);\n }\n }\n else {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n ar.push(barline);\n }\n _getBarline(pos) {\n let rv = null;\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline' && modifier.position === pos) {\n rv = modifier;\n }\n });\n if (rv === null) {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.defaults);\n }\n return rv;\n }\n getEndBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end);\n }\n getStartBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start);\n }\n addNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoVolta' || modifier.startBar !== ending.startBar ||\n modifier.endBar !== ending.endBar) {\n mods.push(modifier);\n }\n });\n mods.push(ending);\n this.modifiers = mods;\n }\n removeNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n const volta = modifier;\n if (ending.startSelector === null || ending.endSelector === null || volta.startSelector === null || volta.endSelector === null) {\n return;\n }\n if (!_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.startSelector, volta.startSelector) || !_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.endSelector, volta.endSelector)\n && ending.number !== volta.number) {\n mods.push(modifier);\n }\n }\n else {\n mods.push(modifier);\n }\n });\n this.modifiers = mods;\n }\n getNthEndings() {\n const rv = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n rv.push(modifier);\n }\n });\n return rv;\n }\n setKeySignature(sig) {\n this.keySignature = sig;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.keySignature = sig;\n });\n });\n }\n setMeasureNumber(num) {\n this.measureNumber = num;\n }\n getBeamGroupForNote(note) {\n let i = 0;\n let j = 0;\n for (i = 0; i < this.beamGroups.length; ++i) {\n const bg = this.beamGroups[i];\n for (j = 0; j < bg.notes.length; ++j) {\n if (bg.notes[j].attrs.id === note.attrs.id) {\n return bg;\n }\n }\n }\n return null;\n }\n}\nSmoMeasure.defaultDupleDuration = 4096;\nSmoMeasure.defaultTripleDuration = 2048 * 3;\n// @internal\nSmoMeasure._defaults = {\n timeSignature: SmoMeasure.timeSignatureDefault,\n keySignature: 'C',\n tupletTrees: [],\n transposeIndex: 0,\n modifiers: [],\n // bars: [1, 1], // follows enumeration in VF.Barline\n measureNumber: {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n },\n clef: 'treble',\n lines: 5,\n voices: [],\n format: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults),\n activeVoice: 0,\n tempo: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults),\n repeatSymbol: false,\n repeatCount: 0\n};\nSmoMeasure._emptyMeasureNoteType = 'r';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SSxvQkFBUyxHQUFxQjtJQUM1QyxhQUFhLEVBQUUsVUFBVSxDQUFDLG9CQUFvQjtJQUM5QyxZQUFZLEVBQUUsR0FBRztJQUNqQixXQUFXLEVBQUUsRUFBRTtJQUNmLGNBQWMsRUFBRSxDQUFDO0lBQ2pCLFNBQVMsRUFBRSxFQUFFO0lBQ2IscURBQXFEO0lBQ3JELGFBQWEsRUFBRTtRQUNiLFVBQVUsRUFBRSxDQUFDO1FBQ2IsV0FBVyxFQUFFLENBQUM7UUFDZCxZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxJQUFJLEVBQUUsUUFBUTtJQUNkLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLEVBQUU7SUFDVixNQUFNLEVBQUUsSUFBSSwrREFBZ0IsQ0FBQywrREFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUM7SUFDZCxLQUFLLEVBQUUsSUFBSSwyREFBWSxDQUFDLDJEQUFZLENBQUMsUUFBUSxDQUFDO0lBQzlDLFlBQVksRUFBRSxLQUFLO0lBQ25CLFdBQVcsRUFBRSxDQUFDO0NBQ2Y7QUF3Z0JNLGdDQUFxQixHQUFhLEdBQUcsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9zbW8vZGF0YS9tZWFzdXJlLnRzP2Y5Y2MiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8qKlxyXG4gKiBDb250YWlucyBkZWZpbml0aW9uIGFuZCBzdXBwb3J0aW5nIGNsYXNzZXMgZm9yIHtAbGluayBTbW9NZWFzdXJlfS5cclxuICogTW9zdCBvZiB0aGUgZW5ncmF2aW5nIGlzIGRvbmUgYXQgdGhlIG1lYXN1cmUgbGV2ZWwuICBNZWFzdXJlIGNvbnRhaW5zIG11bHRpcGxlIChhdCBsZWFzdCAxKVxyXG4gKiB2b2ljZXMsIHdoaWNoIGluIHR1cm4gY29udGFpbiBub3Rlcy4gIEVhY2ggbWVhc3VyZSBhbHNvIGNvbnRhaW5zIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24uICBUaGlzXHJcbiAqIGlzIG1vc3RseSBzZXJpYWxpemVkIG91dHNpZGUgb2YgbWVhc3VyZSAoaW4gc2NvcmUpLCBzaW5jZSBjb2x1bW5zIGFuZCBvZnRlbiBhbiBlbnRpcmUgcmVnaW9uXHJcbiAqIHNoYXJlIG1lYXN1cmUgZm9ybWF0dGluZy4gIE1lYXN1cmVzIGFsc28gY29udGFpbiBtb2RpZmllcnMgbGlrZSBiYXJsaW5lcy4gIFR1cGxldHMgYW5kIGJlYW0gZ3JvdXBzXHJcbiAqIGFyZSBjb250YWluZWQgYXQgdGhlIG1lYXN1cmUgbGV2ZWwuXHJcbiAqIEBtb2R1bGUgL3Ntby9kYXRhL21lYXN1cmVcclxuICovXHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi9tdXNpYyc7XHJcbmltcG9ydCB7XHJcbiAgU21vQmFybGluZSwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgU21vUmVwZWF0U3ltYm9sLCBTbW9UZW1wb1RleHQsIFNtb01lYXN1cmVGb3JtYXQsXHJcbiAgU21vVm9sdGEsIFNtb1JlaGVhcnNhbE1hcmtQYXJhbXMsIFNtb1JlaGVhcnNhbE1hcmssIFNtb1RlbXBvVGV4dFBhcmFtcywgVGltZVNpZ25hdHVyZSxcclxuICBUaW1lU2lnbmF0dXJlUGFyYW1ldGVyc1NlciwgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlciwgU21vVGVtcG9UZXh0UGFyYW1zU2VyXHJcbn0gZnJvbSAnLi9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vTm90ZSwgTm90ZVR5cGUsIFNtb05vdGVQYXJhbXNTZXIgfSBmcm9tICcuL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9UdXBsZXQsIFNtb1R1cGxldFBhcmFtc1NlciwgU21vVHVwbGV0UGFyYW1zLCBTbW9UdXBsZXRUcmVlUGFyYW1zU2VyLCBTbW9UdXBsZXRUcmVlIH0gZnJvbSAnLi90dXBsZXQnO1xyXG5pbXBvcnQgeyBsYXlvdXREZWJ1ZyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgVGlja01hcCB9IGZyb20gJy4uL3hmb3JtL3RpY2tNYXAnO1xyXG5pbXBvcnQgeyBNZWFzdXJlTnVtYmVyLCBTdmdCb3gsIFNtb0F0dHJzLCBQaXRjaCwgUGl0Y2hMZXR0ZXIsIENsZWYsIFxyXG4gIFRpY2tBY2NpZGVudGFsLCBBY2NpZGVudGFsQXJyYXksIGdldElkIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3RvciB9IGZyb20gJy4uL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGb250SW5mbyB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4vc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9GcmV0UG9zaXRpb24gfSBmcm9tICcuL25vdGVNb2RpZmllcnMnO1xyXG4vKipcclxuICogVm9pY2UgaXMganVzdCBhIGNvbnRhaW5lciBmb3Ige0BsaW5rIFNtb05vdGV9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vVm9pY2Uge1xyXG4gIG5vdGVzOiBTbW9Ob3RlW11cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vVm9pY2VTZXIge1xyXG4gIG5vdGVzOiBTbW9Ob3RlUGFyYW1zU2VyW11cclxufVxyXG4vKipcclxuICogVGlja01hcHBhYmxlIGJyZWFrcyB1cCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgb24gbW9kaWZpZXJzXHJcbiAqIGxpa2UgQFNtb0R1cmF0aW9uXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGlja01hcHBhYmxlIHtcclxuICB2b2ljZXM6IFNtb1ZvaWNlW10sXHJcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVGljayB7XHJcbiAgdm9pY2VJbmRleDogbnVtYmVyLFxyXG4gIHRpY2tJbmRleDogbnVtYmVyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCcmVhayB1cCBhIGNpcmNsYXIgZGVwZW5kZW5jeSB3aXRoIHtAbGluayBTbW9CZWFtR3JvdXB9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNtb0JlYW1Hcm91cCB7XHJcbiAgbm90ZXM6IFNtb05vdGVbXSxcclxuICB2b2ljZTogbnVtYmVyLFxyXG4gIGF0dHJzOiBTbW9BdHRyc1xyXG59XHJcbi8qKlxyXG4gKiBnZW9tZXRyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWFzdXJlIGZvciByZW5kZXJpbmcgYW5kXHJcbiAqIHNjb3JlIGxheW91dC5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVTdmcge1xyXG4gIHN0YWZmV2lkdGg6IG51bWJlcixcclxuICB1bmp1c3RpZmllZFdpZHRoOiBudW1iZXIsXHJcbiAgYWRqWDogbnVtYmVyLCAvLyBUaGUgc3RhcnQgcG9pbnQgb2YgdGhlIG11c2ljIGluIHRoZSBzdGF2ZSAoYWZ0ZXIgdGltZSBzaWcsIGV0YylcclxuICBtYXhDb2x1bW5TdGFydFg6IG51bWJlcixcclxuICBzdGFmZlg6IG51bWJlciwgLy8gVGhlIGxlZnQtbW9zdCB4IHBvc2l0aW9uIG9mIHRoZSBzdGFmZlxyXG4gIHN0YWZmWTogbnVtYmVyLFxyXG4gIGxvZ2ljYWxCb3g6IFN2Z0JveCxcclxuICB5VG9wOiBudW1iZXIsXHJcbiAgYWRqUmlnaHQ6IG51bWJlcixcclxuICBoaXN0b3J5OiBzdHJpbmdbXSxcclxuICBsaW5lSW5kZXg6IG51bWJlcixcclxuICBwYWdlSW5kZXg6IG51bWJlcixcclxuICByb3dJblN5c3RlbTogbnVtYmVyLFxyXG4gIGZvcmNlQ2xlZjogYm9vbGVhbixcclxuICBmb3JjZUtleVNpZ25hdHVyZTogYm9vbGVhbixcclxuICBmb3JjZVRpbWVTaWduYXR1cmU6IGJvb2xlYW4sXHJcbiAgZm9yY2VUZW1wbzogYm9vbGVhbixcclxuICBoaWRlRW1wdHlNZWFzdXJlOiBib29sZWFuLFxyXG4gIGhpZGVNdWx0aW1lYXN1cmU6IGJvb2xlYW4sXHJcbiAgbXVsdGltZWFzdXJlTGVuZ3RoOiBudW1iZXIsXHJcbiAgbXVsdGltZWFzdXJlRW5kQmFybGluZTogbnVtYmVyLFxyXG4gIGVsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsLFxyXG4gIHRhYlN0YXZlQm94PzogU3ZnQm94LFxyXG4gIHRhYkVsZW1lbnQ/OiBTVkdTVkdFbGVtZW50XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGEgIHtAbGluayBUaWNrTWFwfSBmb3IgZWFjaCB2b2ljZVxyXG4gKiBmb3IgZm9ybWF0dGluZ1xyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVUaWNrbWFwcyB7XHJcbiAgdGlja21hcHM6IFRpY2tNYXBbXSxcclxuICBhY2NpZGVudGFsTWFwOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBUaWNrQWNjaWRlbnRhbD4+LFxyXG4gIGFjY2lkZW50YWxBcnJheTogQWNjaWRlbnRhbEFycmF5W11cclxufVxyXG4vKipcclxuICogQ29sdW1uLW1hcHBlZCBtb2RpZmllcnMsIG1hbmFnZWQgYnkgdGhlIHtAbGluayBTbW9TY29yZX1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5NYXBwZWRQYXJhbXMge1xyXG4gIC8vIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXVxyXG4gIHRpbWVTaWduYXR1cmU6IGFueSxcclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyxcclxuICB0ZW1wbzogYW55XHJcbn1cclxuLy8gQGludGVybmFsXHJcbmV4cG9ydCB0eXBlIFNtb01lYXN1cmVOdW1iZXJQYXJhbSA9ICd0cmFuc3Bvc2VJbmRleCcgfCAnYWN0aXZlVm9pY2UnIHwgJ2xpbmVzJyB8ICdyZXBlYXRDb3VudCc7XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgY29uc3QgU21vTWVhc3VyZU51bWJlclBhcmFtczogU21vTWVhc3VyZU51bWJlclBhcmFtW10gPSBbJ3RyYW5zcG9zZUluZGV4JywgJ2FjdGl2ZVZvaWNlJywgJ2xpbmVzJywgJ3JlcGVhdENvdW50J107XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgdHlwZSBTbW9NZWFzdXJlU3RyaW5nUGFyYW0gPSAna2V5U2lnbmF0dXJlJztcclxuLy8gQGludGVybmFsXHJcbmV4cG9ydCBjb25zdCBTbW9NZWFzdXJlU3RyaW5nUGFyYW1zOiBTbW9NZWFzdXJlU3RyaW5nUGFyYW1bXSA9IFsna2V5U2lnbmF0dXJlJ107XHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciBhIHtAbGluayBTbW9NZWFzdXJlfS4gIFVzdWFsbHkgeW91IHdpbGwgY2FsbFxyXG4gKiB7QGxpbmsgU21vTWVhc3VyZS5kZWZhdWx0c30sIGFuZCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgeW91IG5lZWQgdG8gY2hhbmdlLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGltZVNpZ25hdHVyZVxyXG4gKiBAcGFyYW0ga2V5U2lnbmF0dXJlXHJcbiAqIEBwYXJhbSB0dXBsZXRzXHJcbiAqIEBwYXJhbSB0cmFuc3Bvc2VJbmRleCBjYWxjdWxhdGVkIGZyb20ge0BsaW5rIFNtb1BhcnRJbmZvfSBmb3Igbm9uLWNvbmNlcnQta2V5IGluc3RydW1lbnRzXHJcbiAqIEBwYXJhbSBsaW5lcyBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHN0YXZlXHJcbiAqIEBwYXJhbSBzdGFmZlkgWSBjb29yZGluYXRlIChVTCBjb3JuZXIpIG9mIHRoZSBtZWFzdXJlIHN0YXZlXHJcbiAqIEBwYXJhbSBtZWFzdXJlTnVtYmVyIGNvbWJpbmF0aW9uIGNvbmZpZ3VyZWQvY2FsY3VsYXRlZCBtZWFzdXJlIG51bWJlclxyXG4gKiBAcGFyYW0gY2xlZlxyXG4gKiBAcGFyYW0gdm9pY2VzXHJcbiAqIEBwYXJhbSBhY3RpdmVWb2ljZSB0aGUgYWN0aXZlIHZvaWNlIGluIHRoZSBlZGl0b3JcclxuICogQHBhcmFtIHRlbXBvXHJcbiAqIEBwYXJhbSBmb3JtYXQgbWVhc3VyZSBmb3JtYXQsIGlzIG1hbmFnZWQgYnkgdGhlIHNjb3JlXHJcbiAqIEBwYXJhbSBtb2RpZmllcnMgQWxsIG1lYXN1cmUgbW9kaWZpZXJzIHRoYXQ1IGFyZW4ndCBmb3JtYXQsIHRpbWVTaWduYXR1cmUgb3IgdGVtcG9cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NZWFzdXJlUGFyYW1zIHtcclxuICB0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlLFxyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nLFxyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlW10sXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlcixcclxuICBsaW5lczogbnVtYmVyLFxyXG4gIC8vIGJhcnM6IFsxLCAxXSwgLy8gZm9sbG93cyBlbnVtZXJhdGlvbiBpbiBWRi5CYXJsaW5lXHJcbiAgbWVhc3VyZU51bWJlcjogTWVhc3VyZU51bWJlcixcclxuICBjbGVmOiBDbGVmLFxyXG4gIHZvaWNlczogU21vVm9pY2VbXSxcclxuICBhY3RpdmVWb2ljZTogbnVtYmVyLFxyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHQsXHJcbiAgZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0IHwgbnVsbCxcclxuICBtb2RpZmllcnM6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSxcclxuICByZXBlYXRTeW1ib2w6IGJvb2xlYW4sXHJcbiAgcmVwZWF0Q291bnQ6IG51bWJlclxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHNlcmlhbGl6ZWFibGUgYml0cyBvZiBTbW9NZWFzdXJlLiAgU29tZSBwYXJhbWV0ZXJzIGFyZSBcclxuICogbWFwcGVkIGJ5IHRoZSBzdGF2ZSBpZiB0aGUgZG9uJ3QgY2hhbmdlIGV2ZXJ5IG1lYXN1cmUsIGUuZy5cclxuICogdGltZSBzaWduYXR1cmUuXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gIC8qKlxyXG4gICAqIGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGEgbGlzdCBvZiB0dXBsZXRzIChzZXJpYWxpemVkKVxyXG4gICAqL1xyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlUGFyYW1zU2VyW10sXHJcbiAgLyoqXHJcbiAgICogdHJhbnNwb3NlIHRoZSBub3RlcyB1cC9kb3duLiAgVE9ETzogdGhpcyBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWRcclxuICAgKiBhcyBpdHMgcGFydCBvZiB0aGUgaW5zdHJ1bWVudCBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlcixcclxuICAvKipcclxuICAgKiBsaW5lcyBpbiB0aGUgc3RhZmYgKGUuZy4gcGVyY3Vzc2lvbilcclxuICAgKi9cclxuICBsaW5lczogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIG1lYXN1cmUgbnVtYmVyLCBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUvcmVtYXBwZWRcclxuICAgKi9cclxuICBtZWFzdXJlTnVtYmVyOiBNZWFzdXJlTnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHN0YXJ0IGNsZWZcclxuICAgKi9cclxuICBjbGVmOiBDbGVmLFxyXG4gIC8qKlxyXG4gICAqIHZvaWNlcyBjb250YWluIG5vdGVzXHJcbiAgICovXHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVNlcltdLFxyXG4gIC8qKlxyXG4gICAqIGFsbCBvdGhlciBtb2RpZmllcnMgKGJhcmxpbmVzLCBldGMpXHJcbiAgICovXHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10sXHJcbiAgLy8gdGhlIG5leHQgMyBhcmUgbm90IHNlcmlhbGl6ZWQgYXMgcGFydCBvZiB0aGUgbWVhc3VyZSBpbiBtb3N0IGNhc2VzLCBzaW5jZSB0aGV5IGFyZVxyXG4gIC8vIG1hcHBlZCB0byBzcGVjaWZpYyBtZWFzdXJlcyBpbiB0aGUgc2NvcmUvc3lzdGVtXHJcbiAgLyoqXHJcbiAgICoga2V5IHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGtleVNpZ25hdHVyZT86IHN0cmluZyxcclxuICAvKipcclxuICAqIHRpbWUgc2lnbmF0dXJlIHNlcmlhbGl6YXRpb25cclxuICAqL1xyXG4gIHRpbWVTaWduYXR1cmU/OiBUaW1lU2lnbmF0dXJlUGFyYW1ldGVyc1NlcixcclxuICAvKipcclxuICAgKiB0ZW1wbyBhdCB0aGlzIHBvaW50XHJcbiAgICovXHJcbiAgdGVtcG86IFNtb1RlbXBvVGV4dFBhcmFtc1NlclxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIE9ubHkgYXJyYXlzIGFuZCBtZWFzdXJlIG51bWJlcnMgYXJlIHNlcmlsaWFsaXplZCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxyXG4gKiBAcGFyYW0gcGFyYW1zIC0gcmVzdWx0IG9mIHNlcmlhbGl6YXRpb25cclxuICogQHJldHVybnMgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1Ntb01lYXN1cmVQYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPFNtb01lYXN1cmVQYXJhbXNTZXI+KTpwYXJhbXMgaXMgU21vTWVhc3VyZVBhcmFtc1NlciB7XHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy52b2ljZXMpIHx8IFxyXG4gICAgICAhQXJyYXkuaXNBcnJheShwYXJhbXMudHVwbGV0VHJlZXMpIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5tb2RpZmllcnMpIHx8XHJcbiAgICAgIHR5cGVvZihwYXJhbXM/Lm1lYXN1cmVOdW1iZXI/Lm1lYXN1cmVJbmRleCkgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogRGF0YSBmb3IgYSBtZWFzdXJlIG9mIG11c2ljLiAgTWFueSBydWxlcyBvZiBtdXNpY2FsIGVuZ3JhdmluZyBhcmVcclxuICogZW5mb3JjZWQgYXQgYSBtZWFzdXJlIGxldmVsOiB0aGUgZHVyYXRpb24gb2Ygbm90ZXMsIGFjY2lkZW50YWxzLCBldGMuXHJcbiAqIFxyXG4gKiBNZWFzdXJlcyBjb250YWluIHtAbGluayBTbW9Ob3RlfSwge0BsaW5rIFNtb1R1cGxldH0sIGFuZCB7QGxpbmsgU21vQmVhbUdyb3VwfVxyXG4gKiBNZWFzdXJlcyBhcmUgY29udGFpbmVkIGluIHtAbGluayBTbW9TeXN0ZW1TdGFmZn1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb01lYXN1cmUgaW1wbGVtZW50cyBTbW9NZWFzdXJlUGFyYW1zLCBUaWNrTWFwcGFibGUge1xyXG4gIHN0YXRpYyBnZXQgdGltZVNpZ25hdHVyZURlZmF1bHQoKTogVGltZVNpZ25hdHVyZSB7XHJcbiAgICByZXR1cm4gbmV3IFRpbWVTaWduYXR1cmUoVGltZVNpZ25hdHVyZS5kZWZhdWx0cyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBkZWZhdWx0RHVwbGVEdXJhdGlvbjogbnVtYmVyID0gNDA5NjtcclxuICBzdGF0aWMgZGVmYXVsdFRyaXBsZUR1cmF0aW9uOiBudW1iZXIgPSAyMDQ4ICogMztcclxuICAvLyBAaW50ZXJuYWxcclxuICBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRzOiBTbW9NZWFzdXJlUGFyYW1zID0ge1xyXG4gICAgdGltZVNpZ25hdHVyZTogU21vTWVhc3VyZS50aW1lU2lnbmF0dXJlRGVmYXVsdCxcclxuICAgIGtleVNpZ25hdHVyZTogJ0MnLFxyXG4gICAgdHVwbGV0VHJlZXM6IFtdLFxyXG4gICAgdHJhbnNwb3NlSW5kZXg6IDAsXHJcbiAgICBtb2RpZmllcnM6IFtdLFxyXG4gICAgLy8gYmFyczogWzEsIDFdLCAvLyBmb2xsb3dzIGVudW1lcmF0aW9uIGluIFZGLkJhcmxpbmVcclxuICAgIG1lYXN1cmVOdW1iZXI6IHtcclxuICAgICAgbG9jYWxJbmRleDogMCxcclxuICAgICAgc3lzdGVtSW5kZXg6IDAsXHJcbiAgICAgIG1lYXN1cmVJbmRleDogMCxcclxuICAgICAgc3RhZmZJZDogMFxyXG4gICAgfSxcclxuICAgIGNsZWY6ICd0cmVibGUnLFxyXG4gICAgbGluZXM6IDUsXHJcbiAgICB2b2ljZXM6IFtdLFxyXG4gICAgZm9ybWF0OiBuZXcgU21vTWVhc3VyZUZvcm1hdChTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzKSxcclxuICAgIGFjdGl2ZVZvaWNlOiAwLFxyXG4gICAgdGVtcG86IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKSxcclxuICAgIHJlcGVhdFN5bWJvbDogZmFsc2UsXHJcbiAgICByZXBlYXRDb3VudDogMCAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuICBEZWZhdWx0cyBhcmUgYWx3YXlzIGNvcGllZCBzbyB0aGVcclxuICAgKiBjYWxsZXIgY2FuIG1vZGlmeSB0aGVtIHRvIGNyZWF0ZSBhIG5ldyBtZWFzdXJlLlxyXG4gICAqIEByZXR1cm5zIGNvbnN0cnVjdG9yIHBhcmFtcyBmb3IgYSBuZXcgbWVhc3VyZVxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vTWVhc3VyZVBhcmFtcyB7XHJcbiAgICBjb25zdCBwcm90bzogYW55ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShTbW9NZWFzdXJlLl9kZWZhdWx0cykpO1xyXG4gICAgcHJvdG8uZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyk7XHJcbiAgICBwcm90by50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIHByb3RvLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLnN0YXJ0LFxyXG4gICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgfSkpO1xyXG4gICAgcHJvdG8ubW9kaWZpZXJzLnB1c2gobmV3IFNtb0JhcmxpbmUoe1xyXG4gICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuZW5kLFxyXG4gICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIHByb3RvO1xyXG4gIH1cclxuICAvLyBAaWdub3JlXHJcbiAgc3RhdGljIGNvbnZlcnRMZWdhY3lUaW1lU2lnbmF0dXJlKHRzOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJ2ID0gbmV3IFRpbWVTaWduYXR1cmUoVGltZVNpZ25hdHVyZS5kZWZhdWx0cyk7XHJcbiAgICBydi50aW1lU2lnbmF0dXJlID0gdHM7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHRpbWVTaWduYXR1cmU6IFRpbWVTaWduYXR1cmUgPSBTbW9NZWFzdXJlLnRpbWVTaWduYXR1cmVEZWZhdWx0O1xyXG4gIC8qKlxyXG4gICAqIE92ZXJyaWRlcyBkaXNwbGF5IG9mIGFjdHVhbCB0aW1lIHNpZ25hdHVyZSwgaW4gdGhlIGNhc2Ugb2ZcclxuICAgKiBwaWNrLXVwIG5vdGVzIHdoZXJlIHRoZSBhY3R1YWwgYW5kIGRpc3BsYXllZCBkdXJhdGlvbnMgYXJlIGRpZmZlcmVudFxyXG4gICAqL1xyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nID0gJyc7XHJcbiAgY2FuY2VsZWRLZXlTaWduYXR1cmU6IHN0cmluZyA9ICcnO1xyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlW10gPSBbXTtcclxuICByZXBlYXRTeW1ib2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZXBlYXRDb3VudDogbnVtYmVyID0gMDtcclxuICBjdG9yOiBzdHJpbmc9J1Ntb01lYXN1cmUnO1xyXG4gIC8qKlxyXG4gICAqIEFkanVzdCBmb3Igbm9uLWNvbmNlcnQgcGl0Y2ggaW50c3RydW1lbnRzXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBSb3csIGNvbHVtbiwgYW5kIGN1c3RvbSBudW1iZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZWFzdXJlLlxyXG4gICAqL1xyXG4gIG1lYXN1cmVOdW1iZXI6IE1lYXN1cmVOdW1iZXIgPSB7XHJcbiAgICBsb2NhbEluZGV4OiAwLFxyXG4gICAgc3lzdGVtSW5kZXg6IDAsXHJcbiAgICBtZWFzdXJlSW5kZXg6IDAsXHJcbiAgICBzdGFmZklkOiAwXHJcbiAgfTtcclxuICBjbGVmOiBDbGVmID0gJ3RyZWJsZSc7XHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogdGhlIGFjdGl2ZSB2b2ljZSBpbiB0aGUgZWRpdG9yLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgdm9pY2VzXHJcbiAgICogICovXHJcbiAgYWN0aXZlVm9pY2U6IG51bWJlciA9IDA7XHJcbiAgdGVtcG86IFNtb1RlbXBvVGV4dDtcclxuICBiZWFtR3JvdXBzOiBJU21vQmVhbUdyb3VwW10gPSBbXTtcclxuICBsaW5lczogbnVtYmVyID0gNTtcclxuICAvKipcclxuICAgKiBSdW50aW1lIGluZm9ybWF0aW9uIGFib3V0IHJlbmRlcmluZ1xyXG4gICAqL1xyXG4gIHN2ZzogTWVhc3VyZVN2ZztcclxuICAvKipcclxuICAgKiBNZWFzdXJlLXNwZWNpZmljIGZvcm1hdHRpbmcgcGFyYW1ldGVycy5cclxuICAgKi9cclxuICBmb3JtYXQ6IFNtb01lYXN1cmVGb3JtYXQ7XHJcbiAgLyoqXHJcbiAgICogSW5mb3JtYXRpb24gZm9yIGlkZW50aWZ5aW5nIHRoaXMgb2JqZWN0XHJcbiAgICovXHJcbiAgaWQ6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsbCBpbiBjb21wb25lbnRzLiAgV2UgYXNzdW1lIHRoZSBtb2RpZmllcnMgYXJlIGFscmVhZHkgY29uc3RydWN0ZWQsXHJcbiAgICogZS5nLiBieSBkZXNlcmlhbGl6ZSBvciB0aGUgY2FsbGluZyBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zKSB7XHJcbiAgICB0aGlzLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgdGhpcy5zdmcgPSB7XHJcbiAgICAgIHN0YWZmV2lkdGg6IDAsXHJcbiAgICAgIHVuanVzdGlmaWVkV2lkdGg6IDAsXHJcbiAgICAgIHN0YWZmWDogMCxcclxuICAgICAgc3RhZmZZOiAwLFxyXG4gICAgICBsb2dpY2FsQm94OiB7XHJcbiAgICAgICAgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMFxyXG4gICAgICB9LFxyXG4gICAgICB5VG9wOiAwLFxyXG4gICAgICBhZGpYOiAwLFxyXG4gICAgICBtYXhDb2x1bW5TdGFydFg6IDAsXHJcbiAgICAgIGFkalJpZ2h0OiAwLFxyXG4gICAgICBoaXN0b3J5OiBbXSxcclxuICAgICAgbGluZUluZGV4OiAwLFxyXG4gICAgICBwYWdlSW5kZXg6IDAsXHJcbiAgICAgIHJvd0luU3lzdGVtOiAwLFxyXG4gICAgICBmb3JjZUNsZWY6IGZhbHNlLFxyXG4gICAgICBmb3JjZUtleVNpZ25hdHVyZTogZmFsc2UsXHJcbiAgICAgIGZvcmNlVGltZVNpZ25hdHVyZTogZmFsc2UsXHJcbiAgICAgIGZvcmNlVGVtcG86IGZhbHNlLFxyXG4gICAgICBoaWRlRW1wdHlNZWFzdXJlOiBmYWxzZSxcclxuICAgICAgaGlkZU11bHRpbWVhc3VyZTogZmFsc2UsXHJcbiAgICAgIG11bHRpbWVhc3VyZUxlbmd0aDogMCxcclxuICAgICAgbXVsdGltZWFzdXJlRW5kQmFybGluZTogU21vQmFybGluZS5iYXJsaW5lc1snc2luZ2xlQmFyJ10sXHJcbiAgICAgIGVsZW1lbnQ6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdHMgPSBTbW9NZWFzdXJlLmRlZmF1bHRzO1xyXG4gICAgU21vTWVhc3VyZU51bWJlclBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChwYXJhbXNbcGFyYW1dKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0aGlzW3BhcmFtXSA9IHBhcmFtc1twYXJhbV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgU21vTWVhc3VyZVN0cmluZ1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xyXG4gICAgICB0aGlzW3BhcmFtXSA9IHBhcmFtc1twYXJhbV0gPyBwYXJhbXNbcGFyYW1dIDogZGVmYXVsdHNbcGFyYW1dO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNsZWYgPSBwYXJhbXMuY2xlZjtcclxuICAgIHRoaXMucmVwZWF0U3ltYm9sID0gcGFyYW1zLnJlcGVhdFN5bWJvbDtcclxuICAgIHRoaXMubWVhc3VyZU51bWJlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFyYW1zLm1lYXN1cmVOdW1iZXIpKTtcclxuICAgIGlmIChwYXJhbXMudGVtcG8pIHtcclxuICAgICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQocGFyYW1zLnRlbXBvKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBsZWdhY3kgdGltZSBzaWduYXR1cmUgZm9ybWF0XHJcbiAgICBpZiAocGFyYW1zLnRpbWVTaWduYXR1cmUpIHtcclxuICAgICAgY29uc3QgdHNBbnkgPSBwYXJhbXMudGltZVNpZ25hdHVyZSBhcyBhbnk7XHJcbiAgICAgIGlmICh0eXBlb2YgKHRzQW55KSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLnRpbWVTaWduYXR1cmUgPSBTbW9NZWFzdXJlLmNvbnZlcnRMZWdhY3lUaW1lU2lnbmF0dXJlKHRzQW55KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRpbWVTaWduYXR1cmUgPSBUaW1lU2lnbmF0dXJlLmNyZWF0ZUZyb21QYXJ0aWFsKHRzQW55KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMgPSBwYXJhbXMudm9pY2VzID8gcGFyYW1zLnZvaWNlcyA6IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUcmVlcyA9IHBhcmFtcy50dXBsZXRUcmVlcyA/IHBhcmFtcy50dXBsZXRUcmVlcyA6IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBwYXJhbXMubW9kaWZpZXJzID8gcGFyYW1zLm1vZGlmaWVycyA6IGRlZmF1bHRzLm1vZGlmaWVycztcclxuICAgIHRoaXMuc2V0RGVmYXVsdEJhcmxpbmVzKCk7XHJcbiAgICB0aGlzLmtleVNpZ25hdHVyZSA9IFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQodGhpcy5rZXlTaWduYXR1cmUsIHRoaXMudHJhbnNwb3NlSW5kZXgpO1xyXG5cclxuICAgIGlmICghKHBhcmFtcy5mb3JtYXQpKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyk7XHJcbiAgICAgIHRoaXMuZm9ybWF0Lm1lYXN1cmVJbmRleCA9IHRoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KHBhcmFtcy5mb3JtYXQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZCA9IGdldElkKCkudG9TdHJpbmcoKTtcclxuICAgIHRoaXMudXBkYXRlQ2xlZkNoYW5nZU5vdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBkZWZhdWx0QXR0cmlidXRlcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdrZXlTaWduYXR1cmUnLCBcclxuICAgICAgJ21lYXN1cmVOdW1iZXInLFxyXG4gICAgICAnYWN0aXZlVm9pY2UnLCAnY2xlZicsICd0cmFuc3Bvc2VJbmRleCcsXHJcbiAgICAgICdmb3JtYXQnLCAncmlnaHRNYXJnaW4nLCAnbGluZXMnLCAncmVwZWF0U3ltYm9sJywgJ3JlcGVhdENvdW50J1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIC8vIHVzZWQgZm9yIHNlcmlhbGl6YXRpb25cclxuICBzdGF0aWMgZ2V0IGZvcm1hdHRpbmdPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIFsnY3VzdG9tU3RyZXRjaCcsICdjdXN0b21Qcm9wb3J0aW9uJywgJ2F1dG9KdXN0aWZ5JywgJ3N5c3RlbUJyZWFrJyxcclxuICAgICAgJ3BhZ2VCcmVhaycsICdwYWRMZWZ0J107XHJcbiAgfVxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIC8vIHVzZWQgZm9yIHNlcmlhbGl6YXRpb25cclxuICBzdGF0aWMgZ2V0IGNvbHVtbk1hcHBlZEF0dHJpYnV0ZXMoKSB7XHJcbiAgICByZXR1cm4gWyd0aW1lU2lnbmF0dXJlJywgJ2tleVNpZ25hdHVyZScsICd0ZW1wbyddO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHNlcmlhbGl6YWJsZUF0dHJpYnV0ZXMoKSB7XHJcbiAgICBjb25zdCBydjogYW55ID0gW107XHJcbiAgICBTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgaWYgKFNtb01lYXN1cmUuY29sdW1uTWFwcGVkQXR0cmlidXRlcy5pbmRleE9mKGF0dHIpIDwgMCAmJiBhdHRyICE9PSAnZm9ybWF0Jykge1xyXG4gICAgICAgIHJ2LnB1c2goYXR0cik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGltZSBzaWduYXR1cmVzIGFyZSB0aGUgc2FtZSwgZm9yIGRpc3BsYXkgcHVycG9zZXMgKGUuZy4gaWYgYSB0aW1lIHNpZyBjaGFuZ2VcclxuICAvLyBpcyByZXF1aXJlZClcclxuICAqL1xyXG4gIHN0YXRpYyB0aW1lU2lnRXF1YWwobzE6IFRpbWVTaWduYXR1cmUsIG8yOiBUaW1lU2lnbmF0dXJlKSB7XHJcbiAgICByZXR1cm4gbzEudGltZVNpZ25hdHVyZSA9PT0gbzIudGltZVNpZ25hdHVyZSAmJiBvMS51c2VTeW1ib2wgPT09IG8yLnVzZVN5bWJvbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSWYgdGhlcmUgaXMgYSBjbGVmIGNoYW5nZSBtaWQtbWVhc3VyZSwgdXBkYXRlIHRoZSBhY3R1YWwgY2xlZnMgb2YgdGhlIG5vdGVzXHJcbiAgICogc28gdGhleSBkaXNwbGF5IGNvcnJlY3RseS5cclxuICAgKi9cclxuICB1cGRhdGVDbGVmQ2hhbmdlTm90ZXMoKSB7XHJcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGN1clRpY2sgPSAwO1xyXG4gICAgbGV0IGNsZWZDaGFuZ2UgPSB0aGlzLmNsZWY7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGN1clRpY2sgID0gMDtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IHNtb05vdGUgPSB2b2ljZS5ub3Rlc1tqXTtcclxuICAgICAgICBzbW9Ob3RlLmNsZWYgPSB0aGlzLmNsZWY7XHJcbiAgICAgICAgaWYgKHNtb05vdGUuY2xlZk5vdGUgJiYgc21vTm90ZS5jbGVmTm90ZS5jbGVmICE9PSB0aGlzLmNsZWYpIHtcclxuICAgICAgICAgIGNsZWZDaGFuZ2UgPSBzbW9Ob3RlLmNsZWZOb3RlLmNsZWY7XHJcbiAgICAgICAgICBjdXJUaWNrICs9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY3VyVGljayAgKz0gc21vTm90ZS50aWNrQ291bnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFjaGFuZ2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNsZWZDaGFuZ2VUaWNrIGlzIHdoZXJlIHRoZSBjaGFuZ2UgZ29lcy4gIFdlIG9ubHkgc3VwcG9ydFxyXG4gICAgLy8gb25lIHBlciBtZWFzdXJlLCBvdGhlcnMgYXJlIGlnbm9yZWQuXHJcbiAgICBjb25zdCBjbGVmQ2hhbmdlVGljayA9IGN1clRpY2s7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBjdXJUaWNrICA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgY29uc3Qgbm90ZVRpY2tzID0gc21vTm90ZS50aWNrQ291bnQ7XHJcbiAgICAgICAgaWYgKGN1clRpY2sgKyBub3RlVGlja3MgPj0gY2xlZkNoYW5nZVRpY2spIHtcclxuICAgICAgICAgIHNtb05vdGUuY2xlZiA9IGNsZWZDaGFuZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgcmVkdW5kYW50IGNsZWYgY2hhbmdlcyBsYXRlciBpbiB0aGUgbWVhc3VyZVxyXG4gICAgICAgIGlmIChjdXJUaWNrICsgbm90ZVRpY2tzID4gY2xlZkNoYW5nZVRpY2spIHtcclxuICAgICAgICAgIGlmIChzbW9Ob3RlLmNsZWZOb3RlICYmIHNtb05vdGUuY2xlZk5vdGUuY2xlZiA9PT0gY2xlZkNoYW5nZSkge1xyXG4gICAgICAgICAgICBzbW9Ob3RlLmNsZWZOb3RlID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY3VyVGljayArPSBub3RlVGlja3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQHJldHVybnMgY29sdW1uIG1hcHBlZCBwYXJhbWV0ZXJzLCBzZXJpYWxpemVkLiAgY2FsbGVyIHdpbGxcclxuICAgKiBkZWNpZGUgaWYgdGhlIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBwZXJzaXN0ZWRcclxuICAgKi9cclxuICBzZXJpYWxpemVDb2x1bW5NYXBwZWQoKTogQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAgIC8vXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlOiB0aGlzLnRpbWVTaWduYXR1cmUuc2VyaWFsaXplKCksXHJcbiAgICAgIGtleVNpZ25hdHVyZTogdGhpcy5rZXlTaWduYXR1cmUsXHJcbiAgICAgIHRlbXBvOiB0aGlzLnRlbXBvLnNlcmlhbGl6ZSgpXHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRDb2x1bW5NYXBwZWQoKTogQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpbWVTaWduYXR1cmU6IHRoaXMudGltZVNpZ25hdHVyZSxcclxuICAgICAga2V5U2lnbmF0dXJlOiB0aGlzLmtleVNpZ25hdHVyZSxcclxuICAgICAgdGVtcG86IHRoaXMudGVtcG9cclxuICAgIH07XHJcbiAgfSAgXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIG1lYXN1cmUgb2JqZWN0IHRvIGEgSlNPTiBvYmplY3QsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6aW5nIGFsbCB0aGUgbm90ZXMsXHJcbiAgICogbm90ZSBtb2RpZmllcnMsIGV0Yy5cclxuICAgKi9cclxuICBzZXJpYWxpemUoKTogU21vTWVhc3VyZVBhcmFtc1NlciB7XHJcbiAgICBjb25zdCBwYXJhbXM6IFBhcnRpYWw8U21vTWVhc3VyZVBhcmFtc1Nlcj4gPSB7IFwiY3RvclwiOiBcIlNtb01lYXN1cmVcIiB9O1xyXG4gICAgbGV0IHNlciA9IHRydWU7XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9NZWFzdXJlLmRlZmF1bHRzLCBTbW9NZWFzdXJlLnNlcmlhbGl6YWJsZUF0dHJpYnV0ZXMsIHRoaXMsIHBhcmFtcyk7XHJcbiAgICAvLyBEb24ndCBzZXJpYWxpemUgZGVmYXVsdCB0aGluZ3NcclxuICAgIGNvbnN0IGZtdCA9IHRoaXMuZm9ybWF0LnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gbWVhc3VyZSBudW1iZXIgY2FuJ3QgYmUgZGVmYXVsdGVkIGIvYyB0ZW1wb3MgZXRjLiBjYW4gbWFwIHRvIGRlZmF1bHQgbWVhc3VyZVxyXG4gICAgcGFyYW1zLm1lYXN1cmVOdW1iZXIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubWVhc3VyZU51bWJlcikpO1xyXG4gICAgcGFyYW1zLnR1cGxldFRyZWVzID0gW107XHJcbiAgICBwYXJhbXMudm9pY2VzID0gW107XHJcbiAgICBwYXJhbXMubW9kaWZpZXJzID0gW107XHJcblxyXG4gICAgdGhpcy50dXBsZXRUcmVlcy5mb3JFYWNoKCh0dXBsZXRUcmVlKSA9PiB7XHJcbiAgICAgIHBhcmFtcy50dXBsZXRUcmVlcyEucHVzaCh0dXBsZXRUcmVlLnNlcmlhbGl6ZSgpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9iajogYW55ID0ge1xyXG5cclxuICAgICAgICBub3RlczogW11cclxuICAgICAgfTtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG9iai5ub3Rlcy5wdXNoKG5vdGUuc2VyaWFsaXplKCkpO1xyXG4gICAgICB9KTtcclxuICAgICAgcGFyYW1zLnZvaWNlcyEucHVzaChvYmopO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgc2VyID0gdHJ1ZTtcclxuICAgICAgLyogZG9uJ3Qgc2VyaWFsaXplIGRlZmF1bHQgbW9kaWZpZXJzICovXHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCAmJlxyXG4gICAgICAgIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9CYXJsaW5lJyAmJiAobW9kaWZpZXIgYXMgU21vQmFybGluZSkucG9zaXRpb24gPT09IFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZFxyXG4gICAgICAgICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9UZW1wb1RleHQnKSB7XHJcbiAgICAgICAgLy8gd2UgZG9uJ3Qgc2F2ZSB0ZW1wbyB0ZXh0IGFzIGEgbW9kaWZpZXIgYW55bW9yZVxyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLmN0b3IgPT09ICdTbW9SZXBlYXRTeW1ib2wnICYmIChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLnBvc2l0aW9uID09PSBTbW9SZXBlYXRTeW1ib2wucG9zaXRpb25zLnN0YXJ0XHJcbiAgICAgICAgJiYgKG1vZGlmaWVyIGFzIFNtb1JlcGVhdFN5bWJvbCkuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9scy5Ob25lKSB7XHJcbiAgICAgICAgc2VyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlcikge1xyXG4gICAgICAgIHBhcmFtcy5tb2RpZmllcnMhLnB1c2gobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXVxyXG4gICAgaWYgKCFpc1Ntb01lYXN1cmVQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnaW52YWxpZCBtZWFzdXJlJztcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHJlc3RvcmUgYSBzZXJpYWxpemVkIG1lYXN1cmUgb2JqZWN0LiAgVXN1YWxseSBjYWxsZWQgYXMgcGFydCBvZiBkZXNlcmlhbGl6aW5nIGEgc2NvcmUsXHJcbiAgICogYnV0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVzdG9yZSBhIG1lYXN1cmUgZHVlIHRvIGFuIHVuZG8gb3BlcmF0aW9uLiAgUmVjdXJzaXZlbHlcclxuICAgKiBkZXNlcmlhbGl6ZSBhbGwgdGhlIG5vdGVzIGFuZCBtb2RpZmllcnMgdG8gY29uc3RydWN0IGEgbmV3IG1lYXN1cmUuXHJcbiAgICogQHBhcmFtIGpzb25PYmogdGhlIHNlcmlhbGl6ZWQgU21vTWVhc3VyZVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgc3RhdGljIGRlc2VyaWFsaXplKGpzb25PYmo6IFNtb01lYXN1cmVQYXJhbXNTZXIpOiBTbW9NZWFzdXJlIHtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gICAgZm9yIChqID0gMDsgaiA8IGpzb25PYmoudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0ganNvbk9iai52b2ljZXNbal07XHJcbiAgICAgIGNvbnN0IG5vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgICAgdm9pY2VzLnB1c2goe1xyXG4gICAgICAgIG5vdGVzXHJcbiAgICAgIH0pO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBub3RlUGFyYW1zID0gdm9pY2Uubm90ZXNbaV07XHJcbiAgICAgICAgY29uc3Qgc21vTm90ZSA9IFNtb05vdGUuZGVzZXJpYWxpemUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgbm90ZXMucHVzaChzbW9Ob3RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICBqc29uT2JqLm1vZGlmaWVycy5mb3JFYWNoKChtb2RQYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBtb2RpZmllcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSA9IFNtb01lYXN1cmVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kUGFyYW1zKTtcclxuICAgICAgbW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMgPSBTbW9NZWFzdXJlLmRlZmF1bHRzO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLCBqc29uT2JqLCBwYXJhbXMpO1xyXG5cclxuICAgIC8vIGV4cGxvZGUgY29sdW1uLW1hcHBlZFxyXG4gICAgaWYgKGpzb25PYmoudGVtcG8pIHtcclxuICAgICAgcGFyYW1zLnRlbXBvID0gU21vVGVtcG9UZXh0LmRlc2VyaWFsaXplKGpzb25PYmoudGVtcG8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW1zLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRpbWVTaWduYXR1cmVTdHJpbmcgaXMgbm93IHBhcnQgb2YgdGltZVNpZ25hdHVyZS4gIHVwY29udmVydCBvbGQgc2NvcmVzXHJcbiAgICBsZXQgdGltZVNpZ25hdHVyZVN0cmluZyA9ICcnO1xyXG4gICAgY29uc3QganNvbkxlZ2FjeSA9IChqc29uT2JqIGFzIGFueSk7XHJcbiAgICBpZiAodHlwZW9mKGpzb25MZWdhY3kudGltZVNpZ25hdHVyZVN0cmluZykgPT09ICdzdHJpbmcnICYmIGpzb25MZWdhY3kudGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRpbWVTaWduYXR1cmVTdHJpbmcgPSBqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmc7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai50aW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGlmICh0aW1lU2lnbmF0dXJlU3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIGpzb25PYmoudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nID0gdGltZVNpZ25hdHVyZVN0cmluZzsgIFxyXG4gICAgICB9XHJcbiAgICAgIHBhcmFtcy50aW1lU2lnbmF0dXJlID0gVGltZVNpZ25hdHVyZS5kZXNlcmlhbGl6ZShqc29uT2JqLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdHBhcmFtcyA9IFRpbWVTaWduYXR1cmUuZGVmYXVsdHM7XHJcbiAgICAgIGlmICh0aW1lU2lnbmF0dXJlU3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIHRwYXJhbXMuZGlzcGxheVN0cmluZyA9IHRpbWVTaWduYXR1cmVTdHJpbmc7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLnRpbWVTaWduYXR1cmUgPSBuZXcgVGltZVNpZ25hdHVyZSh0cGFyYW1zKTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5rZXlTaWduYXR1cmUgPSBqc29uT2JqLmtleVNpZ25hdHVyZSA/PyAnQyc7XHJcbiAgICBwYXJhbXMudm9pY2VzID0gdm9pY2VzO1xyXG5cclxuICAgIGlmICgoanNvbk9iaiBhcyBhbnkpLnR1cGxldFRyZWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGpzb25PYmoudHVwbGV0VHJlZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCB0dXBsZXRUcmVlSnNvbiA9IGpzb25PYmoudHVwbGV0VHJlZXNbal07XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IFNtb1R1cGxldFRyZWUuZGVzZXJpYWxpemUodHVwbGV0VHJlZUpzb24pO1xyXG4gICAgICAgIHBhcmFtcy50dXBsZXRUcmVlcy5wdXNoKHR1cGxldFRyZWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL2Rlc2VyaWFsaXphdGlvbiBvZiBhIGxlZ2FjeSB0dXBsZXRzXHJcbiAgICAvL2xlZ2FjeSBzY2hlbWEgaGFkIG1lYXN1cmUudHVwbGV0cywgaXQgaXMgbWVhc3VyZS50dXBsZXRUcmVlcyBub3dcclxuICAgIGlmICgoanNvbk9iaiBhcyBhbnkpLnR1cGxldHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgKGpzb25PYmogYXMgYW55KS50dXBsZXRzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgdHVwSnNvbiA9IChqc29uT2JqIGFzIGFueSkudHVwbGV0c1tqXTtcclxuXHJcbiAgICAgICAgLy8gTGVnYWN5IHNjaGVtYSBoYWQgYXR0cnMuaWQsIG5vdyBpdCBpcyBqdXN0IGlkXHJcbiAgICAgICAgaWYgKCh0dXBKc29uIGFzIGFueSkuYXR0cnMgJiYgKHR1cEpzb24gYXMgYW55KS5hdHRycy5pZCkge1xyXG4gICAgICAgICAgdHVwSnNvbi5pZCA9ICh0dXBKc29uIGFzIGFueSkuYXR0cnMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0dXBsZXROb3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHBhcmFtcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChub3RlLmlzVHVwbGV0ICYmIG5vdGUudHVwbGV0SWQgPT09IHR1cEpzb24uYXR0cnMuaWQpIHtcclxuICAgICAgICAgICAgICB0dXBsZXROb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRydXN0IHN0YXJ0SW5kZXggY29taW5nIGZyb20gbGVnYWN5IGpzb25cclxuICAgICAgICAgICAgICAvL3dlIG5lZWQgdG8gY291bnQgaW5kZXggb2YgdGhlIGZpcnN0IG5vdGUgaW4gdGhlIHR1cGxldFxyXG4gICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQnVnIGZpeDogIEEgdHVwbGV0IHdpdGggbm8gbm90ZXMgbWF5IGJlIGJlZW4gb3ZlcndyaXR0ZW5cclxuICAgICAgICAvLyBpbiBhIGNvcHkvcGFzdGUgb3BlcmF0aW9uXHJcbiAgICAgICAgaWYgKHR1cGxldE5vdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHR1cEpzb24ubm90ZXMgPSB0dXBsZXROb3RlcztcclxuICAgICAgICAgIHR1cEpzb24uc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICB0dXBKc29uLmVuZEluZGV4ID0gdHVwSnNvbi5zdGFydEluZGV4ICsgdHVwbGV0Tm90ZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHR1cGxldDogU21vVHVwbGV0ID0gU21vVHVwbGV0LmRlc2VyaWFsaXplKHR1cEpzb24pO1xyXG4gICAgICAgIGNvbnN0IHR1cGxldFRyZWU6IFNtb1R1cGxldFRyZWUgPSBuZXcgU21vVHVwbGV0VHJlZSh7dHVwbGV0OiB0dXBsZXR9KTtcclxuICAgICAgICBwYXJhbXMudHVwbGV0VHJlZXMucHVzaCh0dXBsZXRUcmVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhcmFtcy50dXBsZXRUcmVlcy5sZW5ndGgpIHtcclxuICAgICAgU21vVHVwbGV0VHJlZS5zeW5jVHVwbGV0SWRzKHBhcmFtcy50dXBsZXRUcmVlcywgdm9pY2VzKVxyXG4gICAgfVxyXG5cclxuICAgIHBhcmFtcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7XHJcbiAgICBjb25zdCBtZWFzdXJlID0gbmV3IFNtb01lYXN1cmUocGFyYW1zKTtcclxuICAgIC8vIEhhbmRsZSBtaWdyYXRpb24gZm9yIG1lYXN1cmUtbWFwcGVkIHBhcmFtZXRlcnNcclxuICAgIG1lYXN1cmUubW9kaWZpZXJzLmZvckVhY2goKG1vZCkgPT4ge1xyXG4gICAgICBpZiAobW9kLmN0b3IgPT09ICdTbW9UZW1wb1RleHQnKSB7XHJcbiAgICAgICAgbWVhc3VyZS50ZW1wbyA9IChtb2QgYXMgU21vVGVtcG9UZXh0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIW1lYXN1cmUudGVtcG8pIHtcclxuICAgICAgbWVhc3VyZS50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHJldHVybiBtZWFzdXJlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNsb25lKG1lYXN1cmU6IFNtb01lYXN1cmUpOiBTbW9NZWFzdXJlIHtcclxuICAgIHJldHVybiBTbW9NZWFzdXJlLmRlc2VyaWFsaXplKG1lYXN1cmUuc2VyaWFsaXplKCkpO1xyXG4gIH1cclxuICBzdGF0aWMgY2xvbmVGb3JQYXN0ZU9yVW5kbyhtZWFzdXJlOiBTbW9NZWFzdXJlKSB7XHJcbiAgICBjb25zdCBjbG9uZWRNZWFzdXJlID0gU21vTWVhc3VyZS5jbG9uZShtZWFzdXJlKTtcclxuICAgIGNsb25lZE1lYXN1cmUuc3ZnID0gbWVhc3VyZS5zdmc7XHJcbiAgICAvLyBPcmRpbmFyaWx5LCB0aGUga2V5L3RlbXBvL3RpbWUgaXMgbWFwcGVkIHRvIHRoZSBzdGF2ZSwgYnV0IHNpbmNlIHdlIGFyZSBwYXN0aW5nIG1lYXN1cmUtYnlcclxuICAgIC8vIG1lYXN1cmUgaGVyZSwgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdC5cclxuICAgIGNsb25lZE1lYXN1cmUua2V5U2lnbmF0dXJlID0gbWVhc3VyZS5rZXlTaWduYXR1cmU7XHJcbiAgICBjbG9uZWRNZWFzdXJlLnRpbWVTaWduYXR1cmUgPSBuZXcgVGltZVNpZ25hdHVyZShtZWFzdXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgY2xvbmVkTWVhc3VyZS50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQobWVhc3VyZS50ZW1wbyk7XHJcbiAgICByZXR1cm4gY2xvbmVkTWVhc3VyZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgbWVhc3VyZSwgdGhlICdkZWZhdWx0JyBzZXR0aW5ncyBjYW4gdmFyeSBkZXBlbmRpbmcgb25cclxuICAgKiB3aGF0IGNvbWVzIGJlZm9yZS9hZnRlciB0aGUgbWVhc3VyZS4gIFRoaXMgZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCBwaXRjaFxyXG4gICAqIGZvciBhIGNsZWYgKGFwcGVhcnMgb24gM3JkIGxpbmUpXHJcbiAgICovXHJcbiAgc3RhdGljIGdldCBkZWZhdWx0UGl0Y2hGb3JDbGVmKCk6IFJlY29yZDxDbGVmLCBQaXRjaD4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ3RyZWJsZSc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdiYXNzJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2QnLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDNcclxuICAgICAgfSxcclxuICAgICAgJ3Rlbm9yJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2EnLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDNcclxuICAgICAgfSxcclxuICAgICAgJ2FsdG8nOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYycsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAnc29wcmFubyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdwZXJjdXNzaW9uJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ21lenpvLXNvcHJhbm8nOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAnYmFyaXRvbmUtYyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgICdiYXJpdG9uZS1mJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2UnLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDNcclxuICAgICAgfSxcclxuICAgICAgJ3N1YmJhc3MnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnZCcsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJycsXHJcbiAgICAgICAgb2N0YXZlOiAyXHJcbiAgICAgIH0sXHJcbiAgICAgICdmcmVuY2gnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJycsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0gLy8gbm8gaWRlYVxyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIF9lbXB0eU1lYXN1cmVOb3RlVHlwZTogTm90ZVR5cGUgPSAncic7XHJcbiAgc3RhdGljIHNldCBlbXB0eU1lYXN1cmVOb3RlVHlwZSh0dDogTm90ZVR5cGUpIHtcclxuICAgIFNtb01lYXN1cmUuX2VtcHR5TWVhc3VyZU5vdGVUeXBlID0gdHQ7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZW1wdHlNZWFzdXJlTm90ZVR5cGUoKTogTm90ZVR5cGUge1xyXG4gICAgcmV0dXJuIFNtb01lYXN1cmUuX2VtcHR5TWVhc3VyZU5vdGVUeXBlO1xyXG4gIH1cclxuICBzdGF0aWMgdGltZVNpZ25hdHVyZU5vdGVzKHRpbWVTaWduYXR1cmU6IFRpbWVTaWduYXR1cmUsIGNsZWY6IENsZWYpIHtcclxuICAgIGNvbnN0IHBpdGNoID0gU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW2NsZWZdO1xyXG4gICAgY29uc3QgbWF4VGlja3MgPSBTbW9NdXNpYy50aW1lU2lnbmF0dXJlVG9UaWNrcyh0aW1lU2lnbmF0dXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgY29uc3Qgbm90ZVRpY2sgPSA4MTkyIC8gKHRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uIC8gMik7XHJcbiAgICBsZXQgdGlja3MgPSAwO1xyXG4gICAgY29uc3QgcG5vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgIHdoaWxlICh0aWNrcyA8IG1heFRpY2tzKSB7XHJcbiAgICAgIGNvbnN0IG5leHROb3RlID0gU21vTm90ZS5kZWZhdWx0cztcclxuICAgICAgbmV4dE5vdGUucGl0Y2hlcyA9IFtKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBpdGNoKSldO1xyXG4gICAgICBuZXh0Tm90ZS5ub3RlVHlwZSA9ICdyJztcclxuICAgICAgbmV4dE5vdGUuY2xlZiA9IGNsZWY7XHJcbiAgICAgIG5leHROb3RlLnRpY2tzLm51bWVyYXRvciA9IG5vdGVUaWNrO1xyXG4gICAgICBuZXh0Tm90ZS5zdGVtVGlja3MgPSBub3RlVGljaztcclxuICAgICAgcG5vdGVzLnB1c2gobmV3IFNtb05vdGUobmV4dE5vdGUpKTtcclxuICAgICAgdGlja3MgKz0gbm90ZVRpY2s7XHJcbiAgICB9XHJcbiAgICBpZiAodGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24gPT09IDggJiYgKHRpbWVTaWduYXR1cmUuYWN0dWFsQmVhdHMgJSAzID09PSAwIHx8IHRpbWVTaWduYXR1cmUuYWN0dWFsQmVhdHMgJSAyICE9PSAwKSkge1xyXG4gICAgICBsZXQgaXggPSAwO1xyXG4gICAgICBwbm90ZXMuZm9yRWFjaCgocG5vdGUpID0+IHtcclxuICAgICAgICBpZiAoKGl4ICsgMSkgJSAzID09PSAwKSB7XHJcbiAgICAgICAgICBwbm90ZS5lbmRCZWFtID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG5vdGUuYmVhbUJlYXRzID0gMjA0OCAqIDM7XHJcbiAgICAgICAgaXggKz0gMTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG5vdGVzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXQgYSBtZWFzdXJlIGZ1bGwgb2YgZGVmYXVsdCBub3RlcyBmb3IgYSBnaXZlbiB0aW1lU2lnbmF0dXJlL2NsZWYuXHJcbiAgICogcmV0dXJucyA4dGggbm90ZXMgZm9yIHRyaXBsZS10aW1lIG1ldGVycywgZXRjLlxyXG4gICAqIEBwYXJhbSBwYXJhbXMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHROb3RlcyhwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMpOiBTbW9Ob3RlW10ge1xyXG4gICAgcmV0dXJuIFNtb01lYXN1cmUudGltZVNpZ25hdHVyZU5vdGVzKG5ldyBUaW1lU2lnbmF0dXJlKHBhcmFtcy50aW1lU2lnbmF0dXJlKSwgcGFyYW1zLmNsZWYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0cyBmcm9tIHRoZVxyXG4gICAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGluLCB3aGljaCBjb3VsZCBiZSBhbm90aGVyIG1lYXN1cmUgaW4gdGhlIHNjb3JlLlxyXG4gICAqIFRoaXMgdmVyc2lvbiByZXR1cm5zIHBhcmFtcyB3aXRoIG5vIG5vdGVzLCBmb3IgY2FsbGVycyB0aGF0IHdhbnQgdG8gdXNlIHRoZWlyIG93biBub3Rlcy5cclxuICAgKiBJZiB5b3Ugd2FudCB0aGUgZGVmYXVsdCBub3Rlcywgc2VlIHtAbGluayBnZXREZWZhdWx0TWVhc3VyZVdpdGhOb3Rlc31cclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHRNZWFzdXJlKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcyk6IFNtb01lYXN1cmUge1xyXG4gICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywgU21vTWVhc3VyZS5kZWZhdWx0cywgb2JqKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywgcGFyYW1zLCBvYmopO1xyXG4gICAgLy8gRG9uJ3QgY29weSBjb2x1bW4tZm9ybWF0dGluZyBvcHRpb25zIHRvIG5ldyBtZWFzdXJlIGluIG5ldyBjb2x1bW5cclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5mb3JtYXR0aW5nT3B0aW9ucywgU21vTWVhc3VyZS5kZWZhdWx0cywgb2JqKTtcclxuICAgIG9iai50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUocGFyYW1zLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgLy8gVGhlIG1lYXN1cmUgZXhwZWN0cyB0byBnZXQgY29uY2VydCBLUyBpbiBjb25zdHJ1Y3RvciBhbmQgYWRqdXN0IGZvciBpbnN0cnVtZW50LiAgU28gZG8gdGhlXHJcbiAgICAvLyBvcHBvc2l0ZS5cclxuICAgIG9iai5rZXlTaWduYXR1cmUgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KG9iai5rZXlTaWduYXR1cmUsIC0xICogb2JqLnRyYW5zcG9zZUluZGV4KTtcclxuICAgIC8vIERvbid0IHJlZGlzcGxheSB0ZW1wbyBmb3IgYSBuZXcgbWVhc3VyZVxyXG4gICAgY29uc3QgcnYgPSBuZXcgU21vTWVhc3VyZShvYmopO1xyXG4gICAgaWYgKHJ2LnRlbXBvICYmIHJ2LnRlbXBvLmRpc3BsYXkpIHtcclxuICAgICAgcnYudGVtcG8uZGlzcGxheSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0cyBmcm9tIHRoZVxyXG4gICAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGluLCB3aGljaCBjb3VsZCBiZSBhbm90aGVyIG1lYXN1cmUgaW4gdGhlIHNjb3JlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYXJhbXMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcyk6IFNtb01lYXN1cmUge1xyXG4gICAgdmFyIG1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlKHBhcmFtcyk7XHJcbiAgICBtZWFzdXJlLnZvaWNlcy5wdXNoKHtcclxuICAgICAgbm90ZXM6IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE5vdGVzKHBhcmFtcylcclxuICAgIH0pO1xyXG4gICAgLy8gZml4IGEgYnVnLlxyXG4gICAgLy8gbmV3IG1lYXN1cmVzIG9ubHkgaGF2ZSAxIHZvaWNlLCBtYWtlIHN1cmUgYWN0aXZlIHZvaWNlIGlzIDBcclxuICAgIG1lYXN1cmUuYWN0aXZlVm9pY2UgPSAwO1xyXG4gICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHVzZWQgYnkgeG1sIGV4cG9ydCBcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKiBAcGFyYW0gdmFsIFxyXG4gICAqL1xyXG4gIGdldEZvcmNlU3lzdGVtQnJlYWsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXQuc3lzdGVtQnJlYWs7XHJcbiAgfVxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIHNldERlZmF1bHRCYXJsaW5lcygpIHtcclxuICAgIGlmICghdGhpcy5nZXRTdGFydEJhcmxpbmUoKSkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuc3RhcnQsXHJcbiAgICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmdldEVuZEJhcmxpbmUoKSkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuZW5kLFxyXG4gICAgICAgIGJhcmxpbmU6IFNtb0JhcmxpbmUuYmFybGluZXMuc2luZ2xlQmFyXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250YWluc1NvdW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBqID0gMDtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHZvaWNlLm5vdGVzW2pdLm5vdGVUeXBlID09PSAnbicpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgcmVuZGVyZWQgd2lkdGggb2YgdGhlIG1lYXN1cmUsIG9yIGVzdGltYXRlIG9mIHNhbWVcclxuICAgKi9cclxuICBnZXQgc3RhZmZXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZldpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IHRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgbWVhc3VyZSwgb3IgZXN0aW1hdGUgb2Ygc2FtZVxyXG4gICAqL1xyXG4gIHNldFdpZHRoKHdpZHRoOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmIChsYXlvdXREZWJ1Zy5mbGFnU2V0KGxheW91dERlYnVnLnZhbHVlcy5tZWFzdXJlSGlzdG9yeSkpIHtcclxuICAgICAgdGhpcy5zdmcuaGlzdG9yeS5wdXNoKCdzZXRXaWR0aCAnICsgdGhpcy5zdGFmZldpZHRoICsgJz0+ICcgKyB3aWR0aCArICcgJyArIGRlc2NyaXB0aW9uKTtcclxuICAgIH1cclxuICAgIGlmIChpc05hTih3aWR0aCkpIHtcclxuICAgICAgdGhyb3cgKCdOQU4gaW4gc2V0V2lkdGgnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3ZnLnN0YWZmV2lkdGggPSB3aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeFxyXG4gICAqL1xyXG4gIGdldCBzdGFmZlgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZlg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgcmVuZGVyZWQgb3IgZXN0aW1hdGVkIHN0YXJ0IHhcclxuICAgKi9cclxuICBzZXRYKHg6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKGlzTmFOKHgpKSB7XHJcbiAgICAgIHRocm93ICgnTkFOIGluIHNldFgnKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdzdGFmZlgnLCB4LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5zdGFmZlggPSBNYXRoLnJvdW5kKHgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHRpbWUgc2lnbmF0dXJlIGhhcyBwb3NzaWJseSBjaGFuZ2VkLiAgYWRkL3JlbW92ZSBub3RlcyB0b1xyXG4gICAqIG1hdGNoIHRoZSBuZXcgbGVuZ3RoXHJcbiAgICovXHJcbiAgYWxpZ25Ob3Rlc1dpdGhUaW1lU2lnbmF0dXJlKCkge1xyXG4gICAgY29uc3QgdHNUaWNrcyA9IFNtb011c2ljLnRpbWVTaWduYXR1cmVUb1RpY2tzKHRoaXMudGltZVNpZ25hdHVyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgIGlmICh0c1RpY2tzID09PSB0aGlzLmdldE1heFRpY2tzVm9pY2UoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbiA9ICh0YXJnZXQ6IG51bWJlciwgYXI6IFNtb05vdGVbXSwgbm90ZTogU21vTm90ZSkgPT4ge1xyXG4gICAgICBjb25zdCBmaXROb3RlID0gbmV3IFNtb05vdGUoU21vTm90ZS5kZWZhdWx0cyk7XHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gU21vTXVzaWMuY2xvc2VzdER1cmF0aW9uVGlja0x0RXEodGFyZ2V0KTtcclxuICAgICAgaWYgKGR1cmF0aW9uID4gMTI4KSB7XHJcbiAgICAgICAgZml0Tm90ZS50aWNrcyA9IHsgbnVtZXJhdG9yOiBkdXJhdGlvbiwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9O1xyXG4gICAgICAgIGZpdE5vdGUuc3RlbVRpY2tzID0gZHVyYXRpb247XHJcbiAgICAgICAgZml0Tm90ZS5waXRjaGVzID0gbm90ZS5waXRjaGVzO1xyXG4gICAgICAgIGZpdE5vdGUubm90ZVR5cGUgPSBub3RlLm5vdGVUeXBlO1xyXG4gICAgICAgIGZpdE5vdGUuY2xlZiA9IG5vdGUuY2xlZjtcclxuICAgICAgICBhci5wdXNoKGZpdE5vdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCB2b2ljZXM6IFNtb1ZvaWNlW10gPSBbXTtcclxuICAgIGNvbnN0IHR1cGxldHM6IFNtb1R1cGxldFtdID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGNvbnN0IG5ld05vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgICAgbGV0IHZvaWNlVGlja3MgPSAwO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIC8vIGlmIGEgdHVwbGV0LCBtYWtlIHN1cmUgdGhlIHdob2xlIHR1cGxldCBmaXRzLlxyXG4gICAgICAgIGlmIChub3RlLmlzVHVwbGV0KSB7XHJcbiAgICAgICAgICBjb25zdCB0dXBsZXRUcmVlID0gU21vVHVwbGV0VHJlZS5nZXRUdXBsZXRUcmVlRm9yTm90ZUluZGV4KHRoaXMudHVwbGV0VHJlZXMsIGksIGopO1xyXG4gICAgICAgICAgaWYgKHR1cGxldFRyZWUpIHtcclxuICAgICAgICAgICAgLy8gcmVtYWluaW5nIG5vdGVzIG9mIGFuIGFwcHJvdmVkIHR1cGxldCwganVzdCBhZGQgdGhlbVxyXG4gICAgICAgICAgICBpZiAodHVwbGV0VHJlZS5zdGFydEluZGV4ICE9PSBqKSB7XHJcbiAgICAgICAgICAgICAgbmV3Tm90ZXMucHVzaChub3RlKTtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0dXBsZXRUcmVlLnRvdGFsVGlja3MgKyB2b2ljZVRpY2tzIDw9IHRzVGlja3MpIHtcclxuICAgICAgICAgICAgICAvLyBmaXJzdCBub3RlIG9mIHRoZSB0dXBsZXQsIGl0IGZpdHMsIGFkZCBpdFxyXG4gICAgICAgICAgICAgIHZvaWNlVGlja3MgKz0gdHVwbGV0VHJlZS50b3RhbFRpY2tzO1xyXG4gICAgICAgICAgICAgIG5ld05vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gdHVwbGV0IHdpbGwgbm90IGZpdC4gIFJlcGxhY2UgdHVwbGV0IHdpdGggYSBub3RlIGFzIGNsb3NlIHRvIHJlbWFpbmRlciBhcyBwb3NzaWJsZSBhbmQgYWRkIGl0XHJcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIHR1cGxldFxyXG4gICAgICAgICAgICAgIG5vdGUudHVwbGV0SWQgPSBudWxsXHJcbiAgICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgICAgICBTbW9UdXBsZXRUcmVlLnJlbW92ZVR1cGxldEZvck5vdGVJbmRleCh0aGlzLCBpLCBqKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHsgLy8gbWlzc2luZyB0dXBsZXQsIG5vdyB3aGF0P1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ21pc3NpbmcgdHVwbGV0IGluZm8nKTtcclxuICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgdm9pY2VUaWNrcyA9IHRzVGlja3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChub3RlLnRpY2tDb3VudCArIHZvaWNlVGlja3MgPD0gdHNUaWNrcykge1xyXG4gICAgICAgICAgICBuZXdOb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgdm9pY2VUaWNrcyA9IHRzVGlja3M7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodHNUaWNrcyAtIHZvaWNlVGlja3MgPiAxMjgpIHtcclxuICAgICAgICBjb25zdCBucCA9IFNtb05vdGUuZGVmYXVsdHM7XHJcbiAgICAgICAgbnAuY2xlZiA9IHRoaXMuY2xlZjtcclxuICAgICAgICBjb25zdCBubm90ZSA9IG5ldyBTbW9Ob3RlKG5wKTtcclxuICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5ub3RlKTtcclxuICAgICAgfVxyXG4gICAgICB2b2ljZXMucHVzaCh7IG5vdGVzOiBuZXdOb3RlcyB9KTtcclxuICAgIH1cclxuICAgIHRoaXMudm9pY2VzID0gdm9pY2VzO1xyXG4gIH1cclxuICBnZXQgbWVhc3VyZU51bWJlckRiZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXh9LyR7dGhpcy5tZWFzdXJlTnVtYmVyLnN5c3RlbUluZGV4fS8ke3RoaXMubWVhc3VyZU51bWJlci5zdGFmZklkfWA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeVxyXG4gICAqL1xyXG4gIGdldCBzdGFmZlkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZlk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgcmVuZGVyZWQgb3IgZXN0aW1hdGVkIHN0YXJ0IHlcclxuICAgKi9cclxuICBzZXRZKHk6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKGlzTmFOKHkpKSB7XHJcbiAgICAgIHRocm93ICgnTkFOIGluIHNldFknKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdzdGFmZlknLCB5LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5zdGFmZlkgPSBNYXRoLnJvdW5kKHkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFjdHVhbCBvciBlc3RpbWF0ZWQgaGlnaGVzdCBwb2ludCBpbiBzY29yZVxyXG4gICAqL1xyXG4gIGdldCB5VG9wKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdmcueVRvcDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmV0dXJuIHRoZSBsb3dlc3QgeSAoaGlnaGVzdCB2YWx1ZSkgaW4gdGhpcyBtZWFzdXJlIHN2Z1xyXG4gICAqXHJcbiAgICogQHJlYWRvbmx5XHJcbiAgICovXHJcbiAgZ2V0IGxvd2VzdFkoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnN2Zy50YWJTdGF2ZUJveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdmcudGFiU3RhdmVCb3gueSArIHRoaXMuc3ZnLnRhYlN0YXZlQm94LmhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN2Zy5sb2dpY2FsQm94LnkgKyB0aGlzLnN2Zy5sb2dpY2FsQm94LmhlaWdodDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogYWRqdXN0IHRoZSB5IGZvciB0aGUgcmVuZGVyIGJveGVzIHRvIGFjY291bnQgZm9yIHRoZSBwYWdlIGFuZCBtYXJnaW5zXHJcbiAgICovXHJcbiAgYWRqdXN0WSh5T2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3ZnLmxvZ2ljYWxCb3gueSArPSB5T2Zmc2V0O1xyXG4gICAgaWYgKHRoaXMuc3ZnLnRhYlN0YXZlQm94KSB7XHJcbiAgICAgIHRoaXMuc3ZnLnRhYlN0YXZlQm94LnkgKz0geU9mZnNldDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogV0hlbiBzZXR0aW5nIGFuIGluc3RydW1lbnQsIG9mZnNldCB0aGUgcGl0Y2hlcyB0byBtYXRjaCB0aGUgaW5zdHJ1bWVudCBrZXlcclxuICAgKiBAcGFyYW0gb2Zmc2V0IFxyXG4gICAqIEBwYXJhbSBuZXdDbGVmIFxyXG4gICAqL1xyXG4gIHRyYW5zcG9zZVRvT2Zmc2V0KG9mZnNldDogbnVtYmVyLCB0YXJnZXRLZXk6IHN0cmluZywgbmV3Q2xlZj86IENsZWYpIHtcclxuICAgIGNvbnN0IGRpZmYgPSBvZmZzZXQgLSB0aGlzLnRyYW5zcG9zZUluZGV4O1xyXG4gICAgbmV3Q2xlZiA9IG5ld0NsZWYgPz8gdGhpcy5jbGVmO1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBpdGNoZXM6IG51bWJlcltdID0gWy4uLkFycmF5KG5vdGUucGl0Y2hlcy5sZW5ndGgpLmtleXMoKV07XHJcbiAgICAgICAgLy8gd2hlbiB0aGUgbm90ZSBpcyBhIHJlc3QsIHByZXNlcnZlIHRoZSByZXN0IGJ1dCBtYXRjaCB0aGUgbmV3IGNsZWYuXHJcbiAgICAgICAgaWYgKG5ld0NsZWYgIT09IHRoaXMuY2xlZiAmJiBub3RlLm5vdGVUeXBlID09PSAncicpIHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGNvbnN0IGRlZnAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltuZXdDbGVmXSkpO1xyXG4gICAgICAgICAgbm90ZS5waXRjaGVzID0gW2RlZnBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RlLnRyYW5zcG9zZShwaXRjaGVzLCBkaWZmLCB0aGlzLmtleVNpZ25hdHVyZSwgdGFyZ2V0S2V5KTtcclxuICAgICAgICAgIG5vdGUuZ2V0R3JhY2VOb3RlcygpLmZvckVhY2goKGduKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdwaXRjaDogbnVtYmVyW10gPSBbLi4uQXJyYXkoZ24ucGl0Y2hlcy5sZW5ndGgpLmtleXMoKV07XHJcbiAgICAgICAgICAgIGNvbnN0IHhwb3NlID0gU21vTm90ZS50cmFuc3Bvc2UoZ24sIGdwaXRjaCwgZGlmZiwgdGhpcy5rZXlTaWduYXR1cmUsIHRhcmdldEtleSk7XHJcbiAgICAgICAgICAgIGduLnBpdGNoZXMgPSB4cG9zZS5waXRjaGVzO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBoaWdoZXN0IHBvaW50IGluIHNjb3JlXHJcbiAgICovXHJcbiAgc2V0WVRvcCh5OiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICd5VG9wJywgeSwgZGVzY3JpcHRpb24pO1xyXG4gICAgdGhpcy5zdmcueVRvcCA9IHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBib3VuZGluZyBib3hcclxuICAgKi9cclxuICBzZXRCb3goYm94OiBTdmdCb3gsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdsb2dpY2FsQm94JywgYm94LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5sb2dpY2FsQm94ID0gU3ZnSGVscGVycy5zbW9Cb3goYm94KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgdGhlIERPTSBpZGVudGlmaWVyIGZvciB0aGlzIG1lYXN1cmUgd2hlbiByZW5kZXJlZFxyXG4gICAqL1xyXG4gIGdldENsYXNzSWQoKSB7XHJcbiAgICByZXR1cm4gJ21tLScgKyB0aGlzLm1lYXN1cmVOdW1iZXIuc3RhZmZJZCArICctJyArIHRoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBpZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRSZW5kZXJlZE5vdGUoaWQ6IHN0cmluZykge1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbal07XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSB2b2ljZS5ub3Rlc1tpXTtcclxuICAgICAgICBpZiAobm90ZS5yZW5kZXJJZCA9PT0gaWQpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNtb05vdGU6IG5vdGUsXHJcbiAgICAgICAgICAgIHZvaWNlOiBqLFxyXG4gICAgICAgICAgICB0aWNrOiBpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXROb3RlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnZvaWNlc1t0aGlzLmFjdGl2ZVZvaWNlXS5ub3RlcztcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVZvaWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVm9pY2U7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVWb2ljZSh2aXg6IG51bWJlcikge1xyXG4gICAgaWYgKHZpeCA+PSAwICYmIHZpeCA8IHRoaXMudm9pY2VzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZvaWNlID0gdml4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGlja21hcEZvclZvaWNlKHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBUaWNrTWFwKHRoaXMsIHZvaWNlSXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIGNyZWF0ZU1lYXN1cmVUaWNrbWFwc1xyXG4gIC8vIEEgdGlja21hcCBpcyBhIG1hcCBvZiBub3RlcyB0byB0aWNrcyBmb3IgdGhlIG1lYXN1cmUuICBJdCBpcyBzcGVjaWlmYyBwZXItdm9pY2VcclxuICAvLyBzaW5jZSBlYWNoIHZvaWNlIG1heSBoYXZlIGRpZmZlcmVudCBudW1iZXJzIG9mIHRpY2tzLiAgVGhlIGFjY2lkZW50YWwgbWFwIGlzXHJcbiAgLy8gb3ZlcmFsbCBzaW5jZSBhY2NpZGVudGFscyBpbiBvbmUgdm9pY2UgYXBwbHkgdG8gYWNjaWRlbnRhbHMgaW4gdGhlIG90aGVyXHJcbiAgLy8gdm9pY2VzLiAgU28gd2UgcmV0dXJuIHRoZSB0aWNrbWFwcyBhbmQgdGhlIG92ZXJhbGwgYWNjaWRlbnRhbCBtYXAuXHJcbiAgY3JlYXRlTWVhc3VyZVRpY2ttYXBzKCk6IE1lYXN1cmVUaWNrbWFwcyB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCB0aWNrbWFwQXJyYXk6IFRpY2tNYXBbXSA9IFtdO1xyXG4gICAgY29uc3QgYWNjaWRlbnRhbE1hcDogUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgVGlja0FjY2lkZW50YWw+PiA9XHJcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFJlY29yZDxQaXRjaExldHRlciwgVGlja0FjY2lkZW50YWw+PjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICB0aWNrbWFwQXJyYXkucHVzaCh0aGlzLnRpY2ttYXBGb3JWb2ljZShpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHRpY2ttYXA6IFRpY2tNYXAgPSB0aWNrbWFwQXJyYXlbaV07XHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uS2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cygodGlja21hcC5kdXJhdGlvbkFjY2lkZW50YWxNYXApKTtcclxuXHJcbiAgICAgIGR1cmF0aW9uS2V5cy5mb3JFYWNoKChkdXJhdGlvbktleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XSkge1xyXG4gICAgICAgICAgYWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV0gPSB0aWNrbWFwLmR1cmF0aW9uQWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGFtYXAgPSBhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XTtcclxuICAgICAgICAgIGNvbnN0IHRpY2thYmxlOiBSZWNvcmQ8UGl0Y2hMZXR0ZXIsIFRpY2tBY2NpZGVudGFsPiA9IHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XTtcclxuICAgICAgICAgIGNvbnN0IGxldHRlcktleXM6IFBpdGNoTGV0dGVyW10gPSBPYmplY3Qua2V5cyh0aWNrYWJsZSkgYXMgQXJyYXk8UGl0Y2hMZXR0ZXI+O1xyXG4gICAgICAgICAgbGV0dGVyS2V5cy5mb3JFYWNoKChwaXRjaEtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWFtYXBbcGl0Y2hLZXldKSB7XHJcbiAgICAgICAgICAgICAgYW1hcFtwaXRjaEtleV0gPSB0aWNrbWFwLmR1cmF0aW9uQWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV1bcGl0Y2hLZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gZHVyYXRpb246IGR1cmF0aW9uLCBwaXRjaGVzOiBSZWNvcmQ8UGl0Y2hMZXR0ZXIsVGlja0FjY2lkZW50YWw+XHJcbiAgICBjb25zdCBhY2NpZGVudGFsQXJyYXk6IEFjY2lkZW50YWxBcnJheVtdID0gW107XHJcbiAgICBPYmplY3Qua2V5cyhhY2NpZGVudGFsTWFwKS5mb3JFYWNoKChkdXJhdGlvbktleSkgPT4ge1xyXG4gICAgICBhY2NpZGVudGFsQXJyYXkucHVzaCh7IGR1cmF0aW9uOiBkdXJhdGlvbktleSwgcGl0Y2hlczogYWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV0gfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpY2ttYXBzOiB0aWNrbWFwQXJyYXksXHJcbiAgICAgIGFjY2lkZW50YWxNYXAsXHJcbiAgICAgIGFjY2lkZW50YWxBcnJheVxyXG4gICAgfTtcclxuICB9XHJcbiAgLy8gIyMjIGNyZWF0ZVJlc3ROb3RlV2l0aER1cmF0aW9uXHJcbiAgLy8gcGFkIHNvbWUgZHVyYXRpb24gb2YgbXVzaWMgd2l0aCByZXN0cy5cclxuICBzdGF0aWMgY3JlYXRlUmVzdE5vdGVXaXRoRHVyYXRpb24oZHVyYXRpb246IG51bWJlciwgY2xlZjogQ2xlZik6IFNtb05vdGUge1xyXG4gICAgY29uc3QgcGl0Y2g6IFBpdGNoID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW2NsZWZdKSk7XHJcbiAgICBjb25zdCBub3RlID0gbmV3IFNtb05vdGUoU21vTm90ZS5kZWZhdWx0cyk7XHJcbiAgICBub3RlLnBpdGNoZXMgPSBbcGl0Y2hdO1xyXG4gICAgbm90ZS5ub3RlVHlwZSA9ICdyJztcclxuICAgIG5vdGUuaGlkZGVuID0gdHJ1ZTtcclxuICAgIG5vdGUudGlja3MgPSB7IG51bWVyYXRvcjogZHVyYXRpb24sIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfTtcclxuICAgIHJldHVybiBub3RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgdGhlIG51bWJlciBvZiB0aWNrcyBpbiBlYWNoIHZvaWNlIGFuZCByZXR1cm4gbWF4XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0TWF4VGlja3NWb2ljZSgpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBtYXggPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlVGlja3MgPSB0aGlzLmdldFRpY2tzRnJvbVZvaWNlKGkpO1xyXG4gICAgICBtYXggPSBNYXRoLm1heCh2b2ljZVRpY2tzLCBtYXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gYSBzcGVjaWZpYyB2b2ljZVxyXG4gICAqIEBwYXJhbSB2b2ljZUluZGV4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldFRpY2tzRnJvbVZvaWNlKHZvaWNlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdGlja3MgPSAwO1xyXG4gICAgdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICB0aWNrcyArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRpY2tzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgYWxsIHRoZSB0aWNrcyB1cCB0byB0aGUgcHJvdmlkZWQgdGlja0luZGV4XHJcbiAgICogQHBhcmFtIHZvaWNlSW5kZXhcclxuICAgKiBAcGFyYW0gdGlja0luZGV4XHJcbiAgICovXHJcbiAgZ2V0Tm90ZVBvc2l0aW9uSW5UaWNrcyh2b2ljZUluZGV4OiBudW1iZXIsIHRpY2tJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBydiA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpY2tJbmRleDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlc1tpXTtcclxuICAgICAgcnYgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCBhbGwgdGhlIHRpY2tzIHVwIHRvIHRoZSBwcm92aWRlZCB0aWNrSW5kZXhcclxuICAgKiBAcGFyYW0gdm9pY2VJbmRleFxyXG4gICAqIEBwYXJhbSB0aWNrSW5kZXhcclxuICAgKi9cclxuICBnZXRUaWNrQ291bnRGb3JOb3RlKHZvaWNlSW5kZXg6IG51bWJlciwgbm90ZTogU21vTm90ZSk6IG51bWJlciB7XHJcbiAgICBsZXQgcnYgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjdXJyZW50Tm90ZSA9IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzW2ldO1xyXG4gICAgICBydiArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIGdldENsb3Nlc3RJbmRleEZyb21UaWNrQ291bnQodm9pY2VJbmRleDogbnVtYmVyLCB0aWNrQ291bnQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgcnYgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlc1tpXTtcclxuICAgICAgaWYgKG5vdGUudGlja0NvdW50ICsgcnYgPj0gdGlja0NvdW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgICAgcnYgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIGlzUGlja3VwKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdGlja3MgPSB0aGlzLmdldFRpY2tzRnJvbVZvaWNlKDApO1xyXG4gICAgY29uc3QgZ29hbCA9IFNtb011c2ljLnRpbWVTaWduYXR1cmVUb1RpY2tzKHRoaXMudGltZVNpZ25hdHVyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgIHJldHVybiAodGlja3MgPCBnb2FsKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQmVhbUdyb3VwcygpIHtcclxuICAgIHRoaXMuYmVhbUdyb3VwcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIHVwZGF0ZUx5cmljRm9udFxyXG4gIC8vIFVwZGF0ZSB0aGUgbHlyaWMgZm9udCwgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGFsbCBseXJpY3MuXHJcbiAgc2V0THlyaWNGb250KGZvbnRJbmZvOiBGb250SW5mbykge1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuc2V0THlyaWNGb250KGZvbnRJbmZvKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc2V0THlyaWNBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldEx5cmljQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldENob3JkQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5zZXRDaG9yZEFkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgdXBkYXRlTHlyaWNGb250XHJcbiAgLy8gVXBkYXRlIHRoZSBseXJpYyBmb250LCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYWxsIGx5cmljcy5cclxuICBzZXRDaG9yZEZvbnQoZm9udEluZm86IEZvbnRJbmZvKSB7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5zZXRDaG9yZEZvbnQoZm9udEluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHVwbGV0Tm90ZXMoc21vVHVwbGV0OiBTbW9UdXBsZXQpOiBTbW9Ob3RlW10ge1xyXG4gICAgbGV0IHR1cGxldE5vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSBzbW9UdXBsZXQuc3RhcnRJbmRleDsgaSA8PSBzbW9UdXBsZXQuZW5kSW5kZXg7IGkrKykge1xyXG4gICAgICBjb25zdCBub3RlID0gdGhpcy52b2ljZXNbc21vVHVwbGV0LnZvaWNlXS5ub3Rlc1tpXTtcclxuICAgICAgdHVwbGV0Tm90ZXMucHVzaChub3RlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0dXBsZXROb3RlcztcclxuICB9XHJcblxyXG4gIGdldFN0ZW1EaXJlY3Rpb25Gb3JUdXBsZXQoc21vVHVwbGV0OiBTbW9UdXBsZXQpIHtcclxuICAgIGxldCBub3RlOiBTbW9Ob3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBjdXJyZW50Tm90ZSBvZiB0aGlzLnR1cGxldE5vdGVzKHNtb1R1cGxldCkpIHtcclxuICAgICAgaWYgKGN1cnJlbnROb3RlLm5vdGVUeXBlID09PSAnbicpIHtcclxuICAgICAgICBub3RlID0gY3VycmVudE5vdGU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW5vdGUpIHtcclxuICAgICAgcmV0dXJuIFNtb05vdGUuZmxhZ1N0YXRlcy5kb3duO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vdGUuZmxhZ1N0YXRlICE9PSBTbW9Ob3RlLmZsYWdTdGF0ZXMuYXV0bykge1xyXG4gICAgICByZXR1cm4gbm90ZS5mbGFnU3RhdGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21vTXVzaWMucGl0Y2hUb0xlZGdlckxpbmUodGhpcy5jbGVmLCBub3RlLnBpdGNoZXNbMF0pXHJcbiAgICAgID49IDIgPyBTbW9Ob3RlLmZsYWdTdGF0ZXMudXAgOiBTbW9Ob3RlLmZsYWdTdGF0ZXMuZG93bjtcclxuICB9XHJcbiAgZ2V0Tm90ZUJ5SWQoaWQ6IHN0cmluZyk6IFNtb05vdGUgfCBudWxsIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSB2b2ljZS5ub3Rlc1tqXTtcclxuICAgICAgICBpZiAobm90ZS5hdHRycy5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgIHJldHVybiBub3RlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIHNldENsZWYoY2xlZjogQ2xlZikge1xyXG4gICAgY29uc3Qgb2xkQ2xlZiA9IHRoaXMuY2xlZjtcclxuICAgIHRoaXMuY2xlZiA9IGNsZWY7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5jbGVmID0gY2xlZjtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjbGVmIHRoYXQgdGhpcyBtZWFzdXJlIGVuZHMgd2l0aC5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRMYXN0Q2xlZigpIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSB2b2ljZS5ub3Rlc1tqXTtcclxuICAgICAgICBpZiAobm90ZS5jbGVmTm90ZSAmJiBub3RlLmNsZWZOb3RlLmNsZWYgIT09IHRoaXMuY2xlZikge1xyXG4gICAgICAgICAgcmV0dXJuIG5vdGUuY2xlZk5vdGUuY2xlZjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNsZWY7XHJcbiAgfVxyXG4gIGlzUmVzdCgpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKCF2b2ljZS5ub3Rlc1tqXS5pc1Jlc3QoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIC8vICMjIyBwb3B1bGF0ZVZvaWNlXHJcbiAgLy8gQ3JlYXRlIGEgbmV3IHZvaWNlIGluIHRoaXMgbWVhc3VyZSwgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGRlZmF1bHQgbm90ZVxyXG4gIC8vIGZvciB0aGlzIG1lYXN1cmUva2V5L2NsZWZcclxuICBwb3B1bGF0ZVZvaWNlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmIChpbmRleCAhPT0gdGhpcy52b2ljZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudm9pY2VzLnB1c2goeyBub3RlczogU21vTWVhc3VyZS5nZXREZWZhdWx0Tm90ZXModGhpcykgfSk7XHJcbiAgICB0aGlzLmFjdGl2ZVZvaWNlID0gaW5kZXg7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3JlbW92ZVNpbmdsZXRvbk1vZGlmaWVyKG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXIgPSB0aGlzLm1vZGlmaWVycy5maWx0ZXIob2JqID0+IG9iai5hdHRycy50eXBlICE9PSBuYW1lKTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgfVxyXG5cclxuICBhZGRSZWhlYXJzYWxNYXJrKHBhcmFtZXRlcnM6IFNtb1JlaGVhcnNhbE1hcmtQYXJhbXMpIHtcclxuICAgIHRoaXMuX3JlbW92ZVNpbmdsZXRvbk1vZGlmaWVyKCdTbW9SZWhlYXJzYWxNYXJrJyk7XHJcbiAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9SZWhlYXJzYWxNYXJrKHBhcmFtZXRlcnMpKTtcclxuICB9XHJcbiAgcmVtb3ZlUmVoZWFyc2FsTWFyaygpIHtcclxuICAgIHRoaXMuX3JlbW92ZVNpbmdsZXRvbk1vZGlmaWVyKCdTbW9SZWhlYXJzYWxNYXJrJyk7XHJcbiAgfVxyXG4gIGdldFJlaGVhcnNhbE1hcmsoKTogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllcnMuZmluZChvYmogPT4gb2JqLmF0dHJzLnR5cGUgPT09ICdTbW9SZWhlYXJzYWxNYXJrJyk7XHJcbiAgfVxyXG4gIGdldE1vZGlmaWVyc0J5VHlwZSh0eXBlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGlmaWVycy5maWx0ZXIoKG1tKSA9PiB0eXBlID09PSBtbS5hdHRycy50eXBlKTtcclxuICB9XHJcblxyXG4gIHNldFRlbXBvKHBhcmFtczogU21vVGVtcG9UZXh0UGFyYW1zKSB7XHJcbiAgICB0aGlzLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChwYXJhbXMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgbWVhc3VyZSB0ZW1wbyB0byB0aGUgZGVmYXVsdCB7QGxpbmsgU21vVGVtcG9UZXh0fVxyXG4gICAqL1xyXG4gIHJlc2V0VGVtcG8oKSB7XHJcbiAgICB0aGlzLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gIH1cclxuICBnZXRUZW1wbygpIHtcclxuICAgIGlmICh0eXBlb2YgKHRoaXMudGVtcG8pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGVtcG87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1lYXN1cmUgdGV4dCBpcyBkZXByZWNhdGVkLCBhbmQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS5cclxuICAgKiBCZXR0ZXIgdG8gdXNlIFNtb1RleHRHcm91cCBhbmQgYXR0YWNoIHRvIHRoZSBtZWFzdXJlLlxyXG4gICAqIEBwYXJhbSBtb2QgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYWRkTWVhc3VyZVRleHQobW9kOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSB7XHJcbiAgICB2YXIgZXhpc3QgPSB0aGlzLm1vZGlmaWVycy5maWx0ZXIoKG1tKSA9PlxyXG4gICAgICBtbS5hdHRycy5pZCA9PT0gbW9kLmF0dHJzLmlkXHJcbiAgICApO1xyXG4gICAgaWYgKGV4aXN0Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG1vZCk7XHJcbiAgfVxyXG5cclxuICBnZXRNZWFzdXJlVGV4dCgpIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGlmaWVycy5maWx0ZXIob2JqID0+IG9iai5jdG9yID09PSAnU21vTWVhc3VyZVRleHQnKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU1lYXN1cmVUZXh0KGlkOiBzdHJpbmcpIHtcclxuICAgIHZhciBhciA9IHRoaXMubW9kaWZpZXJzLmZpbHRlcihvYmogPT4gb2JqLmF0dHJzLmlkICE9PSBpZCk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVwZWF0U3ltYm9sKHJzOiBTbW9SZXBlYXRTeW1ib2wpIHtcclxuICAgIGNvbnN0IGFyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICBjb25zdCBleFN5bWJvbCA9IHRoaXMuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAoZXhTeW1ib2wgJiYgZXhTeW1ib2wuc3ltYm9sID09PSBycy5zeW1ib2wpIHtcclxuICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vUmVwZWF0U3ltYm9sJykge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgICBpZiAodG9BZGQpIHtcclxuICAgICAgYXIucHVzaChycyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFJlcGVhdFN5bWJvbCgpOiBTbW9SZXBlYXRTeW1ib2wgfCBudWxsIHtcclxuICAgIGNvbnN0IHJ2ID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouY3RvciA9PT0gJ1Ntb1JlcGVhdFN5bWJvbCcpO1xyXG4gICAgaWYgKHJ2Lmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHJ2WzBdIGFzIFNtb1JlcGVhdFN5bWJvbDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBjbGVhclJlcGVhdFN5bWJvbHMoKSB7XHJcbiAgICBjb25zdCBhcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciAhPT0gJ1Ntb1JlcGVhdFN5bWJvbCcpIHtcclxuICAgICAgICBhci5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gIH1cclxuXHJcbiAgc2V0QmFybGluZShiYXJsaW5lOiBTbW9CYXJsaW5lKSB7XHJcbiAgICB2YXIgYXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9CYXJsaW5lJykge1xyXG4gICAgICAgIGNvbnN0IG8gPSBtb2RpZmllciBhcyBTbW9CYXJsaW5lO1xyXG4gICAgICAgIGlmIChvLnBvc2l0aW9uICE9PSBiYXJsaW5lLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgICBhci5wdXNoKG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhci5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gICAgYXIucHVzaChiYXJsaW5lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEJhcmxpbmUocG9zOiBudW1iZXIpOiBTbW9CYXJsaW5lIHtcclxuICAgIGxldCBydiA9IG51bGw7XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5wb3NpdGlvbiA9PT0gcG9zKSB7XHJcbiAgICAgICAgcnYgPSBtb2RpZmllcjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAocnYgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTbW9CYXJsaW5lKFNtb0JhcmxpbmUuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgZ2V0RW5kQmFybGluZSgpOiBTbW9CYXJsaW5lIHsgICAgXHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0QmFybGluZShTbW9CYXJsaW5lLnBvc2l0aW9ucy5lbmQpO1xyXG4gIH1cclxuICBnZXRTdGFydEJhcmxpbmUoKTogU21vQmFybGluZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0QmFybGluZShTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCk7XHJcbiAgfVxyXG5cclxuICBhZGROdGhFbmRpbmcoZW5kaW5nOiBTbW9Wb2x0YSkge1xyXG4gICAgY29uc3QgbW9kcyA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgIT09ICdTbW9Wb2x0YScgfHwgKG1vZGlmaWVyIGFzIFNtb1ZvbHRhKS5zdGFydEJhciAhPT0gZW5kaW5nLnN0YXJ0QmFyIHx8XHJcbiAgICAgICAgKG1vZGlmaWVyIGFzIFNtb1ZvbHRhKS5lbmRCYXIgIT09IGVuZGluZy5lbmRCYXIpIHtcclxuICAgICAgICBtb2RzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1vZHMucHVzaChlbmRpbmcpO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBtb2RzO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTnRoRW5kaW5nKGVuZGluZzogU21vVm9sdGEpIHtcclxuICAgIGNvbnN0IG1vZHM6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9Wb2x0YScpIHtcclxuICAgICAgICBjb25zdCB2b2x0YSA9IG1vZGlmaWVyIGFzIFNtb1ZvbHRhO1xyXG4gICAgICAgIGlmIChlbmRpbmcuc3RhcnRTZWxlY3RvciA9PT0gbnVsbCB8fCBlbmRpbmcuZW5kU2VsZWN0b3IgPT09IG51bGwgfHwgdm9sdGEuc3RhcnRTZWxlY3RvciA9PT0gbnVsbCB8fCB2b2x0YS5lbmRTZWxlY3RvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIVNtb1NlbGVjdG9yLnNhbWVNZWFzdXJlKGVuZGluZy5zdGFydFNlbGVjdG9yLCB2b2x0YS5zdGFydFNlbGVjdG9yKSB8fCAhU21vU2VsZWN0b3Iuc2FtZU1lYXN1cmUoZW5kaW5nLmVuZFNlbGVjdG9yLCB2b2x0YS5lbmRTZWxlY3RvcilcclxuICAgICAgICAmJiBlbmRpbmcubnVtYmVyICE9PSB2b2x0YS5udW1iZXIpIHtcclxuICAgICAgICAgIG1vZHMucHVzaChtb2RpZmllcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1vZHMucHVzaChtb2RpZmllcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBtb2RzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TnRoRW5kaW5ncygpOiBTbW9Wb2x0YVtdIHtcclxuICAgIGNvbnN0IHJ2OiBTbW9Wb2x0YVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSkgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb1ZvbHRhJykge1xyXG4gICAgICAgIHJ2LnB1c2gobW9kaWZpZXIgYXMgU21vVm9sdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgc2V0S2V5U2lnbmF0dXJlKHNpZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmtleVNpZ25hdHVyZSA9IHNpZztcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLmtleVNpZ25hdHVyZSA9IHNpZztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc2V0TWVhc3VyZU51bWJlcihudW06IE1lYXN1cmVOdW1iZXIpIHtcclxuICAgIHRoaXMubWVhc3VyZU51bWJlciA9IG51bTtcclxuICB9XHJcbiAgZ2V0QmVhbUdyb3VwRm9yTm90ZShub3RlOiBTbW9Ob3RlKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5iZWFtR3JvdXBzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGJnID0gdGhpcy5iZWFtR3JvdXBzW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYmcubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZiAoYmcubm90ZXNbal0uYXR0cnMuaWQgPT09IG5vdGUuYXR0cnMuaWQpIHtcclxuICAgICAgICAgIHJldHVybiBiZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/smo/data/measure.ts\n");
493
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoMeasure: () => (/* binding */ SmoMeasure),\n/* harmony export */ SmoMeasureNumberParams: () => (/* binding */ SmoMeasureNumberParams),\n/* harmony export */ SmoMeasureStringParams: () => (/* binding */ SmoMeasureStringParams)\n/* harmony export */ });\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ \"./src/smo/data/tuplet.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../xform/tickMap */ \"./src/smo/xform/tickMap.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _xform_selections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../xform/selections */ \"./src/smo/xform/selections.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Contains definition and supporting classes for {@link SmoMeasure}.\n * Most of the engraving is done at the measure level. Measure contains multiple (at least 1)\n * voices, which in turn contain notes. Each measure also contains formatting information. This\n * is mostly serialized outside of measure (in score), since columns and often an entire region\n * share measure formatting. Measures also contain modifiers like barlines. Tuplets and beam groups\n * are contained at the measure level.\n * @module /smo/data/measure\n */\n\n\n\n\n\n\n\n\n\n\n// @internal\nconst SmoMeasureNumberParams = ['transposeIndex', 'activeVoice', 'lines', 'repeatCount'];\n// @internal\nconst SmoMeasureStringParams = ['keySignature'];\n/**\n * Only arrays and measure numbers are serilialized with default values.\n * @param params - result of serialization\n * @returns\n */\nfunction isSmoMeasureParamsSer(params) {\n var _a;\n if (!Array.isArray(params.voices) ||\n !Array.isArray(params.tupletTrees) || !Array.isArray(params.modifiers) ||\n typeof ((_a = params === null || params === void 0 ? void 0 : params.measureNumber) === null || _a === void 0 ? void 0 : _a.measureIndex) !== 'number') {\n return false;\n }\n return true;\n}\n/**\n * Data for a measure of music. Many rules of musical engraving are\n * enforced at a measure level: the duration of notes, accidentals, etc.\n *\n * Measures contain {@link SmoNote}, {@link SmoTuplet}, and {@link SmoBeamGroup}\n * Measures are contained in {@link SmoSystemStaff}\n * @category SmoObject\n */\nclass SmoMeasure {\n static get timeSignatureDefault() {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n }\n /**\n * Default constructor parameters. Defaults are always copied so the\n * caller can modify them to create a new measure.\n * @returns constructor params for a new measure\n */\n static get defaults() {\n const proto = JSON.parse(JSON.stringify(SmoMeasure._defaults));\n proto.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n proto.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n return proto;\n }\n // @ignore\n static convertLegacyTimeSignature(ts) {\n const rv = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n rv.timeSignature = ts;\n return rv;\n }\n /**\n * Fill in components. We assume the modifiers are already constructed,\n * e.g. by deserialize or the calling function.\n * @param params\n */\n constructor(params) {\n this.timeSignature = SmoMeasure.timeSignatureDefault;\n /**\n * Overrides display of actual time signature, in the case of\n * pick-up notes where the actual and displayed durations are different\n */\n this.keySignature = '';\n this.canceledKeySignature = '';\n this.tupletTrees = [];\n this.repeatSymbol = false;\n this.repeatCount = 0;\n this.ctor = 'SmoMeasure';\n /**\n * Adjust for non-concert pitch intstruments\n */\n this.transposeIndex = 0;\n this.modifiers = [];\n /**\n * Row, column, and custom numbering information about this measure.\n */\n this.measureNumber = {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n };\n this.clef = 'treble';\n this.voices = [];\n /**\n * the active voice in the editor, if there are multiple voices\n * */\n this.activeVoice = 0;\n this.beamGroups = [];\n this.lines = 5;\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n this.svg = {\n staffWidth: 0,\n unjustifiedWidth: 0,\n staffX: 0,\n staffY: 0,\n logicalBox: {\n x: 0, y: 0, width: 0, height: 0\n },\n yTop: 0,\n adjX: 0,\n maxColumnStartX: 0,\n adjRight: 0,\n history: [],\n lineIndex: 0,\n pageIndex: 0,\n rowInSystem: 0,\n forceClef: false,\n forceKeySignature: false,\n forceTimeSignature: false,\n forceTempo: false,\n hideEmptyMeasure: false,\n hideMultimeasure: false,\n multimeasureLength: 0,\n multimeasureEndBarline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines['singleBar'],\n element: null\n };\n const defaults = SmoMeasure.defaults;\n SmoMeasureNumberParams.forEach((param) => {\n if (typeof (params[param]) !== 'undefined') {\n this[param] = params[param];\n }\n });\n SmoMeasureStringParams.forEach((param) => {\n this[param] = params[param] ? params[param] : defaults[param];\n });\n this.clef = params.clef;\n this.repeatSymbol = params.repeatSymbol;\n this.measureNumber = JSON.parse(JSON.stringify(params.measureNumber));\n if (params.tempo) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params.tempo);\n }\n // Handle legacy time signature format\n if (params.timeSignature) {\n const tsAny = params.timeSignature;\n if (typeof (tsAny) === 'string') {\n this.timeSignature = SmoMeasure.convertLegacyTimeSignature(tsAny);\n }\n else {\n this.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(tsAny);\n }\n }\n this.voices = params.voices ? params.voices : [];\n this.tupletTrees = params.tupletTrees ? params.tupletTrees : [];\n this.modifiers = params.modifiers ? params.modifiers : defaults.modifiers;\n this.setDefaultBarlines();\n this.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(this.keySignature, this.transposeIndex);\n if (!(params.format)) {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n this.format.measureIndex = this.measureNumber.measureIndex;\n }\n else {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(params.format);\n }\n this.id = (0,_common__WEBPACK_IMPORTED_MODULE_8__.getId)().toString();\n this.updateClefChangeNotes();\n }\n // @internal\n // used for serialization\n static get defaultAttributes() {\n return [\n 'keySignature',\n 'measureNumber',\n 'activeVoice', 'clef', 'transposeIndex',\n 'format', 'rightMargin', 'lines', 'repeatSymbol', 'repeatCount'\n ];\n }\n // @internal\n // used for serialization\n static get formattingOptions() {\n return ['customStretch', 'customProportion', 'autoJustify', 'systemBreak',\n 'pageBreak', 'padLeft'];\n }\n // @internal\n // used for serialization\n static get columnMappedAttributes() {\n return ['timeSignature', 'keySignature', 'tempo'];\n }\n static get serializableAttributes() {\n const rv = [];\n SmoMeasure.defaultAttributes.forEach((attr) => {\n if (SmoMeasure.columnMappedAttributes.indexOf(attr) < 0 && attr !== 'format') {\n rv.push(attr);\n }\n });\n return rv;\n }\n /**\n // Return true if the time signatures are the same, for display purposes (e.g. if a time sig change\n // is required)\n */\n static timeSigEqual(o1, o2) {\n return o1.timeSignature === o2.timeSignature && o1.useSymbol === o2.useSymbol;\n }\n /**\n * If there is a clef change mid-measure, update the actual clefs of the notes\n * so they display correctly.\n */\n updateClefChangeNotes() {\n let changed = false;\n let curTick = 0;\n let clefChange = this.clef;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n smoNote.clef = this.clef;\n if (smoNote.clefNote && smoNote.clefNote.clef !== this.clef) {\n clefChange = smoNote.clefNote.clef;\n curTick += smoNote.tickCount;\n changed = true;\n break;\n }\n curTick += smoNote.tickCount;\n }\n if (changed) {\n break;\n }\n }\n if (!changed) {\n return;\n }\n // clefChangeTick is where the change goes. We only support\n // one per measure, others are ignored.\n const clefChangeTick = curTick;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n const noteTicks = smoNote.tickCount;\n if (curTick + noteTicks >= clefChangeTick) {\n smoNote.clef = clefChange;\n }\n // Remove any redundant clef changes later in the measure\n if (curTick + noteTicks > clefChangeTick) {\n if (smoNote.clefNote && smoNote.clefNote.clef === clefChange) {\n smoNote.clefNote = null;\n }\n }\n curTick += noteTicks;\n }\n }\n }\n /**\n * @internal\n * @returns column mapped parameters, serialized. caller will\n * decide if the parameters need to be persisted\n */\n serializeColumnMapped() {\n //\n return {\n timeSignature: this.timeSignature.serialize(),\n keySignature: this.keySignature,\n tempo: this.tempo.serialize()\n };\n }\n getColumnMapped() {\n return {\n timeSignature: this.timeSignature,\n keySignature: this.keySignature,\n tempo: this.tempo\n };\n }\n /**\n * Convert this measure object to a JSON object, recursively serializing all the notes,\n * note modifiers, etc.\n */\n serialize() {\n const params = { \"ctor\": \"SmoMeasure\" };\n let ser = true;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoMeasure.defaults, SmoMeasure.serializableAttributes, this, params);\n // Don't serialize default things\n const fmt = this.format.serialize();\n // measure number can't be defaulted b/c tempos etc. can map to default measure\n params.measureNumber = JSON.parse(JSON.stringify(this.measureNumber));\n params.tupletTrees = [];\n params.voices = [];\n params.modifiers = [];\n this.tupletTrees.forEach((tupletTree) => {\n params.tupletTrees.push(tupletTree.serialize());\n });\n this.voices.forEach((voice) => {\n const obj = {\n notes: []\n };\n voice.notes.forEach((note) => {\n obj.notes.push(note.serialize());\n });\n params.voices.push(obj);\n });\n this.modifiers.forEach((modifier) => {\n ser = true;\n /* don't serialize default modifiers */\n if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start &&\n modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end\n && modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoTempoText') {\n // we don't save tempo text as a modifier anymore\n ser = false;\n }\n else if (modifier.ctor === 'SmoRepeatSymbol' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.positions.start\n && modifier.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols.None) {\n ser = false;\n }\n if (ser) {\n params.modifiers.push(modifier.serialize());\n }\n });\n // ['timeSignature', 'keySignature', 'tempo']\n if (!isSmoMeasureParamsSer(params)) {\n throw 'invalid measure';\n }\n return params;\n }\n /**\n * restore a serialized measure object. Usually called as part of deserializing a score,\n * but can also be used to restore a measure due to an undo operation. Recursively\n * deserialize all the notes and modifiers to construct a new measure.\n * @param jsonObj the serialized SmoMeasure\n * @returns\n */\n static deserialize(jsonObj) {\n var _a;\n let j = 0;\n let i = 0;\n const voices = [];\n for (j = 0; j < jsonObj.voices.length; ++j) {\n const voice = jsonObj.voices[j];\n const notes = [];\n voices.push({\n notes\n });\n for (i = 0; i < voice.notes.length; ++i) {\n const noteParams = voice.notes[i];\n const smoNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.deserialize(noteParams);\n notes.push(smoNote);\n }\n }\n const modifiers = [];\n jsonObj.modifiers.forEach((modParams) => {\n const modifier = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modParams);\n modifiers.push(modifier);\n });\n const params = SmoMeasure.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, jsonObj, params);\n // explode column-mapped\n if (jsonObj.tempo) {\n params.tempo = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.deserialize(jsonObj.tempo);\n }\n else {\n params.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n // timeSignatureString is now part of timeSignature. upconvert old scores\n let timeSignatureString = '';\n const jsonLegacy = jsonObj;\n if (typeof (jsonLegacy.timeSignatureString) === 'string' && jsonLegacy.timeSignatureString.length > 0) {\n timeSignatureString = jsonLegacy.timeSignatureString;\n }\n if (jsonObj.timeSignature) {\n if (timeSignatureString.length) {\n jsonObj.timeSignature.displayString = timeSignatureString;\n }\n params.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.deserialize(jsonObj.timeSignature);\n }\n else {\n const tparams = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults;\n if (timeSignatureString.length) {\n tparams.displayString = timeSignatureString;\n }\n params.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(tparams);\n }\n params.keySignature = (_a = jsonObj.keySignature) !== null && _a !== void 0 ? _a : 'C';\n params.voices = voices;\n if (jsonObj.tupletTrees !== undefined) {\n for (j = 0; j < jsonObj.tupletTrees.length; ++j) {\n const tupletTreeJson = jsonObj.tupletTrees[j];\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.deserialize(tupletTreeJson);\n params.tupletTrees.push(tupletTree);\n }\n }\n //deserialization of a legacy tuplets\n //legacy schema had measure.tuplets, it is measure.tupletTrees now\n if (jsonObj.tuplets !== undefined) {\n for (j = 0; j < jsonObj.tuplets.length; ++j) {\n const tupJson = jsonObj.tuplets[j];\n // Legacy schema had attrs.id, now it is just id\n if (tupJson.attrs && tupJson.attrs.id) {\n tupJson.id = tupJson.attrs.id;\n }\n const tupletNotes = [];\n let startIndex = null;\n params.voices.forEach((voice) => {\n voice.notes.forEach((note, index) => {\n // backwards-compatibiliity, some scores don't have attrs on tuplet\n if (typeof (tupJson.id) === 'string') {\n tupJson.attrs = { type: 'SmoTuplet', id: tupJson.id };\n }\n const id = tupJson.attrs.id;\n if (note.isTuplet && note.tupletId === id) {\n tupletNotes.push(note);\n //we cannot trust startIndex coming from legacy json\n //we need to count index of the first note in the tuplet\n if (startIndex === null) {\n startIndex = index;\n }\n }\n });\n });\n // Bug fix: A tuplet with no notes may be been overwritten\n // in a copy/paste operation\n if (tupletNotes.length > 0) {\n tupJson.notes = tupletNotes;\n tupJson.startIndex = startIndex;\n tupJson.endIndex = tupJson.startIndex + tupletNotes.length - 1;\n }\n const tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTuplet.deserialize(tupJson);\n const tupletTree = new _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree({ tuplet: tuplet });\n params.tupletTrees.push(tupletTree);\n }\n }\n if (params.tupletTrees.length) {\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.syncTupletIds(params.tupletTrees, voices);\n }\n params.modifiers = modifiers;\n const measure = new SmoMeasure(params);\n // Handle migration for measure-mapped parameters\n measure.modifiers.forEach((mod) => {\n if (mod.ctor === 'SmoTempoText') {\n measure.tempo = mod;\n }\n });\n if (!measure.tempo) {\n measure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return measure;\n }\n static clone(measure) {\n return SmoMeasure.deserialize(measure.serialize());\n }\n static cloneForPasteOrUndo(measure) {\n const clonedMeasure = SmoMeasure.clone(measure);\n clonedMeasure.svg = measure.svg;\n // Ordinarily, the key/tempo/time is mapped to the stave, but since we are pasting measure-by\n // measure here, we want to preserve it.\n clonedMeasure.keySignature = measure.keySignature;\n clonedMeasure.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(measure.timeSignature);\n clonedMeasure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(measure.tempo);\n return clonedMeasure;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the default pitch\n * for a clef (appears on 3rd line)\n */\n static get defaultPitchForClef() {\n return {\n 'treble': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'bass': {\n letter: 'd',\n accidental: 'n',\n octave: 3\n },\n 'tenor': {\n letter: 'a',\n accidental: 'n',\n octave: 3\n },\n 'alto': {\n letter: 'c',\n accidental: 'n',\n octave: 4\n },\n 'soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'percussion': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'mezzo-soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'baritone-c': {\n letter: 'b',\n accidental: 'n',\n octave: 3\n },\n 'baritone-f': {\n letter: 'e',\n accidental: 'n',\n octave: 3\n },\n 'subbass': {\n letter: 'd',\n accidental: '',\n octave: 2\n },\n 'french': {\n letter: 'b',\n accidental: '',\n octave: 4\n } // no idea\n };\n }\n static set emptyMeasureNoteType(tt) {\n SmoMeasure._emptyMeasureNoteType = tt;\n }\n static get emptyMeasureNoteType() {\n return SmoMeasure._emptyMeasureNoteType;\n }\n static timeSignatureNotes(timeSignature, clef) {\n const pitch = SmoMeasure.defaultPitchForClef[clef];\n const maxTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(timeSignature.timeSignature);\n const noteTick = 8192 / (timeSignature.beatDuration / 2);\n let ticks = 0;\n const pnotes = [];\n while (ticks < maxTicks) {\n const nextNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n nextNote.pitches = [JSON.parse(JSON.stringify(pitch))];\n nextNote.noteType = 'r';\n nextNote.clef = clef;\n nextNote.ticks.numerator = noteTick;\n nextNote.stemTicks = noteTick;\n pnotes.push(new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(nextNote));\n ticks += noteTick;\n }\n if (timeSignature.beatDuration === 8 && (timeSignature.actualBeats % 3 === 0 || timeSignature.actualBeats % 2 !== 0)) {\n let ix = 0;\n pnotes.forEach((pnote) => {\n if ((ix + 1) % 3 === 0) {\n pnote.endBeam = true;\n }\n pnote.beamBeats = 2048 * 3;\n ix += 1;\n });\n }\n return pnotes;\n }\n /**\n * Get a measure full of default notes for a given timeSignature/clef.\n * returns 8th notes for triple-time meters, etc.\n * @param params\n * @returns\n */\n static getDefaultNotes(params) {\n return SmoMeasure.timeSignatureNotes(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature), params.clef);\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n * This version returns params with no notes, for callers that want to use their own notes.\n * If you want the default notes, see {@link getDefaultMeasureWithNotes}\n *\n * @param params\n * @returns\n */\n static getDefaultMeasure(params) {\n const obj = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, SmoMeasure.defaults, obj);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, params, obj);\n // Don't copy column-formatting options to new measure in new column\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.formattingOptions, SmoMeasure.defaults, obj);\n obj.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature);\n // The measure expects to get concert KS in constructor and adjust for instrument. So do the\n // opposite.\n obj.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(obj.keySignature, -1 * obj.transposeIndex);\n // Don't redisplay tempo for a new measure\n const rv = new SmoMeasure(obj);\n if (rv.tempo && rv.tempo.display) {\n rv.tempo.display = false;\n }\n return rv;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n *\n * @param params\n * @returns\n */\n static getDefaultMeasureWithNotes(params) {\n var measure = SmoMeasure.getDefaultMeasure(params);\n measure.voices.push({\n notes: SmoMeasure.getDefaultNotes(params)\n });\n // fix a bug.\n // new measures only have 1 voice, make sure active voice is 0\n measure.activeVoice = 0;\n return measure;\n }\n /**\n * used by xml export\n * @internal\n * @param val\n */\n getForceSystemBreak() {\n return this.format.systemBreak;\n }\n // @internal\n setDefaultBarlines() {\n if (!this.getStartBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n if (!this.getEndBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n }\n get containsSound() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n let j = 0;\n const voice = this.voices[i];\n for (j = 0; j < this.voices.length; ++j) {\n if (voice.notes[j].noteType === 'n') {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * The rendered width of the measure, or estimate of same\n */\n get staffWidth() {\n return this.svg.staffWidth;\n }\n /**\n * set the rendered width of the measure, or estimate of same\n */\n setWidth(width, description) {\n if (_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.flagSet(_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.values.measureHistory)) {\n this.svg.history.push('setWidth ' + this.staffWidth + '=> ' + width + ' ' + description);\n }\n if (isNaN(width)) {\n throw ('NAN in setWidth');\n }\n this.svg.staffWidth = width;\n }\n /**\n * Get rendered or estimated start x\n */\n get staffX() {\n return this.svg.staffX;\n }\n /**\n * Set rendered or estimated start x\n */\n setX(x, description) {\n if (isNaN(x)) {\n throw ('NAN in setX');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffX', x, description);\n this.svg.staffX = Math.round(x);\n }\n /**\n * A time signature has possibly changed. add/remove notes to\n * match the new length\n */\n alignNotesWithTimeSignature() {\n const tsTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n if (tsTicks === this.getMaxTicksVoice()) {\n return;\n }\n const replaceNoteWithDuration = (target, ar, note) => {\n const fitNote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n const duration = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.closestDurationTickLtEq(target);\n if (duration > 128) {\n fitNote.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n fitNote.stemTicks = duration;\n fitNote.pitches = note.pitches;\n fitNote.noteType = note.noteType;\n fitNote.clef = note.clef;\n ar.push(fitNote);\n }\n };\n const voices = [];\n const tuplets = [];\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n const newNotes = [];\n let voiceTicks = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n // if a tuplet, make sure the whole tuplet fits.\n if (note.isTuplet) {\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.getTupletTreeForNoteIndex(this.tupletTrees, i, j);\n if (tupletTree) {\n // remaining notes of an approved tuplet, just add them\n if (tupletTree.startIndex !== j) {\n newNotes.push(note);\n continue;\n }\n else if (tupletTree.totalTicks + voiceTicks <= tsTicks) {\n // first note of the tuplet, it fits, add it\n voiceTicks += tupletTree.totalTicks;\n newNotes.push(note);\n }\n else {\n // tuplet will not fit. Replace tuplet with a note as close to remainder as possible and add it\n // remove tuplet\n note.tupletId = null;\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.removeTupletForNoteIndex(this, i, j);\n break;\n }\n }\n else { // missing tuplet, now what?\n console.warn('missing tuplet info');\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n }\n }\n else {\n if (note.tickCount + voiceTicks <= tsTicks) {\n newNotes.push(note);\n voiceTicks += note.tickCount;\n }\n else {\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n break;\n }\n }\n }\n if (tsTicks - voiceTicks > 128) {\n const np = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n np.clef = this.clef;\n const nnote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(np);\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, nnote);\n }\n voices.push({ notes: newNotes });\n }\n this.voices = voices;\n }\n get measureNumberDbg() {\n return `${this.measureNumber.measureIndex}/${this.measureNumber.systemIndex}/${this.measureNumber.staffId}`;\n }\n /**\n * Get rendered or estimated start y\n */\n get staffY() {\n return this.svg.staffY;\n }\n /**\n * Set rendered or estimated start y\n */\n setY(y, description) {\n if (isNaN(y)) {\n throw ('NAN in setY');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffY', y, description);\n this.svg.staffY = Math.round(y);\n }\n /**\n * Return actual or estimated highest point in score\n */\n get yTop() {\n return this.svg.yTop;\n }\n /**\n * return the lowest y (highest value) in this measure svg\n *\n * @readonly\n */\n get lowestY() {\n if (this.svg.tabStaveBox) {\n return this.svg.tabStaveBox.y + this.svg.tabStaveBox.height;\n }\n else {\n return this.svg.logicalBox.y + this.svg.logicalBox.height;\n }\n }\n /**\n * adjust the y for the render boxes to account for the page and margins\n */\n adjustY(yOffset) {\n this.svg.logicalBox.y += yOffset;\n if (this.svg.tabStaveBox) {\n this.svg.tabStaveBox.y += yOffset;\n }\n }\n /**\n * WHen setting an instrument, offset the pitches to match the instrument key\n * @param offset\n * @param newClef\n */\n transposeToOffset(offset, targetKey, newClef) {\n const diff = offset - this.transposeIndex;\n newClef = newClef !== null && newClef !== void 0 ? newClef : this.clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n const pitches = [...Array(note.pitches.length).keys()];\n // when the note is a rest, preserve the rest but match the new clef.\n if (newClef !== this.clef && note.noteType === 'r') {\n // @ts-ignore\n const defp = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[newClef]));\n note.pitches = [defp];\n }\n else {\n note.transpose(pitches, diff, this.keySignature, targetKey);\n note.getGraceNotes().forEach((gn) => {\n const gpitch = [...Array(gn.pitches.length).keys()];\n const xpose = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.transpose(gn, gpitch, diff, this.keySignature, targetKey);\n gn.pitches = xpose.pitches;\n });\n }\n });\n });\n }\n /**\n * Return actual or estimated highest point in score\n */\n setYTop(y, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'yTop', y, description);\n this.svg.yTop = y;\n }\n /**\n * Return actual or estimated bounding box\n */\n setBox(box, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'logicalBox', box, description);\n this.svg.logicalBox = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.smoBox(box);\n }\n /**\n * @returns the DOM identifier for this measure when rendered\n */\n getClassId() {\n return 'mm-' + this.measureNumber.staffId + '-' + this.measureNumber.measureIndex;\n }\n /**\n *\n * @param id\n * @returns\n */\n getRenderedNote(id) {\n let j = 0;\n let i = 0;\n for (j = 0; j < this.voices.length; ++j) {\n const voice = this.voices[j];\n for (i = 0; i < voice.notes.length; ++i) {\n const note = voice.notes[i];\n if (note.renderId === id) {\n return {\n smoNote: note,\n voice: j,\n tick: i\n };\n }\n }\n }\n return null;\n }\n getNotes() {\n return this.voices[this.activeVoice].notes;\n }\n getActiveVoice() {\n return this.activeVoice;\n }\n setActiveVoice(vix) {\n if (vix >= 0 && vix < this.voices.length) {\n this.activeVoice = vix;\n }\n }\n tickmapForVoice(voiceIx) {\n return new _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__.TickMap(this, voiceIx);\n }\n // ### createMeasureTickmaps\n // A tickmap is a map of notes to ticks for the measure. It is speciifc per-voice\n // since each voice may have different numbers of ticks. The accidental map is\n // overall since accidentals in one voice apply to accidentals in the other\n // voices. So we return the tickmaps and the overall accidental map.\n createMeasureTickmaps() {\n let i = 0;\n const tickmapArray = [];\n const accidentalMap = {};\n for (i = 0; i < this.voices.length; ++i) {\n tickmapArray.push(this.tickmapForVoice(i));\n }\n for (i = 0; i < this.voices.length; ++i) {\n const tickmap = tickmapArray[i];\n const durationKeys = Object.keys((tickmap.durationAccidentalMap));\n durationKeys.forEach((durationKey) => {\n if (!accidentalMap[durationKey]) {\n accidentalMap[durationKey] = tickmap.durationAccidentalMap[durationKey];\n }\n else {\n const amap = accidentalMap[durationKey];\n const tickable = tickmap.durationAccidentalMap[durationKey];\n const letterKeys = Object.keys(tickable);\n letterKeys.forEach((pitchKey) => {\n if (!amap[pitchKey]) {\n amap[pitchKey] = tickmap.durationAccidentalMap[durationKey][pitchKey];\n }\n });\n }\n });\n }\n // duration: duration, pitches: Record<PitchLetter,TickAccidental>\n const accidentalArray = [];\n Object.keys(accidentalMap).forEach((durationKey) => {\n accidentalArray.push({ duration: durationKey, pitches: accidentalMap[durationKey] });\n });\n return {\n tickmaps: tickmapArray,\n accidentalMap,\n accidentalArray\n };\n }\n // ### createRestNoteWithDuration\n // pad some duration of music with rests.\n static createRestNoteWithDuration(duration, clef) {\n const pitch = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[clef]));\n const note = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n note.pitches = [pitch];\n note.noteType = 'r';\n note.hidden = true;\n note.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n return note;\n }\n /**\n * Count the number of ticks in each voice and return max\n * @returns\n */\n getMaxTicksVoice() {\n let i = 0;\n let max = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voiceTicks = this.getTicksFromVoice(i);\n max = Math.max(voiceTicks, max);\n }\n return max;\n }\n /**\n * Count the number of ticks in a specific voice\n * @param voiceIndex\n * @returns\n */\n getTicksFromVoice(voiceIndex) {\n let ticks = 0;\n this.voices[voiceIndex].notes.forEach((note) => {\n ticks += note.tickCount;\n });\n return ticks;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getNotePositionInTicks(voiceIndex, tickIndex) {\n let rv = 0;\n for (let i = 0; i < tickIndex; i++) {\n const note = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getTickCountForNote(voiceIndex, note) {\n let rv = 0;\n for (let i = 0; i < this.voices[voiceIndex].notes.length; i++) {\n const currentNote = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n getClosestIndexFromTickCount(voiceIndex, tickCount) {\n let i = 0;\n let rv = 0;\n for (i = 0; i < this.voices[voiceIndex].notes.length; ++i) {\n const note = this.voices[voiceIndex].notes[i];\n if (note.tickCount + rv >= tickCount) {\n return i;\n }\n rv += note.tickCount;\n }\n return i;\n }\n isPickup() {\n const ticks = this.getTicksFromVoice(0);\n const goal = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n return (ticks < goal);\n }\n clearBeamGroups() {\n this.beamGroups = [];\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setLyricFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricFont(fontInfo);\n });\n });\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricAdjustWidth(adjustNoteWidth);\n });\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordAdjustWidth(adjustNoteWidth);\n });\n });\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setChordFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordFont(fontInfo);\n });\n });\n }\n tupletNotes(smoTuplet) {\n let tupletNotes = [];\n for (let i = smoTuplet.startIndex; i <= smoTuplet.endIndex; i++) {\n const note = this.voices[smoTuplet.voice].notes[i];\n tupletNotes.push(note);\n }\n return tupletNotes;\n }\n getStemDirectionForTuplet(smoTuplet) {\n let note = null;\n for (let currentNote of this.tupletNotes(smoTuplet)) {\n if (currentNote.noteType === 'n') {\n note = currentNote;\n break;\n }\n }\n if (!note) {\n return _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n if (note.flagState !== _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.auto) {\n return note.flagState;\n }\n return _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToLedgerLine(this.clef, note.pitches[0])\n >= 2 ? _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.up : _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n getNoteById(id) {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.attrs.id === id) {\n return note;\n }\n }\n }\n return null;\n }\n setClef(clef) {\n const oldClef = this.clef;\n this.clef = clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.clef = clef;\n });\n });\n }\n /**\n * Get the clef that this measure ends with.\n * @returns\n */\n getLastClef() {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.clefNote && note.clefNote.clef !== this.clef) {\n return note.clefNote.clef;\n }\n }\n }\n return this.clef;\n }\n isRest() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n if (!voice.notes[j].isRest()) {\n return false;\n }\n }\n }\n return true;\n }\n // ### populateVoice\n // Create a new voice in this measure, and populate it with the default note\n // for this measure/key/clef\n populateVoice(index) {\n if (index !== this.voices.length) {\n return;\n }\n this.voices.push({ notes: SmoMeasure.getDefaultNotes(this) });\n this.activeVoice = index;\n }\n _removeSingletonModifier(name) {\n const ar = this.modifiers.filter(obj => obj.attrs.type !== name);\n this.modifiers = ar;\n }\n addRehearsalMark(parameters) {\n this._removeSingletonModifier('SmoRehearsalMark');\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRehearsalMark(parameters));\n }\n removeRehearsalMark() {\n this._removeSingletonModifier('SmoRehearsalMark');\n }\n getRehearsalMark() {\n return this.modifiers.find(obj => obj.attrs.type === 'SmoRehearsalMark');\n }\n getModifiersByType(type) {\n return this.modifiers.filter((mm) => type === mm.attrs.type);\n }\n setTempo(params) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params);\n }\n /**\n * Set measure tempo to the default {@link SmoTempoText}\n */\n resetTempo() {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n getTempo() {\n if (typeof (this.tempo) === 'undefined') {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return this.tempo;\n }\n /**\n * Measure text is deprecated, and may not be supported in the future.\n * Better to use SmoTextGroup and attach to the measure.\n * @param mod\n * @returns\n */\n addMeasureText(mod) {\n var exist = this.modifiers.filter((mm) => mm.attrs.id === mod.attrs.id);\n if (exist.length) {\n return;\n }\n this.modifiers.push(mod);\n }\n getMeasureText() {\n return this.modifiers.filter(obj => obj.ctor === 'SmoMeasureText');\n }\n removeMeasureText(id) {\n var ar = this.modifiers.filter(obj => obj.attrs.id !== id);\n this.modifiers = ar;\n }\n setRepeatSymbol(rs) {\n const ar = [];\n let toAdd = true;\n const exSymbol = this.getRepeatSymbol();\n if (exSymbol && exSymbol.symbol === rs.symbol) {\n toAdd = false;\n }\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n if (toAdd) {\n ar.push(rs);\n }\n }\n getRepeatSymbol() {\n const rv = this.modifiers.filter(obj => obj.ctor === 'SmoRepeatSymbol');\n if (rv.length > 0) {\n return rv[0];\n }\n return null;\n }\n clearRepeatSymbols() {\n const ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n }\n setBarline(barline) {\n var ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline') {\n const o = modifier;\n if (o.position !== barline.position) {\n ar.push(o);\n }\n }\n else {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n ar.push(barline);\n }\n _getBarline(pos) {\n let rv = null;\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline' && modifier.position === pos) {\n rv = modifier;\n }\n });\n if (rv === null) {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.defaults);\n }\n return rv;\n }\n getEndBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end);\n }\n getStartBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start);\n }\n addNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoVolta' || modifier.startBar !== ending.startBar ||\n modifier.endBar !== ending.endBar) {\n mods.push(modifier);\n }\n });\n mods.push(ending);\n this.modifiers = mods;\n }\n removeNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n const volta = modifier;\n if (ending.startSelector === null || ending.endSelector === null || volta.startSelector === null || volta.endSelector === null) {\n return;\n }\n if (!_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.startSelector, volta.startSelector) || !_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.endSelector, volta.endSelector)\n && ending.number !== volta.number) {\n mods.push(modifier);\n }\n }\n else {\n mods.push(modifier);\n }\n });\n this.modifiers = mods;\n }\n getNthEndings() {\n const rv = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n rv.push(modifier);\n }\n });\n return rv;\n }\n setKeySignature(sig) {\n this.keySignature = sig;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.keySignature = sig;\n });\n });\n }\n setMeasureNumber(num) {\n this.measureNumber = num;\n }\n getBeamGroupForNote(note) {\n let i = 0;\n let j = 0;\n for (i = 0; i < this.beamGroups.length; ++i) {\n const bg = this.beamGroups[i];\n for (j = 0; j < bg.notes.length; ++j) {\n if (bg.notes[j].attrs.id === note.attrs.id) {\n return bg;\n }\n }\n }\n return null;\n }\n}\nSmoMeasure.defaultDupleDuration = 4096;\nSmoMeasure.defaultTripleDuration = 2048 * 3;\n// @internal\nSmoMeasure._defaults = {\n timeSignature: SmoMeasure.timeSignatureDefault,\n keySignature: 'C',\n tupletTrees: [],\n transposeIndex: 0,\n modifiers: [],\n // bars: [1, 1], // follows enumeration in VF.Barline\n measureNumber: {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n },\n clef: 'treble',\n lines: 5,\n voices: [],\n format: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults),\n activeVoice: 0,\n tempo: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults),\n repeatSymbol: false,\n repeatCount: 0\n};\nSmoMeasure._emptyMeasureNoteType = 'r';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMzQyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBdjJDTSwrQkFBb0IsR0FBVyxJQUFJLENBQUM7QUFDcEMsZ0NBQXFCLEdBQVcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNoRCxZQUFZO0FBQ0ksb0JBQVMsR0FBcUI7SUFDNUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxvQkFBb0I7SUFDOUMsWUFBWSxFQUFFLEdBQUc7SUFDakIsV0FBVyxFQUFFLEVBQUU7SUFDZixjQUFjLEVBQUUsQ0FBQztJQUNqQixTQUFTLEVBQUUsRUFBRTtJQUNiLHFEQUFxRDtJQUNyRCxhQUFhLEVBQUU7UUFDYixVQUFVLEVBQUUsQ0FBQztRQUNiLFdBQVcsRUFBRSxDQUFDO1FBQ2QsWUFBWSxFQUFFLENBQUM7UUFDZixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQztJQUNSLE1BQU0sRUFBRSxFQUFFO0lBQ1YsTUFBTSxFQUFFLElBQUksK0RBQWdCLENBQUMsK0RBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3ZELFdBQVcsRUFBRSxDQUFDO0lBQ2QsS0FBSyxFQUFFLElBQUksMkRBQVksQ0FBQywyREFBWSxDQUFDLFFBQVEsQ0FBQztJQUM5QyxZQUFZLEVBQUUsS0FBSztJQUNuQixXQUFXLEVBQUUsQ0FBQztDQUNmO0FBNmdCTSxnQ0FBcUIsR0FBYSxHQUFHLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvc21vL2RhdGEvbWVhc3VyZS50cz9mOWNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQ29udGFpbnMgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydGluZyBjbGFzc2VzIGZvciB7QGxpbmsgU21vTWVhc3VyZX0uXHJcbiAqIE1vc3Qgb2YgdGhlIGVuZ3JhdmluZyBpcyBkb25lIGF0IHRoZSBtZWFzdXJlIGxldmVsLiAgTWVhc3VyZSBjb250YWlucyBtdWx0aXBsZSAoYXQgbGVhc3QgMSlcclxuICogdm9pY2VzLCB3aGljaCBpbiB0dXJuIGNvbnRhaW4gbm90ZXMuICBFYWNoIG1lYXN1cmUgYWxzbyBjb250YWlucyBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLiAgVGhpc1xyXG4gKiBpcyBtb3N0bHkgc2VyaWFsaXplZCBvdXRzaWRlIG9mIG1lYXN1cmUgKGluIHNjb3JlKSwgc2luY2UgY29sdW1ucyBhbmQgb2Z0ZW4gYW4gZW50aXJlIHJlZ2lvblxyXG4gKiBzaGFyZSBtZWFzdXJlIGZvcm1hdHRpbmcuICBNZWFzdXJlcyBhbHNvIGNvbnRhaW4gbW9kaWZpZXJzIGxpa2UgYmFybGluZXMuICBUdXBsZXRzIGFuZCBiZWFtIGdyb3Vwc1xyXG4gKiBhcmUgY29udGFpbmVkIGF0IHRoZSBtZWFzdXJlIGxldmVsLlxyXG4gKiBAbW9kdWxlIC9zbW8vZGF0YS9tZWFzdXJlXHJcbiAqL1xyXG5pbXBvcnQgeyBzbW9TZXJpYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vc2VyaWFsaXphdGlvbkhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4vbXVzaWMnO1xyXG5pbXBvcnQge1xyXG4gIFNtb0JhcmxpbmUsIFNtb01lYXN1cmVNb2RpZmllckJhc2UsIFNtb1JlcGVhdFN5bWJvbCwgU21vVGVtcG9UZXh0LCBTbW9NZWFzdXJlRm9ybWF0LFxyXG4gIFNtb1ZvbHRhLCBTbW9SZWhlYXJzYWxNYXJrUGFyYW1zLCBTbW9SZWhlYXJzYWxNYXJrLCBTbW9UZW1wb1RleHRQYXJhbXMsIFRpbWVTaWduYXR1cmUsXHJcbiAgVGltZVNpZ25hdHVyZVBhcmFtZXRlcnNTZXIsIFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXIsIFNtb1RlbXBvVGV4dFBhcmFtc1NlclxyXG59IGZyb20gJy4vbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb05vdGUsIE5vdGVUeXBlLCBTbW9Ob3RlUGFyYW1zU2VyIH0gZnJvbSAnLi9ub3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0LCBTbW9UdXBsZXRQYXJhbXNTZXIsIFNtb1R1cGxldFBhcmFtcywgU21vVHVwbGV0VHJlZVBhcmFtc1NlciwgU21vVHVwbGV0VHJlZSB9IGZyb20gJy4vdHVwbGV0JztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL2xheW91dERlYnVnJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IFRpY2tNYXAgfSBmcm9tICcuLi94Zm9ybS90aWNrTWFwJztcclxuaW1wb3J0IHsgTWVhc3VyZU51bWJlciwgU3ZnQm94LCBTbW9BdHRycywgUGl0Y2gsIFBpdGNoTGV0dGVyLCBDbGVmLCBcclxuICBUaWNrQWNjaWRlbnRhbCwgQWNjaWRlbnRhbEFycmF5LCBnZXRJZCB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgU21vU2VsZWN0b3IgfSBmcm9tICcuLi94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuaW1wb3J0IHsgU21vVGFiU3RhdmUgfSBmcm9tICcuL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vRnJldFBvc2l0aW9uIH0gZnJvbSAnLi9ub3RlTW9kaWZpZXJzJztcclxuLyoqXHJcbiAqIFZvaWNlIGlzIGp1c3QgYSBjb250YWluZXIgZm9yIHtAbGluayBTbW9Ob3RlfVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1ZvaWNlIHtcclxuICBub3RlczogU21vTm90ZVtdXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1ZvaWNlU2VyIHtcclxuICBub3RlczogU21vTm90ZVBhcmFtc1NlcltdXHJcbn1cclxuLyoqXHJcbiAqIFRpY2tNYXBwYWJsZSBicmVha3MgdXAgYSBjaXJjdWxhciBkZXBlbmRlbmN5IG9uIG1vZGlmaWVyc1xyXG4gKiBsaWtlIEBTbW9EdXJhdGlvblxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tNYXBwYWJsZSB7XHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVtdLFxyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVhc3VyZVRpY2sge1xyXG4gIHZvaWNlSW5kZXg6IG51bWJlcixcclxuICB0aWNrSW5kZXg6IG51bWJlclxyXG59XHJcblxyXG4vKipcclxuICogQnJlYWsgdXAgYSBjaXJjbGFyIGRlcGVuZGVuY3kgd2l0aCB7QGxpbmsgU21vQmVhbUdyb3VwfVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTbW9CZWFtR3JvdXAge1xyXG4gIG5vdGVzOiBTbW9Ob3RlW10sXHJcbiAgdm9pY2U6IG51bWJlcixcclxuICBhdHRyczogU21vQXR0cnNcclxufVxyXG4vKipcclxuICogZ2VvbWV0cnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWVhc3VyZSBmb3IgcmVuZGVyaW5nIGFuZFxyXG4gKiBzY29yZSBsYXlvdXQuXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlU3ZnIHtcclxuICBzdGFmZldpZHRoOiBudW1iZXIsXHJcbiAgdW5qdXN0aWZpZWRXaWR0aDogbnVtYmVyLFxyXG4gIGFkalg6IG51bWJlciwgLy8gVGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBtdXNpYyBpbiB0aGUgc3RhdmUgKGFmdGVyIHRpbWUgc2lnLCBldGMpXHJcbiAgbWF4Q29sdW1uU3RhcnRYOiBudW1iZXIsXHJcbiAgc3RhZmZYOiBudW1iZXIsIC8vIFRoZSBsZWZ0LW1vc3QgeCBwb3NpdGlvbiBvZiB0aGUgc3RhZmZcclxuICBzdGFmZlk6IG51bWJlcixcclxuICBsb2dpY2FsQm94OiBTdmdCb3gsXHJcbiAgeVRvcDogbnVtYmVyLFxyXG4gIGFkalJpZ2h0OiBudW1iZXIsXHJcbiAgaGlzdG9yeTogc3RyaW5nW10sXHJcbiAgbGluZUluZGV4OiBudW1iZXIsXHJcbiAgcGFnZUluZGV4OiBudW1iZXIsXHJcbiAgcm93SW5TeXN0ZW06IG51bWJlcixcclxuICBmb3JjZUNsZWY6IGJvb2xlYW4sXHJcbiAgZm9yY2VLZXlTaWduYXR1cmU6IGJvb2xlYW4sXHJcbiAgZm9yY2VUaW1lU2lnbmF0dXJlOiBib29sZWFuLFxyXG4gIGZvcmNlVGVtcG86IGJvb2xlYW4sXHJcbiAgaGlkZUVtcHR5TWVhc3VyZTogYm9vbGVhbixcclxuICBoaWRlTXVsdGltZWFzdXJlOiBib29sZWFuLFxyXG4gIG11bHRpbWVhc3VyZUxlbmd0aDogbnVtYmVyLFxyXG4gIG11bHRpbWVhc3VyZUVuZEJhcmxpbmU6IG51bWJlcixcclxuICBlbGVtZW50OiBTVkdTVkdFbGVtZW50IHwgbnVsbCxcclxuICB0YWJTdGF2ZUJveD86IFN2Z0JveCxcclxuICB0YWJFbGVtZW50PzogU1ZHU1ZHRWxlbWVudFxyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBhICB7QGxpbmsgVGlja01hcH0gZm9yIGVhY2ggdm9pY2VcclxuICogZm9yIGZvcm1hdHRpbmdcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVGlja21hcHMge1xyXG4gIHRpY2ttYXBzOiBUaWNrTWFwW10sXHJcbiAgYWNjaWRlbnRhbE1hcDogUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgVGlja0FjY2lkZW50YWw+PixcclxuICBhY2NpZGVudGFsQXJyYXk6IEFjY2lkZW50YWxBcnJheVtdXHJcbn1cclxuLyoqXHJcbiAqIENvbHVtbi1tYXBwZWQgbW9kaWZpZXJzLCBtYW5hZ2VkIGJ5IHRoZSB7QGxpbmsgU21vU2NvcmV9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAvLyBbJ3RpbWVTaWduYXR1cmUnLCAna2V5U2lnbmF0dXJlJywgJ3RlbXBvJ11cclxuICB0aW1lU2lnbmF0dXJlOiBhbnksXHJcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmcsXHJcbiAgdGVtcG86IGFueVxyXG59XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgdHlwZSBTbW9NZWFzdXJlTnVtYmVyUGFyYW0gPSAndHJhbnNwb3NlSW5kZXgnIHwgJ2FjdGl2ZVZvaWNlJyB8ICdsaW5lcycgfCAncmVwZWF0Q291bnQnO1xyXG4vLyBAaW50ZXJuYWxcclxuZXhwb3J0IGNvbnN0IFNtb01lYXN1cmVOdW1iZXJQYXJhbXM6IFNtb01lYXN1cmVOdW1iZXJQYXJhbVtdID0gWyd0cmFuc3Bvc2VJbmRleCcsICdhY3RpdmVWb2ljZScsICdsaW5lcycsICdyZXBlYXRDb3VudCddO1xyXG4vLyBAaW50ZXJuYWxcclxuZXhwb3J0IHR5cGUgU21vTWVhc3VyZVN0cmluZ1BhcmFtID0gJ2tleVNpZ25hdHVyZSc7XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgY29uc3QgU21vTWVhc3VyZVN0cmluZ1BhcmFtczogU21vTWVhc3VyZVN0cmluZ1BhcmFtW10gPSBbJ2tleVNpZ25hdHVyZSddO1xyXG4vKipcclxuICogY29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3IgYSB7QGxpbmsgU21vTWVhc3VyZX0uICBVc3VhbGx5IHlvdSB3aWxsIGNhbGxcclxuICoge0BsaW5rIFNtb01lYXN1cmUuZGVmYXVsdHN9LCBhbmQgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkIHRvIGNoYW5nZS5cclxuICpcclxuICogQHBhcmFtIHRpbWVTaWduYXR1cmVcclxuICogQHBhcmFtIGtleVNpZ25hdHVyZVxyXG4gKiBAcGFyYW0gdHVwbGV0c1xyXG4gKiBAcGFyYW0gdHJhbnNwb3NlSW5kZXggY2FsY3VsYXRlZCBmcm9tIHtAbGluayBTbW9QYXJ0SW5mb30gZm9yIG5vbi1jb25jZXJ0LWtleSBpbnN0cnVtZW50c1xyXG4gKiBAcGFyYW0gbGluZXMgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdGF2ZVxyXG4gKiBAcGFyYW0gc3RhZmZZIFkgY29vcmRpbmF0ZSAoVUwgY29ybmVyKSBvZiB0aGUgbWVhc3VyZSBzdGF2ZVxyXG4gKiBAcGFyYW0gbWVhc3VyZU51bWJlciBjb21iaW5hdGlvbiBjb25maWd1cmVkL2NhbGN1bGF0ZWQgbWVhc3VyZSBudW1iZXJcclxuICogQHBhcmFtIGNsZWZcclxuICogQHBhcmFtIHZvaWNlc1xyXG4gKiBAcGFyYW0gYWN0aXZlVm9pY2UgdGhlIGFjdGl2ZSB2b2ljZSBpbiB0aGUgZWRpdG9yXHJcbiAqIEBwYXJhbSB0ZW1wb1xyXG4gKiBAcGFyYW0gZm9ybWF0IG1lYXN1cmUgZm9ybWF0LCBpcyBtYW5hZ2VkIGJ5IHRoZSBzY29yZVxyXG4gKiBAcGFyYW0gbW9kaWZpZXJzIEFsbCBtZWFzdXJlIG1vZGlmaWVycyB0aGF0NSBhcmVuJ3QgZm9ybWF0LCB0aW1lU2lnbmF0dXJlIG9yIHRlbXBvXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTWVhc3VyZVBhcmFtcyB7XHJcbiAgdGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSxcclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyxcclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVtdLFxyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIsXHJcbiAgbGluZXM6IG51bWJlcixcclxuICAvLyBiYXJzOiBbMSwgMV0sIC8vIGZvbGxvd3MgZW51bWVyYXRpb24gaW4gVkYuQmFybGluZVxyXG4gIG1lYXN1cmVOdW1iZXI6IE1lYXN1cmVOdW1iZXIsXHJcbiAgY2xlZjogQ2xlZixcclxuICB2b2ljZXM6IFNtb1ZvaWNlW10sXHJcbiAgYWN0aXZlVm9pY2U6IG51bWJlcixcclxuICB0ZW1wbzogU21vVGVtcG9UZXh0LFxyXG4gIGZvcm1hdDogU21vTWVhc3VyZUZvcm1hdCB8IG51bGwsXHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10sXHJcbiAgcmVwZWF0U3ltYm9sOiBib29sZWFuLFxyXG4gIHJlcGVhdENvdW50OiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBzZXJpYWxpemVhYmxlIGJpdHMgb2YgU21vTWVhc3VyZS4gIFNvbWUgcGFyYW1ldGVycyBhcmUgXHJcbiAqIG1hcHBlZCBieSB0aGUgc3RhdmUgaWYgdGhlIGRvbid0IGNoYW5nZSBldmVyeSBtZWFzdXJlLCBlLmcuXHJcbiAqIHRpbWUgc2lnbmF0dXJlLlxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NZWFzdXJlUGFyYW1zU2VyIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBhIGxpc3Qgb2YgdHVwbGV0cyAoc2VyaWFsaXplZClcclxuICAgKi9cclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zcG9zZSB0aGUgbm90ZXMgdXAvZG93bi4gIFRPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkXHJcbiAgICogYXMgaXRzIHBhcnQgb2YgdGhlIGluc3RydW1lbnQgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogbGluZXMgaW4gdGhlIHN0YWZmIChlLmcuIHBlcmN1c3Npb24pXHJcbiAgICovXHJcbiAgbGluZXM6IG51bWJlcixcclxuICAvKipcclxuICAgKiBtZWFzdXJlIG51bWJlciwgYWJzb2x1dGUgYW5kIHJlbGF0aXZlL3JlbWFwcGVkXHJcbiAgICovXHJcbiAgbWVhc3VyZU51bWJlcjogTWVhc3VyZU51bWJlcixcclxuICAvKipcclxuICAgKiBzdGFydCBjbGVmXHJcbiAgICovXHJcbiAgY2xlZjogQ2xlZixcclxuICAvKipcclxuICAgKiB2b2ljZXMgY29udGFpbiBub3Rlc1xyXG4gICAqL1xyXG4gIHZvaWNlczogU21vVm9pY2VTZXJbXSxcclxuICAvKipcclxuICAgKiBhbGwgb3RoZXIgbW9kaWZpZXJzIChiYXJsaW5lcywgZXRjKVxyXG4gICAqL1xyXG4gIG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdLFxyXG4gIC8vIHRoZSBuZXh0IDMgYXJlIG5vdCBzZXJpYWxpemVkIGFzIHBhcnQgb2YgdGhlIG1lYXN1cmUgaW4gbW9zdCBjYXNlcywgc2luY2UgdGhleSBhcmVcclxuICAvLyBtYXBwZWQgdG8gc3BlY2lmaWMgbWVhc3VyZXMgaW4gdGhlIHNjb3JlL3N5c3RlbVxyXG4gIC8qKlxyXG4gICAqIGtleSBzaWduYXR1cmVcclxuICAgKi9cclxuICBrZXlTaWduYXR1cmU/OiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgKiB0aW1lIHNpZ25hdHVyZSBzZXJpYWxpemF0aW9uXHJcbiAgKi9cclxuICB0aW1lU2lnbmF0dXJlPzogVGltZVNpZ25hdHVyZVBhcmFtZXRlcnNTZXIsXHJcbiAgLyoqXHJcbiAgICogdGVtcG8gYXQgdGhpcyBwb2ludFxyXG4gICAqL1xyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHRQYXJhbXNTZXJcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPbmx5IGFycmF5cyBhbmQgbWVhc3VyZSBudW1iZXJzIGFyZSBzZXJpbGlhbGl6ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy5cclxuICogQHBhcmFtIHBhcmFtcyAtIHJlc3VsdCBvZiBzZXJpYWxpemF0aW9uXHJcbiAqIEByZXR1cm5zIFxyXG4gKi9cclxuZnVuY3Rpb24gaXNTbW9NZWFzdXJlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9NZWFzdXJlUGFyYW1zU2VyPik6cGFyYW1zIGlzIFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudm9pY2VzKSB8fCBcclxuICAgICAgIUFycmF5LmlzQXJyYXkocGFyYW1zLnR1cGxldFRyZWVzKSB8fCAhQXJyYXkuaXNBcnJheShwYXJhbXMubW9kaWZpZXJzKSB8fFxyXG4gICAgICB0eXBlb2YocGFyYW1zPy5tZWFzdXJlTnVtYmVyPy5tZWFzdXJlSW5kZXgpICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIERhdGEgZm9yIGEgbWVhc3VyZSBvZiBtdXNpYy4gIE1hbnkgcnVsZXMgb2YgbXVzaWNhbCBlbmdyYXZpbmcgYXJlXHJcbiAqIGVuZm9yY2VkIGF0IGEgbWVhc3VyZSBsZXZlbDogdGhlIGR1cmF0aW9uIG9mIG5vdGVzLCBhY2NpZGVudGFscywgZXRjLlxyXG4gKiBcclxuICogTWVhc3VyZXMgY29udGFpbiB7QGxpbmsgU21vTm90ZX0sIHtAbGluayBTbW9UdXBsZXR9LCBhbmQge0BsaW5rIFNtb0JlYW1Hcm91cH1cclxuICogTWVhc3VyZXMgYXJlIGNvbnRhaW5lZCBpbiB7QGxpbmsgU21vU3lzdGVtU3RhZmZ9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9NZWFzdXJlIGltcGxlbWVudHMgU21vTWVhc3VyZVBhcmFtcywgVGlja01hcHBhYmxlIHtcclxuICBzdGF0aWMgZ2V0IHRpbWVTaWduYXR1cmVEZWZhdWx0KCk6IFRpbWVTaWduYXR1cmUge1xyXG4gICAgcmV0dXJuIG5ldyBUaW1lU2lnbmF0dXJlKFRpbWVTaWduYXR1cmUuZGVmYXVsdHMpO1xyXG4gIH1cclxuICBzdGF0aWMgZGVmYXVsdER1cGxlRHVyYXRpb246IG51bWJlciA9IDQwOTY7XHJcbiAgc3RhdGljIGRlZmF1bHRUcmlwbGVEdXJhdGlvbjogbnVtYmVyID0gMjA0OCAqIDM7XHJcbiAgLy8gQGludGVybmFsXHJcbiAgc3RhdGljIHJlYWRvbmx5IF9kZWZhdWx0czogU21vTWVhc3VyZVBhcmFtcyA9IHtcclxuICAgIHRpbWVTaWduYXR1cmU6IFNtb01lYXN1cmUudGltZVNpZ25hdHVyZURlZmF1bHQsXHJcbiAgICBrZXlTaWduYXR1cmU6ICdDJyxcclxuICAgIHR1cGxldFRyZWVzOiBbXSxcclxuICAgIHRyYW5zcG9zZUluZGV4OiAwLFxyXG4gICAgbW9kaWZpZXJzOiBbXSxcclxuICAgIC8vIGJhcnM6IFsxLCAxXSwgLy8gZm9sbG93cyBlbnVtZXJhdGlvbiBpbiBWRi5CYXJsaW5lXHJcbiAgICBtZWFzdXJlTnVtYmVyOiB7XHJcbiAgICAgIGxvY2FsSW5kZXg6IDAsXHJcbiAgICAgIHN5c3RlbUluZGV4OiAwLFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IDAsXHJcbiAgICAgIHN0YWZmSWQ6IDBcclxuICAgIH0sXHJcbiAgICBjbGVmOiAndHJlYmxlJyxcclxuICAgIGxpbmVzOiA1LFxyXG4gICAgdm9pY2VzOiBbXSxcclxuICAgIGZvcm1hdDogbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyksXHJcbiAgICBhY3RpdmVWb2ljZTogMCxcclxuICAgIHRlbXBvOiBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyksXHJcbiAgICByZXBlYXRTeW1ib2w6IGZhbHNlLFxyXG4gICAgcmVwZWF0Q291bnQ6IDAgIFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLiAgRGVmYXVsdHMgYXJlIGFsd2F5cyBjb3BpZWQgc28gdGhlXHJcbiAgICogY2FsbGVyIGNhbiBtb2RpZnkgdGhlbSB0byBjcmVhdGUgYSBuZXcgbWVhc3VyZS5cclxuICAgKiBAcmV0dXJucyBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIGEgbmV3IG1lYXN1cmVcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb01lYXN1cmVQYXJhbXMge1xyXG4gICAgY29uc3QgcHJvdG86IGFueSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoU21vTWVhc3VyZS5fZGVmYXVsdHMpKTtcclxuICAgIHByb3RvLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdHMpO1xyXG4gICAgcHJvdG8udGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgICBwcm90by5tb2RpZmllcnMucHVzaChuZXcgU21vQmFybGluZSh7XHJcbiAgICAgIHBvc2l0aW9uOiBTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCxcclxuICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgIH0pKTtcclxuICAgIHByb3RvLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZCxcclxuICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgIH0pKTtcclxuICAgIHJldHVybiBwcm90bztcclxuICB9XHJcbiAgLy8gQGlnbm9yZVxyXG4gIHN0YXRpYyBjb252ZXJ0TGVnYWN5VGltZVNpZ25hdHVyZSh0czogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBydiA9IG5ldyBUaW1lU2lnbmF0dXJlKFRpbWVTaWduYXR1cmUuZGVmYXVsdHMpO1xyXG4gICAgcnYudGltZVNpZ25hdHVyZSA9IHRzO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlID0gU21vTWVhc3VyZS50aW1lU2lnbmF0dXJlRGVmYXVsdDtcclxuICAvKipcclxuICAgKiBPdmVycmlkZXMgZGlzcGxheSBvZiBhY3R1YWwgdGltZSBzaWduYXR1cmUsIGluIHRoZSBjYXNlIG9mXHJcbiAgICogcGljay11cCBub3RlcyB3aGVyZSB0aGUgYWN0dWFsIGFuZCBkaXNwbGF5ZWQgZHVyYXRpb25zIGFyZSBkaWZmZXJlbnRcclxuICAgKi9cclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyA9ICcnO1xyXG4gIGNhbmNlbGVkS2V5U2lnbmF0dXJlOiBzdHJpbmcgPSAnJztcclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVtdID0gW107XHJcbiAgcmVwZWF0U3ltYm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVwZWF0Q291bnQ6IG51bWJlciA9IDA7XHJcbiAgY3Rvcjogc3RyaW5nPSdTbW9NZWFzdXJlJztcclxuICAvKipcclxuICAgKiBBZGp1c3QgZm9yIG5vbi1jb25jZXJ0IHBpdGNoIGludHN0cnVtZW50c1xyXG4gICAqL1xyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIgPSAwO1xyXG4gIG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogUm93LCBjb2x1bW4sIGFuZCBjdXN0b20gbnVtYmVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWVhc3VyZS5cclxuICAgKi9cclxuICBtZWFzdXJlTnVtYmVyOiBNZWFzdXJlTnVtYmVyID0ge1xyXG4gICAgbG9jYWxJbmRleDogMCxcclxuICAgIHN5c3RlbUluZGV4OiAwLFxyXG4gICAgbWVhc3VyZUluZGV4OiAwLFxyXG4gICAgc3RhZmZJZDogMFxyXG4gIH07XHJcbiAgY2xlZjogQ2xlZiA9ICd0cmVibGUnO1xyXG4gIHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIHRoZSBhY3RpdmUgdm9pY2UgaW4gdGhlIGVkaXRvciwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHZvaWNlc1xyXG4gICAqICAqL1xyXG4gIGFjdGl2ZVZvaWNlOiBudW1iZXIgPSAwO1xyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHQ7XHJcbiAgYmVhbUdyb3VwczogSVNtb0JlYW1Hcm91cFtdID0gW107XHJcbiAgbGluZXM6IG51bWJlciA9IDU7XHJcbiAgLyoqXHJcbiAgICogUnVudGltZSBpbmZvcm1hdGlvbiBhYm91dCByZW5kZXJpbmdcclxuICAgKi9cclxuICBzdmc6IE1lYXN1cmVTdmc7XHJcbiAgLyoqXHJcbiAgICogTWVhc3VyZS1zcGVjaWZpYyBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuXHJcbiAgICovXHJcbiAgZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0O1xyXG4gIC8qKlxyXG4gICAqIEluZm9ybWF0aW9uIGZvciBpZGVudGlmeWluZyB0aGlzIG9iamVjdFxyXG4gICAqL1xyXG4gIGlkOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbGwgaW4gY29tcG9uZW50cy4gIFdlIGFzc3VtZSB0aGUgbW9kaWZpZXJzIGFyZSBhbHJlYWR5IGNvbnN0cnVjdGVkLFxyXG4gICAqIGUuZy4gYnkgZGVzZXJpYWxpemUgb3IgdGhlIGNhbGxpbmcgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcykge1xyXG4gICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIHRoaXMuc3ZnID0ge1xyXG4gICAgICBzdGFmZldpZHRoOiAwLFxyXG4gICAgICB1bmp1c3RpZmllZFdpZHRoOiAwLFxyXG4gICAgICBzdGFmZlg6IDAsXHJcbiAgICAgIHN0YWZmWTogMCxcclxuICAgICAgbG9naWNhbEJveDoge1xyXG4gICAgICAgIHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDBcclxuICAgICAgfSxcclxuICAgICAgeVRvcDogMCxcclxuICAgICAgYWRqWDogMCxcclxuICAgICAgbWF4Q29sdW1uU3RhcnRYOiAwLFxyXG4gICAgICBhZGpSaWdodDogMCxcclxuICAgICAgaGlzdG9yeTogW10sXHJcbiAgICAgIGxpbmVJbmRleDogMCxcclxuICAgICAgcGFnZUluZGV4OiAwLFxyXG4gICAgICByb3dJblN5c3RlbTogMCxcclxuICAgICAgZm9yY2VDbGVmOiBmYWxzZSxcclxuICAgICAgZm9yY2VLZXlTaWduYXR1cmU6IGZhbHNlLFxyXG4gICAgICBmb3JjZVRpbWVTaWduYXR1cmU6IGZhbHNlLFxyXG4gICAgICBmb3JjZVRlbXBvOiBmYWxzZSxcclxuICAgICAgaGlkZUVtcHR5TWVhc3VyZTogZmFsc2UsXHJcbiAgICAgIGhpZGVNdWx0aW1lYXN1cmU6IGZhbHNlLFxyXG4gICAgICBtdWx0aW1lYXN1cmVMZW5ndGg6IDAsXHJcbiAgICAgIG11bHRpbWVhc3VyZUVuZEJhcmxpbmU6IFNtb0JhcmxpbmUuYmFybGluZXNbJ3NpbmdsZUJhciddLFxyXG4gICAgICBlbGVtZW50OiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRzID0gU21vTWVhc3VyZS5kZWZhdWx0cztcclxuICAgIFNtb01lYXN1cmVOdW1iZXJQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiAocGFyYW1zW3BhcmFtXSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFNtb01lYXN1cmVTdHJpbmdQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgdGhpc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dID8gcGFyYW1zW3BhcmFtXSA6IGRlZmF1bHRzW3BhcmFtXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jbGVmID0gcGFyYW1zLmNsZWY7XHJcbiAgICB0aGlzLnJlcGVhdFN5bWJvbCA9IHBhcmFtcy5yZXBlYXRTeW1ib2w7XHJcbiAgICB0aGlzLm1lYXN1cmVOdW1iZXIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcy5tZWFzdXJlTnVtYmVyKSk7XHJcbiAgICBpZiAocGFyYW1zLnRlbXBvKSB7XHJcbiAgICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHBhcmFtcy50ZW1wbyk7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgbGVnYWN5IHRpbWUgc2lnbmF0dXJlIGZvcm1hdFxyXG4gICAgaWYgKHBhcmFtcy50aW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGNvbnN0IHRzQW55ID0gcGFyYW1zLnRpbWVTaWduYXR1cmUgYXMgYW55O1xyXG4gICAgICBpZiAodHlwZW9mICh0c0FueSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy50aW1lU2lnbmF0dXJlID0gU21vTWVhc3VyZS5jb252ZXJ0TGVnYWN5VGltZVNpZ25hdHVyZSh0c0FueSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50aW1lU2lnbmF0dXJlID0gVGltZVNpZ25hdHVyZS5jcmVhdGVGcm9tUGFydGlhbCh0c0FueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudm9pY2VzID0gcGFyYW1zLnZvaWNlcyA/IHBhcmFtcy52b2ljZXMgOiBbXTtcclxuICAgIHRoaXMudHVwbGV0VHJlZXMgPSBwYXJhbXMudHVwbGV0VHJlZXMgPyBwYXJhbXMudHVwbGV0VHJlZXMgOiBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gcGFyYW1zLm1vZGlmaWVycyA/IHBhcmFtcy5tb2RpZmllcnMgOiBkZWZhdWx0cy5tb2RpZmllcnM7XHJcbiAgICB0aGlzLnNldERlZmF1bHRCYXJsaW5lcygpO1xyXG4gICAgdGhpcy5rZXlTaWduYXR1cmUgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KHRoaXMua2V5U2lnbmF0dXJlLCB0aGlzLnRyYW5zcG9zZUluZGV4KTtcclxuXHJcbiAgICBpZiAoIShwYXJhbXMuZm9ybWF0KSkge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdHMpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5tZWFzdXJlSW5kZXggPSB0aGlzLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBuZXcgU21vTWVhc3VyZUZvcm1hdChwYXJhbXMuZm9ybWF0KTtcclxuICAgIH1cclxuICAgIHRoaXMuaWQgPSBnZXRJZCgpLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUNsZWZDaGFuZ2VOb3RlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQGludGVybmFsXHJcbiAgLy8gdXNlZCBmb3Igc2VyaWFsaXphdGlvblxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdEF0dHJpYnV0ZXMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAna2V5U2lnbmF0dXJlJywgXHJcbiAgICAgICdtZWFzdXJlTnVtYmVyJyxcclxuICAgICAgJ2FjdGl2ZVZvaWNlJywgJ2NsZWYnLCAndHJhbnNwb3NlSW5kZXgnLFxyXG4gICAgICAnZm9ybWF0JywgJ3JpZ2h0TWFyZ2luJywgJ2xpbmVzJywgJ3JlcGVhdFN5bWJvbCcsICdyZXBlYXRDb3VudCdcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBmb3JtYXR0aW5nT3B0aW9ucygpIHtcclxuICAgIHJldHVybiBbJ2N1c3RvbVN0cmV0Y2gnLCAnY3VzdG9tUHJvcG9ydGlvbicsICdhdXRvSnVzdGlmeScsICdzeXN0ZW1CcmVhaycsXHJcbiAgICAgICdwYWdlQnJlYWsnLCAncGFkTGVmdCddO1xyXG4gIH1cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBjb2x1bW5NYXBwZWRBdHRyaWJ1dGVzKCkge1xyXG4gICAgcmV0dXJuIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBzZXJpYWxpemFibGVBdHRyaWJ1dGVzKCkge1xyXG4gICAgY29uc3QgcnY6IGFueSA9IFtdO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcy5mb3JFYWNoKChhdHRyKSA9PiB7XHJcbiAgICAgIGlmIChTbW9NZWFzdXJlLmNvbHVtbk1hcHBlZEF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyKSA8IDAgJiYgYXR0ciAhPT0gJ2Zvcm1hdCcpIHtcclxuICAgICAgICBydi5wdXNoKGF0dHIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRpbWUgc2lnbmF0dXJlcyBhcmUgdGhlIHNhbWUsIGZvciBkaXNwbGF5IHB1cnBvc2VzIChlLmcuIGlmIGEgdGltZSBzaWcgY2hhbmdlXHJcbiAgLy8gaXMgcmVxdWlyZWQpXHJcbiAgKi9cclxuICBzdGF0aWMgdGltZVNpZ0VxdWFsKG8xOiBUaW1lU2lnbmF0dXJlLCBvMjogVGltZVNpZ25hdHVyZSkge1xyXG4gICAgcmV0dXJuIG8xLnRpbWVTaWduYXR1cmUgPT09IG8yLnRpbWVTaWduYXR1cmUgJiYgbzEudXNlU3ltYm9sID09PSBvMi51c2VTeW1ib2w7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIElmIHRoZXJlIGlzIGEgY2xlZiBjaGFuZ2UgbWlkLW1lYXN1cmUsIHVwZGF0ZSB0aGUgYWN0dWFsIGNsZWZzIG9mIHRoZSBub3Rlc1xyXG4gICAqIHNvIHRoZXkgZGlzcGxheSBjb3JyZWN0bHkuXHJcbiAgICovXHJcbiAgdXBkYXRlQ2xlZkNoYW5nZU5vdGVzKCkge1xyXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGxldCBjdXJUaWNrID0gMDtcclxuICAgIGxldCBjbGVmQ2hhbmdlID0gdGhpcy5jbGVmO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBjdXJUaWNrICA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgc21vTm90ZS5jbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgICAgIGlmIChzbW9Ob3RlLmNsZWZOb3RlICYmIHNtb05vdGUuY2xlZk5vdGUuY2xlZiAhPT0gdGhpcy5jbGVmKSB7XHJcbiAgICAgICAgICBjbGVmQ2hhbmdlID0gc21vTm90ZS5jbGVmTm90ZS5jbGVmO1xyXG4gICAgICAgICAgY3VyVGljayArPSBzbW9Ob3RlLnRpY2tDb3VudDtcclxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1clRpY2sgICs9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghY2hhbmdlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjbGVmQ2hhbmdlVGljayBpcyB3aGVyZSB0aGUgY2hhbmdlIGdvZXMuICBXZSBvbmx5IHN1cHBvcnRcclxuICAgIC8vIG9uZSBwZXIgbWVhc3VyZSwgb3RoZXJzIGFyZSBpZ25vcmVkLlxyXG4gICAgY29uc3QgY2xlZkNoYW5nZVRpY2sgPSBjdXJUaWNrO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgY3VyVGljayAgPSAwO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgc21vTm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGNvbnN0IG5vdGVUaWNrcyA9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICAgIGlmIChjdXJUaWNrICsgbm90ZVRpY2tzID49IGNsZWZDaGFuZ2VUaWNrKSB7XHJcbiAgICAgICAgICBzbW9Ob3RlLmNsZWYgPSBjbGVmQ2hhbmdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgYW55IHJlZHVuZGFudCBjbGVmIGNoYW5nZXMgbGF0ZXIgaW4gdGhlIG1lYXN1cmVcclxuICAgICAgICBpZiAoY3VyVGljayArIG5vdGVUaWNrcyA+IGNsZWZDaGFuZ2VUaWNrKSB7XHJcbiAgICAgICAgICBpZiAoc21vTm90ZS5jbGVmTm90ZSAmJiBzbW9Ob3RlLmNsZWZOb3RlLmNsZWYgPT09IGNsZWZDaGFuZ2UpIHtcclxuICAgICAgICAgICAgc21vTm90ZS5jbGVmTm90ZSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1clRpY2sgKz0gbm90ZVRpY2tzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqIEByZXR1cm5zIGNvbHVtbiBtYXBwZWQgcGFyYW1ldGVycywgc2VyaWFsaXplZC4gIGNhbGxlciB3aWxsXHJcbiAgICogZGVjaWRlIGlmIHRoZSBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgcGVyc2lzdGVkXHJcbiAgICovXHJcbiAgc2VyaWFsaXplQ29sdW1uTWFwcGVkKCk6IENvbHVtbk1hcHBlZFBhcmFtcyB7XHJcbiAgICAvL1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGltZVNpZ25hdHVyZTogdGhpcy50aW1lU2lnbmF0dXJlLnNlcmlhbGl6ZSgpLFxyXG4gICAgICBrZXlTaWduYXR1cmU6IHRoaXMua2V5U2lnbmF0dXJlLFxyXG4gICAgICB0ZW1wbzogdGhpcy50ZW1wby5zZXJpYWxpemUoKVxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0Q29sdW1uTWFwcGVkKCk6IENvbHVtbk1hcHBlZFBhcmFtcyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlOiB0aGlzLnRpbWVTaWduYXR1cmUsXHJcbiAgICAgIGtleVNpZ25hdHVyZTogdGhpcy5rZXlTaWduYXR1cmUsXHJcbiAgICAgIHRlbXBvOiB0aGlzLnRlbXBvXHJcbiAgICB9O1xyXG4gIH0gIFxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgdGhpcyBtZWFzdXJlIG9iamVjdCB0byBhIEpTT04gb2JqZWN0LCByZWN1cnNpdmVseSBzZXJpYWxpemluZyBhbGwgdGhlIG5vdGVzLFxyXG4gICAqIG5vdGUgbW9kaWZpZXJzLCBldGMuXHJcbiAgICovXHJcbiAgc2VyaWFsaXplKCk6IFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcGFyYW1zOiBQYXJ0aWFsPFNtb01lYXN1cmVQYXJhbXNTZXI+ID0geyBcImN0b3JcIjogXCJTbW9NZWFzdXJlXCIgfTtcclxuICAgIGxldCBzZXIgPSB0cnVlO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vTWVhc3VyZS5kZWZhdWx0cywgU21vTWVhc3VyZS5zZXJpYWxpemFibGVBdHRyaWJ1dGVzLCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgLy8gRG9uJ3Qgc2VyaWFsaXplIGRlZmF1bHQgdGhpbmdzXHJcbiAgICBjb25zdCBmbXQgPSB0aGlzLmZvcm1hdC5zZXJpYWxpemUoKTtcclxuICAgIC8vIG1lYXN1cmUgbnVtYmVyIGNhbid0IGJlIGRlZmF1bHRlZCBiL2MgdGVtcG9zIGV0Yy4gY2FuIG1hcCB0byBkZWZhdWx0IG1lYXN1cmVcclxuICAgIHBhcmFtcy5tZWFzdXJlTnVtYmVyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1lYXN1cmVOdW1iZXIpKTtcclxuICAgIHBhcmFtcy50dXBsZXRUcmVlcyA9IFtdO1xyXG4gICAgcGFyYW1zLnZvaWNlcyA9IFtdO1xyXG4gICAgcGFyYW1zLm1vZGlmaWVycyA9IFtdO1xyXG5cclxuICAgIHRoaXMudHVwbGV0VHJlZXMuZm9yRWFjaCgodHVwbGV0VHJlZSkgPT4ge1xyXG4gICAgICBwYXJhbXMudHVwbGV0VHJlZXMhLnB1c2godHVwbGV0VHJlZS5zZXJpYWxpemUoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICBjb25zdCBvYmo6IGFueSA9IHtcclxuXHJcbiAgICAgICAgbm90ZXM6IFtdXHJcbiAgICAgIH07XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBvYmoubm90ZXMucHVzaChub3RlLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBhcmFtcy52b2ljZXMhLnB1c2gob2JqKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIHNlciA9IHRydWU7XHJcbiAgICAgIC8qIGRvbid0IHNlcmlhbGl6ZSBkZWZhdWx0IG1vZGlmaWVycyAqL1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5wb3NpdGlvbiA9PT0gU21vQmFybGluZS5wb3NpdGlvbnMuc3RhcnQgJiZcclxuICAgICAgICAobW9kaWZpZXIgYXMgU21vQmFybGluZSkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBTbW9CYXJsaW5lLnBvc2l0aW9ucy5lbmRcclxuICAgICAgICAmJiAobW9kaWZpZXIgYXMgU21vQmFybGluZSkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vVGVtcG9UZXh0Jykge1xyXG4gICAgICAgIC8vIHdlIGRvbid0IHNhdmUgdGVtcG8gdGV4dCBhcyBhIG1vZGlmaWVyIGFueW1vcmVcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmICgobW9kaWZpZXIgYXMgU21vUmVwZWF0U3ltYm9sKS5jdG9yID09PSAnU21vUmVwZWF0U3ltYm9sJyAmJiAobW9kaWZpZXIgYXMgU21vUmVwZWF0U3ltYm9sKS5wb3NpdGlvbiA9PT0gU21vUmVwZWF0U3ltYm9sLnBvc2l0aW9ucy5zdGFydFxyXG4gICAgICAgICYmIChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHMuTm9uZSkge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZXIpIHtcclxuICAgICAgICBwYXJhbXMubW9kaWZpZXJzIS5wdXNoKG1vZGlmaWVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBbJ3RpbWVTaWduYXR1cmUnLCAna2V5U2lnbmF0dXJlJywgJ3RlbXBvJ11cclxuICAgIGlmICghaXNTbW9NZWFzdXJlUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2ludmFsaWQgbWVhc3VyZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiByZXN0b3JlIGEgc2VyaWFsaXplZCBtZWFzdXJlIG9iamVjdC4gIFVzdWFsbHkgY2FsbGVkIGFzIHBhcnQgb2YgZGVzZXJpYWxpemluZyBhIHNjb3JlLFxyXG4gICAqIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlc3RvcmUgYSBtZWFzdXJlIGR1ZSB0byBhbiB1bmRvIG9wZXJhdGlvbi4gIFJlY3Vyc2l2ZWx5XHJcbiAgICogZGVzZXJpYWxpemUgYWxsIHRoZSBub3RlcyBhbmQgbW9kaWZpZXJzIHRvIGNvbnN0cnVjdCBhIG5ldyBtZWFzdXJlLlxyXG4gICAqIEBwYXJhbSBqc29uT2JqIHRoZSBzZXJpYWxpemVkIFNtb01lYXN1cmVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uT2JqOiBTbW9NZWFzdXJlUGFyYW1zU2VyKTogU21vTWVhc3VyZSB7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCB2b2ljZXM6IFNtb1ZvaWNlW10gPSBbXTtcclxuICAgIGZvciAoaiA9IDA7IGogPCBqc29uT2JqLnZvaWNlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IGpzb25PYmoudm9pY2VzW2pdO1xyXG4gICAgICBjb25zdCBub3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICAgIHZvaWNlcy5wdXNoKHtcclxuICAgICAgICBub3Rlc1xyXG4gICAgICB9KTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZVBhcmFtcyA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICAgIGNvbnN0IHNtb05vdGUgPSBTbW9Ob3RlLmRlc2VyaWFsaXplKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgIG5vdGVzLnB1c2goc21vTm90ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb2RpZmllcnM6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAganNvbk9iai5tb2RpZmllcnMuZm9yRWFjaCgobW9kUGFyYW1zOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbW9kaWZpZXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UgPSBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKG1vZFBhcmFtcyk7XHJcbiAgICAgIG1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zID0gU21vTWVhc3VyZS5kZWZhdWx0cztcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywganNvbk9iaiwgcGFyYW1zKTtcclxuXHJcbiAgICAvLyBleHBsb2RlIGNvbHVtbi1tYXBwZWRcclxuICAgIGlmIChqc29uT2JqLnRlbXBvKSB7XHJcbiAgICAgIHBhcmFtcy50ZW1wbyA9IFNtb1RlbXBvVGV4dC5kZXNlcmlhbGl6ZShqc29uT2JqLnRlbXBvKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aW1lU2lnbmF0dXJlU3RyaW5nIGlzIG5vdyBwYXJ0IG9mIHRpbWVTaWduYXR1cmUuICB1cGNvbnZlcnQgb2xkIHNjb3Jlc1xyXG4gICAgbGV0IHRpbWVTaWduYXR1cmVTdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IGpzb25MZWdhY3kgPSAoanNvbk9iaiBhcyBhbnkpO1xyXG4gICAgaWYgKHR5cGVvZihqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmcpID09PSAnc3RyaW5nJyAmJiBqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmcubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlU3RyaW5nID0ganNvbkxlZ2FjeS50aW1lU2lnbmF0dXJlU3RyaW5nO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb25PYmoudGltZVNpZ25hdHVyZSkge1xyXG4gICAgICBpZiAodGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGgpIHtcclxuICAgICAgICBqc29uT2JqLnRpbWVTaWduYXR1cmUuZGlzcGxheVN0cmluZyA9IHRpbWVTaWduYXR1cmVTdHJpbmc7ICBcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMudGltZVNpZ25hdHVyZSA9IFRpbWVTaWduYXR1cmUuZGVzZXJpYWxpemUoanNvbk9iai50aW1lU2lnbmF0dXJlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRwYXJhbXMgPSBUaW1lU2lnbmF0dXJlLmRlZmF1bHRzO1xyXG4gICAgICBpZiAodGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGgpIHtcclxuICAgICAgICB0cGFyYW1zLmRpc3BsYXlTdHJpbmcgPSB0aW1lU2lnbmF0dXJlU3RyaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcmFtcy50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUodHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMua2V5U2lnbmF0dXJlID0ganNvbk9iai5rZXlTaWduYXR1cmUgPz8gJ0MnO1xyXG4gICAgcGFyYW1zLnZvaWNlcyA9IHZvaWNlcztcclxuXHJcbiAgICBpZiAoKGpzb25PYmogYXMgYW55KS50dXBsZXRUcmVlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBqc29uT2JqLnR1cGxldFRyZWVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZUpzb24gPSBqc29uT2JqLnR1cGxldFRyZWVzW2pdO1xyXG4gICAgICAgIGNvbnN0IHR1cGxldFRyZWUgPSBTbW9UdXBsZXRUcmVlLmRlc2VyaWFsaXplKHR1cGxldFRyZWVKc29uKTtcclxuICAgICAgICBwYXJhbXMudHVwbGV0VHJlZXMucHVzaCh0dXBsZXRUcmVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9kZXNlcmlhbGl6YXRpb24gb2YgYSBsZWdhY3kgdHVwbGV0c1xyXG4gICAgLy9sZWdhY3kgc2NoZW1hIGhhZCBtZWFzdXJlLnR1cGxldHMsIGl0IGlzIG1lYXN1cmUudHVwbGV0VHJlZXMgbm93XHJcbiAgICBpZiAoKGpzb25PYmogYXMgYW55KS50dXBsZXRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IChqc29uT2JqIGFzIGFueSkudHVwbGV0cy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IHR1cEpzb24gPSAoanNvbk9iaiBhcyBhbnkpLnR1cGxldHNbal07XHJcblxyXG4gICAgICAgIC8vIExlZ2FjeSBzY2hlbWEgaGFkIGF0dHJzLmlkLCBub3cgaXQgaXMganVzdCBpZFxyXG4gICAgICAgIGlmICgodHVwSnNvbiBhcyBhbnkpLmF0dHJzICYmICh0dXBKc29uIGFzIGFueSkuYXR0cnMuaWQpIHtcclxuICAgICAgICAgIHR1cEpzb24uaWQgPSAodHVwSnNvbiBhcyBhbnkpLmF0dHJzLmlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdHVwbGV0Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgICAgIGxldCBzdGFydEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBwYXJhbXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGlpdHksIHNvbWUgc2NvcmVzIGRvbid0IGhhdmUgYXR0cnMgb24gdHVwbGV0XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YodHVwSnNvbi5pZCkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgdHVwSnNvbi5hdHRycyA9IHsgdHlwZTogJ1Ntb1R1cGxldCcsIGlkOiB0dXBKc29uLmlkIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaWQgPSB0dXBKc29uLmF0dHJzLmlkO1xyXG4gICAgICAgICAgICBpZiAobm90ZS5pc1R1cGxldCAmJiBub3RlLnR1cGxldElkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgIHR1cGxldE5vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgICAgLy93ZSBjYW5ub3QgdHJ1c3Qgc3RhcnRJbmRleCBjb21pbmcgZnJvbSBsZWdhY3kganNvblxyXG4gICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBjb3VudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm90ZSBpbiB0aGUgdHVwbGV0XHJcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBCdWcgZml4OiAgQSB0dXBsZXQgd2l0aCBubyBub3RlcyBtYXkgYmUgYmVlbiBvdmVyd3JpdHRlblxyXG4gICAgICAgIC8vIGluIGEgY29weS9wYXN0ZSBvcGVyYXRpb25cclxuICAgICAgICBpZiAodHVwbGV0Tm90ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdHVwSnNvbi5ub3RlcyA9IHR1cGxldE5vdGVzO1xyXG4gICAgICAgICAgdHVwSnNvbi5zdGFydEluZGV4ID0gc3RhcnRJbmRleDtcclxuICAgICAgICAgIHR1cEpzb24uZW5kSW5kZXggPSB0dXBKc29uLnN0YXJ0SW5kZXggKyB0dXBsZXROb3Rlcy5sZW5ndGggLSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdHVwbGV0OiBTbW9UdXBsZXQgPSBTbW9UdXBsZXQuZGVzZXJpYWxpemUodHVwSnNvbik7XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZTogU21vVHVwbGV0VHJlZSA9IG5ldyBTbW9UdXBsZXRUcmVlKHt0dXBsZXQ6IHR1cGxldH0pO1xyXG4gICAgICAgIHBhcmFtcy50dXBsZXRUcmVlcy5wdXNoKHR1cGxldFRyZWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocGFyYW1zLnR1cGxldFRyZWVzLmxlbmd0aCkge1xyXG4gICAgICBTbW9UdXBsZXRUcmVlLnN5bmNUdXBsZXRJZHMocGFyYW1zLnR1cGxldFRyZWVzLCB2b2ljZXMpXHJcbiAgICB9XHJcblxyXG4gICAgcGFyYW1zLm1vZGlmaWVycyA9IG1vZGlmaWVycztcclxuICAgIGNvbnN0IG1lYXN1cmUgPSBuZXcgU21vTWVhc3VyZShwYXJhbXMpO1xyXG4gICAgLy8gSGFuZGxlIG1pZ3JhdGlvbiBmb3IgbWVhc3VyZS1tYXBwZWQgcGFyYW1ldGVyc1xyXG4gICAgbWVhc3VyZS5tb2RpZmllcnMuZm9yRWFjaCgobW9kKSA9PiB7XHJcbiAgICAgIGlmIChtb2QuY3RvciA9PT0gJ1Ntb1RlbXBvVGV4dCcpIHtcclxuICAgICAgICBtZWFzdXJlLnRlbXBvID0gKG1vZCBhcyBTbW9UZW1wb1RleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICghbWVhc3VyZS50ZW1wbykge1xyXG4gICAgICBtZWFzdXJlLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2xvbmUobWVhc3VyZTogU21vTWVhc3VyZSk6IFNtb01lYXN1cmUge1xyXG4gICAgcmV0dXJuIFNtb01lYXN1cmUuZGVzZXJpYWxpemUobWVhc3VyZS5zZXJpYWxpemUoKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBjbG9uZUZvclBhc3RlT3JVbmRvKG1lYXN1cmU6IFNtb01lYXN1cmUpIHtcclxuICAgIGNvbnN0IGNsb25lZE1lYXN1cmUgPSBTbW9NZWFzdXJlLmNsb25lKG1lYXN1cmUpO1xyXG4gICAgY2xvbmVkTWVhc3VyZS5zdmcgPSBtZWFzdXJlLnN2ZztcclxuICAgIC8vIE9yZGluYXJpbHksIHRoZSBrZXkvdGVtcG8vdGltZSBpcyBtYXBwZWQgdG8gdGhlIHN0YXZlLCBidXQgc2luY2Ugd2UgYXJlIHBhc3RpbmcgbWVhc3VyZS1ieVxyXG4gICAgLy8gbWVhc3VyZSBoZXJlLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0LlxyXG4gICAgY2xvbmVkTWVhc3VyZS5rZXlTaWduYXR1cmUgPSBtZWFzdXJlLmtleVNpZ25hdHVyZTtcclxuICAgIGNsb25lZE1lYXN1cmUudGltZVNpZ25hdHVyZSA9IG5ldyBUaW1lU2lnbmF0dXJlKG1lYXN1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICBjbG9uZWRNZWFzdXJlLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChtZWFzdXJlLnRlbXBvKTtcclxuICAgIHJldHVybiBjbG9uZWRNZWFzdXJlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHBpdGNoXHJcbiAgICogZm9yIGEgY2xlZiAoYXBwZWFycyBvbiAzcmQgbGluZSlcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQaXRjaEZvckNsZWYoKTogUmVjb3JkPENsZWYsIFBpdGNoPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAndHJlYmxlJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ2Jhc3MnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnZCcsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAndGVub3InOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYScsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAnYWx0byc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdjJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdzb3ByYW5vJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ3BlcmN1c3Npb24nOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAnbWV6em8tc29wcmFubyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdiYXJpdG9uZS1jJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDNcclxuICAgICAgfSxcclxuICAgICAgJ2Jhcml0b25lLWYnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnZScsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAnc3ViYmFzcyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdkJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnJyxcclxuICAgICAgICBvY3RhdmU6IDJcclxuICAgICAgfSxcclxuICAgICAgJ2ZyZW5jaCc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSAvLyBubyBpZGVhXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgX2VtcHR5TWVhc3VyZU5vdGVUeXBlOiBOb3RlVHlwZSA9ICdyJztcclxuICBzdGF0aWMgc2V0IGVtcHR5TWVhc3VyZU5vdGVUeXBlKHR0OiBOb3RlVHlwZSkge1xyXG4gICAgU21vTWVhc3VyZS5fZW1wdHlNZWFzdXJlTm90ZVR5cGUgPSB0dDtcclxuICB9XHJcbiAgc3RhdGljIGdldCBlbXB0eU1lYXN1cmVOb3RlVHlwZSgpOiBOb3RlVHlwZSB7XHJcbiAgICByZXR1cm4gU21vTWVhc3VyZS5fZW1wdHlNZWFzdXJlTm90ZVR5cGU7XHJcbiAgfVxyXG4gIHN0YXRpYyB0aW1lU2lnbmF0dXJlTm90ZXModGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSwgY2xlZjogQ2xlZikge1xyXG4gICAgY29uc3QgcGl0Y2ggPSBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbY2xlZl07XHJcbiAgICBjb25zdCBtYXhUaWNrcyA9IFNtb011c2ljLnRpbWVTaWduYXR1cmVUb1RpY2tzKHRpbWVTaWduYXR1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICBjb25zdCBub3RlVGljayA9IDgxOTIgLyAodGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24gLyAyKTtcclxuICAgIGxldCB0aWNrcyA9IDA7XHJcbiAgICBjb25zdCBwbm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgd2hpbGUgKHRpY2tzIDwgbWF4VGlja3MpIHtcclxuICAgICAgY29uc3QgbmV4dE5vdGUgPSBTbW9Ob3RlLmRlZmF1bHRzO1xyXG4gICAgICBuZXh0Tm90ZS5waXRjaGVzID0gW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGl0Y2gpKV07XHJcbiAgICAgIG5leHROb3RlLm5vdGVUeXBlID0gJ3InO1xyXG4gICAgICBuZXh0Tm90ZS5jbGVmID0gY2xlZjtcclxuICAgICAgbmV4dE5vdGUudGlja3MubnVtZXJhdG9yID0gbm90ZVRpY2s7XHJcbiAgICAgIG5leHROb3RlLnN0ZW1UaWNrcyA9IG5vdGVUaWNrO1xyXG4gICAgICBwbm90ZXMucHVzaChuZXcgU21vTm90ZShuZXh0Tm90ZSkpO1xyXG4gICAgICB0aWNrcyArPSBub3RlVGljaztcclxuICAgIH1cclxuICAgIGlmICh0aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbiA9PT0gOCAmJiAodGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyAlIDMgPT09IDAgfHwgdGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyAlIDIgIT09IDApKSB7XHJcbiAgICAgIGxldCBpeCA9IDA7XHJcbiAgICAgIHBub3Rlcy5mb3JFYWNoKChwbm90ZSkgPT4ge1xyXG4gICAgICAgIGlmICgoaXggKyAxKSAlIDMgPT09IDApIHtcclxuICAgICAgICAgIHBub3RlLmVuZEJlYW0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwbm90ZS5iZWFtQmVhdHMgPSAyMDQ4ICogMztcclxuICAgICAgICBpeCArPSAxO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwbm90ZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCBhIG1lYXN1cmUgZnVsbCBvZiBkZWZhdWx0IG5vdGVzIGZvciBhIGdpdmVuIHRpbWVTaWduYXR1cmUvY2xlZi5cclxuICAgKiByZXR1cm5zIDh0aCBub3RlcyBmb3IgdHJpcGxlLXRpbWUgbWV0ZXJzLCBldGMuXHJcbiAgICogQHBhcmFtIHBhcmFtcyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0RGVmYXVsdE5vdGVzKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcyk6IFNtb05vdGVbXSB7XHJcbiAgICByZXR1cm4gU21vTWVhc3VyZS50aW1lU2lnbmF0dXJlTm90ZXMobmV3IFRpbWVTaWduYXR1cmUocGFyYW1zLnRpbWVTaWduYXR1cmUpLCBwYXJhbXMuY2xlZik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IG1lYXN1cmUsIHRoZSAnZGVmYXVsdCcgc2V0dGluZ3MgY2FuIHZhcnkgZGVwZW5kaW5nIG9uXHJcbiAgICogd2hhdCBjb21lcyBiZWZvcmUvYWZ0ZXIgdGhlIG1lYXN1cmUuICBUaGlzIGRldGVybWluZXMgdGhlIGRlZmF1bHRzIGZyb20gdGhlXHJcbiAgICogcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgaW4sIHdoaWNoIGNvdWxkIGJlIGFub3RoZXIgbWVhc3VyZSBpbiB0aGUgc2NvcmUuXHJcbiAgICogVGhpcyB2ZXJzaW9uIHJldHVybnMgcGFyYW1zIHdpdGggbm8gbm90ZXMsIGZvciBjYWxsZXJzIHRoYXQgd2FudCB0byB1c2UgdGhlaXIgb3duIG5vdGVzLlxyXG4gICAqIElmIHlvdSB3YW50IHRoZSBkZWZhdWx0IG5vdGVzLCBzZWUge0BsaW5rIGdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzfVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYXJhbXNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0RGVmYXVsdE1lYXN1cmUocGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zKTogU21vTWVhc3VyZSB7XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLCBTbW9NZWFzdXJlLmRlZmF1bHRzLCBvYmopO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLCBwYXJhbXMsIG9iaik7XHJcbiAgICAvLyBEb24ndCBjb3B5IGNvbHVtbi1mb3JtYXR0aW5nIG9wdGlvbnMgdG8gbmV3IG1lYXN1cmUgaW4gbmV3IGNvbHVtblxyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9NZWFzdXJlLmZvcm1hdHRpbmdPcHRpb25zLCBTbW9NZWFzdXJlLmRlZmF1bHRzLCBvYmopO1xyXG4gICAgb2JqLnRpbWVTaWduYXR1cmUgPSBuZXcgVGltZVNpZ25hdHVyZShwYXJhbXMudGltZVNpZ25hdHVyZSk7XHJcbiAgICAvLyBUaGUgbWVhc3VyZSBleHBlY3RzIHRvIGdldCBjb25jZXJ0IEtTIGluIGNvbnN0cnVjdG9yIGFuZCBhZGp1c3QgZm9yIGluc3RydW1lbnQuICBTbyBkbyB0aGVcclxuICAgIC8vIG9wcG9zaXRlLlxyXG4gICAgb2JqLmtleVNpZ25hdHVyZSA9IFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQob2JqLmtleVNpZ25hdHVyZSwgLTEgKiBvYmoudHJhbnNwb3NlSW5kZXgpO1xyXG4gICAgLy8gRG9uJ3QgcmVkaXNwbGF5IHRlbXBvIGZvciBhIG5ldyBtZWFzdXJlXHJcbiAgICBjb25zdCBydiA9IG5ldyBTbW9NZWFzdXJlKG9iaik7XHJcbiAgICBpZiAocnYudGVtcG8gJiYgcnYudGVtcG8uZGlzcGxheSkge1xyXG4gICAgICBydi50ZW1wby5kaXNwbGF5ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IG1lYXN1cmUsIHRoZSAnZGVmYXVsdCcgc2V0dGluZ3MgY2FuIHZhcnkgZGVwZW5kaW5nIG9uXHJcbiAgICogd2hhdCBjb21lcyBiZWZvcmUvYWZ0ZXIgdGhlIG1lYXN1cmUuICBUaGlzIGRldGVybWluZXMgdGhlIGRlZmF1bHRzIGZyb20gdGhlXHJcbiAgICogcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgaW4sIHdoaWNoIGNvdWxkIGJlIGFub3RoZXIgbWVhc3VyZSBpbiB0aGUgc2NvcmUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBhcmFtcyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0RGVmYXVsdE1lYXN1cmVXaXRoTm90ZXMocGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zKTogU21vTWVhc3VyZSB7XHJcbiAgICB2YXIgbWVhc3VyZSA9IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE1lYXN1cmUocGFyYW1zKTtcclxuICAgIG1lYXN1cmUudm9pY2VzLnB1c2goe1xyXG4gICAgICBub3RlczogU21vTWVhc3VyZS5nZXREZWZhdWx0Tm90ZXMocGFyYW1zKVxyXG4gICAgfSk7XHJcbiAgICAvLyBmaXggYSBidWcuXHJcbiAgICAvLyBuZXcgbWVhc3VyZXMgb25seSBoYXZlIDEgdm9pY2UsIG1ha2Ugc3VyZSBhY3RpdmUgdm9pY2UgaXMgMFxyXG4gICAgbWVhc3VyZS5hY3RpdmVWb2ljZSA9IDA7XHJcbiAgICByZXR1cm4gbWVhc3VyZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdXNlZCBieSB4bWwgZXhwb3J0IFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqIEBwYXJhbSB2YWwgXHJcbiAgICovXHJcbiAgZ2V0Rm9yY2VTeXN0ZW1CcmVhaygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdC5zeXN0ZW1CcmVhaztcclxuICB9XHJcbiAgLy8gQGludGVybmFsXHJcbiAgc2V0RGVmYXVsdEJhcmxpbmVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmdldFN0YXJ0QmFybGluZSgpKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobmV3IFNtb0JhcmxpbmUoe1xyXG4gICAgICAgIHBvc2l0aW9uOiBTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCxcclxuICAgICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZ2V0RW5kQmFybGluZSgpKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobmV3IFNtb0JhcmxpbmUoe1xyXG4gICAgICAgIHBvc2l0aW9uOiBTbW9CYXJsaW5lLnBvc2l0aW9ucy5lbmQsXHJcbiAgICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRhaW5zU291bmQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgbGV0IGogPSAwO1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZiAodm9pY2Uubm90ZXNbal0ubm90ZVR5cGUgPT09ICduJykge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgbWVhc3VyZSwgb3IgZXN0aW1hdGUgb2Ygc2FtZVxyXG4gICAqL1xyXG4gIGdldCBzdGFmZldpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ZnLnN0YWZmV2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBzZXQgdGhlIHJlbmRlcmVkIHdpZHRoIG9mIHRoZSBtZWFzdXJlLCBvciBlc3RpbWF0ZSBvZiBzYW1lXHJcbiAgICovXHJcbiAgc2V0V2lkdGgod2lkdGg6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKGxheW91dERlYnVnLmZsYWdTZXQobGF5b3V0RGVidWcudmFsdWVzLm1lYXN1cmVIaXN0b3J5KSkge1xyXG4gICAgICB0aGlzLnN2Zy5oaXN0b3J5LnB1c2goJ3NldFdpZHRoICcgKyB0aGlzLnN0YWZmV2lkdGggKyAnPT4gJyArIHdpZHRoICsgJyAnICsgZGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzTmFOKHdpZHRoKSkge1xyXG4gICAgICB0aHJvdyAoJ05BTiBpbiBzZXRXaWR0aCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdmcuc3RhZmZXaWR0aCA9IHdpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHJlbmRlcmVkIG9yIGVzdGltYXRlZCBzdGFydCB4XHJcbiAgICovXHJcbiAgZ2V0IHN0YWZmWCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ZnLnN0YWZmWDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeFxyXG4gICAqL1xyXG4gIHNldFgoeDogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOYU4oeCkpIHtcclxuICAgICAgdGhyb3cgKCdOQU4gaW4gc2V0WCcpO1xyXG4gICAgfVxyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ3N0YWZmWCcsIHgsIGRlc2NyaXB0aW9uKTtcclxuICAgIHRoaXMuc3ZnLnN0YWZmWCA9IE1hdGgucm91bmQoeCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgdGltZSBzaWduYXR1cmUgaGFzIHBvc3NpYmx5IGNoYW5nZWQuICBhZGQvcmVtb3ZlIG5vdGVzIHRvXHJcbiAgICogbWF0Y2ggdGhlIG5ldyBsZW5ndGhcclxuICAgKi9cclxuICBhbGlnbk5vdGVzV2l0aFRpbWVTaWduYXR1cmUoKSB7XHJcbiAgICBjb25zdCB0c1RpY2tzID0gU21vTXVzaWMudGltZVNpZ25hdHVyZVRvVGlja3ModGhpcy50aW1lU2lnbmF0dXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgaWYgKHRzVGlja3MgPT09IHRoaXMuZ2V0TWF4VGlja3NWb2ljZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcGxhY2VOb3RlV2l0aER1cmF0aW9uID0gKHRhcmdldDogbnVtYmVyLCBhcjogU21vTm90ZVtdLCBub3RlOiBTbW9Ob3RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpdE5vdGUgPSBuZXcgU21vTm90ZShTbW9Ob3RlLmRlZmF1bHRzKTtcclxuICAgICAgY29uc3QgZHVyYXRpb24gPSBTbW9NdXNpYy5jbG9zZXN0RHVyYXRpb25UaWNrTHRFcSh0YXJnZXQpO1xyXG4gICAgICBpZiAoZHVyYXRpb24gPiAxMjgpIHtcclxuICAgICAgICBmaXROb3RlLnRpY2tzID0geyBudW1lcmF0b3I6IGR1cmF0aW9uLCBkZW5vbWluYXRvcjogMSwgcmVtYWluZGVyOiAwIH07XHJcbiAgICAgICAgZml0Tm90ZS5zdGVtVGlja3MgPSBkdXJhdGlvbjtcclxuICAgICAgICBmaXROb3RlLnBpdGNoZXMgPSBub3RlLnBpdGNoZXM7XHJcbiAgICAgICAgZml0Tm90ZS5ub3RlVHlwZSA9IG5vdGUubm90ZVR5cGU7XHJcbiAgICAgICAgZml0Tm90ZS5jbGVmID0gbm90ZS5jbGVmO1xyXG4gICAgICAgIGFyLnB1c2goZml0Tm90ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gICAgY29uc3QgdHVwbGV0czogU21vVHVwbGV0W10gPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgY29uc3QgbmV3Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgICBsZXQgdm9pY2VUaWNrcyA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgLy8gaWYgYSB0dXBsZXQsIG1ha2Ugc3VyZSB0aGUgd2hvbGUgdHVwbGV0IGZpdHMuXHJcbiAgICAgICAgaWYgKG5vdGUuaXNUdXBsZXQpIHtcclxuICAgICAgICAgIGNvbnN0IHR1cGxldFRyZWUgPSBTbW9UdXBsZXRUcmVlLmdldFR1cGxldFRyZWVGb3JOb3RlSW5kZXgodGhpcy50dXBsZXRUcmVlcywgaSwgaik7XHJcbiAgICAgICAgICBpZiAodHVwbGV0VHJlZSkge1xyXG4gICAgICAgICAgICAvLyByZW1haW5pbmcgbm90ZXMgb2YgYW4gYXBwcm92ZWQgdHVwbGV0LCBqdXN0IGFkZCB0aGVtXHJcbiAgICAgICAgICAgIGlmICh0dXBsZXRUcmVlLnN0YXJ0SW5kZXggIT09IGopIHtcclxuICAgICAgICAgICAgICBuZXdOb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR1cGxldFRyZWUudG90YWxUaWNrcyArIHZvaWNlVGlja3MgPD0gdHNUaWNrcykge1xyXG4gICAgICAgICAgICAgIC8vIGZpcnN0IG5vdGUgb2YgdGhlIHR1cGxldCwgaXQgZml0cywgYWRkIGl0XHJcbiAgICAgICAgICAgICAgdm9pY2VUaWNrcyArPSB0dXBsZXRUcmVlLnRvdGFsVGlja3M7XHJcbiAgICAgICAgICAgICAgbmV3Tm90ZXMucHVzaChub3RlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyB0dXBsZXQgd2lsbCBub3QgZml0LiAgUmVwbGFjZSB0dXBsZXQgd2l0aCBhIG5vdGUgYXMgY2xvc2UgdG8gcmVtYWluZGVyIGFzIHBvc3NpYmxlIGFuZCBhZGQgaXRcclxuICAgICAgICAgICAgICAvLyByZW1vdmUgdHVwbGV0XHJcbiAgICAgICAgICAgICAgbm90ZS50dXBsZXRJZCA9IG51bGxcclxuICAgICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICAgIHZvaWNlVGlja3MgPSB0c1RpY2tzO1xyXG4gICAgICAgICAgICAgIFNtb1R1cGxldFRyZWUucmVtb3ZlVHVwbGV0Rm9yTm90ZUluZGV4KHRoaXMsIGksIGopO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgeyAvLyBtaXNzaW5nIHR1cGxldCwgbm93IHdoYXQ/XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignbWlzc2luZyB0dXBsZXQgaW5mbycpO1xyXG4gICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKG5vdGUudGlja0NvdW50ICsgdm9pY2VUaWNrcyA8PSB0c1RpY2tzKSB7XHJcbiAgICAgICAgICAgIG5ld05vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgIHZvaWNlVGlja3MgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0c1RpY2tzIC0gdm9pY2VUaWNrcyA+IDEyOCkge1xyXG4gICAgICAgIGNvbnN0IG5wID0gU21vTm90ZS5kZWZhdWx0cztcclxuICAgICAgICBucC5jbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgICAgIGNvbnN0IG5ub3RlID0gbmV3IFNtb05vdGUobnApO1xyXG4gICAgICAgIHJlcGxhY2VOb3RlV2l0aER1cmF0aW9uKHRzVGlja3MgLSB2b2ljZVRpY2tzLCBuZXdOb3Rlcywgbm5vdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHZvaWNlcy5wdXNoKHsgbm90ZXM6IG5ld05vdGVzIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMgPSB2b2ljZXM7XHJcbiAgfVxyXG4gIGdldCBtZWFzdXJlTnVtYmVyRGJnKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleH0vJHt0aGlzLm1lYXN1cmVOdW1iZXIuc3lzdGVtSW5kZXh9LyR7dGhpcy5tZWFzdXJlTnVtYmVyLnN0YWZmSWR9YDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHJlbmRlcmVkIG9yIGVzdGltYXRlZCBzdGFydCB5XHJcbiAgICovXHJcbiAgZ2V0IHN0YWZmWSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ZnLnN0YWZmWTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeVxyXG4gICAqL1xyXG4gIHNldFkoeTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOYU4oeSkpIHtcclxuICAgICAgdGhyb3cgKCdOQU4gaW4gc2V0WScpO1xyXG4gICAgfVxyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ3N0YWZmWScsIHksIGRlc2NyaXB0aW9uKTtcclxuICAgIHRoaXMuc3ZnLnN0YWZmWSA9IE1hdGgucm91bmQoeSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBoaWdoZXN0IHBvaW50IGluIHNjb3JlXHJcbiAgICovXHJcbiAgZ2V0IHlUb3AoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy55VG9wO1xyXG4gIH1cclxuICAvKipcclxuICAgKiByZXR1cm4gdGhlIGxvd2VzdCB5IChoaWdoZXN0IHZhbHVlKSBpbiB0aGlzIG1lYXN1cmUgc3ZnXHJcbiAgICpcclxuICAgKiBAcmVhZG9ubHlcclxuICAgKi9cclxuICBnZXQgbG93ZXN0WSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3ZnLnRhYlN0YXZlQm94KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN2Zy50YWJTdGF2ZUJveC55ICsgdGhpcy5zdmcudGFiU3RhdmVCb3guaGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3ZnLmxvZ2ljYWxCb3gueSArIHRoaXMuc3ZnLmxvZ2ljYWxCb3guaGVpZ2h0O1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGp1c3QgdGhlIHkgZm9yIHRoZSByZW5kZXIgYm94ZXMgdG8gYWNjb3VudCBmb3IgdGhlIHBhZ2UgYW5kIG1hcmdpbnNcclxuICAgKi9cclxuICBhZGp1c3RZKHlPZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5zdmcubG9naWNhbEJveC55ICs9IHlPZmZzZXQ7XHJcbiAgICBpZiAodGhpcy5zdmcudGFiU3RhdmVCb3gpIHtcclxuICAgICAgdGhpcy5zdmcudGFiU3RhdmVCb3gueSArPSB5T2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBXSGVuIHNldHRpbmcgYW4gaW5zdHJ1bWVudCwgb2Zmc2V0IHRoZSBwaXRjaGVzIHRvIG1hdGNoIHRoZSBpbnN0cnVtZW50IGtleVxyXG4gICAqIEBwYXJhbSBvZmZzZXQgXHJcbiAgICogQHBhcmFtIG5ld0NsZWYgXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlVG9PZmZzZXQob2Zmc2V0OiBudW1iZXIsIHRhcmdldEtleTogc3RyaW5nLCBuZXdDbGVmPzogQ2xlZikge1xyXG4gICAgY29uc3QgZGlmZiA9IG9mZnNldCAtIHRoaXMudHJhbnNwb3NlSW5kZXg7XHJcbiAgICBuZXdDbGVmID0gbmV3Q2xlZiA/PyB0aGlzLmNsZWY7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGl0Y2hlczogbnVtYmVyW10gPSBbLi4uQXJyYXkobm90ZS5waXRjaGVzLmxlbmd0aCkua2V5cygpXTtcclxuICAgICAgICAvLyB3aGVuIHRoZSBub3RlIGlzIGEgcmVzdCwgcHJlc2VydmUgdGhlIHJlc3QgYnV0IG1hdGNoIHRoZSBuZXcgY2xlZi5cclxuICAgICAgICBpZiAobmV3Q2xlZiAhPT0gdGhpcy5jbGVmICYmIG5vdGUubm90ZVR5cGUgPT09ICdyJykge1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgY29uc3QgZGVmcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW25ld0NsZWZdKSk7XHJcbiAgICAgICAgICBub3RlLnBpdGNoZXMgPSBbZGVmcF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vdGUudHJhbnNwb3NlKHBpdGNoZXMsIGRpZmYsIHRoaXMua2V5U2lnbmF0dXJlLCB0YXJnZXRLZXkpO1xyXG4gICAgICAgICAgbm90ZS5nZXRHcmFjZU5vdGVzKCkuZm9yRWFjaCgoZ24pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ3BpdGNoOiBudW1iZXJbXSA9IFsuLi5BcnJheShnbi5waXRjaGVzLmxlbmd0aCkua2V5cygpXTtcclxuICAgICAgICAgICAgY29uc3QgeHBvc2UgPSBTbW9Ob3RlLnRyYW5zcG9zZShnbiwgZ3BpdGNoLCBkaWZmLCB0aGlzLmtleVNpZ25hdHVyZSwgdGFyZ2V0S2V5KTtcclxuICAgICAgICAgICAgZ24ucGl0Y2hlcyA9IHhwb3NlLnBpdGNoZXM7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhY3R1YWwgb3IgZXN0aW1hdGVkIGhpZ2hlc3QgcG9pbnQgaW4gc2NvcmVcclxuICAgKi9cclxuICBzZXRZVG9wKHk6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ3lUb3AnLCB5LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy55VG9wID0geTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhY3R1YWwgb3IgZXN0aW1hdGVkIGJvdW5kaW5nIGJveFxyXG4gICAqL1xyXG4gIHNldEJveChib3g6IFN2Z0JveCwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ2xvZ2ljYWxCb3gnLCBib3gsIGRlc2NyaXB0aW9uKTtcclxuICAgIHRoaXMuc3ZnLmxvZ2ljYWxCb3ggPSBTdmdIZWxwZXJzLnNtb0JveChib3gpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAcmV0dXJucyB0aGUgRE9NIGlkZW50aWZpZXIgZm9yIHRoaXMgbWVhc3VyZSB3aGVuIHJlbmRlcmVkXHJcbiAgICovXHJcbiAgZ2V0Q2xhc3NJZCgpIHtcclxuICAgIHJldHVybiAnbW0tJyArIHRoaXMubWVhc3VyZU51bWJlci5zdGFmZklkICsgJy0nICsgdGhpcy5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGlkIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldFJlbmRlcmVkTm90ZShpZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tqXTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICAgIGlmIChub3RlLnJlbmRlcklkID09PSBpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc21vTm90ZTogbm90ZSxcclxuICAgICAgICAgICAgdm9pY2U6IGosXHJcbiAgICAgICAgICAgIHRpY2s6IGlcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldE5vdGVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudm9pY2VzW3RoaXMuYWN0aXZlVm9pY2VdLm5vdGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWN0aXZlVm9pY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVWb2ljZTtcclxuICB9XHJcblxyXG4gIHNldEFjdGl2ZVZvaWNlKHZpeDogbnVtYmVyKSB7XHJcbiAgICBpZiAodml4ID49IDAgJiYgdml4IDwgdGhpcy52b2ljZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVm9pY2UgPSB2aXg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aWNrbWFwRm9yVm9pY2Uodm9pY2VJeDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IFRpY2tNYXAodGhpcywgdm9pY2VJeCk7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgY3JlYXRlTWVhc3VyZVRpY2ttYXBzXHJcbiAgLy8gQSB0aWNrbWFwIGlzIGEgbWFwIG9mIG5vdGVzIHRvIHRpY2tzIGZvciB0aGUgbWVhc3VyZS4gIEl0IGlzIHNwZWNpaWZjIHBlci12b2ljZVxyXG4gIC8vIHNpbmNlIGVhY2ggdm9pY2UgbWF5IGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YgdGlja3MuICBUaGUgYWNjaWRlbnRhbCBtYXAgaXNcclxuICAvLyBvdmVyYWxsIHNpbmNlIGFjY2lkZW50YWxzIGluIG9uZSB2b2ljZSBhcHBseSB0byBhY2NpZGVudGFscyBpbiB0aGUgb3RoZXJcclxuICAvLyB2b2ljZXMuICBTbyB3ZSByZXR1cm4gdGhlIHRpY2ttYXBzIGFuZCB0aGUgb3ZlcmFsbCBhY2NpZGVudGFsIG1hcC5cclxuICBjcmVhdGVNZWFzdXJlVGlja21hcHMoKTogTWVhc3VyZVRpY2ttYXBzIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IHRpY2ttYXBBcnJheTogVGlja01hcFtdID0gW107XHJcbiAgICBjb25zdCBhY2NpZGVudGFsTWFwOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBUaWNrQWNjaWRlbnRhbD4+ID1cclxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPFBpdGNoTGV0dGVyLCBUaWNrQWNjaWRlbnRhbD4+O1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHRpY2ttYXBBcnJheS5wdXNoKHRoaXMudGlja21hcEZvclZvaWNlKGkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdGlja21hcDogVGlja01hcCA9IHRpY2ttYXBBcnJheVtpXTtcclxuICAgICAgY29uc3QgZHVyYXRpb25LZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKCh0aWNrbWFwLmR1cmF0aW9uQWNjaWRlbnRhbE1hcCkpO1xyXG5cclxuICAgICAgZHVyYXRpb25LZXlzLmZvckVhY2goKGR1cmF0aW9uS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIWFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldKSB7XHJcbiAgICAgICAgICBhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XSA9IHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgYW1hcCA9IGFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldO1xyXG4gICAgICAgICAgY29uc3QgdGlja2FibGU6IFJlY29yZDxQaXRjaExldHRlciwgVGlja0FjY2lkZW50YWw+ID0gdGlja21hcC5kdXJhdGlvbkFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldO1xyXG4gICAgICAgICAgY29uc3QgbGV0dGVyS2V5czogUGl0Y2hMZXR0ZXJbXSA9IE9iamVjdC5rZXlzKHRpY2thYmxlKSBhcyBBcnJheTxQaXRjaExldHRlcj47XHJcbiAgICAgICAgICBsZXR0ZXJLZXlzLmZvckVhY2goKHBpdGNoS2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYW1hcFtwaXRjaEtleV0pIHtcclxuICAgICAgICAgICAgICBhbWFwW3BpdGNoS2V5XSA9IHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XVtwaXRjaEtleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBkdXJhdGlvbjogZHVyYXRpb24sIHBpdGNoZXM6IFJlY29yZDxQaXRjaExldHRlcixUaWNrQWNjaWRlbnRhbD5cclxuICAgIGNvbnN0IGFjY2lkZW50YWxBcnJheTogQWNjaWRlbnRhbEFycmF5W10gPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGFjY2lkZW50YWxNYXApLmZvckVhY2goKGR1cmF0aW9uS2V5KSA9PiB7XHJcbiAgICAgIGFjY2lkZW50YWxBcnJheS5wdXNoKHsgZHVyYXRpb246IGR1cmF0aW9uS2V5LCBwaXRjaGVzOiBhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XSB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGlja21hcHM6IHRpY2ttYXBBcnJheSxcclxuICAgICAgYWNjaWRlbnRhbE1hcCxcclxuICAgICAgYWNjaWRlbnRhbEFycmF5XHJcbiAgICB9O1xyXG4gIH1cclxuICAvLyAjIyMgY3JlYXRlUmVzdE5vdGVXaXRoRHVyYXRpb25cclxuICAvLyBwYWQgc29tZSBkdXJhdGlvbiBvZiBtdXNpYyB3aXRoIHJlc3RzLlxyXG4gIHN0YXRpYyBjcmVhdGVSZXN0Tm90ZVdpdGhEdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyLCBjbGVmOiBDbGVmKTogU21vTm90ZSB7XHJcbiAgICBjb25zdCBwaXRjaDogUGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbY2xlZl0pKTtcclxuICAgIGNvbnN0IG5vdGUgPSBuZXcgU21vTm90ZShTbW9Ob3RlLmRlZmF1bHRzKTtcclxuICAgIG5vdGUucGl0Y2hlcyA9IFtwaXRjaF07XHJcbiAgICBub3RlLm5vdGVUeXBlID0gJ3InO1xyXG4gICAgbm90ZS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgbm90ZS50aWNrcyA9IHsgbnVtZXJhdG9yOiBkdXJhdGlvbiwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9O1xyXG4gICAgcmV0dXJuIG5vdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIGVhY2ggdm9pY2UgYW5kIHJldHVybiBtYXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRNYXhUaWNrc1ZvaWNlKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IG1heCA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2VUaWNrcyA9IHRoaXMuZ2V0VGlja3NGcm9tVm9pY2UoaSk7XHJcbiAgICAgIG1heCA9IE1hdGgubWF4KHZvaWNlVGlja3MsIG1heCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgdGhlIG51bWJlciBvZiB0aWNrcyBpbiBhIHNwZWNpZmljIHZvaWNlXHJcbiAgICogQHBhcmFtIHZvaWNlSW5kZXggXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0VGlja3NGcm9tVm9pY2Uodm9pY2VJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0aWNrcyA9IDA7XHJcbiAgICB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgIHRpY2tzICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGlja3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCBhbGwgdGhlIHRpY2tzIHVwIHRvIHRoZSBwcm92aWRlZCB0aWNrSW5kZXhcclxuICAgKiBAcGFyYW0gdm9pY2VJbmRleFxyXG4gICAqIEBwYXJhbSB0aWNrSW5kZXhcclxuICAgKi9cclxuICBnZXROb3RlUG9zaXRpb25JblRpY2tzKHZvaWNlSW5kZXg6IG51bWJlciwgdGlja0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJ2ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0luZGV4OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzW2ldO1xyXG4gICAgICBydiArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IGFsbCB0aGUgdGlja3MgdXAgdG8gdGhlIHByb3ZpZGVkIHRpY2tJbmRleFxyXG4gICAqIEBwYXJhbSB2b2ljZUluZGV4XHJcbiAgICogQHBhcmFtIHRpY2tJbmRleFxyXG4gICAqL1xyXG4gIGdldFRpY2tDb3VudEZvck5vdGUodm9pY2VJbmRleDogbnVtYmVyLCBub3RlOiBTbW9Ob3RlKTogbnVtYmVyIHtcclxuICAgIGxldCBydiA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnROb3RlID0gdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXNbaV07XHJcbiAgICAgIHJ2ICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvc2VzdEluZGV4RnJvbVRpY2tDb3VudCh2b2ljZUluZGV4OiBudW1iZXIsIHRpY2tDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBydiA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzW2ldO1xyXG4gICAgICBpZiAobm90ZS50aWNrQ291bnQgKyBydiA+PSB0aWNrQ291bnQpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgICBydiArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgaXNQaWNrdXAoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMuZ2V0VGlja3NGcm9tVm9pY2UoMCk7XHJcbiAgICBjb25zdCBnb2FsID0gU21vTXVzaWMudGltZVNpZ25hdHVyZVRvVGlja3ModGhpcy50aW1lU2lnbmF0dXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgcmV0dXJuICh0aWNrcyA8IGdvYWwpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJCZWFtR3JvdXBzKCkge1xyXG4gICAgdGhpcy5iZWFtR3JvdXBzID0gW107XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgdXBkYXRlTHlyaWNGb250XHJcbiAgLy8gVXBkYXRlIHRoZSBseXJpYyBmb250LCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYWxsIGx5cmljcy5cclxuICBzZXRMeXJpY0ZvbnQoZm9udEluZm86IEZvbnRJbmZvKSB7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRMeXJpY0FkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aDogYm9vbGVhbikge1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuc2V0THlyaWNBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hvcmRBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldENob3JkQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICMjIyB1cGRhdGVMeXJpY0ZvbnRcclxuICAvLyBVcGRhdGUgdGhlIGx5cmljIGZvbnQsIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBhbGwgbHlyaWNzLlxyXG4gIHNldENob3JkRm9udChmb250SW5mbzogRm9udEluZm8pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0dXBsZXROb3RlcyhzbW9UdXBsZXQ6IFNtb1R1cGxldCk6IFNtb05vdGVbXSB7XHJcbiAgICBsZXQgdHVwbGV0Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IHNtb1R1cGxldC5zdGFydEluZGV4OyBpIDw9IHNtb1R1cGxldC5lbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLnZvaWNlc1tzbW9UdXBsZXQudm9pY2VdLm5vdGVzW2ldO1xyXG4gICAgICB0dXBsZXROb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHR1cGxldE5vdGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RlbURpcmVjdGlvbkZvclR1cGxldChzbW9UdXBsZXQ6IFNtb1R1cGxldCkge1xyXG4gICAgbGV0IG5vdGU6IFNtb05vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAobGV0IGN1cnJlbnROb3RlIG9mIHRoaXMudHVwbGV0Tm90ZXMoc21vVHVwbGV0KSkge1xyXG4gICAgICBpZiAoY3VycmVudE5vdGUubm90ZVR5cGUgPT09ICduJykge1xyXG4gICAgICAgIG5vdGUgPSBjdXJyZW50Tm90ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghbm90ZSkge1xyXG4gICAgICByZXR1cm4gU21vTm90ZS5mbGFnU3RhdGVzLmRvd247XHJcbiAgICB9XHJcbiAgICBpZiAobm90ZS5mbGFnU3RhdGUgIT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvKSB7XHJcbiAgICAgIHJldHVybiBub3RlLmZsYWdTdGF0ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBTbW9NdXNpYy5waXRjaFRvTGVkZ2VyTGluZSh0aGlzLmNsZWYsIG5vdGUucGl0Y2hlc1swXSlcclxuICAgICAgPj0gMiA/IFNtb05vdGUuZmxhZ1N0YXRlcy51cCA6IFNtb05vdGUuZmxhZ1N0YXRlcy5kb3duO1xyXG4gIH1cclxuICBnZXROb3RlQnlJZChpZDogc3RyaW5nKTogU21vTm90ZSB8IG51bGwge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGlmIChub3RlLmF0dHJzLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5vdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgc2V0Q2xlZihjbGVmOiBDbGVmKSB7XHJcbiAgICBjb25zdCBvbGRDbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgdGhpcy5jbGVmID0gY2xlZjtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLmNsZWYgPSBjbGVmO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNsZWYgdGhhdCB0aGlzIG1lYXN1cmUgZW5kcyB3aXRoLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldExhc3RDbGVmKCkge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGlmIChub3RlLmNsZWZOb3RlICYmIG5vdGUuY2xlZk5vdGUuY2xlZiAhPT0gdGhpcy5jbGVmKSB7XHJcbiAgICAgICAgICByZXR1cm4gbm90ZS5jbGVmTm90ZS5jbGVmO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY2xlZjtcclxuICB9XHJcbiAgaXNSZXN0KCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZiAoIXZvaWNlLm5vdGVzW2pdLmlzUmVzdCgpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLy8gIyMjIHBvcHVsYXRlVm9pY2VcclxuICAvLyBDcmVhdGUgYSBuZXcgdm9pY2UgaW4gdGhpcyBtZWFzdXJlLCBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgZGVmYXVsdCBub3RlXHJcbiAgLy8gZm9yIHRoaXMgbWVhc3VyZS9rZXkvY2xlZlxyXG4gIHBvcHVsYXRlVm9pY2UoaW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKGluZGV4ICE9PSB0aGlzLnZvaWNlcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMucHVzaCh7IG5vdGVzOiBTbW9NZWFzdXJlLmdldERlZmF1bHROb3Rlcyh0aGlzKSB9KTtcclxuICAgIHRoaXMuYWN0aXZlVm9pY2UgPSBpbmRleDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIobmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhciA9IHRoaXMubW9kaWZpZXJzLmZpbHRlcihvYmogPT4gb2JqLmF0dHJzLnR5cGUgIT09IG5hbWUpO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBhcjtcclxuICB9XHJcblxyXG4gIGFkZFJlaGVhcnNhbE1hcmsocGFyYW1ldGVyczogU21vUmVoZWFyc2FsTWFya1BhcmFtcykge1xyXG4gICAgdGhpcy5fcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIoJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobmV3IFNtb1JlaGVhcnNhbE1hcmsocGFyYW1ldGVycykpO1xyXG4gIH1cclxuICByZW1vdmVSZWhlYXJzYWxNYXJrKCkge1xyXG4gICAgdGhpcy5fcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIoJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICB9XHJcbiAgZ2V0UmVoZWFyc2FsTWFyaygpOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGlmaWVycy5maW5kKG9iaiA9PiBvYmouYXR0cnMudHlwZSA9PT0gJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICB9XHJcbiAgZ2V0TW9kaWZpZXJzQnlUeXBlKHR5cGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmZpbHRlcigobW0pID0+IHR5cGUgPT09IG1tLmF0dHJzLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0VGVtcG8ocGFyYW1zOiBTbW9UZW1wb1RleHRQYXJhbXMpIHtcclxuICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHBhcmFtcyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCBtZWFzdXJlIHRlbXBvIHRvIHRoZSBkZWZhdWx0IHtAbGluayBTbW9UZW1wb1RleHR9XHJcbiAgICovXHJcbiAgcmVzZXRUZW1wbygpIHtcclxuICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgfVxyXG4gIGdldFRlbXBvKCkge1xyXG4gICAgaWYgKHR5cGVvZiAodGhpcy50ZW1wbykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWVhc3VyZSB0ZXh0IGlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEJldHRlciB0byB1c2UgU21vVGV4dEdyb3VwIGFuZCBhdHRhY2ggdG8gdGhlIG1lYXN1cmUuXHJcbiAgICogQHBhcmFtIG1vZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhZGRNZWFzdXJlVGV4dChtb2Q6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpIHtcclxuICAgIHZhciBleGlzdCA9IHRoaXMubW9kaWZpZXJzLmZpbHRlcigobW0pID0+XHJcbiAgICAgIG1tLmF0dHJzLmlkID09PSBtb2QuYXR0cnMuaWRcclxuICAgICk7XHJcbiAgICBpZiAoZXhpc3QubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobW9kKTtcclxuICB9XHJcblxyXG4gIGdldE1lYXN1cmVUZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmZpbHRlcihvYmogPT4gb2JqLmN0b3IgPT09ICdTbW9NZWFzdXJlVGV4dCcpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTWVhc3VyZVRleHQoaWQ6IHN0cmluZykge1xyXG4gICAgdmFyIGFyID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouYXR0cnMuaWQgIT09IGlkKTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgfVxyXG5cclxuICBzZXRSZXBlYXRTeW1ib2wocnM6IFNtb1JlcGVhdFN5bWJvbCkge1xyXG4gICAgY29uc3QgYXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgIGNvbnN0IGV4U3ltYm9sID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChleFN5bWJvbCAmJiBleFN5bWJvbC5zeW1ib2wgPT09IHJzLnN5bWJvbCkge1xyXG4gICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgIT09ICdTbW9SZXBlYXRTeW1ib2wnKSB7XHJcbiAgICAgICAgYXIucHVzaChtb2RpZmllcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBhcjtcclxuICAgIGlmICh0b0FkZCkge1xyXG4gICAgICBhci5wdXNoKHJzKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0UmVwZWF0U3ltYm9sKCk6IFNtb1JlcGVhdFN5bWJvbCB8IG51bGwge1xyXG4gICAgY29uc3QgcnYgPSB0aGlzLm1vZGlmaWVycy5maWx0ZXIob2JqID0+IG9iai5jdG9yID09PSAnU21vUmVwZWF0U3ltYm9sJyk7XHJcbiAgICBpZiAocnYubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gcnZbMF0gYXMgU21vUmVwZWF0U3ltYm9sO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGNsZWFyUmVwZWF0U3ltYm9scygpIHtcclxuICAgIGNvbnN0IGFyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vUmVwZWF0U3ltYm9sJykge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgfVxyXG5cclxuICBzZXRCYXJsaW5lKGJhcmxpbmU6IFNtb0JhcmxpbmUpIHtcclxuICAgIHZhciBhcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnKSB7XHJcbiAgICAgICAgY29uc3QgbyA9IG1vZGlmaWVyIGFzIFNtb0JhcmxpbmU7XHJcbiAgICAgICAgaWYgKG8ucG9zaXRpb24gIT09IGJhcmxpbmUucG9zaXRpb24pIHtcclxuICAgICAgICAgIGFyLnB1c2gobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgICBhci5wdXNoKGJhcmxpbmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QmFybGluZShwb3M6IG51bWJlcik6IFNtb0JhcmxpbmUge1xyXG4gICAgbGV0IHJ2ID0gbnVsbDtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBwb3MpIHtcclxuICAgICAgICBydiA9IG1vZGlmaWVyO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChydiA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbmV3IFNtb0JhcmxpbmUoU21vQmFybGluZS5kZWZhdWx0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBnZXRFbmRCYXJsaW5lKCk6IFNtb0JhcmxpbmUgeyAgICBcclxuICAgIHJldHVybiB0aGlzLl9nZXRCYXJsaW5lKFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZCk7XHJcbiAgfVxyXG4gIGdldFN0YXJ0QmFybGluZSgpOiBTbW9CYXJsaW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRCYXJsaW5lKFNtb0JhcmxpbmUucG9zaXRpb25zLnN0YXJ0KTtcclxuICB9XHJcblxyXG4gIGFkZE50aEVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKSB7XHJcbiAgICBjb25zdCBtb2RzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vVm9sdGEnIHx8IChtb2RpZmllciBhcyBTbW9Wb2x0YSkuc3RhcnRCYXIgIT09IGVuZGluZy5zdGFydEJhciB8fFxyXG4gICAgICAgIChtb2RpZmllciBhcyBTbW9Wb2x0YSkuZW5kQmFyICE9PSBlbmRpbmcuZW5kQmFyKSB7XHJcbiAgICAgICAgbW9kcy5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtb2RzLnB1c2goZW5kaW5nKTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gbW9kcztcclxuICB9XHJcblxyXG4gIHJlbW92ZU50aEVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKSB7XHJcbiAgICBjb25zdCBtb2RzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vVm9sdGEnKSB7XHJcbiAgICAgICAgY29uc3Qgdm9sdGEgPSBtb2RpZmllciBhcyBTbW9Wb2x0YTtcclxuICAgICAgICBpZiAoZW5kaW5nLnN0YXJ0U2VsZWN0b3IgPT09IG51bGwgfHwgZW5kaW5nLmVuZFNlbGVjdG9yID09PSBudWxsIHx8IHZvbHRhLnN0YXJ0U2VsZWN0b3IgPT09IG51bGwgfHwgdm9sdGEuZW5kU2VsZWN0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFTbW9TZWxlY3Rvci5zYW1lTWVhc3VyZShlbmRpbmcuc3RhcnRTZWxlY3Rvciwgdm9sdGEuc3RhcnRTZWxlY3RvcikgfHwgIVNtb1NlbGVjdG9yLnNhbWVNZWFzdXJlKGVuZGluZy5lbmRTZWxlY3Rvciwgdm9sdGEuZW5kU2VsZWN0b3IpXHJcbiAgICAgICAgJiYgZW5kaW5nLm51bWJlciAhPT0gdm9sdGEubnVtYmVyKSB7XHJcbiAgICAgICAgICBtb2RzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtb2RzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gbW9kcztcclxuICB9XHJcblxyXG4gIGdldE50aEVuZGluZ3MoKTogU21vVm9sdGFbXSB7XHJcbiAgICBjb25zdCBydjogU21vVm9sdGFbXSA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9Wb2x0YScpIHtcclxuICAgICAgICBydi5wdXNoKG1vZGlmaWVyIGFzIFNtb1ZvbHRhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHNldEtleVNpZ25hdHVyZShzaWc6IHN0cmluZykge1xyXG4gICAgdGhpcy5rZXlTaWduYXR1cmUgPSBzaWc7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5rZXlTaWduYXR1cmUgPSBzaWc7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHNldE1lYXN1cmVOdW1iZXIobnVtOiBNZWFzdXJlTnVtYmVyKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVOdW1iZXIgPSBudW07XHJcbiAgfVxyXG4gIGdldEJlYW1Hcm91cEZvck5vdGUobm90ZTogU21vTm90ZSkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYmVhbUdyb3Vwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBiZyA9IHRoaXMuYmVhbUdyb3Vwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGJnLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKGJnLm5vdGVzW2pdLmF0dHJzLmlkID09PSBub3RlLmF0dHJzLmlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/smo/data/measure.ts\n");
494
494
 
495
495
  /***/ }),
496
496
 
@@ -534,7 +534,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
534
534
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
535
535
 
536
536
  "use strict";
537
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoArpeggio: () => (/* binding */ SmoArpeggio),\n/* harmony export */ SmoArpeggioTypes: () => (/* binding */ SmoArpeggioTypes),\n/* harmony export */ SmoArticulation: () => (/* binding */ SmoArticulation),\n/* harmony export */ SmoClefChange: () => (/* binding */ SmoClefChange),\n/* harmony export */ SmoDynamicText: () => (/* binding */ SmoDynamicText),\n/* harmony export */ SmoGraceNote: () => (/* binding */ SmoGraceNote),\n/* harmony export */ SmoLyric: () => (/* binding */ SmoLyric),\n/* harmony export */ SmoMicrotone: () => (/* binding */ SmoMicrotone),\n/* harmony export */ SmoNoteModifierBase: () => (/* binding */ SmoNoteModifierBase),\n/* harmony export */ SmoOrnament: () => (/* binding */ SmoOrnament),\n/* harmony export */ SmoTabNote: () => (/* binding */ SmoTabNote),\n/* harmony export */ isArpeggioType: () => (/* binding */ isArpeggioType),\n/* harmony export */ isClefChangeParamsSer: () => (/* binding */ isClefChangeParamsSer),\n/* harmony export */ noteModifierDynamicCtorInit: () => (/* binding */ noteModifierDynamicCtorInit)\n/* harmony export */ });\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * A note modifier is anything that is mapped to the note, but not part of the\n * pitch itself. This includes grace notes, and note-text like lyrics.\n * @module /smo/data/noteModifiers\n */\n\n\n\n\n/**\n * A note modifier is anything that is mapped to the note, but not part of the\n * pitch itself. This includes grace notes, and note-text like lyrics.\n * All note modifiers have a serialize method and a 'ctor' parameter or deserialization\n * @category SmoObject\n */\nclass SmoNoteModifierBase {\n constructor(ctor) {\n this.logicalBox = null;\n this.element = null;\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: ctor\n };\n this.ctor = ctor;\n }\n static deserialize(jsonObj) {\n // Handle backwards-compatibility thing\n if (jsonObj.ctor === 'SmoMicrotone' && typeof (jsonObj.pitch) === 'number') {\n jsonObj.pitchIndex = jsonObj.pitch;\n }\n if (jsonObj.ctor === 'SmoLyric') {\n if (typeof (jsonObj._text) === 'string') {\n jsonObj.text = jsonObj._text;\n }\n }\n if (typeof (_common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor[jsonObj.ctor]) === 'undefined') {\n console.log('ouch bad ctor for ' + jsonObj.ctor);\n }\n try {\n const rv = _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor[jsonObj.ctor](jsonObj);\n return rv;\n }\n catch (exp) {\n console.error('no ctor for ' + jsonObj.ctor);\n throw (exp);\n }\n }\n}\nfunction isClefChangeParamsSer(params) {\n if (typeof (params.clef) === 'string' && params.ctor === 'SmoClefChange') {\n return true;\n }\n return false;\n}\n/**\n * @category SmoObject\n */\nclass SmoClefChange extends SmoNoteModifierBase {\n static get defaults() {\n const rv = JSON.parse(JSON.stringify({\n clef: 'treble',\n ctor: 'SmoClefChange',\n attrs: {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)(),\n type: 'SmoClefChange'\n }\n }));\n return rv;\n }\n constructor(clefParams) {\n super('SmoClefChange');\n const clef = clefParams.clef;\n if (!(0,_common__WEBPACK_IMPORTED_MODULE_0__.IsClef)(clef)) {\n this.clef = 'treble';\n }\n else {\n this.clef = clef;\n }\n }\n serialize() {\n const params = { ctor: 'SmoClefChange' };\n params.clef = this.clef;\n if (!isClefChangeParamsSer(params)) {\n throw ('corrupt clef change');\n }\n return params;\n }\n}\nfunction isGraceNoteParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoGraceNote') {\n return false;\n }\n return true;\n}\n/**\n * A grace notes has many of the things an 'actual' note can have, but it doesn't take up\n * time against the time signature\n * @category SmoObject\n */\nclass SmoGraceNote extends SmoNoteModifierBase {\n static get flagStates() {\n return { auto: 0, up: 1, down: 2 };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n flagState: SmoGraceNote.flagStates.auto,\n noteType: 'n',\n beamBeats: 4096,\n endBeam: false,\n clef: 'treble',\n slash: false,\n ticks: {\n numerator: 4096,\n denominator: 1,\n remainder: 0\n },\n pitches: [{\n letter: 'b',\n octave: 4,\n accidental: ''\n }]\n }));\n }\n // TODO: Matches SmoNote - move to SmoMusic?\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoGraceNote.defaults) {\n rv.push(key);\n }\n return rv;\n }\n tickCount() {\n return this.ticks.numerator / this.ticks.denominator + this.ticks.remainder;\n }\n toVexGraceNote() {\n const p = _music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.smoPitchesToVex(this.pitches);\n const rv = { duration: _music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.closestVexDuration(this.tickCount()), keys: p, slash: this.slash };\n return rv;\n }\n serialize() {\n const params = { ctor: 'SmoGraceNote' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoGraceNote.defaults, SmoGraceNote.parameterArray, this, params);\n if (!isGraceNoteParamsSer(params)) {\n throw 'bad grace note ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoGraceNote');\n this.ticks = SmoGraceNote.defaults.ticks;\n this.pitches = [];\n this.slash = false;\n this.clef = 'treble';\n this.noteType = 'n';\n this.renderId = null;\n this.hasTabNote = false;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoGraceNote.parameterArray, SmoGraceNote.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoGraceNote.parameterArray, parameters, this);\n }\n}\nconst SmoArpeggioTypes = ['directionless', 'rasquedo_up', 'rasquedo_down',\n 'roll_up', 'roll_down', 'brush_up', 'brush_down', 'none'];\nfunction isSmoArpeggionParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoArpeggio') {\n return false;\n }\n return true;\n}\nfunction isArpeggioType(tp) {\n return SmoArpeggioTypes.indexOf(tp) >= 0;\n}\n/**\n * A 'splatter' symbol next to a chord.\n * @category SmoObject\n */\nclass SmoArpeggio extends SmoNoteModifierBase {\n static get types() {\n if (typeof (SmoArpeggio._types['directionless']) === 'undefined') {\n SmoArpeggio._types['directionless'] = 7;\n SmoArpeggio._types['rasquedo_up'] = 6;\n SmoArpeggio._types['rasquedo_down'] = 5;\n SmoArpeggio._types['roll_up'] = 4;\n SmoArpeggio._types['roll_down'] = 3;\n SmoArpeggio._types['brush_up'] = 2;\n SmoArpeggio._types['brush_down'] = 1;\n SmoArpeggio._types['none'] = 0;\n }\n return SmoArpeggio._types;\n }\n constructor(params) {\n super('SmoArpeggio');\n this.typeCode = SmoArpeggio.types[params.type];\n }\n get typeString() {\n const str = SmoArpeggioTypes.find((x) => SmoArpeggio.types[x] === this.typeCode);\n const type = str ? str : 'none';\n return type;\n }\n serialize() {\n const rv = { ctor: 'SmoArpeggio' };\n const str = SmoArpeggioTypes.find((x) => SmoArpeggio.types[x] === this.typeCode);\n rv.type = str ? str : 'none';\n if (!isSmoArpeggionParamsSer(rv)) {\n throw 'bad arpeggio ' + JSON.stringify(rv);\n }\n return rv;\n }\n}\nSmoArpeggio._types = {};\nfunction isSmoMicrotoneParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoMicrotone') {\n return false;\n }\n return true;\n}\n/**\n * Microtones are treated similarly to ornaments. There are not\n * rules for persisting throughout a measure, cancel etc.\n * @category SmoObject\n*/\nclass SmoMicrotone extends SmoNoteModifierBase {\n get toPitchCoeff() {\n return SmoMicrotone.pitchCoeff[this.tone];\n }\n get toVex() {\n return SmoMicrotone.smoToVex[this.tone];\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoMicrotone.defaults) {\n rv.push(key);\n }\n return rv;\n }\n serialize() {\n const params = { ctor: 'SmoMicrotone' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoMicrotone.defaults, SmoMicrotone.parameterArray, this, params);\n if (!isSmoMicrotoneParamsSer(params)) {\n throw 'bad microtone ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super(parameters.ctor);\n this.pitchIndex = 0;\n this.pitchIndex = parameters.pitch;\n this.tone = parameters.tone;\n }\n}\n// This is how VexFlow notates them\nSmoMicrotone.smoToVex = {\n flat75sz: 'db',\n flat25sz: 'd',\n flat25ar: 'bs',\n flat125ar: 'afhf',\n sharp75: '++',\n sharp125: 'ashs',\n sharp25: '+',\n sori: 'o',\n koron: 'k'\n};\n// The audio frequency offsets\nSmoMicrotone.pitchCoeff = {\n flat75sz: -1.5,\n flat25sz: -0.5,\n flat25ar: -0.5,\n flat125ar: -2.5,\n sharp75: 1.5,\n sharp125: 2.5,\n sharp25: 0.5,\n sori: 0.5,\n koron: -0.5\n};\nSmoMicrotone.defaults = {\n ctor: 'SmoMicrotone',\n tone: 'flat25sz',\n pitch: 0\n};\nfunction isSmoOrnamentParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoOrnament') {\n return false;\n }\n return true;\n}\n/**\n * Ornaments map to vex ornaments. articulations vs. ornaments\n * is kind of arbitrary\n * @category SmoObject\n */\nclass SmoOrnament extends SmoNoteModifierBase {\n static get jazzOrnaments() {\n return ['scoop', 'fallLong', 'doit', 'doitLong', 'flip', 'smear', 'scoop', 'plungerOpen', 'plungerClosed', 'bend'];\n }\n static get legacyJazz() {\n return { 'SCOOP': SmoOrnament.ornaments.scoop,\n 'FALL_SHORT': SmoOrnament.ornaments.fall,\n 'FALL_LONG': SmoOrnament.ornaments.fallLong,\n 'DOIT': SmoOrnament.ornaments.doit,\n 'LIFT': SmoOrnament.ornaments.lift,\n 'FLIP': SmoOrnament.ornaments.flip,\n 'SMEAR': SmoOrnament.ornaments.smear\n };\n }\n toVex() {\n return SmoOrnament.ornaments[this.ornament];\n }\n isJazz() {\n return SmoOrnament.jazzOrnaments.indexOf(this.ornament) >= 0;\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoOrnament.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get positions() {\n return {\n above: 'above',\n below: 'below',\n auto: 'auto'\n };\n }\n static get offsets() {\n return {\n on: 'on',\n after: 'after'\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoOrnament',\n ornament: SmoOrnament.ornaments.mordent,\n position: SmoOrnament.positions.auto,\n offset: SmoOrnament.offsets.on\n }));\n }\n serialize() {\n var params = { ctor: 'SmoOrnament' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoOrnament.defaults, SmoOrnament.parameterArray, this, params);\n if (!isSmoOrnamentParamsSer(params)) {\n throw 'bad ornament ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoOrnament');\n this.position = SmoOrnament.positions.above;\n this.offset = 'on';\n this.ornament = SmoOrnament.ornaments.mordent;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoOrnament.parameterArray, SmoOrnament.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoOrnament.parameterArray, parameters, this);\n // handle some legacy changes\n if (typeof (SmoOrnament.legacyJazz[this.ornament]) === 'string') {\n this.ornament = SmoOrnament.legacyJazz[this.ornament];\n }\n }\n}\nSmoOrnament.ornaments = {\n mordent: 'mordent',\n mordent_inverted: 'mordent_inverted',\n turn: 'turn',\n turn_inverted: 'turn_inverted',\n trill: 'tr',\n upprall: 'upprall',\n prallup: 'prallup',\n pralldown: 'pralldown',\n upmordent: 'upmordent',\n downmordent: 'downmordent',\n caesura: 'caesura',\n lineprall: 'lineprall',\n prallprall: 'prallprall',\n scoop: 'scoop',\n fall: 'fall',\n fallLong: 'fallLong',\n breath: 'breath',\n doit: 'doit',\n doitLong: 'doitLong',\n flip: 'flip',\n smear: 'smear',\n bend: 'bend',\n plungerClosed: 'plungerClosed',\n plungerOpen: 'plungerOpen'\n};\nSmoOrnament.xmlOrnaments = {\n mordent: 'mordent',\n mordent_inverted: 'inverted-mordent',\n turn: 'turn',\n turn_inverted: 'inverted-turn',\n upmordent: 'mordent',\n downmordent: 'mordent',\n lineprall: 'schleifer',\n prallprall: 'schleifer',\n prallup: 'schleifer',\n tr: 'trill-mark'\n};\nSmoOrnament.textNoteOrnaments = {\n breath: 'breath',\n caesura: 'caesura_straight'\n};\n// jazz ornaments in vex are articulations in music xml\nSmoOrnament.xmlJazz = {\n doit: 'doit',\n scoop: 'scoop',\n dropLong: 'falloff',\n drop: 'plop'\n};\nfunction isSmoArticulationParametersSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoArticulation') {\n return false;\n }\n return true;\n}\n/**\n * Articulations map to notes, can be placed above/below\n * @category SmoObject\n */\nclass SmoArticulation extends SmoNoteModifierBase {\n static get articulations() {\n return {\n accent: 'accent',\n staccato: 'staccato',\n marcato: 'marcato',\n tenuto: 'tenuto',\n upStroke: 'upStroke',\n downStroke: 'downStroke',\n pizzicato: 'pizzicato',\n bowUp: 'bowUp',\n bowDown: 'bowDown',\n fermata: 'fermata'\n };\n }\n static get positions() {\n return {\n above: 'above',\n below: 'below',\n auto: 'auto'\n };\n }\n static get articulationToVex() {\n return {\n accent: 'a>',\n staccato: 'a.',\n marcato: 'a^',\n tenuto: 'a-',\n upStroke: 'a|',\n downStroke: 'am',\n pizzicato: 'ao',\n fermata: 'a@a'\n };\n }\n static get vexToArticulation() {\n return {\n 'a>': 'accent',\n 'a.': 'staccato',\n 'a^': 'marcato',\n 'a-': 'tenuto',\n 'a|': 'upStroke',\n 'am': 'downStroke',\n 'ao': 'pizzicato',\n 'a@a': 'fermata'\n };\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoArticulation.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get positionToVex() {\n return {\n 'above': 3,\n 'below': 4\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoArticulation',\n position: SmoArticulation.positions.above,\n articulation: SmoArticulation.articulations.accent\n }));\n }\n serialize() {\n var params = { ctor: 'SmoArticulation' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoArticulation.defaults, SmoArticulation.parameterArray, this, params);\n if (!isSmoArticulationParametersSer(params)) {\n throw 'bad articulation ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoArticulation');\n this.position = SmoOrnament.positions.above;\n this.offset = 0;\n this.articulation = SmoArticulation.articulations.accent;\n this.adjX = 0;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoArticulation.parameterArray, SmoArticulation.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoArticulation.parameterArray, parameters, this);\n // this.selector = parameters.selector;\n }\n}\nSmoArticulation.xmlArticulations = {\n accent: 'accent',\n staccato: 'staccato',\n tenuto: 'tenuto',\n marcato: 'strong-accent'\n};\nfunction isSmoLyricPersist(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoLyric') {\n return false;\n }\n return true;\n}\n/**\n * SmoLyric covers both chords and lyrics. The parser tells you which\n * one you get.\n * @category SmoObject\n */\nclass SmoLyric extends SmoNoteModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoLyric',\n text: '\\xa0',\n endChar: '',\n verse: 0,\n fontInfo: {\n size: 12,\n family: 'times',\n style: 'normal',\n weight: 'normal'\n },\n fill: 'black',\n classes: 'score-text',\n translateX: 0,\n translateY: 0,\n adjustNoteWidthLyric: true,\n adjustNoteWidthChord: false,\n parser: SmoLyric.parsers.lyric\n }));\n }\n static get symbolPosition() {\n return {\n SUPERSCRIPT: 1,\n SUBSCRIPT: 2,\n NORMAL: 3\n };\n }\n static get persistArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoLyric.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get parameterArray() {\n const rv = SmoLyric.persistArray;\n rv.push('selector', 'text');\n return rv;\n }\n serialize() {\n var params = { ctor: 'SmoLyric' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoLyric.defaults, SmoLyric.persistArray, this, params);\n if (!isSmoLyricPersist(params)) {\n throw 'bad lyric ' + JSON.stringify('params');\n }\n return params;\n }\n // For lyrics, we default to adjust note width on lyric size. For chords, this is almost never what\n // you want, so it is off by default.\n get adjustNoteWidth() {\n return (this.parser === SmoLyric.parsers.lyric) ? this.adjustNoteWidthLyric : this.adjustNoteWidthChord;\n }\n set adjustNoteWidth(val) {\n if (this.parser === SmoLyric.parsers.lyric) {\n this.adjustNoteWidthLyric = val;\n }\n else {\n this.adjustNoteWidthChord = val;\n }\n }\n // ### getClassSelector\n // returns a selector used to find this text block within a note.\n getClassSelector() {\n var parser = (this.parser === SmoLyric.parsers.lyric ? 'lyric' : 'chord');\n return 'g.' + parser + '-' + this.verse;\n }\n setText(text) {\n // For chords, trim all whitespace\n if (this.parser !== SmoLyric.parsers.lyric) {\n if (text.trim().length) {\n text.replace(/\\s/g, '');\n }\n }\n this.text = text;\n }\n isHyphenated() {\n const text = this.text.trim();\n return this.parser === SmoLyric.parsers.lyric &&\n text.length &&\n text[text.length - 1] === '-';\n }\n getText() {\n const text = this.text.trim();\n if (this.isHyphenated()) {\n return _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.tryParseUnicode(text.substr(0, text.length - 1)).trim();\n }\n return _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.tryParseUnicode(text);\n }\n isDash() {\n return this.getText().length === 0 && this.isHyphenated();\n }\n static _chordGlyphFromCode(code) {\n return (0,_common_vex__WEBPACK_IMPORTED_MODULE_3__.getChordSymbolGlyphFromCode)(code);\n }\n static _tokenizeChordString(str) {\n // var str = this._text;\n const reg = /^([A-Z|a-z|0-9|]+)/g;\n let mmm = str.match(reg);\n let tokeType = '';\n let toke = '';\n const tokens = [];\n while (str.length) {\n if (!mmm) {\n tokeType = str[0];\n tokens.push(tokeType);\n str = str.slice(1, str.length);\n }\n else {\n toke = mmm[0].substr(0, mmm[0].length);\n str = str.slice(toke.length, str.length);\n tokens.push(toke);\n tokeType = '';\n toke = '';\n }\n mmm = str.match(reg);\n }\n return tokens;\n }\n constructor(parameters) {\n super('SmoLyric');\n this.ctor = 'SmoLyric';\n this.text = '';\n this.fontInfo = {\n size: 12,\n family: 'Merriweather',\n style: 'normal',\n weight: 'normal'\n };\n this.parser = SmoLyric.parsers.lyric;\n this.selector = null; // used by UI\n this.adjustNoteWidthLyric = true;\n this.adjustNoteWidthChord = false;\n this.verse = 0;\n this.skipRender = false;\n this.fill = '';\n this.translateX = 0;\n this.translateY = 0;\n this.classes = '';\n // used by the renderer to calculate offsets for aligning lyrics\n this.adjX = 0;\n this.adjY = 0;\n // used by the renderer to calculate the y offset for music that goes below the staff\n this.musicYOffset = 0;\n this.hyphenX = 0;\n this.deleted = false;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoLyric.parameterArray, SmoLyric.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoLyric.parameterArray, parameters, this);\n if (typeof (this.fontInfo.size) !== 'number') {\n this.fontInfo.size = SmoLyric.defaults.fontInfo.size;\n }\n // backwards-compatibility for lyric text\n if (parameters.text) {\n this.text = parameters.text;\n }\n // calculated adjustments for alignment purposes\n this.adjY = 0;\n this.adjX = 0;\n // this.verse = parseInt(this.verse, 10);\n if (!this.attrs) {\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: 'SmoLyric'\n };\n }\n }\n}\nSmoLyric.parsers = {\n lyric: 0, anaylysis: 1, chord: 2\n};\n/**\n * Dynamic text tells you how loud not to play.\n * @category SmoObject\n */\nclass SmoDynamicText extends SmoNoteModifierBase {\n static get dynamics() {\n // matches VF.modifier\n return {\n PP: 'pp',\n P: 'p',\n MP: 'mp',\n MF: 'mf',\n F: 'f',\n FF: 'ff',\n SFZ: 'sfz'\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoDynamicText',\n xOffset: 0,\n fontSize: _common_vex__WEBPACK_IMPORTED_MODULE_3__.defaultNoteScale,\n yOffsetLine: 11,\n yOffsetPixels: 0,\n text: SmoDynamicText.dynamics.MP,\n }));\n }\n static get persistArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoDynamicText.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get parameterArray() {\n const rv = SmoDynamicText.persistArray;\n rv.push('selector');\n return rv;\n }\n serialize() {\n var params = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoDynamicText.defaults, SmoDynamicText.persistArray, this, params);\n return params;\n }\n constructor(parameters) {\n super('SmoDynamicText');\n this.text = '';\n this.yOffsetLine = 11;\n this.yOffsetPixels = 0;\n this.xOffset = 0;\n this.fontSize = _common_vex__WEBPACK_IMPORTED_MODULE_3__.defaultNoteScale;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.vexMerge(this, SmoDynamicText.defaults);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.filteredMerge(SmoDynamicText.parameterArray, parameters, this);\n if (!this.attrs) {\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: 'SmoDynamicText'\n };\n }\n }\n}\nfunction isSmoTabNoteParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoTabNote') {\n return false;\n }\n return true;\n}\n/**\n * @category SmoObject\n */\nclass SmoTabNote extends SmoNoteModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n positions: [],\n noteId: '',\n isAssigned: false,\n flagState: SmoTabNote.flagStates.None,\n flagThrough: false,\n noteHead: SmoTabNote.noteHeads.number\n }));\n }\n static get flagStates() {\n return { None: 0, Up: 1, Down: -1 };\n }\n static get noteHeads() {\n return { number: 0, x: 1 };\n }\n constructor(params) {\n super('SmoTabNote');\n this.positions = params.positions;\n this.noteId = params.noteId;\n this.isAssigned = params.isAssigned;\n this.noteHead = params.noteHead;\n this.flagState = params.flagState;\n this.flagThrough = params.flagThrough;\n }\n serialize() {\n var params = { ctor: 'SmoTabNote' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoTabNote.defaults, ['positions', 'noteId', 'isAssigned', 'noteHead', 'flagState', 'flagThrough'], this, params);\n if (!isSmoTabNoteParamsSer(params)) {\n throw 'bad params in SmoTabNote';\n }\n return params;\n }\n}\nconst noteModifierDynamicCtorInit = () => {\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoArpeggio'] = (params) => new SmoArpeggio(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoMicrotone'] = (params) => new SmoMicrotone(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoOrnament'] = (params) => new SmoOrnament(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoGraceNote'] = (params) => new SmoGraceNote(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoArticulation'] = (params) => new SmoArticulation(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoLyric'] = (params) => new SmoLyric(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoDynamicText'] = (params) => new SmoDynamicText(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoTabNote'] = (params) => new SmoTabNote(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoClefChange'] = (params) => new SmoClefChange(params);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkYsbURBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBaUMsRUFBRSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkcsbURBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLG1EQUFjLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQTRCLEVBQUUsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hHLG1EQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUF3QixFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRixtREFBYyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBMkIsRUFBRSxFQUFFLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9zbW8vZGF0YS9ub3RlTW9kaWZpZXJzLnRzPzg0ODkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8qKlxyXG4gKiBBIG5vdGUgbW9kaWZpZXIgaXMgYW55dGhpbmcgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIG5vdGUsIGJ1dCBub3QgcGFydCBvZiB0aGVcclxuICogcGl0Y2ggaXRzZWxmLiAgVGhpcyBpbmNsdWRlcyBncmFjZSBub3RlcywgYW5kIG5vdGUtdGV4dCBsaWtlIGx5cmljcy5cclxuICogQG1vZHVsZSAvc21vL2RhdGEvbm90ZU1vZGlmaWVyc1xyXG4gKi9cclxuaW1wb3J0IHsgU21vQXR0cnMsIFRpY2tzLCBQaXRjaCwgZ2V0SWQsIFNtb09iamVjdFBhcmFtcywgVHJhbnNwb3NhYmxlLCBTdmdCb3gsIFNtb01vZGlmaWVyQmFzZSwgXHJcbiAgQ2xlZiwgSXNDbGVmLCBTbW9EeW5hbWljQ3RvciB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgc21vU2VyaWFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcmlhbGl6YXRpb25IZWxwZXJzJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuL211c2ljJztcclxuaW1wb3J0IHsgZGVmYXVsdE5vdGVTY2FsZSwgRm9udEluZm8sIGdldENob3JkU3ltYm9sR2x5cGhGcm9tQ29kZSB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5cclxuLyoqXHJcbiAqIEEgbm90ZSBtb2RpZmllciBpcyBhbnl0aGluZyB0aGF0IGlzIG1hcHBlZCB0byB0aGUgbm90ZSwgYnV0IG5vdCBwYXJ0IG9mIHRoZVxyXG4gKiBwaXRjaCBpdHNlbGYuICBUaGlzIGluY2x1ZGVzIGdyYWNlIG5vdGVzLCBhbmQgbm90ZS10ZXh0IGxpa2UgbHlyaWNzLlxyXG4gKiBBbGwgbm90ZSBtb2RpZmllcnMgaGF2ZSBhIHNlcmlhbGl6ZSBtZXRob2QgYW5kIGEgJ2N0b3InIHBhcmFtZXRlciBvciBkZXNlcmlhbGl6YXRpb25cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNtb05vdGVNb2RpZmllckJhc2UgaW1wbGVtZW50cyBTbW9Nb2RpZmllckJhc2Uge1xyXG4gIGF0dHJzOiBTbW9BdHRycztcclxuICBjdG9yOiBzdHJpbmc7XHJcbiAgbG9naWNhbEJveDogU3ZnQm94IHwgbnVsbCA9IG51bGw7XHJcbiAgZWxlbWVudDogU1ZHU1ZHRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKGN0b3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5hdHRycyA9IHtcclxuICAgICAgaWQ6IGdldElkKCkudG9TdHJpbmcoKSxcclxuICAgICAgdHlwZTogY3RvclxyXG4gICAgfTtcclxuICAgIHRoaXMuY3RvciA9IGN0b3I7XHJcbiAgfVxyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uT2JqOiBTbW9PYmplY3RQYXJhbXMpIHtcclxuICAgIC8vIEhhbmRsZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB0aGluZ1xyXG4gICAgaWYgKGpzb25PYmouY3RvciA9PT0gJ1Ntb01pY3JvdG9uZScgJiYgdHlwZW9mICgoanNvbk9iaiBhcyBhbnkpLnBpdGNoKSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgKGpzb25PYmogYXMgYW55KS5waXRjaEluZGV4ID0gKGpzb25PYmogYXMgYW55KS5waXRjaDtcclxuICAgIH1cclxuICAgIGlmIChqc29uT2JqLmN0b3IgPT09ICdTbW9MeXJpYycpIHtcclxuICAgICAgaWYgKHR5cGVvZigoanNvbk9iaiBhcyBhbnkpLl90ZXh0KSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAoanNvbk9iaiBhcyBhbnkpLnRleHQgPSAoanNvbk9iaiBhcyBhbnkpLl90ZXh0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIChTbW9EeW5hbWljQ3Rvcltqc29uT2JqLmN0b3JdKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ291Y2ggYmFkIGN0b3IgZm9yICcgKyBqc29uT2JqLmN0b3IpO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcnYgPSBTbW9EeW5hbWljQ3Rvcltqc29uT2JqLmN0b3JdKGpzb25PYmopO1xyXG4gICAgICByZXR1cm4gcnY7XHJcbiAgICB9IGNhdGNoIChleHApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignbm8gY3RvciBmb3IgJyArIGpzb25PYmouY3Rvcik7XHJcbiAgICAgIHRocm93KGV4cCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFic3RyYWN0IHNlcmlhbGl6ZSgpOiBhbnk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNDbGVmQ2hhbmdlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jbGVmKSA9PT0gJ3N0cmluZycgJiYgcGFyYW1zLmN0b3IgPT09ICdTbW9DbGVmQ2hhbmdlJykge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9DbGVmQ2hhbmdlUGFyYW1zICB7XHJcbiAgY2xlZjogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0NsZWZDaGFuZ2VQYXJhbXNTZXIgZXh0ZW5kcyBTbW9DbGVmQ2hhbmdlUGFyYW1zIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gICAgY3Rvcjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBhdHRyaWJ1dGVzIGZvciBJRFxyXG4gICAgICovXHJcbiAgICBhdHRyczogU21vQXR0cnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU21vQ2xlZkNoYW5nZSBleHRlbmRzIFNtb05vdGVNb2RpZmllckJhc2Uge1xyXG4gIGNsZWY6IENsZWY7XHJcbiAgc3RhdGljIGdldCBkZWZhdWx0cygpIHtcclxuICAgIGNvbnN0IHJ2OiBTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIGNsZWY6ICd0cmVibGUnLFxyXG4gICAgICBjdG9yOiAnU21vQ2xlZkNoYW5nZScsXHJcbiAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgaWQ6IGdldElkKCksXHJcbiAgICAgICAgdHlwZTogJ1Ntb0NsZWZDaGFuZ2UnXHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoY2xlZlBhcmFtczogU21vQ2xlZkNoYW5nZVBhcmFtcykge1xyXG4gICAgc3VwZXIoJ1Ntb0NsZWZDaGFuZ2UnKTtcclxuICAgIGNvbnN0IGNsZWYgPSBjbGVmUGFyYW1zLmNsZWY7XHJcbiAgICBpZiAoIUlzQ2xlZihjbGVmKSkge1xyXG4gICAgICB0aGlzLmNsZWYgPSAndHJlYmxlJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlZiA9IGNsZWYgYXMgQ2xlZjtcclxuICAgIH1cclxuICB9XHJcbiAgc2VyaWFsaXplKCk6IFNtb0NsZWZDaGFuZ2VQYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcGFyYW1zOiBQYXJ0aWFsPFNtb0NsZWZDaGFuZ2VQYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vQ2xlZkNoYW5nZScgfTtcclxuICAgIHBhcmFtcy5jbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgaWYgKCFpc0NsZWZDaGFuZ2VQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdygnY29ycnVwdCBjbGVmIGNoYW5nZScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIHVzZWQgdG8gY29uc3RydWN0IHtAbGluayBTbW9HcmFjZU5vdGV9XHJcbiAqICAgYmVhbSBncm91cC5cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBHcmFjZU5vdGVQYXJhbXMgZXh0ZW5kcyBTbW9Nb2RpZmllckJhc2Uge1xyXG4gIC8qKlxyXG4gICAqIHVwLCBkb3duLCBvciBhdXRvXHJcbiAgICovXHJcbiAgZmxhZ1N0YXRlOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogc2FtZSBhcyBmb3Ige0BsaW5rIFNtb05vdGV9XHJcbiAgICovXHJcbiAgbm90ZVR5cGU6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBzYW1lIGFzIGZvciB7QGxpbmsgU21vTm90ZX1cclxuICAgKi9cclxuICBiZWFtQmVhdHM6IG51bWJlcixcclxuICAvKipcclxuICAgKiBzYW1lIGFzIGZvciB7QGxpbmsgU21vTm90ZX0uICBJbmRpY2F0ZXMgYnJlYWsgaW4gYmVhbSBncm91cFxyXG4gICAqL1xyXG4gIGVuZEJlYW06IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogc2hvdWxkIGJlIHNhbWUgYXMgbm90ZT9cclxuICAgKi9cclxuICBjbGVmOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogdGhlcmUncyBwcm9iYWJseSBhIG5hbWUgZm9yIHRoaXMuLi5cclxuICAgKi9cclxuICBzbGFzaDogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBvbmx5IHVzZWQgZm9yIGJlYW1pbmdcclxuICAgKi9cclxuICB0aWNrczogVGlja3MsXHJcbiAgLyoqXHJcbiAgICogUGl0Y2gsIHNhbWUgYXMgZm9yIHtAbGluayBTbW9Ob3RlfVxyXG4gICAqL1xyXG4gIHBpdGNoZXM6IFBpdGNoW10sXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBzZXJpYWxpemVkIGdyYWNlIG5vdGVcclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JhY2VOb3RlUGFyYW1zU2VyIGV4dGVuZHMgR3JhY2VOb3RlUGFyYW1zIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGN0b3I6IHN0cmluZztcclxuICAvKipcclxuICAgKiBhdHRyaWJ1dGVzIGZvciBJRFxyXG4gICAqL1xyXG4gIGF0dHJzOiBTbW9BdHRycztcclxufVxyXG5cclxuZnVuY3Rpb24gaXNHcmFjZU5vdGVQYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPEdyYWNlTm90ZVBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgR3JhY2VOb3RlUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9HcmFjZU5vdGUnKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKiBBIGdyYWNlIG5vdGVzIGhhcyBtYW55IG9mIHRoZSB0aGluZ3MgYW4gJ2FjdHVhbCcgbm90ZSBjYW4gaGF2ZSwgYnV0IGl0IGRvZXNuJ3QgdGFrZSB1cFxyXG4gKiB0aW1lIGFnYWluc3QgdGhlIHRpbWUgc2lnbmF0dXJlXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9HcmFjZU5vdGUgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIGltcGxlbWVudHMgVHJhbnNwb3NhYmxlIHtcclxuICBzdGF0aWMgZ2V0IGZsYWdTdGF0ZXMoKSB7XHJcbiAgICByZXR1cm4geyBhdXRvOiAwLCB1cDogMSwgZG93bjogMiB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IEdyYWNlTm90ZVBhcmFtcyB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIGZsYWdTdGF0ZTogU21vR3JhY2VOb3RlLmZsYWdTdGF0ZXMuYXV0byxcclxuICAgICAgbm90ZVR5cGU6ICduJyxcclxuICAgICAgYmVhbUJlYXRzOiA0MDk2LFxyXG4gICAgICBlbmRCZWFtOiBmYWxzZSxcclxuICAgICAgY2xlZjogJ3RyZWJsZScsXHJcbiAgICAgIHNsYXNoOiBmYWxzZSxcclxuICAgICAgdGlja3M6IHtcclxuICAgICAgICBudW1lcmF0b3I6IDQwOTYsXHJcbiAgICAgICAgZGVub21pbmF0b3I6IDEsXHJcbiAgICAgICAgcmVtYWluZGVyOiAwXHJcbiAgICAgIH0sXHJcbiAgICAgIHBpdGNoZXM6IFt7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgb2N0YXZlOiA0LFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICcnXHJcbiAgICAgIH1dXHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIC8vIFRPRE86IE1hdGNoZXMgU21vTm90ZSAtIG1vdmUgdG8gU21vTXVzaWM/XHJcbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJBcnJheSgpIHtcclxuICAgIGNvbnN0IHJ2OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBTbW9HcmFjZU5vdGUuZGVmYXVsdHMpIHtcclxuICAgICAgcnYucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB0aWNrczogVGlja3MgPSBTbW9HcmFjZU5vdGUuZGVmYXVsdHMudGlja3M7XHJcbiAgcGl0Y2hlczogUGl0Y2hbXSA9IFtdO1xyXG4gIHNsYXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xlZjogc3RyaW5nID0gJ3RyZWJsZSc7XHJcbiAgbm90ZVR5cGU6IHN0cmluZyA9ICduJztcclxuICByZW5kZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgaGFzVGFiTm90ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB0aWNrQ291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aWNrcy5udW1lcmF0b3IgLyB0aGlzLnRpY2tzLmRlbm9taW5hdG9yICsgdGhpcy50aWNrcy5yZW1haW5kZXI7XHJcbiAgfVxyXG5cclxuICB0b1ZleEdyYWNlTm90ZSgpIHtcclxuICAgIGNvbnN0IHAgPSBTbW9NdXNpYy5zbW9QaXRjaGVzVG9WZXgodGhpcy5waXRjaGVzKTtcclxuICAgIGNvbnN0IHJ2ID0geyBkdXJhdGlvbjogU21vTXVzaWMuY2xvc2VzdFZleER1cmF0aW9uKHRoaXMudGlja0NvdW50KCkpLCBrZXlzOiBwLCBzbGFzaDogdGhpcy5zbGFzaCB9O1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplKCk6IEdyYWNlTm90ZVBhcmFtc1NlciB7XHJcbiAgICBjb25zdCBwYXJhbXM6IFBhcnRpYWw8R3JhY2VOb3RlUGFyYW1zU2VyPiA9IHsgY3RvcjogJ1Ntb0dyYWNlTm90ZScgfTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2VOb25EZWZhdWx0KFNtb0dyYWNlTm90ZS5kZWZhdWx0cyxcclxuICAgICAgU21vR3JhY2VOb3RlLnBhcmFtZXRlckFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgaWYgKCFpc0dyYWNlTm90ZVBhcmFtc1NlcihwYXJhbXMpKSB7XHJcbiAgICAgIHRocm93ICdiYWQgZ3JhY2Ugbm90ZSAnICsgSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFBhcnRpYWw8R3JhY2VOb3RlUGFyYW1zPikge1xyXG4gICAgc3VwZXIoJ1Ntb0dyYWNlTm90ZScpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9HcmFjZU5vdGUucGFyYW1ldGVyQXJyYXksIFNtb0dyYWNlTm90ZS5kZWZhdWx0cywgdGhpcyk7XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb0dyYWNlTm90ZS5wYXJhbWV0ZXJBcnJheSwgcGFyYW1ldGVycywgdGhpcyk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCB0eXBlIFNtb0FycGVnZ2lvVHlwZSA9ICdkaXJlY3Rpb25sZXNzJyB8ICdyYXNxdWVkb191cCcgfCAncmFzcXVlZG9fZG93bicgXHJcbiAgfCAncm9sbF91cCcgfCAncm9sbF9kb3duJyB8ICdicnVzaF91cCcgfCAnYnJ1c2hfZG93bicgfCAnbm9uZSc7XHJcbmV4cG9ydCAgY29uc3QgU21vQXJwZWdnaW9UeXBlcyA9IFsnZGlyZWN0aW9ubGVzcycsICdyYXNxdWVkb191cCcsICdyYXNxdWVkb19kb3duJyxcclxuICAncm9sbF91cCcsICdyb2xsX2Rvd24nLCAnYnJ1c2hfdXAnLCAnYnJ1c2hfZG93bicsICdub25lJ107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICAgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9BcnBlZ2dpb1BhcmFtcyB7XHJcbiAgIHR5cGU6IFNtb0FycGVnZ2lvVHlwZVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9BcnBlZ2dpb1BhcmFtc1NlciB7XHJcbiAgY3Rvcjogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIHN0cmluZ2lmaWVkIGFycGVnZ2lvbiBlbnVtZXJhdGlvblxyXG4gICAqL1xyXG4gIHR5cGU6IHN0cmluZztcclxufVxyXG5mdW5jdGlvbiBpc1Ntb0FycGVnZ2lvblBhcmFtc1NlcihwYXJhbXM6IFBhcnRpYWw8U21vQXJwZWdnaW9QYXJhbXNTZXI+KTogcGFyYW1zIGlzIFNtb0FycGVnZ2lvUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9BcnBlZ2dpbycpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJwZWdnaW9UeXBlKHRwOiBTbW9BcnBlZ2dpb1R5cGUgfCBzdHJpbmcpOiB0cCBpcyBTbW9BcnBlZ2dpb1R5cGUge1xyXG4gIHJldHVybiBTbW9BcnBlZ2dpb1R5cGVzLmluZGV4T2YodHApID49IDA7XHJcbn1cclxuLyoqXHJcbiAqIEEgJ3NwbGF0dGVyJyBzeW1ib2wgbmV4dCB0byBhIGNob3JkLlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU21vQXJwZWdnaW8gZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICBzdGF0aWMgX3R5cGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbiAgc3RhdGljIGdldCB0eXBlcygpIHtcclxuICAgIGlmICh0eXBlb2YoU21vQXJwZWdnaW8uX3R5cGVzWydkaXJlY3Rpb25sZXNzJ10pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBTbW9BcnBlZ2dpby5fdHlwZXNbJ2RpcmVjdGlvbmxlc3MnXSA9IDc7XHJcbiAgICAgIFNtb0FycGVnZ2lvLl90eXBlc1sncmFzcXVlZG9fdXAnXSA9IDY7XHJcbiAgICAgIFNtb0FycGVnZ2lvLl90eXBlc1sncmFzcXVlZG9fZG93biddID0gNTtcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydyb2xsX3VwJ10gPSA0O1xyXG4gICAgICBTbW9BcnBlZ2dpby5fdHlwZXNbJ3JvbGxfZG93biddID0gMztcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydicnVzaF91cCddID0gMjtcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydicnVzaF9kb3duJ10gPSAxO1xyXG4gICAgICBTbW9BcnBlZ2dpby5fdHlwZXNbJ25vbmUnXSA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21vQXJwZWdnaW8uX3R5cGVzO1xyXG4gIH0gICAgXHJcbiAgdHlwZUNvZGU6IG51bWJlcjtcclxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNtb0FycGVnZ2lvUGFyYW1zKSB7XHJcbiAgICBzdXBlcignU21vQXJwZWdnaW8nKTtcclxuICAgIHRoaXMudHlwZUNvZGUgPSBTbW9BcnBlZ2dpby50eXBlc1twYXJhbXMudHlwZV07XHJcbiAgfVxyXG4gIGdldCB0eXBlU3RyaW5nKCk6IFNtb0FycGVnZ2lvVHlwZSB7XHJcbiAgICBjb25zdCBzdHIgPSBTbW9BcnBlZ2dpb1R5cGVzLmZpbmQoKHgpID0+IFNtb0FycGVnZ2lvLnR5cGVzW3hdID09PSB0aGlzLnR5cGVDb2RlKTtcclxuICAgIGNvbnN0IHR5cGUgPSBzdHIgPyBzdHIgOiAnbm9uZSc7XHJcbiAgICByZXR1cm4gdHlwZSBhcyBTbW9BcnBlZ2dpb1R5cGU7XHJcbiAgfVxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9BcnBlZ2dpb1BhcmFtc1NlciB7XHJcbiAgICBjb25zdCBydjogUGFydGlhbDxTbW9BcnBlZ2dpb1BhcmFtc1Nlcj4gPSB7IGN0b3I6ICdTbW9BcnBlZ2dpbycgfVxyXG4gICAgY29uc3Qgc3RyID0gU21vQXJwZWdnaW9UeXBlcy5maW5kKCh4KSA9PiBTbW9BcnBlZ2dpby50eXBlc1t4XSA9PT0gdGhpcy50eXBlQ29kZSk7XHJcbiAgICBydi50eXBlID0gc3RyID8gc3RyIDogJ25vbmUnO1xyXG4gICAgaWYgKCFpc1Ntb0FycGVnZ2lvblBhcmFtc1NlcihydikpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBhcnBlZ2dpbyAnICsgSlNPTi5zdHJpbmdpZnkocnYpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFNtb01pY3JvdG9uZX1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NaWNyb3RvbmVQYXJhbXMgZXh0ZW5kcyBTbW9PYmplY3RQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB3aGljaCBtb2RpZmllciB0byBhbHRlciB0aGUgdG9uZSAoZS5nLiAxLzQgc2hhcnApXHJcbiAgICovXHJcbiAgdG9uZTogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHRoZSBpbmRleCBvZiB0aGUgcGl0Y2ggdG8gYWx0ZXJcclxuICAgKi9cclxuICBwaXRjaDogbnVtYmVyXHJcbn1cclxuLyoqXHJcbiAqIHNlcmlhbGl6ZWQgbWljcm90b25lcy5cclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTWljcm90b25lUGFyYW1zU2VyIGV4dGVuZHMgU21vTWljcm90b25lUGFyYW1zIHtcclxuICBjdG9yOiBzdHJpbmcsXHJcbiAgYXR0cnM6IFNtb0F0dHJzXHJcbn1cclxuZnVuY3Rpb24gaXNTbW9NaWNyb3RvbmVQYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPFNtb01pY3JvdG9uZVBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vTWljcm90b25lUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9NaWNyb3RvbmUnKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKiBNaWNyb3RvbmVzIGFyZSB0cmVhdGVkIHNpbWlsYXJseSB0byBvcm5hbWVudHMuICBUaGVyZSBhcmUgbm90XHJcbiAqIHJ1bGVzIGZvciBwZXJzaXN0aW5nIHRocm91Z2hvdXQgYSBtZWFzdXJlLCBjYW5jZWwgZXRjLlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBTbW9NaWNyb3RvbmUgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICB0b25lOiBzdHJpbmc7XHJcbiAgcGl0Y2hJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgLy8gVGhpcyBpcyBob3cgVmV4RmxvdyBub3RhdGVzIHRoZW1cclxuICBzdGF0aWMgcmVhZG9ubHkgc21vVG9WZXg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBmbGF0NzVzejogJ2RiJyxcclxuICAgIGZsYXQyNXN6OiAnZCcsXHJcbiAgICBmbGF0MjVhcjogJ2JzJyxcclxuICAgIGZsYXQxMjVhcjogJ2FmaGYnLFxyXG4gICAgc2hhcnA3NTogJysrJyxcclxuICAgIHNoYXJwMTI1OiAnYXNocycsXHJcbiAgICBzaGFycDI1OiAnKycsXHJcbiAgICBzb3JpOiAnbycsXHJcbiAgICBrb3JvbjogJ2snXHJcbiAgfVxyXG5cclxuICAvLyBUaGUgYXVkaW8gZnJlcXVlbmN5IG9mZnNldHNcclxuICBzdGF0aWMgcmVhZG9ubHkgcGl0Y2hDb2VmZjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgIGZsYXQ3NXN6OiAtMS41LFxyXG4gICAgZmxhdDI1c3o6IC0wLjUsXHJcbiAgICBmbGF0MjVhcjogLTAuNSxcclxuICAgIGZsYXQxMjVhcjogLTIuNSxcclxuICAgIHNoYXJwNzU6IDEuNSxcclxuICAgIHNoYXJwMTI1OiAyLjUsXHJcbiAgICBzaGFycDI1OiAwLjUsXHJcbiAgICBzb3JpOiAwLjUsXHJcbiAgICBrb3JvbjogLTAuNVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRvUGl0Y2hDb2VmZigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIFNtb01pY3JvdG9uZS5waXRjaENvZWZmW3RoaXMudG9uZV07XHJcbiAgfVxyXG5cclxuICBnZXQgdG9WZXgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTbW9NaWNyb3RvbmUuc21vVG9WZXhbdGhpcy50b25lXTtcclxuICB9XHJcbiAgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRzOiBTbW9NaWNyb3RvbmVQYXJhbXMgPSB7XHJcbiAgICBjdG9yOiAnU21vTWljcm90b25lJyxcclxuICAgIHRvbmU6ICdmbGF0MjVzeicsXHJcbiAgICBwaXRjaDogMFxyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBhcmFtZXRlckFycmF5KCkge1xyXG4gICAgY29uc3QgcnY6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIGZvciAoY29uc3Qga2V5IGluIFNtb01pY3JvdG9uZS5kZWZhdWx0cykge1xyXG4gICAgICBydi5wdXNoKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9NaWNyb3RvbmVQYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcGFyYW1zOiBQYXJ0aWFsPFNtb01pY3JvdG9uZVBhcmFtc1Nlcj4gPSB7IGN0b3I6ICdTbW9NaWNyb3RvbmUnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9NaWNyb3RvbmUuZGVmYXVsdHMsXHJcbiAgICAgIFNtb01pY3JvdG9uZS5wYXJhbWV0ZXJBcnJheSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNTbW9NaWNyb3RvbmVQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnYmFkIG1pY3JvdG9uZSAnICsgSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFNtb01pY3JvdG9uZVBhcmFtcykge1xyXG4gICAgc3VwZXIocGFyYW1ldGVycy5jdG9yKTtcclxuICAgIHRoaXMucGl0Y2hJbmRleCA9IHBhcmFtZXRlcnMucGl0Y2g7XHJcbiAgICB0aGlzLnRvbmUgPSBwYXJhbWV0ZXJzLnRvbmU7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29uc3RydWN0b3IgZm9yIHtAbGluayBTbW9Pcm5hbWVudH1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9Pcm5hbWVudFBhcmFtcyB7XHJcbiAgLyoqXHJcbiAgICogcG9zdGl0aW9uLCBhYm92ZSBvciBiZWxvd1xyXG4gICAqL1xyXG4gIHBvc2l0aW9uPzogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGhvcml6b250YWwgb2Zmc2V0IGZyb20gbm90ZSBoZWFkXHJcbiAgICovICBcclxuICBvZmZzZXQ/OiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogYWNjaWRlbnRhbCBhYm92ZS9iZWxvd1xyXG4gICAqL1xyXG4gIGFjY2lkZW50YWxBYm92ZT86IHN0cmluZyxcclxuICBhY2NpZGVudGFsQmVsb3c/OiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogY29kZSBmb3IgdGhlIG9ybmFtZW50XHJcbiAgICovXHJcbiAgb3JuYW1lbnQ6IHN0cmluZyxcclxufVxyXG4vKipcclxuICogc2VyaWFsaXphYmxlIG9ybmFtZW50XHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb09ybmFtZW50UGFyYW1zU2VyIGV4dGVuZHMgU21vT3JuYW1lbnRQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY3Rvcjogc3RyaW5nO1xyXG59XHJcbmZ1bmN0aW9uIGlzU21vT3JuYW1lbnRQYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPFNtb09ybmFtZW50UGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9Pcm5hbWVudFBhcmFtc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY3RvcikgIT09ICdzdHJpbmcnIHx8IHBhcmFtcy5jdG9yICE9PSAnU21vT3JuYW1lbnQnKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKiBPcm5hbWVudHMgbWFwIHRvIHZleCBvcm5hbWVudHMuICBhcnRpY3VsYXRpb25zIHZzLiBvcm5hbWVudHNcclxuICogaXMga2luZCBvZiBhcmJpdHJhcnlcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb09ybmFtZW50IGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSB7ICBcclxuICBzdGF0aWMgcmVhZG9ubHkgb3JuYW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgbW9yZGVudDogJ21vcmRlbnQnLFxyXG4gICAgbW9yZGVudF9pbnZlcnRlZDogJ21vcmRlbnRfaW52ZXJ0ZWQnLFxyXG4gICAgdHVybjogJ3R1cm4nLFxyXG4gICAgdHVybl9pbnZlcnRlZDogJ3R1cm5faW52ZXJ0ZWQnLFxyXG4gICAgdHJpbGw6ICd0cicsXHJcbiAgICB1cHByYWxsOiAndXBwcmFsbCcsXHJcbiAgICBwcmFsbHVwOiAncHJhbGx1cCcsXHJcbiAgICBwcmFsbGRvd246ICdwcmFsbGRvd24nLFxyXG4gICAgdXBtb3JkZW50OiAndXBtb3JkZW50JyxcclxuICAgIGRvd25tb3JkZW50OiAnZG93bm1vcmRlbnQnLFxyXG4gICAgY2Flc3VyYTogJ2NhZXN1cmEnLFxyXG4gICAgbGluZXByYWxsOiAnbGluZXByYWxsJyxcclxuICAgIHByYWxscHJhbGw6ICdwcmFsbHByYWxsJyxcclxuICAgIHNjb29wOiAnc2Nvb3AnLFxyXG4gICAgZmFsbDogJ2ZhbGwnLFxyXG4gICAgZmFsbExvbmc6ICdmYWxsTG9uZycsXHJcbiAgICBicmVhdGg6ICdicmVhdGgnLFxyXG4gICAgZG9pdDogJ2RvaXQnLFxyXG4gICAgZG9pdExvbmc6ICdkb2l0TG9uZycsXHJcbiAgICBmbGlwOiAnZmxpcCcsXHJcbiAgICBzbWVhcjogJ3NtZWFyJyxcclxuICAgIGJlbmQ6ICdiZW5kJyxcclxuICAgIHBsdW5nZXJDbG9zZWQ6ICdwbHVuZ2VyQ2xvc2VkJyxcclxuICAgIHBsdW5nZXJPcGVuOiAncGx1bmdlck9wZW4nXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVhZG9ubHkgeG1sT3JuYW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgbW9yZGVudDogJ21vcmRlbnQnLFxyXG4gICAgbW9yZGVudF9pbnZlcnRlZDogJ2ludmVydGVkLW1vcmRlbnQnLFxyXG4gICAgdHVybjogJ3R1cm4nLFxyXG4gICAgdHVybl9pbnZlcnRlZDogJ2ludmVydGVkLXR1cm4nLFxyXG4gICAgdXBtb3JkZW50OiAnbW9yZGVudCcsXHJcbiAgICBkb3dubW9yZGVudDogJ21vcmRlbnQnLFxyXG4gICAgbGluZXByYWxsOiAnc2NobGVpZmVyJyxcclxuICAgIHByYWxscHJhbGw6ICdzY2hsZWlmZXInLFxyXG4gICAgcHJhbGx1cDogJ3NjaGxlaWZlcicsXHJcbiAgICB0cjogJ3RyaWxsLW1hcmsnXHJcbiAgfVxyXG4gIHN0YXRpYyByZWFkb25seSB0ZXh0Tm90ZU9ybmFtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiAgPSB7XHJcbiAgICBicmVhdGg6ICdicmVhdGgnLFxyXG4gICAgY2Flc3VyYTogJ2NhZXN1cmFfc3RyYWlnaHQnXHJcbiAgfVxyXG4gIC8vIGphenogb3JuYW1lbnRzIGluIHZleCBhcmUgYXJ0aWN1bGF0aW9ucyBpbiBtdXNpYyB4bWxcclxuICBzdGF0aWMgcmVhZG9ubHkgeG1sSmF6ejogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIGRvaXQ6ICdkb2l0JyxcclxuICAgIHNjb29wOiAnc2Nvb3AnLFxyXG4gICAgZHJvcExvbmc6ICdmYWxsb2ZmJyxcclxuICAgIGRyb3A6ICdwbG9wJ1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGphenpPcm5hbWVudHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsnc2Nvb3AnLCAnZmFsbExvbmcnLCAnZG9pdCcsICdkb2l0TG9uZycsICdmbGlwJywgJ3NtZWFyJywgJ3Njb29wJywgJ3BsdW5nZXJPcGVuJywgJ3BsdW5nZXJDbG9zZWQnLCAnYmVuZCddO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGxlZ2FjeUphenooKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geydTQ09PUCc6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5zY29vcCAsXHJcbiAgICAgICdGQUxMX1NIT1JUJzogU21vT3JuYW1lbnQub3JuYW1lbnRzLmZhbGwsXHJcbiAgICAgICdGQUxMX0xPTkcnOiBTbW9Pcm5hbWVudC5vcm5hbWVudHMuZmFsbExvbmcsXHJcbiAgICAgICdET0lUJzogU21vT3JuYW1lbnQub3JuYW1lbnRzLmRvaXQsXHJcbiAgICAgICdMSUZUJzogU21vT3JuYW1lbnQub3JuYW1lbnRzLmxpZnQsXHJcbiAgICAgICdGTElQJzogU21vT3JuYW1lbnQub3JuYW1lbnRzLmZsaXAsXHJcbiAgICAgICdTTUVBUic6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5zbWVhclxyXG4gICAgfTtcclxuICB9XHJcbiAgdG9WZXgoKSB7XHJcbiAgICByZXR1cm4gU21vT3JuYW1lbnQub3JuYW1lbnRzW3RoaXMub3JuYW1lbnRdO1xyXG4gIH1cclxuICBpc0phenooKSB7XHJcbiAgICByZXR1cm4gU21vT3JuYW1lbnQuamF6ek9ybmFtZW50cy5pbmRleE9mKHRoaXMub3JuYW1lbnQpID49IDA7XHJcbiAgfVxyXG4gIHBvc2l0aW9uOiBzdHJpbmcgPSBTbW9Pcm5hbWVudC5wb3NpdGlvbnMuYWJvdmU7XHJcbiAgb2Zmc2V0OiBzdHJpbmcgPSAnb24nO1xyXG4gIG9ybmFtZW50OiBzdHJpbmcgPSBTbW9Pcm5hbWVudC5vcm5hbWVudHMubW9yZGVudDtcclxuXHJcbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJBcnJheSgpIHtcclxuICAgIGNvbnN0IHJ2OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBTbW9Pcm5hbWVudC5kZWZhdWx0cykge1xyXG4gICAgICBydi5wdXNoKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IHBvc2l0aW9ucygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFib3ZlOiAnYWJvdmUnLFxyXG4gICAgICBiZWxvdzogJ2JlbG93JyxcclxuICAgICAgYXV0bzogJ2F1dG8nXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IG9mZnNldHMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvbjogJ29uJyxcclxuICAgICAgYWZ0ZXI6ICdhZnRlcidcclxuICAgIH07XHJcbiAgfSAgXHJcbiAgc3RhdGljIGdldCBkZWZhdWx0cygpOiBTbW9Pcm5hbWVudFBhcmFtcyB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIGN0b3I6ICdTbW9Pcm5hbWVudCcsXHJcbiAgICAgIG9ybmFtZW50OiBTbW9Pcm5hbWVudC5vcm5hbWVudHMubW9yZGVudCxcclxuICAgICAgcG9zaXRpb246IFNtb09ybmFtZW50LnBvc2l0aW9ucy5hdXRvLFxyXG4gICAgICBvZmZzZXQ6IFNtb09ybmFtZW50Lm9mZnNldHMub25cclxuICAgIH0pKTtcclxuICB9XHJcbiAgc2VyaWFsaXplKCk6IFNtb09ybmFtZW50UGFyYW1zU2VyIHtcclxuICAgIHZhciBwYXJhbXM6IFBhcnRpYWw8U21vT3JuYW1lbnRQYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vT3JuYW1lbnQnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9Pcm5hbWVudC5kZWZhdWx0cyxcclxuICAgICAgU21vT3JuYW1lbnQucGFyYW1ldGVyQXJyYXksIHRoaXMsIHBhcmFtcyk7XHJcbiAgICBpZiAoIWlzU21vT3JuYW1lbnRQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnYmFkIG9ybmFtZW50ICcgKyBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU21vT3JuYW1lbnRQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9Pcm5hbWVudCcpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9Pcm5hbWVudC5wYXJhbWV0ZXJBcnJheSwgU21vT3JuYW1lbnQuZGVmYXVsdHMsIHRoaXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9Pcm5hbWVudC5wYXJhbWV0ZXJBcnJheSwgcGFyYW1ldGVycywgdGhpcyk7XHJcbiAgICAvLyBoYW5kbGUgc29tZSBsZWdhY3kgY2hhbmdlc1xyXG4gICAgaWYgKHR5cGVvZihTbW9Pcm5hbWVudC5sZWdhY3lKYXp6W3RoaXMub3JuYW1lbnRdKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5vcm5hbWVudCA9IFNtb09ybmFtZW50LmxlZ2FjeUphenpbdGhpcy5vcm5hbWVudF07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFNtb0FydGljdWxhdGlvbn1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzIHtcclxuICAvKipcclxuICAgKiBwb3NpdGlvbiwgYWJvdmUgb3IgYmVsb3dcclxuICAgKi9cclxuICBwb3NpdGlvbj86IHN0cmluZyxcclxuICAvKipcclxuICAgKiB4IG9mZnNldFxyXG4gICAqL1xyXG4gIG9mZnNldD86IG51bWJlcixcclxuICAvKipcclxuICAgKiBhcnRpY3VsYXRpb24gY29kZVxyXG4gICAqL1xyXG4gIGFydGljdWxhdGlvbjogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnNTZXIgZXh0ZW5kcyBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzIHtcclxuICBjdG9yOiBzdHJpbmc7XHJcbn1cclxuZnVuY3Rpb24gaXNTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyKHBhcmFtczogUGFydGlhbDxTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyPik6IHBhcmFtcyBpcyBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9BcnRpY3VsYXRpb24nKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKiBBcnRpY3VsYXRpb25zIG1hcCB0byBub3RlcywgY2FuIGJlIHBsYWNlZCBhYm92ZS9iZWxvd1xyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU21vQXJ0aWN1bGF0aW9uIGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSB7XHJcbiAgc3RhdGljIGdldCBhcnRpY3VsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWNjZW50OiAnYWNjZW50JyxcclxuICAgICAgc3RhY2NhdG86ICdzdGFjY2F0bycsXHJcbiAgICAgIG1hcmNhdG86ICdtYXJjYXRvJyxcclxuICAgICAgdGVudXRvOiAndGVudXRvJyxcclxuICAgICAgdXBTdHJva2U6ICd1cFN0cm9rZScsXHJcbiAgICAgIGRvd25TdHJva2U6ICdkb3duU3Ryb2tlJyxcclxuICAgICAgcGl6emljYXRvOiAncGl6emljYXRvJyxcclxuICAgICAgYm93VXA6ICdib3dVcCcsXHJcbiAgICAgIGJvd0Rvd246ICdib3dEb3duJyxcclxuICAgICAgZmVybWF0YTogJ2Zlcm1hdGEnXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgcmVhZG9ubHkgeG1sQXJ0aWN1bGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIGFjY2VudDogJ2FjY2VudCcsXHJcbiAgICBzdGFjY2F0bzogJ3N0YWNjYXRvJyxcclxuICAgIHRlbnV0bzogJ3RlbnV0bycsXHJcbiAgICBtYXJjYXRvOiAnc3Ryb25nLWFjY2VudCdcclxuICB9XHJcbiAgc3RhdGljIGdldCBwb3NpdGlvbnMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhYm92ZTogJ2Fib3ZlJyxcclxuICAgICAgYmVsb3c6ICdiZWxvdycsXHJcbiAgICAgIGF1dG86ICdhdXRvJ1xyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBhcnRpY3VsYXRpb25Ub1ZleCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjY2VudDogJ2E+JyxcclxuICAgICAgc3RhY2NhdG86ICdhLicsXHJcbiAgICAgIG1hcmNhdG86ICdhXicsXHJcbiAgICAgIHRlbnV0bzogJ2EtJyxcclxuICAgICAgdXBTdHJva2U6ICdhfCcsXHJcbiAgICAgIGRvd25TdHJva2U6ICdhbScsXHJcbiAgICAgIHBpenppY2F0bzogJ2FvJyxcclxuICAgICAgZmVybWF0YTogJ2FAYSdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IHZleFRvQXJ0aWN1bGF0aW9uKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2E+JzogJ2FjY2VudCcsXHJcbiAgICAgICdhLic6ICdzdGFjY2F0bycsXHJcbiAgICAgICdhXic6ICdtYXJjYXRvJyxcclxuICAgICAgJ2EtJzogJ3RlbnV0bycsXHJcbiAgICAgICdhfCc6ICd1cFN0cm9rZScsXHJcbiAgICAgICdhbSc6ICdkb3duU3Ryb2tlJyxcclxuICAgICAgJ2FvJzogJ3BpenppY2F0bycsXHJcbiAgICAgICdhQGEnOiAnZmVybWF0YSdcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFyYW1ldGVyQXJyYXkoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgcnY6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIGZvciAoY29uc3Qga2V5IGluIFNtb0FydGljdWxhdGlvbi5kZWZhdWx0cykge1xyXG4gICAgICBydi5wdXNoKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IHBvc2l0aW9uVG9WZXgoKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnYWJvdmUnOiAzLFxyXG4gICAgICAnYmVsb3cnOiA0XHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjdG9yOiAnU21vQXJ0aWN1bGF0aW9uJyxcclxuICAgICAgcG9zaXRpb246IFNtb0FydGljdWxhdGlvbi5wb3NpdGlvbnMuYWJvdmUsXHJcbiAgICAgIGFydGljdWxhdGlvbjogU21vQXJ0aWN1bGF0aW9uLmFydGljdWxhdGlvbnMuYWNjZW50XHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIHBvc2l0aW9uOiBzdHJpbmcgPSBTbW9Pcm5hbWVudC5wb3NpdGlvbnMuYWJvdmU7XHJcbiAgb2Zmc2V0OiBudW1iZXIgPSAwO1xyXG4gIGFydGljdWxhdGlvbjogc3RyaW5nID0gU21vQXJ0aWN1bGF0aW9uLmFydGljdWxhdGlvbnMuYWNjZW50O1xyXG4gIGFkalg6IG51bWJlciA9IDA7XHJcblxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyIHtcclxuICAgIHZhciBwYXJhbXM6IFBhcnRpYWw8U21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVyc1Nlcj4gPSB7IGN0b3I6ICdTbW9BcnRpY3VsYXRpb24nfTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2VOb25EZWZhdWx0KFNtb0FydGljdWxhdGlvbi5kZWZhdWx0cyxcclxuICAgICAgU21vQXJ0aWN1bGF0aW9uLnBhcmFtZXRlckFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgaWYgKCFpc1Ntb0FydGljdWxhdGlvblBhcmFtZXRlcnNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnYmFkIGFydGljdWxhdGlvbiAnICsgSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnMpIHtcclxuICAgIHN1cGVyKCdTbW9BcnRpY3VsYXRpb24nKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vQXJ0aWN1bGF0aW9uLnBhcmFtZXRlckFycmF5LCBTbW9BcnRpY3VsYXRpb24uZGVmYXVsdHMsIHRoaXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9BcnRpY3VsYXRpb24ucGFyYW1ldGVyQXJyYXksIHBhcmFtZXRlcnMsIHRoaXMpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RvciA9IHBhcmFtZXRlcnMuc2VsZWN0b3I7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZleEFubm90YXRpb25QYXJhbXMge1xyXG4gIGdseXBoPzogc3RyaW5nLFxyXG4gIHN5bWJvbE1vZGlmaWVyPzogbnVtYmVyLFxyXG4gIHRleHQ/OiBzdHJpbmdcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBwZXJzaXN0LXkgcGFydHMgb2Yge0BsaW5rIFNtb0x5cmljUGFyYW1zfS4gV2UgZG9uJ3QgcGVyc2lzdCB0aGUgc2VsZWN0b3JcclxuICogc2luY2UgdGhhdCBjYW4gY2hhbmdlIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGFyZW50IG5vdGVcclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTHlyaWNQYXJhbXNTZXIgZXh0ZW5kcyBTbW9PYmplY3RQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGF0dHJpYnV0ZXMgZm9yIElEXHJcbiAgICovXHJcbiAgYXR0cnM6IFNtb0F0dHJzLFxyXG4gIC8qKlxyXG4gICAqIHRoZSBseXJpYyBmb250XHJcbiAgICovXHJcbiAgZm9udEluZm86IEZvbnRJbmZvLFxyXG4gIC8qKlxyXG4gICAqIGNsYXNzZXMgZm9yIHN0eWxpbmdcclxuICAgKi9cclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogd2hpY2ggdmVyc2UgdGhlIGx5cmljIGdvZXMgd2l0aFxyXG4gICAqL1xyXG4gIHZlcnNlOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogbHlyaWNzIGFyZSB1c2VkIGZvciBjaG9yZCBjaGFuZ2VzIG9yIGFubm90YXRpb25zLCBwYXJzZXIgaXMgZGlmZmVyZW50IGZvciBlYWNoXHJcbiAgICovXHJcbiAgcGFyc2VyOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHdlIHNob3VsZCBmb3JtYXQgZm9yIHRoZSB3aWR0aCBvZiB0aGUgbHlyaWNcclxuICAgKi9cclxuICBhZGp1c3ROb3RlV2lkdGhMeXJpYzogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgd2Ugc2hvdWxkIGZvcm1hdCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBjaG9yZFxyXG4gICAqL1xyXG4gIGFkanVzdE5vdGVXaWR0aENob3JkOiBib29sZWFuLFxyXG4gIC8qKlxyXG4gICAqIGZpbGwgY29sb3IgZm9yIHRleHRcclxuICAgKi9cclxuICBmaWxsOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogdHJhbnNsYXRlIHRvIGFsaWduIGx5cmljcy4gIFBvc3NpYmx5IHRoaXMgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkXHJcbiAgICovXHJcbiAgdHJhbnNsYXRlWDogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zbGF0ZSB0byBhbGlnbiBseXJpY3MuICBQb3NzaWJseSB0aGlzIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZFxyXG4gICAqL1xyXG4gIHRyYW5zbGF0ZVk6IG51bWJlcixcclxuICAvKipcclxuICAgKiB0aGUgYWN0dWFsIHRleHRcclxuICAgKi9cclxuICB0ZXh0OiBzdHJpbmcgfCBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU21vTHlyaWNQZXJzaXN0KHBhcmFtczogUGFydGlhbDxTbW9MeXJpY1BhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vTHlyaWNQYXJhbXNTZXIge1xyXG4gIGlmICh0eXBlb2YocGFyYW1zLmN0b3IpICE9PSAnc3RyaW5nJyB8fCBwYXJhbXMuY3RvciAhPT0gJ1Ntb0x5cmljJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogVXNlZCB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgU21vTHlyaWN9IGZvciBib3RoIGNob3JkcyBhbmQgbHlyaWNzXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTHlyaWNQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIHRoZSBseXJpYyBmb250XHJcbiAgICovXHJcbiAgZm9udEluZm86IEZvbnRJbmZvLFxyXG4gIC8qKlxyXG4gICAqIGNsYXNzZXMgZm9yIHN0eWxpbmdcclxuICAgKi9cclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogd2hpY2ggdmVyc2UgdGhlIGx5cmljIGdvZXMgd2l0aFxyXG4gICAqL1xyXG4gIHZlcnNlOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogbHlyaWNzIGFyZSB1c2VkIGZvciBjaG9yZCBjaGFuZ2VzIG9yIGFubm90YXRpb25zLCBwYXJzZXIgaXMgZGlmZmVyZW50IGZvciBlYWNoXHJcbiAgICovXHJcbiAgcGFyc2VyOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHdlIHNob3VsZCBmb3JtYXQgZm9yIHRoZSB3aWR0aCBvZiB0aGUgbHlyaWNcclxuICAgKi9cclxuICBhZGp1c3ROb3RlV2lkdGhMeXJpYzogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgd2Ugc2hvdWxkIGZvcm1hdCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBjaG9yZFxyXG4gICAqL1xyXG4gIGFkanVzdE5vdGVXaWR0aENob3JkOiBib29sZWFuLFxyXG4gIC8qKlxyXG4gICAqIGZpbGwgY29sb3IgZm9yIHRleHRcclxuICAgKi9cclxuICBmaWxsOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogdHJhbnNsYXRlIHRvIGFsaWduIGx5cmljcy4gIFBvc3NpYmx5IHRoaXMgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkXHJcbiAgICovXHJcbiAgdHJhbnNsYXRlWDogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zbGF0ZSB0byBhbGlnbiBseXJpY3MuICBQb3NzaWJseSB0aGlzIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZFxyXG4gICAqL1xyXG4gIHRyYW5zbGF0ZVk6IG51bWJlcixcclxuICAvKipcclxuICAgKiB0aGUgYWN0dWFsIHRleHRcclxuICAgKi9cclxuICB0ZXh0OiBzdHJpbmcgfCBudWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTbW9MeXJpYyBjb3ZlcnMgYm90aCBjaG9yZHMgYW5kIGx5cmljcy4gIFRoZSBwYXJzZXIgdGVsbHMgeW91IHdoaWNoXHJcbiAqIG9uZSB5b3UgZ2V0LlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU21vTHlyaWMgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgcGFyc2VyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgIGx5cmljOiAwLCBhbmF5bHlzaXM6IDEsIGNob3JkOiAyXHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vTHlyaWNQYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjdG9yOiAnU21vTHlyaWMnLFxyXG4gICAgICB0ZXh0OiAnXFx4YTAnLFxyXG4gICAgICBlbmRDaGFyOiAnJyxcclxuICAgICAgdmVyc2U6IDAsXHJcbiAgICAgIGZvbnRJbmZvOiB7XHJcbiAgICAgICAgc2l6ZTogMTIsXHJcbiAgICAgICAgZmFtaWx5OiAndGltZXMnLFxyXG4gICAgICAgIHN0eWxlOiAnbm9ybWFsJyxcclxuICAgICAgICB3ZWlnaHQ6ICdub3JtYWwnXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGw6ICdibGFjaycsXHJcbiAgICAgIGNsYXNzZXM6ICdzY29yZS10ZXh0JyxcclxuICAgICAgdHJhbnNsYXRlWDogMCxcclxuICAgICAgdHJhbnNsYXRlWTogMCxcclxuICAgICAgYWRqdXN0Tm90ZVdpZHRoTHlyaWM6IHRydWUsXHJcbiAgICAgIGFkanVzdE5vdGVXaWR0aENob3JkOiBmYWxzZSxcclxuICAgICAgcGFyc2VyOiBTbW9MeXJpYy5wYXJzZXJzLmx5cmljXHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgc3ltYm9sUG9zaXRpb24oKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBTVVBFUlNDUklQVDogMSxcclxuICAgICAgU1VCU0NSSVBUOiAyLFxyXG4gICAgICBOT1JNQUw6IDNcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGVyc2lzdEFycmF5KCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHJ2OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBTbW9MeXJpYy5kZWZhdWx0cykge1xyXG4gICAgICBydi5wdXNoKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFyYW1ldGVyQXJyYXkoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgcnYgPSBTbW9MeXJpYy5wZXJzaXN0QXJyYXk7XHJcbiAgICBydi5wdXNoKCdzZWxlY3RvcicsICd0ZXh0Jyk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBjdG9yOiBzdHJpbmcgPSAnU21vTHlyaWMnO1xyXG4gIHRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIGZvbnRJbmZvOiBGb250SW5mbyA9IHtcclxuICAgIHNpemU6IDEyLFxyXG4gICAgZmFtaWx5OiAnTWVycml3ZWF0aGVyJyxcclxuICAgIHN0eWxlOiAnbm9ybWFsJyxcclxuICAgIHdlaWdodDogJ25vcm1hbCdcclxuICB9O1xyXG4gIHBhcnNlcjogbnVtYmVyID0gU21vTHlyaWMucGFyc2Vycy5seXJpYztcclxuICBzZWxlY3Rvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIHVzZWQgYnkgVUlcclxuICBhZGp1c3ROb3RlV2lkdGhMeXJpYzogYm9vbGVhbiA9IHRydWU7XHJcbiAgYWRqdXN0Tm90ZVdpZHRoQ2hvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2ZXJzZTogbnVtYmVyID0gMDtcclxuICBza2lwUmVuZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsbDogc3RyaW5nID0gJyc7XHJcbiAgdHJhbnNsYXRlWDogbnVtYmVyID0gMDtcclxuICB0cmFuc2xhdGVZOiBudW1iZXIgPSAwO1xyXG4gIGNsYXNzZXM6IHN0cmluZyA9ICcnO1xyXG4gIC8vIHVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIGNhbGN1bGF0ZSBvZmZzZXRzIGZvciBhbGlnbmluZyBseXJpY3NcclxuICBhZGpYOiBudW1iZXIgPSAwO1xyXG4gIGFkalk6IG51bWJlciA9IDA7XHJcbiAgLy8gdXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gY2FsY3VsYXRlIHRoZSB5IG9mZnNldCBmb3IgbXVzaWMgdGhhdCBnb2VzIGJlbG93IHRoZSBzdGFmZlxyXG4gIG11c2ljWU9mZnNldDogbnVtYmVyID0gMDtcclxuICBoeXBoZW5YOiBudW1iZXIgPSAwO1xyXG4gIGRlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2VyaWFsaXplKCk6IFNtb0x5cmljUGFyYW1zU2VyIHtcclxuICAgIHZhciBwYXJhbXM6IFBhcnRpYWw8U21vTHlyaWNQYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vTHlyaWMnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9MeXJpYy5kZWZhdWx0cyxcclxuICAgICAgU21vTHlyaWMucGVyc2lzdEFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgaWYgKCFpc1Ntb0x5cmljUGVyc2lzdChwYXJhbXMpKSB7XHJcbiAgICAgIHRocm93ICdiYWQgbHlyaWMgJyArIEpTT04uc3RyaW5naWZ5KCdwYXJhbXMnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIC8vIEZvciBseXJpY3MsIHdlIGRlZmF1bHQgdG8gYWRqdXN0IG5vdGUgd2lkdGggb24gbHlyaWMgc2l6ZS4gIEZvciBjaG9yZHMsIHRoaXMgaXMgYWxtb3N0IG5ldmVyIHdoYXRcclxuICAvLyB5b3Ugd2FudCwgc28gaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuXHJcbiAgZ2V0IGFkanVzdE5vdGVXaWR0aCgpIHtcclxuICAgIHJldHVybiAodGhpcy5wYXJzZXIgPT09IFNtb0x5cmljLnBhcnNlcnMubHlyaWMpID8gdGhpcy5hZGp1c3ROb3RlV2lkdGhMeXJpYyA6IHRoaXMuYWRqdXN0Tm90ZVdpZHRoQ2hvcmQ7XHJcbiAgfVxyXG4gIHNldCBhZGp1c3ROb3RlV2lkdGgodmFsKSB7XHJcbiAgICBpZiAodGhpcy5wYXJzZXIgPT09IFNtb0x5cmljLnBhcnNlcnMubHlyaWMpIHtcclxuICAgICAgdGhpcy5hZGp1c3ROb3RlV2lkdGhMeXJpYyA9IHZhbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRqdXN0Tm90ZVdpZHRoQ2hvcmQgPSB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgZ2V0Q2xhc3NTZWxlY3RvclxyXG4gIC8vIHJldHVybnMgYSBzZWxlY3RvciB1c2VkIHRvIGZpbmQgdGhpcyB0ZXh0IGJsb2NrIHdpdGhpbiBhIG5vdGUuXHJcbiAgZ2V0Q2xhc3NTZWxlY3RvcigpOiBzdHJpbmcge1xyXG4gICAgdmFyIHBhcnNlciA9ICh0aGlzLnBhcnNlciA9PT0gU21vTHlyaWMucGFyc2Vycy5seXJpYyA/ICdseXJpYycgOiAnY2hvcmQnKTtcclxuICAgIHJldHVybiAnZy4nICsgcGFyc2VyICsgJy0nICsgdGhpcy52ZXJzZTtcclxuICB9XHJcblxyXG4gIHNldFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICAvLyBGb3IgY2hvcmRzLCB0cmltIGFsbCB3aGl0ZXNwYWNlXHJcbiAgICBpZiAodGhpcy5wYXJzZXIgIT09IFNtb0x5cmljLnBhcnNlcnMubHlyaWMpIHtcclxuICAgICAgaWYgKHRleHQudHJpbSgpLmxlbmd0aCkge1xyXG4gICAgICAgIHRleHQucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcclxuICB9XHJcblxyXG4gIGlzSHlwaGVuYXRlZCgpIHtcclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQudHJpbSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyID09PSBTbW9MeXJpYy5wYXJzZXJzLmx5cmljICYmXHJcbiAgICAgIHRleHQubGVuZ3RoICYmXHJcbiAgICAgIHRleHRbdGV4dC5sZW5ndGggLSAxXSA9PT0gJy0nO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dCgpIHtcclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQudHJpbSgpO1xyXG4gICAgaWYgKHRoaXMuaXNIeXBoZW5hdGVkKCkpIHtcclxuICAgICAgcmV0dXJuIHNtb1NlcmlhbGl6ZS50cnlQYXJzZVVuaWNvZGUodGV4dC5zdWJzdHIoMCwgdGV4dC5sZW5ndGggLSAxKSkudHJpbSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNtb1NlcmlhbGl6ZS50cnlQYXJzZVVuaWNvZGUodGV4dCk7XHJcbiAgfVxyXG5cclxuICBpc0Rhc2goKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUZXh0KCkubGVuZ3RoID09PSAwICYmIHRoaXMuaXNIeXBoZW5hdGVkKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX2Nob3JkR2x5cGhGcm9tQ29kZShjb2RlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBnZXRDaG9yZFN5bWJvbEdseXBoRnJvbUNvZGUoY29kZSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBfdG9rZW5pemVDaG9yZFN0cmluZyhzdHI6IHN0cmluZykge1xyXG4gICAgLy8gdmFyIHN0ciA9IHRoaXMuX3RleHQ7XHJcbiAgICBjb25zdCByZWcgPSAvXihbQS1afGEtenwwLTl8XSspL2c7XHJcbiAgICBsZXQgbW1tID0gc3RyLm1hdGNoKHJlZyk7XHJcbiAgICBsZXQgdG9rZVR5cGUgPSAnJztcclxuICAgIGxldCB0b2tlID0gJyc7XHJcbiAgICBjb25zdCB0b2tlbnMgPSBbXTtcclxuICAgIHdoaWxlIChzdHIubGVuZ3RoKSB7XHJcbiAgICAgIGlmICghbW1tKSB7XHJcbiAgICAgICAgdG9rZVR5cGUgPSBzdHJbMF07XHJcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZVR5cGUpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5zbGljZSgxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b2tlID0gbW1tWzBdLnN1YnN0cigwLCBtbW1bMF0ubGVuZ3RoKTtcclxuICAgICAgICBzdHIgPSBzdHIuc2xpY2UodG9rZS5sZW5ndGgsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgIHRva2Vucy5wdXNoKHRva2UpO1xyXG4gICAgICAgIHRva2VUeXBlID0gJyc7XHJcbiAgICAgICAgdG9rZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIG1tbSA9IHN0ci5tYXRjaChyZWcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRva2VucztcclxuICB9XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU21vTHlyaWNQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9MeXJpYycpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9MeXJpYy5wYXJhbWV0ZXJBcnJheSwgU21vTHlyaWMuZGVmYXVsdHMsIHRoaXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9MeXJpYy5wYXJhbWV0ZXJBcnJheSwgcGFyYW1ldGVycywgdGhpcyk7XHJcbiAgICBpZiAodHlwZW9mKHRoaXMuZm9udEluZm8uc2l6ZSkgIT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRoaXMuZm9udEluZm8uc2l6ZSA9IFNtb0x5cmljLmRlZmF1bHRzLmZvbnRJbmZvLnNpemU7XHJcbiAgICB9XHJcbiAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgbHlyaWMgdGV4dFxyXG4gICAgaWYgKHBhcmFtZXRlcnMudGV4dCkge1xyXG4gICAgICB0aGlzLnRleHQgPSBwYXJhbWV0ZXJzLnRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlZCBhZGp1c3RtZW50cyBmb3IgYWxpZ25tZW50IHB1cnBvc2VzXHJcbiAgICB0aGlzLmFkalkgPSAwO1xyXG4gICAgdGhpcy5hZGpYID0gMDtcclxuICAgIC8vIHRoaXMudmVyc2UgPSBwYXJzZUludCh0aGlzLnZlcnNlLCAxMCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmF0dHJzKSB7XHJcbiAgICAgIHRoaXMuYXR0cnMgPSB7XHJcbiAgICAgICAgaWQ6IGdldElkKCkudG9TdHJpbmcoKSxcclxuICAgICAgICB0eXBlOiAnU21vTHlyaWMnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHBlcnNpc3RlZCBiaXRzIG9mIHtAbGluayBTbW9EeW5hbWljVGV4dFBhcmFtc31cclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vRHluYW1pY1RleHRTZXIgZXh0ZW5kcyBTbW9PYmplY3RQYXJhbXMge1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICB4T2Zmc2V0OiBudW1iZXIsXHJcbiAgZm9udFNpemU6IG51bWJlcixcclxuICB5T2Zmc2V0TGluZTogbnVtYmVyLFxyXG4gIHlPZmZzZXRQaXhlbHM6IG51bWJlcixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFNtb0R5bmFtaWNUZXh0fVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0R5bmFtaWNUZXh0UGFyYW1zIGV4dGVuZHMgU21vRHluYW1pY1RleHRTZXIge1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICB4T2Zmc2V0OiBudW1iZXIsXHJcbiAgZm9udFNpemU6IG51bWJlcixcclxuICB5T2Zmc2V0TGluZTogbnVtYmVyLFxyXG4gIHlPZmZzZXRQaXhlbHM6IG51bWJlcixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG5cclxuLyoqXHJcbiAqIER5bmFtaWMgdGV4dCB0ZWxscyB5b3UgaG93IGxvdWQgbm90IHRvIHBsYXkuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9EeW5hbWljVGV4dCBleHRlbmRzIFNtb05vdGVNb2RpZmllckJhc2Uge1xyXG4gIHN0YXRpYyBnZXQgZHluYW1pY3MoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICAvLyBtYXRjaGVzIFZGLm1vZGlmaWVyXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBQUDogJ3BwJyxcclxuICAgICAgUDogJ3AnLFxyXG4gICAgICBNUDogJ21wJyxcclxuICAgICAgTUY6ICdtZicsXHJcbiAgICAgIEY6ICdmJyxcclxuICAgICAgRkY6ICdmZicsXHJcbiAgICAgIFNGWjogJ3NmeidcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vRHluYW1pY1RleHRQYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjdG9yOiAnU21vRHluYW1pY1RleHQnLFxyXG4gICAgICB4T2Zmc2V0OiAwLFxyXG4gICAgICBmb250U2l6ZTogZGVmYXVsdE5vdGVTY2FsZSxcclxuICAgICAgeU9mZnNldExpbmU6IDExLFxyXG4gICAgICB5T2Zmc2V0UGl4ZWxzOiAwLFxyXG4gICAgICB0ZXh0OiBTbW9EeW5hbWljVGV4dC5keW5hbWljcy5NUCxcclxuICAgIH0pKTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwZXJzaXN0QXJyYXkoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgcnY6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIGZvciAoY29uc3Qga2V5IGluIFNtb0R5bmFtaWNUZXh0LmRlZmF1bHRzKSB7XHJcbiAgICAgIHJ2LnB1c2goa2V5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJBcnJheSgpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBydiA9IFNtb0R5bmFtaWNUZXh0LnBlcnNpc3RBcnJheTtcclxuICAgIHJ2LnB1c2goJ3NlbGVjdG9yJyk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIHlPZmZzZXRMaW5lOiBudW1iZXIgPSAxMTtcclxuICB5T2Zmc2V0UGl4ZWxzOiBudW1iZXIgPSAwO1xyXG4gIHhPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgZm9udFNpemU6IG51bWJlciA9IGRlZmF1bHROb3RlU2NhbGU7XHJcbiAgc2VyaWFsaXplKCk6IG9iamVjdCB7XHJcbiAgICB2YXIgcGFyYW1zID0ge307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9EeW5hbWljVGV4dC5kZWZhdWx0cyxcclxuICAgICAgU21vRHluYW1pY1RleHQucGVyc2lzdEFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU21vRHluYW1pY1RleHRQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9EeW5hbWljVGV4dCcpO1xyXG4gICAgc21vU2VyaWFsaXplLnZleE1lcmdlKHRoaXMsIFNtb0R5bmFtaWNUZXh0LmRlZmF1bHRzKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5maWx0ZXJlZE1lcmdlKFNtb0R5bmFtaWNUZXh0LnBhcmFtZXRlckFycmF5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuYXR0cnMpIHtcclxuICAgICAgdGhpcy5hdHRycyA9IHtcclxuICAgICAgICBpZDogZ2V0SWQoKS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6ICdTbW9EeW5hbWljVGV4dCdcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYkJlbmQge1xyXG4gIGJlbmRUeXBlOiBudW1iZXIsXHJcbiAgcmVsZWFzZTogYm9vbGVhbixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9GcmV0UG9zaXRpb24ge1xyXG4gIHN0cmluZzogbnVtYmVyLFxyXG4gIGZyZXQ6IG51bWJlclxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYk5vdGVQYXJhbXMge1xyXG4gIHBvc2l0aW9uczogU21vRnJldFBvc2l0aW9uW11cclxuICBub3RlSWQ6IHN0cmluZyxcclxuICBmbGFnU3RhdGU6IG51bWJlcixcclxuICBmbGFnVGhyb3VnaDogYm9vbGVhbixcclxuICBub3RlSGVhZDogbnVtYmVyLFxyXG4gIGlzQXNzaWduZWQ6IGJvb2xlYW5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYk5vdGVQYXJhbXNTZXIgZXh0ZW5kcyBTbW9UYWJOb3RlUGFyYW1zIHtcclxuICBjdG9yOiBzdHJpbmdcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTbW9UYWJOb3RlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9UYWJOb3RlUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9UYWJOb3RlUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9UYWJOb3RlJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb1RhYk5vdGUgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb1RhYk5vdGVQYXJhbXMgIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgcG9zaXRpb25zOiBbXSxcclxuICAgICAgbm90ZUlkOiAnJyxcclxuICAgICAgaXNBc3NpZ25lZDogZmFsc2UsXHJcbiAgICAgIGZsYWdTdGF0ZTogU21vVGFiTm90ZS5mbGFnU3RhdGVzLk5vbmUsXHJcbiAgICAgIGZsYWdUaHJvdWdoOiBmYWxzZSxcclxuICAgICAgbm90ZUhlYWQ6IFNtb1RhYk5vdGUubm90ZUhlYWRzLm51bWJlclxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBwb3NpdGlvbnM6IFNtb0ZyZXRQb3NpdGlvbltdO1xyXG4gIG5vdGVJZDogc3RyaW5nO1xyXG4gIGlzQXNzaWduZWQ6IGJvb2xlYW47XHJcbiAgbm90ZUhlYWQ6IG51bWJlcjtcclxuICBmbGFnU3RhdGU6IG51bWJlcjtcclxuICBmbGFnVGhyb3VnaDogYm9vbGVhbjtcclxuICBzdGF0aWMgZ2V0IGZsYWdTdGF0ZXMoKSB7XHJcbiAgICByZXR1cm4geyBOb25lOiAwLCBVcDogMSwgRG93bjogLTEgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBub3RlSGVhZHMoKSB7XHJcbiAgICByZXR1cm4geyBudW1iZXI6IDAsIHg6IDEgfTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTbW9UYWJOb3RlUGFyYW1zKSB7XHJcbiAgICBzdXBlcignU21vVGFiTm90ZScpO1xyXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBwYXJhbXMucG9zaXRpb25zXHJcbiAgICB0aGlzLm5vdGVJZCA9ICBwYXJhbXMubm90ZUlkO1xyXG4gICAgdGhpcy5pc0Fzc2lnbmVkID0gcGFyYW1zLmlzQXNzaWduZWQ7XHJcbiAgICB0aGlzLm5vdGVIZWFkID0gcGFyYW1zLm5vdGVIZWFkO1xyXG4gICAgdGhpcy5mbGFnU3RhdGUgPSBwYXJhbXMuZmxhZ1N0YXRlO1xyXG4gICAgdGhpcy5mbGFnVGhyb3VnaCA9IHBhcmFtcy5mbGFnVGhyb3VnaDtcclxuICB9XHJcbiAgc2VyaWFsaXplKCk6IFNtb1RhYk5vdGVQYXJhbXNTZXIge1xyXG4gICAgdmFyIHBhcmFtcyA9IHsgY3RvcjogJ1Ntb1RhYk5vdGUnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9UYWJOb3RlLmRlZmF1bHRzLFxyXG4gICAgICBbJ3Bvc2l0aW9ucycsICdub3RlSWQnLCAnaXNBc3NpZ25lZCcsICdub3RlSGVhZCcsICdmbGFnU3RhdGUnLCAnZmxhZ1Rocm91Z2gnXSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNTbW9UYWJOb3RlUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBwYXJhbXMgaW4gU21vVGFiTm90ZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3Qgbm90ZU1vZGlmaWVyRHluYW1pY0N0b3JJbml0ID0gKCkgPT4ge1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9BcnBlZ2dpbyddID0gKHBhcmFtczogU21vQXJwZWdnaW9QYXJhbXMpID0+IG5ldyBTbW9BcnBlZ2dpbyhwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9NaWNyb3RvbmUnXSA9IChwYXJhbXM6IFNtb01pY3JvdG9uZVBhcmFtcykgPT4gbmV3IFNtb01pY3JvdG9uZShwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9Pcm5hbWVudCddID0gKHBhcmFtczogU21vT3JuYW1lbnRQYXJhbXMpID0+IG5ldyBTbW9Pcm5hbWVudChwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9HcmFjZU5vdGUnXSA9IChwYXJhbXM6IEdyYWNlTm90ZVBhcmFtcykgPT4gbmV3IFNtb0dyYWNlTm90ZShwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9BcnRpY3VsYXRpb24nXSA9IChwYXJhbXM6IFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnMpID0+IG5ldyBTbW9BcnRpY3VsYXRpb24ocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vTHlyaWMnXSA9IChwYXJhbXM6IFNtb0x5cmljUGFyYW1zKSA9PiBuZXcgU21vTHlyaWMocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vRHluYW1pY1RleHQnXSA9IChwYXJhbXM6IFNtb0R5bmFtaWNUZXh0UGFyYW1zKSA9PiBuZXcgU21vRHluYW1pY1RleHQocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vVGFiTm90ZSddID0gKHBhcmFtczogU21vVGFiTm90ZVBhcmFtcykgPT4gbmV3IFNtb1RhYk5vdGUocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vQ2xlZkNoYW5nZSddID0gKHBhcmFtczogU21vQ2xlZkNoYW5nZVBhcmFtcykgPT4gbmV3IFNtb0NsZWZDaGFuZ2UocGFyYW1zKTtcclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/smo/data/noteModifiers.ts\n");
537
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoArpeggio: () => (/* binding */ SmoArpeggio),\n/* harmony export */ SmoArpeggioTypes: () => (/* binding */ SmoArpeggioTypes),\n/* harmony export */ SmoArticulation: () => (/* binding */ SmoArticulation),\n/* harmony export */ SmoClefChange: () => (/* binding */ SmoClefChange),\n/* harmony export */ SmoDynamicText: () => (/* binding */ SmoDynamicText),\n/* harmony export */ SmoGraceNote: () => (/* binding */ SmoGraceNote),\n/* harmony export */ SmoLyric: () => (/* binding */ SmoLyric),\n/* harmony export */ SmoMicrotone: () => (/* binding */ SmoMicrotone),\n/* harmony export */ SmoNoteModifierBase: () => (/* binding */ SmoNoteModifierBase),\n/* harmony export */ SmoOrnament: () => (/* binding */ SmoOrnament),\n/* harmony export */ SmoTabNote: () => (/* binding */ SmoTabNote),\n/* harmony export */ isArpeggioType: () => (/* binding */ isArpeggioType),\n/* harmony export */ isClefChangeParamsSer: () => (/* binding */ isClefChangeParamsSer),\n/* harmony export */ noteModifierDynamicCtorInit: () => (/* binding */ noteModifierDynamicCtorInit)\n/* harmony export */ });\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * A note modifier is anything that is mapped to the note, but not part of the\n * pitch itself. This includes grace notes, and note-text like lyrics.\n * @module /smo/data/noteModifiers\n */\n\n\n\n\n/**\n * A note modifier is anything that is mapped to the note, but not part of the\n * pitch itself. This includes grace notes, and note-text like lyrics.\n * All note modifiers have a serialize method and a 'ctor' parameter or deserialization\n * @category SmoObject\n */\nclass SmoNoteModifierBase {\n constructor(ctor) {\n this.logicalBox = null;\n this.element = null;\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: ctor\n };\n this.ctor = ctor;\n }\n static deserialize(jsonObj) {\n // Handle backwards-compatibility thing\n if (jsonObj.ctor === 'SmoMicrotone' && typeof (jsonObj.pitch) === 'number') {\n jsonObj.pitchIndex = jsonObj.pitch;\n }\n if (jsonObj.ctor === 'SmoLyric') {\n if (typeof (jsonObj._text) === 'string') {\n jsonObj.text = jsonObj._text;\n }\n }\n if (typeof (_common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor[jsonObj.ctor]) === 'undefined') {\n console.log('ouch bad ctor for ' + jsonObj.ctor);\n }\n try {\n const rv = _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor[jsonObj.ctor](jsonObj);\n return rv;\n }\n catch (exp) {\n console.error('no ctor for ' + jsonObj.ctor);\n throw (exp);\n }\n }\n}\nfunction isClefChangeParamsSer(params) {\n if (typeof (params.clef) === 'string' && params.ctor === 'SmoClefChange') {\n return true;\n }\n return false;\n}\n/**\n * @category SmoObject\n */\nclass SmoClefChange extends SmoNoteModifierBase {\n static get defaults() {\n const rv = JSON.parse(JSON.stringify({\n clef: 'treble',\n ctor: 'SmoClefChange',\n attrs: {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)(),\n type: 'SmoClefChange'\n }\n }));\n return rv;\n }\n constructor(clefParams) {\n super('SmoClefChange');\n const clef = clefParams.clef;\n if (!(0,_common__WEBPACK_IMPORTED_MODULE_0__.IsClef)(clef)) {\n this.clef = 'treble';\n }\n else {\n this.clef = clef;\n }\n }\n serialize() {\n const params = { ctor: 'SmoClefChange' };\n params.clef = this.clef;\n if (!isClefChangeParamsSer(params)) {\n throw ('corrupt clef change');\n }\n return params;\n }\n}\nfunction isGraceNoteParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoGraceNote') {\n return false;\n }\n return true;\n}\n/**\n * A grace notes has many of the things an 'actual' note can have, but it doesn't take up\n * time against the time signature\n * @category SmoObject\n */\nclass SmoGraceNote extends SmoNoteModifierBase {\n static get flagStates() {\n return { auto: 0, up: 1, down: 2 };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n flagState: SmoGraceNote.flagStates.auto,\n noteType: 'n',\n beamBeats: 4096,\n endBeam: false,\n clef: 'treble',\n slash: false,\n ticks: {\n numerator: 4096,\n denominator: 1,\n remainder: 0\n },\n pitches: [{\n letter: 'b',\n octave: 4,\n accidental: ''\n }]\n }));\n }\n // TODO: Matches SmoNote - move to SmoMusic?\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoGraceNote.defaults) {\n rv.push(key);\n }\n return rv;\n }\n tickCount() {\n return this.ticks.numerator / this.ticks.denominator + this.ticks.remainder;\n }\n toVexGraceNote() {\n const p = _music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.smoPitchesToVex(this.pitches);\n const rv = { duration: _music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.closestVexDuration(this.tickCount()), keys: p, slash: this.slash };\n return rv;\n }\n serialize() {\n const params = { ctor: 'SmoGraceNote' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoGraceNote.defaults, SmoGraceNote.parameterArray, this, params);\n if (!isGraceNoteParamsSer(params)) {\n throw 'bad grace note ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoGraceNote');\n this.ticks = SmoGraceNote.defaults.ticks;\n this.pitches = [];\n this.slash = false;\n this.clef = 'treble';\n this.noteType = 'n';\n this.renderId = null;\n this.hasTabNote = false;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoGraceNote.parameterArray, SmoGraceNote.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoGraceNote.parameterArray, parameters, this);\n }\n}\nconst SmoArpeggioTypes = ['directionless', 'rasquedo_up', 'rasquedo_down',\n 'roll_up', 'roll_down', 'brush_up', 'brush_down', 'none'];\nfunction isSmoArpeggionParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoArpeggio') {\n return false;\n }\n return true;\n}\nfunction isArpeggioType(tp) {\n return SmoArpeggioTypes.indexOf(tp) >= 0;\n}\n/**\n * A 'splatter' symbol next to a chord.\n * @category SmoObject\n */\nclass SmoArpeggio extends SmoNoteModifierBase {\n static get types() {\n if (typeof (SmoArpeggio._types['directionless']) === 'undefined') {\n SmoArpeggio._types['directionless'] = 7;\n SmoArpeggio._types['rasquedo_up'] = 6;\n SmoArpeggio._types['rasquedo_down'] = 5;\n SmoArpeggio._types['roll_up'] = 4;\n SmoArpeggio._types['roll_down'] = 3;\n SmoArpeggio._types['brush_up'] = 2;\n SmoArpeggio._types['brush_down'] = 1;\n SmoArpeggio._types['none'] = 0;\n }\n return SmoArpeggio._types;\n }\n constructor(params) {\n super('SmoArpeggio');\n this.typeCode = SmoArpeggio.types[params.type];\n }\n get typeString() {\n const str = SmoArpeggioTypes.find((x) => SmoArpeggio.types[x] === this.typeCode);\n const type = str ? str : 'none';\n return type;\n }\n serialize() {\n const rv = { ctor: 'SmoArpeggio' };\n const str = SmoArpeggioTypes.find((x) => SmoArpeggio.types[x] === this.typeCode);\n rv.type = str ? str : 'none';\n if (!isSmoArpeggionParamsSer(rv)) {\n throw 'bad arpeggio ' + JSON.stringify(rv);\n }\n return rv;\n }\n}\nSmoArpeggio._types = {};\nfunction isSmoMicrotoneParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoMicrotone') {\n return false;\n }\n return true;\n}\n/**\n * Microtones are treated similarly to ornaments. There are not\n * rules for persisting throughout a measure, cancel etc.\n * @category SmoObject\n*/\nclass SmoMicrotone extends SmoNoteModifierBase {\n get toPitchCoeff() {\n return SmoMicrotone.pitchCoeff[this.tone];\n }\n get toVex() {\n return SmoMicrotone.smoToVex[this.tone];\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoMicrotone.defaults) {\n rv.push(key);\n }\n return rv;\n }\n serialize() {\n const params = { ctor: 'SmoMicrotone' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoMicrotone.defaults, SmoMicrotone.parameterArray, this, params);\n if (!isSmoMicrotoneParamsSer(params)) {\n throw 'bad microtone ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super(parameters.ctor);\n this.pitchIndex = 0;\n this.pitchIndex = parameters.pitch;\n this.tone = parameters.tone;\n }\n}\n// This is how VexFlow notates them\nSmoMicrotone.smoToVex = {\n flat75sz: 'db',\n flat25sz: 'd',\n flat25ar: 'bs',\n flat125ar: 'afhf',\n sharp75: '++',\n sharp125: 'ashs',\n sharp25: '+',\n sori: 'o',\n koron: 'k'\n};\n// The audio frequency offsets\nSmoMicrotone.pitchCoeff = {\n flat75sz: -1.5,\n flat25sz: -0.5,\n flat25ar: -0.5,\n flat125ar: -2.5,\n sharp75: 1.5,\n sharp125: 2.5,\n sharp25: 0.5,\n sori: 0.5,\n koron: -0.5\n};\nSmoMicrotone.defaults = {\n ctor: 'SmoMicrotone',\n tone: 'flat25sz',\n pitch: 0\n};\nfunction isSmoOrnamentParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoOrnament') {\n return false;\n }\n return true;\n}\n/**\n * Ornaments map to vex ornaments. articulations vs. ornaments\n * is kind of arbitrary\n * @category SmoObject\n */\nclass SmoOrnament extends SmoNoteModifierBase {\n static get jazzOrnaments() {\n return ['scoop', 'fallLong', 'doit', 'doitLong', 'flip', 'smear', 'scoop', 'plungerOpen', 'plungerClosed', 'bend'];\n }\n static get legacyJazz() {\n return { 'SCOOP': SmoOrnament.ornaments.scoop,\n 'FALL_SHORT': SmoOrnament.ornaments.fall,\n 'FALL_LONG': SmoOrnament.ornaments.fallLong,\n 'DOIT': SmoOrnament.ornaments.doit,\n 'LIFT': SmoOrnament.ornaments.lift,\n 'FLIP': SmoOrnament.ornaments.flip,\n 'SMEAR': SmoOrnament.ornaments.smear\n };\n }\n toVex() {\n return SmoOrnament.ornaments[this.ornament];\n }\n isJazz() {\n return SmoOrnament.jazzOrnaments.indexOf(this.ornament) >= 0;\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoOrnament.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get positions() {\n return {\n above: 'above',\n below: 'below',\n auto: 'auto'\n };\n }\n static get offsets() {\n return {\n on: 'on',\n after: 'after'\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoOrnament',\n ornament: SmoOrnament.ornaments.mordent,\n position: SmoOrnament.positions.auto,\n offset: SmoOrnament.offsets.on\n }));\n }\n serialize() {\n var params = { ctor: 'SmoOrnament' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoOrnament.defaults, SmoOrnament.parameterArray, this, params);\n if (!isSmoOrnamentParamsSer(params)) {\n throw 'bad ornament ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoOrnament');\n this.position = SmoOrnament.positions.above;\n this.offset = 'on';\n this.ornament = SmoOrnament.ornaments.mordent;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoOrnament.parameterArray, SmoOrnament.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoOrnament.parameterArray, parameters, this);\n // handle some legacy changes\n if (typeof (SmoOrnament.legacyJazz[this.ornament]) === 'string') {\n this.ornament = SmoOrnament.legacyJazz[this.ornament];\n }\n }\n}\nSmoOrnament.ornaments = {\n mordent: 'mordent',\n mordent_inverted: 'mordent_inverted',\n turn: 'turn',\n turn_inverted: 'turn_inverted',\n trill: 'tr',\n upprall: 'upprall',\n prallup: 'prallup',\n pralldown: 'pralldown',\n upmordent: 'upmordent',\n downmordent: 'downmordent',\n caesura: 'caesura',\n lineprall: 'lineprall',\n prallprall: 'prallprall',\n scoop: 'scoop',\n fall: 'fall',\n fallLong: 'fallLong',\n breath: 'breath',\n doit: 'doit',\n doitLong: 'doitLong',\n flip: 'flip',\n smear: 'smear',\n bend: 'bend',\n plungerClosed: 'plungerClosed',\n plungerOpen: 'plungerOpen'\n};\nSmoOrnament.xmlOrnaments = {\n mordent: 'mordent',\n mordent_inverted: 'inverted-mordent',\n turn: 'turn',\n turn_inverted: 'inverted-turn',\n upmordent: 'mordent',\n downmordent: 'mordent',\n lineprall: 'schleifer',\n prallprall: 'schleifer',\n prallup: 'schleifer',\n tr: 'trill-mark'\n};\nSmoOrnament.textNoteOrnaments = {\n breath: 'breath',\n caesura: 'caesura_straight'\n};\n// jazz ornaments in vex are articulations in music xml\nSmoOrnament.xmlJazz = {\n doit: 'doit',\n scoop: 'scoop',\n dropLong: 'falloff',\n drop: 'plop'\n};\nfunction isSmoArticulationParametersSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoArticulation') {\n return false;\n }\n return true;\n}\n/**\n * Articulations map to notes, can be placed above/below\n * @category SmoObject\n */\nclass SmoArticulation extends SmoNoteModifierBase {\n static get articulations() {\n return {\n accent: 'accent',\n staccato: 'staccato',\n marcato: 'marcato',\n tenuto: 'tenuto',\n upStroke: 'upStroke',\n downStroke: 'downStroke',\n pizzicato: 'pizzicato',\n bowUp: 'bowUp',\n bowDown: 'bowDown',\n fermata: 'fermata'\n };\n }\n static get positions() {\n return {\n above: 'above',\n below: 'below',\n auto: 'auto'\n };\n }\n static get articulationToVex() {\n return {\n accent: 'a>',\n staccato: 'a.',\n marcato: 'a^',\n tenuto: 'a-',\n upStroke: 'a|',\n downStroke: 'am',\n pizzicato: 'ao',\n fermata: 'a@a'\n };\n }\n static get vexToArticulation() {\n return {\n 'a>': 'accent',\n 'a.': 'staccato',\n 'a^': 'marcato',\n 'a-': 'tenuto',\n 'a|': 'upStroke',\n 'am': 'downStroke',\n 'ao': 'pizzicato',\n 'a@a': 'fermata'\n };\n }\n static get parameterArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoArticulation.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get positionToVex() {\n return {\n 'above': 3,\n 'below': 4\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoArticulation',\n position: SmoArticulation.positions.above,\n articulation: SmoArticulation.articulations.accent\n }));\n }\n serialize() {\n var params = { ctor: 'SmoArticulation' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoArticulation.defaults, SmoArticulation.parameterArray, this, params);\n if (!isSmoArticulationParametersSer(params)) {\n throw 'bad articulation ' + JSON.stringify(params);\n }\n return params;\n }\n constructor(parameters) {\n super('SmoArticulation');\n this.position = SmoOrnament.positions.above;\n this.offset = 0;\n this.articulation = SmoArticulation.articulations.accent;\n this.adjX = 0;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoArticulation.parameterArray, SmoArticulation.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoArticulation.parameterArray, parameters, this);\n // this.selector = parameters.selector;\n }\n}\nSmoArticulation.xmlArticulations = {\n accent: 'accent',\n staccato: 'staccato',\n tenuto: 'tenuto',\n marcato: 'strong-accent'\n};\nfunction isSmoLyricPersist(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoLyric') {\n return false;\n }\n return true;\n}\n/**\n * SmoLyric covers both chords and lyrics. The parser tells you which\n * one you get.\n * @category SmoObject\n */\nclass SmoLyric extends SmoNoteModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoLyric',\n text: '\\xa0',\n endChar: '',\n verse: 0,\n fontInfo: {\n size: 12,\n family: 'times',\n style: 'normal',\n weight: 'normal'\n },\n fill: 'black',\n classes: 'score-text',\n translateX: 0,\n translateY: 0,\n adjustNoteWidthLyric: true,\n adjustNoteWidthChord: false,\n parser: SmoLyric.parsers.lyric\n }));\n }\n static get symbolPosition() {\n return {\n SUPERSCRIPT: 1,\n SUBSCRIPT: 2,\n NORMAL: 3\n };\n }\n static get persistArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoLyric.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get parameterArray() {\n const rv = SmoLyric.persistArray;\n rv.push('selector', 'text');\n return rv;\n }\n serialize() {\n var params = { ctor: 'SmoLyric' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoLyric.defaults, SmoLyric.persistArray, this, params);\n if (!isSmoLyricPersist(params)) {\n throw 'bad lyric ' + JSON.stringify('params');\n }\n return params;\n }\n // For lyrics, we default to adjust note width on lyric size. For chords, this is almost never what\n // you want, so it is off by default.\n get adjustNoteWidth() {\n return (this.parser === SmoLyric.parsers.lyric) ? this.adjustNoteWidthLyric : this.adjustNoteWidthChord;\n }\n set adjustNoteWidth(val) {\n if (this.parser === SmoLyric.parsers.lyric) {\n this.adjustNoteWidthLyric = val;\n }\n else {\n this.adjustNoteWidthChord = val;\n }\n }\n // ### getClassSelector\n // returns a selector used to find this text block within a note.\n getClassSelector() {\n var parser = (this.parser === SmoLyric.parsers.lyric ? 'lyric' : 'chord');\n return 'g.' + parser + '-' + this.verse;\n }\n setText(text) {\n // For chords, trim all whitespace\n if (this.parser !== SmoLyric.parsers.lyric) {\n if (text.trim().length) {\n text.replace(/\\s/g, '');\n }\n }\n this.text = text;\n }\n isHyphenated() {\n const text = this.text.trim();\n return this.parser === SmoLyric.parsers.lyric &&\n text.length &&\n text[text.length - 1] === '-';\n }\n getText() {\n const text = this.text.trim();\n if (this.isHyphenated()) {\n return _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.tryParseUnicode(text.substr(0, text.length - 1)).trim();\n }\n return _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.tryParseUnicode(text);\n }\n isDash() {\n return this.getText().length === 0 && this.isHyphenated();\n }\n static _chordGlyphFromCode(code) {\n return (0,_common_vex__WEBPACK_IMPORTED_MODULE_3__.getChordSymbolGlyphFromCode)(code);\n }\n static _tokenizeChordString(str) {\n // var str = this._text;\n const reg = /^([A-Z|a-z|0-9|]+)/g;\n let mmm = str.match(reg);\n let tokeType = '';\n let toke = '';\n const tokens = [];\n while (str.length) {\n if (!mmm) {\n tokeType = str[0];\n tokens.push(tokeType);\n str = str.slice(1, str.length);\n }\n else {\n toke = mmm[0].substr(0, mmm[0].length);\n str = str.slice(toke.length, str.length);\n tokens.push(toke);\n tokeType = '';\n toke = '';\n }\n mmm = str.match(reg);\n }\n return tokens;\n }\n constructor(parameters) {\n super('SmoLyric');\n this.ctor = 'SmoLyric';\n this.text = '';\n this.fontInfo = {\n size: 12,\n family: 'Merriweather',\n style: 'normal',\n weight: 'normal'\n };\n this.parser = SmoLyric.parsers.lyric;\n this.selector = null; // used by UI\n this.adjustNoteWidthLyric = true;\n this.adjustNoteWidthChord = false;\n this.verse = 0;\n this.skipRender = false;\n this.fill = '';\n this.translateX = 0;\n this.translateY = 0;\n this.classes = '';\n // used by the renderer to calculate offsets for aligning lyrics\n this.adjX = 0;\n this.adjY = 0;\n // used by the renderer to calculate the y offset for music that goes below the staff\n this.musicYOffset = 0;\n this.hyphenX = 0;\n this.deleted = false;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoLyric.parameterArray, SmoLyric.defaults, this);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMerge(SmoLyric.parameterArray, parameters, this);\n if (typeof (this.fontInfo.size) !== 'number') {\n this.fontInfo.size = SmoLyric.defaults.fontInfo.size;\n }\n // backwards-compatibility for lyric text\n if (parameters.text) {\n this.text = parameters.text;\n }\n // calculated adjustments for alignment purposes\n this.adjY = 0;\n this.adjX = 0;\n // this.verse = parseInt(this.verse, 10);\n if (!this.attrs) {\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: 'SmoLyric'\n };\n }\n }\n}\nSmoLyric.parsers = {\n lyric: 0, anaylysis: 1, chord: 2\n};\n/**\n * Dynamic text tells you how loud not to play.\n * @category SmoObject\n */\nclass SmoDynamicText extends SmoNoteModifierBase {\n static get dynamics() {\n // matches VF.modifier\n return {\n PP: 'pp',\n P: 'p',\n MP: 'mp',\n MF: 'mf',\n F: 'f',\n FF: 'ff',\n SFZ: 'sfz'\n };\n }\n static get defaults() {\n return JSON.parse(JSON.stringify({\n ctor: 'SmoDynamicText',\n xOffset: 0,\n fontSize: _common_vex__WEBPACK_IMPORTED_MODULE_3__.defaultNoteScale,\n yOffsetLine: 11,\n yOffsetPixels: 0,\n text: SmoDynamicText.dynamics.MP,\n }));\n }\n static get persistArray() {\n const rv = [];\n // eslint-disable-next-line\n for (const key in SmoDynamicText.defaults) {\n rv.push(key);\n }\n return rv;\n }\n static get parameterArray() {\n const rv = SmoDynamicText.persistArray;\n rv.push('selector');\n return rv;\n }\n serialize() {\n var params = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoDynamicText.defaults, SmoDynamicText.persistArray, this, params);\n return params;\n }\n constructor(parameters) {\n super('SmoDynamicText');\n this.text = '';\n this.yOffsetLine = 11;\n this.yOffsetPixels = 0;\n this.xOffset = 0;\n this.fontSize = _common_vex__WEBPACK_IMPORTED_MODULE_3__.defaultNoteScale;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.vexMerge(this, SmoDynamicText.defaults);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.filteredMerge(SmoDynamicText.parameterArray, parameters, this);\n if (!this.attrs) {\n this.attrs = {\n id: (0,_common__WEBPACK_IMPORTED_MODULE_0__.getId)().toString(),\n type: 'SmoDynamicText'\n };\n }\n }\n}\nfunction isSmoTabNoteParamsSer(params) {\n if (typeof (params.ctor) !== 'string' || params.ctor !== 'SmoTabNote') {\n return false;\n }\n return true;\n}\n/**\n * @category SmoObject\n */\nclass SmoTabNote extends SmoNoteModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n positions: [],\n noteId: '',\n isAssigned: false,\n flagState: SmoTabNote.flagStates.None,\n flagThrough: false,\n noteHead: SmoTabNote.noteHeads.number\n }));\n }\n static get flagStates() {\n return { None: 0, Up: 1, Down: -1 };\n }\n static get noteHeads() {\n return { number: 0, x: 1 };\n }\n constructor(params) {\n super('SmoTabNote');\n this.positions = params.positions;\n this.noteId = params.noteId;\n this.isAssigned = params.isAssigned;\n this.noteHead = params.noteHead;\n this.flagState = params.flagState;\n this.flagThrough = params.flagThrough;\n }\n serialize() {\n var params = { ctor: 'SmoTabNote' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_1__.smoSerialize.serializedMergeNonDefault(SmoTabNote.defaults, ['positions', 'noteId', 'isAssigned', 'noteHead', 'flagState', 'flagThrough'], this, params);\n if (!isSmoTabNoteParamsSer(params)) {\n throw 'bad params in SmoTabNote';\n }\n return params;\n }\n}\nconst noteModifierDynamicCtorInit = () => {\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoArpeggio'] = (params) => new SmoArpeggio(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoMicrotone'] = (params) => new SmoMicrotone(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoOrnament'] = (params) => new SmoOrnament(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoGraceNote'] = (params) => new SmoGraceNote(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoArticulation'] = (params) => new SmoArticulation(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoLyric'] = (params) => new SmoLyric(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoDynamicText'] = (params) => new SmoDynamicText(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoTabNote'] = (params) => new SmoTabNote(params);\n _common__WEBPACK_IMPORTED_MODULE_0__.SmoDynamicCtor['SmoClefChange'] = (params) => new SmoClefChange(params);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZGLG1EQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQWlDLEVBQUUsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZHLG1EQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RSxtREFBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUE0QixFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRyxtREFBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBd0IsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEYsbURBQWMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQTJCLEVBQUUsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvc21vL2RhdGEvbm90ZU1vZGlmaWVycy50cz84NDg5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQSBub3RlIG1vZGlmaWVyIGlzIGFueXRoaW5nIHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBub3RlLCBidXQgbm90IHBhcnQgb2YgdGhlXHJcbiAqIHBpdGNoIGl0c2VsZi4gIFRoaXMgaW5jbHVkZXMgZ3JhY2Ugbm90ZXMsIGFuZCBub3RlLXRleHQgbGlrZSBseXJpY3MuXHJcbiAqIEBtb2R1bGUgL3Ntby9kYXRhL25vdGVNb2RpZmllcnNcclxuICovXHJcbmltcG9ydCB7IFNtb0F0dHJzLCBUaWNrcywgUGl0Y2gsIGdldElkLCBTbW9PYmplY3RQYXJhbXMsIFRyYW5zcG9zYWJsZSwgU3ZnQm94LCBTbW9Nb2RpZmllckJhc2UsIFxyXG4gIENsZWYsIElzQ2xlZiwgU21vRHluYW1pY0N0b3IgfSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi9tdXNpYyc7XHJcbmltcG9ydCB7IGRlZmF1bHROb3RlU2NhbGUsIEZvbnRJbmZvLCBnZXRDaG9yZFN5bWJvbEdseXBoRnJvbUNvZGUgfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuXHJcbi8qKlxyXG4gKiBBIG5vdGUgbW9kaWZpZXIgaXMgYW55dGhpbmcgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIG5vdGUsIGJ1dCBub3QgcGFydCBvZiB0aGVcclxuICogcGl0Y2ggaXRzZWxmLiAgVGhpcyBpbmNsdWRlcyBncmFjZSBub3RlcywgYW5kIG5vdGUtdGV4dCBsaWtlIGx5cmljcy5cclxuICogQWxsIG5vdGUgbW9kaWZpZXJzIGhhdmUgYSBzZXJpYWxpemUgbWV0aG9kIGFuZCBhICdjdG9yJyBwYXJhbWV0ZXIgb3IgZGVzZXJpYWxpemF0aW9uXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIGltcGxlbWVudHMgU21vTW9kaWZpZXJCYXNlIHtcclxuICBhdHRyczogU21vQXR0cnM7XHJcbiAgY3Rvcjogc3RyaW5nO1xyXG4gIGxvZ2ljYWxCb3g6IFN2Z0JveCB8IG51bGwgPSBudWxsO1xyXG4gIGVsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBjb25zdHJ1Y3RvcihjdG9yOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXR0cnMgPSB7XHJcbiAgICAgIGlkOiBnZXRJZCgpLnRvU3RyaW5nKCksXHJcbiAgICAgIHR5cGU6IGN0b3JcclxuICAgIH07XHJcbiAgICB0aGlzLmN0b3IgPSBjdG9yO1xyXG4gIH1cclxuICBzdGF0aWMgZGVzZXJpYWxpemUoanNvbk9iajogU21vT2JqZWN0UGFyYW1zKSB7XHJcbiAgICAvLyBIYW5kbGUgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgdGhpbmdcclxuICAgIGlmIChqc29uT2JqLmN0b3IgPT09ICdTbW9NaWNyb3RvbmUnICYmIHR5cGVvZiAoKGpzb25PYmogYXMgYW55KS5waXRjaCkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIChqc29uT2JqIGFzIGFueSkucGl0Y2hJbmRleCA9IChqc29uT2JqIGFzIGFueSkucGl0Y2g7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai5jdG9yID09PSAnU21vTHlyaWMnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YoKGpzb25PYmogYXMgYW55KS5fdGV4dCkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgKGpzb25PYmogYXMgYW55KS50ZXh0ID0gKGpzb25PYmogYXMgYW55KS5fdGV4dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiAoU21vRHluYW1pY0N0b3JbanNvbk9iai5jdG9yXSkgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdvdWNoIGJhZCBjdG9yIGZvciAnICsganNvbk9iai5jdG9yKTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJ2ID0gU21vRHluYW1pY0N0b3JbanNvbk9iai5jdG9yXShqc29uT2JqKTtcclxuICAgICAgcmV0dXJuIHJ2O1xyXG4gICAgfSBjYXRjaCAoZXhwKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ25vIGN0b3IgZm9yICcgKyBqc29uT2JqLmN0b3IpO1xyXG4gICAgICB0aHJvdyhleHApO1xyXG4gICAgfVxyXG4gIH1cclxuICBhYnN0cmFjdCBzZXJpYWxpemUoKTogYW55O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xlZkNoYW5nZVBhcmFtc1NlcihwYXJhbXM6IFBhcnRpYWw8U21vQ2xlZkNoYW5nZVBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vQ2xlZkNoYW5nZVBhcmFtc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY2xlZikgPT09ICdzdHJpbmcnICYmIHBhcmFtcy5jdG9yID09PSAnU21vQ2xlZkNoYW5nZScpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vQ2xlZkNoYW5nZVBhcmFtcyAge1xyXG4gIGNsZWY6IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyIGV4dGVuZHMgU21vQ2xlZkNoYW5nZVBhcmFtcyB7XHJcbiAgLyoqXHJcbiAgICogY29uc3RydWN0b3JcclxuICAgKi9cclxuICAgIGN0b3I6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogYXR0cmlidXRlcyBmb3IgSURcclxuICAgICAqL1xyXG4gICAgYXR0cnM6IFNtb0F0dHJzO1xyXG59XHJcblxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb0NsZWZDaGFuZ2UgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICBjbGVmOiBDbGVmO1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKSB7XHJcbiAgICBjb25zdCBydjogU21vQ2xlZkNoYW5nZVBhcmFtc1NlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjbGVmOiAndHJlYmxlJyxcclxuICAgICAgY3RvcjogJ1Ntb0NsZWZDaGFuZ2UnLFxyXG4gICAgICBhdHRyczoge1xyXG4gICAgICAgIGlkOiBnZXRJZCgpLFxyXG4gICAgICAgIHR5cGU6ICdTbW9DbGVmQ2hhbmdlJ1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKGNsZWZQYXJhbXM6IFNtb0NsZWZDaGFuZ2VQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9DbGVmQ2hhbmdlJyk7XHJcbiAgICBjb25zdCBjbGVmID0gY2xlZlBhcmFtcy5jbGVmO1xyXG4gICAgaWYgKCFJc0NsZWYoY2xlZikpIHtcclxuICAgICAgdGhpcy5jbGVmID0gJ3RyZWJsZSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWYgPSBjbGVmIGFzIENsZWY7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyIHtcclxuICAgIGNvbnN0IHBhcmFtczogUGFydGlhbDxTbW9DbGVmQ2hhbmdlUGFyYW1zU2VyPiA9IHsgY3RvcjogJ1Ntb0NsZWZDaGFuZ2UnIH07XHJcbiAgICBwYXJhbXMuY2xlZiA9IHRoaXMuY2xlZjtcclxuICAgIGlmICghaXNDbGVmQ2hhbmdlUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3coJ2NvcnJ1cHQgY2xlZiBjaGFuZ2UnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiB1c2VkIHRvIGNvbnN0cnVjdCB7QGxpbmsgU21vR3JhY2VOb3RlfVxyXG4gKiAgIGJlYW0gZ3JvdXAuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JhY2VOb3RlUGFyYW1zIGV4dGVuZHMgU21vTW9kaWZpZXJCYXNlIHtcclxuICAvKipcclxuICAgKiB1cCwgZG93biwgb3IgYXV0b1xyXG4gICAqL1xyXG4gIGZsYWdTdGF0ZTogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHNhbWUgYXMgZm9yIHtAbGluayBTbW9Ob3RlfVxyXG4gICAqL1xyXG4gIG5vdGVUeXBlOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogc2FtZSBhcyBmb3Ige0BsaW5rIFNtb05vdGV9XHJcbiAgICovXHJcbiAgYmVhbUJlYXRzOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogc2FtZSBhcyBmb3Ige0BsaW5rIFNtb05vdGV9LiAgSW5kaWNhdGVzIGJyZWFrIGluIGJlYW0gZ3JvdXBcclxuICAgKi9cclxuICBlbmRCZWFtOiBib29sZWFuLFxyXG4gIC8qKlxyXG4gICAqIHNob3VsZCBiZSBzYW1lIGFzIG5vdGU/XHJcbiAgICovXHJcbiAgY2xlZjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHRoZXJlJ3MgcHJvYmFibHkgYSBuYW1lIGZvciB0aGlzLi4uXHJcbiAgICovXHJcbiAgc2xhc2g6IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogb25seSB1c2VkIGZvciBiZWFtaW5nXHJcbiAgICovXHJcbiAgdGlja3M6IFRpY2tzLFxyXG4gIC8qKlxyXG4gICAqIFBpdGNoLCBzYW1lIGFzIGZvciB7QGxpbmsgU21vTm90ZX1cclxuICAgKi9cclxuICBwaXRjaGVzOiBQaXRjaFtdLFxyXG59XHJcblxyXG4vKipcclxuICogc2VyaWFsaXplZCBncmFjZSBub3RlXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEdyYWNlTm90ZVBhcmFtc1NlciBleHRlbmRzIEdyYWNlTm90ZVBhcmFtcyB7XHJcbiAgLyoqXHJcbiAgICogY29uc3RydWN0b3JcclxuICAgKi9cclxuICBjdG9yOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogYXR0cmlidXRlcyBmb3IgSURcclxuICAgKi9cclxuICBhdHRyczogU21vQXR0cnM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzR3JhY2VOb3RlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxHcmFjZU5vdGVQYXJhbXNTZXI+KTogcGFyYW1zIGlzIEdyYWNlTm90ZVBhcmFtc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY3RvcikgIT09ICdzdHJpbmcnIHx8IHBhcmFtcy5jdG9yICE9PSAnU21vR3JhY2VOb3RlJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogQSBncmFjZSBub3RlcyBoYXMgbWFueSBvZiB0aGUgdGhpbmdzIGFuICdhY3R1YWwnIG5vdGUgY2FuIGhhdmUsIGJ1dCBpdCBkb2Vzbid0IHRha2UgdXBcclxuICogdGltZSBhZ2FpbnN0IHRoZSB0aW1lIHNpZ25hdHVyZVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU21vR3JhY2VOb3RlIGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSBpbXBsZW1lbnRzIFRyYW5zcG9zYWJsZSB7XHJcbiAgc3RhdGljIGdldCBmbGFnU3RhdGVzKCkge1xyXG4gICAgcmV0dXJuIHsgYXV0bzogMCwgdXA6IDEsIGRvd246IDIgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBkZWZhdWx0cygpOiBHcmFjZU5vdGVQYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBmbGFnU3RhdGU6IFNtb0dyYWNlTm90ZS5mbGFnU3RhdGVzLmF1dG8sXHJcbiAgICAgIG5vdGVUeXBlOiAnbicsXHJcbiAgICAgIGJlYW1CZWF0czogNDA5NixcclxuICAgICAgZW5kQmVhbTogZmFsc2UsXHJcbiAgICAgIGNsZWY6ICd0cmVibGUnLFxyXG4gICAgICBzbGFzaDogZmFsc2UsXHJcbiAgICAgIHRpY2tzOiB7XHJcbiAgICAgICAgbnVtZXJhdG9yOiA0MDk2LFxyXG4gICAgICAgIGRlbm9taW5hdG9yOiAxLFxyXG4gICAgICAgIHJlbWFpbmRlcjogMFxyXG4gICAgICB9LFxyXG4gICAgICBwaXRjaGVzOiBbe1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIG9jdGF2ZTogNCxcclxuICAgICAgICBhY2NpZGVudGFsOiAnJ1xyXG4gICAgICB9XVxyXG4gICAgfSkpO1xyXG4gIH1cclxuICAvLyBUT0RPOiBNYXRjaGVzIFNtb05vdGUgLSBtb3ZlIHRvIFNtb011c2ljP1xyXG4gIHN0YXRpYyBnZXQgcGFyYW1ldGVyQXJyYXkoKSB7XHJcbiAgICBjb25zdCBydjogc3RyaW5nW10gPSBbXTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gU21vR3JhY2VOb3RlLmRlZmF1bHRzKSB7XHJcbiAgICAgIHJ2LnB1c2goa2V5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgdGlja3M6IFRpY2tzID0gU21vR3JhY2VOb3RlLmRlZmF1bHRzLnRpY2tzO1xyXG4gIHBpdGNoZXM6IFBpdGNoW10gPSBbXTtcclxuICBzbGFzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNsZWY6IHN0cmluZyA9ICd0cmVibGUnO1xyXG4gIG5vdGVUeXBlOiBzdHJpbmcgPSAnbic7XHJcbiAgcmVuZGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGhhc1RhYk5vdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgdGlja0NvdW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGlja3MubnVtZXJhdG9yIC8gdGhpcy50aWNrcy5kZW5vbWluYXRvciArIHRoaXMudGlja3MucmVtYWluZGVyO1xyXG4gIH1cclxuXHJcbiAgdG9WZXhHcmFjZU5vdGUoKSB7XHJcbiAgICBjb25zdCBwID0gU21vTXVzaWMuc21vUGl0Y2hlc1RvVmV4KHRoaXMucGl0Y2hlcyk7XHJcbiAgICBjb25zdCBydiA9IHsgZHVyYXRpb246IFNtb011c2ljLmNsb3Nlc3RWZXhEdXJhdGlvbih0aGlzLnRpY2tDb3VudCgpKSwga2V5czogcCwgc2xhc2g6IHRoaXMuc2xhc2ggfTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIHNlcmlhbGl6ZSgpOiBHcmFjZU5vdGVQYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcGFyYW1zOiBQYXJ0aWFsPEdyYWNlTm90ZVBhcmFtc1Nlcj4gPSB7IGN0b3I6ICdTbW9HcmFjZU5vdGUnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9HcmFjZU5vdGUuZGVmYXVsdHMsXHJcbiAgICAgIFNtb0dyYWNlTm90ZS5wYXJhbWV0ZXJBcnJheSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNHcmFjZU5vdGVQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnYmFkIGdyYWNlIG5vdGUgJyArIEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBQYXJ0aWFsPEdyYWNlTm90ZVBhcmFtcz4pIHtcclxuICAgIHN1cGVyKCdTbW9HcmFjZU5vdGUnKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vR3JhY2VOb3RlLnBhcmFtZXRlckFycmF5LCBTbW9HcmFjZU5vdGUuZGVmYXVsdHMsIHRoaXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9HcmFjZU5vdGUucGFyYW1ldGVyQXJyYXksIHBhcmFtZXRlcnMsIHRoaXMpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgdHlwZSBTbW9BcnBlZ2dpb1R5cGUgPSAnZGlyZWN0aW9ubGVzcycgfCAncmFzcXVlZG9fdXAnIHwgJ3Jhc3F1ZWRvX2Rvd24nIFxyXG4gIHwgJ3JvbGxfdXAnIHwgJ3JvbGxfZG93bicgfCAnYnJ1c2hfdXAnIHwgJ2JydXNoX2Rvd24nIHwgJ25vbmUnO1xyXG5leHBvcnQgIGNvbnN0IFNtb0FycGVnZ2lvVHlwZXMgPSBbJ2RpcmVjdGlvbmxlc3MnLCAncmFzcXVlZG9fdXAnLCAncmFzcXVlZG9fZG93bicsXHJcbiAgJ3JvbGxfdXAnLCAncm9sbF9kb3duJywgJ2JydXNoX3VwJywgJ2JydXNoX2Rvd24nLCAnbm9uZSddO1xyXG5cclxuICAvKipcclxuICAgKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAgICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vQXJwZWdnaW9QYXJhbXMge1xyXG4gICB0eXBlOiBTbW9BcnBlZ2dpb1R5cGVcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vQXJwZWdnaW9QYXJhbXNTZXIge1xyXG4gIGN0b3I6IHN0cmluZztcclxuICAvKipcclxuICAgKiBzdHJpbmdpZmllZCBhcnBlZ2dpb24gZW51bWVyYXRpb25cclxuICAgKi9cclxuICB0eXBlOiBzdHJpbmc7XHJcbn1cclxuZnVuY3Rpb24gaXNTbW9BcnBlZ2dpb25QYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPFNtb0FycGVnZ2lvUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9BcnBlZ2dpb1BhcmFtc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY3RvcikgIT09ICdzdHJpbmcnIHx8IHBhcmFtcy5jdG9yICE9PSAnU21vQXJwZWdnaW8nKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycGVnZ2lvVHlwZSh0cDogU21vQXJwZWdnaW9UeXBlIHwgc3RyaW5nKTogdHAgaXMgU21vQXJwZWdnaW9UeXBlIHtcclxuICByZXR1cm4gU21vQXJwZWdnaW9UeXBlcy5pbmRleE9mKHRwKSA+PSAwO1xyXG59XHJcbi8qKlxyXG4gKiBBICdzcGxhdHRlcicgc3ltYm9sIG5leHQgdG8gYSBjaG9yZC5cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb0FycGVnZ2lvIGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSB7XHJcbiAgc3RhdGljIF90eXBlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG4gIHN0YXRpYyBnZXQgdHlwZXMoKSB7XHJcbiAgICBpZiAodHlwZW9mKFNtb0FycGVnZ2lvLl90eXBlc1snZGlyZWN0aW9ubGVzcyddKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydkaXJlY3Rpb25sZXNzJ10gPSA3O1xyXG4gICAgICBTbW9BcnBlZ2dpby5fdHlwZXNbJ3Jhc3F1ZWRvX3VwJ10gPSA2O1xyXG4gICAgICBTbW9BcnBlZ2dpby5fdHlwZXNbJ3Jhc3F1ZWRvX2Rvd24nXSA9IDU7XHJcbiAgICAgIFNtb0FycGVnZ2lvLl90eXBlc1sncm9sbF91cCddID0gNDtcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydyb2xsX2Rvd24nXSA9IDM7XHJcbiAgICAgIFNtb0FycGVnZ2lvLl90eXBlc1snYnJ1c2hfdXAnXSA9IDI7XHJcbiAgICAgIFNtb0FycGVnZ2lvLl90eXBlc1snYnJ1c2hfZG93biddID0gMTtcclxuICAgICAgU21vQXJwZWdnaW8uX3R5cGVzWydub25lJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFNtb0FycGVnZ2lvLl90eXBlcztcclxuICB9ICAgIFxyXG4gIHR5cGVDb2RlOiBudW1iZXI7XHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTbW9BcnBlZ2dpb1BhcmFtcykge1xyXG4gICAgc3VwZXIoJ1Ntb0FycGVnZ2lvJyk7XHJcbiAgICB0aGlzLnR5cGVDb2RlID0gU21vQXJwZWdnaW8udHlwZXNbcGFyYW1zLnR5cGVdO1xyXG4gIH1cclxuICBnZXQgdHlwZVN0cmluZygpOiBTbW9BcnBlZ2dpb1R5cGUge1xyXG4gICAgY29uc3Qgc3RyID0gU21vQXJwZWdnaW9UeXBlcy5maW5kKCh4KSA9PiBTbW9BcnBlZ2dpby50eXBlc1t4XSA9PT0gdGhpcy50eXBlQ29kZSk7XHJcbiAgICBjb25zdCB0eXBlID0gc3RyID8gc3RyIDogJ25vbmUnO1xyXG4gICAgcmV0dXJuIHR5cGUgYXMgU21vQXJwZWdnaW9UeXBlO1xyXG4gIH1cclxuICBzZXJpYWxpemUoKTogU21vQXJwZWdnaW9QYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcnY6IFBhcnRpYWw8U21vQXJwZWdnaW9QYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vQXJwZWdnaW8nIH1cclxuICAgIGNvbnN0IHN0ciA9IFNtb0FycGVnZ2lvVHlwZXMuZmluZCgoeCkgPT4gU21vQXJwZWdnaW8udHlwZXNbeF0gPT09IHRoaXMudHlwZUNvZGUpO1xyXG4gICAgcnYudHlwZSA9IHN0ciA/IHN0ciA6ICdub25lJztcclxuICAgIGlmICghaXNTbW9BcnBlZ2dpb25QYXJhbXNTZXIocnYpKSB7XHJcbiAgICAgIHRocm93ICdiYWQgYXJwZWdnaW8gJyArIEpTT04uc3RyaW5naWZ5KHJ2KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBTbW9NaWNyb3RvbmV9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTWljcm90b25lUGFyYW1zIGV4dGVuZHMgU21vT2JqZWN0UGFyYW1zIHtcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgd2hpY2ggbW9kaWZpZXIgdG8gYWx0ZXIgdGhlIHRvbmUgKGUuZy4gMS80IHNoYXJwKVxyXG4gICAqL1xyXG4gIHRvbmU6IHN0cmluZyxcclxuICAvKipcclxuICAgKiB0aGUgaW5kZXggb2YgdGhlIHBpdGNoIHRvIGFsdGVyXHJcbiAgICovXHJcbiAgcGl0Y2g6IG51bWJlclxyXG59XHJcbi8qKlxyXG4gKiBzZXJpYWxpemVkIG1pY3JvdG9uZXMuXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb01pY3JvdG9uZVBhcmFtc1NlciBleHRlbmRzIFNtb01pY3JvdG9uZVBhcmFtcyB7XHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIGF0dHJzOiBTbW9BdHRyc1xyXG59XHJcbmZ1bmN0aW9uIGlzU21vTWljcm90b25lUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9NaWNyb3RvbmVQYXJhbXNTZXI+KTogcGFyYW1zIGlzIFNtb01pY3JvdG9uZVBhcmFtc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY3RvcikgIT09ICdzdHJpbmcnIHx8IHBhcmFtcy5jdG9yICE9PSAnU21vTWljcm90b25lJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogTWljcm90b25lcyBhcmUgdHJlYXRlZCBzaW1pbGFybHkgdG8gb3JuYW1lbnRzLiAgVGhlcmUgYXJlIG5vdFxyXG4gKiBydWxlcyBmb3IgcGVyc2lzdGluZyB0aHJvdWdob3V0IGEgbWVhc3VyZSwgY2FuY2VsIGV0Yy5cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgU21vTWljcm90b25lIGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSB7XHJcbiAgdG9uZTogc3RyaW5nO1xyXG4gIHBpdGNoSW5kZXg6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vIFRoaXMgaXMgaG93IFZleEZsb3cgbm90YXRlcyB0aGVtXHJcbiAgc3RhdGljIHJlYWRvbmx5IHNtb1RvVmV4OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgZmxhdDc1c3o6ICdkYicsXHJcbiAgICBmbGF0MjVzejogJ2QnLFxyXG4gICAgZmxhdDI1YXI6ICdicycsXHJcbiAgICBmbGF0MTI1YXI6ICdhZmhmJyxcclxuICAgIHNoYXJwNzU6ICcrKycsXHJcbiAgICBzaGFycDEyNTogJ2FzaHMnLFxyXG4gICAgc2hhcnAyNTogJysnLFxyXG4gICAgc29yaTogJ28nLFxyXG4gICAga29yb246ICdrJ1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIGF1ZGlvIGZyZXF1ZW5jeSBvZmZzZXRzXHJcbiAgc3RhdGljIHJlYWRvbmx5IHBpdGNoQ29lZmY6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XHJcbiAgICBmbGF0NzVzejogLTEuNSxcclxuICAgIGZsYXQyNXN6OiAtMC41LFxyXG4gICAgZmxhdDI1YXI6IC0wLjUsXHJcbiAgICBmbGF0MTI1YXI6IC0yLjUsXHJcbiAgICBzaGFycDc1OiAxLjUsXHJcbiAgICBzaGFycDEyNTogMi41LFxyXG4gICAgc2hhcnAyNTogMC41LFxyXG4gICAgc29yaTogMC41LFxyXG4gICAga29yb246IC0wLjVcclxuICB9XHJcblxyXG4gIGdldCB0b1BpdGNoQ29lZmYoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBTbW9NaWNyb3RvbmUucGl0Y2hDb2VmZlt0aGlzLnRvbmVdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvVmV4KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU21vTWljcm90b25lLnNtb1RvVmV4W3RoaXMudG9uZV07XHJcbiAgfVxyXG4gIHN0YXRpYyByZWFkb25seSBkZWZhdWx0czogU21vTWljcm90b25lUGFyYW1zID0ge1xyXG4gICAgY3RvcjogJ1Ntb01pY3JvdG9uZScsXHJcbiAgICB0b25lOiAnZmxhdDI1c3onLFxyXG4gICAgcGl0Y2g6IDBcclxuICB9XHJcbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJBcnJheSgpIHtcclxuICAgIGNvbnN0IHJ2OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBTbW9NaWNyb3RvbmUuZGVmYXVsdHMpIHtcclxuICAgICAgcnYucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICBzZXJpYWxpemUoKTogU21vTWljcm90b25lUGFyYW1zU2VyIHtcclxuICAgIGNvbnN0IHBhcmFtczogUGFydGlhbDxTbW9NaWNyb3RvbmVQYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vTWljcm90b25lJyB9O1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vTWljcm90b25lLmRlZmF1bHRzLFxyXG4gICAgICBTbW9NaWNyb3RvbmUucGFyYW1ldGVyQXJyYXksIHRoaXMsIHBhcmFtcyk7XHJcbiAgICBpZiAoIWlzU21vTWljcm90b25lUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBtaWNyb3RvbmUgJyArIEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBTbW9NaWNyb3RvbmVQYXJhbXMpIHtcclxuICAgIHN1cGVyKHBhcmFtZXRlcnMuY3Rvcik7XHJcbiAgICB0aGlzLnBpdGNoSW5kZXggPSBwYXJhbWV0ZXJzLnBpdGNoO1xyXG4gICAgdGhpcy50b25lID0gcGFyYW1ldGVycy50b25lO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdG9yIGZvciB7QGxpbmsgU21vT3JuYW1lbnR9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vT3JuYW1lbnRQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIHBvc3RpdGlvbiwgYWJvdmUgb3IgYmVsb3dcclxuICAgKi9cclxuICBwb3NpdGlvbj86IHN0cmluZyxcclxuICAvKipcclxuICAgKiBob3Jpem9udGFsIG9mZnNldCBmcm9tIG5vdGUgaGVhZFxyXG4gICAqLyAgXHJcbiAgb2Zmc2V0Pzogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGFjY2lkZW50YWwgYWJvdmUvYmVsb3dcclxuICAgKi9cclxuICBhY2NpZGVudGFsQWJvdmU/OiBzdHJpbmcsXHJcbiAgYWNjaWRlbnRhbEJlbG93Pzogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGNvZGUgZm9yIHRoZSBvcm5hbWVudFxyXG4gICAqL1xyXG4gIG9ybmFtZW50OiBzdHJpbmcsXHJcbn1cclxuLyoqXHJcbiAqIHNlcmlhbGl6YWJsZSBvcm5hbWVudFxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9Pcm5hbWVudFBhcmFtc1NlciBleHRlbmRzIFNtb09ybmFtZW50UGFyYW1zIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGN0b3I6IHN0cmluZztcclxufVxyXG5mdW5jdGlvbiBpc1Ntb09ybmFtZW50UGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9Pcm5hbWVudFBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vT3JuYW1lbnRQYXJhbXNTZXIge1xyXG4gIGlmICh0eXBlb2YocGFyYW1zLmN0b3IpICE9PSAnc3RyaW5nJyB8fCBwYXJhbXMuY3RvciAhPT0gJ1Ntb09ybmFtZW50Jykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogT3JuYW1lbnRzIG1hcCB0byB2ZXggb3JuYW1lbnRzLiAgYXJ0aWN1bGF0aW9ucyB2cy4gb3JuYW1lbnRzXHJcbiAqIGlzIGtpbmQgb2YgYXJiaXRyYXJ5XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9Pcm5hbWVudCBleHRlbmRzIFNtb05vdGVNb2RpZmllckJhc2UgeyAgXHJcbiAgc3RhdGljIHJlYWRvbmx5IG9ybmFtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIG1vcmRlbnQ6ICdtb3JkZW50JyxcclxuICAgIG1vcmRlbnRfaW52ZXJ0ZWQ6ICdtb3JkZW50X2ludmVydGVkJyxcclxuICAgIHR1cm46ICd0dXJuJyxcclxuICAgIHR1cm5faW52ZXJ0ZWQ6ICd0dXJuX2ludmVydGVkJyxcclxuICAgIHRyaWxsOiAndHInLFxyXG4gICAgdXBwcmFsbDogJ3VwcHJhbGwnLFxyXG4gICAgcHJhbGx1cDogJ3ByYWxsdXAnLFxyXG4gICAgcHJhbGxkb3duOiAncHJhbGxkb3duJyxcclxuICAgIHVwbW9yZGVudDogJ3VwbW9yZGVudCcsXHJcbiAgICBkb3dubW9yZGVudDogJ2Rvd25tb3JkZW50JyxcclxuICAgIGNhZXN1cmE6ICdjYWVzdXJhJyxcclxuICAgIGxpbmVwcmFsbDogJ2xpbmVwcmFsbCcsXHJcbiAgICBwcmFsbHByYWxsOiAncHJhbGxwcmFsbCcsXHJcbiAgICBzY29vcDogJ3Njb29wJyxcclxuICAgIGZhbGw6ICdmYWxsJyxcclxuICAgIGZhbGxMb25nOiAnZmFsbExvbmcnLFxyXG4gICAgYnJlYXRoOiAnYnJlYXRoJyxcclxuICAgIGRvaXQ6ICdkb2l0JyxcclxuICAgIGRvaXRMb25nOiAnZG9pdExvbmcnLFxyXG4gICAgZmxpcDogJ2ZsaXAnLFxyXG4gICAgc21lYXI6ICdzbWVhcicsXHJcbiAgICBiZW5kOiAnYmVuZCcsXHJcbiAgICBwbHVuZ2VyQ2xvc2VkOiAncGx1bmdlckNsb3NlZCcsXHJcbiAgICBwbHVuZ2VyT3BlbjogJ3BsdW5nZXJPcGVuJ1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IHhtbE9ybmFtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIG1vcmRlbnQ6ICdtb3JkZW50JyxcclxuICAgIG1vcmRlbnRfaW52ZXJ0ZWQ6ICdpbnZlcnRlZC1tb3JkZW50JyxcclxuICAgIHR1cm46ICd0dXJuJyxcclxuICAgIHR1cm5faW52ZXJ0ZWQ6ICdpbnZlcnRlZC10dXJuJyxcclxuICAgIHVwbW9yZGVudDogJ21vcmRlbnQnLFxyXG4gICAgZG93bm1vcmRlbnQ6ICdtb3JkZW50JyxcclxuICAgIGxpbmVwcmFsbDogJ3NjaGxlaWZlcicsXHJcbiAgICBwcmFsbHByYWxsOiAnc2NobGVpZmVyJyxcclxuICAgIHByYWxsdXA6ICdzY2hsZWlmZXInLFxyXG4gICAgdHI6ICd0cmlsbC1tYXJrJ1xyXG4gIH1cclxuICBzdGF0aWMgcmVhZG9ubHkgdGV4dE5vdGVPcm5hbWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gID0ge1xyXG4gICAgYnJlYXRoOiAnYnJlYXRoJyxcclxuICAgIGNhZXN1cmE6ICdjYWVzdXJhX3N0cmFpZ2h0J1xyXG4gIH1cclxuICAvLyBqYXp6IG9ybmFtZW50cyBpbiB2ZXggYXJlIGFydGljdWxhdGlvbnMgaW4gbXVzaWMgeG1sXHJcbiAgc3RhdGljIHJlYWRvbmx5IHhtbEpheno6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBkb2l0OiAnZG9pdCcsXHJcbiAgICBzY29vcDogJ3Njb29wJyxcclxuICAgIGRyb3BMb25nOiAnZmFsbG9mZicsXHJcbiAgICBkcm9wOiAncGxvcCdcclxuICB9XHJcbiAgc3RhdGljIGdldCBqYXp6T3JuYW1lbnRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbJ3Njb29wJywgJ2ZhbGxMb25nJywgJ2RvaXQnLCAnZG9pdExvbmcnLCAnZmxpcCcsICdzbWVhcicsICdzY29vcCcsICdwbHVuZ2VyT3BlbicsICdwbHVuZ2VyQ2xvc2VkJywgJ2JlbmQnXTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBsZWdhY3lKYXp6KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsnU0NPT1AnOiBTbW9Pcm5hbWVudC5vcm5hbWVudHMuc2Nvb3AgLFxyXG4gICAgICAnRkFMTF9TSE9SVCc6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5mYWxsLFxyXG4gICAgICAnRkFMTF9MT05HJzogU21vT3JuYW1lbnQub3JuYW1lbnRzLmZhbGxMb25nLFxyXG4gICAgICAnRE9JVCc6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5kb2l0LFxyXG4gICAgICAnTElGVCc6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5saWZ0LFxyXG4gICAgICAnRkxJUCc6IFNtb09ybmFtZW50Lm9ybmFtZW50cy5mbGlwLFxyXG4gICAgICAnU01FQVInOiBTbW9Pcm5hbWVudC5vcm5hbWVudHMuc21lYXJcclxuICAgIH07XHJcbiAgfVxyXG4gIHRvVmV4KCkge1xyXG4gICAgcmV0dXJuIFNtb09ybmFtZW50Lm9ybmFtZW50c1t0aGlzLm9ybmFtZW50XTtcclxuICB9XHJcbiAgaXNKYXp6KCkge1xyXG4gICAgcmV0dXJuIFNtb09ybmFtZW50LmphenpPcm5hbWVudHMuaW5kZXhPZih0aGlzLm9ybmFtZW50KSA+PSAwO1xyXG4gIH1cclxuICBwb3NpdGlvbjogc3RyaW5nID0gU21vT3JuYW1lbnQucG9zaXRpb25zLmFib3ZlO1xyXG4gIG9mZnNldDogc3RyaW5nID0gJ29uJztcclxuICBvcm5hbWVudDogc3RyaW5nID0gU21vT3JuYW1lbnQub3JuYW1lbnRzLm1vcmRlbnQ7XHJcblxyXG4gIHN0YXRpYyBnZXQgcGFyYW1ldGVyQXJyYXkoKSB7XHJcbiAgICBjb25zdCBydjogc3RyaW5nW10gPSBbXTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gU21vT3JuYW1lbnQuZGVmYXVsdHMpIHtcclxuICAgICAgcnYucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBwb3NpdGlvbnMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhYm92ZTogJ2Fib3ZlJyxcclxuICAgICAgYmVsb3c6ICdiZWxvdycsXHJcbiAgICAgIGF1dG86ICdhdXRvJ1xyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBvZmZzZXRzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgb246ICdvbicsXHJcbiAgICAgIGFmdGVyOiAnYWZ0ZXInXHJcbiAgICB9O1xyXG4gIH0gIFxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vT3JuYW1lbnRQYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjdG9yOiAnU21vT3JuYW1lbnQnLFxyXG4gICAgICBvcm5hbWVudDogU21vT3JuYW1lbnQub3JuYW1lbnRzLm1vcmRlbnQsXHJcbiAgICAgIHBvc2l0aW9uOiBTbW9Pcm5hbWVudC5wb3NpdGlvbnMuYXV0byxcclxuICAgICAgb2Zmc2V0OiBTbW9Pcm5hbWVudC5vZmZzZXRzLm9uXHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9Pcm5hbWVudFBhcmFtc1NlciB7XHJcbiAgICB2YXIgcGFyYW1zOiBQYXJ0aWFsPFNtb09ybmFtZW50UGFyYW1zU2VyPiA9IHsgY3RvcjogJ1Ntb09ybmFtZW50JyB9O1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vT3JuYW1lbnQuZGVmYXVsdHMsXHJcbiAgICAgIFNtb09ybmFtZW50LnBhcmFtZXRlckFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgaWYgKCFpc1Ntb09ybmFtZW50UGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBvcm5hbWVudCAnICsgSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFNtb09ybmFtZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcignU21vT3JuYW1lbnQnKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vT3JuYW1lbnQucGFyYW1ldGVyQXJyYXksIFNtb09ybmFtZW50LmRlZmF1bHRzLCB0aGlzKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vT3JuYW1lbnQucGFyYW1ldGVyQXJyYXksIHBhcmFtZXRlcnMsIHRoaXMpO1xyXG4gICAgLy8gaGFuZGxlIHNvbWUgbGVnYWN5IGNoYW5nZXNcclxuICAgIGlmICh0eXBlb2YoU21vT3JuYW1lbnQubGVnYWN5SmF6elt0aGlzLm9ybmFtZW50XSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMub3JuYW1lbnQgPSBTbW9Pcm5hbWVudC5sZWdhY3lKYXp6W3RoaXMub3JuYW1lbnRdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBTbW9BcnRpY3VsYXRpb259XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVycyB7XHJcbiAgLyoqXHJcbiAgICogcG9zaXRpb24sIGFib3ZlIG9yIGJlbG93XHJcbiAgICovXHJcbiAgcG9zaXRpb24/OiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogeCBvZmZzZXRcclxuICAgKi9cclxuICBvZmZzZXQ/OiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogYXJ0aWN1bGF0aW9uIGNvZGVcclxuICAgKi9cclxuICBhcnRpY3VsYXRpb246IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyIGV4dGVuZHMgU21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVycyB7XHJcbiAgY3Rvcjogc3RyaW5nO1xyXG59XHJcbmZ1bmN0aW9uIGlzU21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVyc1NlcihwYXJhbXM6IFBhcnRpYWw8U21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVyc1Nlcj4pOiBwYXJhbXMgaXMgU21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVyc1NlciB7XHJcbiAgaWYgKHR5cGVvZihwYXJhbXMuY3RvcikgIT09ICdzdHJpbmcnIHx8IHBhcmFtcy5jdG9yICE9PSAnU21vQXJ0aWN1bGF0aW9uJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogQXJ0aWN1bGF0aW9ucyBtYXAgdG8gbm90ZXMsIGNhbiBiZSBwbGFjZWQgYWJvdmUvYmVsb3dcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb0FydGljdWxhdGlvbiBleHRlbmRzIFNtb05vdGVNb2RpZmllckJhc2Uge1xyXG4gIHN0YXRpYyBnZXQgYXJ0aWN1bGF0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjY2VudDogJ2FjY2VudCcsXHJcbiAgICAgIHN0YWNjYXRvOiAnc3RhY2NhdG8nLFxyXG4gICAgICBtYXJjYXRvOiAnbWFyY2F0bycsXHJcbiAgICAgIHRlbnV0bzogJ3RlbnV0bycsXHJcbiAgICAgIHVwU3Ryb2tlOiAndXBTdHJva2UnLFxyXG4gICAgICBkb3duU3Ryb2tlOiAnZG93blN0cm9rZScsXHJcbiAgICAgIHBpenppY2F0bzogJ3BpenppY2F0bycsXHJcbiAgICAgIGJvd1VwOiAnYm93VXAnLFxyXG4gICAgICBib3dEb3duOiAnYm93RG93bicsXHJcbiAgICAgIGZlcm1hdGE6ICdmZXJtYXRhJ1xyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIHJlYWRvbmx5IHhtbEFydGljdWxhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBhY2NlbnQ6ICdhY2NlbnQnLFxyXG4gICAgc3RhY2NhdG86ICdzdGFjY2F0bycsXHJcbiAgICB0ZW51dG86ICd0ZW51dG8nLFxyXG4gICAgbWFyY2F0bzogJ3N0cm9uZy1hY2NlbnQnXHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcG9zaXRpb25zKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWJvdmU6ICdhYm92ZScsXHJcbiAgICAgIGJlbG93OiAnYmVsb3cnLFxyXG4gICAgICBhdXRvOiAnYXV0bydcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgYXJ0aWN1bGF0aW9uVG9WZXgoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY2NlbnQ6ICdhPicsXHJcbiAgICAgIHN0YWNjYXRvOiAnYS4nLFxyXG4gICAgICBtYXJjYXRvOiAnYV4nLFxyXG4gICAgICB0ZW51dG86ICdhLScsXHJcbiAgICAgIHVwU3Ryb2tlOiAnYXwnLFxyXG4gICAgICBkb3duU3Ryb2tlOiAnYW0nLFxyXG4gICAgICBwaXp6aWNhdG86ICdhbycsXHJcbiAgICAgIGZlcm1hdGE6ICdhQGEnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCB2ZXhUb0FydGljdWxhdGlvbigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdhPic6ICdhY2NlbnQnLFxyXG4gICAgICAnYS4nOiAnc3RhY2NhdG8nLFxyXG4gICAgICAnYV4nOiAnbWFyY2F0bycsXHJcbiAgICAgICdhLSc6ICd0ZW51dG8nLFxyXG4gICAgICAnYXwnOiAndXBTdHJva2UnLFxyXG4gICAgICAnYW0nOiAnZG93blN0cm9rZScsXHJcbiAgICAgICdhbyc6ICdwaXp6aWNhdG8nLFxyXG4gICAgICAnYUBhJzogJ2Zlcm1hdGEnXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBhcmFtZXRlckFycmF5KCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHJ2OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBTbW9BcnRpY3VsYXRpb24uZGVmYXVsdHMpIHtcclxuICAgICAgcnYucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBwb3NpdGlvblRvVmV4KCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2Fib3ZlJzogMyxcclxuICAgICAgJ2JlbG93JzogNFxyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBkZWZhdWx0cygpOiBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgY3RvcjogJ1Ntb0FydGljdWxhdGlvbicsXHJcbiAgICAgIHBvc2l0aW9uOiBTbW9BcnRpY3VsYXRpb24ucG9zaXRpb25zLmFib3ZlLFxyXG4gICAgICBhcnRpY3VsYXRpb246IFNtb0FydGljdWxhdGlvbi5hcnRpY3VsYXRpb25zLmFjY2VudFxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBwb3NpdGlvbjogc3RyaW5nID0gU21vT3JuYW1lbnQucG9zaXRpb25zLmFib3ZlO1xyXG4gIG9mZnNldDogbnVtYmVyID0gMDtcclxuICBhcnRpY3VsYXRpb246IHN0cmluZyA9IFNtb0FydGljdWxhdGlvbi5hcnRpY3VsYXRpb25zLmFjY2VudDtcclxuICBhZGpYOiBudW1iZXIgPSAwO1xyXG5cclxuICBzZXJpYWxpemUoKTogU21vQXJ0aWN1bGF0aW9uUGFyYW1ldGVyc1NlciB7XHJcbiAgICB2YXIgcGFyYW1zOiBQYXJ0aWFsPFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnNTZXI+ID0geyBjdG9yOiAnU21vQXJ0aWN1bGF0aW9uJ307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9BcnRpY3VsYXRpb24uZGVmYXVsdHMsXHJcbiAgICAgIFNtb0FydGljdWxhdGlvbi5wYXJhbWV0ZXJBcnJheSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBhcnRpY3VsYXRpb24gJyArIEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBTbW9BcnRpY3VsYXRpb25QYXJhbWV0ZXJzKSB7XHJcbiAgICBzdXBlcignU21vQXJ0aWN1bGF0aW9uJyk7XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb0FydGljdWxhdGlvbi5wYXJhbWV0ZXJBcnJheSwgU21vQXJ0aWN1bGF0aW9uLmRlZmF1bHRzLCB0aGlzKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vQXJ0aWN1bGF0aW9uLnBhcmFtZXRlckFycmF5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0b3IgPSBwYXJhbWV0ZXJzLnNlbGVjdG9yO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWZXhBbm5vdGF0aW9uUGFyYW1zIHtcclxuICBnbHlwaD86IHN0cmluZyxcclxuICBzeW1ib2xNb2RpZmllcj86IG51bWJlcixcclxuICB0ZXh0Pzogc3RyaW5nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgcGVyc2lzdC15IHBhcnRzIG9mIHtAbGluayBTbW9MeXJpY1BhcmFtc30uIFdlIGRvbid0IHBlcnNpc3QgdGhlIHNlbGVjdG9yXHJcbiAqIHNpbmNlIHRoYXQgY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHBhcmVudCBub3RlXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0x5cmljUGFyYW1zU2VyIGV4dGVuZHMgU21vT2JqZWN0UGFyYW1zIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBhdHRyaWJ1dGVzIGZvciBJRFxyXG4gICAqL1xyXG4gIGF0dHJzOiBTbW9BdHRycyxcclxuICAvKipcclxuICAgKiB0aGUgbHlyaWMgZm9udFxyXG4gICAqL1xyXG4gIGZvbnRJbmZvOiBGb250SW5mbyxcclxuICAvKipcclxuICAgKiBjbGFzc2VzIGZvciBzdHlsaW5nXHJcbiAgICovXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHdoaWNoIHZlcnNlIHRoZSBseXJpYyBnb2VzIHdpdGhcclxuICAgKi9cclxuICB2ZXJzZTogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGx5cmljcyBhcmUgdXNlZCBmb3IgY2hvcmQgY2hhbmdlcyBvciBhbm5vdGF0aW9ucywgcGFyc2VyIGlzIGRpZmZlcmVudCBmb3IgZWFjaFxyXG4gICAqL1xyXG4gIHBhcnNlcjogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB3ZSBzaG91bGQgZm9ybWF0IGZvciB0aGUgd2lkdGggb2YgdGhlIGx5cmljXHJcbiAgICovXHJcbiAgYWRqdXN0Tm90ZVdpZHRoTHlyaWM6IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHdlIHNob3VsZCBmb3JtYXQgZm9yIHRoZSB3aWR0aCBvZiB0aGUgY2hvcmRcclxuICAgKi9cclxuICBhZGp1c3ROb3RlV2lkdGhDaG9yZDogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBmaWxsIGNvbG9yIGZvciB0ZXh0XHJcbiAgICovXHJcbiAgZmlsbDogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zbGF0ZSB0byBhbGlnbiBseXJpY3MuICBQb3NzaWJseSB0aGlzIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZFxyXG4gICAqL1xyXG4gIHRyYW5zbGF0ZVg6IG51bWJlcixcclxuICAvKipcclxuICAgKiB0cmFuc2xhdGUgdG8gYWxpZ24gbHlyaWNzLiAgUG9zc2libHkgdGhpcyBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWRcclxuICAgKi9cclxuICB0cmFuc2xhdGVZOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogdGhlIGFjdHVhbCB0ZXh0XHJcbiAgICovXHJcbiAgdGV4dDogc3RyaW5nIHwgbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1Ntb0x5cmljUGVyc2lzdChwYXJhbXM6IFBhcnRpYWw8U21vTHlyaWNQYXJhbXNTZXI+KTogcGFyYW1zIGlzIFNtb0x5cmljUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9MeXJpYycpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIFVzZWQgdG8gY29uc3RydWN0IGEge0BsaW5rIFNtb0x5cmljfSBmb3IgYm90aCBjaG9yZHMgYW5kIGx5cmljc1xyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0x5cmljUGFyYW1zIHtcclxuICAvKipcclxuICAgKiB0aGUgbHlyaWMgZm9udFxyXG4gICAqL1xyXG4gIGZvbnRJbmZvOiBGb250SW5mbyxcclxuICAvKipcclxuICAgKiBjbGFzc2VzIGZvciBzdHlsaW5nXHJcbiAgICovXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHdoaWNoIHZlcnNlIHRoZSBseXJpYyBnb2VzIHdpdGhcclxuICAgKi9cclxuICB2ZXJzZTogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGx5cmljcyBhcmUgdXNlZCBmb3IgY2hvcmQgY2hhbmdlcyBvciBhbm5vdGF0aW9ucywgcGFyc2VyIGlzIGRpZmZlcmVudCBmb3IgZWFjaFxyXG4gICAqL1xyXG4gIHBhcnNlcjogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB3ZSBzaG91bGQgZm9ybWF0IGZvciB0aGUgd2lkdGggb2YgdGhlIGx5cmljXHJcbiAgICovXHJcbiAgYWRqdXN0Tm90ZVdpZHRoTHlyaWM6IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHdlIHNob3VsZCBmb3JtYXQgZm9yIHRoZSB3aWR0aCBvZiB0aGUgY2hvcmRcclxuICAgKi9cclxuICBhZGp1c3ROb3RlV2lkdGhDaG9yZDogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBmaWxsIGNvbG9yIGZvciB0ZXh0XHJcbiAgICovXHJcbiAgZmlsbDogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zbGF0ZSB0byBhbGlnbiBseXJpY3MuICBQb3NzaWJseSB0aGlzIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZFxyXG4gICAqL1xyXG4gIHRyYW5zbGF0ZVg6IG51bWJlcixcclxuICAvKipcclxuICAgKiB0cmFuc2xhdGUgdG8gYWxpZ24gbHlyaWNzLiAgUG9zc2libHkgdGhpcyBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWRcclxuICAgKi9cclxuICB0cmFuc2xhdGVZOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogdGhlIGFjdHVhbCB0ZXh0XHJcbiAgICovXHJcbiAgdGV4dDogc3RyaW5nIHwgbnVsbFxyXG59XHJcblxyXG4vKipcclxuICogU21vTHlyaWMgY292ZXJzIGJvdGggY2hvcmRzIGFuZCBseXJpY3MuICBUaGUgcGFyc2VyIHRlbGxzIHlvdSB3aGljaFxyXG4gKiBvbmUgeW91IGdldC5cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb0x5cmljIGV4dGVuZHMgU21vTm90ZU1vZGlmaWVyQmFzZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IHBhcnNlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XHJcbiAgICBseXJpYzogMCwgYW5heWx5c2lzOiAxLCBjaG9yZDogMlxyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb0x5cmljUGFyYW1zIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgY3RvcjogJ1Ntb0x5cmljJyxcclxuICAgICAgdGV4dDogJ1xceGEwJyxcclxuICAgICAgZW5kQ2hhcjogJycsXHJcbiAgICAgIHZlcnNlOiAwLFxyXG4gICAgICBmb250SW5mbzoge1xyXG4gICAgICAgIHNpemU6IDEyLFxyXG4gICAgICAgIGZhbWlseTogJ3RpbWVzJyxcclxuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXHJcbiAgICAgICAgd2VpZ2h0OiAnbm9ybWFsJ1xyXG4gICAgICB9LFxyXG4gICAgICBmaWxsOiAnYmxhY2snLFxyXG4gICAgICBjbGFzc2VzOiAnc2NvcmUtdGV4dCcsXHJcbiAgICAgIHRyYW5zbGF0ZVg6IDAsXHJcbiAgICAgIHRyYW5zbGF0ZVk6IDAsXHJcbiAgICAgIGFkanVzdE5vdGVXaWR0aEx5cmljOiB0cnVlLFxyXG4gICAgICBhZGp1c3ROb3RlV2lkdGhDaG9yZDogZmFsc2UsXHJcbiAgICAgIHBhcnNlcjogU21vTHlyaWMucGFyc2Vycy5seXJpY1xyXG4gICAgfSkpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHN5bWJvbFBvc2l0aW9uKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgU1VQRVJTQ1JJUFQ6IDEsXHJcbiAgICAgIFNVQlNDUklQVDogMixcclxuICAgICAgTk9STUFMOiAzXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBlcnNpc3RBcnJheSgpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBydjogc3RyaW5nW10gPSBbXTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gU21vTHlyaWMuZGVmYXVsdHMpIHtcclxuICAgICAgcnYucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBhcmFtZXRlckFycmF5KCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHJ2ID0gU21vTHlyaWMucGVyc2lzdEFycmF5O1xyXG4gICAgcnYucHVzaCgnc2VsZWN0b3InLCAndGV4dCcpO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgY3Rvcjogc3RyaW5nID0gJ1Ntb0x5cmljJztcclxuICB0ZXh0OiBzdHJpbmcgPSAnJztcclxuICBmb250SW5mbzogRm9udEluZm8gPSB7XHJcbiAgICBzaXplOiAxMixcclxuICAgIGZhbWlseTogJ01lcnJpd2VhdGhlcicsXHJcbiAgICBzdHlsZTogJ25vcm1hbCcsXHJcbiAgICB3ZWlnaHQ6ICdub3JtYWwnXHJcbiAgfTtcclxuICBwYXJzZXI6IG51bWJlciA9IFNtb0x5cmljLnBhcnNlcnMubHlyaWM7XHJcbiAgc2VsZWN0b3I6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyB1c2VkIGJ5IFVJXHJcbiAgYWRqdXN0Tm90ZVdpZHRoTHlyaWM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGFkanVzdE5vdGVXaWR0aENob3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmVyc2U6IG51bWJlciA9IDA7XHJcbiAgc2tpcFJlbmRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZpbGw6IHN0cmluZyA9ICcnO1xyXG4gIHRyYW5zbGF0ZVg6IG51bWJlciA9IDA7XHJcbiAgdHJhbnNsYXRlWTogbnVtYmVyID0gMDtcclxuICBjbGFzc2VzOiBzdHJpbmcgPSAnJztcclxuICAvLyB1c2VkIGJ5IHRoZSByZW5kZXJlciB0byBjYWxjdWxhdGUgb2Zmc2V0cyBmb3IgYWxpZ25pbmcgbHlyaWNzXHJcbiAgYWRqWDogbnVtYmVyID0gMDtcclxuICBhZGpZOiBudW1iZXIgPSAwO1xyXG4gIC8vIHVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIGNhbGN1bGF0ZSB0aGUgeSBvZmZzZXQgZm9yIG11c2ljIHRoYXQgZ29lcyBiZWxvdyB0aGUgc3RhZmZcclxuICBtdXNpY1lPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgaHlwaGVuWDogbnVtYmVyID0gMDtcclxuICBkZWxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNlcmlhbGl6ZSgpOiBTbW9MeXJpY1BhcmFtc1NlciB7XHJcbiAgICB2YXIgcGFyYW1zOiBQYXJ0aWFsPFNtb0x5cmljUGFyYW1zU2VyPiA9IHsgY3RvcjogJ1Ntb0x5cmljJyB9O1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vTHlyaWMuZGVmYXVsdHMsXHJcbiAgICAgIFNtb0x5cmljLnBlcnNpc3RBcnJheSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNTbW9MeXJpY1BlcnNpc3QocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnYmFkIGx5cmljICcgKyBKU09OLnN0cmluZ2lmeSgncGFyYW1zJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICAvLyBGb3IgbHlyaWNzLCB3ZSBkZWZhdWx0IHRvIGFkanVzdCBub3RlIHdpZHRoIG9uIGx5cmljIHNpemUuICBGb3IgY2hvcmRzLCB0aGlzIGlzIGFsbW9zdCBuZXZlciB3aGF0XHJcbiAgLy8geW91IHdhbnQsIHNvIGl0IGlzIG9mZiBieSBkZWZhdWx0LlxyXG4gIGdldCBhZGp1c3ROb3RlV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucGFyc2VyID09PSBTbW9MeXJpYy5wYXJzZXJzLmx5cmljKSA/IHRoaXMuYWRqdXN0Tm90ZVdpZHRoTHlyaWMgOiB0aGlzLmFkanVzdE5vdGVXaWR0aENob3JkO1xyXG4gIH1cclxuICBzZXQgYWRqdXN0Tm90ZVdpZHRoKHZhbCkge1xyXG4gICAgaWYgKHRoaXMucGFyc2VyID09PSBTbW9MeXJpYy5wYXJzZXJzLmx5cmljKSB7XHJcbiAgICAgIHRoaXMuYWRqdXN0Tm90ZVdpZHRoTHlyaWMgPSB2YWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkanVzdE5vdGVXaWR0aENob3JkID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gIyMjIGdldENsYXNzU2VsZWN0b3JcclxuICAvLyByZXR1cm5zIGEgc2VsZWN0b3IgdXNlZCB0byBmaW5kIHRoaXMgdGV4dCBibG9jayB3aXRoaW4gYSBub3RlLlxyXG4gIGdldENsYXNzU2VsZWN0b3IoKTogc3RyaW5nIHtcclxuICAgIHZhciBwYXJzZXIgPSAodGhpcy5wYXJzZXIgPT09IFNtb0x5cmljLnBhcnNlcnMubHlyaWMgPyAnbHlyaWMnIDogJ2Nob3JkJyk7XHJcbiAgICByZXR1cm4gJ2cuJyArIHBhcnNlciArICctJyArIHRoaXMudmVyc2U7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0KHRleHQ6IHN0cmluZykge1xyXG4gICAgLy8gRm9yIGNob3JkcywgdHJpbSBhbGwgd2hpdGVzcGFjZVxyXG4gICAgaWYgKHRoaXMucGFyc2VyICE9PSBTbW9MeXJpYy5wYXJzZXJzLmx5cmljKSB7XHJcbiAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGgpIHtcclxuICAgICAgICB0ZXh0LnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudGV4dCA9IHRleHQ7XHJcbiAgfVxyXG5cclxuICBpc0h5cGhlbmF0ZWQoKSB7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0LnRyaW0oKTtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlciA9PT0gU21vTHlyaWMucGFyc2Vycy5seXJpYyAmJlxyXG4gICAgICB0ZXh0Lmxlbmd0aCAmJlxyXG4gICAgICB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gPT09ICctJztcclxuICB9XHJcblxyXG4gIGdldFRleHQoKSB7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0LnRyaW0oKTtcclxuICAgIGlmICh0aGlzLmlzSHlwaGVuYXRlZCgpKSB7XHJcbiAgICAgIHJldHVybiBzbW9TZXJpYWxpemUudHJ5UGFyc2VVbmljb2RlKHRleHQuc3Vic3RyKDAsIHRleHQubGVuZ3RoIC0gMSkpLnRyaW0oKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzbW9TZXJpYWxpemUudHJ5UGFyc2VVbmljb2RlKHRleHQpO1xyXG4gIH1cclxuXHJcbiAgaXNEYXNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzSHlwaGVuYXRlZCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIF9jaG9yZEdseXBoRnJvbUNvZGUoY29kZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gZ2V0Q2hvcmRTeW1ib2xHbHlwaEZyb21Db2RlKGNvZGUpO1xyXG4gIH1cclxuICBzdGF0aWMgX3Rva2VuaXplQ2hvcmRTdHJpbmcoc3RyOiBzdHJpbmcpIHtcclxuICAgIC8vIHZhciBzdHIgPSB0aGlzLl90ZXh0O1xyXG4gICAgY29uc3QgcmVnID0gL14oW0EtWnxhLXp8MC05fF0rKS9nO1xyXG4gICAgbGV0IG1tbSA9IHN0ci5tYXRjaChyZWcpO1xyXG4gICAgbGV0IHRva2VUeXBlOiBzdHJpbmcgPSAnJztcclxuICAgIGxldCB0b2tlOiBzdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcclxuICAgIHdoaWxlIChzdHIubGVuZ3RoKSB7XHJcbiAgICAgIGlmICghbW1tKSB7XHJcbiAgICAgICAgdG9rZVR5cGUgPSBzdHJbMF07XHJcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZVR5cGUpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5zbGljZSgxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b2tlID0gbW1tWzBdLnN1YnN0cigwLCBtbW1bMF0ubGVuZ3RoKTtcclxuICAgICAgICBzdHIgPSBzdHIuc2xpY2UodG9rZS5sZW5ndGgsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgIHRva2Vucy5wdXNoKHRva2UpO1xyXG4gICAgICAgIHRva2VUeXBlID0gJyc7XHJcbiAgICAgICAgdG9rZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIG1tbSA9IHN0ci5tYXRjaChyZWcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRva2VucztcclxuICB9XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU21vTHlyaWNQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9MeXJpYycpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9MeXJpYy5wYXJhbWV0ZXJBcnJheSwgU21vTHlyaWMuZGVmYXVsdHMsIHRoaXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9MeXJpYy5wYXJhbWV0ZXJBcnJheSwgcGFyYW1ldGVycywgdGhpcyk7XHJcbiAgICBpZiAodHlwZW9mKHRoaXMuZm9udEluZm8uc2l6ZSkgIT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRoaXMuZm9udEluZm8uc2l6ZSA9IFNtb0x5cmljLmRlZmF1bHRzLmZvbnRJbmZvLnNpemU7XHJcbiAgICB9XHJcbiAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgbHlyaWMgdGV4dFxyXG4gICAgaWYgKHBhcmFtZXRlcnMudGV4dCkge1xyXG4gICAgICB0aGlzLnRleHQgPSBwYXJhbWV0ZXJzLnRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlZCBhZGp1c3RtZW50cyBmb3IgYWxpZ25tZW50IHB1cnBvc2VzXHJcbiAgICB0aGlzLmFkalkgPSAwO1xyXG4gICAgdGhpcy5hZGpYID0gMDtcclxuICAgIC8vIHRoaXMudmVyc2UgPSBwYXJzZUludCh0aGlzLnZlcnNlLCAxMCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmF0dHJzKSB7XHJcbiAgICAgIHRoaXMuYXR0cnMgPSB7XHJcbiAgICAgICAgaWQ6IGdldElkKCkudG9TdHJpbmcoKSxcclxuICAgICAgICB0eXBlOiAnU21vTHlyaWMnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHBlcnNpc3RlZCBiaXRzIG9mIHtAbGluayBTbW9EeW5hbWljVGV4dFBhcmFtc31cclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vRHluYW1pY1RleHRTZXIgZXh0ZW5kcyBTbW9PYmplY3RQYXJhbXMge1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICB4T2Zmc2V0OiBudW1iZXIsXHJcbiAgZm9udFNpemU6IG51bWJlcixcclxuICB5T2Zmc2V0TGluZTogbnVtYmVyLFxyXG4gIHlPZmZzZXRQaXhlbHM6IG51bWJlcixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFNtb0R5bmFtaWNUZXh0fVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb0R5bmFtaWNUZXh0UGFyYW1zIGV4dGVuZHMgU21vRHluYW1pY1RleHRTZXIge1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICB4T2Zmc2V0OiBudW1iZXIsXHJcbiAgZm9udFNpemU6IG51bWJlcixcclxuICB5T2Zmc2V0TGluZTogbnVtYmVyLFxyXG4gIHlPZmZzZXRQaXhlbHM6IG51bWJlcixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG5cclxuLyoqXHJcbiAqIER5bmFtaWMgdGV4dCB0ZWxscyB5b3UgaG93IGxvdWQgbm90IHRvIHBsYXkuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9EeW5hbWljVGV4dCBleHRlbmRzIFNtb05vdGVNb2RpZmllckJhc2Uge1xyXG4gIHN0YXRpYyBnZXQgZHluYW1pY3MoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICAvLyBtYXRjaGVzIFZGLm1vZGlmaWVyXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBQUDogJ3BwJyxcclxuICAgICAgUDogJ3AnLFxyXG4gICAgICBNUDogJ21wJyxcclxuICAgICAgTUY6ICdtZicsXHJcbiAgICAgIEY6ICdmJyxcclxuICAgICAgRkY6ICdmZicsXHJcbiAgICAgIFNGWjogJ3NmeidcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vRHluYW1pY1RleHRQYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBjdG9yOiAnU21vRHluYW1pY1RleHQnLFxyXG4gICAgICB4T2Zmc2V0OiAwLFxyXG4gICAgICBmb250U2l6ZTogZGVmYXVsdE5vdGVTY2FsZSxcclxuICAgICAgeU9mZnNldExpbmU6IDExLFxyXG4gICAgICB5T2Zmc2V0UGl4ZWxzOiAwLFxyXG4gICAgICB0ZXh0OiBTbW9EeW5hbWljVGV4dC5keW5hbWljcy5NUCxcclxuICAgIH0pKTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwZXJzaXN0QXJyYXkoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgcnY6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIGZvciAoY29uc3Qga2V5IGluIFNtb0R5bmFtaWNUZXh0LmRlZmF1bHRzKSB7XHJcbiAgICAgIHJ2LnB1c2goa2V5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwYXJhbWV0ZXJBcnJheSgpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBydiA9IFNtb0R5bmFtaWNUZXh0LnBlcnNpc3RBcnJheTtcclxuICAgIHJ2LnB1c2goJ3NlbGVjdG9yJyk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIHlPZmZzZXRMaW5lOiBudW1iZXIgPSAxMTtcclxuICB5T2Zmc2V0UGl4ZWxzOiBudW1iZXIgPSAwO1xyXG4gIHhPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgZm9udFNpemU6IG51bWJlciA9IGRlZmF1bHROb3RlU2NhbGU7XHJcbiAgc2VyaWFsaXplKCk6IG9iamVjdCB7XHJcbiAgICB2YXIgcGFyYW1zID0ge307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9EeW5hbWljVGV4dC5kZWZhdWx0cyxcclxuICAgICAgU21vRHluYW1pY1RleHQucGVyc2lzdEFycmF5LCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU21vRHluYW1pY1RleHRQYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9EeW5hbWljVGV4dCcpO1xyXG4gICAgc21vU2VyaWFsaXplLnZleE1lcmdlKHRoaXMsIFNtb0R5bmFtaWNUZXh0LmRlZmF1bHRzKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5maWx0ZXJlZE1lcmdlKFNtb0R5bmFtaWNUZXh0LnBhcmFtZXRlckFycmF5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuYXR0cnMpIHtcclxuICAgICAgdGhpcy5hdHRycyA9IHtcclxuICAgICAgICBpZDogZ2V0SWQoKS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6ICdTbW9EeW5hbWljVGV4dCdcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYkJlbmQge1xyXG4gIGJlbmRUeXBlOiBudW1iZXIsXHJcbiAgcmVsZWFzZTogYm9vbGVhbixcclxuICB0ZXh0OiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9GcmV0UG9zaXRpb24ge1xyXG4gIHN0cmluZzogbnVtYmVyLFxyXG4gIGZyZXQ6IG51bWJlclxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYk5vdGVQYXJhbXMge1xyXG4gIHBvc2l0aW9uczogU21vRnJldFBvc2l0aW9uW11cclxuICBub3RlSWQ6IHN0cmluZyxcclxuICBmbGFnU3RhdGU6IG51bWJlcixcclxuICBmbGFnVGhyb3VnaDogYm9vbGVhbixcclxuICBub3RlSGVhZDogbnVtYmVyLFxyXG4gIGlzQXNzaWduZWQ6IGJvb2xlYW5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1RhYk5vdGVQYXJhbXNTZXIgZXh0ZW5kcyBTbW9UYWJOb3RlUGFyYW1zIHtcclxuICBjdG9yOiBzdHJpbmdcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTbW9UYWJOb3RlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9UYWJOb3RlUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9UYWJOb3RlUGFyYW1zU2VyIHtcclxuICBpZiAodHlwZW9mKHBhcmFtcy5jdG9yKSAhPT0gJ3N0cmluZycgfHwgcGFyYW1zLmN0b3IgIT09ICdTbW9UYWJOb3RlJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb1RhYk5vdGUgZXh0ZW5kcyBTbW9Ob3RlTW9kaWZpZXJCYXNlIHtcclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb1RhYk5vdGVQYXJhbXMgIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgcG9zaXRpb25zOiBbXSxcclxuICAgICAgbm90ZUlkOiAnJyxcclxuICAgICAgaXNBc3NpZ25lZDogZmFsc2UsXHJcbiAgICAgIGZsYWdTdGF0ZTogU21vVGFiTm90ZS5mbGFnU3RhdGVzLk5vbmUsXHJcbiAgICAgIGZsYWdUaHJvdWdoOiBmYWxzZSxcclxuICAgICAgbm90ZUhlYWQ6IFNtb1RhYk5vdGUubm90ZUhlYWRzLm51bWJlclxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBwb3NpdGlvbnM6IFNtb0ZyZXRQb3NpdGlvbltdO1xyXG4gIG5vdGVJZDogc3RyaW5nO1xyXG4gIGlzQXNzaWduZWQ6IGJvb2xlYW47XHJcbiAgbm90ZUhlYWQ6IG51bWJlcjtcclxuICBmbGFnU3RhdGU6IG51bWJlcjtcclxuICBmbGFnVGhyb3VnaDogYm9vbGVhbjtcclxuICBzdGF0aWMgZ2V0IGZsYWdTdGF0ZXMoKSB7XHJcbiAgICByZXR1cm4geyBOb25lOiAwLCBVcDogMSwgRG93bjogLTEgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBub3RlSGVhZHMoKSB7XHJcbiAgICByZXR1cm4geyBudW1iZXI6IDAsIHg6IDEgfTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTbW9UYWJOb3RlUGFyYW1zKSB7XHJcbiAgICBzdXBlcignU21vVGFiTm90ZScpO1xyXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBwYXJhbXMucG9zaXRpb25zXHJcbiAgICB0aGlzLm5vdGVJZCA9ICBwYXJhbXMubm90ZUlkO1xyXG4gICAgdGhpcy5pc0Fzc2lnbmVkID0gcGFyYW1zLmlzQXNzaWduZWQ7XHJcbiAgICB0aGlzLm5vdGVIZWFkID0gcGFyYW1zLm5vdGVIZWFkO1xyXG4gICAgdGhpcy5mbGFnU3RhdGUgPSBwYXJhbXMuZmxhZ1N0YXRlO1xyXG4gICAgdGhpcy5mbGFnVGhyb3VnaCA9IHBhcmFtcy5mbGFnVGhyb3VnaDtcclxuICB9XHJcbiAgc2VyaWFsaXplKCk6IFNtb1RhYk5vdGVQYXJhbXNTZXIge1xyXG4gICAgdmFyIHBhcmFtcyA9IHsgY3RvcjogJ1Ntb1RhYk5vdGUnIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9UYWJOb3RlLmRlZmF1bHRzLFxyXG4gICAgICBbJ3Bvc2l0aW9ucycsICdub3RlSWQnLCAnaXNBc3NpZ25lZCcsICdub3RlSGVhZCcsICdmbGFnU3RhdGUnLCAnZmxhZ1Rocm91Z2gnXSwgdGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghaXNTbW9UYWJOb3RlUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBwYXJhbXMgaW4gU21vVGFiTm90ZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3Qgbm90ZU1vZGlmaWVyRHluYW1pY0N0b3JJbml0ID0gKCkgPT4ge1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9BcnBlZ2dpbyddID0gKHBhcmFtczogU21vQXJwZWdnaW9QYXJhbXMpID0+IG5ldyBTbW9BcnBlZ2dpbyhwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9NaWNyb3RvbmUnXSA9IChwYXJhbXM6IFNtb01pY3JvdG9uZVBhcmFtcykgPT4gbmV3IFNtb01pY3JvdG9uZShwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9Pcm5hbWVudCddID0gKHBhcmFtczogU21vT3JuYW1lbnRQYXJhbXMpID0+IG5ldyBTbW9Pcm5hbWVudChwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9HcmFjZU5vdGUnXSA9IChwYXJhbXM6IEdyYWNlTm90ZVBhcmFtcykgPT4gbmV3IFNtb0dyYWNlTm90ZShwYXJhbXMpO1xyXG4gIFNtb0R5bmFtaWNDdG9yWydTbW9BcnRpY3VsYXRpb24nXSA9IChwYXJhbXM6IFNtb0FydGljdWxhdGlvblBhcmFtZXRlcnMpID0+IG5ldyBTbW9BcnRpY3VsYXRpb24ocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vTHlyaWMnXSA9IChwYXJhbXM6IFNtb0x5cmljUGFyYW1zKSA9PiBuZXcgU21vTHlyaWMocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vRHluYW1pY1RleHQnXSA9IChwYXJhbXM6IFNtb0R5bmFtaWNUZXh0UGFyYW1zKSA9PiBuZXcgU21vRHluYW1pY1RleHQocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vVGFiTm90ZSddID0gKHBhcmFtczogU21vVGFiTm90ZVBhcmFtcykgPT4gbmV3IFNtb1RhYk5vdGUocGFyYW1zKTtcclxuICBTbW9EeW5hbWljQ3RvclsnU21vQ2xlZkNoYW5nZSddID0gKHBhcmFtczogU21vQ2xlZkNoYW5nZVBhcmFtcykgPT4gbmV3IFNtb0NsZWZDaGFuZ2UocGFyYW1zKTtcclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/smo/data/noteModifiers.ts\n");
538
538
 
539
539
  /***/ }),
540
540
 
@@ -556,7 +556,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
556
556
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
557
557
 
558
558
  "use strict";
559
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoScore: () => (/* binding */ SmoScore),\n/* harmony export */ engravingFontTypes: () => (/* binding */ engravingFontTypes),\n/* harmony export */ isEmptyTextBlock: () => (/* binding */ isEmptyTextBlock),\n/* harmony export */ isEngravingFont: () => (/* binding */ isEngravingFont),\n/* harmony export */ isSmoScoreParemsSer: () => (/* binding */ isSmoScoreParemsSer)\n/* harmony export */ });\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _scoreText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _systemStaff__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Classes to support {@link SmoScore}\n * @module /smo/data/score\n */\n\n\n\n\n\n\n\n/**\n * Arrary of engraving fonts available in Smoosic\n */\nconst engravingFontTypes = ['Bravura', 'Gonville', 'Petaluma', 'Leland'];\nfunction isEngravingFont(et) {\n return engravingFontTypes.indexOf(et) >= 0;\n}\nfunction isSmoScoreParams(params) {\n if (params.fonts && params.fonts.length) {\n return true;\n }\n return false;\n}\n// dont' deserialize trivial text blocks saved by mistake\nfunction isEmptyTextBlock(params) {\n if (Array.isArray(params === null || params === void 0 ? void 0 : params.textBlocks) || Array.isArray(params === null || params === void 0 ? void 0 : params.blocks)) {\n return false;\n }\n return true;\n}\n// SmoScoreParemsSer\nfunction isSmoScoreParemsSer(params) {\n if (Array.isArray(params.staves)) {\n return true;\n }\n return false;\n}\n/**\n * Score is a container of staves, and metadata about the score. Serializing the score serializes the\n * child object. It is the highest-level object in Smoosic.\n * @category SmoObject\n */\nclass SmoScore {\n constructor(params) {\n /**\n * Map of instruments to staves, used in serialization.\n *\n * @type {any[]}\n * @memberof SmoScore\n */\n this.instrumentMap = [];\n /**\n * Default fonts in this score, for each type of text (lyrics, etc)\n *\n * @type {FontPurpose[]}\n * @memberof SmoScore\n */\n this.fonts = [];\n /**\n * General info about the score, used for export and library\n *\n * @type {SmoScoreInfo}\n * @memberof SmoScore\n */\n this.scoreInfo = SmoScore.scoreInfoDefaults;\n /**\n * Default behavior for this score. Indicates some global behavior like whether to advance the cursor.\n *\n * @type {SmoScorePreferences}\n * @memberof SmoScore\n */\n this.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults);\n /**\n * The staves that make up the music of the score\n *\n * @type {SmoSystemStaff[]}\n * @memberof SmoScore\n */\n this.staves = [];\n /**\n * The active staff, used for some types of selections. Not serialized.\n *\n * @type {number}\n * @memberof SmoScore\n */\n this.activeStaff = 0;\n /**\n * Text associated with the score, but not a specific musical element (e.g. lyrics are contains by notes)\n *\n * @type {SmoTextGroup[]}\n * @memberof SmoScore\n */\n this.textGroups = [];\n /**\n * A logical grouping of staves for justification\n *\n * @type {SmoSystemGroup[]}\n * @memberof SmoScore\n */\n this.systemGroups = [];\n /**\n * Preserve a map of measures to their actual measure numbers\n *\n * @type {Record<number, number>}\n * @memberof SmoScore\n */\n this.renumberingMap = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.vexMerge(this, SmoScore.defaults);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.vexMerge(this, params);\n if (!this.layoutManager) {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults);\n }\n if (!this.formattingManager) {\n this.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager.defaults);\n }\n // Set beaming rules based on preferences.\n const pref = this.preferences;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultDupleDuration = pref.defaultDupleDuration;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultTripleDuration = pref.defaultTripleDuration;\n if (this.staves.length) {\n this.numberStaves();\n }\n if (typeof (this.preferences.showPiano) === 'undefined') {\n this.preferences.showPiano = false;\n }\n this.audioSettings = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(params.audioSettings);\n this.updateMeasureFormats();\n this.updateSystemGroups();\n }\n static get engravingFonts() {\n return { Bravura: 'Bravura', Gonville: 'Gonville', Petaluma: 'Petaluma' };\n }\n static get fontPurposes() {\n return { ENGRAVING: 1, SCORE: 2, CHORDS: 3, LYRICS: 4 };\n }\n static get scoreInfoDefaults() {\n return JSON.parse(JSON.stringify({\n name: 'Smoosical',\n title: 'Smoosical',\n subTitle: '(Op. 1)',\n composer: 'Me',\n copyright: '',\n version: 1\n }));\n }\n static get scoreMetadataDefaults() {\n return JSON.parse(JSON.stringify({\n fonts: [{ name: 'engraving', purpose: SmoScore.fontPurposes.ENGRAVING, family: 'Bravura', size: 1, custom: false },\n { name: 'score', purpose: SmoScore.fontPurposes.SCORE, family: 'Merriweather', size: 14, custom: false },\n { name: 'chords', purpose: SmoScore.fontPurposes.CHORDS, family: 'Roboto Slab', size: 14, custom: false },\n { name: 'lyrics', purpose: SmoScore.fontPurposes.LYRICS, family: 'Merriweather', size: 12, custom: false }],\n scoreInfo: SmoScore.scoreInfoDefaults,\n renumberingMap: {},\n preferences: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults)\n }));\n }\n static get defaults() {\n return {\n // legacy layout structure. Now we use pages.\n fonts: [\n { name: 'engraving', purpose: SmoScore.fontPurposes.ENGRAVING, family: 'Bravura', size: 1, custom: false },\n { name: 'score', purpose: SmoScore.fontPurposes.SCORE, family: 'Merriweather', size: 14, custom: false },\n { name: 'chords', purpose: SmoScore.fontPurposes.CHORDS, family: 'Roboto Slab', size: 14, custom: false },\n { name: 'lyrics', purpose: SmoScore.fontPurposes.LYRICS, family: 'Merriweather', size: 12, custom: false }\n ],\n scoreInfo: SmoScore.scoreInfoDefaults,\n audioSettings: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings.defaults),\n preferences: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults),\n staves: [],\n activeStaff: 0,\n textGroups: [],\n systemGroups: []\n };\n }\n static get pageSizes() {\n return ['letter', 'tabloid', 'A4', 'A4Landscape', 'custom'];\n }\n static get pageDimensions() {\n return {\n 'letter': { width: 8 * 96 + 48, height: 11 * 96 },\n 'letterLandscape': { width: 11 * 96, height: 8 * 96 + 48 },\n 'tabloid': { width: 1632, height: 1056 },\n 'A4': { width: 794, height: 1122 },\n 'A4Landscape': { width: 1122, height: 794 },\n 'custom': { width: 1, height: 1 }\n };\n }\n static pageSizeFromDimensions(width, height) {\n var _a;\n const rv = (_a = SmoScore.pageSizes.find((sz) => SmoScore.pageDimensions[sz].width === width && SmoScore.pageDimensions[sz].height === height)) !== null && _a !== void 0 ? _a : null;\n return rv;\n }\n static get preferences() {\n return ['preferences', 'fonts', 'scoreInfo', 'audioSettings'];\n }\n /**\n * serialize the keySignature, tempo and time signature, which are mapped\n * to a column at a measure index\n * @returns\n */\n serializeColumnMapped(func) {\n const keySignature = {};\n const tempo = {};\n const timeSignature = {};\n const renumberingMap = {};\n let previous = null;\n this.staves[0].measures.forEach((measure) => {\n const current = func(measure);\n const ix = measure.measureNumber.measureIndex;\n const currentInstrument = this.staves[0].getStaffInstrument(ix);\n current.keySignature = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(current.keySignature, -1 * currentInstrument.keyOffset);\n if (ix === 0) {\n keySignature[0] = current.keySignature;\n tempo[0] = current.tempo;\n timeSignature[0] = current.timeSignature;\n renumberingMap[0] = 0;\n previous = current;\n }\n else {\n if (typeof (this.renumberingMap[measure.measureNumber.measureIndex]) === 'number') {\n renumberingMap[measure.measureNumber.measureIndex] = this.renumberingMap[measure.measureNumber.measureIndex];\n }\n if (current.keySignature !== previous.keySignature) {\n previous.keySignature = current.keySignature;\n keySignature[ix] = current.keySignature;\n }\n if (!(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.equal(current.timeSignature, previous.timeSignature))) {\n previous.timeSignature = current.timeSignature;\n timeSignature[ix] = current.timeSignature;\n }\n if (!(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.eq(current.tempo, previous.tempo))) {\n previous.tempo = current.tempo;\n tempo[ix] = current.tempo;\n }\n }\n });\n return { keySignature, tempo, timeSignature, renumberingMap };\n }\n /**\n * Column-mapped attributes stay the same in each measure until\n * changed, like key-signatures. We don't store each measure value to\n * make the files smaller\n * @param scoreObj - the json blob that contains the score data\n * @returns\n */\n static deserializeColumnMapped(scoreObj) {\n let curValue;\n let mapIx = 0;\n if (!scoreObj.columnAttributeMap) {\n return;\n }\n const attrs = Object.keys(scoreObj.columnAttributeMap);\n scoreObj.staves.forEach((staff) => {\n const attrIxMap = {};\n attrs.forEach((attr) => {\n attrIxMap[attr] = 0;\n });\n staff.measures.forEach((measure) => {\n attrs.forEach((attr) => {\n mapIx = attrIxMap[attr];\n const curHash = scoreObj.columnAttributeMap[attr];\n const attrKeys = Object.keys(curHash);\n curValue = curHash[attrKeys[mapIx.toString()]];\n attrKeys.sort((a, b) => parseInt(a, 10) > parseInt(b, 10) ? 1 : -1);\n if (attrKeys.length > mapIx + 1) {\n if (measure.measureNumber.measureIndex >= attrKeys[mapIx + 1]) {\n mapIx += 1;\n curValue = curHash[attrKeys[mapIx.toString()]];\n }\n }\n // legacy timeSignature format was just a string 2/4, 3/8 etc.\n if (attr === 'timeSignature') {\n const ts = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n if (typeof (curValue) === 'string') {\n ts.timeSignature = curValue;\n measure[attr] = ts;\n }\n else {\n measure[attr] = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(curValue);\n }\n }\n else {\n measure[attr] = curValue;\n }\n attrIxMap[attr] = mapIx;\n });\n });\n });\n }\n /**\n * Serialize the entire score.\n * @returns JSON object\n */\n serialize(options) {\n var _a, _b, _c, _d, _e;\n const skipStaves = (_a = options === null || options === void 0 ? void 0 : options.skipStaves) !== null && _a !== void 0 ? _a : false;\n const useDictionary = (_b = options === null || options === void 0 ? void 0 : options.skipStaves) !== null && _b !== void 0 ? _b : true;\n const preserveIds = (_c = options === null || options === void 0 ? void 0 : options.preserveStaffIds) !== null && _c !== void 0 ? _c : false;\n let obj = {\n layoutManager: Object.assign({ ctor: 'SmoLayoutManager' }, _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults),\n audioSettings: {},\n measureFormats: [],\n staves: [],\n textGroups: [],\n systemGroups: [],\n metadata: SmoScore.scoreMetadataDefaults\n };\n if (this.layoutManager) {\n obj.layoutManager = this.layoutManager.serialize();\n }\n obj.metadata.fonts = JSON.parse(JSON.stringify(this.fonts));\n obj.metadata.renumberingMap = JSON.parse(JSON.stringify(this.renumberingMap));\n obj.metadata.preferences = this.preferences.serialize();\n obj.metadata.scoreInfo = JSON.parse(JSON.stringify(this.scoreInfo));\n if (typeof ((_e = (_d = obj === null || obj === void 0 ? void 0 : obj.metadata) === null || _d === void 0 ? void 0 : _d.scoreInfo) === null || _e === void 0 ? void 0 : _e.version) !== 'number') {\n obj.metadata.scoreInfo.version = 0;\n }\n if (this.formattingManager) {\n obj.measureFormats = this.formattingManager.serialize();\n }\n obj.audioSettings = this.audioSettings.serialize();\n if (!skipStaves) {\n this.staves.forEach((staff) => {\n obj.staves.push(staff.serialize({ skipMaps: true, preserveIds: preserveIds }));\n });\n }\n else {\n obj.staves = [];\n }\n // Score text is not part of text group, so don't save separately.\n this.textGroups.forEach((tg) => {\n if (tg.isTextVisible()) {\n obj.textGroups.push(tg.serialize());\n }\n });\n this.systemGroups.forEach((gg) => {\n obj.systemGroups.push(gg.serialize());\n });\n const getSerMeasure = (measure) => {\n return measure.serializeColumnMapped();\n };\n obj.columnAttributeMap = this.serializeColumnMapped(getSerMeasure);\n if (useDictionary) {\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.jsonTokens(obj);\n obj = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.detokenize(obj, _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.tokenValues);\n obj.dictionary = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.tokenMap;\n }\n return obj;\n }\n updateScorePreferences(pref) {\n this.preferences = pref;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultDupleDuration = pref.defaultDupleDuration;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultTripleDuration = pref.defaultTripleDuration;\n }\n get engravingFont() {\n const efont = this.fonts.find((x) => x.purpose === SmoScore.fontPurposes.ENGRAVING);\n if (efont) {\n const val = engravingFontTypes.find((x) => x === efont.family);\n if (val) {\n return val;\n }\n }\n return 'Bravura';\n }\n set engravingFont(value) {\n const efont = this.fonts.find((x) => x.purpose === SmoScore.fontPurposes.ENGRAVING);\n if (efont && isEngravingFont(value)) {\n efont.family = value;\n }\n }\n static upConvertGlobalLayout(jsonObj) {\n // upconvert global layout, which used to be directly on layoutManager\n if (typeof (jsonObj.layoutManager.globalLayout) === 'undefined') {\n jsonObj.layoutManager.globalLayout = {\n svgScale: jsonObj.layoutManager.svgScale,\n zoomScale: jsonObj.layoutManager.zoomScale,\n pageWidth: jsonObj.layoutManager.pageWidth,\n pageHeight: jsonObj.layoutManager.pageHeight,\n noteSpacing: jsonObj.layoutManager.noteSpacing\n };\n if (!jsonObj.layoutManager.globalLayout.noteSpacing) {\n jsonObj.layoutManager.globalLayout.noteSpacing = 1.0;\n }\n }\n }\n /**\n * Convert legacy score layout to layoutManager object parameters\n * @param jsonObj\n */\n static upConvertLayout(jsonObj) {\n let i = 0;\n jsonObj.layoutManager = {};\n _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.attributes.forEach((attr) => {\n jsonObj.layoutManager[attr] = jsonObj.score.layout[attr];\n });\n jsonObj.layoutManager.pageLayouts = [];\n for (i = 0; i < jsonObj.score.layout.pages; ++i) {\n const pageSetting = JSON.parse(JSON.stringify(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout.defaults));\n _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout.attributes.forEach((attr) => {\n if (typeof (jsonObj.score.layout[attr]) !== 'undefined') {\n pageSetting[attr] = jsonObj.score.layout[attr];\n }\n });\n jsonObj.layoutManager.pageLayouts.push(pageSetting);\n }\n SmoScore.upConvertGlobalLayout(jsonObj);\n }\n /**\n * Hack: for the case of a score containing only a single part, use the text from the\n * part.\n * @param jsonObj\n * @returns\n */\n static fixTextGroupSinglePart(jsonObj) {\n if (jsonObj.staves.length !== 1) {\n return;\n }\n if (!jsonObj.staves[0].partInfo) {\n return;\n }\n if (!jsonObj.staves[0].partInfo.textGroups || jsonObj.staves[0].partInfo.textGroups.length < 1) {\n return;\n }\n jsonObj.textGroups = JSON.parse(JSON.stringify(jsonObj.staves[0].partInfo.textGroups));\n }\n /**\n * Deserialize an entire score\n * @param jsonString\n * @returns SmoScore\n */\n static deserialize(jsonString) {\n var _a, _b;\n let jsonObj = JSON.parse(jsonString);\n let upconvertFormat = false;\n let formattingManager = null;\n if (jsonObj.dictionary) {\n jsonObj = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.detokenize(jsonObj, jsonObj.dictionary);\n }\n SmoScore.fixTextGroupSinglePart(jsonObj);\n upconvertFormat = typeof (jsonObj.measureFormats) === 'undefined';\n const params = {};\n const staves = [];\n jsonObj.textGroups = jsonObj.textGroups ? jsonObj.textGroups : [];\n // Explode the sparse arrays of attributes into the measures\n SmoScore.deserializeColumnMapped(jsonObj);\n // 'score' attribute name changes to 'metadata'\n if (typeof (jsonObj.score) !== 'undefined') {\n jsonObj.metadata = jsonObj.score;\n }\n // meaning of customProportion has changed, backwards-compatiblity\n if (typeof (jsonObj.metadata) === 'undefined') {\n jsonObj.metadata = SmoScore.scoreMetadataDefaults;\n }\n // upconvert old proportion operator\n const jsonPropUp = jsonObj.metadata.preferences;\n if (typeof (jsonPropUp) !== 'undefined' && typeof (jsonPropUp.customProportion) === 'number') {\n _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality = jsonPropUp.customProportion;\n if (_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.legacyProportionality) {\n _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaultProportionality;\n }\n }\n // up-convert legacy layout data\n if (jsonObj.metadata.layout) {\n SmoScore.upConvertLayout(jsonObj);\n }\n if (jsonObj.layoutManager && !jsonObj.layoutManager.globalLayout) {\n SmoScore.upConvertGlobalLayout(jsonObj);\n }\n if (!jsonObj.layoutManager) {\n jsonObj.layoutManager = Object.assign({ ctor: \"SmoLayoutManager\" }, _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults);\n }\n const layoutManagerParams = {\n globalLayout: jsonObj.layoutManager.globalLayout,\n /**\n * page margins for each page\n */\n pageLayouts: []\n };\n jsonObj.layoutManager.pageLayouts.forEach((pl) => {\n const pageLayout = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout(pl);\n layoutManagerParams.pageLayouts.push(pageLayout);\n });\n const layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager(layoutManagerParams);\n // params.layout = JSON.parse(JSON.stringify(SmoScore.defaults.layout));\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(['renumberingMap', 'fonts'], SmoScore.scoreMetadataDefaults, params);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(['renumberingMap', 'fonts'], jsonObj.metadata, params);\n if (jsonObj.metadata.preferences) {\n params.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(jsonObj.metadata.preferences);\n }\n else {\n params.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults);\n }\n if (jsonObj.metadata.scoreInfo) {\n const scoreInfo = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreInfoKeys, SmoScore.scoreInfoDefaults, scoreInfo);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreInfoKeys, jsonObj.metadata.scoreInfo, scoreInfo);\n params.scoreInfo = scoreInfo;\n }\n else {\n params.scoreInfo = SmoScore.scoreInfoDefaults;\n }\n if (!jsonObj.audioSettings) {\n params.audioSettings = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings.defaults);\n }\n else {\n params.audioSettings = _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreModifierBase.deserialize(jsonObj.audioSettings);\n }\n params.preferences.transposingScore = (_a = params.preferences.transposingScore) !== null && _a !== void 0 ? _a : false;\n params.preferences.hideEmptyLines = (_b = params.preferences.hideEmptyLines) !== null && _b !== void 0 ? _b : false;\n let renumberingMap = { 0: 0 };\n if (jsonObj.columnAttributeMap && jsonObj.columnAttributeMap.renumberingMap) {\n renumberingMap = jsonObj.columnAttributeMap.renumberingMap;\n }\n if (!jsonObj.staves) {\n throw 'bad score, no staves: ' + JSON.stringify(jsonObj);\n }\n jsonObj.staves.forEach((staffObj, staffIx) => {\n staffObj.staffId = staffIx;\n staffObj.renumberingMap = renumberingMap;\n const staff = _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.deserialize(staffObj);\n staves.push(staff);\n });\n const textGroups = [];\n jsonObj.textGroups.forEach((tg) => {\n if (!isEmptyTextBlock(tg)) {\n textGroups.push(_scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoTextGroup.deserializePreserveId(tg));\n }\n });\n const systemGroups = [];\n if (jsonObj.systemGroups) {\n jsonObj.systemGroups.forEach((tt) => {\n var st = _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreModifierBase.deserialize(tt);\n st.autoLayout = false; // since this has been layed out, presumably, before save\n systemGroups.push(st);\n });\n }\n params.staves = staves;\n if (upconvertFormat) {\n formattingManager = SmoScore.measureFormatFromLegacyScore(params, jsonObj);\n }\n else {\n const measureParams = {\n measureFormats: [],\n partIndex: -1\n };\n if (jsonObj.measureFormats) {\n jsonObj.measureFormats.forEach((mf) => {\n var _a;\n const mfObj = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(mf);\n (_a = measureParams.measureFormats) === null || _a === void 0 ? void 0 : _a.push(mfObj);\n });\n }\n params.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(measureParams);\n }\n params.layoutManager = layoutManager;\n if (!isSmoScoreParams(params)) {\n throw 'Bad score, missing params: ' + JSON.stringify(params, null, ' ');\n }\n const score = new SmoScore(params);\n score.textGroups = textGroups;\n score.systemGroups = systemGroups;\n score.scoreInfo.version += 1;\n return score;\n }\n /**\n * Convert measure formatting from legacy scores, that had the formatting\n * per measure, to the new way that has a separate formatting object.\n * **/\n static measureFormatFromLegacyScore(score, jsonObj) {\n let current = null;\n let previous = null;\n const measureFormats = [];\n score.staves[0].measures.forEach((measure) => {\n if (current === null) {\n current = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.fromLegacyMeasure(jsonObj.staves[0].measures[measure.measureNumber.measureIndex]);\n measureFormats[measure.measureNumber.measureIndex] = current;\n }\n else {\n previous = current;\n current = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.fromLegacyMeasure(jsonObj.staves[0].measures[measure.measureNumber.measureIndex]);\n if (!current.eq(previous)) {\n measureFormats[measure.measureNumber.measureIndex] = current;\n }\n }\n });\n return new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager({ measureFormats });\n }\n /**\n * Return a default score with no notes or staves\n * @param scoreDefaults\n * @param measureDefaults\n * @returns\n */\n static getDefaultScore(scoreDefaults, measureDefaults) {\n measureDefaults = measureDefaults !== null ? measureDefaults : _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaults;\n const score = new SmoScore(scoreDefaults);\n score.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager.defaults);\n score.addStaff(_systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults);\n const measure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasure(measureDefaults);\n score.addMeasure(0);\n measure.voices.push({\n notes: _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultNotes(measureDefaults)\n });\n return score;\n }\n /**\n * Return an 'empty' score, with one measure of rests\n * @param scoreDefaults\n * @returns\n */\n static getEmptyScore(scoreDefaults) {\n const score = new SmoScore(scoreDefaults);\n score.addStaff(_systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults);\n return score;\n }\n /**\n * We have deleted a measure, update the renumber index to\n * shuffle back.\n * @param indexToDelete\n */\n updateRenumberForAddDelete(indexToDelete, toAdd) {\n if (!toAdd && indexToDelete === 0) {\n return;\n }\n const maxIndex = this.staves[0].measures.length - 1;\n const increment = toAdd ? 1 : -1;\n for (var i = indexToDelete; i < maxIndex; ++i) {\n if (typeof (this.renumberingMap[i]) === 'number') {\n this.renumberingMap[i] = this.renumberingMap[i] + increment;\n }\n }\n if (typeof (this.renumberingMap[maxIndex]) === 'number' && !toAdd) {\n delete this.renumberingMap[maxIndex];\n }\n }\n updateRenumberingMap(measureIndex, localIndex) {\n if (measureIndex === 0) {\n this.renumberingMap[0] = localIndex;\n }\n else if (typeof (this.renumberingMap[measureIndex]) === 'number') {\n if (measureIndex === localIndex) {\n delete this.renumberingMap[measureIndex];\n }\n else {\n this.renumberingMap[measureIndex] = localIndex;\n }\n }\n else {\n this.renumberingMap[measureIndex] = localIndex;\n }\n this.staves.forEach((staff) => {\n staff.renumberingMap = this.renumberingMap;\n });\n this.numberStaves();\n }\n /**\n * Iteratively number the staves, like when adding a measure\n */\n numberStaves() {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n const stave = this.staves[i];\n stave.staffId = i;\n stave.numberMeasures();\n }\n }\n /**\n * determine if the measure at this index could be a multi-measure rest\n * @param measureIndex - the measure index we are considering to add\n * @param start - the measure index would be the start of the rest\n * @returns\n */\n isMultimeasureRest(measureIndex, start, forceRest) {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n if (!forceRest && !this.staves[i].isRest(measureIndex)) {\n return false;\n }\n if (this.staves[i].getVoltasForMeasure(measureIndex).length > 0) {\n return false;\n }\n if (this.staves[i].isRepeatSymbol(measureIndex)) {\n return false;\n }\n if (!start && measureIndex > 0 && this.staves[i].isRepeat(measureIndex - 1)) {\n return false;\n }\n if (this.staves[i].isRehearsal(measureIndex)) {\n return false;\n }\n // instrument change other than the initial measure\n if (this.staves[i].measureInstrumentMap[measureIndex] && i > 0) {\n return false;\n }\n }\n if (measureIndex > 0) {\n const measure = this.staves[0].measures[measureIndex];\n const prev = this.staves[0].measures[measureIndex - 1];\n if (!start && !_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.equal(measure.timeSignature, prev.timeSignature)) {\n return false;\n }\n if (!start && measure.keySignature !== prev.keySignature) {\n return false;\n }\n }\n return true;\n }\n /**\n * Restore measure formats stored when a score is serialized\n */\n updateMeasureFormats() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((measure) => {\n this.formattingManager.updateFormat(measure);\n });\n });\n }\n /**\n * Add a measure to the score with the supplied parameters at the supplied index.\n * The defaults per staff may be different depending on the clef, key of the staff.\n */\n addDefaultMeasureWithNotes(measureIndex, parameters) {\n this.updateRenumberForAddDelete(measureIndex, true);\n this.staves.forEach((staff) => {\n const defaultMeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasureWithNotes(parameters);\n staff.addMeasure(measureIndex, defaultMeasure);\n });\n }\n getLocalMeasureIndex(measureIndex) {\n let maxKey = -1;\n const keys = Object.keys(this.updateRenumberForAddDelete);\n keys.forEach((key) => {\n const numKey = parseInt(key, 10);\n if (numKey <= measureIndex && numKey > maxKey) {\n maxKey = numKey;\n }\n });\n if (maxKey < 0) {\n return measureIndex;\n }\n return this.renumberingMap[maxKey] + (measureIndex - maxKey);\n }\n /**\n * delete the measure at the supplied index in all the staves\n */\n deleteMeasure(measureIndex) {\n this.staves.forEach((staff) => {\n staff.deleteMeasure(measureIndex);\n });\n // adjust offset if text was attached to any missing measures after the deleted one.\n this.textGroups.forEach((tg) => {\n if (tg.attachToSelector && tg.selector.measure >= measureIndex && tg.selector.measure > 0) {\n tg.selector.measure -= 1;\n }\n });\n this.updateRenumberForAddDelete(measureIndex, false);\n }\n /**\n * coordinate the ids of the display score with the stored score\n * @param other\n */\n synchronizeTextGroups(other) {\n this.textGroups = [];\n other.forEach((tg) => {\n const ntg = _scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoTextGroup.deserializePreserveId(tg);\n this.textGroups.push(ntg);\n });\n }\n /**\n * get a measure 'compatible' with the measure at the given index, in terms\n * of key, time signature etc.\n * @param measureIndex\n * @param staffIndex\n * @returns\n */\n getPrototypeMeasure(measureIndex, staffIndex) {\n const staff = this.staves[staffIndex];\n let protomeasure = {};\n // Since this staff may already have instrument settings, use the\n // immediately preceeding or post-ceding measure if it exists.\n if (measureIndex < staff.measures.length) {\n protomeasure = staff.measures[measureIndex];\n }\n else if (staff.measures.length) {\n protomeasure = staff.measures[staff.measures.length - 1];\n }\n else {\n protomeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaults;\n }\n return _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasureWithNotes(protomeasure);\n }\n /**\n * Give a measure prototype, create a new measure and add it to each staff, with the\n * correct settings for current time signature/clef.\n * @param measureIndex\n */\n addMeasure(measureIndex) {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n const staff = this.staves[i];\n const nmeasure = this.getPrototypeMeasure(measureIndex, i);\n if (nmeasure.voices.length <= nmeasure.getActiveVoice()) {\n nmeasure.setActiveVoice(0);\n }\n staff.addMeasure(measureIndex, nmeasure);\n }\n // Update offsets for score modifiers that have a selector\n this.textGroups.forEach((tg) => {\n if (typeof (tg.selector) === 'undefined') {\n return;\n }\n if (tg.attachToSelector && tg.selector.measure >= measureIndex && tg.selector.measure < this.staves[0].measures.length) {\n tg.selector.measure += 1;\n }\n });\n this.updateRenumberForAddDelete(measureIndex, true);\n this.numberStaves();\n }\n /**\n * Replace the measure at the given location. Probably due to an undo operation or paste.\n * @param selector\n * @param measure\n */\n replaceMeasure(selector, measure) {\n var staff = this.staves[selector.staff];\n staff.measures[selector.measure] = measure;\n }\n getSystemGroupForStaff(selection) {\n const staffId = selection.staff.staffId;\n const measureIndex = selection.measure.measureNumber.measureIndex;\n const exist = this.systemGroups.find((sg) => sg.startSelector.staff <= staffId &&\n sg.endSelector.staff >= staffId &&\n (sg.mapType === _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoSystemGroup.mapTypes.allMeasures ||\n (sg.startSelector.measure <= measureIndex &&\n sg.endSelector.measure >= measureIndex)));\n return exist;\n }\n getStavesForGroup(group) {\n return this.staves.filter((staff) => staff.staffId >= group.startSelector.staff &&\n staff.staffId <= group.endSelector.staff);\n }\n // ### addOrReplaceSystemGroup\n // Add a new staff grouping, or replace it if it overlaps and is different, or\n // remove it if it is identical (toggle)\n addOrReplaceSystemGroup(newGroup) {\n // Replace this group for any groups that overlap it.\n this.systemGroups = this.systemGroups.filter((sg) => !sg.overlaps(newGroup));\n this.systemGroups.push(newGroup);\n }\n isPartExposed() {\n if (this.staves.length > 2) {\n return false;\n }\n const staff = this.staves[0];\n const staveCount = staff.partInfo.stavesAfter + staff.partInfo.stavesBefore + 1;\n return staveCount === this.staves.length\n && staff.partInfo.stavesBefore === 0;\n }\n /**\n * Probably due to an undo operation, replace the staff at the given index.\n * @param index\n * @param staff\n */\n replaceStaff(index, staff) {\n const staves = [];\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n if (i !== index) {\n staves.push(this.staves[i]);\n }\n else {\n staves.push(staff);\n }\n }\n this.staves = staves;\n }\n /**\n *\n * @param measureIndex\n * @param key\n */\n addKeySignature(measureIndex, key) {\n this.staves.forEach((staff) => {\n // Consider transpose for key of instrument\n const netOffset = staff.measures[measureIndex].transposeIndex;\n const newKey = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(key, netOffset);\n staff.addKeySignature(measureIndex, newKey);\n });\n }\n /**\n * If the part is a transposing part, remove the transposition from the notes/staff. This logic\n * assumes the measures previously had transposeIndex set up by the instrument map.\n */\n setTransposing() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((mm) => {\n if (mm.transposeIndex !== 0) {\n const concert = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(mm.keySignature, -1 * mm.transposeIndex);\n mm.transposeToOffset(0, concert);\n mm.transposeIndex = 0;\n mm.keySignature = concert;\n }\n });\n });\n }\n /**\n * If the score is switching from transposing to non-transposing, update the index\n * and pitches. This logic assumes we are changing from transposing to non-transposing.\n */\n setNonTransposing() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((mm) => {\n const inst = staff.getStaffInstrument(mm.measureNumber.measureIndex);\n if (inst.keyOffset !== 0) {\n const concert = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(mm.keySignature, inst.keyOffset);\n mm.transposeToOffset(inst.keyOffset, concert);\n mm.transposeIndex = inst.keyOffset;\n mm.keySignature = concert;\n }\n });\n });\n }\n // ### addInstrument\n // add a new staff (instrument) to the score\n addStaff(parameters) {\n let i = 0;\n if (this.staves.length === 0) {\n const staff = new _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff(parameters);\n this.staves.push(staff);\n this.activeStaff = 0;\n // For part views, we renumber the staves even if there is only one staff.\n if (staff.measures.length) {\n this.numberStaves();\n }\n return staff;\n }\n if (!parameters) {\n parameters = _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults;\n }\n const proto = this.staves[0];\n const measures = [];\n for (i = 0; i < proto.measures.length; ++i) {\n const measure = proto.measures[i];\n const jsonObj = measure.serialize();\n // Need to do this since score serialization doesn't include TS in each measure\n jsonObj.timeSignature = measure.timeSignature.serialize();\n jsonObj.tempo = measure.tempo.serialize();\n let newMeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(jsonObj);\n newMeasure.measureNumber = measure.measureNumber;\n newMeasure.clef = parameters.measureInstrumentMap[0].clef;\n newMeasure.modifiers = [];\n newMeasure.transposeIndex = 0;\n // Consider key change if the proto measure is non-concert pitch\n newMeasure.keySignature =\n _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(newMeasure.keySignature, newMeasure.transposeIndex - measure.transposeIndex);\n newMeasure.voices = [{ notes: _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultNotes(newMeasure) }];\n measure.modifiers.forEach((modifier) => {\n const nmod = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modifier);\n newMeasure.modifiers.push(nmod);\n });\n measures.push(newMeasure);\n }\n parameters.measures = measures;\n const staff = new _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff(parameters);\n this.staves.push(staff);\n this.activeStaff = this.staves.length - 1;\n this.numberStaves();\n return staff;\n }\n /**\n * delete any system groups that apply to deleted staves\n */\n updateSystemGroups() {\n const grpToKeep = [];\n this.systemGroups.forEach((grp) => {\n if (grp.startSelector.staff < this.staves.length &&\n grp.endSelector.staff < this.staves.length) {\n grpToKeep.push(grp);\n }\n });\n this.systemGroups = grpToKeep;\n }\n // ### removeStaff\n // Remove stave at the given index\n removeStaff(index) {\n const staves = [];\n let ix = 0;\n this.staves.forEach((staff) => {\n if (ix !== index) {\n staves.push(staff);\n }\n ix += 1;\n });\n this.staves = staves;\n this.numberStaves();\n this.updateSystemGroups();\n }\n getStaffInstrument(selector) {\n const staff = this.staves[selector.staff];\n return staff.getStaffInstrument(selector.measure);\n }\n swapStaves(index1, index2) {\n if (this.staves.length < index1 || this.staves.length < index2) {\n return;\n }\n const tmpStaff = this.staves[index1];\n this.staves[index1] = this.staves[index2];\n this.staves[index2] = tmpStaff;\n this.staves.forEach((staff) => {\n staff.mapStaffFromTo(index1, index2);\n staff.mapStaffFromTo(index2, index1);\n });\n this.numberStaves();\n }\n updateTextGroup(textGroup, toAdd) {\n const tgid = typeof (textGroup) === 'string' ? textGroup :\n textGroup.attrs.id;\n const ar = this.textGroups.filter((tg) => tg.attrs.id !== tgid);\n this.textGroups = ar;\n if (toAdd) {\n this.textGroups.push(textGroup);\n }\n }\n addTextGroup(textGroup) {\n this.updateTextGroup(textGroup, true);\n }\n getTextGroups() {\n return this.textGroups;\n }\n scaleTextGroups(scale) {\n this.textGroups.forEach((tg) => {\n tg.scaleText(scale);\n });\n }\n removeTextGroup(textGroup) {\n this.updateTextGroup(textGroup, false);\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.staves.forEach((staff) => {\n staff.setLyricAdjustWidth(adjustNoteWidth);\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.staves.forEach((staff) => {\n staff.setChordAdjustWidth(adjustNoteWidth);\n });\n }\n // ### setLyricFont\n // set the font for lyrics, which are the same for all lyrics in the score\n setLyricFont(fontInfo) {\n var _a;\n this.staves.forEach((staff) => {\n staff.setLyricFont(fontInfo);\n });\n const fontInst = this.fonts.find((fn) => fn.purpose === SmoScore.fontPurposes.LYRICS);\n if (typeof (fontInst) === 'undefined') {\n return;\n }\n fontInst.family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : '';\n fontInst.size = parseInt(_scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoScoreText.fontPointSize(fontInfo.size).toString());\n fontInst.custom = true;\n }\n setChordFont(fontInfo) {\n this.staves.forEach((staff) => {\n staff.setChordFont(fontInfo);\n });\n }\n get measures() {\n if (this.staves.length === 0) {\n return [];\n }\n return this.staves[this.activeStaff].measures;\n }\n incrementActiveStaff(offset) {\n if (offset < 0) {\n offset = offset + this.staves.length;\n }\n const nextStaff = (this.activeStaff + offset) % this.staves.length;\n if (nextStaff >= 0 && nextStaff < this.staves.length) {\n this.activeStaff = nextStaff;\n }\n return this.activeStaff;\n }\n setActiveStaff(index) {\n this.activeStaff = index <= this.staves.length ? index : this.activeStaff;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQ2xhc3NlcyB0byBzdXBwb3J0IHtAbGluayBTbW9TY29yZX1cclxuICogQG1vZHVsZSAvc21vL2RhdGEvc2NvcmVcclxuICovXHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi9tdXNpYyc7XHJcbmltcG9ydCB7IENsZWYsIFN2Z0RpbWVuc2lvbnMgfSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUsIFNtb01lYXN1cmVQYXJhbXMsIENvbHVtbk1hcHBlZFBhcmFtcywgU21vTWVhc3VyZVBhcmFtc1NlciB9IGZyb20gJy4vbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb05vdGVNb2RpZmllckJhc2UgfSBmcm9tICcuL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQge1xyXG4gIFNtb1RlbXBvVGV4dCwgU21vTWVhc3VyZUZvcm1hdCwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgVGltZVNpZ25hdHVyZSwgVGltZVNpZ25hdHVyZVBhcmFtZXRlcnMsXHJcbiAgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlclxyXG59IGZyb20gJy4vbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlLCBTbW9JbnN0cnVtZW50IH0gZnJvbSAnLi9zdGFmZk1vZGlmaWVycyc7XHJcbmltcG9ydCB7XHJcbiAgU21vU3lzdGVtR3JvdXAsIFNtb1N5c3RlbUdyb3VwUGFyYW1zU2VyLCBTbW9TY29yZU1vZGlmaWVyQmFzZSwgU21vUGFnZUxheW91dCxcclxuICBTbW9Gb3JtYXR0aW5nTWFuYWdlciwgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncywgU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLCBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zU2VyLFxyXG4gIFNtb0xheW91dE1hbmFnZXIsIEZvbnRQdXJwb3NlLFxyXG4gIFNtb1Njb3JlSW5mbywgU21vU2NvcmVJbmZvS2V5cywgU2NvcmVNZXRhZGF0YVNlciwgU21vU2NvcmVQcmVmZXJlbmNlcywgU21vUGFnZUxheW91dFBhcmFtcyxcclxuICBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zLCBTbW9Gb3JtYXR0aW5nTWFuYWdlclBhcmFtc1xyXG59IGZyb20gJy4vc2NvcmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9UZXh0R3JvdXAsIFNtb1Njb3JlVGV4dCwgU21vVGV4dEdyb3VwUGFyYW1zU2VyIH0gZnJvbSAnLi9zY29yZVRleHQnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZiwgU21vU3lzdGVtU3RhZmZQYXJhbXMsIFNtb1N5c3RlbVN0YWZmUGFyYW1zU2VyIH0gZnJvbSAnLi9zeXN0ZW1TdGFmZic7XHJcbmltcG9ydCB7IFNtb1NlbGVjdG9yLCBTbW9TZWxlY3Rpb24gfSBmcm9tICcuLi94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgc21vU2VyaWFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcmlhbGl6YXRpb25IZWxwZXJzJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuXHJcbi8qKlxyXG4gKiBMaXN0IG9mIGVuZ3JhdmluZyBmb250cyBhdmFpbGFibGUgaW4gU21vb3NpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgZW5ncmF2aW5nRm9udFR5cGUgPSAnQnJhdnVyYScgfCAnR29udmlsbGUnIHwgJ1BldGFsdW1hJyB8ICdMZWxhbmQnO1xyXG4vKipcclxuICogQXJyYXJ5IG9mIGVuZ3JhdmluZyBmb250cyBhdmFpbGFibGUgaW4gU21vb3NpY1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVuZ3JhdmluZ0ZvbnRUeXBlczogZW5ncmF2aW5nRm9udFR5cGVbXSA9IFsnQnJhdnVyYScsICdHb252aWxsZScsICdQZXRhbHVtYScsICdMZWxhbmQnXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VuZ3JhdmluZ0ZvbnQoZXQ6IGVuZ3JhdmluZ0ZvbnRUeXBlIHwgc3RyaW5nKTogZXQgaXMgZW5ncmF2aW5nRm9udFR5cGUge1xyXG4gIHJldHVybiAoZW5ncmF2aW5nRm9udFR5cGVzIGFzIGFueVtdKS5pbmRleE9mKGV0KSA+PSAwO1xyXG59XHJcblxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycy4gIFVzdWFsbHkgeW91IHdpbGwgY2FsbFxyXG4gKiB7QGxpbmsgU21vU2NvcmUuZGVmYXVsdHN9LCBhbmQgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkIHRvIGNoYW5nZS5cclxuICogQSBuZXcgc2NvcmUgd2l0aCB0aGUgZGVmYXVsdHMgd2lsbCBjcmVhdGUgYSBzaW5nbGUsIGVtcHR5IG1lYXN1cmUuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIGdsb2JhbCBmb250IGRlZmF1bHRzIGZvciB0aGlzIHNjb3JlXHJcbiAgICovXHJcbiAgZm9udHM6IEZvbnRQdXJwb3NlW10sXHJcbiAgLyoqXHJcbiAgICogaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlXHJcbiAgICovXHJcbiAgc2NvcmVJbmZvOiBTbW9TY29yZUluZm8sXHJcbiAgLyoqXHJcbiAgICogY3VzdG9taXplZCBlZGl0b3IgYmVoYXZpb3JcclxuICAgKi9cclxuICBwcmVmZXJlbmNlczogU21vU2NvcmVQcmVmZXJlbmNlcyxcclxuICAvKipcclxuICAgKiBjb250YWluZWQge0BsaW5rIFNtb1N5c3RlbVN0YWZmUGFyYW1zfSBvYmplY3RzXHJcbiAgICovXHJcbiAgc3RhdmVzOiBTbW9TeXN0ZW1TdGFmZlBhcmFtc1tdLFxyXG4gIGFjdGl2ZVN0YWZmPzogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHNjb3JlIHRleHQsIG5vdCBwYXJ0IG9mIHNwZWNpZmljIG11c2ljXHJcbiAgICovXHJcbiAgdGV4dEdyb3VwczogU21vVGV4dEdyb3VwW10sXHJcbiAgLyoqXHJcbiAgICogU3lzdGVtIGdyb3VwcyBmb3IgZm9ybWF0dGluZy9qdXN0aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgc3lzdGVtR3JvdXBzOiBTbW9TeXN0ZW1Hcm91cFtdLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZTogZ2xvYmFsIGF1ZGlvIHNldHRpbmdzXHJcbiAgICovXHJcbiAgYXVkaW9TZXR0aW5nczogU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLFxyXG4gIC8qKlxyXG4gICAqIGxheW91dCBtYW5hZ2VyLCBmb3Igc3ZnIGFuZCBkaXYgZ2VvbWV0cnksIHBhZ2Ugc2l6ZXMsIGhlYWRlciBzaXplcyBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXIsXHJcbiAgLyoqXHJcbiAgICogbWVhc3VyZS1zcGVjaWZpYyBmb3JtYXR0aW5nXHJcbiAgICovXHJcbiAgZm9ybWF0dGluZ01hbmFnZXI/OiBTbW9Gb3JtYXR0aW5nTWFuYWdlclxyXG59XHJcbmZ1bmN0aW9uIGlzU21vU2NvcmVQYXJhbXMocGFyYW1zOiBQYXJ0aWFsPFNtb1Njb3JlUGFyYW1zPik6IHBhcmFtcyBpcyBTbW9TY29yZVBhcmFtcyB7XHJcbiAgaWYgKHBhcmFtcy5mb250cyAmJiBwYXJhbXMuZm9udHMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBTZXJpYWxpemF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGVudGlyZSBzY29yZS4gIFNjb3JlIGlzIGRlc2VyaWFsaXplZCBmcm9tIHRoaXNcclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVQYXJhbXNTZXIge1xyXG4gIC8qKlxyXG4gICAqIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlLCBtb3N0bHkgbm9uLW11c2ljYWxcclxuICAgKi9cclxuICBtZXRhZGF0YTogU2NvcmVNZXRhZGF0YVNlcixcclxuICAvKipcclxuICAgKiBjb250YWluZWQge0BsaW5rIFNtb1N5c3RlbVN0YWZmUGFyYW1zfSBvYmplY3RzXHJcbiAgICovXHJcbiAgc3RhdmVzOiBTbW9TeXN0ZW1TdGFmZlBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIHNjb3JlIHRleHQsIG5vdCBwYXJ0IG9mIHNwZWNpZmljIG11c2ljXHJcbiAgICovXHJcbiAgdGV4dEdyb3VwczogU21vVGV4dEdyb3VwUGFyYW1zU2VyW10sXHJcbiAgLyoqXHJcbiAgICogU3lzdGVtIGdyb3VwcyBmb3IgZm9ybWF0dGluZy9qdXN0aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgc3lzdGVtR3JvdXBzOiBTbW9TeXN0ZW1Hcm91cFBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZTogZ2xvYmFsIGF1ZGlvIHNldHRpbmdzXHJcbiAgICovXHJcbiAgYXVkaW9TZXR0aW5nczogU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLFxyXG4gIC8qKlxyXG4gICAqIGxheW91dCBtYW5hZ2VyLCBmb3Igc3ZnIGFuZCBkaXYgZ2VvbWV0cnksIHBhZ2Ugc2l6ZXMsIGhlYWRlciBzaXplcyBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXJQYXJhbXNTZXIsXHJcbiAgLyoqXHJcbiAgICogbWFwIG9mIG1lYXN1cmUgZm9ybWF0cyB0byBtZWFzdXJlXHJcbiAgICovXHJcbiAgbWVhc3VyZUZvcm1hdHM6IFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXJbXSxcclxuICAvKipcclxuICAgKiB0ZW1wbywga2V5IGFuZCBvdGhlciBjb2x1bW4tbWFwcGVkIHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBjb2x1bW5BdHRyaWJ1dGVNYXA6IENvbHVtblBhcmFtc01hcFR5cGUsXHJcbiAgLyoqXHJcbiAgICogZGljdGlvbmFyeSBjb21wcmVzc2lvbiBmb3Igc2VyaWFsaXphdGlvblxyXG4gICAqL1xyXG4gIGRpY3Rpb25hcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVTZXJpYWxpemVPcHRpb25zIHtcclxuICBza2lwU3RhdmVzOiBib29sZWFuLFxyXG4gIHVzZURpY3Rpb25hcnk6IGJvb2xlYW4sXHJcbiAgcHJlc2VydmVTdGFmZklkczogYm9vbGVhbiAvLyBwcmVzZXJ2ZSBzdGFmZiBtb2RpZmllcnMgSURzIHRvIGtlZXAgaW4gc3luY1xyXG59XHJcbi8vIGRvbnQnIGRlc2VyaWFsaXplIHRyaXZpYWwgdGV4dCBibG9ja3Mgc2F2ZWQgYnkgbWlzdGFrZVxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eVRleHRCbG9jayhwYXJhbXM6IFBhcnRpYWw8U21vVGV4dEdyb3VwUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9UZXh0R3JvdXBQYXJhbXNTZXIge1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcz8udGV4dEJsb2NrcykgfHwgQXJyYXkuaXNBcnJheSgocGFyYW1zIGFzIGFueSk/LmJsb2NrcykpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGFyYW1zTWFwVHlwZSB7XHJcbiAga2V5U2lnbmF0dXJlOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+LFxyXG4gIHRlbXBvOiBSZWNvcmQ8bnVtYmVyLCBTbW9UZW1wb1RleHQ+LFxyXG4gIHRpbWVTaWduYXR1cmU6IFJlY29yZDxudW1iZXIsIFRpbWVTaWduYXR1cmU+LFxyXG4gIHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+XHJcbn1cclxuXHJcbi8vIFNtb1Njb3JlUGFyZW1zU2VyXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1Ntb1Njb3JlUGFyZW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9TY29yZVBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vU2NvcmVQYXJhbXNTZXIge1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF2ZXMpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBVbmlvbiBvZiBtb2RpZmllciB0eXBlcyBTbW8gbW9kaWZpZXIgdHlwZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNtb01vZGlmaWVyID0gU21vTm90ZU1vZGlmaWVyQmFzZSB8IFNtb01lYXN1cmVNb2RpZmllckJhc2UgfCBTdGFmZk1vZGlmaWVyQmFzZSB8IFNtb1Njb3JlTW9kaWZpZXJCYXNlO1xyXG5cclxuLyoqXHJcbiAqIFNjb3JlIGlzIGEgY29udGFpbmVyIG9mIHN0YXZlcywgYW5kIG1ldGFkYXRhIGFib3V0IHRoZSBzY29yZS4gIFNlcmlhbGl6aW5nIHRoZSBzY29yZSBzZXJpYWxpemVzIHRoZSBcclxuICogY2hpbGQgb2JqZWN0LiAgSXQgaXMgdGhlIGhpZ2hlc3QtbGV2ZWwgb2JqZWN0IGluIFNtb29zaWMuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9TY29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFwIG9mIGluc3RydW1lbnRzIHRvIHN0YXZlcywgdXNlZCBpbiBzZXJpYWxpemF0aW9uLlxyXG4gICAqXHJcbiAgICogQHR5cGUge2FueVtdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIGluc3RydW1lbnRNYXA6IGFueVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBmb250cyBpbiB0aGlzIHNjb3JlLCBmb3IgZWFjaCB0eXBlIG9mIHRleHQgKGx5cmljcywgZXRjKVxyXG4gICAqXHJcbiAgICogQHR5cGUge0ZvbnRQdXJwb3NlW119XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgZm9udHM6IEZvbnRQdXJwb3NlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBHZW5lcmFsIGluZm8gYWJvdXQgdGhlIHNjb3JlLCB1c2VkIGZvciBleHBvcnQgYW5kIGxpYnJhcnlcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TY29yZUluZm99XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgc2NvcmVJbmZvOiBTbW9TY29yZUluZm8gPSBTbW9TY29yZS5zY29yZUluZm9EZWZhdWx0cztcclxuICAvKipcclxuICAgKiBEZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIHNjb3JlLiAgSW5kaWNhdGVzIHNvbWUgZ2xvYmFsIGJlaGF2aW9yIGxpa2Ugd2hldGhlciB0byBhZHZhbmNlIHRoZSBjdXJzb3IuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vU2NvcmVQcmVmZXJlbmNlc31cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBwcmVmZXJlbmNlczogU21vU2NvcmVQcmVmZXJlbmNlcyA9IG5ldyBTbW9TY29yZVByZWZlcmVuY2VzKFNtb1Njb3JlUHJlZmVyZW5jZXMuZGVmYXVsdHMpO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBzdGF2ZXMgdGhhdCBtYWtlIHVwIHRoZSBtdXNpYyBvZiB0aGUgc2NvcmVcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TeXN0ZW1TdGFmZltdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN0YXZlczogU21vU3lzdGVtU3RhZmZbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBhY3RpdmUgc3RhZmYsIHVzZWQgZm9yIHNvbWUgdHlwZXMgb2Ygc2VsZWN0aW9ucy4gIE5vdCBzZXJpYWxpemVkLlxyXG4gICAqXHJcbiAgICogQHR5cGUge251bWJlcn1cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBhY3RpdmVTdGFmZjogbnVtYmVyID0gMDtcclxuICAvKipcclxuICAgKiBUZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUsIGJ1dCBub3QgYSBzcGVjaWZpYyBtdXNpY2FsIGVsZW1lbnQgKGUuZy4gbHlyaWNzIGFyZSBjb250YWlucyBieSBub3RlcylcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9UZXh0R3JvdXBbXX1cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIEEgbG9naWNhbCBncm91cGluZyBvZiBzdGF2ZXMgZm9yIGp1c3RpZmljYXRpb25cclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TeXN0ZW1Hcm91cFtdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN5c3RlbUdyb3VwczogU21vU3lzdGVtR3JvdXBbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIHNvbWUgYXVkaW8gcGxheWVyIGRlZmF1bHRzXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vQXVkaW9QbGF5ZXJTZXR0aW5nc31cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBhdWRpb1NldHRpbmdzOiBTbW9BdWRpb1BsYXllclNldHRpbmdzO1xyXG4gIC8qKlxyXG4gICAqIFByZXNlcnZlIGEgbWFwIG9mIG1lYXN1cmVzIHRvIHRoZWlyIGFjdHVhbCBtZWFzdXJlIG51bWJlcnNcclxuICAgKlxyXG4gICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBudW1iZXI+fVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgLyoqXHJcbiAgICogcGFnZSBhbmQgcmVuZGVyaW5nIGxheW91dCBvZiB0aGUgc2NvcmUsIGluY2x1ZGluZyB0aGUgcHBpIGFuZCBzY2FsaW5nIG9mIHRoZSBwYWdlcy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9MYXlvdXRNYW5hZ2VyfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIGxheW91dE1hbmFnZXI/OiBTbW9MYXlvdXRNYW5hZ2VyO1xyXG4gIC8qKlxyXG4gICAqIHBlci1tZWFzdXJlIGZvcm1hdHRpbmcgY3VzdG9taXphdGlvbnMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vRm9ybWF0dGluZ01hbmFnZXJ9XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgZm9ybWF0dGluZ01hbmFnZXI/OiBTbW9Gb3JtYXR0aW5nTWFuYWdlclxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU21vU2NvcmVQYXJhbXMpIHtcclxuICAgIHNtb1NlcmlhbGl6ZS52ZXhNZXJnZSh0aGlzLCBTbW9TY29yZS5kZWZhdWx0cyk7XHJcbiAgICBzbW9TZXJpYWxpemUudmV4TWVyZ2UodGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghdGhpcy5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TWFuYWdlciA9IG5ldyBTbW9MYXlvdXRNYW5hZ2VyKFNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm1hdHRpbmdNYW5hZ2VyKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0dGluZ01hbmFnZXIgPSBuZXcgU21vRm9ybWF0dGluZ01hbmFnZXIoU21vRm9ybWF0dGluZ01hbmFnZXIuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGJlYW1pbmcgcnVsZXMgYmFzZWQgb24gcHJlZmVyZW5jZXMuXHJcbiAgICBjb25zdCBwcmVmID0gdGhpcy5wcmVmZXJlbmNlcztcclxuICAgIFNtb01lYXN1cmUuZGVmYXVsdER1cGxlRHVyYXRpb24gPSBwcmVmLmRlZmF1bHREdXBsZUR1cmF0aW9uO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0VHJpcGxlRHVyYXRpb24gPSBwcmVmLmRlZmF1bHRUcmlwbGVEdXJhdGlvbjtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgKHRoaXMucHJlZmVyZW5jZXMuc2hvd1BpYW5vKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5wcmVmZXJlbmNlcy5zaG93UGlhbm8gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYXVkaW9TZXR0aW5ncyA9IG5ldyBTbW9BdWRpb1BsYXllclNldHRpbmdzKHBhcmFtcy5hdWRpb1NldHRpbmdzKTtcclxuICAgIHRoaXMudXBkYXRlTWVhc3VyZUZvcm1hdHMoKTtcclxuICAgIHRoaXMudXBkYXRlU3lzdGVtR3JvdXBzKCk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZW5ncmF2aW5nRm9udHMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geyBCcmF2dXJhOiAnQnJhdnVyYScsIEdvbnZpbGxlOiAnR29udmlsbGUnLCBQZXRhbHVtYTogJ1BldGFsdW1hJyB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGZvbnRQdXJwb3NlcygpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcclxuICAgIHJldHVybiB7IEVOR1JBVklORzogMSwgU0NPUkU6IDIsIENIT1JEUzogMywgTFlSSUNTOiA0IH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgc2NvcmVJbmZvRGVmYXVsdHMoKTogU21vU2NvcmVJbmZvIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgbmFtZTogJ1Ntb29zaWNhbCcsXHJcbiAgICAgIHRpdGxlOiAnU21vb3NpY2FsJyxcclxuICAgICAgc3ViVGl0bGU6ICcoT3AuIDEpJyxcclxuICAgICAgY29tcG9zZXI6ICdNZScsXHJcbiAgICAgIGNvcHlyaWdodDogJycsXHJcbiAgICAgIHZlcnNpb246IDFcclxuICAgIH0pKTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBzY29yZU1ldGFkYXRhRGVmYXVsdHMoKTogU2NvcmVNZXRhZGF0YVNlciB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIGZvbnRzOiBbeyBuYW1lOiAnZW5ncmF2aW5nJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLkVOR1JBVklORywgZmFtaWx5OiAnQnJhdnVyYScsIHNpemU6IDEsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgeyBuYW1lOiAnc2NvcmUnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuU0NPUkUsIGZhbWlseTogJ01lcnJpd2VhdGhlcicsIHNpemU6IDE0LCBjdXN0b206IGZhbHNlIH0sXHJcbiAgICAgIHsgbmFtZTogJ2Nob3JkcycsIHB1cnBvc2U6IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5DSE9SRFMsIGZhbWlseTogJ1JvYm90byBTbGFiJywgc2l6ZTogMTQsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgeyBuYW1lOiAnbHlyaWNzJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLkxZUklDUywgZmFtaWx5OiAnTWVycml3ZWF0aGVyJywgc2l6ZTogMTIsIGN1c3RvbTogZmFsc2UgfSBdLFxyXG4gICAgICBzY29yZUluZm86IFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzLFxyXG4gICAgICByZW51bWJlcmluZ01hcDoge30sXHJcbiAgICAgIHByZWZlcmVuY2VzOiBuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhTbW9TY29yZVByZWZlcmVuY2VzLmRlZmF1bHRzKVxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb1Njb3JlUGFyYW1zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8vIGxlZ2FjeSBsYXlvdXQgc3RydWN0dXJlLiAgTm93IHdlIHVzZSBwYWdlcy5cclxuICAgICAgZm9udHM6IFtcclxuICAgICAgICB7IG5hbWU6ICdlbmdyYXZpbmcnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuRU5HUkFWSU5HLCBmYW1pbHk6ICdCcmF2dXJhJywgc2l6ZTogMSwgY3VzdG9tOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogJ3Njb3JlJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLlNDT1JFLCBmYW1pbHk6ICdNZXJyaXdlYXRoZXInLCBzaXplOiAxNCwgY3VzdG9tOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogJ2Nob3JkcycsIHB1cnBvc2U6IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5DSE9SRFMsIGZhbWlseTogJ1JvYm90byBTbGFiJywgc2l6ZTogMTQsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6ICdseXJpY3MnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuTFlSSUNTLCBmYW1pbHk6ICdNZXJyaXdlYXRoZXInLCBzaXplOiAxMiwgY3VzdG9tOiBmYWxzZSB9XHJcbiAgICAgIF0sXHJcbiAgICAgIHNjb3JlSW5mbzogU21vU2NvcmUuc2NvcmVJbmZvRGVmYXVsdHMsXHJcbiAgICAgIGF1ZGlvU2V0dGluZ3M6IG5ldyBTbW9BdWRpb1BsYXllclNldHRpbmdzKFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MuZGVmYXVsdHMpLFxyXG4gICAgICBwcmVmZXJlbmNlczogbmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMoU21vU2NvcmVQcmVmZXJlbmNlcy5kZWZhdWx0cyksXHJcbiAgICAgIHN0YXZlczogW10sXHJcbiAgICAgIGFjdGl2ZVN0YWZmOiAwLFxyXG4gICAgICB0ZXh0R3JvdXBzOiBbXSxcclxuICAgICAgc3lzdGVtR3JvdXBzOiBbXVxyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwYWdlU2l6ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsnbGV0dGVyJywgJ3RhYmxvaWQnLCAnQTQnLCAnQTRMYW5kc2NhcGUnLCAnY3VzdG9tJ107XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFnZURpbWVuc2lvbnMoKTogUmVjb3JkPHN0cmluZywgU3ZnRGltZW5zaW9ucz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2xldHRlcic6IHsgd2lkdGg6IDggKiA5NiArIDQ4LCBoZWlnaHQ6IDExICogOTYgfSxcclxuICAgICAgJ2xldHRlckxhbmRzY2FwZSc6IHsgd2lkdGg6IDExICogOTYsIGhlaWdodDogOCAqIDk2ICsgNDggfSxcclxuICAgICAgJ3RhYmxvaWQnOiB7IHdpZHRoOiAxNjMyLCBoZWlnaHQ6IDEwNTYgfSxcclxuICAgICAgJ0E0JzogeyB3aWR0aDogNzk0LCBoZWlnaHQ6IDExMjIgfSxcclxuICAgICAgJ0E0TGFuZHNjYXBlJzogeyB3aWR0aDogMTEyMiwgaGVpZ2h0OiA3OTQgfSxcclxuICAgICAgJ2N1c3RvbSc6IHsgd2lkdGg6IDEsIGhlaWdodDogMSB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgcGFnZVNpemVGcm9tRGltZW5zaW9ucyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgcnYgPVxyXG4gICAgICBTbW9TY29yZS5wYWdlU2l6ZXMuZmluZCgoc3opID0+IFNtb1Njb3JlLnBhZ2VEaW1lbnNpb25zW3N6XS53aWR0aCA9PT0gd2lkdGggJiYgU21vU2NvcmUucGFnZURpbWVuc2lvbnNbc3pdLmhlaWdodCA9PT0gaGVpZ2h0KVxyXG4gICAgICA/PyBudWxsO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBwcmVmZXJlbmNlcygpIHtcclxuICAgIHJldHVybiBbJ3ByZWZlcmVuY2VzJywgJ2ZvbnRzJywgJ3Njb3JlSW5mbycsICdhdWRpb1NldHRpbmdzJ107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNlcmlhbGl6ZSB0aGUga2V5U2lnbmF0dXJlLCB0ZW1wbyBhbmQgdGltZSBzaWduYXR1cmUsIHdoaWNoIGFyZSBtYXBwZWRcclxuICAgKiB0byBhIGNvbHVtbiBhdCBhIG1lYXN1cmUgaW5kZXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzZXJpYWxpemVDb2x1bW5NYXBwZWQoZnVuYzogKG1lYXN1cmU6IFNtb01lYXN1cmUpID0+IENvbHVtbk1hcHBlZFBhcmFtcykge1xyXG4gICAgY29uc3Qga2V5U2lnbmF0dXJlOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge307XHJcbiAgICBjb25zdCB0ZW1wbzogUmVjb3JkPG51bWJlciwgU21vVGVtcG9UZXh0PiA9IHt9O1xyXG4gICAgY29uc3QgdGltZVNpZ25hdHVyZTogUmVjb3JkPG51bWJlciwgVGltZVNpZ25hdHVyZT4gPSB7fTtcclxuICAgIGNvbnN0IHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgICBsZXQgcHJldmlvdXM6IENvbHVtbk1hcHBlZFBhcmFtcyB8IG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50ID0gZnVuYyhtZWFzdXJlKTtcclxuICAgICAgY29uc3QgaXggPSBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgICBjb25zdCBjdXJyZW50SW5zdHJ1bWVudCA9IHRoaXMuc3RhdmVzWzBdLmdldFN0YWZmSW5zdHJ1bWVudChpeCk7XHJcbiAgICAgIGN1cnJlbnQua2V5U2lnbmF0dXJlID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChjdXJyZW50LmtleVNpZ25hdHVyZSwgLTEgKiBjdXJyZW50SW5zdHJ1bWVudC5rZXlPZmZzZXQpO1xyXG4gICAgICBpZiAoaXggPT09IDApIHtcclxuICAgICAgICBrZXlTaWduYXR1cmVbMF0gPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICB0ZW1wb1swXSA9IGN1cnJlbnQudGVtcG87XHJcbiAgICAgICAgdGltZVNpZ25hdHVyZVswXSA9IGN1cnJlbnQudGltZVNpZ25hdHVyZTtcclxuICAgICAgICByZW51bWJlcmluZ01hcFswXSA9IDA7XHJcbiAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMucmVudW1iZXJpbmdNYXBbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0pID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgcmVudW1iZXJpbmdNYXBbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSB0aGlzLnJlbnVtYmVyaW5nTWFwW21lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudC5rZXlTaWduYXR1cmUgIT09IHByZXZpb3VzIS5rZXlTaWduYXR1cmUpIHtcclxuICAgICAgICAgIHByZXZpb3VzIS5rZXlTaWduYXR1cmUgPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICAgIGtleVNpZ25hdHVyZVtpeF0gPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEoVGltZVNpZ25hdHVyZS5lcXVhbChjdXJyZW50LnRpbWVTaWduYXR1cmUsIHByZXZpb3VzIS50aW1lU2lnbmF0dXJlKSkpIHtcclxuICAgICAgICAgIHByZXZpb3VzIS50aW1lU2lnbmF0dXJlID0gY3VycmVudC50aW1lU2lnbmF0dXJlO1xyXG4gICAgICAgICAgdGltZVNpZ25hdHVyZVtpeF0gPSBjdXJyZW50LnRpbWVTaWduYXR1cmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFNtb1RlbXBvVGV4dC5lcShjdXJyZW50LnRlbXBvLCBwcmV2aW91cyEudGVtcG8pKSkge1xyXG4gICAgICAgICAgcHJldmlvdXMhLnRlbXBvID0gY3VycmVudC50ZW1wbztcclxuICAgICAgICAgIHRlbXBvW2l4XSA9IGN1cnJlbnQudGVtcG87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IGtleVNpZ25hdHVyZSwgdGVtcG8sIHRpbWVTaWduYXR1cmUsIHJlbnVtYmVyaW5nTWFwIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2x1bW4tbWFwcGVkIGF0dHJpYnV0ZXMgc3RheSB0aGUgc2FtZSBpbiBlYWNoIG1lYXN1cmUgdW50aWxcclxuICAgKiBjaGFuZ2VkLCBsaWtlIGtleS1zaWduYXR1cmVzLiAgV2UgZG9uJ3Qgc3RvcmUgZWFjaCBtZWFzdXJlIHZhbHVlIHRvXHJcbiAgICogbWFrZSB0aGUgZmlsZXMgc21hbGxlclxyXG4gICAqIEBwYXJhbSBzY29yZU9iaiAtIHRoZSBqc29uIGJsb2IgdGhhdCBjb250YWlucyB0aGUgc2NvcmUgZGF0YVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUNvbHVtbk1hcHBlZChzY29yZU9iajogYW55KSB7XHJcbiAgICBsZXQgY3VyVmFsdWU6IGFueTtcclxuICAgIGxldCBtYXBJeDogbnVtYmVyID0gMDtcclxuICAgIGlmICghc2NvcmVPYmouY29sdW1uQXR0cmlidXRlTWFwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmtleXMoc2NvcmVPYmouY29sdW1uQXR0cmlidXRlTWFwKTtcclxuICAgIHNjb3JlT2JqLnN0YXZlcy5mb3JFYWNoKChzdGFmZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGF0dHJJeE1hcDogYW55ID0ge307XHJcbiAgICAgIGF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICBhdHRySXhNYXBbYXR0cl0gPSAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHN0YWZmLm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICAgIG1hcEl4ID0gYXR0ckl4TWFwW2F0dHJdO1xyXG4gICAgICAgICAgY29uc3QgY3VySGFzaCA9IHNjb3JlT2JqLmNvbHVtbkF0dHJpYnV0ZU1hcFthdHRyXTtcclxuICAgICAgICAgIGNvbnN0IGF0dHJLZXlzOiBhbnkgPSBPYmplY3Qua2V5cyhjdXJIYXNoKTtcclxuICAgICAgICAgIGN1clZhbHVlID0gY3VySGFzaFthdHRyS2V5c1ttYXBJeC50b1N0cmluZygpXV07XHJcbiAgICAgICAgICBhdHRyS2V5cy5zb3J0KChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gcGFyc2VJbnQoYSwgMTApID4gcGFyc2VJbnQoYiwgMTApID8gMSA6IC0xKTtcclxuICAgICAgICAgIGlmIChhdHRyS2V5cy5sZW5ndGggPiBtYXBJeCArIDEpIHtcclxuICAgICAgICAgICAgaWYgKG1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXggPj0gYXR0cktleXNbbWFwSXggKyAxXSkge1xyXG4gICAgICAgICAgICAgIG1hcEl4ICs9IDE7XHJcbiAgICAgICAgICAgICAgY3VyVmFsdWUgPSBjdXJIYXNoW2F0dHJLZXlzW21hcEl4LnRvU3RyaW5nKCldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGVnYWN5IHRpbWVTaWduYXR1cmUgZm9ybWF0IHdhcyBqdXN0IGEgc3RyaW5nIDIvNCwgMy84IGV0Yy5cclxuICAgICAgICAgIGlmIChhdHRyID09PSAndGltZVNpZ25hdHVyZScpIHtcclxuICAgICAgICAgICAgY29uc3QgdHMgPSBuZXcgVGltZVNpZ25hdHVyZShUaW1lU2lnbmF0dXJlLmRlZmF1bHRzKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY3VyVmFsdWUpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgIHRzLnRpbWVTaWduYXR1cmUgPSBjdXJWYWx1ZTtcclxuICAgICAgICAgICAgICBtZWFzdXJlW2F0dHJdID0gdHM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbWVhc3VyZVthdHRyXSA9IFRpbWVTaWduYXR1cmUuY3JlYXRlRnJvbVBhcnRpYWwoY3VyVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZWFzdXJlW2F0dHJdID0gY3VyVmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRySXhNYXBbYXR0cl0gPSBtYXBJeDtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlcmlhbGl6ZSB0aGUgZW50aXJlIHNjb3JlLlxyXG4gICAqIEByZXR1cm5zIEpTT04gb2JqZWN0XHJcbiAgICovXHJcbiAgc2VyaWFsaXplKG9wdGlvbnM/OiBTbW9TY29yZVNlcmlhbGl6ZU9wdGlvbnMpOiBTbW9TY29yZVBhcmFtc1NlciB7XHJcbiAgICBjb25zdCBza2lwU3RhdmVzID0gb3B0aW9ucz8uc2tpcFN0YXZlcyA/PyBmYWxzZTtcclxuICAgIGNvbnN0IHVzZURpY3Rpb25hcnkgPSBvcHRpb25zPy5za2lwU3RhdmVzID8/IHRydWU7XHJcbiAgICBjb25zdCBwcmVzZXJ2ZUlkcyA9IG9wdGlvbnM/LnByZXNlcnZlU3RhZmZJZHMgPz8gZmFsc2U7XHJcbiAgICBsZXQgb2JqOiBQYXJ0aWFsPFNtb1Njb3JlUGFyYW1zU2VyPiA9IHtcclxuICAgICAgbGF5b3V0TWFuYWdlcjogeyBjdG9yOiAnU21vTGF5b3V0TWFuYWdlcicsIC4uLlNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMgfSxcclxuICAgICAgYXVkaW9TZXR0aW5nczoge30sXHJcbiAgICAgIG1lYXN1cmVGb3JtYXRzOiBbXSxcclxuICAgICAgc3RhdmVzOiBbXSxcclxuICAgICAgdGV4dEdyb3VwczogW10sXHJcbiAgICAgIHN5c3RlbUdyb3VwczogW10sXHJcbiAgICAgIG1ldGFkYXRhOiBTbW9TY29yZS5zY29yZU1ldGFkYXRhRGVmYXVsdHNcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIG9iai5sYXlvdXRNYW5hZ2VyID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnNlcmlhbGl6ZSgpO1xyXG4gICAgfVxyXG4gICAgb2JqLm1ldGFkYXRhIS5mb250cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mb250cykpO1xyXG4gICAgb2JqLm1ldGFkYXRhIS5yZW51bWJlcmluZ01hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yZW51bWJlcmluZ01hcCkpO1xyXG4gICAgb2JqLm1ldGFkYXRhIS5wcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXMuc2VyaWFsaXplKCk7XHJcbiAgICBvYmoubWV0YWRhdGEhLnNjb3JlSW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zY29yZUluZm8pKTtcclxuICAgIGlmICh0eXBlb2YgKG9iaj8ubWV0YWRhdGE/LnNjb3JlSW5mbz8udmVyc2lvbikgIT09ICdudW1iZXInKSB7XHJcbiAgICAgIG9iai5tZXRhZGF0YSEuc2NvcmVJbmZvLnZlcnNpb24gPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybWF0dGluZ01hbmFnZXIpIHtcclxuICAgICAgb2JqLm1lYXN1cmVGb3JtYXRzID0gdGhpcy5mb3JtYXR0aW5nTWFuYWdlci5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvYmouYXVkaW9TZXR0aW5ncyA9IHRoaXMuYXVkaW9TZXR0aW5ncy5zZXJpYWxpemUoKTtcclxuICAgIGlmICghc2tpcFN0YXZlcykge1xyXG4gICAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZjogU21vU3lzdGVtU3RhZmYpID0+IHtcclxuICAgICAgICBvYmouc3RhdmVzIS5wdXNoKHN0YWZmLnNlcmlhbGl6ZSh7IHNraXBNYXBzOiB0cnVlLCBwcmVzZXJ2ZUlkczogcHJlc2VydmVJZHMgfSkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9iai5zdGF2ZXMgPSBbXTtcclxuICAgIH1cclxuICAgIC8vIFNjb3JlIHRleHQgaXMgbm90IHBhcnQgb2YgdGV4dCBncm91cCwgc28gZG9uJ3Qgc2F2ZSBzZXBhcmF0ZWx5LlxyXG4gICAgdGhpcy50ZXh0R3JvdXBzLmZvckVhY2goKHRnKSA9PiB7XHJcbiAgICAgIGlmICh0Zy5pc1RleHRWaXNpYmxlKCkpIHtcclxuICAgICAgICBvYmoudGV4dEdyb3VwcyEucHVzaCh0Zy5zZXJpYWxpemUoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMuZm9yRWFjaCgoZ2cpID0+IHtcclxuICAgICAgb2JqLnN5c3RlbUdyb3VwcyEucHVzaChnZy5zZXJpYWxpemUoKSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGdldFNlck1lYXN1cmUgPSAobWVhc3VyZTogU21vTWVhc3VyZSk6IENvbHVtbk1hcHBlZFBhcmFtcyA9PiB7XHJcbiAgICAgIHJldHVybiBtZWFzdXJlLnNlcmlhbGl6ZUNvbHVtbk1hcHBlZCgpO1xyXG4gICAgfVxyXG4gICAgb2JqLmNvbHVtbkF0dHJpYnV0ZU1hcCA9IHRoaXMuc2VyaWFsaXplQ29sdW1uTWFwcGVkKGdldFNlck1lYXN1cmUpO1xyXG4gICAgaWYgKHVzZURpY3Rpb25hcnkpIHtcclxuICAgICAgc21vU2VyaWFsaXplLmpzb25Ub2tlbnMob2JqKTtcclxuICAgICAgb2JqID0gc21vU2VyaWFsaXplLmRldG9rZW5pemUob2JqLCBzbW9TZXJpYWxpemUudG9rZW5WYWx1ZXMpO1xyXG4gICAgICBvYmouZGljdGlvbmFyeSA9IHNtb1NlcmlhbGl6ZS50b2tlbk1hcDtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmogYXMgU21vU2NvcmVQYXJhbXNTZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTY29yZVByZWZlcmVuY2VzKHByZWY6IFNtb1Njb3JlUHJlZmVyZW5jZXMpIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMgPSBwcmVmO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0RHVwbGVEdXJhdGlvbiA9IHByZWYuZGVmYXVsdER1cGxlRHVyYXRpb247XHJcbiAgICBTbW9NZWFzdXJlLmRlZmF1bHRUcmlwbGVEdXJhdGlvbiA9IHByZWYuZGVmYXVsdFRyaXBsZUR1cmF0aW9uO1xyXG4gIH1cclxuICBnZXQgZW5ncmF2aW5nRm9udCgpOiBlbmdyYXZpbmdGb250VHlwZSB7XHJcbiAgICBjb25zdCBlZm9udCA9IHRoaXMuZm9udHMuZmluZCgoeCkgPT4geC5wdXJwb3NlID09PSBTbW9TY29yZS5mb250UHVycG9zZXMuRU5HUkFWSU5HKTtcclxuICAgIGlmIChlZm9udCkge1xyXG4gICAgICBjb25zdCB2YWw6IGVuZ3JhdmluZ0ZvbnRUeXBlIHwgdW5kZWZpbmVkID0gZW5ncmF2aW5nRm9udFR5cGVzLmZpbmQoKHgpID0+IHggPT09IGVmb250LmZhbWlseSk7XHJcbiAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ0JyYXZ1cmEnO1xyXG4gIH1cclxuICBzZXQgZW5ncmF2aW5nRm9udCh2YWx1ZTogZW5ncmF2aW5nRm9udFR5cGUpIHtcclxuICAgIGNvbnN0IGVmb250ID0gdGhpcy5mb250cy5maW5kKCh4KSA9PiB4LnB1cnBvc2UgPT09IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5FTkdSQVZJTkcpO1xyXG4gICAgaWYgKGVmb250ICYmIGlzRW5ncmF2aW5nRm9udCh2YWx1ZSkpIHtcclxuICAgICAgZWZvbnQuZmFtaWx5ID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyB1cENvbnZlcnRHbG9iYWxMYXlvdXQoanNvbk9iajogYW55KSB7XHJcbiAgICAvLyB1cGNvbnZlcnQgZ2xvYmFsIGxheW91dCwgd2hpY2ggdXNlZCB0byBiZSBkaXJlY3RseSBvbiBsYXlvdXRNYW5hZ2VyXHJcbiAgICBpZiAodHlwZW9mIChqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0KSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAganNvbk9iai5sYXlvdXRNYW5hZ2VyLmdsb2JhbExheW91dCA9IHtcclxuICAgICAgICBzdmdTY2FsZToganNvbk9iai5sYXlvdXRNYW5hZ2VyLnN2Z1NjYWxlLFxyXG4gICAgICAgIHpvb21TY2FsZToganNvbk9iai5sYXlvdXRNYW5hZ2VyLnpvb21TY2FsZSxcclxuICAgICAgICBwYWdlV2lkdGg6IGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlV2lkdGgsXHJcbiAgICAgICAgcGFnZUhlaWdodDoganNvbk9iai5sYXlvdXRNYW5hZ2VyLnBhZ2VIZWlnaHQsXHJcbiAgICAgICAgbm90ZVNwYWNpbmc6IGpzb25PYmoubGF5b3V0TWFuYWdlci5ub3RlU3BhY2luZ1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAoIWpzb25PYmoubGF5b3V0TWFuYWdlci5nbG9iYWxMYXlvdXQubm90ZVNwYWNpbmcpIHtcclxuICAgICAgICBqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0Lm5vdGVTcGFjaW5nID0gMS4wO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgbGVnYWN5IHNjb3JlIGxheW91dCB0byBsYXlvdXRNYW5hZ2VyIG9iamVjdCBwYXJhbWV0ZXJzXHJcbiAgICogQHBhcmFtIGpzb25PYmogXHJcbiAgICovXHJcbiAgc3RhdGljIHVwQ29udmVydExheW91dChqc29uT2JqOiBhbnkpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlciA9IHt9O1xyXG4gICAgU21vTGF5b3V0TWFuYWdlci5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAganNvbk9iai5sYXlvdXRNYW5hZ2VyW2F0dHJdID0ganNvbk9iai5zY29yZS5sYXlvdXRbYXR0cl07XHJcbiAgICB9KTtcclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cyA9IFtdO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGpzb25PYmouc2NvcmUubGF5b3V0LnBhZ2VzOyArK2kpIHtcclxuICAgICAgY29uc3QgcGFnZVNldHRpbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFNtb1BhZ2VMYXlvdXQuZGVmYXVsdHMpKTtcclxuICAgICAgU21vUGFnZUxheW91dC5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIChqc29uT2JqLnNjb3JlLmxheW91dFthdHRyXSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICBwYWdlU2V0dGluZ1thdHRyXSA9IGpzb25PYmouc2NvcmUubGF5b3V0W2F0dHJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cy5wdXNoKHBhZ2VTZXR0aW5nKTtcclxuICAgIH1cclxuICAgIFNtb1Njb3JlLnVwQ29udmVydEdsb2JhbExheW91dChqc29uT2JqKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhY2s6IGZvciB0aGUgY2FzZSBvZiBhIHNjb3JlIGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZSBwYXJ0LCB1c2UgdGhlIHRleHQgZnJvbSB0aGUgXHJcbiAgICogcGFydC5cclxuICAgKiBAcGFyYW0ganNvbk9iaiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZml4VGV4dEdyb3VwU2luZ2xlUGFydChqc29uT2JqOiBhbnkpIHtcclxuICAgIGlmIChqc29uT2JqLnN0YXZlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFqc29uT2JqLnN0YXZlc1swXS5wYXJ0SW5mbykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWpzb25PYmouc3RhdmVzWzBdLnBhcnRJbmZvLnRleHRHcm91cHMgfHwganNvbk9iai5zdGF2ZXNbMF0ucGFydEluZm8udGV4dEdyb3Vwcy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGpzb25PYmoudGV4dEdyb3VwcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoanNvbk9iai5zdGF2ZXNbMF0ucGFydEluZm8udGV4dEdyb3VwcykpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZXNlcmlhbGl6ZSBhbiBlbnRpcmUgc2NvcmVcclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBcclxuICAgKiBAcmV0dXJucyBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uU3RyaW5nOiBzdHJpbmcpOiBTbW9TY29yZSB7XHJcbiAgICBsZXQganNvbk9iajogUGFydGlhbDxTbW9TY29yZVBhcmFtc1Nlcj4gPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgbGV0IHVwY29udmVydEZvcm1hdCA9IGZhbHNlO1xyXG4gICAgbGV0IGZvcm1hdHRpbmdNYW5hZ2VyID0gbnVsbDtcclxuICAgIGlmIChqc29uT2JqLmRpY3Rpb25hcnkpIHtcclxuICAgICAganNvbk9iaiA9IHNtb1NlcmlhbGl6ZS5kZXRva2VuaXplKGpzb25PYmosIGpzb25PYmouZGljdGlvbmFyeSk7XHJcbiAgICB9XHJcbiAgICBTbW9TY29yZS5maXhUZXh0R3JvdXBTaW5nbGVQYXJ0KGpzb25PYmopO1xyXG4gICAgdXBjb252ZXJ0Rm9ybWF0ID0gdHlwZW9mIChqc29uT2JqLm1lYXN1cmVGb3JtYXRzKSA9PT0gJ3VuZGVmaW5lZCc7XHJcbiAgICBjb25zdCBwYXJhbXM6IFBhcnRpYWw8U21vU2NvcmVQYXJhbXM+ID0ge307XHJcbiAgICBjb25zdCBzdGF2ZXM6IFNtb1N5c3RlbVN0YWZmW10gPSBbXTtcclxuICAgIGpzb25PYmoudGV4dEdyb3VwcyA9IGpzb25PYmoudGV4dEdyb3VwcyA/IGpzb25PYmoudGV4dEdyb3VwcyA6IFtdO1xyXG5cclxuICAgIC8vIEV4cGxvZGUgdGhlIHNwYXJzZSBhcnJheXMgb2YgYXR0cmlidXRlcyBpbnRvIHRoZSBtZWFzdXJlc1xyXG4gICAgU21vU2NvcmUuZGVzZXJpYWxpemVDb2x1bW5NYXBwZWQoanNvbk9iaik7XHJcbiAgICAvLyAnc2NvcmUnIGF0dHJpYnV0ZSBuYW1lIGNoYW5nZXMgdG8gJ21ldGFkYXRhJ1xyXG4gICAgaWYgKHR5cGVvZiAoKGpzb25PYmogYXMgYW55KS5zY29yZSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGpzb25PYmoubWV0YWRhdGEgPSAoanNvbk9iaiBhcyBhbnkpLnNjb3JlO1xyXG4gICAgfVxyXG4gICAgLy8gbWVhbmluZyBvZiBjdXN0b21Qcm9wb3J0aW9uIGhhcyBjaGFuZ2VkLCBiYWNrd2FyZHMtY29tcGF0aWJsaXR5XHJcbiAgICBpZiAodHlwZW9mIChqc29uT2JqLm1ldGFkYXRhKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAganNvbk9iai5tZXRhZGF0YSA9IFNtb1Njb3JlLnNjb3JlTWV0YWRhdGFEZWZhdWx0cztcclxuICAgIH1cclxuICAgIC8vIHVwY29udmVydCBvbGQgcHJvcG9ydGlvbiBvcGVyYXRvclxyXG4gICAgY29uc3QganNvblByb3BVcCA9IGpzb25PYmoubWV0YWRhdGEucHJlZmVyZW5jZXMgYXMgYW55O1xyXG4gICAgaWYgKHR5cGVvZiAoanNvblByb3BVcCkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiAoanNvblByb3BVcC5jdXN0b21Qcm9wb3J0aW9uKSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cy5wcm9wb3J0aW9uYWxpdHkgPSBqc29uUHJvcFVwLmN1c3RvbVByb3BvcnRpb247XHJcbiAgICAgIGlmIChTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzLnByb3BvcnRpb25hbGl0eSA9PT0gU21vTWVhc3VyZUZvcm1hdC5sZWdhY3lQcm9wb3J0aW9uYWxpdHkpIHtcclxuICAgICAgICBTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzLnByb3BvcnRpb25hbGl0eSA9IFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdFByb3BvcnRpb25hbGl0eTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdXAtY29udmVydCBsZWdhY3kgbGF5b3V0IGRhdGFcclxuICAgIGlmICgoanNvbk9iai5tZXRhZGF0YSBhcyBhbnkpLmxheW91dCkge1xyXG4gICAgICBTbW9TY29yZS51cENvbnZlcnRMYXlvdXQoanNvbk9iaik7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai5sYXlvdXRNYW5hZ2VyICYmICFqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0KSB7XHJcbiAgICAgIFNtb1Njb3JlLnVwQ29udmVydEdsb2JhbExheW91dChqc29uT2JqKTtcclxuICAgIH1cclxuICAgIGlmICghanNvbk9iai5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIGpzb25PYmoubGF5b3V0TWFuYWdlciA9IHsgY3RvcjogXCJTbW9MYXlvdXRNYW5hZ2VyXCIsIC4uLlNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXJQYXJhbXM6IFNtb0xheW91dE1hbmFnZXJQYXJhbXMgPSB7XHJcbiAgICAgIGdsb2JhbExheW91dDoganNvbk9iai5sYXlvdXRNYW5hZ2VyLmdsb2JhbExheW91dCxcclxuICAgICAgLyoqXHJcbiAgICAgICAqIHBhZ2UgbWFyZ2lucyBmb3IgZWFjaCBwYWdlXHJcbiAgICAgICAqL1xyXG4gICAgICBwYWdlTGF5b3V0czogW11cclxuICAgIH1cclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cy5mb3JFYWNoKChwbCkgPT4ge1xyXG4gICAgICBjb25zdCBwYWdlTGF5b3V0ID0gbmV3IFNtb1BhZ2VMYXlvdXQocGwpO1xyXG4gICAgICBsYXlvdXRNYW5hZ2VyUGFyYW1zLnBhZ2VMYXlvdXRzLnB1c2gocGFnZUxheW91dCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXIgPSBuZXcgU21vTGF5b3V0TWFuYWdlcihsYXlvdXRNYW5hZ2VyUGFyYW1zKTtcclxuXHJcbiAgICAvLyBwYXJhbXMubGF5b3V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShTbW9TY29yZS5kZWZhdWx0cy5sYXlvdXQpKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoXHJcbiAgICAgIFsncmVudW1iZXJpbmdNYXAnLCAnZm9udHMnXSxcclxuICAgICAgU21vU2NvcmUuc2NvcmVNZXRhZGF0YURlZmF1bHRzLCBwYXJhbXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShcclxuICAgICAgWydyZW51bWJlcmluZ01hcCcsICdmb250cyddLFxyXG4gICAgICBqc29uT2JqLm1ldGFkYXRhLCBwYXJhbXMpO1xyXG4gICAgaWYgKGpzb25PYmoubWV0YWRhdGEucHJlZmVyZW5jZXMpIHtcclxuICAgICAgcGFyYW1zLnByZWZlcmVuY2VzID0gbmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMoanNvbk9iai5tZXRhZGF0YS5wcmVmZXJlbmNlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXJhbXMucHJlZmVyZW5jZXMgPSBuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhTbW9TY29yZVByZWZlcmVuY2VzLmRlZmF1bHRzKTtcclxuICAgIH1cclxuICAgIGlmIChqc29uT2JqLm1ldGFkYXRhLnNjb3JlSW5mbykge1xyXG4gICAgICBjb25zdCBzY29yZUluZm86IFBhcnRpYWw8U21vU2NvcmVJbmZvPiA9IHt9O1xyXG4gICAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb1Njb3JlSW5mb0tleXMsIFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzLCBzY29yZUluZm8pO1xyXG4gICAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb1Njb3JlSW5mb0tleXMsIGpzb25PYmoubWV0YWRhdGEuc2NvcmVJbmZvLCBzY29yZUluZm8pO1xyXG4gICAgICBwYXJhbXMuc2NvcmVJbmZvID0gKHNjb3JlSW5mbyBhcyBTbW9TY29yZUluZm8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW1zLnNjb3JlSW5mbyA9IFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzO1xyXG4gICAgfVxyXG4gICAgaWYgKCFqc29uT2JqLmF1ZGlvU2V0dGluZ3MpIHtcclxuICAgICAgcGFyYW1zLmF1ZGlvU2V0dGluZ3MgPSBuZXcgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncyhTbW9BdWRpb1BsYXllclNldHRpbmdzLmRlZmF1bHRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy5hdWRpb1NldHRpbmdzID0gU21vU2NvcmVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUoanNvbk9iai5hdWRpb1NldHRpbmdzKTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlID0gcGFyYW1zLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUgPz8gZmFsc2U7XHJcbiAgICBwYXJhbXMucHJlZmVyZW5jZXMuaGlkZUVtcHR5TGluZXMgPSBwYXJhbXMucHJlZmVyZW5jZXMuaGlkZUVtcHR5TGluZXMgPz8gZmFsc2U7XHJcbiAgICBsZXQgcmVudW1iZXJpbmdNYXA6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7IDA6IDAgfTtcclxuICAgIGlmIChqc29uT2JqLmNvbHVtbkF0dHJpYnV0ZU1hcCAmJiBqc29uT2JqLmNvbHVtbkF0dHJpYnV0ZU1hcC5yZW51bWJlcmluZ01hcCkge1xyXG4gICAgICByZW51bWJlcmluZ01hcCA9IGpzb25PYmouY29sdW1uQXR0cmlidXRlTWFwLnJlbnVtYmVyaW5nTWFwO1xyXG4gICAgfVxyXG4gICAgaWYgKCFqc29uT2JqLnN0YXZlcykge1xyXG4gICAgICB0aHJvdyAnYmFkIHNjb3JlLCBubyBzdGF2ZXM6ICcgKyBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcclxuICAgIH1cclxuICAgIGpzb25PYmouc3RhdmVzLmZvckVhY2goKHN0YWZmT2JqOiBhbnksIHN0YWZmSXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBzdGFmZk9iai5zdGFmZklkID0gc3RhZmZJeDtcclxuICAgICAgc3RhZmZPYmoucmVudW1iZXJpbmdNYXAgPSByZW51bWJlcmluZ01hcDtcclxuICAgICAgY29uc3Qgc3RhZmYgPSBTbW9TeXN0ZW1TdGFmZi5kZXNlcmlhbGl6ZShzdGFmZk9iaik7XHJcbiAgICAgIHN0YXZlcy5wdXNoKHN0YWZmKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRleHRHcm91cHM6IFNtb1RleHRHcm91cFtdID0gW107XHJcbiAgICBqc29uT2JqLnRleHRHcm91cHMuZm9yRWFjaCgodGc6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWlzRW1wdHlUZXh0QmxvY2sodGcpKSB7XHJcbiAgICAgICAgdGV4dEdyb3Vwcy5wdXNoKFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGcpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc3lzdGVtR3JvdXBzOiBTbW9TeXN0ZW1Hcm91cFtdID0gW107XHJcbiAgICBpZiAoanNvbk9iai5zeXN0ZW1Hcm91cHMpIHtcclxuICAgICAganNvbk9iai5zeXN0ZW1Hcm91cHMuZm9yRWFjaCgodHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHZhciBzdCA9IFNtb1Njb3JlTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKHR0KTtcclxuICAgICAgICBzdC5hdXRvTGF5b3V0ID0gZmFsc2U7IC8vIHNpbmNlIHRoaXMgaGFzIGJlZW4gbGF5ZWQgb3V0LCBwcmVzdW1hYmx5LCBiZWZvcmUgc2F2ZVxyXG4gICAgICAgIHN5c3RlbUdyb3Vwcy5wdXNoKHN0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMuc3RhdmVzID0gc3RhdmVzO1xyXG4gICAgaWYgKHVwY29udmVydEZvcm1hdCkge1xyXG4gICAgICBmb3JtYXR0aW5nTWFuYWdlciA9IFNtb1Njb3JlLm1lYXN1cmVGb3JtYXRGcm9tTGVnYWN5U2NvcmUocGFyYW1zIGFzIGFueSwganNvbk9iaik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBtZWFzdXJlUGFyYW1zOiBTbW9Gb3JtYXR0aW5nTWFuYWdlclBhcmFtcyA9IHtcclxuICAgICAgICBtZWFzdXJlRm9ybWF0czogW10sXHJcbiAgICAgICAgcGFydEluZGV4OiAtMVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqc29uT2JqLm1lYXN1cmVGb3JtYXRzKSB7XHJcbiAgICAgICAganNvbk9iai5tZWFzdXJlRm9ybWF0cy5mb3JFYWNoKChtZjogU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlcikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbWZPYmogPSBuZXcgU21vTWVhc3VyZUZvcm1hdChtZik7XHJcbiAgICAgICAgICBtZWFzdXJlUGFyYW1zLm1lYXN1cmVGb3JtYXRzPy5wdXNoKG1mT2JqKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMuZm9ybWF0dGluZ01hbmFnZXIgPSBuZXcgU21vRm9ybWF0dGluZ01hbmFnZXIobWVhc3VyZVBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7XHJcbiAgICBpZiAoIWlzU21vU2NvcmVQYXJhbXMocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnQmFkIHNjb3JlLCBtaXNzaW5nIHBhcmFtczogJyArIEpTT04uc3RyaW5naWZ5KHBhcmFtcywgbnVsbCwgJyAnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNjb3JlID0gbmV3IFNtb1Njb3JlKHBhcmFtcyk7XHJcbiAgICBzY29yZS50ZXh0R3JvdXBzID0gdGV4dEdyb3VwcztcclxuICAgIHNjb3JlLnN5c3RlbUdyb3VwcyA9IHN5c3RlbUdyb3VwcztcclxuICAgIHNjb3JlLnNjb3JlSW5mby52ZXJzaW9uICs9IDE7XHJcbiAgICByZXR1cm4gc2NvcmU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICogQ29udmVydCBtZWFzdXJlIGZvcm1hdHRpbmcgZnJvbSBsZWdhY3kgc2NvcmVzLCB0aGF0IGhhZCB0aGUgZm9ybWF0dGluZ1xyXG4gICogcGVyIG1lYXN1cmUsIHRvIHRoZSBuZXcgd2F5IHRoYXQgaGFzIGEgc2VwYXJhdGUgZm9ybWF0dGluZyBvYmplY3QuXHJcbiAgKiAqKi9cclxuICBzdGF0aWMgbWVhc3VyZUZvcm1hdEZyb21MZWdhY3lTY29yZShzY29yZTogU21vU2NvcmUsIGpzb25PYmo6IGFueSk6IFNtb0Zvcm1hdHRpbmdNYW5hZ2VyIHwgbnVsbCB7XHJcbiAgICBsZXQgY3VycmVudDogU21vTWVhc3VyZUZvcm1hdCB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IHByZXZpb3VzOiBTbW9NZWFzdXJlRm9ybWF0IHwgbnVsbCA9IG51bGw7XHJcbiAgICBjb25zdCBtZWFzdXJlRm9ybWF0czogU21vTWVhc3VyZUZvcm1hdFtdID0gW107XHJcbiAgICBzY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZTogU21vTWVhc3VyZSkgPT4ge1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgIGN1cnJlbnQgPSBTbW9NZWFzdXJlRm9ybWF0LmZyb21MZWdhY3lNZWFzdXJlKGpzb25PYmouc3RhdmVzWzBdLm1lYXN1cmVzW21lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdKTtcclxuICAgICAgICBtZWFzdXJlRm9ybWF0c1ttZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSA9IGN1cnJlbnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xyXG4gICAgICAgIGN1cnJlbnQgPSBTbW9NZWFzdXJlRm9ybWF0LmZyb21MZWdhY3lNZWFzdXJlKGpzb25PYmouc3RhdmVzWzBdLm1lYXN1cmVzW21lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdKTtcclxuICAgICAgICBpZiAoIWN1cnJlbnQuZXEocHJldmlvdXMpKSB7XHJcbiAgICAgICAgICBtZWFzdXJlRm9ybWF0c1ttZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSA9IGN1cnJlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuZXcgU21vRm9ybWF0dGluZ01hbmFnZXIoeyBtZWFzdXJlRm9ybWF0cyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhIGRlZmF1bHQgc2NvcmUgd2l0aCBubyBub3RlcyBvciBzdGF2ZXNcclxuICAgKiBAcGFyYW0gc2NvcmVEZWZhdWx0cyBcclxuICAgKiBAcGFyYW0gbWVhc3VyZURlZmF1bHRzIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREZWZhdWx0U2NvcmUoc2NvcmVEZWZhdWx0czogU21vU2NvcmVQYXJhbXMsIG1lYXN1cmVEZWZhdWx0czogU21vTWVhc3VyZVBhcmFtcyB8IG51bGwpIHtcclxuICAgIG1lYXN1cmVEZWZhdWx0cyA9IG1lYXN1cmVEZWZhdWx0cyAhPT0gbnVsbCA/IG1lYXN1cmVEZWZhdWx0cyA6IFNtb01lYXN1cmUuZGVmYXVsdHM7XHJcbiAgICBjb25zdCBzY29yZSA9IG5ldyBTbW9TY29yZShzY29yZURlZmF1bHRzKTtcclxuICAgIHNjb3JlLmZvcm1hdHRpbmdNYW5hZ2VyID0gbmV3IFNtb0Zvcm1hdHRpbmdNYW5hZ2VyKFNtb0Zvcm1hdHRpbmdNYW5hZ2VyLmRlZmF1bHRzKTtcclxuICAgIHNjb3JlLmFkZFN0YWZmKFNtb1N5c3RlbVN0YWZmLmRlZmF1bHRzKTtcclxuICAgIGNvbnN0IG1lYXN1cmU6IFNtb01lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlKG1lYXN1cmVEZWZhdWx0cyBhcyBTbW9NZWFzdXJlUGFyYW1zKTtcclxuICAgIHNjb3JlLmFkZE1lYXN1cmUoMCk7XHJcbiAgICBtZWFzdXJlLnZvaWNlcy5wdXNoKHtcclxuICAgICAgbm90ZXM6IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE5vdGVzKG1lYXN1cmVEZWZhdWx0cyBhcyBTbW9NZWFzdXJlUGFyYW1zKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2NvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYW4gJ2VtcHR5JyBzY29yZSwgd2l0aCBvbmUgbWVhc3VyZSBvZiByZXN0c1xyXG4gICAqIEBwYXJhbSBzY29yZURlZmF1bHRzIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXRFbXB0eVNjb3JlKHNjb3JlRGVmYXVsdHM6IFNtb1Njb3JlUGFyYW1zKSB7XHJcbiAgICBjb25zdCBzY29yZSA9IG5ldyBTbW9TY29yZShzY29yZURlZmF1bHRzKTtcclxuICAgIHNjb3JlLmFkZFN0YWZmKFNtb1N5c3RlbVN0YWZmLmRlZmF1bHRzKTtcclxuICAgIHJldHVybiBzY29yZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogV2UgaGF2ZSBkZWxldGVkIGEgbWVhc3VyZSwgdXBkYXRlIHRoZSByZW51bWJlciBpbmRleCB0b1xyXG4gICAqIHNodWZmbGUgYmFjay5cclxuICAgKiBAcGFyYW0gaW5kZXhUb0RlbGV0ZSBcclxuICAgKi9cclxuICB1cGRhdGVSZW51bWJlckZvckFkZERlbGV0ZShpbmRleFRvRGVsZXRlOiBudW1iZXIsIHRvQWRkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRvQWRkICYmIGluZGV4VG9EZWxldGUgPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGggLSAxO1xyXG4gICAgY29uc3QgaW5jcmVtZW50ID0gdG9BZGQgPyAxIDogLTE7XHJcbiAgICBmb3IgKHZhciBpID0gaW5kZXhUb0RlbGV0ZTsgaSA8IG1heEluZGV4OyArK2kpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodGhpcy5yZW51bWJlcmluZ01hcFtpXSkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgdGhpcy5yZW51bWJlcmluZ01hcFtpXSA9IHRoaXMucmVudW1iZXJpbmdNYXBbaV0gKyBpbmNyZW1lbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgKHRoaXMucmVudW1iZXJpbmdNYXBbbWF4SW5kZXhdKSA9PT0gJ251bWJlcicgJiYgIXRvQWRkKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnJlbnVtYmVyaW5nTWFwW21heEluZGV4XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVJlbnVtYmVyaW5nTWFwKG1lYXN1cmVJbmRleDogbnVtYmVyLCBsb2NhbEluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmIChtZWFzdXJlSW5kZXggPT09IDApIHtcclxuICAgICAgdGhpcy5yZW51bWJlcmluZ01hcFswXSA9IGxvY2FsSW5kZXg7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5yZW51bWJlcmluZ01hcFttZWFzdXJlSW5kZXhdKSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaWYgKG1lYXN1cmVJbmRleCA9PT0gbG9jYWxJbmRleCkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnJlbnVtYmVyaW5nTWFwW21lYXN1cmVJbmRleF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW51bWJlcmluZ01hcFttZWFzdXJlSW5kZXhdID0gbG9jYWxJbmRleDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW51bWJlcmluZ01hcFttZWFzdXJlSW5kZXhdID0gbG9jYWxJbmRleDtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnJlbnVtYmVyaW5nTWFwID0gdGhpcy5yZW51bWJlcmluZ01hcDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSXRlcmF0aXZlbHkgbnVtYmVyIHRoZSBzdGF2ZXMsIGxpa2Ugd2hlbiBhZGRpbmcgYSBtZWFzdXJlXHJcbiAgICovXHJcbiAgbnVtYmVyU3RhdmVzKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHN0YXZlID0gdGhpcy5zdGF2ZXNbaV07XHJcbiAgICAgIHN0YXZlLnN0YWZmSWQgPSBpO1xyXG4gICAgICBzdGF2ZS5udW1iZXJNZWFzdXJlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZGV0ZXJtaW5lIGlmIHRoZSBtZWFzdXJlIGF0IHRoaXMgaW5kZXggY291bGQgYmUgYSBtdWx0aS1tZWFzdXJlIHJlc3RcclxuICAgKiBAcGFyYW0gbWVhc3VyZUluZGV4IC0gdGhlIG1lYXN1cmUgaW5kZXggd2UgYXJlIGNvbnNpZGVyaW5nIHRvIGFkZFxyXG4gICAqIEBwYXJhbSBzdGFydCAtIHRoZSBtZWFzdXJlIGluZGV4IHdvdWxkIGJlIHRoZSBzdGFydCBvZiB0aGUgcmVzdCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBpc011bHRpbWVhc3VyZVJlc3QobWVhc3VyZUluZGV4OiBudW1iZXIsIHN0YXJ0OiBib29sZWFuLCBmb3JjZVJlc3Q6IGJvb2xlYW4pIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBpZiAoIWZvcmNlUmVzdCAmJiAhdGhpcy5zdGF2ZXNbaV0uaXNSZXN0KG1lYXN1cmVJbmRleCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc3RhdmVzW2ldLmdldFZvbHRhc0Zvck1lYXN1cmUobWVhc3VyZUluZGV4KS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnN0YXZlc1tpXS5pc1JlcGVhdFN5bWJvbChtZWFzdXJlSW5kZXgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghc3RhcnQgJiYgbWVhc3VyZUluZGV4ID4gMCAmJiB0aGlzLnN0YXZlc1tpXS5pc1JlcGVhdChtZWFzdXJlSW5kZXggLSAxKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zdGF2ZXNbaV0uaXNSZWhlYXJzYWwobWVhc3VyZUluZGV4KSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBpbnN0cnVtZW50IGNoYW5nZSBvdGhlciB0aGFuIHRoZSBpbml0aWFsIG1lYXN1cmVcclxuICAgICAgaWYgKHRoaXMuc3RhdmVzW2ldLm1lYXN1cmVJbnN0cnVtZW50TWFwW21lYXN1cmVJbmRleF0gJiYgaSA+IDApIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChtZWFzdXJlSW5kZXggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG1lYXN1cmUgPSB0aGlzLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlSW5kZXhdO1xyXG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXNbbWVhc3VyZUluZGV4IC0gMV07XHJcbiAgICAgIGlmICghc3RhcnQgJiYgIVRpbWVTaWduYXR1cmUuZXF1YWwobWVhc3VyZS50aW1lU2lnbmF0dXJlLCBwcmV2LnRpbWVTaWduYXR1cmUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghc3RhcnQgJiYgbWVhc3VyZS5rZXlTaWduYXR1cmUgIT09IHByZXYua2V5U2lnbmF0dXJlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgbWVhc3VyZSBmb3JtYXRzIHN0b3JlZCB3aGVuIGEgc2NvcmUgaXMgc2VyaWFsaXplZFxyXG4gICAqL1xyXG4gIHVwZGF0ZU1lYXN1cmVGb3JtYXRzKCkge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZSkgPT4ge1xyXG4gICAgICAgICh0aGlzLmZvcm1hdHRpbmdNYW5hZ2VyIGFzIFNtb0Zvcm1hdHRpbmdNYW5hZ2VyKS51cGRhdGVGb3JtYXQobWVhc3VyZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIG1lYXN1cmUgdG8gdGhlIHNjb3JlIHdpdGggdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMgYXQgdGhlIHN1cHBsaWVkIGluZGV4LlxyXG4gICAqIFRoZSBkZWZhdWx0cyBwZXIgc3RhZmYgbWF5IGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIGNsZWYsIGtleSBvZiB0aGUgc3RhZmYuXHJcbiAgKi9cclxuICBhZGREZWZhdWx0TWVhc3VyZVdpdGhOb3RlcyhtZWFzdXJlSW5kZXg6IG51bWJlciwgcGFyYW1ldGVyczogU21vTWVhc3VyZVBhcmFtcykge1xyXG4gICAgdGhpcy51cGRhdGVSZW51bWJlckZvckFkZERlbGV0ZShtZWFzdXJlSW5kZXgsIHRydWUpO1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgY29uc3QgZGVmYXVsdE1lYXN1cmUgPVxyXG4gICAgICAgIFNtb01lYXN1cmUuZ2V0RGVmYXVsdE1lYXN1cmVXaXRoTm90ZXMocGFyYW1ldGVycyk7XHJcbiAgICAgIHN0YWZmLmFkZE1lYXN1cmUobWVhc3VyZUluZGV4LCBkZWZhdWx0TWVhc3VyZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0TG9jYWxNZWFzdXJlSW5kZXgobWVhc3VyZUluZGV4OiBudW1iZXIpIHtcclxuICAgIGxldCBtYXhLZXkgPSAtMTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnVwZGF0ZVJlbnVtYmVyRm9yQWRkRGVsZXRlKTtcclxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlSW50KGtleSwgMTApO1xyXG4gICAgICBpZiAobnVtS2V5IDw9IG1lYXN1cmVJbmRleCAmJiBudW1LZXkgPiBtYXhLZXkpIHtcclxuICAgICAgICBtYXhLZXkgPSBudW1LZXk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKG1heEtleSA8IDApIHtcclxuICAgICAgcmV0dXJuIG1lYXN1cmVJbmRleDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbnVtYmVyaW5nTWFwW21heEtleV0gKyAobWVhc3VyZUluZGV4IC0gbWF4S2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGRlbGV0ZSB0aGUgbWVhc3VyZSBhdCB0aGUgc3VwcGxpZWQgaW5kZXggaW4gYWxsIHRoZSBzdGF2ZXNcclxuICAqL1xyXG4gIGRlbGV0ZU1lYXN1cmUobWVhc3VyZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLmRlbGV0ZU1lYXN1cmUobWVhc3VyZUluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgLy8gYWRqdXN0IG9mZnNldCBpZiB0ZXh0IHdhcyBhdHRhY2hlZCB0byBhbnkgbWlzc2luZyBtZWFzdXJlcyBhZnRlciB0aGUgZGVsZXRlZCBvbmUuXHJcbiAgICB0aGlzLnRleHRHcm91cHMuZm9yRWFjaCgodGc6IFNtb1RleHRHcm91cCkgPT4ge1xyXG4gICAgICBpZiAodGcuYXR0YWNoVG9TZWxlY3RvciAmJiAodGcuc2VsZWN0b3IgYXMgU21vU2VsZWN0b3IpLm1lYXN1cmUgPj0gbWVhc3VyZUluZGV4ICYmICh0Zy5zZWxlY3RvciBhcyBTbW9TZWxlY3RvcikubWVhc3VyZSA+IDApIHtcclxuICAgICAgICAodGcuc2VsZWN0b3IgYXMgU21vU2VsZWN0b3IpLm1lYXN1cmUgLT0gMTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZVJlbnVtYmVyRm9yQWRkRGVsZXRlKG1lYXN1cmVJbmRleCwgZmFsc2UpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjb29yZGluYXRlIHRoZSBpZHMgb2YgdGhlIGRpc3BsYXkgc2NvcmUgd2l0aCB0aGUgc3RvcmVkIHNjb3JlXHJcbiAgICogQHBhcmFtIG90aGVyIFxyXG4gICAqL1xyXG4gIHN5bmNocm9uaXplVGV4dEdyb3VwcyhvdGhlcjogU21vVGV4dEdyb3VwW10pIHtcclxuICAgIHRoaXMudGV4dEdyb3VwcyA9IFtdO1xyXG4gICAgb3RoZXIuZm9yRWFjaCgodGcpID0+IHtcclxuICAgICAgY29uc3QgbnRnID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0Zyk7XHJcbiAgICAgIHRoaXMudGV4dEdyb3Vwcy5wdXNoKG50Zyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogZ2V0IGEgbWVhc3VyZSAnY29tcGF0aWJsZScgd2l0aCB0aGUgbWVhc3VyZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGluIHRlcm1zXHJcbiAgICogb2Yga2V5LCB0aW1lIHNpZ25hdHVyZSBldGMuXHJcbiAgICogQHBhcmFtIG1lYXN1cmVJbmRleCBcclxuICAgKiBAcGFyYW0gc3RhZmZJbmRleCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRQcm90b3R5cGVNZWFzdXJlKG1lYXN1cmVJbmRleDogbnVtYmVyLCBzdGFmZkluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHN0YWZmID0gdGhpcy5zdGF2ZXNbc3RhZmZJbmRleF07XHJcbiAgICBsZXQgcHJvdG9tZWFzdXJlOiBTbW9NZWFzdXJlUGFyYW1zID0ge30gYXMgU21vTWVhc3VyZVBhcmFtcztcclxuXHJcbiAgICAvLyBTaW5jZSB0aGlzIHN0YWZmIG1heSBhbHJlYWR5IGhhdmUgaW5zdHJ1bWVudCBzZXR0aW5ncywgdXNlIHRoZVxyXG4gICAgLy8gaW1tZWRpYXRlbHkgcHJlY2VlZGluZyBvciBwb3N0LWNlZGluZyBtZWFzdXJlIGlmIGl0IGV4aXN0cy5cclxuICAgIGlmIChtZWFzdXJlSW5kZXggPCBzdGFmZi5tZWFzdXJlcy5sZW5ndGgpIHtcclxuICAgICAgcHJvdG9tZWFzdXJlID0gc3RhZmYubWVhc3VyZXNbbWVhc3VyZUluZGV4XTtcclxuICAgIH0gZWxzZSBpZiAoc3RhZmYubWVhc3VyZXMubGVuZ3RoKSB7XHJcbiAgICAgIHByb3RvbWVhc3VyZSA9IHN0YWZmLm1lYXN1cmVzW3N0YWZmLm1lYXN1cmVzLmxlbmd0aCAtIDFdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvdG9tZWFzdXJlID0gU21vTWVhc3VyZS5kZWZhdWx0cztcclxuICAgIH1cclxuICAgIHJldHVybiBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKHByb3RvbWVhc3VyZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHaXZlIGEgbWVhc3VyZSBwcm90b3R5cGUsIGNyZWF0ZSBhIG5ldyBtZWFzdXJlIGFuZCBhZGQgaXQgdG8gZWFjaCBzdGFmZiwgd2l0aCB0aGVcclxuICAgKiBjb3JyZWN0IHNldHRpbmdzIGZvciBjdXJyZW50IHRpbWUgc2lnbmF0dXJlL2NsZWYuXHJcbiAgICogQHBhcmFtIG1lYXN1cmVJbmRleCBcclxuICAgKi9cclxuICBhZGRNZWFzdXJlKG1lYXN1cmVJbmRleDogbnVtYmVyKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc3RhZmYgPSB0aGlzLnN0YXZlc1tpXTtcclxuICAgICAgY29uc3Qgbm1lYXN1cmUgPSB0aGlzLmdldFByb3RvdHlwZU1lYXN1cmUobWVhc3VyZUluZGV4LCBpKTtcclxuICAgICAgaWYgKG5tZWFzdXJlLnZvaWNlcy5sZW5ndGggPD0gbm1lYXN1cmUuZ2V0QWN0aXZlVm9pY2UoKSkge1xyXG4gICAgICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgICB9XHJcbiAgICAgIHN0YWZmLmFkZE1lYXN1cmUobWVhc3VyZUluZGV4LCBubWVhc3VyZSk7XHJcbiAgICB9XHJcbiAgICAvLyBVcGRhdGUgb2Zmc2V0cyBmb3Igc2NvcmUgbW9kaWZpZXJzIHRoYXQgaGF2ZSBhIHNlbGVjdG9yXHJcbiAgICB0aGlzLnRleHRHcm91cHMuZm9yRWFjaCgodGc6IFNtb1RleHRHcm91cCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mICh0Zy5zZWxlY3RvcikgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0Zy5hdHRhY2hUb1NlbGVjdG9yICYmIHRnLnNlbGVjdG9yLm1lYXN1cmUgPj0gbWVhc3VyZUluZGV4ICYmIHRnLnNlbGVjdG9yLm1lYXN1cmUgPCB0aGlzLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGgpIHtcclxuICAgICAgICB0Zy5zZWxlY3Rvci5tZWFzdXJlICs9IDE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVSZW51bWJlckZvckFkZERlbGV0ZShtZWFzdXJlSW5kZXgsIHRydWUpO1xyXG4gICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcGxhY2UgdGhlIG1lYXN1cmUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiAgUHJvYmFibHkgZHVlIHRvIGFuIHVuZG8gb3BlcmF0aW9uIG9yIHBhc3RlLlxyXG4gICAqIEBwYXJhbSBzZWxlY3RvciBcclxuICAgKiBAcGFyYW0gbWVhc3VyZSBcclxuICAgKi9cclxuICByZXBsYWNlTWVhc3VyZShzZWxlY3RvcjogU21vU2VsZWN0b3IsIG1lYXN1cmU6IFNtb01lYXN1cmUpIHtcclxuICAgIHZhciBzdGFmZiA9IHRoaXMuc3RhdmVzW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIHN0YWZmLm1lYXN1cmVzW3NlbGVjdG9yLm1lYXN1cmVdID0gbWVhc3VyZTtcclxuICB9XHJcblxyXG4gIGdldFN5c3RlbUdyb3VwRm9yU3RhZmYoc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pIHtcclxuICAgIGNvbnN0IHN0YWZmSWQ6IG51bWJlciA9IHNlbGVjdGlvbi5zdGFmZi5zdGFmZklkO1xyXG4gICAgY29uc3QgbWVhc3VyZUluZGV4OiBudW1iZXIgPSBzZWxlY3Rpb24ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGNvbnN0IGV4aXN0ID0gdGhpcy5zeXN0ZW1Hcm91cHMuZmluZCgoc2c6IFNtb1N5c3RlbUdyb3VwKSA9PlxyXG4gICAgICBzZy5zdGFydFNlbGVjdG9yLnN0YWZmIDw9IHN0YWZmSWQgJiZcclxuICAgICAgc2cuZW5kU2VsZWN0b3Iuc3RhZmYgPj0gc3RhZmZJZCAmJlxyXG4gICAgICAoc2cubWFwVHlwZSA9PT0gU21vU3lzdGVtR3JvdXAubWFwVHlwZXMuYWxsTWVhc3VyZXMgfHxcclxuICAgICAgICAoc2cuc3RhcnRTZWxlY3Rvci5tZWFzdXJlIDw9IG1lYXN1cmVJbmRleCAmJlxyXG4gICAgICAgICAgc2cuZW5kU2VsZWN0b3IubWVhc3VyZSA+PSBtZWFzdXJlSW5kZXgpKVxyXG4gICAgKTtcclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIGdldFN0YXZlc0Zvckdyb3VwKGdyb3VwOiBTbW9TeXN0ZW1Hcm91cCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdmVzLmZpbHRlcigoc3RhZmYpID0+IHN0YWZmLnN0YWZmSWQgPj0gZ3JvdXAuc3RhcnRTZWxlY3Rvci5zdGFmZiAmJlxyXG4gICAgICBzdGFmZi5zdGFmZklkIDw9IGdyb3VwLmVuZFNlbGVjdG9yLnN0YWZmKTtcclxuICB9XHJcblxyXG4gIC8vICMjIyBhZGRPclJlcGxhY2VTeXN0ZW1Hcm91cFxyXG4gIC8vIEFkZCBhIG5ldyBzdGFmZiBncm91cGluZywgb3IgcmVwbGFjZSBpdCBpZiBpdCBvdmVybGFwcyBhbmQgaXMgZGlmZmVyZW50LCBvclxyXG4gIC8vIHJlbW92ZSBpdCBpZiBpdCBpcyBpZGVudGljYWwgKHRvZ2dsZSlcclxuICBhZGRPclJlcGxhY2VTeXN0ZW1Hcm91cChuZXdHcm91cDogU21vU3lzdGVtR3JvdXApIHtcclxuICAgIC8vIFJlcGxhY2UgdGhpcyBncm91cCBmb3IgYW55IGdyb3VwcyB0aGF0IG92ZXJsYXAgaXQuXHJcbiAgICB0aGlzLnN5c3RlbUdyb3VwcyA9IHRoaXMuc3lzdGVtR3JvdXBzLmZpbHRlcigoc2cpID0+ICFzZy5vdmVybGFwcyhuZXdHcm91cCkpO1xyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMucHVzaChuZXdHcm91cCk7XHJcbiAgfVxyXG5cclxuICBpc1BhcnRFeHBvc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc3RhdmVzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhZmYgPSB0aGlzLnN0YXZlc1swXTtcclxuICAgIGNvbnN0IHN0YXZlQ291bnQgPSBzdGFmZi5wYXJ0SW5mby5zdGF2ZXNBZnRlciArIHN0YWZmLnBhcnRJbmZvLnN0YXZlc0JlZm9yZSArIDE7XHJcbiAgICByZXR1cm4gc3RhdmVDb3VudCA9PT0gdGhpcy5zdGF2ZXMubGVuZ3RoXHJcbiAgICAgICYmIHN0YWZmLnBhcnRJbmZvLnN0YXZlc0JlZm9yZSA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2JhYmx5IGR1ZSB0byBhbiB1bmRvIG9wZXJhdGlvbiwgcmVwbGFjZSB0aGUgc3RhZmYgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG4gICAqIEBwYXJhbSBpbmRleCBcclxuICAgKiBAcGFyYW0gc3RhZmYgXHJcbiAgICovXHJcbiAgcmVwbGFjZVN0YWZmKGluZGV4OiBudW1iZXIsIHN0YWZmOiBTbW9TeXN0ZW1TdGFmZikge1xyXG4gICAgY29uc3Qgc3RhdmVzID0gW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYgKGkgIT09IGluZGV4KSB7XHJcbiAgICAgICAgc3RhdmVzLnB1c2godGhpcy5zdGF2ZXNbaV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0YXZlcy5wdXNoKHN0YWZmKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF2ZXMgPSBzdGF2ZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBtZWFzdXJlSW5kZXggXHJcbiAgICogQHBhcmFtIGtleSBcclxuICAgKi9cclxuICBhZGRLZXlTaWduYXR1cmUobWVhc3VyZUluZGV4OiBudW1iZXIsIGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICAvLyBDb25zaWRlciB0cmFuc3Bvc2UgZm9yIGtleSBvZiBpbnN0cnVtZW50XHJcbiAgICAgIGNvbnN0IG5ldE9mZnNldCA9IHN0YWZmLm1lYXN1cmVzW21lYXN1cmVJbmRleF0udHJhbnNwb3NlSW5kZXg7XHJcbiAgICAgIGNvbnN0IG5ld0tleSA9IFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQoa2V5LCBuZXRPZmZzZXQpO1xyXG4gICAgICBzdGFmZi5hZGRLZXlTaWduYXR1cmUobWVhc3VyZUluZGV4LCBuZXdLZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgcGFydCBpcyBhIHRyYW5zcG9zaW5nIHBhcnQsIHJlbW92ZSB0aGUgdHJhbnNwb3NpdGlvbiBmcm9tIHRoZSBub3Rlcy9zdGFmZi4gIFRoaXMgbG9naWNcclxuICAgKiBhc3N1bWVzIHRoZSBtZWFzdXJlcyBwcmV2aW91c2x5IGhhZCB0cmFuc3Bvc2VJbmRleCBzZXQgdXAgYnkgdGhlIGluc3RydW1lbnQgbWFwLlxyXG4gICAqL1xyXG4gIHNldFRyYW5zcG9zaW5nKCkge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYubWVhc3VyZXMuZm9yRWFjaCgobW0pID0+IHtcclxuICAgICAgICBpZiAobW0udHJhbnNwb3NlSW5kZXggIT09IDApIHtcclxuICAgICAgICAgIGNvbnN0IGNvbmNlcnQgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KG1tLmtleVNpZ25hdHVyZSwgLTEgKiBtbS50cmFuc3Bvc2VJbmRleCk7XHJcbiAgICAgICAgICBtbS50cmFuc3Bvc2VUb09mZnNldCgwLCBjb25jZXJ0KTtcclxuICAgICAgICAgIG1tLnRyYW5zcG9zZUluZGV4ID0gMDtcclxuICAgICAgICAgIG1tLmtleVNpZ25hdHVyZSA9IGNvbmNlcnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJZiB0aGUgc2NvcmUgaXMgc3dpdGNoaW5nIGZyb20gdHJhbnNwb3NpbmcgdG8gbm9uLXRyYW5zcG9zaW5nLCB1cGRhdGUgdGhlIGluZGV4XHJcbiAgICogYW5kIHBpdGNoZXMuICBUaGlzIGxvZ2ljIGFzc3VtZXMgd2UgYXJlIGNoYW5naW5nIGZyb20gdHJhbnNwb3NpbmcgdG8gbm9uLXRyYW5zcG9zaW5nLlxyXG4gICAqL1xyXG4gIHNldE5vblRyYW5zcG9zaW5nKCkge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYubWVhc3VyZXMuZm9yRWFjaCgobW0pID0+IHtcclxuICAgICAgICBjb25zdCBpbnN0ID0gc3RhZmYuZ2V0U3RhZmZJbnN0cnVtZW50KG1tLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4KTtcclxuICAgICAgICBpZiAoaW5zdC5rZXlPZmZzZXQgIT09IDApIHtcclxuICAgICAgICAgIGNvbnN0IGNvbmNlcnQgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KG1tLmtleVNpZ25hdHVyZSwgaW5zdC5rZXlPZmZzZXQpO1xyXG4gICAgICAgICAgbW0udHJhbnNwb3NlVG9PZmZzZXQoaW5zdC5rZXlPZmZzZXQsIGNvbmNlcnQpO1xyXG4gICAgICAgICAgbW0udHJhbnNwb3NlSW5kZXggPSBpbnN0LmtleU9mZnNldDtcclxuICAgICAgICAgIG1tLmtleVNpZ25hdHVyZSA9IGNvbmNlcnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIGFkZEluc3RydW1lbnRcclxuICAvLyBhZGQgYSBuZXcgc3RhZmYgKGluc3RydW1lbnQpIHRvIHRoZSBzY29yZVxyXG4gIGFkZFN0YWZmKHBhcmFtZXRlcnM6IFNtb1N5c3RlbVN0YWZmUGFyYW1zKTogU21vU3lzdGVtU3RhZmYge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgaWYgKHRoaXMuc3RhdmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBzdGFmZiA9IG5ldyBTbW9TeXN0ZW1TdGFmZihwYXJhbWV0ZXJzKTtcclxuICAgICAgdGhpcy5zdGF2ZXMucHVzaChzdGFmZik7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3RhZmYgPSAwO1xyXG4gICAgICAvLyBGb3IgcGFydCB2aWV3cywgd2UgcmVudW1iZXIgdGhlIHN0YXZlcyBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIHN0YWZmLlxyXG4gICAgICBpZiAoc3RhZmYubWVhc3VyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc3RhZmY7XHJcbiAgICB9XHJcbiAgICBpZiAoIXBhcmFtZXRlcnMpIHtcclxuICAgICAgcGFyYW1ldGVycyA9IFNtb1N5c3RlbVN0YWZmLmRlZmF1bHRzO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvdG8gPSB0aGlzLnN0YXZlc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gW107XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcHJvdG8ubWVhc3VyZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgbWVhc3VyZTogU21vTWVhc3VyZSA9IHByb3RvLm1lYXN1cmVzW2ldO1xyXG4gICAgICBjb25zdCBqc29uT2JqOiBTbW9NZWFzdXJlUGFyYW1zU2VyID0gbWVhc3VyZS5zZXJpYWxpemUoKTtcclxuICAgICAgLy8gTmVlZCB0byBkbyB0aGlzIHNpbmNlIHNjb3JlIHNlcmlhbGl6YXRpb24gZG9lc24ndCBpbmNsdWRlIFRTIGluIGVhY2ggbWVhc3VyZVxyXG4gICAgICBqc29uT2JqLnRpbWVTaWduYXR1cmUgPSBtZWFzdXJlLnRpbWVTaWduYXR1cmUuc2VyaWFsaXplKCk7XHJcbiAgICAgIGpzb25PYmoudGVtcG8gPSBtZWFzdXJlLnRlbXBvLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBsZXQgbmV3TWVhc3VyZSA9IFNtb01lYXN1cmUuZGVzZXJpYWxpemUoanNvbk9iaik7XHJcbiAgICAgIG5ld01lYXN1cmUubWVhc3VyZU51bWJlciA9IG1lYXN1cmUubWVhc3VyZU51bWJlcjtcclxuICAgICAgbmV3TWVhc3VyZS5jbGVmID0gcGFyYW1ldGVycy5tZWFzdXJlSW5zdHJ1bWVudE1hcFswXS5jbGVmIGFzIENsZWY7XHJcbiAgICAgIG5ld01lYXN1cmUubW9kaWZpZXJzID0gW107XHJcbiAgICAgIG5ld01lYXN1cmUudHJhbnNwb3NlSW5kZXggPSAwO1xyXG4gICAgICAvLyBDb25zaWRlciBrZXkgY2hhbmdlIGlmIHRoZSBwcm90byBtZWFzdXJlIGlzIG5vbi1jb25jZXJ0IHBpdGNoXHJcbiAgICAgIG5ld01lYXN1cmUua2V5U2lnbmF0dXJlID1cclxuICAgICAgICBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KG5ld01lYXN1cmUua2V5U2lnbmF0dXJlLFxyXG4gICAgICAgICAgbmV3TWVhc3VyZS50cmFuc3Bvc2VJbmRleCAtIG1lYXN1cmUudHJhbnNwb3NlSW5kZXgpO1xyXG4gICAgICBuZXdNZWFzdXJlLnZvaWNlcyA9IFt7IG5vdGVzOiBTbW9NZWFzdXJlLmdldERlZmF1bHROb3RlcyhuZXdNZWFzdXJlKSB9XTtcclxuICAgICAgbWVhc3VyZS5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgICBjb25zdCBubW9kOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlID0gU21vTWVhc3VyZU1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShtb2RpZmllcik7XHJcbiAgICAgICAgbmV3TWVhc3VyZS5tb2RpZmllcnMucHVzaChubW9kKTtcclxuICAgICAgfSk7XHJcbiAgICAgIG1lYXN1cmVzLnB1c2gobmV3TWVhc3VyZSk7XHJcbiAgICB9XHJcbiAgICBwYXJhbWV0ZXJzLm1lYXN1cmVzID0gbWVhc3VyZXM7XHJcbiAgICBjb25zdCBzdGFmZiA9IG5ldyBTbW9TeXN0ZW1TdGFmZihwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMuc3RhdmVzLnB1c2goc3RhZmYpO1xyXG4gICAgdGhpcy5hY3RpdmVTdGFmZiA9IHRoaXMuc3RhdmVzLmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLm51bWJlclN0YXZlcygpO1xyXG4gICAgcmV0dXJuIHN0YWZmO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBkZWxldGUgYW55IHN5c3RlbSBncm91cHMgdGhhdCBhcHBseSB0byBkZWxldGVkIHN0YXZlc1xyXG4gICAqL1xyXG4gIHVwZGF0ZVN5c3RlbUdyb3VwcygpIHtcclxuICAgIGNvbnN0IGdycFRvS2VlcDogU21vU3lzdGVtR3JvdXBbXSA9IFtdO1xyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMuZm9yRWFjaCgoZ3JwKSA9PiB7XHJcbiAgICAgIGlmIChncnAuc3RhcnRTZWxlY3Rvci5zdGFmZiA8IHRoaXMuc3RhdmVzLmxlbmd0aCAmJlxyXG4gICAgICAgIGdycC5lbmRTZWxlY3Rvci5zdGFmZiA8IHRoaXMuc3RhdmVzLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICBncnBUb0tlZXAucHVzaChncnApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3lzdGVtR3JvdXBzID0gZ3JwVG9LZWVwO1xyXG4gIH1cclxuICAvLyAjIyMgcmVtb3ZlU3RhZmZcclxuICAvLyBSZW1vdmUgc3RhdmUgYXQgdGhlIGdpdmVuIGluZGV4XHJcbiAgcmVtb3ZlU3RhZmYoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3Qgc3RhdmVzOiBTbW9TeXN0ZW1TdGFmZltdID0gW107XHJcbiAgICBsZXQgaXggPSAwO1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgaWYgKGl4ICE9PSBpbmRleCkge1xyXG4gICAgICAgIHN0YXZlcy5wdXNoKHN0YWZmKTtcclxuICAgICAgfVxyXG4gICAgICBpeCArPSAxO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0YXZlcyA9IHN0YXZlcztcclxuICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVN5c3RlbUdyb3VwcygpO1xyXG4gIH1cclxuICBnZXRTdGFmZkluc3RydW1lbnQoc2VsZWN0b3I6IFNtb1NlbGVjdG9yKTogU21vSW5zdHJ1bWVudCB7XHJcbiAgICBjb25zdCBzdGFmZjogU21vU3lzdGVtU3RhZmYgPSB0aGlzLnN0YXZlc1tzZWxlY3Rvci5zdGFmZl07XHJcbiAgICByZXR1cm4gc3RhZmYuZ2V0U3RhZmZJbnN0cnVtZW50KHNlbGVjdG9yLm1lYXN1cmUpO1xyXG4gIH1cclxuXHJcbiAgc3dhcFN0YXZlcyhpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGggPCBpbmRleDEgfHwgdGhpcy5zdGF2ZXMubGVuZ3RoIDwgaW5kZXgyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRtcFN0YWZmID0gdGhpcy5zdGF2ZXNbaW5kZXgxXTtcclxuICAgIHRoaXMuc3RhdmVzW2luZGV4MV0gPSB0aGlzLnN0YXZlc1tpbmRleDJdO1xyXG4gICAgdGhpcy5zdGF2ZXNbaW5kZXgyXSA9IHRtcFN0YWZmO1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYubWFwU3RhZmZGcm9tVG8oaW5kZXgxLCBpbmRleDIpO1xyXG4gICAgICBzdGFmZi5tYXBTdGFmZkZyb21UbyhpbmRleDIsIGluZGV4MSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXAsIHRvQWRkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCB0Z2lkID0gdHlwZW9mICh0ZXh0R3JvdXApID09PSAnc3RyaW5nJyA/IHRleHRHcm91cCA6XHJcbiAgICAgIHRleHRHcm91cC5hdHRycy5pZDtcclxuICAgIGNvbnN0IGFyID0gdGhpcy50ZXh0R3JvdXBzLmZpbHRlcigodGcpID0+IHRnLmF0dHJzLmlkICE9PSB0Z2lkKTtcclxuICAgIHRoaXMudGV4dEdyb3VwcyA9IGFyO1xyXG4gICAgaWYgKHRvQWRkKSB7XHJcbiAgICAgIHRoaXMudGV4dEdyb3Vwcy5wdXNoKHRleHRHcm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZFRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCB0cnVlKTtcclxuICB9XHJcbiAgZ2V0VGV4dEdyb3VwcygpIHtcclxuICAgIHJldHVybiB0aGlzLnRleHRHcm91cHM7XHJcbiAgfVxyXG4gIHNjYWxlVGV4dEdyb3VwcyhzY2FsZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRleHRHcm91cHMuZm9yRWFjaCgodGc6IFNtb1RleHRHcm91cCkgPT4ge1xyXG4gICAgICB0Zy5zY2FsZVRleHQoc2NhbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXApIHtcclxuICAgIHRoaXMudXBkYXRlVGV4dEdyb3VwKHRleHRHcm91cCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgc2V0THlyaWNBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnNldEx5cmljQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hvcmRBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnNldENob3JkQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjIyMgc2V0THlyaWNGb250XHJcbiAgLy8gc2V0IHRoZSBmb250IGZvciBseXJpY3MsIHdoaWNoIGFyZSB0aGUgc2FtZSBmb3IgYWxsIGx5cmljcyBpbiB0aGUgc2NvcmVcclxuICBzZXRMeXJpY0ZvbnQoZm9udEluZm86IEZvbnRJbmZvKSB7XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb250SW5zdDogRm9udFB1cnBvc2UgfCB1bmRlZmluZWQgPSB0aGlzLmZvbnRzLmZpbmQoKGZuKSA9PiBmbi5wdXJwb3NlID09PSBTbW9TY29yZS5mb250UHVycG9zZXMuTFlSSUNTKTtcclxuICAgIGlmICh0eXBlb2YgKGZvbnRJbnN0KSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9udEluc3QuZmFtaWx5ID0gZm9udEluZm8uZmFtaWx5ID8/ICcnO1xyXG4gICAgZm9udEluc3Quc2l6ZSA9IHBhcnNlSW50KFNtb1Njb3JlVGV4dC5mb250UG9pbnRTaXplKGZvbnRJbmZvLnNpemUpLnRvU3RyaW5nKCkpO1xyXG4gICAgZm9udEluc3QuY3VzdG9tID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNldENob3JkRm9udChmb250SW5mbzogRm9udEluZm8pIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBtZWFzdXJlcygpIHtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhdmVzW3RoaXMuYWN0aXZlU3RhZmZdLm1lYXN1cmVzO1xyXG4gIH1cclxuICBpbmNyZW1lbnRBY3RpdmVTdGFmZihvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgaWYgKG9mZnNldCA8IDApIHtcclxuICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdGhpcy5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dFN0YWZmID0gKHRoaXMuYWN0aXZlU3RhZmYgKyBvZmZzZXQpICUgdGhpcy5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgaWYgKG5leHRTdGFmZiA+PSAwICYmIG5leHRTdGFmZiA8IHRoaXMuc3RhdmVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVN0YWZmID0gbmV4dFN0YWZmO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlU3RhZmY7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVTdGFmZihpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFjdGl2ZVN0YWZmID0gaW5kZXggPD0gdGhpcy5zdGF2ZXMubGVuZ3RoID8gaW5kZXggOiB0aGlzLmFjdGl2ZVN0YWZmO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/smo/data/score.ts\n");
559
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoScore: () => (/* binding */ SmoScore),\n/* harmony export */ engravingFontTypes: () => (/* binding */ engravingFontTypes),\n/* harmony export */ isEmptyTextBlock: () => (/* binding */ isEmptyTextBlock),\n/* harmony export */ isEngravingFont: () => (/* binding */ isEngravingFont),\n/* harmony export */ isSmoScoreParemsSer: () => (/* binding */ isSmoScoreParemsSer)\n/* harmony export */ });\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _scoreText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _systemStaff__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Classes to support {@link SmoScore}\n * @module /smo/data/score\n */\n\n\n\n\n\n\n\n/**\n * Arrary of engraving fonts available in Smoosic\n */\nconst engravingFontTypes = ['Bravura', 'Gonville', 'Petaluma', 'Leland'];\nfunction isEngravingFont(et) {\n return engravingFontTypes.indexOf(et) >= 0;\n}\nfunction isSmoScoreParams(params) {\n if (params.fonts && params.fonts.length) {\n return true;\n }\n return false;\n}\n// dont' deserialize trivial text blocks saved by mistake\nfunction isEmptyTextBlock(params) {\n if (Array.isArray(params === null || params === void 0 ? void 0 : params.textBlocks) || Array.isArray(params === null || params === void 0 ? void 0 : params.blocks)) {\n return false;\n }\n return true;\n}\n// SmoScoreParemsSer\nfunction isSmoScoreParemsSer(params) {\n if (Array.isArray(params.staves)) {\n return true;\n }\n return false;\n}\n/**\n * Score is a container of staves, and metadata about the score. Serializing the score serializes the\n * child object. It is the highest-level object in Smoosic.\n * @category SmoObject\n */\nclass SmoScore {\n constructor(params) {\n /**\n * Map of instruments to staves, used in serialization.\n *\n * @type {any[]}\n * @memberof SmoScore\n */\n this.instrumentMap = [];\n /**\n * Default fonts in this score, for each type of text (lyrics, etc)\n *\n * @type {FontPurpose[]}\n * @memberof SmoScore\n */\n this.fonts = [];\n /**\n * General info about the score, used for export and library\n *\n * @type {SmoScoreInfo}\n * @memberof SmoScore\n */\n this.scoreInfo = SmoScore.scoreInfoDefaults;\n /**\n * Default behavior for this score. Indicates some global behavior like whether to advance the cursor.\n *\n * @type {SmoScorePreferences}\n * @memberof SmoScore\n */\n this.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults);\n /**\n * The staves that make up the music of the score\n *\n * @type {SmoSystemStaff[]}\n * @memberof SmoScore\n */\n this.staves = [];\n /**\n * The active staff, used for some types of selections. Not serialized.\n *\n * @type {number}\n * @memberof SmoScore\n */\n this.activeStaff = 0;\n /**\n * Text associated with the score, but not a specific musical element (e.g. lyrics are contains by notes)\n *\n * @type {SmoTextGroup[]}\n * @memberof SmoScore\n */\n this.textGroups = [];\n /**\n * A logical grouping of staves for justification\n *\n * @type {SmoSystemGroup[]}\n * @memberof SmoScore\n */\n this.systemGroups = [];\n /**\n * Preserve a map of measures to their actual measure numbers\n *\n * @type {Record<number, number>}\n * @memberof SmoScore\n */\n this.renumberingMap = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.vexMerge(this, SmoScore.defaults);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.vexMerge(this, params);\n if (!this.layoutManager) {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults);\n }\n if (!this.formattingManager) {\n this.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager.defaults);\n }\n // Set beaming rules based on preferences.\n const pref = this.preferences;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultDupleDuration = pref.defaultDupleDuration;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultTripleDuration = pref.defaultTripleDuration;\n if (this.staves.length) {\n this.numberStaves();\n }\n if (typeof (this.preferences.showPiano) === 'undefined') {\n this.preferences.showPiano = false;\n }\n this.audioSettings = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(params.audioSettings);\n this.updateMeasureFormats();\n this.updateSystemGroups();\n }\n static get engravingFonts() {\n return { Bravura: 'Bravura', Gonville: 'Gonville', Petaluma: 'Petaluma' };\n }\n static get fontPurposes() {\n return { ENGRAVING: 1, SCORE: 2, CHORDS: 3, LYRICS: 4 };\n }\n static get scoreInfoDefaults() {\n return JSON.parse(JSON.stringify({\n name: 'Smoosical',\n title: 'Smoosical',\n subTitle: '(Op. 1)',\n composer: 'Me',\n copyright: '',\n version: 1\n }));\n }\n static get scoreMetadataDefaults() {\n return JSON.parse(JSON.stringify({\n fonts: [{ name: 'engraving', purpose: SmoScore.fontPurposes.ENGRAVING, family: 'Bravura', size: 1, custom: false },\n { name: 'score', purpose: SmoScore.fontPurposes.SCORE, family: 'Merriweather', size: 14, custom: false },\n { name: 'chords', purpose: SmoScore.fontPurposes.CHORDS, family: 'Roboto Slab', size: 14, custom: false },\n { name: 'lyrics', purpose: SmoScore.fontPurposes.LYRICS, family: 'Merriweather', size: 12, custom: false }],\n scoreInfo: SmoScore.scoreInfoDefaults,\n renumberingMap: {},\n preferences: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults)\n }));\n }\n static get defaults() {\n return {\n // legacy layout structure. Now we use pages.\n fonts: [\n { name: 'engraving', purpose: SmoScore.fontPurposes.ENGRAVING, family: 'Bravura', size: 1, custom: false },\n { name: 'score', purpose: SmoScore.fontPurposes.SCORE, family: 'Merriweather', size: 14, custom: false },\n { name: 'chords', purpose: SmoScore.fontPurposes.CHORDS, family: 'Roboto Slab', size: 14, custom: false },\n { name: 'lyrics', purpose: SmoScore.fontPurposes.LYRICS, family: 'Merriweather', size: 12, custom: false }\n ],\n scoreInfo: SmoScore.scoreInfoDefaults,\n audioSettings: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings.defaults),\n preferences: new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults),\n staves: [],\n activeStaff: 0,\n textGroups: [],\n systemGroups: []\n };\n }\n static get pageSizes() {\n return ['letter', 'tabloid', 'A4', 'A4Landscape', 'custom'];\n }\n static get pageDimensions() {\n return {\n 'letter': { width: 8 * 96 + 48, height: 11 * 96 },\n 'letterLandscape': { width: 11 * 96, height: 8 * 96 + 48 },\n 'tabloid': { width: 1632, height: 1056 },\n 'A4': { width: 794, height: 1122 },\n 'A4Landscape': { width: 1122, height: 794 },\n 'custom': { width: 1, height: 1 }\n };\n }\n static pageSizeFromDimensions(width, height) {\n var _a;\n const rv = (_a = SmoScore.pageSizes.find((sz) => SmoScore.pageDimensions[sz].width === width && SmoScore.pageDimensions[sz].height === height)) !== null && _a !== void 0 ? _a : null;\n return rv;\n }\n static get preferences() {\n return ['preferences', 'fonts', 'scoreInfo', 'audioSettings'];\n }\n /**\n * serialize the keySignature, tempo and time signature, which are mapped\n * to a column at a measure index\n * @returns\n */\n serializeColumnMapped(func) {\n const keySignature = {};\n const tempo = {};\n const timeSignature = {};\n const renumberingMap = {};\n let previous = null;\n this.staves[0].measures.forEach((measure) => {\n const current = func(measure);\n const ix = measure.measureNumber.measureIndex;\n const currentInstrument = this.staves[0].getStaffInstrument(ix);\n current.keySignature = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(current.keySignature, -1 * currentInstrument.keyOffset);\n if (ix === 0) {\n keySignature[0] = current.keySignature;\n tempo[0] = current.tempo;\n timeSignature[0] = current.timeSignature;\n renumberingMap[0] = 0;\n previous = current;\n }\n else {\n if (typeof (this.renumberingMap[measure.measureNumber.measureIndex]) === 'number') {\n renumberingMap[measure.measureNumber.measureIndex] = this.renumberingMap[measure.measureNumber.measureIndex];\n }\n if (current.keySignature !== previous.keySignature) {\n previous.keySignature = current.keySignature;\n keySignature[ix] = current.keySignature;\n }\n if (!(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.equal(current.timeSignature, previous.timeSignature))) {\n previous.timeSignature = current.timeSignature;\n timeSignature[ix] = current.timeSignature;\n }\n if (!(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.eq(current.tempo, previous.tempo))) {\n previous.tempo = current.tempo;\n tempo[ix] = current.tempo;\n }\n }\n });\n return { keySignature, tempo, timeSignature, renumberingMap };\n }\n /**\n * Column-mapped attributes stay the same in each measure until\n * changed, like key-signatures. We don't store each measure value to\n * make the files smaller\n * @param scoreObj - the json blob that contains the score data\n * @returns\n */\n static deserializeColumnMapped(scoreObj) {\n let curValue;\n let mapIx = 0;\n if (!scoreObj.columnAttributeMap) {\n return;\n }\n const attrs = Object.keys(scoreObj.columnAttributeMap);\n scoreObj.staves.forEach((staff) => {\n const attrIxMap = {};\n attrs.forEach((attr) => {\n attrIxMap[attr] = 0;\n });\n staff.measures.forEach((measure) => {\n attrs.forEach((attr) => {\n mapIx = attrIxMap[attr];\n const curHash = scoreObj.columnAttributeMap[attr];\n const attrKeys = Object.keys(curHash);\n curValue = curHash[attrKeys[mapIx.toString()]];\n attrKeys.sort((a, b) => parseInt(a, 10) > parseInt(b, 10) ? 1 : -1);\n if (attrKeys.length > mapIx + 1) {\n if (measure.measureNumber.measureIndex >= attrKeys[mapIx + 1]) {\n mapIx += 1;\n curValue = curHash[attrKeys[mapIx.toString()]];\n }\n }\n // legacy timeSignature format was just a string 2/4, 3/8 etc.\n if (attr === 'timeSignature') {\n const ts = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n if (typeof (curValue) === 'string') {\n ts.timeSignature = curValue;\n measure[attr] = ts;\n }\n else {\n measure[attr] = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(curValue);\n }\n }\n else {\n measure[attr] = curValue;\n }\n attrIxMap[attr] = mapIx;\n });\n });\n });\n }\n /**\n * Serialize the entire score.\n * @returns JSON object\n */\n serialize(options) {\n var _a, _b, _c, _d, _e;\n const skipStaves = (_a = options === null || options === void 0 ? void 0 : options.skipStaves) !== null && _a !== void 0 ? _a : false;\n const useDictionary = (_b = options === null || options === void 0 ? void 0 : options.skipStaves) !== null && _b !== void 0 ? _b : true;\n const preserveIds = (_c = options === null || options === void 0 ? void 0 : options.preserveStaffIds) !== null && _c !== void 0 ? _c : false;\n let obj = {\n layoutManager: Object.assign({ ctor: 'SmoLayoutManager' }, _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults),\n audioSettings: {},\n measureFormats: [],\n staves: [],\n textGroups: [],\n systemGroups: [],\n metadata: SmoScore.scoreMetadataDefaults\n };\n if (this.layoutManager) {\n obj.layoutManager = this.layoutManager.serialize();\n }\n obj.metadata.fonts = JSON.parse(JSON.stringify(this.fonts));\n obj.metadata.renumberingMap = JSON.parse(JSON.stringify(this.renumberingMap));\n obj.metadata.preferences = this.preferences.serialize();\n obj.metadata.scoreInfo = JSON.parse(JSON.stringify(this.scoreInfo));\n if (typeof ((_e = (_d = obj === null || obj === void 0 ? void 0 : obj.metadata) === null || _d === void 0 ? void 0 : _d.scoreInfo) === null || _e === void 0 ? void 0 : _e.version) !== 'number') {\n obj.metadata.scoreInfo.version = 0;\n }\n if (this.formattingManager) {\n obj.measureFormats = this.formattingManager.serialize();\n }\n obj.audioSettings = this.audioSettings.serialize();\n if (!skipStaves) {\n this.staves.forEach((staff) => {\n obj.staves.push(staff.serialize({ skipMaps: true, preserveIds: preserveIds }));\n });\n }\n else {\n obj.staves = [];\n }\n // Score text is not part of text group, so don't save separately.\n this.textGroups.forEach((tg) => {\n if (tg.isTextVisible()) {\n obj.textGroups.push(tg.serialize());\n }\n });\n this.systemGroups.forEach((gg) => {\n obj.systemGroups.push(gg.serialize());\n });\n const getSerMeasure = (measure) => {\n return measure.serializeColumnMapped();\n };\n obj.columnAttributeMap = this.serializeColumnMapped(getSerMeasure);\n if (useDictionary) {\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.jsonTokens(obj);\n obj = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.detokenize(obj, _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.tokenValues);\n obj.dictionary = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.tokenMap;\n }\n return obj;\n }\n updateScorePreferences(pref) {\n this.preferences = pref;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultDupleDuration = pref.defaultDupleDuration;\n _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaultTripleDuration = pref.defaultTripleDuration;\n }\n get engravingFont() {\n const efont = this.fonts.find((x) => x.purpose === SmoScore.fontPurposes.ENGRAVING);\n if (efont) {\n const val = engravingFontTypes.find((x) => x === efont.family);\n if (val) {\n return val;\n }\n }\n return 'Bravura';\n }\n set engravingFont(value) {\n const efont = this.fonts.find((x) => x.purpose === SmoScore.fontPurposes.ENGRAVING);\n if (efont && isEngravingFont(value)) {\n efont.family = value;\n }\n }\n static upConvertGlobalLayout(jsonObj) {\n // upconvert global layout, which used to be directly on layoutManager\n if (typeof (jsonObj.layoutManager.globalLayout) === 'undefined') {\n jsonObj.layoutManager.globalLayout = {\n svgScale: jsonObj.layoutManager.svgScale,\n zoomScale: jsonObj.layoutManager.zoomScale,\n pageWidth: jsonObj.layoutManager.pageWidth,\n pageHeight: jsonObj.layoutManager.pageHeight,\n noteSpacing: jsonObj.layoutManager.noteSpacing\n };\n if (!jsonObj.layoutManager.globalLayout.noteSpacing) {\n jsonObj.layoutManager.globalLayout.noteSpacing = 1.0;\n }\n }\n }\n /**\n * Convert legacy score layout to layoutManager object parameters\n * @param jsonObj\n */\n static upConvertLayout(jsonObj) {\n let i = 0;\n jsonObj.layoutManager = {};\n _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.attributes.forEach((attr) => {\n jsonObj.layoutManager[attr] = jsonObj.score.layout[attr];\n });\n jsonObj.layoutManager.pageLayouts = [];\n for (i = 0; i < jsonObj.score.layout.pages; ++i) {\n const pageSetting = JSON.parse(JSON.stringify(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout.defaults));\n _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout.attributes.forEach((attr) => {\n if (typeof (jsonObj.score.layout[attr]) !== 'undefined') {\n pageSetting[attr] = jsonObj.score.layout[attr];\n }\n });\n jsonObj.layoutManager.pageLayouts.push(pageSetting);\n }\n SmoScore.upConvertGlobalLayout(jsonObj);\n }\n /**\n * Hack: for the case of a score containing only a single part, use the text from the\n * part.\n * @param jsonObj\n * @returns\n */\n static fixTextGroupSinglePart(jsonObj) {\n if (jsonObj.staves.length !== 1) {\n return;\n }\n if (!jsonObj.staves[0].partInfo) {\n return;\n }\n if (!jsonObj.staves[0].partInfo.textGroups || jsonObj.staves[0].partInfo.textGroups.length < 1) {\n return;\n }\n jsonObj.textGroups = JSON.parse(JSON.stringify(jsonObj.staves[0].partInfo.textGroups));\n }\n /**\n * Deserialize an entire score\n * @param jsonString\n * @returns SmoScore\n */\n static deserialize(jsonString) {\n var _a, _b;\n let jsonObj = JSON.parse(jsonString);\n let upconvertFormat = false;\n let formattingManager = null;\n if (jsonObj.dictionary) {\n jsonObj = _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.detokenize(jsonObj, jsonObj.dictionary);\n }\n SmoScore.fixTextGroupSinglePart(jsonObj);\n upconvertFormat = typeof (jsonObj.measureFormats) === 'undefined';\n const params = {};\n const staves = [];\n jsonObj.textGroups = jsonObj.textGroups ? jsonObj.textGroups : [];\n // Explode the sparse arrays of attributes into the measures\n SmoScore.deserializeColumnMapped(jsonObj);\n // 'score' attribute name changes to 'metadata'\n if (typeof (jsonObj.score) !== 'undefined') {\n jsonObj.metadata = jsonObj.score;\n }\n // meaning of customProportion has changed, backwards-compatiblity\n if (typeof (jsonObj.metadata) === 'undefined') {\n jsonObj.metadata = SmoScore.scoreMetadataDefaults;\n }\n // upconvert old proportion operator\n const jsonPropUp = jsonObj.metadata.preferences;\n if (typeof (jsonPropUp) !== 'undefined' && typeof (jsonPropUp.customProportion) === 'number') {\n _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality = jsonPropUp.customProportion;\n if (_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.legacyProportionality) {\n _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults.proportionality = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaultProportionality;\n }\n }\n // up-convert legacy layout data\n if (jsonObj.metadata.layout) {\n SmoScore.upConvertLayout(jsonObj);\n }\n if (jsonObj.layoutManager && !jsonObj.layoutManager.globalLayout) {\n SmoScore.upConvertGlobalLayout(jsonObj);\n }\n if (!jsonObj.layoutManager) {\n jsonObj.layoutManager = Object.assign({ ctor: \"SmoLayoutManager\" }, _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager.defaults);\n }\n const layoutManagerParams = {\n globalLayout: jsonObj.layoutManager.globalLayout,\n /**\n * page margins for each page\n */\n pageLayouts: []\n };\n jsonObj.layoutManager.pageLayouts.forEach((pl) => {\n const pageLayout = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoPageLayout(pl);\n layoutManagerParams.pageLayouts.push(pageLayout);\n });\n const layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoLayoutManager(layoutManagerParams);\n // params.layout = JSON.parse(JSON.stringify(SmoScore.defaults.layout));\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(['renumberingMap', 'fonts'], SmoScore.scoreMetadataDefaults, params);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(['renumberingMap', 'fonts'], jsonObj.metadata, params);\n if (jsonObj.metadata.preferences) {\n params.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(jsonObj.metadata.preferences);\n }\n else {\n params.preferences = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScorePreferences.defaults);\n }\n if (jsonObj.metadata.scoreInfo) {\n const scoreInfo = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreInfoKeys, SmoScore.scoreInfoDefaults, scoreInfo);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_6__.smoSerialize.serializedMerge(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreInfoKeys, jsonObj.metadata.scoreInfo, scoreInfo);\n params.scoreInfo = scoreInfo;\n }\n else {\n params.scoreInfo = SmoScore.scoreInfoDefaults;\n }\n if (!jsonObj.audioSettings) {\n params.audioSettings = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoAudioPlayerSettings.defaults);\n }\n else {\n params.audioSettings = _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreModifierBase.deserialize(jsonObj.audioSettings);\n }\n params.preferences.transposingScore = (_a = params.preferences.transposingScore) !== null && _a !== void 0 ? _a : false;\n if (jsonObj.staves && jsonObj.staves.length === 1) {\n // Ignore serialized tranpose of score if there is only a single part.\n params.preferences.transposingScore = false;\n }\n params.preferences.hideEmptyLines = (_b = params.preferences.hideEmptyLines) !== null && _b !== void 0 ? _b : false;\n let renumberingMap = { 0: 0 };\n if (jsonObj.columnAttributeMap && jsonObj.columnAttributeMap.renumberingMap) {\n renumberingMap = jsonObj.columnAttributeMap.renumberingMap;\n }\n if (!jsonObj.staves) {\n throw 'bad score, no staves: ' + JSON.stringify(jsonObj);\n }\n jsonObj.staves.forEach((staffObj, staffIx) => {\n staffObj.staffId = staffIx;\n staffObj.renumberingMap = renumberingMap;\n const staff = _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.deserialize(staffObj);\n staves.push(staff);\n });\n const textGroups = [];\n jsonObj.textGroups.forEach((tg) => {\n if (!isEmptyTextBlock(tg)) {\n textGroups.push(_scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoTextGroup.deserializePreserveId(tg));\n }\n });\n const systemGroups = [];\n if (jsonObj.systemGroups) {\n jsonObj.systemGroups.forEach((tt) => {\n var st = _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoScoreModifierBase.deserialize(tt);\n st.autoLayout = false; // since this has been layed out, presumably, before save\n systemGroups.push(st);\n });\n }\n params.staves = staves;\n if (upconvertFormat) {\n formattingManager = SmoScore.measureFormatFromLegacyScore(params, jsonObj);\n }\n else {\n const measureParams = {\n measureFormats: [],\n partIndex: -1\n };\n if (jsonObj.measureFormats) {\n jsonObj.measureFormats.forEach((mf) => {\n var _a;\n const mfObj = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(mf);\n (_a = measureParams.measureFormats) === null || _a === void 0 ? void 0 : _a.push(mfObj);\n });\n }\n params.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(measureParams);\n }\n params.layoutManager = layoutManager;\n if (!isSmoScoreParams(params)) {\n throw 'Bad score, missing params: ' + JSON.stringify(params, null, ' ');\n }\n const score = new SmoScore(params);\n score.textGroups = textGroups;\n score.systemGroups = systemGroups;\n score.scoreInfo.version += 1;\n return score;\n }\n /**\n * Convert measure formatting from legacy scores, that had the formatting\n * per measure, to the new way that has a separate formatting object.\n * **/\n static measureFormatFromLegacyScore(score, jsonObj) {\n let current = null;\n let previous = null;\n const measureFormats = [];\n score.staves[0].measures.forEach((measure) => {\n if (current === null) {\n current = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.fromLegacyMeasure(jsonObj.staves[0].measures[measure.measureNumber.measureIndex]);\n measureFormats[measure.measureNumber.measureIndex] = current;\n }\n else {\n previous = current;\n current = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.fromLegacyMeasure(jsonObj.staves[0].measures[measure.measureNumber.measureIndex]);\n if (!current.eq(previous)) {\n measureFormats[measure.measureNumber.measureIndex] = current;\n }\n }\n });\n return new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager({ measureFormats });\n }\n /**\n * Return a default score with no notes or staves\n * @param scoreDefaults\n * @param measureDefaults\n * @returns\n */\n static getDefaultScore(scoreDefaults, measureDefaults) {\n measureDefaults = measureDefaults !== null ? measureDefaults : _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaults;\n const score = new SmoScore(scoreDefaults);\n score.formattingManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoFormattingManager.defaults);\n score.addStaff(_systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults);\n const measure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasure(measureDefaults);\n score.addMeasure(0);\n measure.voices.push({\n notes: _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultNotes(measureDefaults)\n });\n return score;\n }\n /**\n * Return an 'empty' score, with one measure of rests\n * @param scoreDefaults\n * @returns\n */\n static getEmptyScore(scoreDefaults) {\n const score = new SmoScore(scoreDefaults);\n score.addStaff(_systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults);\n return score;\n }\n /**\n * We have deleted a measure, update the renumber index to\n * shuffle back.\n * @param indexToDelete\n */\n updateRenumberForAddDelete(indexToDelete, toAdd) {\n if (!toAdd && indexToDelete === 0) {\n return;\n }\n const maxIndex = this.staves[0].measures.length - 1;\n const increment = toAdd ? 1 : -1;\n for (var i = indexToDelete; i < maxIndex; ++i) {\n if (typeof (this.renumberingMap[i]) === 'number') {\n this.renumberingMap[i] = this.renumberingMap[i] + increment;\n }\n }\n if (typeof (this.renumberingMap[maxIndex]) === 'number' && !toAdd) {\n delete this.renumberingMap[maxIndex];\n }\n }\n updateRenumberingMap(measureIndex, localIndex) {\n if (measureIndex === 0) {\n this.renumberingMap[0] = localIndex;\n }\n else if (typeof (this.renumberingMap[measureIndex]) === 'number') {\n if (measureIndex === localIndex) {\n delete this.renumberingMap[measureIndex];\n }\n else {\n this.renumberingMap[measureIndex] = localIndex;\n }\n }\n else {\n this.renumberingMap[measureIndex] = localIndex;\n }\n this.staves.forEach((staff) => {\n staff.renumberingMap = this.renumberingMap;\n });\n this.numberStaves();\n }\n /**\n * Iteratively number the staves, like when adding a measure\n */\n numberStaves() {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n const stave = this.staves[i];\n stave.staffId = i;\n stave.numberMeasures();\n }\n }\n /**\n * determine if the measure at this index could be a multi-measure rest\n * @param measureIndex - the measure index we are considering to add\n * @param start - the measure index would be the start of the rest\n * @returns\n */\n isMultimeasureRest(measureIndex, start, forceRest) {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n if (!forceRest && !this.staves[i].isRest(measureIndex)) {\n return false;\n }\n if (this.staves[i].getVoltasForMeasure(measureIndex).length > 0) {\n return false;\n }\n if (this.staves[i].isRepeatSymbol(measureIndex)) {\n return false;\n }\n if (!start && measureIndex > 0 && this.staves[i].isRepeat(measureIndex - 1)) {\n return false;\n }\n if (this.staves[i].isRehearsal(measureIndex)) {\n return false;\n }\n // instrument change other than the initial measure\n if (this.staves[i].measureInstrumentMap[measureIndex] && i > 0) {\n return false;\n }\n }\n if (measureIndex > 0) {\n const measure = this.staves[0].measures[measureIndex];\n const prev = this.staves[0].measures[measureIndex - 1];\n if (!start && !_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.equal(measure.timeSignature, prev.timeSignature)) {\n return false;\n }\n if (!start && measure.keySignature !== prev.keySignature) {\n return false;\n }\n }\n return true;\n }\n /**\n * Restore measure formats stored when a score is serialized\n */\n updateMeasureFormats() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((measure) => {\n this.formattingManager.updateFormat(measure);\n });\n });\n }\n /**\n * Add a measure to the score with the supplied parameters at the supplied index.\n * The defaults per staff may be different depending on the clef, key of the staff.\n */\n addDefaultMeasureWithNotes(measureIndex, parameters) {\n this.updateRenumberForAddDelete(measureIndex, true);\n this.staves.forEach((staff) => {\n const defaultMeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasureWithNotes(parameters);\n staff.addMeasure(measureIndex, defaultMeasure);\n });\n }\n getLocalMeasureIndex(measureIndex) {\n let maxKey = -1;\n const keys = Object.keys(this.updateRenumberForAddDelete);\n keys.forEach((key) => {\n const numKey = parseInt(key, 10);\n if (numKey <= measureIndex && numKey > maxKey) {\n maxKey = numKey;\n }\n });\n if (maxKey < 0) {\n return measureIndex;\n }\n return this.renumberingMap[maxKey] + (measureIndex - maxKey);\n }\n /**\n * delete the measure at the supplied index in all the staves\n */\n deleteMeasure(measureIndex) {\n this.staves.forEach((staff) => {\n staff.deleteMeasure(measureIndex);\n });\n // adjust offset if text was attached to any missing measures after the deleted one.\n this.textGroups.forEach((tg) => {\n if (tg.attachToSelector && tg.selector.measure >= measureIndex && tg.selector.measure > 0) {\n tg.selector.measure -= 1;\n }\n });\n this.updateRenumberForAddDelete(measureIndex, false);\n }\n /**\n * coordinate the ids of the display score with the stored score\n * @param other\n */\n synchronizeTextGroups(other) {\n this.textGroups = [];\n other.forEach((tg) => {\n const ntg = _scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoTextGroup.deserializePreserveId(tg);\n this.textGroups.push(ntg);\n });\n }\n /**\n * get a measure 'compatible' with the measure at the given index, in terms\n * of key, time signature etc.\n * @param measureIndex\n * @param staffIndex\n * @returns\n */\n getPrototypeMeasure(measureIndex, staffIndex) {\n const staff = this.staves[staffIndex];\n let protomeasure = {};\n // Since this staff may already have instrument settings, use the\n // immediately preceeding or post-ceding measure if it exists.\n if (measureIndex < staff.measures.length) {\n protomeasure = staff.measures[measureIndex];\n }\n else if (staff.measures.length) {\n protomeasure = staff.measures[staff.measures.length - 1];\n }\n else {\n protomeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.defaults;\n }\n return _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultMeasureWithNotes(protomeasure);\n }\n /**\n * Give a measure prototype, create a new measure and add it to each staff, with the\n * correct settings for current time signature/clef.\n * @param measureIndex\n */\n addMeasure(measureIndex) {\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n const staff = this.staves[i];\n const nmeasure = this.getPrototypeMeasure(measureIndex, i);\n if (nmeasure.voices.length <= nmeasure.getActiveVoice()) {\n nmeasure.setActiveVoice(0);\n }\n staff.addMeasure(measureIndex, nmeasure);\n }\n // Update offsets for score modifiers that have a selector\n this.textGroups.forEach((tg) => {\n if (typeof (tg.selector) === 'undefined') {\n return;\n }\n if (tg.attachToSelector && tg.selector.measure >= measureIndex && tg.selector.measure < this.staves[0].measures.length) {\n tg.selector.measure += 1;\n }\n });\n this.updateRenumberForAddDelete(measureIndex, true);\n this.numberStaves();\n }\n /**\n * Replace the measure at the given location. Probably due to an undo operation or paste.\n * @param selector\n * @param measure\n */\n replaceMeasure(selector, measure) {\n var staff = this.staves[selector.staff];\n staff.measures[selector.measure] = measure;\n }\n getSystemGroupForStaff(selection) {\n const staffId = selection.staff.staffId;\n const measureIndex = selection.measure.measureNumber.measureIndex;\n const exist = this.systemGroups.find((sg) => sg.startSelector.staff <= staffId &&\n sg.endSelector.staff >= staffId &&\n (sg.mapType === _scoreModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoSystemGroup.mapTypes.allMeasures ||\n (sg.startSelector.measure <= measureIndex &&\n sg.endSelector.measure >= measureIndex)));\n return exist;\n }\n getStavesForGroup(group) {\n return this.staves.filter((staff) => staff.staffId >= group.startSelector.staff &&\n staff.staffId <= group.endSelector.staff);\n }\n // ### addOrReplaceSystemGroup\n // Add a new staff grouping, or replace it if it overlaps and is different, or\n // remove it if it is identical (toggle)\n addOrReplaceSystemGroup(newGroup) {\n // Replace this group for any groups that overlap it.\n this.systemGroups = this.systemGroups.filter((sg) => !sg.overlaps(newGroup));\n this.systemGroups.push(newGroup);\n }\n isPartExposed() {\n if (this.staves.length > 2) {\n return false;\n }\n const staff = this.staves[0];\n const staveCount = staff.partInfo.stavesAfter + staff.partInfo.stavesBefore + 1;\n return staveCount === this.staves.length\n && staff.partInfo.stavesBefore === 0;\n }\n /**\n * Probably due to an undo operation, replace the staff at the given index.\n * @param index\n * @param staff\n */\n replaceStaff(index, staff) {\n const staves = [];\n let i = 0;\n for (i = 0; i < this.staves.length; ++i) {\n if (i !== index) {\n staves.push(this.staves[i]);\n }\n else {\n staves.push(staff);\n }\n }\n this.staves = staves;\n }\n /**\n *\n * @param measureIndex\n * @param key\n */\n addKeySignature(measureIndex, key) {\n this.staves.forEach((staff) => {\n // Consider transpose for key of instrument\n const netOffset = staff.measures[measureIndex].transposeIndex;\n const newKey = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(key, netOffset);\n staff.addKeySignature(measureIndex, newKey);\n });\n }\n /**\n * If the part is a transposing part, remove the transposition from the notes/staff. This logic\n * assumes the measures previously had transposeIndex set up by the instrument map.\n */\n setTransposing() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((mm) => {\n if (mm.transposeIndex !== 0) {\n const concert = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(mm.keySignature, -1 * mm.transposeIndex);\n mm.transposeToOffset(0, concert);\n mm.transposeIndex = 0;\n mm.keySignature = concert;\n }\n });\n });\n }\n /**\n * If the score is switching from transposing to non-transposing, update the index\n * and pitches. This logic assumes we are changing from transposing to non-transposing.\n */\n setNonTransposing() {\n this.staves.forEach((staff) => {\n staff.measures.forEach((mm) => {\n const inst = staff.getStaffInstrument(mm.measureNumber.measureIndex);\n if (inst.keyOffset !== 0) {\n const concert = _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(mm.keySignature, inst.keyOffset);\n mm.transposeToOffset(inst.keyOffset, concert);\n mm.transposeIndex = inst.keyOffset;\n mm.keySignature = concert;\n }\n });\n });\n }\n // ### addInstrument\n // add a new staff (instrument) to the score\n addStaff(parameters) {\n let i = 0;\n if (this.staves.length === 0) {\n const staff = new _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff(parameters);\n this.staves.push(staff);\n this.activeStaff = 0;\n // For part views, we renumber the staves even if there is only one staff.\n if (staff.measures.length) {\n this.numberStaves();\n }\n return staff;\n }\n if (!parameters) {\n parameters = _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff.defaults;\n }\n const proto = this.staves[0];\n const measures = [];\n for (i = 0; i < proto.measures.length; ++i) {\n const measure = proto.measures[i];\n const jsonObj = measure.serialize();\n // Need to do this since score serialization doesn't include TS in each measure\n jsonObj.timeSignature = measure.timeSignature.serialize();\n jsonObj.tempo = measure.tempo.serialize();\n jsonObj.tupletTrees = []; // assume no tuplets in a prototype measure\n let newMeasure = _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(jsonObj);\n newMeasure.measureNumber = measure.measureNumber;\n newMeasure.clef = parameters.measureInstrumentMap[0].clef;\n newMeasure.modifiers = [];\n newMeasure.transposeIndex = 0;\n // Consider key change if the proto measure is non-concert pitch\n newMeasure.keySignature =\n _music__WEBPACK_IMPORTED_MODULE_0__.SmoMusic.vexKeySigWithOffset(newMeasure.keySignature, newMeasure.transposeIndex - measure.transposeIndex);\n newMeasure.voices = [{ notes: _measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.getDefaultNotes(newMeasure) }];\n measure.modifiers.forEach((modifier) => {\n const nmod = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modifier);\n newMeasure.modifiers.push(nmod);\n });\n measures.push(newMeasure);\n }\n parameters.measures = measures;\n const staff = new _systemStaff__WEBPACK_IMPORTED_MODULE_5__.SmoSystemStaff(parameters);\n this.staves.push(staff);\n this.activeStaff = this.staves.length - 1;\n this.numberStaves();\n return staff;\n }\n /**\n * delete any system groups that apply to deleted staves\n */\n updateSystemGroups() {\n const grpToKeep = [];\n this.systemGroups.forEach((grp) => {\n if (grp.startSelector.staff < this.staves.length &&\n grp.endSelector.staff < this.staves.length) {\n grpToKeep.push(grp);\n }\n });\n this.systemGroups = grpToKeep;\n }\n // ### removeStaff\n // Remove stave at the given index\n removeStaff(index) {\n const staves = [];\n let ix = 0;\n this.staves.forEach((staff) => {\n if (ix !== index) {\n staves.push(staff);\n }\n ix += 1;\n });\n this.staves = staves;\n this.numberStaves();\n this.updateSystemGroups();\n }\n getStaffInstrument(selector) {\n const staff = this.staves[selector.staff];\n return staff.getStaffInstrument(selector.measure);\n }\n swapStaves(index1, index2) {\n if (this.staves.length < index1 || this.staves.length < index2) {\n return;\n }\n const tmpStaff = this.staves[index1];\n this.staves[index1] = this.staves[index2];\n this.staves[index2] = tmpStaff;\n this.staves.forEach((staff) => {\n staff.mapStaffFromTo(index1, index2);\n staff.mapStaffFromTo(index2, index1);\n });\n this.numberStaves();\n }\n updateTextGroup(textGroup, toAdd) {\n const tgid = typeof (textGroup) === 'string' ? textGroup :\n textGroup.attrs.id;\n const ar = this.textGroups.filter((tg) => tg.attrs.id !== tgid);\n this.textGroups = ar;\n if (toAdd) {\n this.textGroups.push(textGroup);\n }\n }\n addTextGroup(textGroup) {\n this.updateTextGroup(textGroup, true);\n }\n getTextGroups() {\n return this.textGroups;\n }\n scaleTextGroups(scale) {\n this.textGroups.forEach((tg) => {\n tg.scaleText(scale);\n });\n }\n removeTextGroup(textGroup) {\n this.updateTextGroup(textGroup, false);\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.staves.forEach((staff) => {\n staff.setLyricAdjustWidth(adjustNoteWidth);\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.staves.forEach((staff) => {\n staff.setChordAdjustWidth(adjustNoteWidth);\n });\n }\n // ### setLyricFont\n // set the font for lyrics, which are the same for all lyrics in the score\n setLyricFont(fontInfo) {\n var _a;\n this.staves.forEach((staff) => {\n staff.setLyricFont(fontInfo);\n });\n const fontInst = this.fonts.find((fn) => fn.purpose === SmoScore.fontPurposes.LYRICS);\n if (typeof (fontInst) === 'undefined') {\n return;\n }\n fontInst.family = (_a = fontInfo.family) !== null && _a !== void 0 ? _a : '';\n fontInst.size = parseInt(_scoreText__WEBPACK_IMPORTED_MODULE_4__.SmoScoreText.fontPointSize(fontInfo.size).toString());\n fontInst.custom = true;\n }\n setChordFont(fontInfo) {\n this.staves.forEach((staff) => {\n staff.setChordFont(fontInfo);\n });\n }\n get measures() {\n if (this.staves.length === 0) {\n return [];\n }\n return this.staves[this.activeStaff].measures;\n }\n incrementActiveStaff(offset) {\n if (offset < 0) {\n offset = offset + this.staves.length;\n }\n const nextStaff = (this.activeStaff + offset) % this.staves.length;\n if (nextStaff >= 0 && nextStaff < this.staves.length) {\n this.activeStaff = nextStaff;\n }\n return this.activeStaff;\n }\n setActiveStaff(index) {\n this.activeStaff = index <= this.staves.length ? index : this.activeStaff;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVFLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9zbW8vZGF0YS9zY29yZS50cz9hYzdhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQ2xhc3NlcyB0byBzdXBwb3J0IHtAbGluayBTbW9TY29yZX1cclxuICogQG1vZHVsZSAvc21vL2RhdGEvc2NvcmVcclxuICovXHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi9tdXNpYyc7XHJcbmltcG9ydCB7IENsZWYsIFN2Z0RpbWVuc2lvbnMgfSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUsIFNtb01lYXN1cmVQYXJhbXMsIENvbHVtbk1hcHBlZFBhcmFtcywgU21vTWVhc3VyZVBhcmFtc1NlciB9IGZyb20gJy4vbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb05vdGVNb2RpZmllckJhc2UgfSBmcm9tICcuL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQge1xyXG4gIFNtb1RlbXBvVGV4dCwgU21vTWVhc3VyZUZvcm1hdCwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgVGltZVNpZ25hdHVyZSwgVGltZVNpZ25hdHVyZVBhcmFtZXRlcnMsXHJcbiAgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlclxyXG59IGZyb20gJy4vbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlLCBTbW9JbnN0cnVtZW50IH0gZnJvbSAnLi9zdGFmZk1vZGlmaWVycyc7XHJcbmltcG9ydCB7XHJcbiAgU21vU3lzdGVtR3JvdXAsIFNtb1N5c3RlbUdyb3VwUGFyYW1zU2VyLCBTbW9TY29yZU1vZGlmaWVyQmFzZSwgU21vUGFnZUxheW91dCxcclxuICBTbW9Gb3JtYXR0aW5nTWFuYWdlciwgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncywgU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLCBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zU2VyLFxyXG4gIFNtb0xheW91dE1hbmFnZXIsIEZvbnRQdXJwb3NlLFxyXG4gIFNtb1Njb3JlSW5mbywgU21vU2NvcmVJbmZvS2V5cywgU2NvcmVNZXRhZGF0YVNlciwgU21vU2NvcmVQcmVmZXJlbmNlcywgU21vUGFnZUxheW91dFBhcmFtcyxcclxuICBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zLCBTbW9Gb3JtYXR0aW5nTWFuYWdlclBhcmFtc1xyXG59IGZyb20gJy4vc2NvcmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9UZXh0R3JvdXAsIFNtb1Njb3JlVGV4dCwgU21vVGV4dEdyb3VwUGFyYW1zU2VyIH0gZnJvbSAnLi9zY29yZVRleHQnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZiwgU21vU3lzdGVtU3RhZmZQYXJhbXMsIFNtb1N5c3RlbVN0YWZmUGFyYW1zU2VyIH0gZnJvbSAnLi9zeXN0ZW1TdGFmZic7XHJcbmltcG9ydCB7IFNtb1NlbGVjdG9yLCBTbW9TZWxlY3Rpb24gfSBmcm9tICcuLi94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgc21vU2VyaWFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcmlhbGl6YXRpb25IZWxwZXJzJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuXHJcbi8qKlxyXG4gKiBMaXN0IG9mIGVuZ3JhdmluZyBmb250cyBhdmFpbGFibGUgaW4gU21vb3NpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgZW5ncmF2aW5nRm9udFR5cGUgPSAnQnJhdnVyYScgfCAnR29udmlsbGUnIHwgJ1BldGFsdW1hJyB8ICdMZWxhbmQnO1xyXG4vKipcclxuICogQXJyYXJ5IG9mIGVuZ3JhdmluZyBmb250cyBhdmFpbGFibGUgaW4gU21vb3NpY1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVuZ3JhdmluZ0ZvbnRUeXBlczogZW5ncmF2aW5nRm9udFR5cGVbXSA9IFsnQnJhdnVyYScsICdHb252aWxsZScsICdQZXRhbHVtYScsICdMZWxhbmQnXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VuZ3JhdmluZ0ZvbnQoZXQ6IGVuZ3JhdmluZ0ZvbnRUeXBlIHwgc3RyaW5nKTogZXQgaXMgZW5ncmF2aW5nRm9udFR5cGUge1xyXG4gIHJldHVybiAoZW5ncmF2aW5nRm9udFR5cGVzIGFzIGFueVtdKS5pbmRleE9mKGV0KSA+PSAwO1xyXG59XHJcblxyXG4vKipcclxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycy4gIFVzdWFsbHkgeW91IHdpbGwgY2FsbFxyXG4gKiB7QGxpbmsgU21vU2NvcmUuZGVmYXVsdHN9LCBhbmQgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkIHRvIGNoYW5nZS5cclxuICogQSBuZXcgc2NvcmUgd2l0aCB0aGUgZGVmYXVsdHMgd2lsbCBjcmVhdGUgYSBzaW5nbGUsIGVtcHR5IG1lYXN1cmUuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVQYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIGdsb2JhbCBmb250IGRlZmF1bHRzIGZvciB0aGlzIHNjb3JlXHJcbiAgICovXHJcbiAgZm9udHM6IEZvbnRQdXJwb3NlW10sXHJcbiAgLyoqXHJcbiAgICogaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlXHJcbiAgICovXHJcbiAgc2NvcmVJbmZvOiBTbW9TY29yZUluZm8sXHJcbiAgLyoqXHJcbiAgICogY3VzdG9taXplZCBlZGl0b3IgYmVoYXZpb3JcclxuICAgKi9cclxuICBwcmVmZXJlbmNlczogU21vU2NvcmVQcmVmZXJlbmNlcyxcclxuICAvKipcclxuICAgKiBjb250YWluZWQge0BsaW5rIFNtb1N5c3RlbVN0YWZmUGFyYW1zfSBvYmplY3RzXHJcbiAgICovXHJcbiAgc3RhdmVzOiBTbW9TeXN0ZW1TdGFmZlBhcmFtc1tdLFxyXG4gIGFjdGl2ZVN0YWZmPzogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHNjb3JlIHRleHQsIG5vdCBwYXJ0IG9mIHNwZWNpZmljIG11c2ljXHJcbiAgICovXHJcbiAgdGV4dEdyb3VwczogU21vVGV4dEdyb3VwW10sXHJcbiAgLyoqXHJcbiAgICogU3lzdGVtIGdyb3VwcyBmb3IgZm9ybWF0dGluZy9qdXN0aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgc3lzdGVtR3JvdXBzOiBTbW9TeXN0ZW1Hcm91cFtdLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZTogZ2xvYmFsIGF1ZGlvIHNldHRpbmdzXHJcbiAgICovXHJcbiAgYXVkaW9TZXR0aW5nczogU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLFxyXG4gIC8qKlxyXG4gICAqIGxheW91dCBtYW5hZ2VyLCBmb3Igc3ZnIGFuZCBkaXYgZ2VvbWV0cnksIHBhZ2Ugc2l6ZXMsIGhlYWRlciBzaXplcyBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXIsXHJcbiAgLyoqXHJcbiAgICogbWVhc3VyZS1zcGVjaWZpYyBmb3JtYXR0aW5nXHJcbiAgICovXHJcbiAgZm9ybWF0dGluZ01hbmFnZXI/OiBTbW9Gb3JtYXR0aW5nTWFuYWdlclxyXG59XHJcbmZ1bmN0aW9uIGlzU21vU2NvcmVQYXJhbXMocGFyYW1zOiBQYXJ0aWFsPFNtb1Njb3JlUGFyYW1zPik6IHBhcmFtcyBpcyBTbW9TY29yZVBhcmFtcyB7XHJcbiAgaWYgKHBhcmFtcy5mb250cyAmJiBwYXJhbXMuZm9udHMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBTZXJpYWxpemF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGVudGlyZSBzY29yZS4gIFNjb3JlIGlzIGRlc2VyaWFsaXplZCBmcm9tIHRoaXNcclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVQYXJhbXNTZXIge1xyXG4gIC8qKlxyXG4gICAqIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlLCBtb3N0bHkgbm9uLW11c2ljYWxcclxuICAgKi9cclxuICBtZXRhZGF0YTogU2NvcmVNZXRhZGF0YVNlcixcclxuICAvKipcclxuICAgKiBjb250YWluZWQge0BsaW5rIFNtb1N5c3RlbVN0YWZmUGFyYW1zfSBvYmplY3RzXHJcbiAgICovXHJcbiAgc3RhdmVzOiBTbW9TeXN0ZW1TdGFmZlBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIHNjb3JlIHRleHQsIG5vdCBwYXJ0IG9mIHNwZWNpZmljIG11c2ljXHJcbiAgICovXHJcbiAgdGV4dEdyb3VwczogU21vVGV4dEdyb3VwUGFyYW1zU2VyW10sXHJcbiAgLyoqXHJcbiAgICogU3lzdGVtIGdyb3VwcyBmb3IgZm9ybWF0dGluZy9qdXN0aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgc3lzdGVtR3JvdXBzOiBTbW9TeXN0ZW1Hcm91cFBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZTogZ2xvYmFsIGF1ZGlvIHNldHRpbmdzXHJcbiAgICovXHJcbiAgYXVkaW9TZXR0aW5nczogU21vQXVkaW9QbGF5ZXJQYXJhbWV0ZXJzLFxyXG4gIC8qKlxyXG4gICAqIGxheW91dCBtYW5hZ2VyLCBmb3Igc3ZnIGFuZCBkaXYgZ2VvbWV0cnksIHBhZ2Ugc2l6ZXMsIGhlYWRlciBzaXplcyBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXJQYXJhbXNTZXIsXHJcbiAgLyoqXHJcbiAgICogbWFwIG9mIG1lYXN1cmUgZm9ybWF0cyB0byBtZWFzdXJlXHJcbiAgICovXHJcbiAgbWVhc3VyZUZvcm1hdHM6IFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXJbXSxcclxuICAvKipcclxuICAgKiB0ZW1wbywga2V5IGFuZCBvdGhlciBjb2x1bW4tbWFwcGVkIHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBjb2x1bW5BdHRyaWJ1dGVNYXA6IENvbHVtblBhcmFtc01hcFR5cGUsXHJcbiAgLyoqXHJcbiAgICogZGljdGlvbmFyeSBjb21wcmVzc2lvbiBmb3Igc2VyaWFsaXphdGlvblxyXG4gICAqL1xyXG4gIGRpY3Rpb25hcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vU2NvcmVTZXJpYWxpemVPcHRpb25zIHtcclxuICBza2lwU3RhdmVzOiBib29sZWFuLFxyXG4gIHVzZURpY3Rpb25hcnk6IGJvb2xlYW4sXHJcbiAgcHJlc2VydmVTdGFmZklkczogYm9vbGVhbiAvLyBwcmVzZXJ2ZSBzdGFmZiBtb2RpZmllcnMgSURzIHRvIGtlZXAgaW4gc3luY1xyXG59XHJcbi8vIGRvbnQnIGRlc2VyaWFsaXplIHRyaXZpYWwgdGV4dCBibG9ja3Mgc2F2ZWQgYnkgbWlzdGFrZVxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eVRleHRCbG9jayhwYXJhbXM6IFBhcnRpYWw8U21vVGV4dEdyb3VwUGFyYW1zU2VyPik6IHBhcmFtcyBpcyBTbW9UZXh0R3JvdXBQYXJhbXNTZXIge1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcz8udGV4dEJsb2NrcykgfHwgQXJyYXkuaXNBcnJheSgocGFyYW1zIGFzIGFueSk/LmJsb2NrcykpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGFyYW1zTWFwVHlwZSB7XHJcbiAga2V5U2lnbmF0dXJlOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+LFxyXG4gIHRlbXBvOiBSZWNvcmQ8bnVtYmVyLCBTbW9UZW1wb1RleHQ+LFxyXG4gIHRpbWVTaWduYXR1cmU6IFJlY29yZDxudW1iZXIsIFRpbWVTaWduYXR1cmU+LFxyXG4gIHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+XHJcbn1cclxuXHJcbi8vIFNtb1Njb3JlUGFyZW1zU2VyXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1Ntb1Njb3JlUGFyZW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9TY29yZVBhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vU2NvcmVQYXJhbXNTZXIge1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF2ZXMpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbi8qKlxyXG4gKiBVbmlvbiBvZiBtb2RpZmllciB0eXBlcyBTbW8gbW9kaWZpZXIgdHlwZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNtb01vZGlmaWVyID0gU21vTm90ZU1vZGlmaWVyQmFzZSB8IFNtb01lYXN1cmVNb2RpZmllckJhc2UgfCBTdGFmZk1vZGlmaWVyQmFzZSB8IFNtb1Njb3JlTW9kaWZpZXJCYXNlO1xyXG5cclxuLyoqXHJcbiAqIFNjb3JlIGlzIGEgY29udGFpbmVyIG9mIHN0YXZlcywgYW5kIG1ldGFkYXRhIGFib3V0IHRoZSBzY29yZS4gIFNlcmlhbGl6aW5nIHRoZSBzY29yZSBzZXJpYWxpemVzIHRoZSBcclxuICogY2hpbGQgb2JqZWN0LiAgSXQgaXMgdGhlIGhpZ2hlc3QtbGV2ZWwgb2JqZWN0IGluIFNtb29zaWMuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9TY29yZSB7XHJcbiAgLyoqXHJcbiAgICogTWFwIG9mIGluc3RydW1lbnRzIHRvIHN0YXZlcywgdXNlZCBpbiBzZXJpYWxpemF0aW9uLlxyXG4gICAqXHJcbiAgICogQHR5cGUge2FueVtdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIGluc3RydW1lbnRNYXA6IGFueVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBmb250cyBpbiB0aGlzIHNjb3JlLCBmb3IgZWFjaCB0eXBlIG9mIHRleHQgKGx5cmljcywgZXRjKVxyXG4gICAqXHJcbiAgICogQHR5cGUge0ZvbnRQdXJwb3NlW119XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgZm9udHM6IEZvbnRQdXJwb3NlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBHZW5lcmFsIGluZm8gYWJvdXQgdGhlIHNjb3JlLCB1c2VkIGZvciBleHBvcnQgYW5kIGxpYnJhcnlcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TY29yZUluZm99XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgc2NvcmVJbmZvOiBTbW9TY29yZUluZm8gPSBTbW9TY29yZS5zY29yZUluZm9EZWZhdWx0cztcclxuICAvKipcclxuICAgKiBEZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIHNjb3JlLiAgSW5kaWNhdGVzIHNvbWUgZ2xvYmFsIGJlaGF2aW9yIGxpa2Ugd2hldGhlciB0byBhZHZhbmNlIHRoZSBjdXJzb3IuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vU2NvcmVQcmVmZXJlbmNlc31cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBwcmVmZXJlbmNlczogU21vU2NvcmVQcmVmZXJlbmNlcyA9IG5ldyBTbW9TY29yZVByZWZlcmVuY2VzKFNtb1Njb3JlUHJlZmVyZW5jZXMuZGVmYXVsdHMpO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBzdGF2ZXMgdGhhdCBtYWtlIHVwIHRoZSBtdXNpYyBvZiB0aGUgc2NvcmVcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TeXN0ZW1TdGFmZltdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN0YXZlczogU21vU3lzdGVtU3RhZmZbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBhY3RpdmUgc3RhZmYsIHVzZWQgZm9yIHNvbWUgdHlwZXMgb2Ygc2VsZWN0aW9ucy4gIE5vdCBzZXJpYWxpemVkLlxyXG4gICAqXHJcbiAgICogQHR5cGUge251bWJlcn1cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBhY3RpdmVTdGFmZjogbnVtYmVyID0gMDtcclxuICAvKipcclxuICAgKiBUZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NvcmUsIGJ1dCBub3QgYSBzcGVjaWZpYyBtdXNpY2FsIGVsZW1lbnQgKGUuZy4gbHlyaWNzIGFyZSBjb250YWlucyBieSBub3RlcylcclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9UZXh0R3JvdXBbXX1cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIEEgbG9naWNhbCBncm91cGluZyBvZiBzdGF2ZXMgZm9yIGp1c3RpZmljYXRpb25cclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9TeXN0ZW1Hcm91cFtdfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN5c3RlbUdyb3VwczogU21vU3lzdGVtR3JvdXBbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIHNvbWUgYXVkaW8gcGxheWVyIGRlZmF1bHRzXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vQXVkaW9QbGF5ZXJTZXR0aW5nc31cclxuICAgKiBAbWVtYmVyb2YgU21vU2NvcmVcclxuICAgKi9cclxuICBhdWRpb1NldHRpbmdzOiBTbW9BdWRpb1BsYXllclNldHRpbmdzO1xyXG4gIC8qKlxyXG4gICAqIFByZXNlcnZlIGEgbWFwIG9mIG1lYXN1cmVzIHRvIHRoZWlyIGFjdHVhbCBtZWFzdXJlIG51bWJlcnNcclxuICAgKlxyXG4gICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBudW1iZXI+fVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgLyoqXHJcbiAgICogcGFnZSBhbmQgcmVuZGVyaW5nIGxheW91dCBvZiB0aGUgc2NvcmUsIGluY2x1ZGluZyB0aGUgcHBpIGFuZCBzY2FsaW5nIG9mIHRoZSBwYWdlcy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtTbW9MYXlvdXRNYW5hZ2VyfVxyXG4gICAqIEBtZW1iZXJvZiBTbW9TY29yZVxyXG4gICAqL1xyXG4gIGxheW91dE1hbmFnZXI/OiBTbW9MYXlvdXRNYW5hZ2VyO1xyXG4gIC8qKlxyXG4gICAqIHBlci1tZWFzdXJlIGZvcm1hdHRpbmcgY3VzdG9taXphdGlvbnMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7U21vRm9ybWF0dGluZ01hbmFnZXJ9XHJcbiAgICogQG1lbWJlcm9mIFNtb1Njb3JlXHJcbiAgICovXHJcbiAgZm9ybWF0dGluZ01hbmFnZXI/OiBTbW9Gb3JtYXR0aW5nTWFuYWdlclxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU21vU2NvcmVQYXJhbXMpIHtcclxuICAgIHNtb1NlcmlhbGl6ZS52ZXhNZXJnZSh0aGlzLCBTbW9TY29yZS5kZWZhdWx0cyk7XHJcbiAgICBzbW9TZXJpYWxpemUudmV4TWVyZ2UodGhpcywgcGFyYW1zKTtcclxuICAgIGlmICghdGhpcy5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TWFuYWdlciA9IG5ldyBTbW9MYXlvdXRNYW5hZ2VyKFNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm1hdHRpbmdNYW5hZ2VyKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0dGluZ01hbmFnZXIgPSBuZXcgU21vRm9ybWF0dGluZ01hbmFnZXIoU21vRm9ybWF0dGluZ01hbmFnZXIuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGJlYW1pbmcgcnVsZXMgYmFzZWQgb24gcHJlZmVyZW5jZXMuXHJcbiAgICBjb25zdCBwcmVmID0gdGhpcy5wcmVmZXJlbmNlcztcclxuICAgIFNtb01lYXN1cmUuZGVmYXVsdER1cGxlRHVyYXRpb24gPSBwcmVmLmRlZmF1bHREdXBsZUR1cmF0aW9uO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0VHJpcGxlRHVyYXRpb24gPSBwcmVmLmRlZmF1bHRUcmlwbGVEdXJhdGlvbjtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgKHRoaXMucHJlZmVyZW5jZXMuc2hvd1BpYW5vKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5wcmVmZXJlbmNlcy5zaG93UGlhbm8gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYXVkaW9TZXR0aW5ncyA9IG5ldyBTbW9BdWRpb1BsYXllclNldHRpbmdzKHBhcmFtcy5hdWRpb1NldHRpbmdzKTtcclxuICAgIHRoaXMudXBkYXRlTWVhc3VyZUZvcm1hdHMoKTtcclxuICAgIHRoaXMudXBkYXRlU3lzdGVtR3JvdXBzKCk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgZW5ncmF2aW5nRm9udHMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geyBCcmF2dXJhOiAnQnJhdnVyYScsIEdvbnZpbGxlOiAnR29udmlsbGUnLCBQZXRhbHVtYTogJ1BldGFsdW1hJyB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGZvbnRQdXJwb3NlcygpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcclxuICAgIHJldHVybiB7IEVOR1JBVklORzogMSwgU0NPUkU6IDIsIENIT1JEUzogMywgTFlSSUNTOiA0IH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgc2NvcmVJbmZvRGVmYXVsdHMoKTogU21vU2NvcmVJbmZvIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgbmFtZTogJ1Ntb29zaWNhbCcsXHJcbiAgICAgIHRpdGxlOiAnU21vb3NpY2FsJyxcclxuICAgICAgc3ViVGl0bGU6ICcoT3AuIDEpJyxcclxuICAgICAgY29tcG9zZXI6ICdNZScsXHJcbiAgICAgIGNvcHlyaWdodDogJycsXHJcbiAgICAgIHZlcnNpb246IDFcclxuICAgIH0pKTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBzY29yZU1ldGFkYXRhRGVmYXVsdHMoKTogU2NvcmVNZXRhZGF0YVNlciB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIGZvbnRzOiBbeyBuYW1lOiAnZW5ncmF2aW5nJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLkVOR1JBVklORywgZmFtaWx5OiAnQnJhdnVyYScsIHNpemU6IDEsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgeyBuYW1lOiAnc2NvcmUnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuU0NPUkUsIGZhbWlseTogJ01lcnJpd2VhdGhlcicsIHNpemU6IDE0LCBjdXN0b206IGZhbHNlIH0sXHJcbiAgICAgIHsgbmFtZTogJ2Nob3JkcycsIHB1cnBvc2U6IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5DSE9SRFMsIGZhbWlseTogJ1JvYm90byBTbGFiJywgc2l6ZTogMTQsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgeyBuYW1lOiAnbHlyaWNzJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLkxZUklDUywgZmFtaWx5OiAnTWVycml3ZWF0aGVyJywgc2l6ZTogMTIsIGN1c3RvbTogZmFsc2UgfSBdLFxyXG4gICAgICBzY29yZUluZm86IFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzLFxyXG4gICAgICByZW51bWJlcmluZ01hcDoge30sXHJcbiAgICAgIHByZWZlcmVuY2VzOiBuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhTbW9TY29yZVByZWZlcmVuY2VzLmRlZmF1bHRzKVxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb1Njb3JlUGFyYW1zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8vIGxlZ2FjeSBsYXlvdXQgc3RydWN0dXJlLiAgTm93IHdlIHVzZSBwYWdlcy5cclxuICAgICAgZm9udHM6IFtcclxuICAgICAgICB7IG5hbWU6ICdlbmdyYXZpbmcnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuRU5HUkFWSU5HLCBmYW1pbHk6ICdCcmF2dXJhJywgc2l6ZTogMSwgY3VzdG9tOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogJ3Njb3JlJywgcHVycG9zZTogU21vU2NvcmUuZm9udFB1cnBvc2VzLlNDT1JFLCBmYW1pbHk6ICdNZXJyaXdlYXRoZXInLCBzaXplOiAxNCwgY3VzdG9tOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogJ2Nob3JkcycsIHB1cnBvc2U6IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5DSE9SRFMsIGZhbWlseTogJ1JvYm90byBTbGFiJywgc2l6ZTogMTQsIGN1c3RvbTogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6ICdseXJpY3MnLCBwdXJwb3NlOiBTbW9TY29yZS5mb250UHVycG9zZXMuTFlSSUNTLCBmYW1pbHk6ICdNZXJyaXdlYXRoZXInLCBzaXplOiAxMiwgY3VzdG9tOiBmYWxzZSB9XHJcbiAgICAgIF0sXHJcbiAgICAgIHNjb3JlSW5mbzogU21vU2NvcmUuc2NvcmVJbmZvRGVmYXVsdHMsXHJcbiAgICAgIGF1ZGlvU2V0dGluZ3M6IG5ldyBTbW9BdWRpb1BsYXllclNldHRpbmdzKFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MuZGVmYXVsdHMpLFxyXG4gICAgICBwcmVmZXJlbmNlczogbmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMoU21vU2NvcmVQcmVmZXJlbmNlcy5kZWZhdWx0cyksXHJcbiAgICAgIHN0YXZlczogW10sXHJcbiAgICAgIGFjdGl2ZVN0YWZmOiAwLFxyXG4gICAgICB0ZXh0R3JvdXBzOiBbXSxcclxuICAgICAgc3lzdGVtR3JvdXBzOiBbXVxyXG4gICAgfTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBwYWdlU2l6ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsnbGV0dGVyJywgJ3RhYmxvaWQnLCAnQTQnLCAnQTRMYW5kc2NhcGUnLCAnY3VzdG9tJ107XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFnZURpbWVuc2lvbnMoKTogUmVjb3JkPHN0cmluZywgU3ZnRGltZW5zaW9ucz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2xldHRlcic6IHsgd2lkdGg6IDggKiA5NiArIDQ4LCBoZWlnaHQ6IDExICogOTYgfSxcclxuICAgICAgJ2xldHRlckxhbmRzY2FwZSc6IHsgd2lkdGg6IDExICogOTYsIGhlaWdodDogOCAqIDk2ICsgNDggfSxcclxuICAgICAgJ3RhYmxvaWQnOiB7IHdpZHRoOiAxNjMyLCBoZWlnaHQ6IDEwNTYgfSxcclxuICAgICAgJ0E0JzogeyB3aWR0aDogNzk0LCBoZWlnaHQ6IDExMjIgfSxcclxuICAgICAgJ0E0TGFuZHNjYXBlJzogeyB3aWR0aDogMTEyMiwgaGVpZ2h0OiA3OTQgfSxcclxuICAgICAgJ2N1c3RvbSc6IHsgd2lkdGg6IDEsIGhlaWdodDogMSB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgcGFnZVNpemVGcm9tRGltZW5zaW9ucyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgcnYgPVxyXG4gICAgICBTbW9TY29yZS5wYWdlU2l6ZXMuZmluZCgoc3opID0+IFNtb1Njb3JlLnBhZ2VEaW1lbnNpb25zW3N6XS53aWR0aCA9PT0gd2lkdGggJiYgU21vU2NvcmUucGFnZURpbWVuc2lvbnNbc3pdLmhlaWdodCA9PT0gaGVpZ2h0KVxyXG4gICAgICA/PyBudWxsO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBwcmVmZXJlbmNlcygpIHtcclxuICAgIHJldHVybiBbJ3ByZWZlcmVuY2VzJywgJ2ZvbnRzJywgJ3Njb3JlSW5mbycsICdhdWRpb1NldHRpbmdzJ107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNlcmlhbGl6ZSB0aGUga2V5U2lnbmF0dXJlLCB0ZW1wbyBhbmQgdGltZSBzaWduYXR1cmUsIHdoaWNoIGFyZSBtYXBwZWRcclxuICAgKiB0byBhIGNvbHVtbiBhdCBhIG1lYXN1cmUgaW5kZXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzZXJpYWxpemVDb2x1bW5NYXBwZWQoZnVuYzogKG1lYXN1cmU6IFNtb01lYXN1cmUpID0+IENvbHVtbk1hcHBlZFBhcmFtcykge1xyXG4gICAgY29uc3Qga2V5U2lnbmF0dXJlOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge307XHJcbiAgICBjb25zdCB0ZW1wbzogUmVjb3JkPG51bWJlciwgU21vVGVtcG9UZXh0PiA9IHt9O1xyXG4gICAgY29uc3QgdGltZVNpZ25hdHVyZTogUmVjb3JkPG51bWJlciwgVGltZVNpZ25hdHVyZT4gPSB7fTtcclxuICAgIGNvbnN0IHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgICBsZXQgcHJldmlvdXM6IENvbHVtbk1hcHBlZFBhcmFtcyB8IG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50ID0gZnVuYyhtZWFzdXJlKTtcclxuICAgICAgY29uc3QgaXggPSBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgICBjb25zdCBjdXJyZW50SW5zdHJ1bWVudCA9IHRoaXMuc3RhdmVzWzBdLmdldFN0YWZmSW5zdHJ1bWVudChpeCk7XHJcbiAgICAgIGN1cnJlbnQua2V5U2lnbmF0dXJlID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChjdXJyZW50LmtleVNpZ25hdHVyZSwgLTEgKiBjdXJyZW50SW5zdHJ1bWVudC5rZXlPZmZzZXQpO1xyXG4gICAgICBpZiAoaXggPT09IDApIHtcclxuICAgICAgICBrZXlTaWduYXR1cmVbMF0gPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICB0ZW1wb1swXSA9IGN1cnJlbnQudGVtcG87XHJcbiAgICAgICAgdGltZVNpZ25hdHVyZVswXSA9IGN1cnJlbnQudGltZVNpZ25hdHVyZTtcclxuICAgICAgICByZW51bWJlcmluZ01hcFswXSA9IDA7XHJcbiAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMucmVudW1iZXJpbmdNYXBbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0pID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgcmVudW1iZXJpbmdNYXBbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSB0aGlzLnJlbnVtYmVyaW5nTWFwW21lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudC5rZXlTaWduYXR1cmUgIT09IHByZXZpb3VzIS5rZXlTaWduYXR1cmUpIHtcclxuICAgICAgICAgIHByZXZpb3VzIS5rZXlTaWduYXR1cmUgPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICAgIGtleVNpZ25hdHVyZVtpeF0gPSBjdXJyZW50LmtleVNpZ25hdHVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEoVGltZVNpZ25hdHVyZS5lcXVhbChjdXJyZW50LnRpbWVTaWduYXR1cmUsIHByZXZpb3VzIS50aW1lU2lnbmF0dXJlKSkpIHtcclxuICAgICAgICAgIHByZXZpb3VzIS50aW1lU2lnbmF0dXJlID0gY3VycmVudC50aW1lU2lnbmF0dXJlO1xyXG4gICAgICAgICAgdGltZVNpZ25hdHVyZVtpeF0gPSBjdXJyZW50LnRpbWVTaWduYXR1cmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFNtb1RlbXBvVGV4dC5lcShjdXJyZW50LnRlbXBvLCBwcmV2aW91cyEudGVtcG8pKSkge1xyXG4gICAgICAgICAgcHJldmlvdXMhLnRlbXBvID0gY3VycmVudC50ZW1wbztcclxuICAgICAgICAgIHRlbXBvW2l4XSA9IGN1cnJlbnQudGVtcG87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IGtleVNpZ25hdHVyZSwgdGVtcG8sIHRpbWVTaWduYXR1cmUsIHJlbnVtYmVyaW5nTWFwIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2x1bW4tbWFwcGVkIGF0dHJpYnV0ZXMgc3RheSB0aGUgc2FtZSBpbiBlYWNoIG1lYXN1cmUgdW50aWxcclxuICAgKiBjaGFuZ2VkLCBsaWtlIGtleS1zaWduYXR1cmVzLiAgV2UgZG9uJ3Qgc3RvcmUgZWFjaCBtZWFzdXJlIHZhbHVlIHRvXHJcbiAgICogbWFrZSB0aGUgZmlsZXMgc21hbGxlclxyXG4gICAqIEBwYXJhbSBzY29yZU9iaiAtIHRoZSBqc29uIGJsb2IgdGhhdCBjb250YWlucyB0aGUgc2NvcmUgZGF0YVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUNvbHVtbk1hcHBlZChzY29yZU9iajogYW55KSB7XHJcbiAgICBsZXQgY3VyVmFsdWU6IGFueTtcclxuICAgIGxldCBtYXBJeDogbnVtYmVyID0gMDtcclxuICAgIGlmICghc2NvcmVPYmouY29sdW1uQXR0cmlidXRlTWFwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmtleXMoc2NvcmVPYmouY29sdW1uQXR0cmlidXRlTWFwKTtcclxuICAgIHNjb3JlT2JqLnN0YXZlcy5mb3JFYWNoKChzdGFmZjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGF0dHJJeE1hcDogYW55ID0ge307XHJcbiAgICAgIGF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICBhdHRySXhNYXBbYXR0cl0gPSAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHN0YWZmLm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICAgIG1hcEl4ID0gYXR0ckl4TWFwW2F0dHJdO1xyXG4gICAgICAgICAgY29uc3QgY3VySGFzaCA9IHNjb3JlT2JqLmNvbHVtbkF0dHJpYnV0ZU1hcFthdHRyXTtcclxuICAgICAgICAgIGNvbnN0IGF0dHJLZXlzOiBhbnkgPSBPYmplY3Qua2V5cyhjdXJIYXNoKTtcclxuICAgICAgICAgIGN1clZhbHVlID0gY3VySGFzaFthdHRyS2V5c1ttYXBJeC50b1N0cmluZygpXV07XHJcbiAgICAgICAgICBhdHRyS2V5cy5zb3J0KChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gcGFyc2VJbnQoYSwgMTApID4gcGFyc2VJbnQoYiwgMTApID8gMSA6IC0xKTtcclxuICAgICAgICAgIGlmIChhdHRyS2V5cy5sZW5ndGggPiBtYXBJeCArIDEpIHtcclxuICAgICAgICAgICAgaWYgKG1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXggPj0gYXR0cktleXNbbWFwSXggKyAxXSkge1xyXG4gICAgICAgICAgICAgIG1hcEl4ICs9IDE7XHJcbiAgICAgICAgICAgICAgY3VyVmFsdWUgPSBjdXJIYXNoW2F0dHJLZXlzW21hcEl4LnRvU3RyaW5nKCldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGVnYWN5IHRpbWVTaWduYXR1cmUgZm9ybWF0IHdhcyBqdXN0IGEgc3RyaW5nIDIvNCwgMy84IGV0Yy5cclxuICAgICAgICAgIGlmIChhdHRyID09PSAndGltZVNpZ25hdHVyZScpIHtcclxuICAgICAgICAgICAgY29uc3QgdHMgPSBuZXcgVGltZVNpZ25hdHVyZShUaW1lU2lnbmF0dXJlLmRlZmF1bHRzKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY3VyVmFsdWUpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgIHRzLnRpbWVTaWduYXR1cmUgPSBjdXJWYWx1ZTtcclxuICAgICAgICAgICAgICBtZWFzdXJlW2F0dHJdID0gdHM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbWVhc3VyZVthdHRyXSA9IFRpbWVTaWduYXR1cmUuY3JlYXRlRnJvbVBhcnRpYWwoY3VyVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZWFzdXJlW2F0dHJdID0gY3VyVmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRySXhNYXBbYXR0cl0gPSBtYXBJeDtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlcmlhbGl6ZSB0aGUgZW50aXJlIHNjb3JlLlxyXG4gICAqIEByZXR1cm5zIEpTT04gb2JqZWN0XHJcbiAgICovXHJcbiAgc2VyaWFsaXplKG9wdGlvbnM/OiBTbW9TY29yZVNlcmlhbGl6ZU9wdGlvbnMpOiBTbW9TY29yZVBhcmFtc1NlciB7XHJcbiAgICBjb25zdCBza2lwU3RhdmVzID0gb3B0aW9ucz8uc2tpcFN0YXZlcyA/PyBmYWxzZTtcclxuICAgIGNvbnN0IHVzZURpY3Rpb25hcnkgPSBvcHRpb25zPy5za2lwU3RhdmVzID8/IHRydWU7XHJcbiAgICBjb25zdCBwcmVzZXJ2ZUlkcyA9IG9wdGlvbnM/LnByZXNlcnZlU3RhZmZJZHMgPz8gZmFsc2U7XHJcbiAgICBsZXQgb2JqOiBQYXJ0aWFsPFNtb1Njb3JlUGFyYW1zU2VyPiA9IHtcclxuICAgICAgbGF5b3V0TWFuYWdlcjogeyBjdG9yOiAnU21vTGF5b3V0TWFuYWdlcicsIC4uLlNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMgfSxcclxuICAgICAgYXVkaW9TZXR0aW5nczoge30sXHJcbiAgICAgIG1lYXN1cmVGb3JtYXRzOiBbXSxcclxuICAgICAgc3RhdmVzOiBbXSxcclxuICAgICAgdGV4dEdyb3VwczogW10sXHJcbiAgICAgIHN5c3RlbUdyb3VwczogW10sXHJcbiAgICAgIG1ldGFkYXRhOiBTbW9TY29yZS5zY29yZU1ldGFkYXRhRGVmYXVsdHNcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIG9iai5sYXlvdXRNYW5hZ2VyID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnNlcmlhbGl6ZSgpO1xyXG4gICAgfVxyXG4gICAgb2JqLm1ldGFkYXRhIS5mb250cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mb250cykpO1xyXG4gICAgb2JqLm1ldGFkYXRhIS5yZW51bWJlcmluZ01hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yZW51bWJlcmluZ01hcCkpO1xyXG4gICAgb2JqLm1ldGFkYXRhIS5wcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXMuc2VyaWFsaXplKCk7XHJcbiAgICBvYmoubWV0YWRhdGEhLnNjb3JlSW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zY29yZUluZm8pKTtcclxuICAgIGlmICh0eXBlb2YgKG9iaj8ubWV0YWRhdGE/LnNjb3JlSW5mbz8udmVyc2lvbikgIT09ICdudW1iZXInKSB7XHJcbiAgICAgIG9iai5tZXRhZGF0YSEuc2NvcmVJbmZvLnZlcnNpb24gPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybWF0dGluZ01hbmFnZXIpIHtcclxuICAgICAgb2JqLm1lYXN1cmVGb3JtYXRzID0gdGhpcy5mb3JtYXR0aW5nTWFuYWdlci5zZXJpYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvYmouYXVkaW9TZXR0aW5ncyA9IHRoaXMuYXVkaW9TZXR0aW5ncy5zZXJpYWxpemUoKTtcclxuICAgIGlmICghc2tpcFN0YXZlcykge1xyXG4gICAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZjogU21vU3lzdGVtU3RhZmYpID0+IHtcclxuICAgICAgICBvYmouc3RhdmVzIS5wdXNoKHN0YWZmLnNlcmlhbGl6ZSh7IHNraXBNYXBzOiB0cnVlLCBwcmVzZXJ2ZUlkczogcHJlc2VydmVJZHMgfSkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9iai5zdGF2ZXMgPSBbXTtcclxuICAgIH1cclxuICAgIC8vIFNjb3JlIHRleHQgaXMgbm90IHBhcnQgb2YgdGV4dCBncm91cCwgc28gZG9uJ3Qgc2F2ZSBzZXBhcmF0ZWx5LlxyXG4gICAgdGhpcy50ZXh0R3JvdXBzLmZvckVhY2goKHRnKSA9PiB7XHJcbiAgICAgIGlmICh0Zy5pc1RleHRWaXNpYmxlKCkpIHtcclxuICAgICAgICBvYmoudGV4dEdyb3VwcyEucHVzaCh0Zy5zZXJpYWxpemUoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMuZm9yRWFjaCgoZ2cpID0+IHtcclxuICAgICAgb2JqLnN5c3RlbUdyb3VwcyEucHVzaChnZy5zZXJpYWxpemUoKSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGdldFNlck1lYXN1cmUgPSAobWVhc3VyZTogU21vTWVhc3VyZSk6IENvbHVtbk1hcHBlZFBhcmFtcyA9PiB7XHJcbiAgICAgIHJldHVybiBtZWFzdXJlLnNlcmlhbGl6ZUNvbHVtbk1hcHBlZCgpO1xyXG4gICAgfVxyXG4gICAgb2JqLmNvbHVtbkF0dHJpYnV0ZU1hcCA9IHRoaXMuc2VyaWFsaXplQ29sdW1uTWFwcGVkKGdldFNlck1lYXN1cmUpO1xyXG4gICAgaWYgKHVzZURpY3Rpb25hcnkpIHtcclxuICAgICAgc21vU2VyaWFsaXplLmpzb25Ub2tlbnMob2JqKTtcclxuICAgICAgb2JqID0gc21vU2VyaWFsaXplLmRldG9rZW5pemUob2JqLCBzbW9TZXJpYWxpemUudG9rZW5WYWx1ZXMpO1xyXG4gICAgICBvYmouZGljdGlvbmFyeSA9IHNtb1NlcmlhbGl6ZS50b2tlbk1hcDtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmogYXMgU21vU2NvcmVQYXJhbXNTZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTY29yZVByZWZlcmVuY2VzKHByZWY6IFNtb1Njb3JlUHJlZmVyZW5jZXMpIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMgPSBwcmVmO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0RHVwbGVEdXJhdGlvbiA9IHByZWYuZGVmYXVsdER1cGxlRHVyYXRpb247XHJcbiAgICBTbW9NZWFzdXJlLmRlZmF1bHRUcmlwbGVEdXJhdGlvbiA9IHByZWYuZGVmYXVsdFRyaXBsZUR1cmF0aW9uO1xyXG4gIH1cclxuICBnZXQgZW5ncmF2aW5nRm9udCgpOiBlbmdyYXZpbmdGb250VHlwZSB7XHJcbiAgICBjb25zdCBlZm9udCA9IHRoaXMuZm9udHMuZmluZCgoeCkgPT4geC5wdXJwb3NlID09PSBTbW9TY29yZS5mb250UHVycG9zZXMuRU5HUkFWSU5HKTtcclxuICAgIGlmIChlZm9udCkge1xyXG4gICAgICBjb25zdCB2YWw6IGVuZ3JhdmluZ0ZvbnRUeXBlIHwgdW5kZWZpbmVkID0gZW5ncmF2aW5nRm9udFR5cGVzLmZpbmQoKHgpID0+IHggPT09IGVmb250LmZhbWlseSk7XHJcbiAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ0JyYXZ1cmEnO1xyXG4gIH1cclxuICBzZXQgZW5ncmF2aW5nRm9udCh2YWx1ZTogZW5ncmF2aW5nRm9udFR5cGUpIHtcclxuICAgIGNvbnN0IGVmb250ID0gdGhpcy5mb250cy5maW5kKCh4KSA9PiB4LnB1cnBvc2UgPT09IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5FTkdSQVZJTkcpO1xyXG4gICAgaWYgKGVmb250ICYmIGlzRW5ncmF2aW5nRm9udCh2YWx1ZSkpIHtcclxuICAgICAgZWZvbnQuZmFtaWx5ID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyB1cENvbnZlcnRHbG9iYWxMYXlvdXQoanNvbk9iajogYW55KSB7XHJcbiAgICAvLyB1cGNvbnZlcnQgZ2xvYmFsIGxheW91dCwgd2hpY2ggdXNlZCB0byBiZSBkaXJlY3RseSBvbiBsYXlvdXRNYW5hZ2VyXHJcbiAgICBpZiAodHlwZW9mIChqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0KSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAganNvbk9iai5sYXlvdXRNYW5hZ2VyLmdsb2JhbExheW91dCA9IHtcclxuICAgICAgICBzdmdTY2FsZToganNvbk9iai5sYXlvdXRNYW5hZ2VyLnN2Z1NjYWxlLFxyXG4gICAgICAgIHpvb21TY2FsZToganNvbk9iai5sYXlvdXRNYW5hZ2VyLnpvb21TY2FsZSxcclxuICAgICAgICBwYWdlV2lkdGg6IGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlV2lkdGgsXHJcbiAgICAgICAgcGFnZUhlaWdodDoganNvbk9iai5sYXlvdXRNYW5hZ2VyLnBhZ2VIZWlnaHQsXHJcbiAgICAgICAgbm90ZVNwYWNpbmc6IGpzb25PYmoubGF5b3V0TWFuYWdlci5ub3RlU3BhY2luZ1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAoIWpzb25PYmoubGF5b3V0TWFuYWdlci5nbG9iYWxMYXlvdXQubm90ZVNwYWNpbmcpIHtcclxuICAgICAgICBqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0Lm5vdGVTcGFjaW5nID0gMS4wO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgbGVnYWN5IHNjb3JlIGxheW91dCB0byBsYXlvdXRNYW5hZ2VyIG9iamVjdCBwYXJhbWV0ZXJzXHJcbiAgICogQHBhcmFtIGpzb25PYmogXHJcbiAgICovXHJcbiAgc3RhdGljIHVwQ29udmVydExheW91dChqc29uT2JqOiBhbnkpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlciA9IHt9O1xyXG4gICAgU21vTGF5b3V0TWFuYWdlci5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAganNvbk9iai5sYXlvdXRNYW5hZ2VyW2F0dHJdID0ganNvbk9iai5zY29yZS5sYXlvdXRbYXR0cl07XHJcbiAgICB9KTtcclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cyA9IFtdO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGpzb25PYmouc2NvcmUubGF5b3V0LnBhZ2VzOyArK2kpIHtcclxuICAgICAgY29uc3QgcGFnZVNldHRpbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFNtb1BhZ2VMYXlvdXQuZGVmYXVsdHMpKTtcclxuICAgICAgU21vUGFnZUxheW91dC5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIChqc29uT2JqLnNjb3JlLmxheW91dFthdHRyXSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICBwYWdlU2V0dGluZ1thdHRyXSA9IGpzb25PYmouc2NvcmUubGF5b3V0W2F0dHJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cy5wdXNoKHBhZ2VTZXR0aW5nKTtcclxuICAgIH1cclxuICAgIFNtb1Njb3JlLnVwQ29udmVydEdsb2JhbExheW91dChqc29uT2JqKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhY2s6IGZvciB0aGUgY2FzZSBvZiBhIHNjb3JlIGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZSBwYXJ0LCB1c2UgdGhlIHRleHQgZnJvbSB0aGUgXHJcbiAgICogcGFydC5cclxuICAgKiBAcGFyYW0ganNvbk9iaiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZml4VGV4dEdyb3VwU2luZ2xlUGFydChqc29uT2JqOiBhbnkpIHtcclxuICAgIGlmIChqc29uT2JqLnN0YXZlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFqc29uT2JqLnN0YXZlc1swXS5wYXJ0SW5mbykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWpzb25PYmouc3RhdmVzWzBdLnBhcnRJbmZvLnRleHRHcm91cHMgfHwganNvbk9iai5zdGF2ZXNbMF0ucGFydEluZm8udGV4dEdyb3Vwcy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGpzb25PYmoudGV4dEdyb3VwcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoanNvbk9iai5zdGF2ZXNbMF0ucGFydEluZm8udGV4dEdyb3VwcykpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZXNlcmlhbGl6ZSBhbiBlbnRpcmUgc2NvcmVcclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBcclxuICAgKiBAcmV0dXJucyBTbW9TY29yZVxyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uU3RyaW5nOiBzdHJpbmcpOiBTbW9TY29yZSB7XHJcbiAgICBsZXQganNvbk9iajogUGFydGlhbDxTbW9TY29yZVBhcmFtc1Nlcj4gPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgbGV0IHVwY29udmVydEZvcm1hdCA9IGZhbHNlO1xyXG4gICAgbGV0IGZvcm1hdHRpbmdNYW5hZ2VyID0gbnVsbDtcclxuICAgIGlmIChqc29uT2JqLmRpY3Rpb25hcnkpIHtcclxuICAgICAganNvbk9iaiA9IHNtb1NlcmlhbGl6ZS5kZXRva2VuaXplKGpzb25PYmosIGpzb25PYmouZGljdGlvbmFyeSk7XHJcbiAgICB9XHJcbiAgICBTbW9TY29yZS5maXhUZXh0R3JvdXBTaW5nbGVQYXJ0KGpzb25PYmopO1xyXG4gICAgdXBjb252ZXJ0Rm9ybWF0ID0gdHlwZW9mIChqc29uT2JqLm1lYXN1cmVGb3JtYXRzKSA9PT0gJ3VuZGVmaW5lZCc7XHJcbiAgICBjb25zdCBwYXJhbXM6IFBhcnRpYWw8U21vU2NvcmVQYXJhbXM+ID0ge307XHJcbiAgICBjb25zdCBzdGF2ZXM6IFNtb1N5c3RlbVN0YWZmW10gPSBbXTtcclxuICAgIGpzb25PYmoudGV4dEdyb3VwcyA9IGpzb25PYmoudGV4dEdyb3VwcyA/IGpzb25PYmoudGV4dEdyb3VwcyA6IFtdO1xyXG5cclxuICAgIC8vIEV4cGxvZGUgdGhlIHNwYXJzZSBhcnJheXMgb2YgYXR0cmlidXRlcyBpbnRvIHRoZSBtZWFzdXJlc1xyXG4gICAgU21vU2NvcmUuZGVzZXJpYWxpemVDb2x1bW5NYXBwZWQoanNvbk9iaik7XHJcbiAgICAvLyAnc2NvcmUnIGF0dHJpYnV0ZSBuYW1lIGNoYW5nZXMgdG8gJ21ldGFkYXRhJ1xyXG4gICAgaWYgKHR5cGVvZiAoKGpzb25PYmogYXMgYW55KS5zY29yZSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGpzb25PYmoubWV0YWRhdGEgPSAoanNvbk9iaiBhcyBhbnkpLnNjb3JlO1xyXG4gICAgfVxyXG4gICAgLy8gbWVhbmluZyBvZiBjdXN0b21Qcm9wb3J0aW9uIGhhcyBjaGFuZ2VkLCBiYWNrd2FyZHMtY29tcGF0aWJsaXR5XHJcbiAgICBpZiAodHlwZW9mIChqc29uT2JqLm1ldGFkYXRhKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAganNvbk9iai5tZXRhZGF0YSA9IFNtb1Njb3JlLnNjb3JlTWV0YWRhdGFEZWZhdWx0cztcclxuICAgIH1cclxuICAgIC8vIHVwY29udmVydCBvbGQgcHJvcG9ydGlvbiBvcGVyYXRvclxyXG4gICAgY29uc3QganNvblByb3BVcCA9IGpzb25PYmoubWV0YWRhdGEucHJlZmVyZW5jZXMgYXMgYW55O1xyXG4gICAgaWYgKHR5cGVvZiAoanNvblByb3BVcCkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiAoanNvblByb3BVcC5jdXN0b21Qcm9wb3J0aW9uKSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cy5wcm9wb3J0aW9uYWxpdHkgPSBqc29uUHJvcFVwLmN1c3RvbVByb3BvcnRpb247XHJcbiAgICAgIGlmIChTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzLnByb3BvcnRpb25hbGl0eSA9PT0gU21vTWVhc3VyZUZvcm1hdC5sZWdhY3lQcm9wb3J0aW9uYWxpdHkpIHtcclxuICAgICAgICBTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzLnByb3BvcnRpb25hbGl0eSA9IFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdFByb3BvcnRpb25hbGl0eTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdXAtY29udmVydCBsZWdhY3kgbGF5b3V0IGRhdGFcclxuICAgIGlmICgoanNvbk9iai5tZXRhZGF0YSBhcyBhbnkpLmxheW91dCkge1xyXG4gICAgICBTbW9TY29yZS51cENvbnZlcnRMYXlvdXQoanNvbk9iaik7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai5sYXlvdXRNYW5hZ2VyICYmICFqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0KSB7XHJcbiAgICAgIFNtb1Njb3JlLnVwQ29udmVydEdsb2JhbExheW91dChqc29uT2JqKTtcclxuICAgIH1cclxuICAgIGlmICghanNvbk9iai5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIGpzb25PYmoubGF5b3V0TWFuYWdlciA9IHsgY3RvcjogXCJTbW9MYXlvdXRNYW5hZ2VyXCIsIC4uLlNtb0xheW91dE1hbmFnZXIuZGVmYXVsdHMgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXJQYXJhbXM6IFNtb0xheW91dE1hbmFnZXJQYXJhbXMgPSB7XHJcbiAgICAgIGdsb2JhbExheW91dDoganNvbk9iai5sYXlvdXRNYW5hZ2VyLmdsb2JhbExheW91dCxcclxuICAgICAgLyoqXHJcbiAgICAgICAqIHBhZ2UgbWFyZ2lucyBmb3IgZWFjaCBwYWdlXHJcbiAgICAgICAqL1xyXG4gICAgICBwYWdlTGF5b3V0czogW11cclxuICAgIH1cclxuICAgIGpzb25PYmoubGF5b3V0TWFuYWdlci5wYWdlTGF5b3V0cy5mb3JFYWNoKChwbCkgPT4ge1xyXG4gICAgICBjb25zdCBwYWdlTGF5b3V0ID0gbmV3IFNtb1BhZ2VMYXlvdXQocGwpO1xyXG4gICAgICBsYXlvdXRNYW5hZ2VyUGFyYW1zLnBhZ2VMYXlvdXRzLnB1c2gocGFnZUxheW91dCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXIgPSBuZXcgU21vTGF5b3V0TWFuYWdlcihsYXlvdXRNYW5hZ2VyUGFyYW1zKTtcclxuXHJcbiAgICAvLyBwYXJhbXMubGF5b3V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShTbW9TY29yZS5kZWZhdWx0cy5sYXlvdXQpKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoXHJcbiAgICAgIFsncmVudW1iZXJpbmdNYXAnLCAnZm9udHMnXSxcclxuICAgICAgU21vU2NvcmUuc2NvcmVNZXRhZGF0YURlZmF1bHRzLCBwYXJhbXMpO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShcclxuICAgICAgWydyZW51bWJlcmluZ01hcCcsICdmb250cyddLFxyXG4gICAgICBqc29uT2JqLm1ldGFkYXRhLCBwYXJhbXMpO1xyXG4gICAgaWYgKGpzb25PYmoubWV0YWRhdGEucHJlZmVyZW5jZXMpIHtcclxuICAgICAgcGFyYW1zLnByZWZlcmVuY2VzID0gbmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMoanNvbk9iai5tZXRhZGF0YS5wcmVmZXJlbmNlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXJhbXMucHJlZmVyZW5jZXMgPSBuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhTbW9TY29yZVByZWZlcmVuY2VzLmRlZmF1bHRzKTtcclxuICAgIH1cclxuICAgIGlmIChqc29uT2JqLm1ldGFkYXRhLnNjb3JlSW5mbykge1xyXG4gICAgICBjb25zdCBzY29yZUluZm86IFBhcnRpYWw8U21vU2NvcmVJbmZvPiA9IHt9O1xyXG4gICAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb1Njb3JlSW5mb0tleXMsIFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzLCBzY29yZUluZm8pO1xyXG4gICAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb1Njb3JlSW5mb0tleXMsIGpzb25PYmoubWV0YWRhdGEuc2NvcmVJbmZvLCBzY29yZUluZm8pO1xyXG4gICAgICBwYXJhbXMuc2NvcmVJbmZvID0gKHNjb3JlSW5mbyBhcyBTbW9TY29yZUluZm8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW1zLnNjb3JlSW5mbyA9IFNtb1Njb3JlLnNjb3JlSW5mb0RlZmF1bHRzO1xyXG4gICAgfVxyXG4gICAgaWYgKCFqc29uT2JqLmF1ZGlvU2V0dGluZ3MpIHtcclxuICAgICAgcGFyYW1zLmF1ZGlvU2V0dGluZ3MgPSBuZXcgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncyhTbW9BdWRpb1BsYXllclNldHRpbmdzLmRlZmF1bHRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy5hdWRpb1NldHRpbmdzID0gU21vU2NvcmVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUoanNvbk9iai5hdWRpb1NldHRpbmdzKTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlID0gcGFyYW1zLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUgPz8gZmFsc2U7XHJcbiAgICBpZiAoanNvbk9iai5zdGF2ZXMgJiYganNvbk9iai5zdGF2ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIElnbm9yZSBzZXJpYWxpemVkIHRyYW5wb3NlIG9mIHNjb3JlIGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcGFydC5cclxuICAgICAgcGFyYW1zLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUgPSBmYWxzZTsgXHJcbiAgICB9XHJcblxyXG4gICAgcGFyYW1zLnByZWZlcmVuY2VzLmhpZGVFbXB0eUxpbmVzID0gcGFyYW1zLnByZWZlcmVuY2VzLmhpZGVFbXB0eUxpbmVzID8/IGZhbHNlO1xyXG4gICAgbGV0IHJlbnVtYmVyaW5nTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0geyAwOiAwIH07XHJcbiAgICBpZiAoanNvbk9iai5jb2x1bW5BdHRyaWJ1dGVNYXAgJiYganNvbk9iai5jb2x1bW5BdHRyaWJ1dGVNYXAucmVudW1iZXJpbmdNYXApIHtcclxuICAgICAgcmVudW1iZXJpbmdNYXAgPSBqc29uT2JqLmNvbHVtbkF0dHJpYnV0ZU1hcC5yZW51bWJlcmluZ01hcDtcclxuICAgIH1cclxuICAgIGlmICghanNvbk9iai5zdGF2ZXMpIHtcclxuICAgICAgdGhyb3cgJ2JhZCBzY29yZSwgbm8gc3RhdmVzOiAnICsgSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XHJcbiAgICB9XHJcbiAgICBqc29uT2JqLnN0YXZlcy5mb3JFYWNoKChzdGFmZk9iajogYW55LCBzdGFmZkl4OiBudW1iZXIpID0+IHtcclxuICAgICAgc3RhZmZPYmouc3RhZmZJZCA9IHN0YWZmSXg7XHJcbiAgICAgIHN0YWZmT2JqLnJlbnVtYmVyaW5nTWFwID0gcmVudW1iZXJpbmdNYXA7XHJcbiAgICAgIGNvbnN0IHN0YWZmID0gU21vU3lzdGVtU3RhZmYuZGVzZXJpYWxpemUoc3RhZmZPYmopO1xyXG4gICAgICBzdGF2ZXMucHVzaChzdGFmZik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gICAganNvbk9iai50ZXh0R3JvdXBzLmZvckVhY2goKHRnOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFpc0VtcHR5VGV4dEJsb2NrKHRnKSkge1xyXG4gICAgICAgIHRleHRHcm91cHMucHVzaChTbW9UZXh0R3JvdXAuZGVzZXJpYWxpemVQcmVzZXJ2ZUlkKHRnKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHN5c3RlbUdyb3VwczogU21vU3lzdGVtR3JvdXBbXSA9IFtdO1xyXG4gICAgaWYgKGpzb25PYmouc3lzdGVtR3JvdXBzKSB7XHJcbiAgICAgIGpzb25PYmouc3lzdGVtR3JvdXBzLmZvckVhY2goKHR0OiBhbnkpID0+IHtcclxuICAgICAgICB2YXIgc3QgPSBTbW9TY29yZU1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZSh0dCk7XHJcbiAgICAgICAgc3QuYXV0b0xheW91dCA9IGZhbHNlOyAvLyBzaW5jZSB0aGlzIGhhcyBiZWVuIGxheWVkIG91dCwgcHJlc3VtYWJseSwgYmVmb3JlIHNhdmVcclxuICAgICAgICBzeXN0ZW1Hcm91cHMucHVzaChzdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcGFyYW1zLnN0YXZlcyA9IHN0YXZlcztcclxuICAgIGlmICh1cGNvbnZlcnRGb3JtYXQpIHtcclxuICAgICAgZm9ybWF0dGluZ01hbmFnZXIgPSBTbW9TY29yZS5tZWFzdXJlRm9ybWF0RnJvbUxlZ2FjeVNjb3JlKHBhcmFtcyBhcyBhbnksIGpzb25PYmopO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVhc3VyZVBhcmFtczogU21vRm9ybWF0dGluZ01hbmFnZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgbWVhc3VyZUZvcm1hdHM6IFtdLFxyXG4gICAgICAgIHBhcnRJbmRleDogLTFcclxuICAgICAgfVxyXG4gICAgICBpZiAoanNvbk9iai5tZWFzdXJlRm9ybWF0cykge1xyXG4gICAgICAgIGpzb25PYmoubWVhc3VyZUZvcm1hdHMuZm9yRWFjaCgobWY6IFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG1mT2JqID0gbmV3IFNtb01lYXN1cmVGb3JtYXQobWYpO1xyXG4gICAgICAgICAgbWVhc3VyZVBhcmFtcy5tZWFzdXJlRm9ybWF0cz8ucHVzaChtZk9iaik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLmZvcm1hdHRpbmdNYW5hZ2VyID0gbmV3IFNtb0Zvcm1hdHRpbmdNYW5hZ2VyKG1lYXN1cmVQYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgcGFyYW1zLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyO1xyXG4gICAgaWYgKCFpc1Ntb1Njb3JlUGFyYW1zKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ0JhZCBzY29yZSwgbWlzc2luZyBwYXJhbXM6ICcgKyBKU09OLnN0cmluZ2lmeShwYXJhbXMsIG51bGwsICcgJyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY29yZSA9IG5ldyBTbW9TY29yZShwYXJhbXMpO1xyXG4gICAgc2NvcmUudGV4dEdyb3VwcyA9IHRleHRHcm91cHM7XHJcbiAgICBzY29yZS5zeXN0ZW1Hcm91cHMgPSBzeXN0ZW1Hcm91cHM7XHJcbiAgICBzY29yZS5zY29yZUluZm8udmVyc2lvbiArPSAxO1xyXG4gICAgcmV0dXJuIHNjb3JlO1xyXG4gIH1cclxuICAvKipcclxuICAqIENvbnZlcnQgbWVhc3VyZSBmb3JtYXR0aW5nIGZyb20gbGVnYWN5IHNjb3JlcywgdGhhdCBoYWQgdGhlIGZvcm1hdHRpbmdcclxuICAqIHBlciBtZWFzdXJlLCB0byB0aGUgbmV3IHdheSB0aGF0IGhhcyBhIHNlcGFyYXRlIGZvcm1hdHRpbmcgb2JqZWN0LlxyXG4gICogKiovXHJcbiAgc3RhdGljIG1lYXN1cmVGb3JtYXRGcm9tTGVnYWN5U2NvcmUoc2NvcmU6IFNtb1Njb3JlLCBqc29uT2JqOiBhbnkpOiBTbW9Gb3JtYXR0aW5nTWFuYWdlciB8IG51bGwge1xyXG4gICAgbGV0IGN1cnJlbnQ6IFNtb01lYXN1cmVGb3JtYXQgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBwcmV2aW91czogU21vTWVhc3VyZUZvcm1hdCB8IG51bGwgPSBudWxsO1xyXG4gICAgY29uc3QgbWVhc3VyZUZvcm1hdHM6IFNtb01lYXN1cmVGb3JtYXRbXSA9IFtdO1xyXG4gICAgc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmU6IFNtb01lYXN1cmUpID0+IHtcclxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICBjdXJyZW50ID0gU21vTWVhc3VyZUZvcm1hdC5mcm9tTGVnYWN5TWVhc3VyZShqc29uT2JqLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSk7XHJcbiAgICAgICAgbWVhc3VyZUZvcm1hdHNbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBjdXJyZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByZXZpb3VzID0gY3VycmVudDtcclxuICAgICAgICBjdXJyZW50ID0gU21vTWVhc3VyZUZvcm1hdC5mcm9tTGVnYWN5TWVhc3VyZShqc29uT2JqLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSk7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50LmVxKHByZXZpb3VzKSkge1xyXG4gICAgICAgICAgbWVhc3VyZUZvcm1hdHNbbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBjdXJyZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV3IFNtb0Zvcm1hdHRpbmdNYW5hZ2VyKHsgbWVhc3VyZUZvcm1hdHMgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYSBkZWZhdWx0IHNjb3JlIHdpdGggbm8gbm90ZXMgb3Igc3RhdmVzXHJcbiAgICogQHBhcmFtIHNjb3JlRGVmYXVsdHMgXHJcbiAgICogQHBhcmFtIG1lYXN1cmVEZWZhdWx0cyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0RGVmYXVsdFNjb3JlKHNjb3JlRGVmYXVsdHM6IFNtb1Njb3JlUGFyYW1zLCBtZWFzdXJlRGVmYXVsdHM6IFNtb01lYXN1cmVQYXJhbXMgfCBudWxsKSB7XHJcbiAgICBtZWFzdXJlRGVmYXVsdHMgPSBtZWFzdXJlRGVmYXVsdHMgIT09IG51bGwgPyBtZWFzdXJlRGVmYXVsdHMgOiBTbW9NZWFzdXJlLmRlZmF1bHRzO1xyXG4gICAgY29uc3Qgc2NvcmUgPSBuZXcgU21vU2NvcmUoc2NvcmVEZWZhdWx0cyk7XHJcbiAgICBzY29yZS5mb3JtYXR0aW5nTWFuYWdlciA9IG5ldyBTbW9Gb3JtYXR0aW5nTWFuYWdlcihTbW9Gb3JtYXR0aW5nTWFuYWdlci5kZWZhdWx0cyk7XHJcbiAgICBzY29yZS5hZGRTdGFmZihTbW9TeXN0ZW1TdGFmZi5kZWZhdWx0cyk7XHJcbiAgICBjb25zdCBtZWFzdXJlOiBTbW9NZWFzdXJlID0gU21vTWVhc3VyZS5nZXREZWZhdWx0TWVhc3VyZShtZWFzdXJlRGVmYXVsdHMgYXMgU21vTWVhc3VyZVBhcmFtcyk7XHJcbiAgICBzY29yZS5hZGRNZWFzdXJlKDApO1xyXG4gICAgbWVhc3VyZS52b2ljZXMucHVzaCh7XHJcbiAgICAgIG5vdGVzOiBTbW9NZWFzdXJlLmdldERlZmF1bHROb3RlcyhtZWFzdXJlRGVmYXVsdHMgYXMgU21vTWVhc3VyZVBhcmFtcylcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNjb3JlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuICdlbXB0eScgc2NvcmUsIHdpdGggb25lIG1lYXN1cmUgb2YgcmVzdHNcclxuICAgKiBAcGFyYW0gc2NvcmVEZWZhdWx0cyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0RW1wdHlTY29yZShzY29yZURlZmF1bHRzOiBTbW9TY29yZVBhcmFtcykge1xyXG4gICAgY29uc3Qgc2NvcmUgPSBuZXcgU21vU2NvcmUoc2NvcmVEZWZhdWx0cyk7XHJcbiAgICBzY29yZS5hZGRTdGFmZihTbW9TeXN0ZW1TdGFmZi5kZWZhdWx0cyk7XHJcbiAgICByZXR1cm4gc2NvcmU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFdlIGhhdmUgZGVsZXRlZCBhIG1lYXN1cmUsIHVwZGF0ZSB0aGUgcmVudW1iZXIgaW5kZXggdG9cclxuICAgKiBzaHVmZmxlIGJhY2suXHJcbiAgICogQHBhcmFtIGluZGV4VG9EZWxldGUgXHJcbiAgICovXHJcbiAgdXBkYXRlUmVudW1iZXJGb3JBZGREZWxldGUoaW5kZXhUb0RlbGV0ZTogbnVtYmVyLCB0b0FkZDogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0b0FkZCAmJiBpbmRleFRvRGVsZXRlID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IGluY3JlbWVudCA9IHRvQWRkID8gMSA6IC0xO1xyXG4gICAgZm9yICh2YXIgaSA9IGluZGV4VG9EZWxldGU7IGkgPCBtYXhJbmRleDsgKytpKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgKHRoaXMucmVudW1iZXJpbmdNYXBbaV0pID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHRoaXMucmVudW1iZXJpbmdNYXBbaV0gPSB0aGlzLnJlbnVtYmVyaW5nTWFwW2ldICsgaW5jcmVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mICh0aGlzLnJlbnVtYmVyaW5nTWFwW21heEluZGV4XSkgPT09ICdudW1iZXInICYmICF0b0FkZCkge1xyXG4gICAgICBkZWxldGUgdGhpcy5yZW51bWJlcmluZ01hcFttYXhJbmRleF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSZW51bWJlcmluZ01hcChtZWFzdXJlSW5kZXg6IG51bWJlciwgbG9jYWxJbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAobWVhc3VyZUluZGV4ID09PSAwKSB7XHJcbiAgICAgIHRoaXMucmVudW1iZXJpbmdNYXBbMF0gPSBsb2NhbEluZGV4O1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKHRoaXMucmVudW1iZXJpbmdNYXBbbWVhc3VyZUluZGV4XSkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGlmIChtZWFzdXJlSW5kZXggPT09IGxvY2FsSW5kZXgpIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5yZW51bWJlcmluZ01hcFttZWFzdXJlSW5kZXhdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVudW1iZXJpbmdNYXBbbWVhc3VyZUluZGV4XSA9IGxvY2FsSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVudW1iZXJpbmdNYXBbbWVhc3VyZUluZGV4XSA9IGxvY2FsSW5kZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi5yZW51bWJlcmluZ01hcCA9IHRoaXMucmVudW1iZXJpbmdNYXA7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEl0ZXJhdGl2ZWx5IG51bWJlciB0aGUgc3RhdmVzLCBsaWtlIHdoZW4gYWRkaW5nIGEgbWVhc3VyZVxyXG4gICAqL1xyXG4gIG51bWJlclN0YXZlcygpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzdGF2ZSA9IHRoaXMuc3RhdmVzW2ldO1xyXG4gICAgICBzdGF2ZS5zdGFmZklkID0gaTtcclxuICAgICAgc3RhdmUubnVtYmVyTWVhc3VyZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGRldGVybWluZSBpZiB0aGUgbWVhc3VyZSBhdCB0aGlzIGluZGV4IGNvdWxkIGJlIGEgbXVsdGktbWVhc3VyZSByZXN0XHJcbiAgICogQHBhcmFtIG1lYXN1cmVJbmRleCAtIHRoZSBtZWFzdXJlIGluZGV4IHdlIGFyZSBjb25zaWRlcmluZyB0byBhZGRcclxuICAgKiBAcGFyYW0gc3RhcnQgLSB0aGUgbWVhc3VyZSBpbmRleCB3b3VsZCBiZSB0aGUgc3RhcnQgb2YgdGhlIHJlc3QgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgaXNNdWx0aW1lYXN1cmVSZXN0KG1lYXN1cmVJbmRleDogbnVtYmVyLCBzdGFydDogYm9vbGVhbiwgZm9yY2VSZXN0OiBib29sZWFuKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYgKCFmb3JjZVJlc3QgJiYgIXRoaXMuc3RhdmVzW2ldLmlzUmVzdChtZWFzdXJlSW5kZXgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnN0YXZlc1tpXS5nZXRWb2x0YXNGb3JNZWFzdXJlKG1lYXN1cmVJbmRleCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zdGF2ZXNbaV0uaXNSZXBlYXRTeW1ib2wobWVhc3VyZUluZGV4KSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXN0YXJ0ICYmIG1lYXN1cmVJbmRleCA+IDAgJiYgdGhpcy5zdGF2ZXNbaV0uaXNSZXBlYXQobWVhc3VyZUluZGV4IC0gMSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc3RhdmVzW2ldLmlzUmVoZWFyc2FsKG1lYXN1cmVJbmRleCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gaW5zdHJ1bWVudCBjaGFuZ2Ugb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBtZWFzdXJlXHJcbiAgICAgIGlmICh0aGlzLnN0YXZlc1tpXS5tZWFzdXJlSW5zdHJ1bWVudE1hcFttZWFzdXJlSW5kZXhdICYmIGkgPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAobWVhc3VyZUluZGV4ID4gMCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXNbbWVhc3VyZUluZGV4XTtcclxuICAgICAgY29uc3QgcHJldiA9IHRoaXMuc3RhdmVzWzBdLm1lYXN1cmVzW21lYXN1cmVJbmRleCAtIDFdO1xyXG4gICAgICBpZiAoIXN0YXJ0ICYmICFUaW1lU2lnbmF0dXJlLmVxdWFsKG1lYXN1cmUudGltZVNpZ25hdHVyZSwgcHJldi50aW1lU2lnbmF0dXJlKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXN0YXJ0ICYmIG1lYXN1cmUua2V5U2lnbmF0dXJlICE9PSBwcmV2LmtleVNpZ25hdHVyZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXN0b3JlIG1lYXN1cmUgZm9ybWF0cyBzdG9yZWQgd2hlbiBhIHNjb3JlIGlzIHNlcmlhbGl6ZWRcclxuICAgKi9cclxuICB1cGRhdGVNZWFzdXJlRm9ybWF0cygpIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmUpID0+IHtcclxuICAgICAgICAodGhpcy5mb3JtYXR0aW5nTWFuYWdlciBhcyBTbW9Gb3JtYXR0aW5nTWFuYWdlcikudXBkYXRlRm9ybWF0KG1lYXN1cmUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgYSBtZWFzdXJlIHRvIHRoZSBzY29yZSB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzIGF0IHRoZSBzdXBwbGllZCBpbmRleC5cclxuICAgKiBUaGUgZGVmYXVsdHMgcGVyIHN0YWZmIG1heSBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBjbGVmLCBrZXkgb2YgdGhlIHN0YWZmLlxyXG4gICovXHJcbiAgYWRkRGVmYXVsdE1lYXN1cmVXaXRoTm90ZXMobWVhc3VyZUluZGV4OiBudW1iZXIsIHBhcmFtZXRlcnM6IFNtb01lYXN1cmVQYXJhbXMpIHtcclxuICAgIHRoaXMudXBkYXRlUmVudW1iZXJGb3JBZGREZWxldGUobWVhc3VyZUluZGV4LCB0cnVlKTtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZWFzdXJlID1cclxuICAgICAgICBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKHBhcmFtZXRlcnMpO1xyXG4gICAgICBzdGFmZi5hZGRNZWFzdXJlKG1lYXN1cmVJbmRleCwgZGVmYXVsdE1lYXN1cmUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldExvY2FsTWVhc3VyZUluZGV4KG1lYXN1cmVJbmRleDogbnVtYmVyKSB7XHJcbiAgICBsZXQgbWF4S2V5ID0gLTE7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy51cGRhdGVSZW51bWJlckZvckFkZERlbGV0ZSk7XHJcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBudW1LZXkgPSBwYXJzZUludChrZXksIDEwKTtcclxuICAgICAgaWYgKG51bUtleSA8PSBtZWFzdXJlSW5kZXggJiYgbnVtS2V5ID4gbWF4S2V5KSB7XHJcbiAgICAgICAgbWF4S2V5ID0gbnVtS2V5O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChtYXhLZXkgPCAwKSB7XHJcbiAgICAgIHJldHVybiBtZWFzdXJlSW5kZXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZW51bWJlcmluZ01hcFttYXhLZXldICsgKG1lYXN1cmVJbmRleCAtIG1heEtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBkZWxldGUgdGhlIG1lYXN1cmUgYXQgdGhlIHN1cHBsaWVkIGluZGV4IGluIGFsbCB0aGUgc3RhdmVzXHJcbiAgKi9cclxuICBkZWxldGVNZWFzdXJlKG1lYXN1cmVJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi5kZWxldGVNZWFzdXJlKG1lYXN1cmVJbmRleCk7XHJcbiAgICB9KTtcclxuICAgIC8vIGFkanVzdCBvZmZzZXQgaWYgdGV4dCB3YXMgYXR0YWNoZWQgdG8gYW55IG1pc3NpbmcgbWVhc3VyZXMgYWZ0ZXIgdGhlIGRlbGV0ZWQgb25lLlxyXG4gICAgdGhpcy50ZXh0R3JvdXBzLmZvckVhY2goKHRnOiBTbW9UZXh0R3JvdXApID0+IHtcclxuICAgICAgaWYgKHRnLmF0dGFjaFRvU2VsZWN0b3IgJiYgKHRnLnNlbGVjdG9yIGFzIFNtb1NlbGVjdG9yKS5tZWFzdXJlID49IG1lYXN1cmVJbmRleCAmJiAodGcuc2VsZWN0b3IgYXMgU21vU2VsZWN0b3IpLm1lYXN1cmUgPiAwKSB7XHJcbiAgICAgICAgKHRnLnNlbGVjdG9yIGFzIFNtb1NlbGVjdG9yKS5tZWFzdXJlIC09IDE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVSZW51bWJlckZvckFkZERlbGV0ZShtZWFzdXJlSW5kZXgsIGZhbHNlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogY29vcmRpbmF0ZSB0aGUgaWRzIG9mIHRoZSBkaXNwbGF5IHNjb3JlIHdpdGggdGhlIHN0b3JlZCBzY29yZVxyXG4gICAqIEBwYXJhbSBvdGhlciBcclxuICAgKi9cclxuICBzeW5jaHJvbml6ZVRleHRHcm91cHMob3RoZXI6IFNtb1RleHRHcm91cFtdKSB7XHJcbiAgICB0aGlzLnRleHRHcm91cHMgPSBbXTtcclxuICAgIG90aGVyLmZvckVhY2goKHRnKSA9PiB7XHJcbiAgICAgIGNvbnN0IG50ZyA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGcpO1xyXG4gICAgICB0aGlzLnRleHRHcm91cHMucHVzaChudGcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGdldCBhIG1lYXN1cmUgJ2NvbXBhdGlibGUnIHdpdGggdGhlIG1lYXN1cmUgYXQgdGhlIGdpdmVuIGluZGV4LCBpbiB0ZXJtc1xyXG4gICAqIG9mIGtleSwgdGltZSBzaWduYXR1cmUgZXRjLlxyXG4gICAqIEBwYXJhbSBtZWFzdXJlSW5kZXggXHJcbiAgICogQHBhcmFtIHN0YWZmSW5kZXggXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0UHJvdG90eXBlTWVhc3VyZShtZWFzdXJlSW5kZXg6IG51bWJlciwgc3RhZmZJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGFmZiA9IHRoaXMuc3RhdmVzW3N0YWZmSW5kZXhdO1xyXG4gICAgbGV0IHByb3RvbWVhc3VyZTogU21vTWVhc3VyZVBhcmFtcyA9IHt9IGFzIFNtb01lYXN1cmVQYXJhbXM7XHJcblxyXG4gICAgLy8gU2luY2UgdGhpcyBzdGFmZiBtYXkgYWxyZWFkeSBoYXZlIGluc3RydW1lbnQgc2V0dGluZ3MsIHVzZSB0aGVcclxuICAgIC8vIGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgb3IgcG9zdC1jZWRpbmcgbWVhc3VyZSBpZiBpdCBleGlzdHMuXHJcbiAgICBpZiAobWVhc3VyZUluZGV4IDwgc3RhZmYubWVhc3VyZXMubGVuZ3RoKSB7XHJcbiAgICAgIHByb3RvbWVhc3VyZSA9IHN0YWZmLm1lYXN1cmVzW21lYXN1cmVJbmRleF07XHJcbiAgICB9IGVsc2UgaWYgKHN0YWZmLm1lYXN1cmVzLmxlbmd0aCkge1xyXG4gICAgICBwcm90b21lYXN1cmUgPSBzdGFmZi5tZWFzdXJlc1tzdGFmZi5tZWFzdXJlcy5sZW5ndGggLSAxXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb3RvbWVhc3VyZSA9IFNtb01lYXN1cmUuZGVmYXVsdHM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21vTWVhc3VyZS5nZXREZWZhdWx0TWVhc3VyZVdpdGhOb3Rlcyhwcm90b21lYXN1cmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZSBhIG1lYXN1cmUgcHJvdG90eXBlLCBjcmVhdGUgYSBuZXcgbWVhc3VyZSBhbmQgYWRkIGl0IHRvIGVhY2ggc3RhZmYsIHdpdGggdGhlXHJcbiAgICogY29ycmVjdCBzZXR0aW5ncyBmb3IgY3VycmVudCB0aW1lIHNpZ25hdHVyZS9jbGVmLlxyXG4gICAqIEBwYXJhbSBtZWFzdXJlSW5kZXggXHJcbiAgICovXHJcbiAgYWRkTWVhc3VyZShtZWFzdXJlSW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHN0YWZmID0gdGhpcy5zdGF2ZXNbaV07XHJcbiAgICAgIGNvbnN0IG5tZWFzdXJlID0gdGhpcy5nZXRQcm90b3R5cGVNZWFzdXJlKG1lYXN1cmVJbmRleCwgaSk7XHJcbiAgICAgIGlmIChubWVhc3VyZS52b2ljZXMubGVuZ3RoIDw9IG5tZWFzdXJlLmdldEFjdGl2ZVZvaWNlKCkpIHtcclxuICAgICAgICBubWVhc3VyZS5zZXRBY3RpdmVWb2ljZSgwKTtcclxuICAgICAgfVxyXG4gICAgICBzdGFmZi5hZGRNZWFzdXJlKG1lYXN1cmVJbmRleCwgbm1lYXN1cmUpO1xyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIG9mZnNldHMgZm9yIHNjb3JlIG1vZGlmaWVycyB0aGF0IGhhdmUgYSBzZWxlY3RvclxyXG4gICAgdGhpcy50ZXh0R3JvdXBzLmZvckVhY2goKHRnOiBTbW9UZXh0R3JvdXApID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiAodGcuc2VsZWN0b3IpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGcuYXR0YWNoVG9TZWxlY3RvciAmJiB0Zy5zZWxlY3Rvci5tZWFzdXJlID49IG1lYXN1cmVJbmRleCAmJiB0Zy5zZWxlY3Rvci5tZWFzdXJlIDwgdGhpcy5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGcuc2VsZWN0b3IubWVhc3VyZSArPSAxO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUmVudW1iZXJGb3JBZGREZWxldGUobWVhc3VyZUluZGV4LCB0cnVlKTtcclxuICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBsYWNlIHRoZSBtZWFzdXJlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gIFByb2JhYmx5IGR1ZSB0byBhbiB1bmRvIG9wZXJhdGlvbiBvciBwYXN0ZS5cclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIG1lYXN1cmUgXHJcbiAgICovXHJcbiAgcmVwbGFjZU1lYXN1cmUoc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBtZWFzdXJlOiBTbW9NZWFzdXJlKSB7XHJcbiAgICB2YXIgc3RhZmYgPSB0aGlzLnN0YXZlc1tzZWxlY3Rvci5zdGFmZl07XHJcbiAgICBzdGFmZi5tZWFzdXJlc1tzZWxlY3Rvci5tZWFzdXJlXSA9IG1lYXN1cmU7XHJcbiAgfVxyXG5cclxuICBnZXRTeXN0ZW1Hcm91cEZvclN0YWZmKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBzdGFmZklkOiBudW1iZXIgPSBzZWxlY3Rpb24uc3RhZmYuc3RhZmZJZDtcclxuICAgIGNvbnN0IG1lYXN1cmVJbmRleDogbnVtYmVyID0gc2VsZWN0aW9uLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICBjb25zdCBleGlzdCA9IHRoaXMuc3lzdGVtR3JvdXBzLmZpbmQoKHNnOiBTbW9TeXN0ZW1Hcm91cCkgPT5cclxuICAgICAgc2cuc3RhcnRTZWxlY3Rvci5zdGFmZiA8PSBzdGFmZklkICYmXHJcbiAgICAgIHNnLmVuZFNlbGVjdG9yLnN0YWZmID49IHN0YWZmSWQgJiZcclxuICAgICAgKHNnLm1hcFR5cGUgPT09IFNtb1N5c3RlbUdyb3VwLm1hcFR5cGVzLmFsbE1lYXN1cmVzIHx8XHJcbiAgICAgICAgKHNnLnN0YXJ0U2VsZWN0b3IubWVhc3VyZSA8PSBtZWFzdXJlSW5kZXggJiZcclxuICAgICAgICAgIHNnLmVuZFNlbGVjdG9yLm1lYXN1cmUgPj0gbWVhc3VyZUluZGV4KSlcclxuICAgICk7XHJcbiAgICByZXR1cm4gZXhpc3Q7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF2ZXNGb3JHcm91cChncm91cDogU21vU3lzdGVtR3JvdXApIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXZlcy5maWx0ZXIoKHN0YWZmKSA9PiBzdGFmZi5zdGFmZklkID49IGdyb3VwLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgJiZcclxuICAgICAgc3RhZmYuc3RhZmZJZCA8PSBncm91cC5lbmRTZWxlY3Rvci5zdGFmZik7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXBcclxuICAvLyBBZGQgYSBuZXcgc3RhZmYgZ3JvdXBpbmcsIG9yIHJlcGxhY2UgaXQgaWYgaXQgb3ZlcmxhcHMgYW5kIGlzIGRpZmZlcmVudCwgb3JcclxuICAvLyByZW1vdmUgaXQgaWYgaXQgaXMgaWRlbnRpY2FsICh0b2dnbGUpXHJcbiAgYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAobmV3R3JvdXA6IFNtb1N5c3RlbUdyb3VwKSB7XHJcbiAgICAvLyBSZXBsYWNlIHRoaXMgZ3JvdXAgZm9yIGFueSBncm91cHMgdGhhdCBvdmVybGFwIGl0LlxyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMgPSB0aGlzLnN5c3RlbUdyb3Vwcy5maWx0ZXIoKHNnKSA9PiAhc2cub3ZlcmxhcHMobmV3R3JvdXApKTtcclxuICAgIHRoaXMuc3lzdGVtR3JvdXBzLnB1c2gobmV3R3JvdXApO1xyXG4gIH1cclxuXHJcbiAgaXNQYXJ0RXhwb3NlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0YWZmID0gdGhpcy5zdGF2ZXNbMF07XHJcbiAgICBjb25zdCBzdGF2ZUNvdW50ID0gc3RhZmYucGFydEluZm8uc3RhdmVzQWZ0ZXIgKyBzdGFmZi5wYXJ0SW5mby5zdGF2ZXNCZWZvcmUgKyAxO1xyXG4gICAgcmV0dXJuIHN0YXZlQ291bnQgPT09IHRoaXMuc3RhdmVzLmxlbmd0aFxyXG4gICAgICAmJiBzdGFmZi5wYXJ0SW5mby5zdGF2ZXNCZWZvcmUgPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9iYWJseSBkdWUgdG8gYW4gdW5kbyBvcGVyYXRpb24sIHJlcGxhY2UgdGhlIHN0YWZmIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICogQHBhcmFtIHN0YWZmIFxyXG4gICAqL1xyXG4gIHJlcGxhY2VTdGFmZihpbmRleDogbnVtYmVyLCBzdGFmZjogU21vU3lzdGVtU3RhZmYpIHtcclxuICAgIGNvbnN0IHN0YXZlcyA9IFtdO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGlmIChpICE9PSBpbmRleCkge1xyXG4gICAgICAgIHN0YXZlcy5wdXNoKHRoaXMuc3RhdmVzW2ldKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdGF2ZXMucHVzaChzdGFmZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RhdmVzID0gc3RhdmVzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gbWVhc3VyZUluZGV4IFxyXG4gICAqIEBwYXJhbSBrZXkgXHJcbiAgICovXHJcbiAgYWRkS2V5U2lnbmF0dXJlKG1lYXN1cmVJbmRleDogbnVtYmVyLCBrZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgLy8gQ29uc2lkZXIgdHJhbnNwb3NlIGZvciBrZXkgb2YgaW5zdHJ1bWVudFxyXG4gICAgICBjb25zdCBuZXRPZmZzZXQgPSBzdGFmZi5tZWFzdXJlc1ttZWFzdXJlSW5kZXhdLnRyYW5zcG9zZUluZGV4O1xyXG4gICAgICBjb25zdCBuZXdLZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KGtleSwgbmV0T2Zmc2V0KTtcclxuICAgICAgc3RhZmYuYWRkS2V5U2lnbmF0dXJlKG1lYXN1cmVJbmRleCwgbmV3S2V5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgdGhlIHBhcnQgaXMgYSB0cmFuc3Bvc2luZyBwYXJ0LCByZW1vdmUgdGhlIHRyYW5zcG9zaXRpb24gZnJvbSB0aGUgbm90ZXMvc3RhZmYuICBUaGlzIGxvZ2ljXHJcbiAgICogYXNzdW1lcyB0aGUgbWVhc3VyZXMgcHJldmlvdXNseSBoYWQgdHJhbnNwb3NlSW5kZXggc2V0IHVwIGJ5IHRoZSBpbnN0cnVtZW50IG1hcC5cclxuICAgKi9cclxuICBzZXRUcmFuc3Bvc2luZygpIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLm1lYXN1cmVzLmZvckVhY2goKG1tKSA9PiB7XHJcbiAgICAgICAgaWYgKG1tLnRyYW5zcG9zZUluZGV4ICE9PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjb25jZXJ0ID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChtbS5rZXlTaWduYXR1cmUsIC0xICogbW0udHJhbnNwb3NlSW5kZXgpO1xyXG4gICAgICAgICAgbW0udHJhbnNwb3NlVG9PZmZzZXQoMCwgY29uY2VydCk7XHJcbiAgICAgICAgICBtbS50cmFuc3Bvc2VJbmRleCA9IDA7XHJcbiAgICAgICAgICBtbS5rZXlTaWduYXR1cmUgPSBjb25jZXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSWYgdGhlIHNjb3JlIGlzIHN3aXRjaGluZyBmcm9tIHRyYW5zcG9zaW5nIHRvIG5vbi10cmFuc3Bvc2luZywgdXBkYXRlIHRoZSBpbmRleFxyXG4gICAqIGFuZCBwaXRjaGVzLiAgVGhpcyBsb2dpYyBhc3N1bWVzIHdlIGFyZSBjaGFuZ2luZyBmcm9tIHRyYW5zcG9zaW5nIHRvIG5vbi10cmFuc3Bvc2luZy5cclxuICAgKi9cclxuICBzZXROb25UcmFuc3Bvc2luZygpIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLm1lYXN1cmVzLmZvckVhY2goKG1tKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5zdCA9IHN0YWZmLmdldFN0YWZmSW5zdHJ1bWVudChtbS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgaWYgKGluc3Qua2V5T2Zmc2V0ICE9PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjb25jZXJ0ID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChtbS5rZXlTaWduYXR1cmUsIGluc3Qua2V5T2Zmc2V0KTtcclxuICAgICAgICAgIG1tLnRyYW5zcG9zZVRvT2Zmc2V0KGluc3Qua2V5T2Zmc2V0LCBjb25jZXJ0KTtcclxuICAgICAgICAgIG1tLnRyYW5zcG9zZUluZGV4ID0gaW5zdC5rZXlPZmZzZXQ7XHJcbiAgICAgICAgICBtbS5rZXlTaWduYXR1cmUgPSBjb25jZXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICMjIyBhZGRJbnN0cnVtZW50XHJcbiAgLy8gYWRkIGEgbmV3IHN0YWZmIChpbnN0cnVtZW50KSB0byB0aGUgc2NvcmVcclxuICBhZGRTdGFmZihwYXJhbWV0ZXJzOiBTbW9TeXN0ZW1TdGFmZlBhcmFtcyk6IFNtb1N5c3RlbVN0YWZmIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGlmICh0aGlzLnN0YXZlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgc3RhZmYgPSBuZXcgU21vU3lzdGVtU3RhZmYocGFyYW1ldGVycyk7XHJcbiAgICAgIHRoaXMuc3RhdmVzLnB1c2goc3RhZmYpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVN0YWZmID0gMDtcclxuICAgICAgLy8gRm9yIHBhcnQgdmlld3MsIHdlIHJlbnVtYmVyIHRoZSBzdGF2ZXMgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzdGFmZi5cclxuICAgICAgaWYgKHN0YWZmLm1lYXN1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0YWZmO1xyXG4gICAgfVxyXG4gICAgaWYgKCFwYXJhbWV0ZXJzKSB7XHJcbiAgICAgIHBhcmFtZXRlcnMgPSBTbW9TeXN0ZW1TdGFmZi5kZWZhdWx0cztcclxuICAgIH1cclxuICAgIGNvbnN0IHByb3RvID0gdGhpcy5zdGF2ZXNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlcyA9IFtdO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHByb3RvLm1lYXN1cmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1lYXN1cmU6IFNtb01lYXN1cmUgPSBwcm90by5tZWFzdXJlc1tpXTtcclxuICAgICAgY29uc3QganNvbk9iajogU21vTWVhc3VyZVBhcmFtc1NlciA9IG1lYXN1cmUuc2VyaWFsaXplKCk7XHJcbiAgICAgIC8vIE5lZWQgdG8gZG8gdGhpcyBzaW5jZSBzY29yZSBzZXJpYWxpemF0aW9uIGRvZXNuJ3QgaW5jbHVkZSBUUyBpbiBlYWNoIG1lYXN1cmVcclxuICAgICAganNvbk9iai50aW1lU2lnbmF0dXJlID0gbWVhc3VyZS50aW1lU2lnbmF0dXJlLnNlcmlhbGl6ZSgpO1xyXG4gICAgICBqc29uT2JqLnRlbXBvID0gbWVhc3VyZS50ZW1wby5zZXJpYWxpemUoKTtcclxuICAgICAganNvbk9iai50dXBsZXRUcmVlcyA9IFtdOyAvLyBhc3N1bWUgbm8gdHVwbGV0cyBpbiBhIHByb3RvdHlwZSBtZWFzdXJlXHJcbiAgICAgIGxldCBuZXdNZWFzdXJlID0gU21vTWVhc3VyZS5kZXNlcmlhbGl6ZShqc29uT2JqKTtcclxuICAgICAgbmV3TWVhc3VyZS5tZWFzdXJlTnVtYmVyID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyO1xyXG4gICAgICBuZXdNZWFzdXJlLmNsZWYgPSBwYXJhbWV0ZXJzLm1lYXN1cmVJbnN0cnVtZW50TWFwWzBdLmNsZWYgYXMgQ2xlZjtcclxuICAgICAgbmV3TWVhc3VyZS5tb2RpZmllcnMgPSBbXTtcclxuICAgICAgbmV3TWVhc3VyZS50cmFuc3Bvc2VJbmRleCA9IDA7XHJcbiAgICAgIC8vIENvbnNpZGVyIGtleSBjaGFuZ2UgaWYgdGhlIHByb3RvIG1lYXN1cmUgaXMgbm9uLWNvbmNlcnQgcGl0Y2hcclxuICAgICAgbmV3TWVhc3VyZS5rZXlTaWduYXR1cmUgPVxyXG4gICAgICAgIFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQobmV3TWVhc3VyZS5rZXlTaWduYXR1cmUsXHJcbiAgICAgICAgICBuZXdNZWFzdXJlLnRyYW5zcG9zZUluZGV4IC0gbWVhc3VyZS50cmFuc3Bvc2VJbmRleCk7XHJcbiAgICAgIG5ld01lYXN1cmUudm9pY2VzID0gW3sgbm90ZXM6IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE5vdGVzKG5ld01lYXN1cmUpIH1dO1xyXG4gICAgICBtZWFzdXJlLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5tb2Q6IFNtb01lYXN1cmVNb2RpZmllckJhc2UgPSBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKG1vZGlmaWVyKTtcclxuICAgICAgICBuZXdNZWFzdXJlLm1vZGlmaWVycy5wdXNoKG5tb2QpO1xyXG4gICAgICB9KTtcclxuICAgICAgbWVhc3VyZXMucHVzaChuZXdNZWFzdXJlKTtcclxuICAgIH1cclxuICAgIHBhcmFtZXRlcnMubWVhc3VyZXMgPSBtZWFzdXJlcztcclxuICAgIGNvbnN0IHN0YWZmID0gbmV3IFNtb1N5c3RlbVN0YWZmKHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5zdGF2ZXMucHVzaChzdGFmZik7XHJcbiAgICB0aGlzLmFjdGl2ZVN0YWZmID0gdGhpcy5zdGF2ZXMubGVuZ3RoIC0gMTtcclxuICAgIHRoaXMubnVtYmVyU3RhdmVzKCk7XHJcbiAgICByZXR1cm4gc3RhZmY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGRlbGV0ZSBhbnkgc3lzdGVtIGdyb3VwcyB0aGF0IGFwcGx5IHRvIGRlbGV0ZWQgc3RhdmVzXHJcbiAgICovXHJcbiAgdXBkYXRlU3lzdGVtR3JvdXBzKCkge1xyXG4gICAgY29uc3QgZ3JwVG9LZWVwOiBTbW9TeXN0ZW1Hcm91cFtdID0gW107XHJcbiAgICB0aGlzLnN5c3RlbUdyb3Vwcy5mb3JFYWNoKChncnApID0+IHtcclxuICAgICAgaWYgKGdycC5zdGFydFNlbGVjdG9yLnN0YWZmIDwgdGhpcy5zdGF2ZXMubGVuZ3RoICYmXHJcbiAgICAgICAgZ3JwLmVuZFNlbGVjdG9yLnN0YWZmIDwgdGhpcy5zdGF2ZXMubGVuZ3RoXHJcbiAgICAgICkge1xyXG4gICAgICAgIGdycFRvS2VlcC5wdXNoKGdycCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zeXN0ZW1Hcm91cHMgPSBncnBUb0tlZXA7XHJcbiAgfVxyXG4gIC8vICMjIyByZW1vdmVTdGFmZlxyXG4gIC8vIFJlbW92ZSBzdGF2ZSBhdCB0aGUgZ2l2ZW4gaW5kZXhcclxuICByZW1vdmVTdGFmZihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzdGF2ZXM6IFNtb1N5c3RlbVN0YWZmW10gPSBbXTtcclxuICAgIGxldCBpeCA9IDA7XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBpZiAoaXggIT09IGluZGV4KSB7XHJcbiAgICAgICAgc3RhdmVzLnB1c2goc3RhZmYpO1xyXG4gICAgICB9XHJcbiAgICAgIGl4ICs9IDE7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RhdmVzID0gc3RhdmVzO1xyXG4gICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICAgIHRoaXMudXBkYXRlU3lzdGVtR3JvdXBzKCk7XHJcbiAgfVxyXG4gIGdldFN0YWZmSW5zdHJ1bWVudChzZWxlY3RvcjogU21vU2VsZWN0b3IpOiBTbW9JbnN0cnVtZW50IHtcclxuICAgIGNvbnN0IHN0YWZmOiBTbW9TeXN0ZW1TdGFmZiA9IHRoaXMuc3RhdmVzW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIHJldHVybiBzdGFmZi5nZXRTdGFmZkluc3RydW1lbnQoc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgfVxyXG5cclxuICBzd2FwU3RhdmVzKGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdmVzLmxlbmd0aCA8IGluZGV4MSB8fCB0aGlzLnN0YXZlcy5sZW5ndGggPCBpbmRleDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG1wU3RhZmYgPSB0aGlzLnN0YXZlc1tpbmRleDFdO1xyXG4gICAgdGhpcy5zdGF2ZXNbaW5kZXgxXSA9IHRoaXMuc3RhdmVzW2luZGV4Ml07XHJcbiAgICB0aGlzLnN0YXZlc1tpbmRleDJdID0gdG1wU3RhZmY7XHJcbiAgICB0aGlzLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi5tYXBTdGFmZkZyb21UbyhpbmRleDEsIGluZGV4Mik7XHJcbiAgICAgIHN0YWZmLm1hcFN0YWZmRnJvbVRvKGluZGV4MiwgaW5kZXgxKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5udW1iZXJTdGF2ZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCwgdG9BZGQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHRnaWQgPSB0eXBlb2YgKHRleHRHcm91cCkgPT09ICdzdHJpbmcnID8gdGV4dEdyb3VwIDpcclxuICAgICAgdGV4dEdyb3VwLmF0dHJzLmlkO1xyXG4gICAgY29uc3QgYXIgPSB0aGlzLnRleHRHcm91cHMuZmlsdGVyKCh0ZykgPT4gdGcuYXR0cnMuaWQgIT09IHRnaWQpO1xyXG4gICAgdGhpcy50ZXh0R3JvdXBzID0gYXI7XHJcbiAgICBpZiAodG9BZGQpIHtcclxuICAgICAgdGhpcy50ZXh0R3JvdXBzLnB1c2godGV4dEdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbiAgYWRkVGV4dEdyb3VwKHRleHRHcm91cDogU21vVGV4dEdyb3VwKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIHRydWUpO1xyXG4gIH1cclxuICBnZXRUZXh0R3JvdXBzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGV4dEdyb3VwcztcclxuICB9XHJcbiAgc2NhbGVUZXh0R3JvdXBzKHNjYWxlOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZzogU21vVGV4dEdyb3VwKSA9PiB7XHJcbiAgICAgIHRnLnNjYWxlVGV4dChzY2FsZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBzZXRMeXJpY0FkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYuc2V0THlyaWNBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDaG9yZEFkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYuc2V0Q2hvcmRBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vICMjIyBzZXRMeXJpY0ZvbnRcclxuICAvLyBzZXQgdGhlIGZvbnQgZm9yIGx5cmljcywgd2hpY2ggYXJlIHRoZSBzYW1lIGZvciBhbGwgbHlyaWNzIGluIHRoZSBzY29yZVxyXG4gIHNldEx5cmljRm9udChmb250SW5mbzogRm9udEluZm8pIHtcclxuICAgIHRoaXMuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIHN0YWZmLnNldEx5cmljRm9udChmb250SW5mbyk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvbnRJbnN0OiBGb250UHVycG9zZSB8IHVuZGVmaW5lZCA9IHRoaXMuZm9udHMuZmluZCgoZm4pID0+IGZuLnB1cnBvc2UgPT09IFNtb1Njb3JlLmZvbnRQdXJwb3Nlcy5MWVJJQ1MpO1xyXG4gICAgaWYgKHR5cGVvZiAoZm9udEluc3QpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb250SW5zdC5mYW1pbHkgPSBmb250SW5mby5mYW1pbHkgPz8gJyc7XHJcbiAgICBmb250SW5zdC5zaXplID0gcGFyc2VJbnQoU21vU2NvcmVUZXh0LmZvbnRQb2ludFNpemUoZm9udEluZm8uc2l6ZSkudG9TdHJpbmcoKSk7XHJcbiAgICBmb250SW5zdC5jdXN0b20gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hvcmRGb250KGZvbnRJbmZvOiBGb250SW5mbykge1xyXG4gICAgdGhpcy5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgc3RhZmYuc2V0Q2hvcmRGb250KGZvbnRJbmZvKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1lYXN1cmVzKCkge1xyXG4gICAgaWYgKHRoaXMuc3RhdmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF2ZXNbdGhpcy5hY3RpdmVTdGFmZl0ubWVhc3VyZXM7XHJcbiAgfVxyXG4gIGluY3JlbWVudEFjdGl2ZVN0YWZmKG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICBpZiAob2Zmc2V0IDwgMCkge1xyXG4gICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0aGlzLnN0YXZlcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXh0U3RhZmYgPSAodGhpcy5hY3RpdmVTdGFmZiArIG9mZnNldCkgJSB0aGlzLnN0YXZlcy5sZW5ndGg7XHJcbiAgICBpZiAobmV4dFN0YWZmID49IDAgJiYgbmV4dFN0YWZmIDwgdGhpcy5zdGF2ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3RhZmYgPSBuZXh0U3RhZmY7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVTdGFmZjtcclxuICB9XHJcblxyXG4gIHNldEFjdGl2ZVN0YWZmKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWN0aXZlU3RhZmYgPSBpbmRleCA8PSB0aGlzLnN0YXZlcy5sZW5ndGggPyBpbmRleCA6IHRoaXMuYWN0aXZlU3RhZmY7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/smo/data/score.ts\n");
560
560
 
561
561
  /***/ }),
562
562
 
@@ -1108,7 +1108,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1108
1108
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1109
1109
 
1110
1110
  "use strict";
1111
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiRockerComponent: () => (/* binding */ SuiRockerComponent),\n/* harmony export */ SuiRockerComposite: () => (/* binding */ SuiRockerComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * @module /ui/dialog/components/rocker\n * **/\n\n\n/**\n * A numeric input box with +- buttons. Adjustable type and scale\n * @category SuiDialog\n * */\nclass SuiRockerComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n static get dataTypes() {\n return ['int', 'float', 'percent'];\n }\n static get increments() {\n return { 'int': 1, 'float': 0.1, 'percent': 10 };\n }\n static get parsers() {\n return { 'int': '_getIntValue', 'float': '_getFloatValue', 'percent': '_getPercentValue' };\n }\n constructor(dialog, params) {\n var _a, _b;\n super(dialog, params);\n this.initialValue = 0;\n this.increment = 1;\n this.dataType = (_a = params.dataType) !== null && _a !== void 0 ? _a : 'int';\n this.increment = (_b = params.increment) !== null && _b !== void 0 ? _b : SuiRockerComponent.increments[this.dataType];\n if (SuiRockerComponent.dataTypes.indexOf(this.dataType) < 0) {\n throw new Error('dialog element invalid type ' + this.dataType);\n }\n if (this.dataType === 'int' && this.increment < 1) {\n throw new Error('int component with decimal increment');\n }\n this.parser = SuiRockerComponent.parsers[this.dataType];\n this.min = params.min;\n this.max = params.max;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('rockerControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('increment').append(b('span').classes('icon icon-circle-up'))).append(b('button').classes('decrement').append(b('span').classes('icon icon-circle-down'))).append(b('input').attr('type', 'text').classes('rockerInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n get parameterId() {\n return this.id;\n }\n handleChange() {\n this.changeFlag = true;\n this.dialog.changed();\n this.changeFlag = false;\n }\n bind() {\n const pid = this.parameterId;\n const input = this._getInputElement();\n let val = 0;\n $('#' + pid).find('button.increment').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val += this.increment;\n if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $('#' + pid).find('button.decrement').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val -= this.increment;\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $(input).off('blur').on('blur', () => {\n val = this[this.parser]();\n if (val !== this.initialValue) {\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n else if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n this.initialValue = val;\n $(input).val(val);\n this.handleChanged();\n }\n });\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n _getIntValue() {\n let val = parseInt(this._getInputElement().val(), 10);\n val = isNaN(val) ? 0 : val;\n return val;\n }\n _getFloatValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1.0 : val;\n return val;\n }\n _getPercentValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1 : val;\n return val / 100;\n }\n _setIntValue(val) {\n this._getInputElement().val(val);\n }\n setValue(value) {\n if (this.dataType === 'percent') {\n value = value * 100;\n }\n this._setIntValue(value);\n this.initialValue = value;\n }\n getValue() {\n return this[this.parser]();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiRockerComposite extends SuiRockerComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsYUFBYSxDQUFDO0lBQ2hELENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3JvY2tlci50cz9jMGZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQG1vZHVsZSAvdWkvZGlhbG9nL2NvbXBvbmVudHMvcm9ja2VyXHJcbiAqICoqL1xyXG4gaW1wb3J0IHsgYnVpbGREb20gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTdWlDb21wb25lbnRCYXNlLCBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50UGFyZW50IH0gZnJvbSAnLi9iYXNlQ29tcG9uZW50JztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBCYXNpYyBkaWFsb2cgY29tcG9uZW50IGluZm8uXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpUm9ja2VyQ29tcG9uZW50UGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBkYXRhVHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIG1pbj86IG51bWJlcixcclxuICBtYXg/OiBudW1iZXIsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIG51bWVyaWMgaW5wdXQgYm94IHdpdGggKy0gYnV0dG9ucy4gICBBZGp1c3RhYmxlIHR5cGUgYW5kIHNjYWxlXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogKi9cclxuZXhwb3J0IGNsYXNzIFN1aVJvY2tlckNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIHN0YXRpYyBnZXQgZGF0YVR5cGVzKCkge1xyXG4gICAgcmV0dXJuIFsnaW50JywgJ2Zsb2F0JywgJ3BlcmNlbnQnXTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBpbmNyZW1lbnRzKCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHsgJ2ludCc6IDEsICdmbG9hdCc6IDAuMSwgJ3BlcmNlbnQnOiAxMCB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBhcnNlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geyAnaW50JzogJ19nZXRJbnRWYWx1ZScsICdmbG9hdCc6ICdfZ2V0RmxvYXRWYWx1ZScsICdwZXJjZW50JzogJ19nZXRQZXJjZW50VmFsdWUnIH07XHJcbiAgfVxyXG4gIGluaXRpYWxWYWx1ZTogbnVtYmVyID0gMDtcclxuICBkYXRhVHlwZTogc3RyaW5nO1xyXG4gIGluY3JlbWVudDogbnVtYmVyID0gMTtcclxuICBwYXJzZXI6IHN0cmluZztcclxuICBtaW46IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbXM6IFN1aVJvY2tlckNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbXMpO1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHBhcmFtcy5kYXRhVHlwZSA/PyAnaW50JztcclxuICAgIHRoaXMuaW5jcmVtZW50ID0gcGFyYW1zLmluY3JlbWVudCA/PyBTdWlSb2NrZXJDb21wb25lbnQuaW5jcmVtZW50c1t0aGlzLmRhdGFUeXBlXTtcclxuICAgIGlmIChTdWlSb2NrZXJDb21wb25lbnQuZGF0YVR5cGVzLmluZGV4T2YodGhpcy5kYXRhVHlwZSkgPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGlhbG9nIGVsZW1lbnQgaW52YWxpZCB0eXBlICcgKyB0aGlzLmRhdGFUeXBlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnaW50JyAmJiB0aGlzLmluY3JlbWVudCA8IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnQgY29tcG9uZW50IHdpdGggZGVjaW1hbCBpbmNyZW1lbnQnKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyc2VyID0gU3VpUm9ja2VyQ29tcG9uZW50LnBhcnNlcnNbdGhpcy5kYXRhVHlwZV07XHJcbiAgICB0aGlzLm1pbiA9IHBhcmFtcy5taW47XHJcbiAgICB0aGlzLm1heCA9IHBhcmFtcy5tYXg7XHJcbiAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcclxuICB9XHJcblxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3Nlcygncm9ja2VyQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgaWQpLmF0dHIoJ2RhdGEtcGFyYW0nLCB0aGlzLnNtb05hbWUpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgYignYnV0dG9uJykuY2xhc3NlcygnaW5jcmVtZW50JykuYXBwZW5kKFxyXG4gICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2ljb24gaWNvbi1jaXJjbGUtdXAnKSkpLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdkZWNyZW1lbnQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLWNpcmNsZS1kb3duJykpKS5hcHBlbmQoXHJcbiAgICAgICAgYignaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3RleHQnKS5jbGFzc2VzKCdyb2NrZXJJbnB1dCcpXHJcbiAgICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2xhYmVsJykuYXR0cignZm9yJywgaWQgKyAnLWlucHV0JykudGV4dCh0aGlzLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIGdldCBwYXJhbWV0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmlkO1xyXG4gIH1cclxuICBoYW5kbGVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5kaWFsb2cuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgY29uc3QgcGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICBsZXQgdmFsID0gMDtcclxuICAgICQoJyMnICsgcGlkKS5maW5kKCdidXR0b24uaW5jcmVtZW50Jykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB2YWwgPSAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAncGVyY2VudCcpIHtcclxuICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsICs9IHRoaXMuaW5jcmVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLm1heCAhPSB1bmRlZmluZWQgJiYgdmFsID4gdGhpcy5tYXgpIHtcclxuICAgICAgICAgIHZhbCA9IHRoaXMubWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKGlucHV0KS52YWwodmFsKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgICQoJyMnICsgcGlkKS5maW5kKCdidXR0b24uZGVjcmVtZW50Jykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB2YWwgPSAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAncGVyY2VudCcpIHtcclxuICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsIC09IHRoaXMuaW5jcmVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgIHZhbCA9IHRoaXMubWluO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKGlucHV0KS52YWwodmFsKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgICQoaW5wdXQpLm9mZignYmx1cicpLm9uKCdibHVyJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5pbml0aWFsVmFsdWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICB2YWwgPSB0aGlzLm1heDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgJChpbnB1dCkudmFsKHZhbCk7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBfZ2V0SW5wdXRFbGVtZW50KCkge1xyXG4gICAgY29uc3QgcGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIHJldHVybiAkKHRoaXMuZGlhbG9nLmRnRG9tLmVsZW1lbnQpLmZpbmQoJyMnICsgcGlkKS5maW5kKCdpbnB1dCcpO1xyXG4gIH1cclxuICBfZ2V0SW50VmFsdWUoKSB7XHJcbiAgICBsZXQgdmFsOm51bWJlciA9IHBhcnNlSW50KHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCgpLCAxMCk7XHJcbiAgICB2YWwgPSBpc05hTih2YWwpID8gMCA6IHZhbDtcclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG4gIF9nZXRGbG9hdFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkudmFsKCkpO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDEuMCA6IHZhbDtcclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG4gIF9nZXRQZXJjZW50VmFsdWUoKSB7XHJcbiAgICBsZXQgdmFsID0gcGFyc2VGbG9hdCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKS52YWwoKSk7XHJcbiAgICB2YWwgPSBpc05hTih2YWwpID8gMSA6IHZhbDtcclxuICAgIHJldHVybiB2YWwgLyAxMDA7XHJcbiAgfVxyXG4gIF9zZXRJbnRWYWx1ZSh2YWw6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkudmFsKHZhbCk7XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAncGVyY2VudCcpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwMDtcclxuICAgIH1cclxuICAgIHRoaXMuX3NldEludFZhbHVlKHZhbHVlKTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldFZhbHVlKCkge1xyXG4gICAgcmV0dXJuICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGUgcm9ja2VyIGNvbXBvc2l0ZVxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVJvY2tlckNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgZGF0YVR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGRlZmF1bHRWYWx1ZTogbnVtYmVyLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZyxcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnRcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVJvY2tlckNvbXBvc2l0ZSBleHRlbmRzIFN1aVJvY2tlckNvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aVJvY2tlckNvbXBvc2l0ZVBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbCA9IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNoYW5nZWQoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sLmNoYW5nZWQoKTtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/rocker.ts\n");
1111
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiRockerComponent: () => (/* binding */ SuiRockerComponent),\n/* harmony export */ SuiRockerComposite: () => (/* binding */ SuiRockerComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * @module /ui/dialog/components/rocker\n * **/\n\n\n/**\n * A numeric input box with +- buttons. Adjustable type and scale\n * @category SuiDialog\n * */\nclass SuiRockerComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n static get dataTypes() {\n return ['int', 'float', 'percent'];\n }\n static get increments() {\n return { 'int': 1, 'float': 0.1, 'percent': 10 };\n }\n static get parsers() {\n return { 'int': '_getIntValue', 'float': '_getFloatValue', 'percent': '_getPercentValue' };\n }\n constructor(dialog, params) {\n var _a, _b;\n super(dialog, params);\n this.initialValue = 0;\n this.increment = 1;\n this.dataType = (_a = params.dataType) !== null && _a !== void 0 ? _a : 'int';\n this.increment = (_b = params.increment) !== null && _b !== void 0 ? _b : SuiRockerComponent.increments[this.dataType];\n if (SuiRockerComponent.dataTypes.indexOf(this.dataType) < 0) {\n throw new Error('dialog element invalid type ' + this.dataType);\n }\n if (this.dataType === 'int' && this.increment < 1) {\n throw new Error('int component with decimal increment');\n }\n this.parser = SuiRockerComponent.parsers[this.dataType];\n this.min = params.min;\n this.max = params.max;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('rockerControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('increment').append(b('span').classes('icon icon-circle-up'))).append(b('button').classes('decrement').append(b('span').classes('icon icon-circle-down'))).append(b('input').attr('type', 'text').classes('rockerInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n get parameterId() {\n return this.id;\n }\n handleChange() {\n this.changeFlag = true;\n this.dialog.changed();\n this.changeFlag = false;\n }\n bind() {\n const pid = this.parameterId;\n const input = this._getInputElement();\n let val = 0;\n $('#' + pid).find('button.increment').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val += this.increment;\n if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $('#' + pid).find('button.decrement').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val -= this.increment;\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $(input).off('blur').on('blur', () => {\n val = this[this.parser]();\n if (val !== this.initialValue) {\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n else if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n this.initialValue = val;\n this.handleChanged();\n }\n });\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n _getIntValue() {\n let val = parseInt(this._getInputElement().val(), 10);\n val = isNaN(val) ? 0 : val;\n return val;\n }\n _getFloatValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1.0 : val;\n return val;\n }\n _getPercentValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1 : val;\n return val / 100;\n }\n _setIntValue(val) {\n this._getInputElement().val(val);\n }\n setValue(value) {\n if (this.dataType === 'percent') {\n value = value * 100;\n }\n this._setIntValue(value);\n this.initialValue = value;\n }\n getValue() {\n return this[this.parser]();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiRockerComposite extends SuiRockerComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3JvY2tlci50cz9jMGZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQG1vZHVsZSAvdWkvZGlhbG9nL2NvbXBvbmVudHMvcm9ja2VyXHJcbiAqICoqL1xyXG4gaW1wb3J0IHsgYnVpbGREb20gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTdWlDb21wb25lbnRCYXNlLCBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50UGFyZW50IH0gZnJvbSAnLi9iYXNlQ29tcG9uZW50JztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBCYXNpYyBkaWFsb2cgY29tcG9uZW50IGluZm8uXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpUm9ja2VyQ29tcG9uZW50UGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBkYXRhVHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIG1pbj86IG51bWJlcixcclxuICBtYXg/OiBudW1iZXIsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIG51bWVyaWMgaW5wdXQgYm94IHdpdGggKy0gYnV0dG9ucy4gICBBZGp1c3RhYmxlIHR5cGUgYW5kIHNjYWxlXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogKi9cclxuZXhwb3J0IGNsYXNzIFN1aVJvY2tlckNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIHN0YXRpYyBnZXQgZGF0YVR5cGVzKCkge1xyXG4gICAgcmV0dXJuIFsnaW50JywgJ2Zsb2F0JywgJ3BlcmNlbnQnXTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBpbmNyZW1lbnRzKCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHsgJ2ludCc6IDEsICdmbG9hdCc6IDAuMSwgJ3BlcmNlbnQnOiAxMCB9O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHBhcnNlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geyAnaW50JzogJ19nZXRJbnRWYWx1ZScsICdmbG9hdCc6ICdfZ2V0RmxvYXRWYWx1ZScsICdwZXJjZW50JzogJ19nZXRQZXJjZW50VmFsdWUnIH07XHJcbiAgfVxyXG4gIGluaXRpYWxWYWx1ZTogbnVtYmVyID0gMDtcclxuICBkYXRhVHlwZTogc3RyaW5nO1xyXG4gIGluY3JlbWVudDogbnVtYmVyID0gMTtcclxuICBwYXJzZXI6IHN0cmluZztcclxuICBtaW46IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbXM6IFN1aVJvY2tlckNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbXMpO1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHBhcmFtcy5kYXRhVHlwZSA/PyAnaW50JztcclxuICAgIHRoaXMuaW5jcmVtZW50ID0gcGFyYW1zLmluY3JlbWVudCA/PyBTdWlSb2NrZXJDb21wb25lbnQuaW5jcmVtZW50c1t0aGlzLmRhdGFUeXBlXTtcclxuICAgIGlmIChTdWlSb2NrZXJDb21wb25lbnQuZGF0YVR5cGVzLmluZGV4T2YodGhpcy5kYXRhVHlwZSkgPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGlhbG9nIGVsZW1lbnQgaW52YWxpZCB0eXBlICcgKyB0aGlzLmRhdGFUeXBlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnaW50JyAmJiB0aGlzLmluY3JlbWVudCA8IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnQgY29tcG9uZW50IHdpdGggZGVjaW1hbCBpbmNyZW1lbnQnKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyc2VyID0gU3VpUm9ja2VyQ29tcG9uZW50LnBhcnNlcnNbdGhpcy5kYXRhVHlwZV07XHJcbiAgICB0aGlzLm1pbiA9IHBhcmFtcy5taW47XHJcbiAgICB0aGlzLm1heCA9IHBhcmFtcy5tYXg7XHJcbiAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcclxuICB9XHJcblxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3Nlcygncm9ja2VyQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgaWQpLmF0dHIoJ2RhdGEtcGFyYW0nLCB0aGlzLnNtb05hbWUpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgYignYnV0dG9uJykuY2xhc3NlcygnaW5jcmVtZW50JykuYXBwZW5kKFxyXG4gICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2ljb24gaWNvbi1jaXJjbGUtdXAnKSkpLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdkZWNyZW1lbnQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLWNpcmNsZS1kb3duJykpKS5hcHBlbmQoXHJcbiAgICAgICAgYignaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3RleHQnKS5jbGFzc2VzKCdyb2NrZXJJbnB1dCcpXHJcbiAgICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2xhYmVsJykuYXR0cignZm9yJywgaWQgKyAnLWlucHV0JykudGV4dCh0aGlzLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIGdldCBwYXJhbWV0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmlkO1xyXG4gIH1cclxuICBoYW5kbGVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5kaWFsb2cuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgY29uc3QgcGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICBsZXQgdmFsID0gMDtcclxuICAgICQoJyMnICsgcGlkKS5maW5kKCdidXR0b24uaW5jcmVtZW50Jykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB2YWwgPSAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAncGVyY2VudCcpIHtcclxuICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsICs9IHRoaXMuaW5jcmVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLm1heCAhPSB1bmRlZmluZWQgJiYgdmFsID4gdGhpcy5tYXgpIHtcclxuICAgICAgICAgIHZhbCA9IHRoaXMubWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKGlucHV0KS52YWwodmFsKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgICQoJyMnICsgcGlkKS5maW5kKCdidXR0b24uZGVjcmVtZW50Jykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB2YWwgPSAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAncGVyY2VudCcpIHtcclxuICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsIC09IHRoaXMuaW5jcmVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgIHZhbCA9IHRoaXMubWluO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKGlucHV0KS52YWwodmFsKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgICQoaW5wdXQpLm9mZignYmx1cicpLm9uKCdibHVyJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5pbml0aWFsVmFsdWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICB2YWwgPSB0aGlzLm1heDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIGNvbnN0IHBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICByZXR1cm4gJCh0aGlzLmRpYWxvZy5kZ0RvbS5lbGVtZW50KS5maW5kKCcjJyArIHBpZCkuZmluZCgnaW5wdXQnKTtcclxuICB9XHJcbiAgX2dldEludFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbDpudW1iZXIgPSBwYXJzZUludCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKS52YWwoKSwgMTApO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0RmxvYXRWYWx1ZSgpIHtcclxuICAgIGxldCB2YWwgPSBwYXJzZUZsb2F0KHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCgpKTtcclxuICAgIHZhbCA9IGlzTmFOKHZhbCkgPyAxLjAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0UGVyY2VudFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkudmFsKCkpO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDEgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsIC8gMTAwO1xyXG4gIH1cclxuICBfc2V0SW50VmFsdWUodmFsOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCh2YWwpO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxMDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zZXRJbnRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQ3JlYXRlIHJvY2tlciBjb21wb3NpdGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBkZWZhdWx0VmFsdWU6IG51bWJlcixcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlSb2NrZXJDb21wb3NpdGUgZXh0ZW5kcyBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXJzOiBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/rocker.ts\n");
1112
1112
 
1113
1113
  /***/ }),
1114
1114
 
@@ -1460,7 +1460,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1460
1460
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1461
1461
 
1462
1462
  "use strict";
1463
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScorePreferencesAdapter: () => (/* binding */ SuiScorePreferencesAdapter),\n/* harmony export */ SuiScorePreferencesDialog: () => (/* binding */ SuiScorePreferencesDialog)\n/* harmony export */ });\n/* harmony import */ var _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adapter */ \"./src/ui/dialogs/adapter.ts\");\n/* harmony import */ var _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../common/promiseHelpers */ \"./src/common/promiseHelpers.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\nconst deepCopy = (x) => JSON.parse(JSON.stringify(x));\n/**\n * @category SuiDialog\n */\nclass SuiScorePreferencesAdapter extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiComponentAdapter {\n constructor(view) {\n super(view);\n this.preferences = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoScorePreferences(view.score.preferences);\n this.backup = JSON.parse(JSON.stringify(this.preferences));\n }\n get autoAdvance() {\n return this.preferences.autoAdvance;\n }\n set autoAdvance(value) {\n this.preferences.autoAdvance = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get autoPlay() {\n return this.preferences.autoPlay;\n }\n set autoPlay(value) {\n this.preferences.autoPlay = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get showPiano() {\n return this.preferences.showPiano;\n }\n set showPiano(value) {\n this.preferences.showPiano = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get hideEmptyLines() {\n return this.preferences.hideEmptyLines;\n }\n set hideEmptyLines(value) {\n this.preferences.hideEmptyLines = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get defaultDupleDuration() {\n return this.preferences.defaultDupleDuration;\n }\n set defaultDupleDuration(value) {\n this.preferences.defaultDupleDuration = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get defaultTripleDuration() {\n return this.preferences.defaultTripleDuration;\n }\n set defaultTripleDuration(value) {\n this.preferences.defaultTripleDuration = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get transposingScore() {\n return this.preferences.transposingScore;\n }\n set transposingScore(value) {\n this.preferences.transposingScore = value;\n this.view.updateScorePreferences(this.preferences);\n }\n cancel() {\n return __awaiter(this, void 0, void 0, function* () {\n const p1 = JSON.stringify(this.preferences);\n const p2 = JSON.stringify(this.backup);\n if (p1 !== p2) {\n yield this.view.updateScorePreferences(this.backup);\n }\n });\n }\n commit() {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_2__.PromiseHelpers.emptyPromise();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiScorePreferencesDialog extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiDialogAdapterBase {\n constructor(params) {\n const adapter = new SuiScorePreferencesAdapter(params.view);\n super(SuiScorePreferencesDialog.dialogElements, Object.assign({ adapter }, params));\n }\n}\nSuiScorePreferencesDialog.dialogElements = {\n label: 'Score Preferences',\n elements: [{\n smoName: 'autoAdvance',\n control: 'SuiToggleComponent',\n label: 'Auto-advance after pitch'\n }, {\n smoName: 'autoPlay',\n control: 'SuiToggleComponent',\n label: 'Auto-play sounds for note entry'\n }, {\n smoName: 'showPiano',\n control: 'SuiToggleComponent',\n label: 'Show Piano widget'\n }, {\n smoName: 'transposingScore',\n control: 'SuiToggleComponent',\n label: 'Tranpose Score'\n }, {\n smoName: 'hideEmptyLines',\n control: 'SuiToggleComponent',\n label: 'Hide Empty Lines'\n }, {\n smoName: 'defaultDupleDuration',\n control: 'SuiDropdownComponent',\n label: 'Default Duration (even meter)',\n dataType: 'int',\n options: [{\n value: 4096,\n label: '1/4'\n }, {\n value: 2048,\n label: '1/8'\n }]\n }, {\n smoName: 'defaultTripleDuration',\n control: 'SuiDropdownComponent',\n label: 'Default Duration (triple meter)',\n dataType: 'int',\n options: [{\n value: 6144,\n label: 'dotted 1/4'\n }, {\n value: 2048,\n label: '1/8'\n }]\n }],\n staticText: []\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bkIsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUsaUNBQWlDO1NBQ3pDLEVBQUU7WUFDRCxPQUFPLEVBQUUsV0FBVztZQUNwQixPQUFPLEVBQUUsb0JBQW9CO1lBQzdCLEtBQUssRUFBRSxtQkFBbUI7U0FDM0IsRUFBRztZQUNGLE9BQU8sRUFBRSxrQkFBa0I7WUFDM0IsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUsZ0JBQWdCO1NBQ3hCLEVBQUU7WUFDRCxPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsS0FBSyxFQUFFLGtCQUFrQjtTQUMxQixFQUFFO1lBQ0QsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSwrQkFBK0I7WUFDdEMsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsSUFBSTtvQkFDWCxLQUFLLEVBQUUsS0FBSztpQkFDYixFQUFFO29CQUNELEtBQUssRUFBRSxJQUFJO29CQUNYLEtBQUssRUFBRSxLQUFLO2lCQUNiLENBQUM7U0FDSCxFQUFFO1lBQ0QsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSxpQ0FBaUM7WUFDeEMsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsSUFBSTtvQkFDWCxLQUFLLEVBQUUsWUFBWTtpQkFDcEIsRUFBRTtvQkFDRCxLQUFLLEVBQUUsSUFBSTtvQkFDWCxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1NBQ0gsQ0FBQztJQUNGLFVBQVUsRUFBRSxFQUFFO0NBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9wcmVmZXJlbmNlcy50cz8zZTkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTbW9TY29yZVByZWZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTdWlTY29yZVZpZXdPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QWRhcHRlciwgU3VpRGlhbG9nQWRhcHRlckJhc2UgfSBmcm9tICcuL2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBEaWFsb2dEZWZpbml0aW9uLCBTdWlEaWFsb2dQYXJhbXMgfSBmcm9tICcuL2RpYWxvZyc7XHJcbmltcG9ydCB7IFByb21pc2VIZWxwZXJzIH0gZnJvbSAnLi4vLi4vY29tbW9uL3Byb21pc2VIZWxwZXJzJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmNvbnN0IGRlZXBDb3B5ID0gKHg6IGFueSkgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh4KSk7XHJcblxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVNjb3JlUHJlZmVyZW5jZXNBZGFwdGVyIGV4dGVuZHMgU3VpQ29tcG9uZW50QWRhcHRlciB7XHJcbiAgcHJlZmVyZW5jZXM6IFNtb1Njb3JlUHJlZmVyZW5jZXM7XHJcbiAgYmFja3VwOiBTbW9TY29yZVByZWZlcmVuY2VzO1xyXG4gIGNvbnN0cnVjdG9yKHZpZXc6IFN1aVNjb3JlVmlld09wZXJhdGlvbnMpIHtcclxuICAgIHN1cGVyKHZpZXcpO1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBTbW9TY29yZVByZWZlcmVuY2VzKHZpZXcuc2NvcmUucHJlZmVyZW5jZXMpO1xyXG4gICAgdGhpcy5iYWNrdXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucHJlZmVyZW5jZXMpKTtcclxuICB9XHJcbiAgZ2V0IGF1dG9BZHZhbmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuYXV0b0FkdmFuY2U7XHJcbiAgfVxyXG4gIHNldCBhdXRvQWR2YW5jZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy5hdXRvQWR2YW5jZSA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXModGhpcy5wcmVmZXJlbmNlcyk7XHJcbiAgfVxyXG4gIGdldCBhdXRvUGxheSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VzLmF1dG9QbGF5O1xyXG4gIH1cclxuICBzZXQgYXV0b1BsYXkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMuYXV0b1BsYXkgPSB2YWx1ZTtcclxuICAgIHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gIH1cclxuICBnZXQgc2hvd1BpYW5vKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2hvd1BpYW5vO1xyXG4gIH1cclxuICBzZXQgc2hvd1BpYW5vKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByZWZlcmVuY2VzLnNob3dQaWFubyA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXModGhpcy5wcmVmZXJlbmNlcyk7XHJcbiAgfVxyXG4gIGdldCBoaWRlRW1wdHlMaW5lcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VzLmhpZGVFbXB0eUxpbmVzO1xyXG4gIH1cclxuICBzZXQgaGlkZUVtcHR5TGluZXModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMuaGlkZUVtcHR5TGluZXMgPSB2YWx1ZTtcclxuICAgIHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gIH1cclxuICBnZXQgZGVmYXVsdER1cGxlRHVyYXRpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy5kZWZhdWx0RHVwbGVEdXJhdGlvbjtcclxuICB9XHJcbiAgc2V0IGRlZmF1bHREdXBsZUR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMuZGVmYXVsdER1cGxlRHVyYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gIH1cclxuICBnZXQgZGVmYXVsdFRyaXBsZUR1cmF0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuZGVmYXVsdFRyaXBsZUR1cmF0aW9uO1xyXG4gIH1cclxuICBzZXQgZGVmYXVsdFRyaXBsZUR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMuZGVmYXVsdFRyaXBsZUR1cmF0aW9uID0gdmFsdWU7XHJcbiAgICB0aGlzLnZpZXcudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxuICB9XHJcbiAgZ2V0IHRyYW5zcG9zaW5nU2NvcmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gIH1cclxuICBzZXQgdHJhbnNwb3NpbmdTY29yZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlID0gdmFsdWU7XHJcbiAgICB0aGlzLnZpZXcudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxuICB9XHJcbiAgYXN5bmMgY2FuY2VsKCkge1xyXG4gICAgY29uc3QgcDEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnByZWZlcmVuY2VzKTtcclxuICAgIGNvbnN0IHAyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrdXApO1xyXG4gICAgaWYgKHAxICE9PSBwMikge1xyXG4gICAgICBhd2FpdCB0aGlzLnZpZXcudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyh0aGlzLmJhY2t1cCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbW1pdCgpIHtcclxuICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlTY29yZVByZWZlcmVuY2VzRGlhbG9nIGV4dGVuZHMgU3VpRGlhbG9nQWRhcHRlckJhc2U8U3VpU2NvcmVQcmVmZXJlbmNlc0FkYXB0ZXI+IHtcclxuICBzdGF0aWMgZGlhbG9nRWxlbWVudHM6IERpYWxvZ0RlZmluaXRpb24gPVxyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ1Njb3JlIFByZWZlcmVuY2VzJyxcclxuICAgICAgZWxlbWVudHM6IFt7XHJcbiAgICAgICAgc21vTmFtZTogJ2F1dG9BZHZhbmNlJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0F1dG8tYWR2YW5jZSBhZnRlciBwaXRjaCdcclxuICAgICAgfSwge1xyXG4gICAgICAgIHNtb05hbWU6ICdhdXRvUGxheScsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdBdXRvLXBsYXkgc291bmRzIGZvciBub3RlIGVudHJ5J1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgc21vTmFtZTogJ3Nob3dQaWFubycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdTaG93IFBpYW5vIHdpZGdldCdcclxuICAgICAgfSwgIHtcclxuICAgICAgICBzbW9OYW1lOiAndHJhbnNwb3NpbmdTY29yZScsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdUcmFucG9zZSBTY29yZSdcclxuICAgICAgfSwge1xyXG4gICAgICAgIHNtb05hbWU6ICdoaWRlRW1wdHlMaW5lcycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdIaWRlIEVtcHR5IExpbmVzJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgc21vTmFtZTogJ2RlZmF1bHREdXBsZUR1cmF0aW9uJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgIGxhYmVsOiAnRGVmYXVsdCBEdXJhdGlvbiAoZXZlbiBtZXRlciknLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnaW50JyxcclxuICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgdmFsdWU6IDQwOTYsXHJcbiAgICAgICAgICBsYWJlbDogJzEvNCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB2YWx1ZTogMjA0OCxcclxuICAgICAgICAgIGxhYmVsOiAnMS84J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBzbW9OYW1lOiAnZGVmYXVsdFRyaXBsZUR1cmF0aW9uJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgIGxhYmVsOiAnRGVmYXVsdCBEdXJhdGlvbiAodHJpcGxlIG1ldGVyKScsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdpbnQnLFxyXG4gICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICB2YWx1ZTogNjE0NCxcclxuICAgICAgICAgIGxhYmVsOiAnZG90dGVkIDEvNCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB2YWx1ZTogMjA0OCxcclxuICAgICAgICAgIGxhYmVsOiAnMS84J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH1dLFxyXG4gICAgICBzdGF0aWNUZXh0OiBbXVxyXG4gICAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBjb25zdCBhZGFwdGVyID0gbmV3IFN1aVNjb3JlUHJlZmVyZW5jZXNBZGFwdGVyKHBhcmFtcy52aWV3KTtcclxuICAgIHN1cGVyKFN1aVNjb3JlUHJlZmVyZW5jZXNEaWFsb2cuZGlhbG9nRWxlbWVudHMsIHsgYWRhcHRlciwgLi4ucGFyYW1zIH0pO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/preferences.ts\n");
1463
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScorePreferencesAdapter: () => (/* binding */ SuiScorePreferencesAdapter),\n/* harmony export */ SuiScorePreferencesDialog: () => (/* binding */ SuiScorePreferencesDialog)\n/* harmony export */ });\n/* harmony import */ var _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adapter */ \"./src/ui/dialogs/adapter.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\nconst deepCopy = (x) => JSON.parse(JSON.stringify(x));\n/**\n * @category SuiDialog\n */\nclass SuiScorePreferencesAdapter extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiComponentAdapter {\n constructor(view) {\n super(view);\n this.preferences = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoScorePreferences(view.score.preferences);\n this.backup = JSON.parse(JSON.stringify(this.preferences));\n this.originalTransposeScore = this.preferences.transposingScore;\n }\n get autoAdvance() {\n return this.preferences.autoAdvance;\n }\n set autoAdvance(value) {\n this.preferences.autoAdvance = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get autoPlay() {\n return this.preferences.autoPlay;\n }\n set autoPlay(value) {\n this.preferences.autoPlay = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get showPiano() {\n return this.preferences.showPiano;\n }\n set showPiano(value) {\n this.preferences.showPiano = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get hideEmptyLines() {\n return this.preferences.hideEmptyLines;\n }\n set hideEmptyLines(value) {\n this.preferences.hideEmptyLines = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get defaultDupleDuration() {\n return this.preferences.defaultDupleDuration;\n }\n set defaultDupleDuration(value) {\n this.preferences.defaultDupleDuration = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get defaultTripleDuration() {\n return this.preferences.defaultTripleDuration;\n }\n set defaultTripleDuration(value) {\n this.preferences.defaultTripleDuration = value;\n this.view.updateScorePreferences(this.preferences);\n }\n get transposingScore() {\n return this.preferences.transposingScore;\n }\n set transposingScore(value) {\n this.preferences.transposingScore = value;\n this.view.updateScorePreferences(this.preferences);\n }\n cancel() {\n return __awaiter(this, void 0, void 0, function* () {\n const p1 = JSON.stringify(this.preferences);\n const p2 = JSON.stringify(this.backup);\n if (p1 !== p2) {\n yield this.view.updateScorePreferences(this.backup);\n }\n });\n }\n commit() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.originalTransposeScore !== this.preferences.transposingScore) {\n yield this.view.refreshViewport();\n return;\n }\n return;\n });\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiScorePreferencesDialog extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiDialogAdapterBase {\n constructor(params) {\n const adapter = new SuiScorePreferencesAdapter(params.view);\n super(SuiScorePreferencesDialog.dialogElements, Object.assign({ adapter }, params));\n }\n}\nSuiScorePreferencesDialog.dialogElements = {\n label: 'Score Preferences',\n elements: [{\n smoName: 'autoAdvance',\n control: 'SuiToggleComponent',\n label: 'Auto-advance after pitch'\n }, {\n smoName: 'autoPlay',\n control: 'SuiToggleComponent',\n label: 'Auto-play sounds for note entry'\n }, {\n smoName: 'showPiano',\n control: 'SuiToggleComponent',\n label: 'Show Piano widget'\n }, {\n smoName: 'transposingScore',\n control: 'SuiToggleComponent',\n label: 'Tranpose Score'\n }, {\n smoName: 'hideEmptyLines',\n control: 'SuiToggleComponent',\n label: 'Hide Empty Lines'\n }, {\n smoName: 'defaultDupleDuration',\n control: 'SuiDropdownComponent',\n label: 'Default Duration (even meter)',\n dataType: 'int',\n options: [{\n value: 4096,\n label: '1/4'\n }, {\n value: 2048,\n label: '1/8'\n }]\n }, {\n smoName: 'defaultTripleDuration',\n control: 'SuiDropdownComponent',\n label: 'Default Duration (triple meter)',\n dataType: 'int',\n options: [{\n value: 6144,\n label: 'dotted 1/4'\n }, {\n value: 2048,\n label: '1/8'\n }]\n }],\n staticText: []\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1NBQ0gsQ0FBQztJQUNGLFVBQVUsRUFBRSxFQUFFO0NBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9wcmVmZXJlbmNlcy50cz8zZTkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTbW9TY29yZVByZWZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTdWlTY29yZVZpZXdPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QWRhcHRlciwgU3VpRGlhbG9nQWRhcHRlckJhc2UgfSBmcm9tICcuL2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBEaWFsb2dEZWZpbml0aW9uLCBTdWlEaWFsb2dQYXJhbXMgfSBmcm9tICcuL2RpYWxvZyc7XHJcbmltcG9ydCB7IFByb21pc2VIZWxwZXJzIH0gZnJvbSAnLi4vLi4vY29tbW9uL3Byb21pc2VIZWxwZXJzJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmNvbnN0IGRlZXBDb3B5ID0gKHg6IGFueSkgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh4KSk7XHJcblxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVNjb3JlUHJlZmVyZW5jZXNBZGFwdGVyIGV4dGVuZHMgU3VpQ29tcG9uZW50QWRhcHRlciB7XHJcbiAgcHJlZmVyZW5jZXM6IFNtb1Njb3JlUHJlZmVyZW5jZXM7XHJcbiAgYmFja3VwOiBTbW9TY29yZVByZWZlcmVuY2VzO1xyXG4gIG9yaWdpbmFsVHJhbnNwb3NlU2NvcmU6IGJvb2xlYW47XHJcbiAgY29uc3RydWN0b3IodmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucykge1xyXG4gICAgc3VwZXIodmlldyk7XHJcbiAgICB0aGlzLnByZWZlcmVuY2VzID0gbmV3IFNtb1Njb3JlUHJlZmVyZW5jZXModmlldy5zY29yZS5wcmVmZXJlbmNlcyk7XHJcbiAgICB0aGlzLmJhY2t1cCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wcmVmZXJlbmNlcykpO1xyXG4gICAgdGhpcy5vcmlnaW5hbFRyYW5zcG9zZVNjb3JlID0gdGhpcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gIH1cclxuICBnZXQgYXV0b0FkdmFuY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy5hdXRvQWR2YW5jZTtcclxuICB9XHJcbiAgc2V0IGF1dG9BZHZhbmNlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByZWZlcmVuY2VzLmF1dG9BZHZhbmNlID0gdmFsdWU7XHJcbiAgICB0aGlzLnZpZXcudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxuICB9XHJcbiAgZ2V0IGF1dG9QbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuYXV0b1BsYXk7XHJcbiAgfVxyXG4gIHNldCBhdXRvUGxheSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy5hdXRvUGxheSA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXModGhpcy5wcmVmZXJlbmNlcyk7XHJcbiAgfVxyXG4gIGdldCBzaG93UGlhbm8oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy5zaG93UGlhbm87XHJcbiAgfVxyXG4gIHNldCBzaG93UGlhbm8odmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJlZmVyZW5jZXMuc2hvd1BpYW5vID0gdmFsdWU7XHJcbiAgICB0aGlzLnZpZXcudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyh0aGlzLnByZWZlcmVuY2VzKTtcclxuICB9XHJcbiAgZ2V0IGhpZGVFbXB0eUxpbmVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuaGlkZUVtcHR5TGluZXM7XHJcbiAgfVxyXG4gIHNldCBoaWRlRW1wdHlMaW5lcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy5oaWRlRW1wdHlMaW5lcyA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXModGhpcy5wcmVmZXJlbmNlcyk7XHJcbiAgfVxyXG4gIGdldCBkZWZhdWx0RHVwbGVEdXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VzLmRlZmF1bHREdXBsZUR1cmF0aW9uO1xyXG4gIH1cclxuICBzZXQgZGVmYXVsdER1cGxlRHVyYXRpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy5kZWZhdWx0RHVwbGVEdXJhdGlvbiA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXModGhpcy5wcmVmZXJlbmNlcyk7XHJcbiAgfVxyXG4gIGdldCBkZWZhdWx0VHJpcGxlRHVyYXRpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVmZXJlbmNlcy5kZWZhdWx0VHJpcGxlRHVyYXRpb247XHJcbiAgfVxyXG4gIHNldCBkZWZhdWx0VHJpcGxlRHVyYXRpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5wcmVmZXJlbmNlcy5kZWZhdWx0VHJpcGxlRHVyYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gIH1cclxuICBnZXQgdHJhbnNwb3NpbmdTY29yZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmU7XHJcbiAgfVxyXG4gIHNldCB0cmFuc3Bvc2luZ1Njb3JlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUgPSB2YWx1ZTtcclxuICAgIHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gIH1cclxuICBhc3luYyBjYW5jZWwoKSB7XHJcbiAgICBjb25zdCBwMSA9IEpTT04uc3RyaW5naWZ5KHRoaXMucHJlZmVyZW5jZXMpO1xyXG4gICAgY29uc3QgcDIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2t1cCk7XHJcbiAgICBpZiAocDEgIT09IHAyKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy51cGRhdGVTY29yZVByZWZlcmVuY2VzKHRoaXMuYmFja3VwKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgY29tbWl0KCkge1xyXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUcmFuc3Bvc2VTY29yZSAhPT0gdGhpcy5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy5yZWZyZXNoVmlld3BvcnQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVNjb3JlUHJlZmVyZW5jZXNEaWFsb2cgZXh0ZW5kcyBTdWlEaWFsb2dBZGFwdGVyQmFzZTxTdWlTY29yZVByZWZlcmVuY2VzQWRhcHRlcj4ge1xyXG4gIHN0YXRpYyBkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiA9XHJcbiAgICB7XHJcbiAgICAgIGxhYmVsOiAnU2NvcmUgUHJlZmVyZW5jZXMnLFxyXG4gICAgICBlbGVtZW50czogW3tcclxuICAgICAgICBzbW9OYW1lOiAnYXV0b0FkdmFuY2UnLFxyXG4gICAgICAgIGNvbnRyb2w6ICdTdWlUb2dnbGVDb21wb25lbnQnLFxyXG4gICAgICAgIGxhYmVsOiAnQXV0by1hZHZhbmNlIGFmdGVyIHBpdGNoJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgc21vTmFtZTogJ2F1dG9QbGF5JyxcclxuICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0F1dG8tcGxheSBzb3VuZHMgZm9yIG5vdGUgZW50cnknXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBzbW9OYW1lOiAnc2hvd1BpYW5vJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ1Nob3cgUGlhbm8gd2lkZ2V0J1xyXG4gICAgICB9LCAge1xyXG4gICAgICAgIHNtb05hbWU6ICd0cmFuc3Bvc2luZ1Njb3JlJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ1RyYW5wb3NlIFNjb3JlJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgc21vTmFtZTogJ2hpZGVFbXB0eUxpbmVzJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0hpZGUgRW1wdHkgTGluZXMnXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBzbW9OYW1lOiAnZGVmYXVsdER1cGxlRHVyYXRpb24nLFxyXG4gICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdEZWZhdWx0IER1cmF0aW9uIChldmVuIG1ldGVyKScsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdpbnQnLFxyXG4gICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICB2YWx1ZTogNDA5NixcclxuICAgICAgICAgIGxhYmVsOiAnMS80J1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiAyMDQ4LFxyXG4gICAgICAgICAgbGFiZWw6ICcxLzgnXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIHNtb05hbWU6ICdkZWZhdWx0VHJpcGxlRHVyYXRpb24nLFxyXG4gICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdEZWZhdWx0IER1cmF0aW9uICh0cmlwbGUgbWV0ZXIpJyxcclxuICAgICAgICBkYXRhVHlwZTogJ2ludCcsXHJcbiAgICAgICAgb3B0aW9uczogW3tcclxuICAgICAgICAgIHZhbHVlOiA2MTQ0LFxyXG4gICAgICAgICAgbGFiZWw6ICdkb3R0ZWQgMS80J1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiAyMDQ4LFxyXG4gICAgICAgICAgbGFiZWw6ICcxLzgnXHJcbiAgICAgICAgfV1cclxuICAgICAgfV0sXHJcbiAgICAgIHN0YXRpY1RleHQ6IFtdXHJcbiAgICB9XHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTdWlEaWFsb2dQYXJhbXMpIHtcclxuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3VpU2NvcmVQcmVmZXJlbmNlc0FkYXB0ZXIocGFyYW1zLnZpZXcpO1xyXG4gICAgc3VwZXIoU3VpU2NvcmVQcmVmZXJlbmNlc0RpYWxvZy5kaWFsb2dFbGVtZW50cywgeyBhZGFwdGVyLCAuLi5wYXJhbXMgfSk7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/preferences.ts\n");
1464
1464
 
1465
1465
  /***/ }),
1466
1466