diff --git a/6/bundle.25e23cc746eca4886d2b.js b/6/bundle.25e23cc746eca4886d2b.js
new file mode 100644
index 0000000..9d4db74
--- /dev/null
+++ b/6/bundle.25e23cc746eca4886d2b.js
@@ -0,0 +1 @@
+(()=>{var __webpack_modules__={89:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval('\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(379);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(795);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(569);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(565);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(216);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(589);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/framework/view/abstract-view.css\nvar abstract_view = __webpack_require__(10);\n;// CONCATENATED MODULE: ./src/framework/view/abstract-view.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\n\n options.insert = insertBySelector_default().bind(null, "head");\n \noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(abstract_view/* default */.Z, options);\n\n\n\n\n /* harmony default export */ const view_abstract_view = (abstract_view/* default */.Z && abstract_view/* default.locals */.Z.locals ? abstract_view/* default.locals */.Z.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/framework/view/abstract-view.js\n\n\n\n/** @const {string} Класс, реализующий эффект "покачивания головой" */\nconst SHAKE_CLASS_NAME = \'shake\';\n\n/** @const {number} Время анимации в миллисекундах */\nconst SHAKE_ANIMATION_TIMEOUT = 600;\n\n/**\n * Абстрактный класс представления\n */\nclass AbstractView {\n /** @type {HTMLElement|null} Элемент представления */\n #element = null;\n constructor() {\n if (new.target === AbstractView) {\n throw new Error(\'Can\\\'t instantiate AbstractView, only concrete one.\');\n }\n }\n\n /**\n * Геттер для получения элемента\n * @returns {HTMLElement} Элемент представления\n */\n get element() {\n if (!this.#element) {\n this.#element = createElement(this.template);\n }\n return this.#element;\n }\n\n /**\n * Геттер для получения разметки элемента\n * @abstract\n * @returns {string} Разметка элемента в виде строки\n */\n get template() {\n throw new Error(\'Abstract method not implemented: get template\');\n }\n\n /** Метод для удаления элемента */\n removeElement() {\n this.#element = null;\n }\n\n /**\n * Метод, реализующий эффект "покачивания головой"\n * @param {shakeCallback} [callback] Функция, которая будет вызвана после завершения анимации\n */\n shake(callback) {\n this.element.classList.add(SHAKE_CLASS_NAME);\n setTimeout(() => {\n this.element.classList.remove(SHAKE_CLASS_NAME);\n callback?.();\n }, SHAKE_ANIMATION_TIMEOUT);\n }\n}\n\n/**\n * Функция, которая будет вызвана методом shake после завершения анимации\n * @callback shakeCallback\n */\n;// CONCATENATED MODULE: ./src/framework/render.js\n\n\n/** @enum {string}\n * BEFOREBEGIN - вставить элемент перед началом контейнера\n * AFTERBEGIN - вставить элемент сразу после начала контейнера\n * BEFOREEND - вставить элемент перед концом контейнера\n * AFTEREND - вставить элемент сразу после конца контейнера\n*/\nconst RenderPosition = {\n BEFOREBEGIN: \'beforebegin\',\n AFTERBEGIN: \'afterbegin\',\n BEFOREEND: \'beforeend\',\n AFTEREND: \'afterend\'\n};\n\n/**\n * Функция для создания элемента на основе разметки\n * @param {string} template Разметка в виде строки\n * @returns {HTMLElement} Созданный элемент\n */\nfunction createElement(template) {\n const newElement = document.createElement(\'div\');\n newElement.innerHTML = template;\n return newElement.firstElementChild;\n}\n\n/**\n * Функция для отрисовки элемента\n * @param {AbstractView} component Компонент, который должен был отрисован\n * @param {HTMLElement} container Элемент в котором будет отрисован компонент\n * @param {string} place Позиция компонента относительно контейнера. По умолчанию - `beforeend`\n */\nfunction render(component, container, place = RenderPosition.BEFOREEND) {\n if (!(component instanceof AbstractView)) {\n throw new Error(\'Can render only components\');\n }\n if (container === null) {\n throw new Error(\'Container element doesn\\\'t exist\');\n }\n container.insertAdjacentElement(place, component.element);\n}\n\n/**\n * Функция для замены одного компонента на другой\n * @param {AbstractView} newComponent Компонент, который нужно показать\n * @param {AbstractView} oldComponent Компонент, который нужно скрыть\n */\nfunction replace(newComponent, oldComponent) {\n if (!(newComponent instanceof AbstractView && oldComponent instanceof AbstractView)) {\n throw new Error(\'Can replace only components\');\n }\n const newElement = newComponent.element;\n const oldElement = oldComponent.element;\n const parent = oldElement.parentElement;\n if (parent === null) {\n throw new Error(\'Parent element doesn\\\'t exist\');\n }\n parent.replaceChild(newElement, oldElement);\n}\n\n/**\n * Функция для удаления компонента\n * @param {AbstractView} component Компонент, который нужно удалить\n */\nfunction remove(component) {\n if (component === null) {\n return;\n }\n if (!(component instanceof AbstractView)) {\n throw new Error(\'Can remove only components\');\n }\n component.element.remove();\n component.removeElement();\n}\n\n;// CONCATENATED MODULE: ./src/utils/common.js\nconst ESCAPE_KEY_CODE = 27;\nconst isEscapeKey = evt => evt.keyCode === ESCAPE_KEY_CODE;\nconst getRandomNumber = (from, to) => {\n const lower = Math.ceil(Math.min(from, to));\n const upper = Math.floor(Math.max(from, to));\n const result = Math.random() * (upper - lower + 1) + lower;\n return Math.floor(result);\n};\nconst getRandomString = (desiredStringLength = 1) => {\n const primer = \' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\';\n let randomString = \'\';\n for (let i = 0; i < desiredStringLength; i++) {\n randomString += primer.charAt(getRandomNumber(0, primer.length - 1));\n }\n return randomString;\n};\nconst getRandomBoolean = () => Math.random() >= 0.5;\nconst getRandomArrayElement = items => items[getRandomNumber(0, items.length - 1)];\nconst getRandomDate = () => {\n const today = new Date();\n const oneYearFromNow = new Date();\n oneYearFromNow.setFullYear(today.getFullYear() + 1);\n const randomTime = Math.random() * (oneYearFromNow - today) + today.getTime();\n return new Date(randomTime);\n};\nconst convertToCamelCase = str => str.replace(/(_\\w)/g, match => match[1].toUpperCase());\nconst convertKeysToCamelCase = items => {\n if (Array.isArray(items)) {\n return items.map(convertKeysToCamelCase);\n }\n if (items !== null && typeof items === \'object\') {\n return Object.entries(items).reduce((newItems, [key, value]) => {\n newItems[convertToCamelCase(key)] = convertKeysToCamelCase(value);\n return newItems;\n }, {});\n }\n return items;\n};\nconst updateItem = (items, update) => items.map(item => item.id === update.id ? update : item);\n\n;// CONCATENATED MODULE: ./src/const.js\nconst EVENTS_TYPES = [\'Taxi\', \'Bus\', \'Train\', \'Ship\', \'Drive\', \'Flight\', \'Check-in\', \'Sightseeing\', \'Restaurant\'];\nconst CITIES = [\'New York\', \'Tokyo\', \'Paris\', \'London\', \'Sydney\', \'Berlin\', \'Rio de Janeiro\', \'Moscow\', \'Cairo\', \'Cape Town\'];\nconst SENTENCES = [\'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras aliquet varius magna, non porta ligula feugiat eget. \', \'Fusce tristique felis at fermentum pharetra. \', \'Aliquam id orci ut lectus varius viverra. \', \'Nullam nunc ex, convallis sed finibus eget, sollicitudin eget ante. \', \'Phasellus eros mauris, condimentum sed nibh vitae, sodales efficitur ipsum. \', \'Sed blandit, eros vel aliquam faucibus, purus ex euismod diam, eu luctus nunc ante ut dui. \', \'Sed sed nisi sed augue convallis suscipit in sed felis. \', \'Aliquam erat volutpat. \', \'Nunc fermentum tortor ac porta dapibus. \', \'In rutrum ac purus sit amet tempus.\'];\nconst FilterType = {\n EVERYTHING: \'everything\',\n FUTURE: \'future\',\n PRESENT: \'present\',\n PAST: \'past\'\n};\nconst SortType = {\n DEFAULT: \'default\',\n PRICE: \'price\',\n TIME: \'time\'\n};\n\n;// CONCATENATED MODULE: ./node_modules/nanoid/index.browser.js\n\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = \'\'\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || \'\'\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += \'-\'\n } else {\n id += \'_\'\n }\n return id\n }, \'\')\n\n;// CONCATENATED MODULE: ./src/mock/events.js\n\n\n\nconst TIME_SKIP = 125;\nconst getRandomEvent = (date, destinationsList) => {\n const firstDate = new Date(date);\n const secondDate = new Date(firstDate);\n const destinationsIds = destinationsList.map(destination => destination.id);\n secondDate.setMinutes(firstDate.getMinutes() + TIME_SKIP);\n const randomEvent = {\n \'id\': nanoid(),\n \'base_price\': getRandomNumber(499, 4999),\n \'date_from\': firstDate.toISOString(),\n \'date_to\': secondDate.toISOString(),\n \'destination\': getRandomArrayElement(destinationsIds),\n \'is_favorite\': getRandomBoolean(),\n \'offers\': [\'04c3e4e6-9053-42ce-b747-e281314baa31\', \'14c3e4e6-9053-42ce-b747-e281314baa31\', \'24c3e4e6-9053-42ce-b747-e281314baa31\', \'34c3e4e6-9053-42ce-b747-e281314baa31\'],\n \'type\': getRandomArrayElement(EVENTS_TYPES)\n };\n return randomEvent;\n};\nconst getRandomEvents = (count, destinationsList) => {\n const date = getRandomDate();\n const events = [];\n for (let i = 0; i < count; i++) {\n events.push(getRandomEvent(date, destinationsList));\n date.setMinutes(date.getMinutes() + TIME_SKIP);\n }\n return events;\n};\n\n;// CONCATENATED MODULE: ./src/mock/offers.js\n\nconst OFFERS_COUNT = 4;\nconst getRandomOffer = id => {\n const offer = {\n \'id\': `${id}4c3e4e6-9053-42ce-b747-e281314baa31`,\n \'title\': `Upgrade ${id}`,\n \'price\': getRandomNumber(19, 499)\n };\n return offer;\n};\nconst getRandomOffers = type => {\n const randomOffers = [{\n \'type\': type,\n \'offers\': []\n }];\n for (let i = 0; i < OFFERS_COUNT; i++) {\n randomOffers[0].offers.push(getRandomOffer(i));\n }\n return randomOffers;\n};\n\n;// CONCATENATED MODULE: ./src/mock/destinations.js\n\n\nconst getRandomDescription = () => {\n let randomDescription = \'\';\n for (let i = 0; i < getRandomNumber(1, 5); i++) {\n randomDescription += getRandomArrayElement(SENTENCES);\n }\n return randomDescription;\n};\nconst getRandomDestination = id => {\n const destination = {\n \'id\': `${id}fa5cb75-a1fe-4b77-a83c-0e528e910e04`,\n \'description\': getRandomDescription(),\n \'name\': CITIES[id],\n \'pictures\': [{\n \'src\': `https://loremflickr.com/248/152?random=${getRandomNumber(1, 100)}`,\n \'description\': getRandomDescription()\n }]\n };\n return destination;\n};\nconst getRandomDestinations = () => {\n const destinations = [];\n for (let i = 0; i < CITIES.length; i++) {\n destinations.push(getRandomDestination(i));\n }\n return destinations;\n};\n\n;// CONCATENATED MODULE: ./src/model/events-connector.js\n\n\n\n\nconst EVENTS_COUNT = 5;\nconst createUserEvents = () => {\n const offersList = convertKeysToCamelCase(getRandomOffers());\n const destinationsList = convertKeysToCamelCase(getRandomDestinations());\n const eventsList = convertKeysToCamelCase(getRandomEvents(EVENTS_COUNT, destinationsList));\n const destinationsMap = new Map(destinationsList.map(destination => [destination.id, destination]));\n const offers = offersList[0].offers;\n const mergedEvents = eventsList.map(event => {\n const destinationData = destinationsMap.get(event.destination);\n const offersData = event.offers.map(offerId => offers.find(offer => offer.id === offerId)).filter(Boolean);\n return {\n ...event,\n destination: {\n id: destinationData.id,\n name: destinationData.name,\n description: destinationData.description,\n pictures: destinationData.pictures\n },\n offers: offersData\n };\n });\n return Array.from(new Map(mergedEvents.map(event => [event.id, event])).values());\n};\nclass EventsConnector {\n get userEvents() {\n return structuredClone(createUserEvents());\n }\n}\n;// CONCATENATED MODULE: ./src/model/events-model.js\n\nclass EventsModel {\n #EventsConnector = new EventsConnector();\n #eventsList = this.#EventsConnector.userEvents;\n get userEvents() {\n return this.#eventsList;\n }\n}\n;// CONCATENATED MODULE: ./src/view/new-trip-info-view.js\n\nfunction createNewTripInfoTemplate() {\n return ` 18 — 20 Mar \n Total: € 1230\n Amsterdam — Chamonix — Geneva
\n\n
\n \n —\n \n
\n${getTimeDifference(dateFrom, dateTo)}
\n\n € ${basePrice}\n
\nLoading...
\';\n}\nclass NoEventsView extends AbstractView {\n get template() {\n return createNoEventsViewTemplate();\n }\n}\n;// CONCATENATED MODULE: ./src/presenter/board-presenter.js\n\n\n\n\n\n\n\n\nclass BoardPresenter {\n #container = null;\n #eventsModel = null;\n #sortComponent = null;\n #eventsListComponent = new NewEventsListView();\n #eventsList = [];\n #eventPresenters = new Map();\n #currentSortType = SortType.DEFAULT;\n #sourcedBoardEvents = [];\n constructor({\n container,\n eventsModel\n }) {\n this.#container = container;\n this.#eventsModel = eventsModel;\n }\n init() {\n this.#eventsList = [...this.#eventsModel.userEvents];\n this.#sourcedBoardEvents = [...this.#eventsModel.userEvents];\n this.#renderBoard();\n this.#renderSort();\n }\n #renderEvent(inputUserEvent) {\n const eventPresenter = new EventPresenter({\n container: this.#eventsListComponent.element,\n onDataChange: this.#handleEventChange,\n onModeChange: this.#handleModeChange\n });\n eventPresenter.init(inputUserEvent);\n this.#eventPresenters.set(inputUserEvent.id, eventPresenter);\n }\n #renderNoEvents() {\n render(new NoEventsView(), this.#container);\n }\n #sortEvents(sortType) {\n switch (sortType) {\n case SortType.PRICE:\n this.#eventsList.sort(sortEventsPrice);\n break;\n case SortType.TIME:\n this.#eventsList.sort(sortEventsTime);\n break;\n default:\n this.#eventsList = [...this.#sourcedBoardEvents];\n }\n this.#currentSortType = sortType;\n }\n #handleSortTypeChange = sortType => {\n if (sortType === undefined || this.#currentSortType === sortType) {\n return;\n }\n this.#sortEvents(sortType);\n this.#clearEventList();\n this.#renderBoard();\n };\n #renderSort() {\n this.#sortComponent = new NewTripSortView({\n onSortTypeChange: this.#handleSortTypeChange\n });\n render(this.#sortComponent, this.#container, \'AFTERBEGIN\');\n }\n #renderBoard() {\n if (this.#eventsList.length === 0) {\n this.#renderNoEvents();\n return;\n }\n render(this.#eventsListComponent, this.#container);\n for (let i = 0; i < this.#eventsList.length; i++) {\n this.#renderEvent(this.#eventsList[i]);\n }\n }\n #handleEventChange = updatedEvent => {\n this.#eventsList = updateItem(this.#eventsList, updatedEvent);\n this.#sourcedBoardEvents = updateItem(this.#sourcedBoardEvents, updatedEvent);\n this.#eventPresenters.get(updatedEvent.id).init(updatedEvent);\n };\n #handleModeChange = () => {\n this.#eventPresenters.forEach(presenter => presenter.resetView());\n };\n #clearEventList() {\n this.#eventPresenters.forEach(presenter => presenter.destroy());\n this.#eventPresenters.clear();\n }\n}\n;// CONCATENATED MODULE: ./src/utils/filter.js\n\n\nconst filter = {\n [FilterType.EVERYTHING]: userEvents => userEvents,\n [FilterType.FUTURE]: userEvents => userEvents.filter(userEvent => isEventFuture(userEvent.dateFrom)),\n [FilterType.PRESENT]: userEvents => userEvents.filter(userEvent => isEventPresent(userEvent.dateFrom)),\n [FilterType.PAST]: userEvents => userEvents.filter(userEvent => isEventPast(userEvent.dateFrom))\n};\n\n;// CONCATENATED MODULE: ./src/mock/filter.js\n\nfunction generateFilter(userEvents) {\n return Object.entries(filter).map(([filterType, filterEvents]) => ({\n type: filterType,\n count: filterEvents(userEvents).length\n }));\n}\n\n;// CONCATENATED MODULE: ./src/main.js\n\n\n\n\n\n\nconst tripMainContainer = document.querySelector(\'.trip-main\');\nconst tripFiltersContainer = tripMainContainer.querySelector(\'.trip-controls__filters\');\nconst tripEventsContainer = document.querySelector(\'.trip-events\');\nconst eventsModel = new EventsModel();\nconst boardPresenter = new BoardPresenter({\n container: tripEventsContainer,\n eventsModel\n});\nconst filters = generateFilter(eventsModel.userEvents);\nrender(new NewTripInfoView(), tripMainContainer, \'AFTERBEGIN\');\nrender(new NewTripFiltersView({\n filters\n}), tripFiltersContainer);\nboardPresenter.init();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2JpZy10cmlwLy4vc3JjL2ZyYW1ld29yay92aWV3L2Fic3RyYWN0LXZpZXcuY3NzP2RmYTYiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvZnJhbWV3b3JrL3ZpZXcvYWJzdHJhY3Qtdmlldy5qcz80MDczIiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL2ZyYW1ld29yay9yZW5kZXIuanM/YjUxZSIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy91dGlscy9jb21tb24uanM/YzhjMyIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy9jb25zdC5qcz9kZmI2Iiwid2VicGFjazovL2JpZy10cmlwLy4vbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzP2IzODEiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvbW9jay9ldmVudHMuanM/NjQ4ZCIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy9tb2NrL29mZmVycy5qcz84ZDI5Iiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL21vY2svZGVzdGluYXRpb25zLmpzP2Q4YmYiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvbW9kZWwvZXZlbnRzLWNvbm5lY3Rvci5qcz9hZGU4Iiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL21vZGVsL2V2ZW50cy1tb2RlbC5qcz9lMDk5Iiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL3ZpZXcvbmV3LXRyaXAtaW5mby12aWV3LmpzPzJmNTgiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvdmlldy9uZXctZmlsdGVycy12aWV3LmpzPzQzMzUiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvdmlldy9uZXctc29ydC1jb250YWluZXItdmlldy5qcz83ZTQ5Iiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL3ZpZXcvbmV3LWV2ZW50cy1saXN0LXZpZXcuanM/NjgwZCIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy91dGlscy9ldmVudC5qcz8yYTUxIiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL3ZpZXcvbmV3LWV2ZW50cy1pdGVtLXZpZXcuanM/NzRiYyIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy92aWV3L25ldy1ldmVudC1lZGl0LWVsZW1lbnQtdmlldy5qcz80NDUwIiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL3ByZXNlbnRlci9ldmVudC1wcmVzZW50ZXIuanM/YzVmNSIsIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy92aWV3L25vLWV2ZW50cy12aWV3LmpzPzI5ODciLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvcHJlc2VudGVyL2JvYXJkLXByZXNlbnRlci5qcz81YTYwIiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL3V0aWxzL2ZpbHRlci5qcz9lZmE2Iiwid2VicGFjazovL2JpZy10cmlwLy4vc3JjL21vY2svZmlsdGVyLmpzPzk0MmIiLCJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9zcmMvbWFpbi5qcz84MTM4Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hYnN0cmFjdC12aWV3LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYWJzdHJhY3Qtdmlldy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi4vcmVuZGVyLmpzJztcbmltcG9ydCAnLi9hYnN0cmFjdC12aWV3LmNzcyc7XG5cbi8qKiBAY29uc3Qge3N0cmluZ30g0JrQu9Cw0YHRgSwg0YDQtdCw0LvQuNC30YPRjtGJ0LjQuSDRjdGE0YTQtdC60YIgXCLQv9C+0LrQsNGH0LjQstCw0L3QuNGPINCz0L7Qu9C+0LLQvtC5XCIgKi9cbmNvbnN0IFNIQUtFX0NMQVNTX05BTUUgPSAnc2hha2UnO1xuXG4vKiogQGNvbnN0IHtudW1iZXJ9INCS0YDQtdC80Y8g0LDQvdC40LzQsNGG0LjQuCDQsiDQvNC40LvQu9C40YHQtdC60YPQvdC00LDRhSAqL1xuY29uc3QgU0hBS0VfQU5JTUFUSU9OX1RJTUVPVVQgPSA2MDA7XG5cbi8qKlxuICog0JDQsdGB0YLRgNCw0LrRgtC90YvQuSDQutC70LDRgdGBINC/0YDQtdC00YHRgtCw0LLQu9C10L3QuNGPXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFic3RyYWN0VmlldyB7XG4gIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0g0K3Qu9C10LzQtdC90YIg0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Y8gKi9cbiAgI2VsZW1lbnQgPSBudWxsO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAobmV3LnRhcmdldCA9PT0gQWJzdHJhY3RWaWV3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgaW5zdGFudGlhdGUgQWJzdHJhY3RWaWV3LCBvbmx5IGNvbmNyZXRlIG9uZS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0JPQtdGC0YLQtdGAINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0Y3Qu9C10LzQtdC90YLQsFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9INCt0LvQtdC80LXQvdGCINC/0YDQtdC00YHRgtCw0LLQu9C10L3QuNGPXG4gICAqL1xuICBnZXQgZWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuI2VsZW1lbnQpIHtcbiAgICAgIHRoaXMuI2VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHRoaXMudGVtcGxhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDQk9C10YLRgtC10YAg0LTQu9GPINC/0L7Qu9GD0YfQtdC90LjRjyDRgNCw0LfQvNC10YLQutC4INGN0LvQtdC80LXQvdGC0LBcbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9INCg0LDQt9C80LXRgtC60LAg0Y3Qu9C10LzQtdC90YLQsCDQsiDQstC40LTQtSDRgdGC0YDQvtC60LhcbiAgICovXG4gIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IG1ldGhvZCBub3QgaW1wbGVtZW50ZWQ6IGdldCB0ZW1wbGF0ZScpO1xuICB9XG5cbiAgLyoqINCc0LXRgtC+0LQg0LTQu9GPINGD0LTQsNC70LXQvdC40Y8g0Y3Qu9C10LzQtdC90YLQsCAqL1xuICByZW1vdmVFbGVtZW50KCkge1xuICAgIHRoaXMuI2VsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqINCc0LXRgtC+0LQsINGA0LXQsNC70LjQt9GD0Y7RidC40Lkg0Y3RhNGE0LXQutGCIFwi0L/QvtC60LDRh9C40LLQsNC90LjRjyDQs9C+0LvQvtCy0L7QuVwiXG4gICAqIEBwYXJhbSB7c2hha2VDYWxsYmFja30gW2NhbGxiYWNrXSDQpNGD0L3QutGG0LjRjywg0LrQvtGC0L7RgNCw0Y8g0LHRg9C00LXRgiDQstGL0LfQstCw0L3QsCDQv9C+0YHQu9C1INC30LDQstC10YDRiNC10L3QuNGPINCw0L3QuNC80LDRhtC40LhcbiAgICovXG4gIHNoYWtlKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoU0hBS0VfQ0xBU1NfTkFNRSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShTSEFLRV9DTEFTU19OQU1FKTtcbiAgICAgIGNhbGxiYWNrPy4oKTtcbiAgICB9LCBTSEFLRV9BTklNQVRJT05fVElNRU9VVCk7XG4gIH1cbn1cblxuLyoqXG4gKiDQpNGD0L3QutGG0LjRjywg0LrQvtGC0L7RgNCw0Y8g0LHRg9C00LXRgiDQstGL0LfQstCw0L3QsCDQvNC10YLQvtC00L7QvCBzaGFrZSDQv9C+0YHQu9C1INC30LDQstC10YDRiNC10L3QuNGPINCw0L3QuNC80LDRhtC40LhcbiAqIEBjYWxsYmFjayBzaGFrZUNhbGxiYWNrXG4gKi8iLCJpbXBvcnQgQWJzdHJhY3RWaWV3IGZyb20gJy4vdmlldy9hYnN0cmFjdC12aWV3LmpzJztcblxuLyoqIEBlbnVtIHtzdHJpbmd9XG4gKiBCRUZPUkVCRUdJTiAtINCy0YHRgtCw0LLQuNGC0Ywg0Y3Qu9C10LzQtdC90YIg0L/QtdGA0LXQtCDQvdCw0YfQsNC70L7QvCDQutC+0L3RgtC10LnQvdC10YDQsFxuICogQUZURVJCRUdJTiAtINCy0YHRgtCw0LLQuNGC0Ywg0Y3Qu9C10LzQtdC90YIg0YHRgNCw0LfRgyDQv9C+0YHQu9C1INC90LDRh9Cw0LvQsCDQutC+0L3RgtC10LnQvdC10YDQsFxuICogQkVGT1JFRU5EIC0g0LLRgdGC0LDQstC40YLRjCDRjdC70LXQvNC10L3RgiDQv9C10YDQtdC0INC60L7QvdGG0L7QvCDQutC+0L3RgtC10LnQvdC10YDQsFxuICogQUZURVJFTkQgLSDQstGB0YLQsNCy0LjRgtGMINGN0LvQtdC80LXQvdGCINGB0YDQsNC30YMg0L/QvtGB0LvQtSDQutC+0L3RhtCwINC60L7QvdGC0LXQudC90LXRgNCwXG4qL1xuY29uc3QgUmVuZGVyUG9zaXRpb24gPSB7XG4gIEJFRk9SRUJFR0lOOiAnYmVmb3JlYmVnaW4nLFxuICBBRlRFUkJFR0lOOiAnYWZ0ZXJiZWdpbicsXG4gIEJFRk9SRUVORDogJ2JlZm9yZWVuZCcsXG4gIEFGVEVSRU5EOiAnYWZ0ZXJlbmQnXG59O1xuXG4vKipcbiAqINCk0YPQvdC60YbQuNGPINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGN0LvQtdC80LXQvdGC0LAg0L3QsCDQvtGB0L3QvtCy0LUg0YDQsNC30LzQtdGC0LrQuFxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlINCg0LDQt9C80LXRgtC60LAg0LIg0LLQuNC00LUg0YHRgtGA0L7QutC4XG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9INCh0L7Qt9C00LDQvdC90YvQuSDRjdC70LXQvNC10L3RglxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRlbXBsYXRlKSB7XG4gIGNvbnN0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbi8qKlxuICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC+0YLRgNC40YHQvtCy0LrQuCDRjdC70LXQvNC10L3RgtCwXG4gKiBAcGFyYW0ge0Fic3RyYWN0Vmlld30gY29tcG9uZW50INCa0L7QvNC/0L7QvdC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0LTQvtC70LbQtdC9INCx0YvQuyDQvtGC0YDQuNGB0L7QstCw0L1cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciDQrdC70LXQvNC10L3RgiDQsiDQutC+0YLQvtGA0L7QvCDQsdGD0LTQtdGCINC+0YLRgNC40YHQvtCy0LDQvSDQutC+0LzQv9C+0L3QtdC90YJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZSDQn9C+0LfQuNGG0LjRjyDQutC+0LzQv9C+0L3QtdC90YLQsCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LrQvtC90YLQtdC50L3QtdGA0LAuINCf0L4g0YPQvNC+0LvRh9Cw0L3QuNGOIC0gYGJlZm9yZWVuZGBcbiAqL1xuZnVuY3Rpb24gcmVuZGVyKGNvbXBvbmVudCwgY29udGFpbmVyLCBwbGFjZSA9IFJlbmRlclBvc2l0aW9uLkJFRk9SRUVORCkge1xuICBpZiAoIShjb21wb25lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdFZpZXcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gcmVuZGVyIG9ubHkgY29tcG9uZW50cycpO1xuICB9XG4gIGlmIChjb250YWluZXIgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhaW5lciBlbGVtZW50IGRvZXNuXFwndCBleGlzdCcpO1xuICB9XG4gIGNvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQocGxhY2UsIGNvbXBvbmVudC5lbGVtZW50KTtcbn1cblxuLyoqXG4gKiDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0LfQsNC80LXQvdGLINC+0LTQvdC+0LPQviDQutC+0LzQv9C+0L3QtdC90YLQsCDQvdCwINC00YDRg9Cz0L7QuVxuICogQHBhcmFtIHtBYnN0cmFjdFZpZXd9IG5ld0NvbXBvbmVudCDQmtC+0LzQv9C+0L3QtdC90YIsINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0L/QvtC60LDQt9Cw0YLRjFxuICogQHBhcmFtIHtBYnN0cmFjdFZpZXd9IG9sZENvbXBvbmVudCDQmtC+0LzQv9C+0L3QtdC90YIsINC60L7RgtC+0YDRi9C5INC90YPQttC90L4g0YHQutGA0YvRgtGMXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2UobmV3Q29tcG9uZW50LCBvbGRDb21wb25lbnQpIHtcbiAgaWYgKCEobmV3Q29tcG9uZW50IGluc3RhbmNlb2YgQWJzdHJhY3RWaWV3ICYmIG9sZENvbXBvbmVudCBpbnN0YW5jZW9mIEFic3RyYWN0VmlldykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiByZXBsYWNlIG9ubHkgY29tcG9uZW50cycpO1xuICB9XG4gIGNvbnN0IG5ld0VsZW1lbnQgPSBuZXdDb21wb25lbnQuZWxlbWVudDtcbiAgY29uc3Qgb2xkRWxlbWVudCA9IG9sZENvbXBvbmVudC5lbGVtZW50O1xuICBjb25zdCBwYXJlbnQgPSBvbGRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIGlmIChwYXJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBlbGVtZW50IGRvZXNuXFwndCBleGlzdCcpO1xuICB9XG4gIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgb2xkRWxlbWVudCk7XG59XG5cbi8qKlxuICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINGD0LTQsNC70LXQvdC40Y8g0LrQvtC80L/QvtC90LXQvdGC0LBcbiAqIEBwYXJhbSB7QWJzdHJhY3RWaWV3fSBjb21wb25lbnQg0JrQvtC80L/QvtC90LXQvdGCLCDQutC+0YLQvtGA0YvQuSDQvdGD0LbQvdC+INGD0LTQsNC70LjRgtGMXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZShjb21wb25lbnQpIHtcbiAgaWYgKGNvbXBvbmVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIShjb21wb25lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdFZpZXcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gcmVtb3ZlIG9ubHkgY29tcG9uZW50cycpO1xuICB9XG4gIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZSgpO1xuICBjb21wb25lbnQucmVtb3ZlRWxlbWVudCgpO1xufVxuZXhwb3J0IHsgUmVuZGVyUG9zaXRpb24sIGNyZWF0ZUVsZW1lbnQsIHJlbmRlciwgcmVwbGFjZSwgcmVtb3ZlIH07IiwiY29uc3QgRVNDQVBFX0tFWV9DT0RFID0gMjc7XG5jb25zdCBpc0VzY2FwZUtleSA9IGV2dCA9PiBldnQua2V5Q29kZSA9PT0gRVNDQVBFX0tFWV9DT0RFO1xuY29uc3QgZ2V0UmFuZG9tTnVtYmVyID0gKGZyb20sIHRvKSA9PiB7XG4gIGNvbnN0IGxvd2VyID0gTWF0aC5jZWlsKE1hdGgubWluKGZyb20sIHRvKSk7XG4gIGNvbnN0IHVwcGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChmcm9tLCB0bykpO1xuICBjb25zdCByZXN1bHQgPSBNYXRoLnJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSArIGxvd2VyO1xuICByZXR1cm4gTWF0aC5mbG9vcihyZXN1bHQpO1xufTtcbmNvbnN0IGdldFJhbmRvbVN0cmluZyA9IChkZXNpcmVkU3RyaW5nTGVuZ3RoID0gMSkgPT4ge1xuICBjb25zdCBwcmltZXIgPSAnIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgbGV0IHJhbmRvbVN0cmluZyA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2lyZWRTdHJpbmdMZW5ndGg7IGkrKykge1xuICAgIHJhbmRvbVN0cmluZyArPSBwcmltZXIuY2hhckF0KGdldFJhbmRvbU51bWJlcigwLCBwcmltZXIubGVuZ3RoIC0gMSkpO1xuICB9XG4gIHJldHVybiByYW5kb21TdHJpbmc7XG59O1xuY29uc3QgZ2V0UmFuZG9tQm9vbGVhbiA9ICgpID0+IE1hdGgucmFuZG9tKCkgPj0gMC41O1xuY29uc3QgZ2V0UmFuZG9tQXJyYXlFbGVtZW50ID0gaXRlbXMgPT4gaXRlbXNbZ2V0UmFuZG9tTnVtYmVyKDAsIGl0ZW1zLmxlbmd0aCAtIDEpXTtcbmNvbnN0IGdldFJhbmRvbURhdGUgPSAoKSA9PiB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgb25lWWVhckZyb21Ob3cgPSBuZXcgRGF0ZSgpO1xuICBvbmVZZWFyRnJvbU5vdy5zZXRGdWxsWWVhcih0b2RheS5nZXRGdWxsWWVhcigpICsgMSk7XG4gIGNvbnN0IHJhbmRvbVRpbWUgPSBNYXRoLnJhbmRvbSgpICogKG9uZVllYXJGcm9tTm93IC0gdG9kYXkpICsgdG9kYXkuZ2V0VGltZSgpO1xuICByZXR1cm4gbmV3IERhdGUocmFuZG9tVGltZSk7XG59O1xuY29uc3QgY29udmVydFRvQ2FtZWxDYXNlID0gc3RyID0+IHN0ci5yZXBsYWNlKC8oX1xcdykvZywgbWF0Y2ggPT4gbWF0Y2hbMV0udG9VcHBlckNhc2UoKSk7XG5jb25zdCBjb252ZXJ0S2V5c1RvQ2FtZWxDYXNlID0gaXRlbXMgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICByZXR1cm4gaXRlbXMubWFwKGNvbnZlcnRLZXlzVG9DYW1lbENhc2UpO1xuICB9XG4gIGlmIChpdGVtcyAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbXMgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGl0ZW1zKS5yZWR1Y2UoKG5ld0l0ZW1zLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIG5ld0l0ZW1zW2NvbnZlcnRUb0NhbWVsQ2FzZShrZXkpXSA9IGNvbnZlcnRLZXlzVG9DYW1lbENhc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ld0l0ZW1zO1xuICAgIH0sIHt9KTtcbiAgfVxuICByZXR1cm4gaXRlbXM7XG59O1xuY29uc3QgdXBkYXRlSXRlbSA9IChpdGVtcywgdXBkYXRlKSA9PiBpdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmlkID09PSB1cGRhdGUuaWQgPyB1cGRhdGUgOiBpdGVtKTtcbmV4cG9ydCB7IHVwZGF0ZUl0ZW0sIGdldFJhbmRvbU51bWJlciwgZ2V0UmFuZG9tU3RyaW5nLCBnZXRSYW5kb21Cb29sZWFuLCBnZXRSYW5kb21EYXRlLCBnZXRSYW5kb21BcnJheUVsZW1lbnQsIGNvbnZlcnRLZXlzVG9DYW1lbENhc2UsIGlzRXNjYXBlS2V5IH07IiwiY29uc3QgRVZFTlRTX1RZUEVTID0gWydUYXhpJywgJ0J1cycsICdUcmFpbicsICdTaGlwJywgJ0RyaXZlJywgJ0ZsaWdodCcsICdDaGVjay1pbicsICdTaWdodHNlZWluZycsICdSZXN0YXVyYW50J107XG5jb25zdCBDSVRJRVMgPSBbJ05ldyBZb3JrJywgJ1Rva3lvJywgJ1BhcmlzJywgJ0xvbmRvbicsICdTeWRuZXknLCAnQmVybGluJywgJ1JpbyBkZSBKYW5laXJvJywgJ01vc2NvdycsICdDYWlybycsICdDYXBlIFRvd24nXTtcbmNvbnN0IFNFTlRFTkNFUyA9IFsnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQ3JhcyBhbGlxdWV0IHZhcml1cyBtYWduYSwgbm9uIHBvcnRhIGxpZ3VsYSBmZXVnaWF0IGVnZXQuICcsICdGdXNjZSB0cmlzdGlxdWUgZmVsaXMgYXQgZmVybWVudHVtIHBoYXJldHJhLiAnLCAnQWxpcXVhbSBpZCBvcmNpIHV0IGxlY3R1cyB2YXJpdXMgdml2ZXJyYS4gJywgJ051bGxhbSBudW5jIGV4LCBjb252YWxsaXMgc2VkIGZpbmlidXMgZWdldCwgc29sbGljaXR1ZGluIGVnZXQgYW50ZS4gJywgJ1BoYXNlbGx1cyBlcm9zIG1hdXJpcywgY29uZGltZW50dW0gc2VkIG5pYmggdml0YWUsIHNvZGFsZXMgZWZmaWNpdHVyIGlwc3VtLiAnLCAnU2VkIGJsYW5kaXQsIGVyb3MgdmVsIGFsaXF1YW0gZmF1Y2lidXMsIHB1cnVzIGV4IGV1aXNtb2QgZGlhbSwgZXUgbHVjdHVzIG51bmMgYW50ZSB1dCBkdWkuICcsICdTZWQgc2VkIG5pc2kgc2VkIGF1Z3VlIGNvbnZhbGxpcyBzdXNjaXBpdCBpbiBzZWQgZmVsaXMuICcsICdBbGlxdWFtIGVyYXQgdm9sdXRwYXQuICcsICdOdW5jIGZlcm1lbnR1bSB0b3J0b3IgYWMgcG9ydGEgZGFwaWJ1cy4gJywgJ0luIHJ1dHJ1bSBhYyBwdXJ1cyBzaXQgYW1ldCB0ZW1wdXMuJ107XG5jb25zdCBGaWx0ZXJUeXBlID0ge1xuICBFVkVSWVRISU5HOiAnZXZlcnl0aGluZycsXG4gIEZVVFVSRTogJ2Z1dHVyZScsXG4gIFBSRVNFTlQ6ICdwcmVzZW50JyxcbiAgUEFTVDogJ3Bhc3QnXG59O1xuY29uc3QgU29ydFR5cGUgPSB7XG4gIERFRkFVTFQ6ICdkZWZhdWx0JyxcbiAgUFJJQ0U6ICdwcmljZScsXG4gIFRJTUU6ICd0aW1lJ1xufTtcbmV4cG9ydCB7IEVWRU5UU19UWVBFUywgQ0lUSUVTLCBTRU5URU5DRVMsIEZpbHRlclR5cGUsIFNvcnRUeXBlIH07IiwiZXhwb3J0IHsgdXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmV4cG9ydCBsZXQgcmFuZG9tID0gYnl0ZXMgPT4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShieXRlcykpXG5leHBvcnQgbGV0IGN1c3RvbVJhbmRvbSA9IChhbHBoYWJldCwgZGVmYXVsdFNpemUsIGdldFJhbmRvbSkgPT4ge1xuICBsZXQgbWFzayA9ICgyIDw8IChNYXRoLmxvZyhhbHBoYWJldC5sZW5ndGggLSAxKSAvIE1hdGguTE4yKSkgLSAxXG4gIGxldCBzdGVwID0gLX4oKDEuNiAqIG1hc2sgKiBkZWZhdWx0U2l6ZSkgLyBhbHBoYWJldC5sZW5ndGgpXG4gIHJldHVybiAoc2l6ZSA9IGRlZmF1bHRTaXplKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IGJ5dGVzID0gZ2V0UmFuZG9tKHN0ZXApXG4gICAgICBsZXQgaiA9IHN0ZXBcbiAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgaWQgKz0gYWxwaGFiZXRbYnl0ZXNbal0gJiBtYXNrXSB8fCAnJ1xuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSBzaXplKSByZXR1cm4gaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBsZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIHNpemUgPSAyMSkgPT5cbiAgY3VzdG9tUmFuZG9tKGFscGhhYmV0LCBzaXplLCByYW5kb20pXG5leHBvcnQgbGV0IG5hbm9pZCA9IChzaXplID0gMjEpID0+XG4gIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpLnJlZHVjZSgoaWQsIGJ5dGUpID0+IHtcbiAgICBieXRlICY9IDYzXG4gICAgaWYgKGJ5dGUgPCAzNikge1xuICAgICAgaWQgKz0gYnl0ZS50b1N0cmluZygzNilcbiAgICB9IGVsc2UgaWYgKGJ5dGUgPCA2Mikge1xuICAgICAgaWQgKz0gKGJ5dGUgLSAyNikudG9TdHJpbmcoMzYpLnRvVXBwZXJDYXNlKClcbiAgICB9IGVsc2UgaWYgKGJ5dGUgPiA2Mikge1xuICAgICAgaWQgKz0gJy0nXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkICs9ICdfJ1xuICAgIH1cbiAgICByZXR1cm4gaWRcbiAgfSwgJycpXG4iLCJpbXBvcnQgeyBnZXRSYW5kb21BcnJheUVsZW1lbnQsIGdldFJhbmRvbU51bWJlciwgZ2V0UmFuZG9tQm9vbGVhbiwgZ2V0UmFuZG9tRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbic7XG5pbXBvcnQgeyBFVkVOVFNfVFlQRVMgfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuY29uc3QgVElNRV9TS0lQID0gMTI1O1xuY29uc3QgZ2V0UmFuZG9tRXZlbnQgPSAoZGF0ZSwgZGVzdGluYXRpb25zTGlzdCkgPT4ge1xuICBjb25zdCBmaXJzdERhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgY29uc3Qgc2Vjb25kRGF0ZSA9IG5ldyBEYXRlKGZpcnN0RGF0ZSk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uc0lkcyA9IGRlc3RpbmF0aW9uc0xpc3QubWFwKGRlc3RpbmF0aW9uID0+IGRlc3RpbmF0aW9uLmlkKTtcbiAgc2Vjb25kRGF0ZS5zZXRNaW51dGVzKGZpcnN0RGF0ZS5nZXRNaW51dGVzKCkgKyBUSU1FX1NLSVApO1xuICBjb25zdCByYW5kb21FdmVudCA9IHtcbiAgICAnaWQnOiBuYW5vaWQoKSxcbiAgICAnYmFzZV9wcmljZSc6IGdldFJhbmRvbU51bWJlcig0OTksIDQ5OTkpLFxuICAgICdkYXRlX2Zyb20nOiBmaXJzdERhdGUudG9JU09TdHJpbmcoKSxcbiAgICAnZGF0ZV90byc6IHNlY29uZERhdGUudG9JU09TdHJpbmcoKSxcbiAgICAnZGVzdGluYXRpb24nOiBnZXRSYW5kb21BcnJheUVsZW1lbnQoZGVzdGluYXRpb25zSWRzKSxcbiAgICAnaXNfZmF2b3JpdGUnOiBnZXRSYW5kb21Cb29sZWFuKCksXG4gICAgJ29mZmVycyc6IFsnMDRjM2U0ZTYtOTA1My00MmNlLWI3NDctZTI4MTMxNGJhYTMxJywgJzE0YzNlNGU2LTkwNTMtNDJjZS1iNzQ3LWUyODEzMTRiYWEzMScsICcyNGMzZTRlNi05MDUzLTQyY2UtYjc0Ny1lMjgxMzE0YmFhMzEnLCAnMzRjM2U0ZTYtOTA1My00MmNlLWI3NDctZTI4MTMxNGJhYTMxJ10sXG4gICAgJ3R5cGUnOiBnZXRSYW5kb21BcnJheUVsZW1lbnQoRVZFTlRTX1RZUEVTKVxuICB9O1xuICByZXR1cm4gcmFuZG9tRXZlbnQ7XG59O1xuY29uc3QgZ2V0UmFuZG9tRXZlbnRzID0gKGNvdW50LCBkZXN0aW5hdGlvbnNMaXN0KSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBnZXRSYW5kb21EYXRlKCk7XG4gIGNvbnN0IGV2ZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBldmVudHMucHVzaChnZXRSYW5kb21FdmVudChkYXRlLCBkZXN0aW5hdGlvbnNMaXN0KSk7XG4gICAgZGF0ZS5zZXRNaW51dGVzKGRhdGUuZ2V0TWludXRlcygpICsgVElNRV9TS0lQKTtcbiAgfVxuICByZXR1cm4gZXZlbnRzO1xufTtcbmV4cG9ydCB7IGdldFJhbmRvbUV2ZW50cyB9OyIsImltcG9ydCB7IGdldFJhbmRvbU51bWJlciB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbic7XG5jb25zdCBPRkZFUlNfQ09VTlQgPSA0O1xuY29uc3QgZ2V0UmFuZG9tT2ZmZXIgPSBpZCA9PiB7XG4gIGNvbnN0IG9mZmVyID0ge1xuICAgICdpZCc6IGAke2lkfTRjM2U0ZTYtOTA1My00MmNlLWI3NDctZTI4MTMxNGJhYTMxYCxcbiAgICAndGl0bGUnOiBgVXBncmFkZSAke2lkfWAsXG4gICAgJ3ByaWNlJzogZ2V0UmFuZG9tTnVtYmVyKDE5LCA0OTkpXG4gIH07XG4gIHJldHVybiBvZmZlcjtcbn07XG5jb25zdCBnZXRSYW5kb21PZmZlcnMgPSB0eXBlID0+IHtcbiAgY29uc3QgcmFuZG9tT2ZmZXJzID0gW3tcbiAgICAndHlwZSc6IHR5cGUsXG4gICAgJ29mZmVycyc6IFtdXG4gIH1dO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IE9GRkVSU19DT1VOVDsgaSsrKSB7XG4gICAgcmFuZG9tT2ZmZXJzWzBdLm9mZmVycy5wdXNoKGdldFJhbmRvbU9mZmVyKGkpKTtcbiAgfVxuICByZXR1cm4gcmFuZG9tT2ZmZXJzO1xufTtcbmV4cG9ydCB7IGdldFJhbmRvbU9mZmVycyB9OyIsImltcG9ydCB7IGdldFJhbmRvbUFycmF5RWxlbWVudCwgZ2V0UmFuZG9tTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJztcbmltcG9ydCB7IFNFTlRFTkNFUywgQ0lUSUVTIH0gZnJvbSAnLi4vY29uc3QnO1xuY29uc3QgZ2V0UmFuZG9tRGVzY3JpcHRpb24gPSAoKSA9PiB7XG4gIGxldCByYW5kb21EZXNjcmlwdGlvbiA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGdldFJhbmRvbU51bWJlcigxLCA1KTsgaSsrKSB7XG4gICAgcmFuZG9tRGVzY3JpcHRpb24gKz0gZ2V0UmFuZG9tQXJyYXlFbGVtZW50KFNFTlRFTkNFUyk7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbURlc2NyaXB0aW9uO1xufTtcbmNvbnN0IGdldFJhbmRvbURlc3RpbmF0aW9uID0gaWQgPT4ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHtcbiAgICAnaWQnOiBgJHtpZH1mYTVjYjc1LWExZmUtNGI3Ny1hODNjLTBlNTI4ZTkxMGUwNGAsXG4gICAgJ2Rlc2NyaXB0aW9uJzogZ2V0UmFuZG9tRGVzY3JpcHRpb24oKSxcbiAgICAnbmFtZSc6IENJVElFU1tpZF0sXG4gICAgJ3BpY3R1cmVzJzogW3tcbiAgICAgICdzcmMnOiBgaHR0cHM6Ly9sb3JlbWZsaWNrci5jb20vMjQ4LzE1Mj9yYW5kb209JHtnZXRSYW5kb21OdW1iZXIoMSwgMTAwKX1gLFxuICAgICAgJ2Rlc2NyaXB0aW9uJzogZ2V0UmFuZG9tRGVzY3JpcHRpb24oKVxuICAgIH1dXG4gIH07XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn07XG5jb25zdCBnZXRSYW5kb21EZXN0aW5hdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IGRlc3RpbmF0aW9ucyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IENJVElFUy5sZW5ndGg7IGkrKykge1xuICAgIGRlc3RpbmF0aW9ucy5wdXNoKGdldFJhbmRvbURlc3RpbmF0aW9uKGkpKTtcbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb25zO1xufTtcbmV4cG9ydCB7IGdldFJhbmRvbURlc3RpbmF0aW9ucyB9OyIsImltcG9ydCB7IGdldFJhbmRvbUV2ZW50cyB9IGZyb20gJy4uL21vY2svZXZlbnRzJztcbmltcG9ydCB7IGdldFJhbmRvbU9mZmVycyB9IGZyb20gJy4uL21vY2svb2ZmZXJzJztcbmltcG9ydCB7IGdldFJhbmRvbURlc3RpbmF0aW9ucyB9IGZyb20gJy4uL21vY2svZGVzdGluYXRpb25zJztcbmltcG9ydCB7IGNvbnZlcnRLZXlzVG9DYW1lbENhc2UgfSBmcm9tICcuLi91dGlscy9jb21tb24nO1xuY29uc3QgRVZFTlRTX0NPVU5UID0gNTtcbmNvbnN0IGNyZWF0ZVVzZXJFdmVudHMgPSAoKSA9PiB7XG4gIGNvbnN0IG9mZmVyc0xpc3QgPSBjb252ZXJ0S2V5c1RvQ2FtZWxDYXNlKGdldFJhbmRvbU9mZmVycygpKTtcbiAgY29uc3QgZGVzdGluYXRpb25zTGlzdCA9IGNvbnZlcnRLZXlzVG9DYW1lbENhc2UoZ2V0UmFuZG9tRGVzdGluYXRpb25zKCkpO1xuICBjb25zdCBldmVudHNMaXN0ID0gY29udmVydEtleXNUb0NhbWVsQ2FzZShnZXRSYW5kb21FdmVudHMoRVZFTlRTX0NPVU5ULCBkZXN0aW5hdGlvbnNMaXN0KSk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uc01hcCA9IG5ldyBNYXAoZGVzdGluYXRpb25zTGlzdC5tYXAoZGVzdGluYXRpb24gPT4gW2Rlc3RpbmF0aW9uLmlkLCBkZXN0aW5hdGlvbl0pKTtcbiAgY29uc3Qgb2ZmZXJzID0gb2ZmZXJzTGlzdFswXS5vZmZlcnM7XG4gIGNvbnN0IG1lcmdlZEV2ZW50cyA9IGV2ZW50c0xpc3QubWFwKGV2ZW50ID0+IHtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSBkZXN0aW5hdGlvbnNNYXAuZ2V0KGV2ZW50LmRlc3RpbmF0aW9uKTtcbiAgICBjb25zdCBvZmZlcnNEYXRhID0gZXZlbnQub2ZmZXJzLm1hcChvZmZlcklkID0+IG9mZmVycy5maW5kKG9mZmVyID0+IG9mZmVyLmlkID09PSBvZmZlcklkKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgIGlkOiBkZXN0aW5hdGlvbkRhdGEuaWQsXG4gICAgICAgIG5hbWU6IGRlc3RpbmF0aW9uRGF0YS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzdGluYXRpb25EYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICBwaWN0dXJlczogZGVzdGluYXRpb25EYXRhLnBpY3R1cmVzXG4gICAgICB9LFxuICAgICAgb2ZmZXJzOiBvZmZlcnNEYXRhXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBNYXAobWVyZ2VkRXZlbnRzLm1hcChldmVudCA9PiBbZXZlbnQuaWQsIGV2ZW50XSkpLnZhbHVlcygpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudHNDb25uZWN0b3Ige1xuICBnZXQgdXNlckV2ZW50cygpIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNyZWF0ZVVzZXJFdmVudHMoKSk7XG4gIH1cbn0iLCJpbXBvcnQgRXZlbnRzQ29ubmVjdG9yIGZyb20gJy4vZXZlbnRzLWNvbm5lY3Rvcic7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudHNNb2RlbCB7XG4gICNFdmVudHNDb25uZWN0b3IgPSBuZXcgRXZlbnRzQ29ubmVjdG9yKCk7XG4gICNldmVudHNMaXN0ID0gdGhpcy4jRXZlbnRzQ29ubmVjdG9yLnVzZXJFdmVudHM7XG4gIGdldCB1c2VyRXZlbnRzKCkge1xuICAgIHJldHVybiB0aGlzLiNldmVudHNMaXN0O1xuICB9XG59IiwiaW1wb3J0IEFic3RyYWN0VmlldyBmcm9tICcuLi9mcmFtZXdvcmsvdmlldy9hYnN0cmFjdC12aWV3JztcbmZ1bmN0aW9uIGNyZWF0ZU5ld1RyaXBJbmZvVGVtcGxhdGUoKSB7XG4gIHJldHVybiBgPHNlY3Rpb24gY2xhc3M9XCJ0cmlwLW1haW5fX3RyaXAtaW5mbyAgdHJpcC1pbmZvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpcC1pbmZvX19tYWluXCI+XG4gICAgICAgICAgICAgIDxoMSBjbGFzcz1cInRyaXAtaW5mb19fdGl0bGVcIj5BbXN0ZXJkYW0gJm1kYXNoOyBDaGFtb25peCAmbWRhc2g7IEdlbmV2YTwvaDE+XG5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0cmlwLWluZm9fX2RhdGVzXCI+MTgmbmJzcDsmbWRhc2g7Jm5ic3A7MjAgTWFyPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidHJpcC1pbmZvX19jb3N0XCI+XG4gICAgICAgICAgICAgIFRvdGFsOiAmZXVybzsmbmJzcDs8c3BhbiBjbGFzcz1cInRyaXAtaW5mb19fY29zdC12YWx1ZVwiPjEyMzA8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9zZWN0aW9uPmA7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXdUcmlwSW5mb1ZpZXcgZXh0ZW5kcyBBYnN0cmFjdFZpZXcge1xuICBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU5ld1RyaXBJbmZvVGVtcGxhdGUoKTtcbiAgfVxufSIsImltcG9ydCBBYnN0cmFjdFZpZXcgZnJvbSAnLi4vZnJhbWV3b3JrL3ZpZXcvYWJzdHJhY3Qtdmlldyc7XG5jb25zdCBjcmVhdGVGaWx0ZXJJdGVtVGVtcGxhdGUgPSAoZmlsdGVyLCBpc0NoZWNrZWQpID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgY291bnRcbiAgfSA9IGZpbHRlcjtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwidHJpcC1maWx0ZXJzX19maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXItJHt0eXBlfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaXAtZmlsdGVyc19fZmlsdGVyLWlucHV0IHZpc3VhbGx5LWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInRyaXAtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0eXBlfVwiXG4gICAgICAgICAgICAgICAgICAke2lzQ2hlY2tlZCA/ICdjaGVja2VkJyA6ICcnfVxuICAgICAgICAgICAgICAgICAgJHtjb3VudCA9PT0gMCA/ICdkaXNhYmxlZCcgOiAnJ30+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0cmlwLWZpbHRlcnNfX2ZpbHRlci1sYWJlbFwiIGZvcj1cImZpbHRlci0ke3R5cGV9XCI+JHt0eXBlfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbn07XG5jb25zdCBjcmVhdGVOZXdUcmlwRmlsdGVyc1RlbXBsYXRlID0gZmlsdGVySXRlbXMgPT4ge1xuICBjb25zdCBmaWx0ZXJJdGVtc1RlbXBsYXRlID0gZmlsdGVySXRlbXMubWFwKChmaWx0ZXIsIGluZGV4KSA9PiBjcmVhdGVGaWx0ZXJJdGVtVGVtcGxhdGUoZmlsdGVyLCBpbmRleCA9PT0gMCkpLmpvaW4oJycpO1xuICByZXR1cm4gYDxmb3JtIGNsYXNzPVwidHJpcC1maWx0ZXJzXCIgYWN0aW9uPVwiI1wiIG1ldGhvZD1cImdldFwiPlxuICAke2ZpbHRlckl0ZW1zVGVtcGxhdGV9XG4gIDxidXR0b24gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIiB0eXBlPVwic3VibWl0XCI+QWNjZXB0IGZpbHRlcjwvYnV0dG9uPjwvZm9ybT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ld1RyaXBGaWx0ZXJzVmlldyBleHRlbmRzIEFic3RyYWN0VmlldyB7XG4gICNmaWx0ZXJzID0gbnVsbDtcbiAgY29uc3RydWN0b3IoZmlsdGVycykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jZmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cbiAgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBjcmVhdGVOZXdUcmlwRmlsdGVyc1RlbXBsYXRlKHRoaXMuI2ZpbHRlcnMuZmlsdGVycyk7XG4gIH1cbn0iLCJpbXBvcnQgQWJzdHJhY3RWaWV3IGZyb20gJy4uL2ZyYW1ld29yay92aWV3L2Fic3RyYWN0LXZpZXcnO1xuaW1wb3J0IHsgU29ydFR5cGUgfSBmcm9tICcuLi9jb25zdCc7XG5mdW5jdGlvbiBjcmVhdGVOZXdUcmlwU29ydFRlbXBsYXRlKCkge1xuICByZXR1cm4gYDxmb3JtIGNsYXNzPVwidHJpcC1ldmVudHNfX3RyaXAtc29ydCAgdHJpcC1zb3J0XCIgYWN0aW9uPVwiI1wiIG1ldGhvZD1cImdldFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyaXAtc29ydF9faXRlbSAgdHJpcC1zb3J0X19pdGVtLS1kYXlcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwic29ydC1kYXlcIiBjbGFzcz1cInRyaXAtc29ydF9faW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0cmlwLXNvcnRcIiB2YWx1ZT1cInNvcnQtZGF5XCIgY2hlY2tlZD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidHJpcC1zb3J0X19idG5cIiBmb3I9XCJzb3J0LWRheVwiIGRhdGEtc29ydC10eXBlPVwiJHtTb3J0VHlwZS5ERUZBVUxUfVwiPkRheTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyaXAtc29ydF9faXRlbSAgdHJpcC1zb3J0X19pdGVtLS1ldmVudFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJzb3J0LWV2ZW50XCIgY2xhc3M9XCJ0cmlwLXNvcnRfX2lucHV0ICB2aXN1YWxseS1oaWRkZW5cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwidHJpcC1zb3J0XCIgdmFsdWU9XCJzb3J0LWV2ZW50XCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRyaXAtc29ydF9fYnRuXCIgZm9yPVwic29ydC1ldmVudFwiPkV2ZW50PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpcC1zb3J0X19pdGVtICB0cmlwLXNvcnRfX2l0ZW0tLXRpbWVcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwic29ydC10aW1lXCIgY2xhc3M9XCJ0cmlwLXNvcnRfX2lucHV0ICB2aXN1YWxseS1oaWRkZW5cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwidHJpcC1zb3J0XCIgdmFsdWU9XCJzb3J0LXRpbWVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidHJpcC1zb3J0X19idG5cIiBmb3I9XCJzb3J0LXRpbWVcIiBkYXRhLXNvcnQtdHlwZT1cIiR7U29ydFR5cGUuVElNRX1cIj5UaW1lPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpcC1zb3J0X19pdGVtICB0cmlwLXNvcnRfX2l0ZW0tLXByaWNlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInNvcnQtcHJpY2VcIiBjbGFzcz1cInRyaXAtc29ydF9faW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0cmlwLXNvcnRcIiB2YWx1ZT1cInNvcnQtcHJpY2VcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidHJpcC1zb3J0X19idG5cIiBmb3I9XCJzb3J0LXByaWNlXCIgZGF0YS1zb3J0LXR5cGU9XCIke1NvcnRUeXBlLlBSSUNFfVwiPlByaWNlPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpcC1zb3J0X19pdGVtICB0cmlwLXNvcnRfX2l0ZW0tLW9mZmVyXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInNvcnQtb2ZmZXJcIiBjbGFzcz1cInRyaXAtc29ydF9faW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0cmlwLXNvcnRcIiB2YWx1ZT1cInNvcnQtb2ZmZXJcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidHJpcC1zb3J0X19idG5cIiBmb3I9XCJzb3J0LW9mZmVyXCI+T2ZmZXJzPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5gO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmV3VHJpcFNvcnRWaWV3IGV4dGVuZHMgQWJzdHJhY3RWaWV3IHtcbiAgI2hhbmRsZVNvcnRUeXBlQ2hhbmdlID0gbnVsbDtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG9uU29ydFR5cGVDaGFuZ2VcbiAgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jaGFuZGxlU29ydFR5cGVDaGFuZ2UgPSBvblNvcnRUeXBlQ2hhbmdlO1xuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuI3NvcnRUeXBlQ2hhbmdlSGFuZGxlcik7XG4gIH1cbiAgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBjcmVhdGVOZXdUcmlwU29ydFRlbXBsYXRlKCk7XG4gIH1cbiAgI3NvcnRUeXBlQ2hhbmdlSGFuZGxlciA9IGV2dCA9PiB7XG4gICAgaWYgKGV2dC50YXJnZXQudGFnTmFtZSAhPT0gJ0xBQkVMJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNoYW5kbGVTb3J0VHlwZUNoYW5nZShldnQudGFyZ2V0LmRhdGFzZXQuc29ydFR5cGUpO1xuICB9O1xufSIsImltcG9ydCBBYnN0cmFjdFZpZXcgZnJvbSAnLi4vZnJhbWV3b3JrL3ZpZXcvYWJzdHJhY3Qtdmlldyc7XG5mdW5jdGlvbiBjcmVhdGVOZXdUcmlwRXZlbnRzTGlzdFRlbXBsYXRlKCkge1xuICByZXR1cm4gJzx1bCBjbGFzcz1cInRyaXAtZXZlbnRzX19saXN0XCI+PC91bD4nO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmV3RXZlbnRzTGlzdFZpZXcgZXh0ZW5kcyBBYnN0cmFjdFZpZXcge1xuICBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU5ld1RyaXBFdmVudHNMaXN0VGVtcGxhdGUoKTtcbiAgfVxufSIsImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5jb25zdCBodW1hbml6ZUR1ZURhdGUgPSAoZHVlRGF0ZSwgZGF0ZUZvcm1hdCkgPT4gZHVlRGF0ZSA/IGRheWpzKGR1ZURhdGUpLmZvcm1hdChkYXRlRm9ybWF0KSA6ICcnO1xuY29uc3QgaXNFdmVudEZ1dHVyZSA9IGRhdGVGcm9tID0+IGRhdGVGcm9tICYmIGRheWpzKCkuaXNBZnRlcihkYXRlRnJvbSwgJ0QnKTtcbmNvbnN0IGlzRXZlbnRQcmVzZW50ID0gKGRhdGVGcm9tLCBkYXRlVG8pID0+IHtcbiAgY29uc3Qgbm93ID0gZGF5anMoKTtcbiAgcmV0dXJuIGRhdGVGcm9tICYmIGRhdGVUbyAmJiBub3cuaXNBZnRlcihkYXRlRnJvbSwgJ0QnKSAmJiBub3cuaXNCZWZvcmUoZGF0ZVRvLCAnRCcpIHx8IG5vdy5pc1NhbWUoZGF0ZVRvLCAnRCcpO1xufTtcbmNvbnN0IGlzRXZlbnRQYXN0ID0gZGF0ZVRvID0+IGRhdGVUbyAmJiBkYXlqcygpLmlzQWZ0ZXIoZGF0ZVRvLCAnRCcpO1xuY29uc3Qgc29ydEV2ZW50c1ByaWNlID0gKGV2ZW50QSwgZXZlbnRCKSA9PiBldmVudEIuYmFzZVByaWNlIC0gZXZlbnRBLmJhc2VQcmljZTtcbmNvbnN0IHNvcnRFdmVudHNUaW1lID0gKGV2ZW50QSwgZXZlbnRCKSA9PiB7XG4gIGNvbnN0IGRhdGVGcm9tQSA9IGRheWpzKGV2ZW50QS5kYXRlRnJvbSk7XG4gIGNvbnN0IGRhdGVUb0EgPSBkYXlqcyhldmVudEEuZGF0ZVRvKTtcbiAgY29uc3QgZGF0ZUZyb21CID0gZGF5anMoZXZlbnRCLmRhdGVGcm9tKTtcbiAgY29uc3QgZGF0ZVRvQiA9IGRheWpzKGV2ZW50Qi5kYXRlVG8pO1xuICBjb25zdCBkdXJhdGlvbkEgPSBkYXRlVG9BLmRpZmYoZGF0ZUZyb21BKTtcbiAgY29uc3QgZHVyYXRpb25CID0gZGF0ZVRvQi5kaWZmKGRhdGVGcm9tQik7XG4gIHJldHVybiBkdXJhdGlvbkIgLSBkdXJhdGlvbkE7XG59O1xuZXhwb3J0IHsgaHVtYW5pemVEdWVEYXRlLCBpc0V2ZW50RnV0dXJlLCBpc0V2ZW50UHJlc2VudCwgaXNFdmVudFBhc3QsIHNvcnRFdmVudHNQcmljZSwgc29ydEV2ZW50c1RpbWUgfTsiLCJpbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IEFic3RyYWN0VmlldyBmcm9tICcuLi9mcmFtZXdvcmsvdmlldy9hYnN0cmFjdC12aWV3JztcbmltcG9ydCB7IGh1bWFuaXplRHVlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2V2ZW50JztcbmNvbnN0IFRJTUVfUEFUVEVSTiA9ICdoaDptbSc7XG5jb25zdCBIVU1BTklaRURfRVZFTlRfREFURV9QQVRURVJOID0gJ01NTSBERCc7XG5jb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICh0aW1lU3RhcnQsIHRpbWVFbmQpID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBkYXlqcyh0aW1lU3RhcnQpO1xuICBjb25zdCBlbmQgPSBkYXlqcyh0aW1lRW5kKTtcbiAgY29uc3QgZGlmZmVyZW5jZUluRGF5cyA9IGVuZC5kaWZmKHN0YXJ0LCAnZGF5Jyk7XG4gIGNvbnN0IGRpZmZlcmVuY2VJbkhvdXJzID0gZW5kLmRpZmYoc3RhcnQsICdob3VyJykgJSAyNDtcbiAgY29uc3QgZGlmZmVyZW5jZUluTWludXRlcyA9IGVuZC5kaWZmKHN0YXJ0LCAnbWludXRlJykgJSA2MDtcbiAgaWYgKGRpZmZlcmVuY2VJbkRheXMgPiAwKSB7XG4gICAgcmV0dXJuIGAke1N0cmluZyhkaWZmZXJlbmNlSW5EYXlzKS5wYWRTdGFydCgyLCAnMCcpfUQgJHtTdHJpbmcoZGlmZmVyZW5jZUluSG91cnMpLnBhZFN0YXJ0KDIsICcwJyl9SCAke1N0cmluZyhkaWZmZXJlbmNlSW5NaW51dGVzKS5wYWRTdGFydCgyLCAnMCcpfU1gO1xuICB9IGVsc2UgaWYgKGRpZmZlcmVuY2VJbkhvdXJzID4gMCkge1xuICAgIHJldHVybiBgJHtTdHJpbmcoZGlmZmVyZW5jZUluSG91cnMpLnBhZFN0YXJ0KDIsICcwJyl9SCAke1N0cmluZyhkaWZmZXJlbmNlSW5NaW51dGVzKS5wYWRTdGFydCgyLCAnMCcpfU1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHtTdHJpbmcoZGlmZmVyZW5jZUluTWludXRlcykucGFkU3RhcnQoMiwgJzAnKX1NYDtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU5ld09mZmVyID0gb2ZmZXIgPT4ge1xuICBjb25zdCB7XG4gICAgdGl0bGUsXG4gICAgcHJpY2VcbiAgfSA9IG9mZmVyO1xuICByZXR1cm4gYDxsaSBjbGFzcz1cImV2ZW50X19vZmZlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV2ZW50X19vZmZlci10aXRsZVwiPiR7dGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAmcGx1czsmZXVybzsmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJldmVudF9fb2ZmZXItcHJpY2VcIj4ke3ByaWNlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGk+YDtcbn07XG5jb25zdCBjcmVhdGVPZmZlcnMgPSBvZmZlcnMgPT4ge1xuICBsZXQgb2ZmZXJzSFRNTCA9ICcnO1xuICBvZmZlcnMuZm9yRWFjaChvZmZlciA9PiB7XG4gICAgb2ZmZXJzSFRNTCArPSBjcmVhdGVOZXdPZmZlcihvZmZlcik7XG4gIH0pO1xuICByZXR1cm4gb2ZmZXJzSFRNTDtcbn07XG5jb25zdCBjcmVhdGVOZXdUcmlwRXZlbnRzSXRlbVRlbXBsYXRlID0gZXZlbnREYXRhID0+IHtcbiAgY29uc3Qge1xuICAgIGJhc2VQcmljZSxcbiAgICBkYXRlRnJvbSxcbiAgICBkYXRlVG8sXG4gICAgaXNGYXZvcml0ZSxcbiAgICB0eXBlLFxuICAgIG9mZmVycyxcbiAgICBkZXN0aW5hdGlvblxuICB9ID0gZXZlbnREYXRhO1xuICBjb25zdCBmYXZvcml0ZUJ1dHRvbkNsYXNzTmFtZSA9IGlzRmF2b3JpdGUgPyAnZXZlbnRfX2Zhdm9yaXRlLWJ0bi0tYWN0aXZlJyA6ICcnO1xuICBjb25zdCBodW1hbml6ZWRFdmVudERhdGUgPSBodW1hbml6ZUR1ZURhdGUoZGF0ZUZyb20sIEhVTUFOSVpFRF9FVkVOVF9EQVRFX1BBVFRFUk4pO1xuICBjb25zdCBodW1hbml6ZWRTdGFydFRpbWUgPSBodW1hbml6ZUR1ZURhdGUoZGF0ZUZyb20sIFRJTUVfUEFUVEVSTik7XG4gIGNvbnN0IGh1bWFuaXplZEVuZFRpbWUgPSBodW1hbml6ZUR1ZURhdGUoZGF0ZVRvLCBUSU1FX1BBVFRFUk4pO1xuICByZXR1cm4gYDxsaSBjbGFzcz1cInRyaXAtZXZlbnRzX19pdGVtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudFwiPlxuICAgICAgICAgICAgICAgIDx0aW1lIGNsYXNzPVwiZXZlbnRfX2RhdGVcIiBkYXRldGltZT1cIiR7ZGF0ZUZyb219XCI+JHtodW1hbml6ZWRFdmVudERhdGV9PC90aW1lPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImV2ZW50X190eXBlLWljb25cIiB3aWR0aD1cIjQyXCIgaGVpZ2h0PVwiNDJcIiBzcmM9XCJpbWcvaWNvbnMvJHt0eXBlfS5wbmdcIiBhbHQ9XCJFdmVudCB0eXBlIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJldmVudF9fdGl0bGVcIj4ke3R5cGV9ICR7ZGVzdGluYXRpb24ubmFtZX08L2gzPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fc2NoZWR1bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZXZlbnRfX3RpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRpbWUgY2xhc3M9XCJldmVudF9fc3RhcnQtdGltZVwiIGRhdGV0aW1lPVwiJHtkYXRlRnJvbX1cIj4ke2h1bWFuaXplZFN0YXJ0VGltZX08L3RpbWU+XG4gICAgICAgICAgICAgICAgICAgICZtZGFzaDtcbiAgICAgICAgICAgICAgICAgICAgPHRpbWUgY2xhc3M9XCJldmVudF9fZW5kLXRpbWVcIiBkYXRldGltZT1cIiR7ZGF0ZVRvfVwiPiR7aHVtYW5pemVkRW5kVGltZX08L3RpbWU+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImV2ZW50X19kdXJhdGlvblwiPiR7Z2V0VGltZURpZmZlcmVuY2UoZGF0ZUZyb20sIGRhdGVUbyl9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZXZlbnRfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAmZXVybzsmbmJzcDs8c3BhbiBjbGFzcz1cImV2ZW50X19wcmljZS12YWx1ZVwiPiR7YmFzZVByaWNlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+T2ZmZXJzOjwvaDQ+XG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZXZlbnRfX3NlbGVjdGVkLW9mZmVyc1wiPlxuICAgICAgICAgICAgICAgICR7Y3JlYXRlT2ZmZXJzKG9mZmVycyl9XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZXZlbnRfX2Zhdm9yaXRlLWJ0biAke2Zhdm9yaXRlQnV0dG9uQ2xhc3NOYW1lfVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+QWRkIHRvIGZhdm9yaXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImV2ZW50X19mYXZvcml0ZS1pY29uXCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjI4XCIgdmlld0JveD1cIjAgMCAyOCAyOFwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDIxbC04LjIyODk5IDQuMzI2MiAxLjU3MTU5LTkuMTYzMUwuNjg1MjA5IDkuNjczNzYgOS44ODU1IDguMzM2ODggMTQgMGw0LjExNDUgOC4zMzY4OCA5LjIwMDMgMS4zMzY4OC02LjY1NzQgNi40ODkzNCAxLjU3MTYgOS4xNjMxTDE0IDIxelwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImV2ZW50X19yb2xsdXAtYnRuXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5PcGVuIGV2ZW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ld0V2ZW50c0l0ZW1WaWV3IGV4dGVuZHMgQWJzdHJhY3RWaWV3IHtcbiAgI2V2ZW50RGF0YSA9IG51bGw7XG4gICNoYW5kbGVDbGljayA9IG51bGw7XG4gICNyb2xsdXBCdXR0b24gPSBudWxsO1xuICAjaGFuZGxlRmF2b3JpdGVDbGljayA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB1c2VyRXZlbnQsXG4gICAgb25DbGljayxcbiAgICBvbkZhdm9yaXRlQ2xpY2tcbiAgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jZXZlbnREYXRhID0gdXNlckV2ZW50O1xuICAgIHRoaXMuI2hhbmRsZUNsaWNrID0gb25DbGljaztcbiAgICB0aGlzLiNoYW5kbGVGYXZvcml0ZUNsaWNrID0gb25GYXZvcml0ZUNsaWNrO1xuICAgIHRoaXMuI3JvbGx1cEJ1dHRvbiA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfX3JvbGx1cC1idG4nKTtcbiAgICB0aGlzLiNyb2xsdXBCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLiNjbGlja0hhbmRsZXIpO1xuICAgIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfX2Zhdm9yaXRlLWljb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuI2Zhdm9yaXRlQ2xpY2tIYW5kbGVyKTtcbiAgfVxuICBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU5ld1RyaXBFdmVudHNJdGVtVGVtcGxhdGUodGhpcy4jZXZlbnREYXRhKTtcbiAgfVxuICAjY2xpY2tIYW5kbGVyID0gZXZ0ID0+IHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNoYW5kbGVDbGljaygpO1xuICB9O1xuICByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLiNyb2xsdXBCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLiNjbGlja0hhbmRsZXIpO1xuICB9XG4gICNmYXZvcml0ZUNsaWNrSGFuZGxlciA9IGV2dCA9PiB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jaGFuZGxlRmF2b3JpdGVDbGljaygpO1xuICB9O1xufSIsImltcG9ydCBBYnN0cmFjdFZpZXcgZnJvbSAnLi4vZnJhbWV3b3JrL3ZpZXcvYWJzdHJhY3Qtdmlldyc7XG5pbXBvcnQgeyBodW1hbml6ZUR1ZURhdGUgfSBmcm9tICcuLi91dGlscy9ldmVudCc7XG5jb25zdCBUSU1FX1BBVFRFUk4gPSAnREQvTU0vWVkgaGg6bW0nO1xuY29uc3QgY3JlYXRlTmV3T2ZmZXIgPSBvZmZlciA9PiB7XG4gIGNvbnN0IHtcbiAgICB0aXRsZSxcbiAgICBwcmljZVxuICB9ID0gb2ZmZXI7XG4gIHJldHVybiBgPGRpdiBjbGFzcz1cImV2ZW50X19vZmZlci1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZXZlbnRfX29mZmVyLWNoZWNrYm94ICB2aXN1YWxseS1oaWRkZW5cIiBpZD1cImV2ZW50LW9mZmVyLWx1Z2dhZ2UtMVwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJldmVudC1vZmZlci1sdWdnYWdlXCIgY2hlY2tlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImV2ZW50X19vZmZlci1sYWJlbFwiIGZvcj1cImV2ZW50LW9mZmVyLWx1Z2dhZ2UtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV2ZW50X19vZmZlci10aXRsZVwiPiR7dGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAmcGx1czsmZXVybzsmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJldmVudF9fb2ZmZXItcHJpY2VcIj4ke3ByaWNlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcbn07XG5jb25zdCBjcmVhdGVPZmZlcnMgPSBvZmZlcnMgPT4ge1xuICBsZXQgb2ZmZXJzSFRNTCA9ICcnO1xuICBvZmZlcnMuZm9yRWFjaChvZmZlciA9PiB7XG4gICAgb2ZmZXJzSFRNTCArPSBjcmVhdGVOZXdPZmZlcihvZmZlcik7XG4gIH0pO1xuICByZXR1cm4gb2ZmZXJzSFRNTDtcbn07XG5jb25zdCBjcmVhdGVOZXdFdmVudEVkaXRFbGVtZW50VGVtcGxhdGUgPSBldmVudERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgYmFzZVByaWNlLFxuICAgIGRhdGVGcm9tLFxuICAgIGRhdGVUbyxcbiAgICB0eXBlLFxuICAgIG9mZmVycyxcbiAgICBkZXN0aW5hdGlvblxuICB9ID0gZXZlbnREYXRhO1xuICBjb25zdCBkYXRlU3RhcnQgPSBodW1hbml6ZUR1ZURhdGUoZGF0ZUZyb20sIFRJTUVfUEFUVEVSTik7XG4gIGNvbnN0IGRhdGVFbmQgPSBodW1hbml6ZUR1ZURhdGUoZGF0ZVRvLCBUSU1FX1BBVFRFUk4pO1xuICByZXR1cm4gYDxsaSBjbGFzcz1cInRyaXAtZXZlbnRzX19pdGVtXCI+XG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZXZlbnQgZXZlbnQtLWVkaXRcIiBhY3Rpb249XCIjXCIgbWV0aG9kPVwicG9zdFwiPlxuICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJldmVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX3R5cGUtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJldmVudF9fdHlwZSAgZXZlbnRfX3R5cGUtYnRuXCIgZm9yPVwiZXZlbnQtdHlwZS10b2dnbGUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+Q2hvb3NlIGV2ZW50IHR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImV2ZW50X190eXBlLWljb25cIiB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiBzcmM9XCJpbWcvaWNvbnMvJHt0eXBlfS5wbmdcIiBhbHQ9XCJFdmVudCB0eXBlIGljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZXZlbnRfX3R5cGUtdG9nZ2xlICB2aXN1YWxseS1oaWRkZW5cIiBpZD1cImV2ZW50LXR5cGUtdG9nZ2xlLTFcIiB0eXBlPVwiY2hlY2tib3hcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX3R5cGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImV2ZW50X190eXBlLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+RXZlbnQgdHlwZTwvbGVnZW5kPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX3R5cGUtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJldmVudC10eXBlLXRheGktMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJ0YXhpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImV2ZW50X190eXBlLWxhYmVsICBldmVudF9fdHlwZS1sYWJlbC0tdGF4aVwiIGZvcj1cImV2ZW50LXR5cGUtdGF4aS0xXCI+VGF4aTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50X190eXBlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZXZlbnQtdHlwZS1idXMtMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJidXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZXZlbnRfX3R5cGUtbGFiZWwgIGV2ZW50X190eXBlLWxhYmVsLS1idXNcIiBmb3I9XCJldmVudC10eXBlLWJ1cy0xXCI+QnVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX3R5cGUtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJldmVudC10eXBlLXRyYWluLTFcIiBjbGFzcz1cImV2ZW50X190eXBlLWlucHV0ICB2aXN1YWxseS1oaWRkZW5cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZXZlbnQtdHlwZVwiIHZhbHVlPVwidHJhaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZXZlbnRfX3R5cGUtbGFiZWwgIGV2ZW50X190eXBlLWxhYmVsLS10cmFpblwiIGZvcj1cImV2ZW50LXR5cGUtdHJhaW4tMVwiPlRyYWluPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX3R5cGUtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJldmVudC10eXBlLXNoaXAtMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJzaGlwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImV2ZW50X190eXBlLWxhYmVsICBldmVudF9fdHlwZS1sYWJlbC0tc2hpcFwiIGZvcj1cImV2ZW50LXR5cGUtc2hpcC0xXCI+U2hpcDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50X190eXBlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZXZlbnQtdHlwZS1kcml2ZS0xXCIgY2xhc3M9XCJldmVudF9fdHlwZS1pbnB1dCAgdmlzdWFsbHktaGlkZGVuXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImV2ZW50LXR5cGVcIiB2YWx1ZT1cImRyaXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImV2ZW50X190eXBlLWxhYmVsICBldmVudF9fdHlwZS1sYWJlbC0tZHJpdmVcIiBmb3I9XCJldmVudC10eXBlLWRyaXZlLTFcIj5Ecml2ZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50X190eXBlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZXZlbnQtdHlwZS1mbGlnaHQtMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJmbGlnaHRcIiBjaGVja2VkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJldmVudF9fdHlwZS1sYWJlbCAgZXZlbnRfX3R5cGUtbGFiZWwtLWZsaWdodFwiIGZvcj1cImV2ZW50LXR5cGUtZmxpZ2h0LTFcIj5GbGlnaHQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fdHlwZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImV2ZW50LXR5cGUtY2hlY2staW4tMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJjaGVjay1pblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJldmVudF9fdHlwZS1sYWJlbCAgZXZlbnRfX3R5cGUtbGFiZWwtLWNoZWNrLWluXCIgZm9yPVwiZXZlbnQtdHlwZS1jaGVjay1pbi0xXCI+Q2hlY2staW48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fdHlwZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImV2ZW50LXR5cGUtc2lnaHRzZWVpbmctMVwiIGNsYXNzPVwiZXZlbnRfX3R5cGUtaW5wdXQgIHZpc3VhbGx5LWhpZGRlblwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJldmVudC10eXBlXCIgdmFsdWU9XCJzaWdodHNlZWluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJldmVudF9fdHlwZS1sYWJlbCAgZXZlbnRfX3R5cGUtbGFiZWwtLXNpZ2h0c2VlaW5nXCIgZm9yPVwiZXZlbnQtdHlwZS1zaWdodHNlZWluZy0xXCI+U2lnaHRzZWVpbmc8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fdHlwZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImV2ZW50LXR5cGUtcmVzdGF1cmFudC0xXCIgY2xhc3M9XCJldmVudF9fdHlwZS1pbnB1dCAgdmlzdWFsbHktaGlkZGVuXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImV2ZW50LXR5cGVcIiB2YWx1ZT1cInJlc3RhdXJhbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZXZlbnRfX3R5cGUtbGFiZWwgIGV2ZW50X190eXBlLWxhYmVsLS1yZXN0YXVyYW50XCIgZm9yPVwiZXZlbnQtdHlwZS1yZXN0YXVyYW50LTFcIj5SZXN0YXVyYW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fZmllbGQtZ3JvdXAgIGV2ZW50X19maWVsZC1ncm91cC0tZGVzdGluYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZXZlbnRfX2xhYmVsICBldmVudF9fdHlwZS1vdXRwdXRcIiBmb3I9XCJldmVudC1kZXN0aW5hdGlvbi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgJHt0eXBlfVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJldmVudF9faW5wdXQgIGV2ZW50X19pbnB1dC0tZGVzdGluYXRpb25cIiBpZD1cImV2ZW50LWRlc3RpbmF0aW9uLTFcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJldmVudC1kZXN0aW5hdGlvblwiIHZhbHVlPVwiJHtkZXN0aW5hdGlvbi5uYW1lfVwiIGxpc3Q9XCJkZXN0aW5hdGlvbi1saXN0LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRhdGFsaXN0IGlkPVwiZGVzdGluYXRpb24tbGlzdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFtc3RlcmRhbVwiPjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJHZW5ldmFcIj48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ2hhbW9uaXhcIj48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kYXRhbGlzdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRfX2ZpZWxkLWdyb3VwICBldmVudF9fZmllbGQtZ3JvdXAtLXRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCIgZm9yPVwiZXZlbnQtc3RhcnQtdGltZS0xXCI+RnJvbTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImV2ZW50X19pbnB1dCAgZXZlbnRfX2lucHV0LS10aW1lXCIgaWQ9XCJldmVudC1zdGFydC10aW1lLTFcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJldmVudC1zdGFydC10aW1lXCIgdmFsdWU9XCIke2RhdGVTdGFydH1cIj5cbiAgICAgICAgICAgICAgICAgICAgJm1kYXNoO1xuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIiBmb3I9XCJldmVudC1lbmQtdGltZS0xXCI+VG88L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJldmVudF9faW5wdXQgIGV2ZW50X19pbnB1dC0tdGltZVwiIGlkPVwiZXZlbnQtZW5kLXRpbWUtMVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImV2ZW50LWVuZC10aW1lXCIgdmFsdWU9XCIke2RhdGVFbmR9XCI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50X19maWVsZC1ncm91cCAgZXZlbnRfX2ZpZWxkLWdyb3VwLS1wcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJldmVudF9fbGFiZWxcIiBmb3I9XCJldmVudC1wcmljZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAmZXVybztcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZXZlbnRfX2lucHV0ICBldmVudF9faW5wdXQtLXByaWNlXCIgaWQ9XCJldmVudC1wcmljZS0xXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiZXZlbnQtcHJpY2VcIiB2YWx1ZT1cIiR7YmFzZVByaWNlfVwiPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJldmVudF9fc2F2ZS1idG4gIGJ0biAgYnRuLS1ibHVlXCIgdHlwZT1cInN1Ym1pdFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJldmVudF9fcmVzZXQtYnRuXCIgdHlwZT1cInJlc2V0XCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZXZlbnRfX3JvbGx1cC1idG5cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+T3BlbiBldmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZXZlbnRfX2RldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZXZlbnRfX3NlY3Rpb24gIGV2ZW50X19zZWN0aW9uLS1vZmZlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZXZlbnRfX3NlY3Rpb24tdGl0bGUgIGV2ZW50X19zZWN0aW9uLXRpdGxlLS1vZmZlcnNcIj5PZmZlcnM8L2gzPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudF9fYXZhaWxhYmxlLW9mZmVyc1wiPlxuICAgICAgICAgICAgICAgICAgICAke2NyZWF0ZU9mZmVycyhvZmZlcnMpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJldmVudF9fc2VjdGlvbiAgZXZlbnRfX3NlY3Rpb24tLWRlc3RpbmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImV2ZW50X19zZWN0aW9uLXRpdGxlICBldmVudF9fc2VjdGlvbi10aXRsZS0tZGVzdGluYXRpb25cIj5EZXN0aW5hdGlvbjwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZXZlbnRfX2Rlc3RpbmF0aW9uLWRlc2NyaXB0aW9uXCI+JHtkZXN0aW5hdGlvbi5kZXNjcmlwdGlvbn08L3A+XG4gICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2xpPmA7XG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmV3RXZlbnRFZGl0RWxlbWVudFZpZXcgZXh0ZW5kcyBBYnN0cmFjdFZpZXcge1xuICAjZXZlbnREYXRhID0gbnVsbDtcbiAgI2hhbmRsZUNsaWNrID0gbnVsbDtcbiAgI3JvbGx1cEJ1dHRvbiA9IG51bGw7XG4gICNoYW5kbGVTdWJtaXQgPSBudWxsO1xuICAjZm9ybUVsZW1lbnQgPSBudWxsO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdXNlckV2ZW50LFxuICAgIG9uQ2xpY2ssXG4gICAgb25TdWJtaXRcbiAgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jZXZlbnREYXRhID0gdXNlckV2ZW50O1xuICAgIHRoaXMuI2hhbmRsZUNsaWNrID0gb25DbGljaztcbiAgICB0aGlzLiNoYW5kbGVTdWJtaXQgPSBvblN1Ym1pdDtcbiAgICB0aGlzLiNyb2xsdXBCdXR0b24gPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLmV2ZW50X19yb2xsdXAtYnRuJyk7XG4gICAgdGhpcy4jcm9sbHVwQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy4jY2xpY2tIYW5kbGVyKTtcbiAgICB0aGlzLiNmb3JtRWxlbWVudCA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnQtLWVkaXQnKTtcbiAgICB0aGlzLiNmb3JtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLiNzdWJtaXRIYW5kbGVyKTtcbiAgfVxuICBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU5ld0V2ZW50RWRpdEVsZW1lbnRUZW1wbGF0ZSh0aGlzLiNldmVudERhdGEpO1xuICB9XG4gICNjbGlja0hhbmRsZXIgPSBldnQgPT4ge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2hhbmRsZUNsaWNrKHRoaXMuI2V2ZW50RGF0YSk7XG4gIH07XG4gICNzdWJtaXRIYW5kbGVyID0gZXZ0ID0+IHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNoYW5kbGVDbGljayh0aGlzLiNldmVudERhdGEpO1xuICB9O1xuICByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLiNyb2xsdXBCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLiNjbGlja0hhbmRsZXIpO1xuICAgIHRoaXMuI2Zvcm1FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuI3N1Ym1pdEhhbmRsZXIpO1xuICB9XG59IiwiaW1wb3J0IHsgcmVuZGVyLCByZXBsYWNlLCByZW1vdmUgfSBmcm9tICcuLi9mcmFtZXdvcmsvcmVuZGVyLmpzJztcbmltcG9ydCB7IGlzRXNjYXBlS2V5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uLmpzJztcbmltcG9ydCBOZXdFdmVudHNJdGVtVmlldyBmcm9tICcuLi92aWV3L25ldy1ldmVudHMtaXRlbS12aWV3LmpzJztcbmltcG9ydCBOZXdFdmVudEVkaXRFbGVtZW50VmlldyBmcm9tICcuLi92aWV3L25ldy1ldmVudC1lZGl0LWVsZW1lbnQtdmlldy5qcyc7XG5jb25zdCBNb2RlID0ge1xuICBERUZBVUxUOiAnREVGQVVMVCcsXG4gIEVESVRJTkc6ICdFRElUSU5HJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50UHJlc2VudGVyIHtcbiAgI2NvbnRhaW5lciA9IG51bGw7XG4gICNoYW5kbGVEYXRhQ2hhbmdlID0gbnVsbDtcbiAgI2hhbmRsZU1vZGVDaGFuZ2UgPSBudWxsO1xuICAjZXZlbnRDb21wb25lbnQgPSBudWxsO1xuICAjZXZlbnRFZGl0Q29tcG9uZW50ID0gbnVsbDtcbiAgI2V2ZW50SXRlbSA9IG51bGw7XG4gICNtb2RlID0gTW9kZS5ERUZBVUxUO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgY29udGFpbmVyLFxuICAgIG9uRGF0YUNoYW5nZSxcbiAgICBvbk1vZGVDaGFuZ2VcbiAgfSkge1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiNoYW5kbGVEYXRhQ2hhbmdlID0gb25EYXRhQ2hhbmdlO1xuICAgIHRoaXMuI2hhbmRsZU1vZGVDaGFuZ2UgPSBvbk1vZGVDaGFuZ2U7XG4gIH1cbiAgaW5pdChldmVudEl0ZW0pIHtcbiAgICB0aGlzLiNldmVudEl0ZW0gPSBldmVudEl0ZW07XG4gICAgY29uc3QgcHJldkV2ZW50Q29tcG9uZW50ID0gdGhpcy4jZXZlbnRDb21wb25lbnQ7XG4gICAgY29uc3QgcHJldkV2ZW50RWRpdENvbXBvbmVudCA9IHRoaXMuI2V2ZW50RWRpdENvbXBvbmVudDtcbiAgICB0aGlzLiNldmVudENvbXBvbmVudCA9IG5ldyBOZXdFdmVudHNJdGVtVmlldyh7XG4gICAgICB1c2VyRXZlbnQ6IHRoaXMuI2V2ZW50SXRlbSxcbiAgICAgIG9uQ2xpY2s6IHRoaXMuI2hhbmRsZUVkaXRDbGljayxcbiAgICAgIG9uRmF2b3JpdGVDbGljazogdGhpcy4jaGFuZGxlRmF2b3JpdGVDbGlja1xuICAgIH0pO1xuICAgIHRoaXMuI2V2ZW50RWRpdENvbXBvbmVudCA9IG5ldyBOZXdFdmVudEVkaXRFbGVtZW50Vmlldyh7XG4gICAgICB1c2VyRXZlbnQ6IHRoaXMuI2V2ZW50SXRlbSxcbiAgICAgIG9uQ2xpY2s6IHRoaXMuI2hhbmRsZVNhdmVDbGlja1xuICAgIH0pO1xuICAgIGlmIChwcmV2RXZlbnRDb21wb25lbnQgPT09IG51bGwgfHwgcHJldkV2ZW50RWRpdENvbXBvbmVudCA9PT0gbnVsbCkge1xuICAgICAgcmVuZGVyKHRoaXMuI2V2ZW50Q29tcG9uZW50LCB0aGlzLiNjb250YWluZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gTW9kZS5ERUZBVUxUKSB7XG4gICAgICByZXBsYWNlKHRoaXMuI2V2ZW50Q29tcG9uZW50LCBwcmV2RXZlbnRDb21wb25lbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gTW9kZS5FRElUSU5HKSB7XG4gICAgICByZXBsYWNlKHRoaXMuI2V2ZW50RWRpdENvbXBvbmVudCwgcHJldkV2ZW50RWRpdENvbXBvbmVudCk7XG4gICAgfVxuICAgIHJlbW92ZShwcmV2RXZlbnRDb21wb25lbnQpO1xuICAgIHJlbW92ZShwcmV2RXZlbnRFZGl0Q29tcG9uZW50KTtcbiAgfVxuICAjcmVwbGFjZUV2ZW50Q2FyZFRvRWRpdEZvcm0oKSB7XG4gICAgcmVwbGFjZSh0aGlzLiNldmVudEVkaXRDb21wb25lbnQsIHRoaXMuI2V2ZW50Q29tcG9uZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy4jZXNjS2V5RG93bkhhbmRsZXIpO1xuICAgIHRoaXMuI2hhbmRsZU1vZGVDaGFuZ2UoKTtcbiAgICB0aGlzLiNtb2RlID0gTW9kZS5FRElUSU5HO1xuICB9XG4gICNyZXBsYWNlRWRpdEZvcm1Ub0V2ZW50Q2FyZCgpIHtcbiAgICByZXBsYWNlKHRoaXMuI2V2ZW50Q29tcG9uZW50LCB0aGlzLiNldmVudEVkaXRDb21wb25lbnQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLiNlc2NLZXlEb3duSGFuZGxlcik7XG4gICAgdGhpcy4jbW9kZSA9IE1vZGUuREVGQVVMVDtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHJlbW92ZSh0aGlzLiNldmVudENvbXBvbmVudCk7XG4gICAgcmVtb3ZlKHRoaXMuI2V2ZW50RWRpdENvbXBvbmVudCk7XG4gIH1cbiAgcmVzZXRWaWV3KCkge1xuICAgIGlmICh0aGlzLiNtb2RlICE9PSBNb2RlLkRFRkFVTFQpIHtcbiAgICAgIHRoaXMuI3JlcGxhY2VFZGl0Rm9ybVRvRXZlbnRDYXJkKCk7XG4gICAgfVxuICB9XG4gICNlc2NLZXlEb3duSGFuZGxlciA9IGV2dCA9PiB7XG4gICAgaWYgKGlzRXNjYXBlS2V5KGV2dCkpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy4jcmVwbGFjZUVkaXRGb3JtVG9FdmVudENhcmQoKTtcbiAgICB9XG4gIH07XG4gICNoYW5kbGVFZGl0Q2xpY2sgPSAoKSA9PiB7XG4gICAgdGhpcy4jcmVwbGFjZUV2ZW50Q2FyZFRvRWRpdEZvcm0oKTtcbiAgfTtcbiAgI2hhbmRsZUZhdm9yaXRlQ2xpY2sgPSAoKSA9PiB7XG4gICAgdGhpcy4jaGFuZGxlRGF0YUNoYW5nZSh7XG4gICAgICAuLi50aGlzLiNldmVudEl0ZW0sXG4gICAgICBpc0Zhdm9yaXRlOiAhdGhpcy4jZXZlbnRJdGVtLmlzRmF2b3JpdGVcbiAgICB9KTtcbiAgfTtcbiAgI2hhbmRsZVNhdmVDbGljayA9IGV2ZW50SXRlbSA9PiB7XG4gICAgdGhpcy4jaGFuZGxlRGF0YUNoYW5nZShldmVudEl0ZW0pO1xuICAgIHRoaXMuI3JlcGxhY2VFZGl0Rm9ybVRvRXZlbnRDYXJkKCk7XG4gIH07XG59IiwiaW1wb3J0IEFic3RyYWN0VmlldyBmcm9tICcuLi9mcmFtZXdvcmsvdmlldy9hYnN0cmFjdC12aWV3JztcbmZ1bmN0aW9uIGNyZWF0ZU5vRXZlbnRzVmlld1RlbXBsYXRlKCkge1xuICByZXR1cm4gJzxwIGNsYXNzPVwidHJpcC1ldmVudHNfX21zZ1wiPkxvYWRpbmcuLi48L3A+Jztcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vRXZlbnRzVmlldyBleHRlbmRzIEFic3RyYWN0VmlldyB7XG4gIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlTm9FdmVudHNWaWV3VGVtcGxhdGUoKTtcbiAgfVxufSIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gJy4uL2ZyYW1ld29yay9yZW5kZXIuanMnO1xuaW1wb3J0IHsgdXBkYXRlSXRlbSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbi5qcyc7XG5pbXBvcnQgTmV3VHJpcFNvcnRWaWV3IGZyb20gJy4uL3ZpZXcvbmV3LXNvcnQtY29udGFpbmVyLXZpZXcuanMnO1xuaW1wb3J0IE5ld0V2ZW50c0xpc3RWaWV3IGZyb20gJy4uL3ZpZXcvbmV3LWV2ZW50cy1saXN0LXZpZXcuanMnO1xuaW1wb3J0IEV2ZW50UHJlc2VudGVyIGZyb20gJy4vZXZlbnQtcHJlc2VudGVyLmpzJztcbmltcG9ydCBOb0V2ZW50c1ZpZXcgZnJvbSAnLi4vdmlldy9uby1ldmVudHMtdmlldy5qcyc7XG5pbXBvcnQgeyBTb3J0VHlwZSB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IHNvcnRFdmVudHNQcmljZSwgc29ydEV2ZW50c1RpbWUgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2FyZFByZXNlbnRlciB7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjZXZlbnRzTW9kZWwgPSBudWxsO1xuICAjc29ydENvbXBvbmVudCA9IG51bGw7XG4gICNldmVudHNMaXN0Q29tcG9uZW50ID0gbmV3IE5ld0V2ZW50c0xpc3RWaWV3KCk7XG4gICNldmVudHNMaXN0ID0gW107XG4gICNldmVudFByZXNlbnRlcnMgPSBuZXcgTWFwKCk7XG4gICNjdXJyZW50U29ydFR5cGUgPSBTb3J0VHlwZS5ERUZBVUxUO1xuICAjc291cmNlZEJvYXJkRXZlbnRzID0gW107XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjb250YWluZXIsXG4gICAgZXZlbnRzTW9kZWxcbiAgfSkge1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiNldmVudHNNb2RlbCA9IGV2ZW50c01vZGVsO1xuICB9XG4gIGluaXQoKSB7XG4gICAgdGhpcy4jZXZlbnRzTGlzdCA9IFsuLi50aGlzLiNldmVudHNNb2RlbC51c2VyRXZlbnRzXTtcbiAgICB0aGlzLiNzb3VyY2VkQm9hcmRFdmVudHMgPSBbLi4udGhpcy4jZXZlbnRzTW9kZWwudXNlckV2ZW50c107XG4gICAgdGhpcy4jcmVuZGVyQm9hcmQoKTtcbiAgICB0aGlzLiNyZW5kZXJTb3J0KCk7XG4gIH1cbiAgI3JlbmRlckV2ZW50KGlucHV0VXNlckV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnRQcmVzZW50ZXIgPSBuZXcgRXZlbnRQcmVzZW50ZXIoe1xuICAgICAgY29udGFpbmVyOiB0aGlzLiNldmVudHNMaXN0Q29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBvbkRhdGFDaGFuZ2U6IHRoaXMuI2hhbmRsZUV2ZW50Q2hhbmdlLFxuICAgICAgb25Nb2RlQ2hhbmdlOiB0aGlzLiNoYW5kbGVNb2RlQ2hhbmdlXG4gICAgfSk7XG4gICAgZXZlbnRQcmVzZW50ZXIuaW5pdChpbnB1dFVzZXJFdmVudCk7XG4gICAgdGhpcy4jZXZlbnRQcmVzZW50ZXJzLnNldChpbnB1dFVzZXJFdmVudC5pZCwgZXZlbnRQcmVzZW50ZXIpO1xuICB9XG4gICNyZW5kZXJOb0V2ZW50cygpIHtcbiAgICByZW5kZXIobmV3IE5vRXZlbnRzVmlldygpLCB0aGlzLiNjb250YWluZXIpO1xuICB9XG4gICNzb3J0RXZlbnRzKHNvcnRUeXBlKSB7XG4gICAgc3dpdGNoIChzb3J0VHlwZSkge1xuICAgICAgY2FzZSBTb3J0VHlwZS5QUklDRTpcbiAgICAgICAgdGhpcy4jZXZlbnRzTGlzdC5zb3J0KHNvcnRFdmVudHNQcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTb3J0VHlwZS5USU1FOlxuICAgICAgICB0aGlzLiNldmVudHNMaXN0LnNvcnQoc29ydEV2ZW50c1RpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuI2V2ZW50c0xpc3QgPSBbLi4udGhpcy4jc291cmNlZEJvYXJkRXZlbnRzXTtcbiAgICB9XG4gICAgdGhpcy4jY3VycmVudFNvcnRUeXBlID0gc29ydFR5cGU7XG4gIH1cbiAgI2hhbmRsZVNvcnRUeXBlQ2hhbmdlID0gc29ydFR5cGUgPT4ge1xuICAgIGlmIChzb3J0VHlwZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuI2N1cnJlbnRTb3J0VHlwZSA9PT0gc29ydFR5cGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc29ydEV2ZW50cyhzb3J0VHlwZSk7XG4gICAgdGhpcy4jY2xlYXJFdmVudExpc3QoKTtcbiAgICB0aGlzLiNyZW5kZXJCb2FyZCgpO1xuICB9O1xuICAjcmVuZGVyU29ydCgpIHtcbiAgICB0aGlzLiNzb3J0Q29tcG9uZW50ID0gbmV3IE5ld1RyaXBTb3J0Vmlldyh7XG4gICAgICBvblNvcnRUeXBlQ2hhbmdlOiB0aGlzLiNoYW5kbGVTb3J0VHlwZUNoYW5nZVxuICAgIH0pO1xuICAgIHJlbmRlcih0aGlzLiNzb3J0Q29tcG9uZW50LCB0aGlzLiNjb250YWluZXIsICdBRlRFUkJFR0lOJyk7XG4gIH1cbiAgI3JlbmRlckJvYXJkKCkge1xuICAgIGlmICh0aGlzLiNldmVudHNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy4jcmVuZGVyTm9FdmVudHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVuZGVyKHRoaXMuI2V2ZW50c0xpc3RDb21wb25lbnQsIHRoaXMuI2NvbnRhaW5lcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLiNldmVudHNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLiNyZW5kZXJFdmVudCh0aGlzLiNldmVudHNMaXN0W2ldKTtcbiAgICB9XG4gIH1cbiAgI2hhbmRsZUV2ZW50Q2hhbmdlID0gdXBkYXRlZEV2ZW50ID0+IHtcbiAgICB0aGlzLiNldmVudHNMaXN0ID0gdXBkYXRlSXRlbSh0aGlzLiNldmVudHNMaXN0LCB1cGRhdGVkRXZlbnQpO1xuICAgIHRoaXMuI3NvdXJjZWRCb2FyZEV2ZW50cyA9IHVwZGF0ZUl0ZW0odGhpcy4jc291cmNlZEJvYXJkRXZlbnRzLCB1cGRhdGVkRXZlbnQpO1xuICAgIHRoaXMuI2V2ZW50UHJlc2VudGVycy5nZXQodXBkYXRlZEV2ZW50LmlkKS5pbml0KHVwZGF0ZWRFdmVudCk7XG4gIH07XG4gICNoYW5kbGVNb2RlQ2hhbmdlID0gKCkgPT4ge1xuICAgIHRoaXMuI2V2ZW50UHJlc2VudGVycy5mb3JFYWNoKHByZXNlbnRlciA9PiBwcmVzZW50ZXIucmVzZXRWaWV3KCkpO1xuICB9O1xuICAjY2xlYXJFdmVudExpc3QoKSB7XG4gICAgdGhpcy4jZXZlbnRQcmVzZW50ZXJzLmZvckVhY2gocHJlc2VudGVyID0+IHByZXNlbnRlci5kZXN0cm95KCkpO1xuICAgIHRoaXMuI2V2ZW50UHJlc2VudGVycy5jbGVhcigpO1xuICB9XG59IiwiaW1wb3J0IHsgRmlsdGVyVHlwZSB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IGlzRXZlbnRGdXR1cmUsIGlzRXZlbnRQcmVzZW50LCBpc0V2ZW50UGFzdCB9IGZyb20gJy4vZXZlbnQnO1xuY29uc3QgZmlsdGVyID0ge1xuICBbRmlsdGVyVHlwZS5FVkVSWVRISU5HXTogdXNlckV2ZW50cyA9PiB1c2VyRXZlbnRzLFxuICBbRmlsdGVyVHlwZS5GVVRVUkVdOiB1c2VyRXZlbnRzID0+IHVzZXJFdmVudHMuZmlsdGVyKHVzZXJFdmVudCA9PiBpc0V2ZW50RnV0dXJlKHVzZXJFdmVudC5kYXRlRnJvbSkpLFxuICBbRmlsdGVyVHlwZS5QUkVTRU5UXTogdXNlckV2ZW50cyA9PiB1c2VyRXZlbnRzLmZpbHRlcih1c2VyRXZlbnQgPT4gaXNFdmVudFByZXNlbnQodXNlckV2ZW50LmRhdGVGcm9tKSksXG4gIFtGaWx0ZXJUeXBlLlBBU1RdOiB1c2VyRXZlbnRzID0+IHVzZXJFdmVudHMuZmlsdGVyKHVzZXJFdmVudCA9PiBpc0V2ZW50UGFzdCh1c2VyRXZlbnQuZGF0ZUZyb20pKVxufTtcbmV4cG9ydCB7IGZpbHRlciB9OyIsImltcG9ydCB7IGZpbHRlciB9IGZyb20gJy4uL3V0aWxzL2ZpbHRlci5qcyc7XG5mdW5jdGlvbiBnZW5lcmF0ZUZpbHRlcih1c2VyRXZlbnRzKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhmaWx0ZXIpLm1hcCgoW2ZpbHRlclR5cGUsIGZpbHRlckV2ZW50c10pID0+ICh7XG4gICAgdHlwZTogZmlsdGVyVHlwZSxcbiAgICBjb3VudDogZmlsdGVyRXZlbnRzKHVzZXJFdmVudHMpLmxlbmd0aFxuICB9KSk7XG59XG5leHBvcnQgeyBnZW5lcmF0ZUZpbHRlciB9OyIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gJy4vZnJhbWV3b3JrL3JlbmRlci5qcyc7XG5pbXBvcnQgRXZlbnRzTW9kZWwgZnJvbSAnLi9tb2RlbC9ldmVudHMtbW9kZWwuanMnO1xuaW1wb3J0IE5ld1RyaXBJbmZvVmlldyBmcm9tICcuL3ZpZXcvbmV3LXRyaXAtaW5mby12aWV3LmpzJztcbmltcG9ydCBOZXdUcmlwRmlsdGVyc1ZpZXcgZnJvbSAnLi92aWV3L25ldy1maWx0ZXJzLXZpZXcuanMnO1xuaW1wb3J0IEJvYXJkUHJlc2VudGVyIGZyb20gJy4vcHJlc2VudGVyL2JvYXJkLXByZXNlbnRlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZpbHRlciB9IGZyb20gJy4vbW9jay9maWx0ZXIuanMnO1xuY29uc3QgdHJpcE1haW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHJpcC1tYWluJyk7XG5jb25zdCB0cmlwRmlsdGVyc0NvbnRhaW5lciA9IHRyaXBNYWluQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy50cmlwLWNvbnRyb2xzX19maWx0ZXJzJyk7XG5jb25zdCB0cmlwRXZlbnRzQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRyaXAtZXZlbnRzJyk7XG5jb25zdCBldmVudHNNb2RlbCA9IG5ldyBFdmVudHNNb2RlbCgpO1xuY29uc3QgYm9hcmRQcmVzZW50ZXIgPSBuZXcgQm9hcmRQcmVzZW50ZXIoe1xuICBjb250YWluZXI6IHRyaXBFdmVudHNDb250YWluZXIsXG4gIGV2ZW50c01vZGVsXG59KTtcbmNvbnN0IGZpbHRlcnMgPSBnZW5lcmF0ZUZpbHRlcihldmVudHNNb2RlbC51c2VyRXZlbnRzKTtcbnJlbmRlcihuZXcgTmV3VHJpcEluZm9WaWV3KCksIHRyaXBNYWluQ29udGFpbmVyLCAnQUZURVJCRUdJTicpO1xucmVuZGVyKG5ldyBOZXdUcmlwRmlsdGVyc1ZpZXcoe1xuICBmaWx0ZXJzXG59KSwgdHJpcEZpbHRlcnNDb250YWluZXIpO1xuYm9hcmRQcmVzZW50ZXIuaW5pdCgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///89\n')},10:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(645);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ".shake {\\n animation: shake 0.6s;\\n position: relative;\\n z-index: 10;\\n}\\n\\n@keyframes shake {\\n 0%,\\n 100% {\\n transform: translateX(0);\\n }\\n\\n 10%,\\n 30%,\\n 50%,\\n 70%,\\n 90% {\\n transform: translateX(-5px);\\n }\\n\\n 20%,\\n 40%,\\n 60%,\\n 80% {\\n transform: translateX(5px);\\n }\\n}\\n", ""]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9iaWctdHJpcC8uL3NyYy9mcmFtZXdvcmsvdmlldy9hYnN0cmFjdC12aWV3LmNzcz9kZjNkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9OT19TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvbm9Tb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfTk9fU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuc2hha2Uge1xcbiAgYW5pbWF0aW9uOiBzaGFrZSAwLjZzO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgei1pbmRleDogMTA7XFxufVxcblxcbkBrZXlmcmFtZXMgc2hha2Uge1xcbiAgMCUsXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcbiAgfVxcblxcbiAgMTAlLFxcbiAgMzAlLFxcbiAgNTAlLFxcbiAgNzAlLFxcbiAgOTAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01cHgpO1xcbiAgfVxcblxcbiAgMjAlLFxcbiAgNDAlLFxcbiAgNjAlLFxcbiAgODAlIHtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDVweCk7XFxuICB9XFxufVxcblwiLCBcIlwiXSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n')},645:module=>{"use strict";eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = "";\n var needLayer = typeof item[5] !== "undefined";\n if (item[4]) {\n content += "@supports (".concat(item[4], ") {");\n }\n if (item[2]) {\n content += "@media ".concat(item[2], " {");\n }\n if (needLayer) {\n content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += "}";\n }\n if (item[2]) {\n content += "}";\n }\n if (item[4]) {\n content += "}";\n }\n return content;\n }).join("");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === "string") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== "undefined") {\n if (typeof item[5] === "undefined") {\n item[5] = layer;\n } else {\n item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = "".concat(supports);\n } else {\n item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmlnLXRyaXAvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzPzI0ZmIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///645\n')},81:module=>{"use strict";eval("\n\nmodule.exports = function (i) {\n return i[1];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2JpZy10cmlwLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL25vU291cmNlTWFwcy5qcz8yN2M4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiBpWzFdO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///81\n")},484:function(module){eval('!function(t,e){ true?module.exports=e():0}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",l="Invalid Date",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()