diff --git a/docs/bundle.js b/docs/bundle.js index 53604ff..a49d10b 100644 --- a/docs/bundle.js +++ b/docs/bundle.js @@ -1 +1 @@ -(()=>{"use strict";var __webpack_modules__={863:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{eval("\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(72);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(825);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(659);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(56);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(540);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(113);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/css/common.css\nvar common = __webpack_require__(404);\n;// CONCATENATED MODULE: ./src/css/common.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\noptions.insert = insertBySelector_default().bind(null, \"head\");\noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(common/* default */.A, options);\n\n\n\n\n /* harmony default export */ const css_common = (common/* default */.A && common/* default */.A.locals ? common/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/welcome/welcome.css\nvar welcome = __webpack_require__(235);\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.css\n\n \n \n \n \n \n \n \n \n \n\nvar welcome_options = {};\n\nwelcome_options.styleTagTransform = (styleTagTransform_default());\nwelcome_options.setAttributes = (setAttributesWithoutAttributes_default());\nwelcome_options.insert = insertBySelector_default().bind(null, \"head\");\nwelcome_options.domAPI = (styleDomAPI_default());\nwelcome_options.insertStyleElement = (insertStyleElement_default());\n\nvar welcome_update = injectStylesIntoStyleTag_default()(welcome/* default */.A, welcome_options);\n\n\n\n\n /* harmony default export */ const welcome_welcome = (welcome/* default */.A && welcome/* default */.A.locals ? welcome/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.js\n\n\n// Hide and unhide welcome buttons\nfunction unhideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"block\";\n}\nfunction hideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"none\";\n}\nconst Welcome = {\n show: unhideWelcomeButtons,\n hide: hideWelcomeButtons\n};\n/* harmony default export */ const components_welcome_welcome = (Welcome);\n;// CONCATENATED MODULE: ./src/js/constants/budget_constants.js\n// Set to equal current fiscal year\nvar FISCAL_YEAR = '26';\n\n// object categories (from obj part of account string)\nconst OBJ_CATEGORIES = {\n list: [\n // 'Salaries & Wages',\n // 'Employee Benefits',\n 'Professional & Contractual Services', 'Operating Supplies', 'Operating Services', 'Equipment Acquisition', 'Capital Outlays', 'Fixed Charges', 'Other Expenses']\n};\n\n// from the drop-down menu\nconst EMPLOYEE_TYPES = ['Regular', 'TASS', 'Seasonal', 'Uniform Fire', 'Uniform Police', 'Appointed', 'Elected', 'Long Term Disability', 'New Position'];\nconst OT_OBJECTS = ['601300 - Salar-Overtime-Gen City', '601305 - Salaries-Overtime-Police Unif', '601310 - Salaries-Overtime-Fire Unif', '602300 - Wages-Overtime-Gen City'];\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(225);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.css\n\n \n \n \n \n \n \n \n \n \n\nvar prompt_options = {};\n\nprompt_options.styleTagTransform = (styleTagTransform_default());\nprompt_options.setAttributes = (setAttributesWithoutAttributes_default());\nprompt_options.insert = insertBySelector_default().bind(null, \"head\");\nprompt_options.domAPI = (styleDomAPI_default());\nprompt_options.insertStyleElement = (insertStyleElement_default());\n\nvar prompt_update = injectStylesIntoStyleTag_default()(prompt_prompt/* default */.A, prompt_options);\n\n\n\n\n /* harmony default export */ const components_prompt_prompt = (prompt_prompt/* default */.A && prompt_prompt/* default */.A.locals ? prompt_prompt/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/text.js\nfunction showPrompt() {\n document.getElementById(\"prompt-div\").style.display = \"block\";\n}\nfunction hidePrompt() {\n document.getElementById('prompt-div').style.display = 'none';\n}\nfunction updatePrompt(prompt) {\n document.getElementById('prompt').innerHTML = prompt;\n showPrompt();\n}\nconst Text = {\n show: showPrompt,\n hide: hidePrompt,\n update: function (text) {\n updatePrompt(text);\n }\n};\n/* harmony default export */ const subcomponents_text = (Text);\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/buttons.js\nfunction showPromptButton(id) {\n // make buttons visible\n document.getElementById(id).style.display = 'inline';\n}\nfunction updatePromptButton(id, text) {\n document.getElementById(id).textContent = text;\n showPromptButton(id);\n}\nfunction hidePromptButton(id) {\n document.getElementById(id).style.display = 'none';\n}\nfunction unclickAll() {\n document.getElementById('option1').classList.remove('clicked');\n document.getElementById('option2').classList.remove('clicked');\n}\nfunction applyClickedStyle(button) {\n unclickAll();\n button.classList.add('clicked');\n}\nfunction addPromptButtonAction(button_id, action_fn) {\n const buttonElement = document.getElementById(button_id);\n buttonElement.addEventListener('click', action_fn);\n buttonElement.addEventListener('click', function () {\n applyClickedStyle(this);\n });\n}\nfunction removePromptButtonAction(button_id, action_fn) {\n document.getElementById(button_id).removeEventListener('click', action_fn);\n}\nfunction disable(button_id) {\n document.querySelector(`#${button_id}`).classList.add('disabled');\n}\nfunction enable(button_id) {\n document.querySelector(`#${button_id}`).classList.remove('disabled');\n}\nconst Left = {\n show: function () {\n showPromptButton('option1');\n },\n hide: function () {\n hidePromptButton('option1');\n },\n updateText: function (text) {\n updatePromptButton('option1', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option1', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option1', action_fn);\n },\n disable: function () {\n disable('option1');\n },\n enable: function () {\n enable('option1');\n }\n};\nconst Right = {\n show: function () {\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option2');\n },\n updateText: function (text) {\n updatePromptButton('option2', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option2', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option2', action_fn);\n },\n disable: function () {\n disable('option2');\n },\n enable: function () {\n enable('option2');\n }\n};\nconst Buttons = {\n Left: Left,\n Right: Right,\n show: function () {\n showPromptButton('option1');\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option1');\n hidePromptButton('option2');\n },\n reset: unclickAll\n};\n/* harmony default export */ const buttons = (Buttons);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.js\n\n\n\nconst Prompt = {\n Text: subcomponents_text,\n Buttons: buttons,\n hide: function () {\n subcomponents_text.hide();\n buttons.hide();\n },\n show: function () {\n subcomponents_text.show();\n buttons.show();\n }\n};\n/* harmony default export */ const js_components_prompt_prompt = (Prompt);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/sidebar/sidebar.css\nvar sidebar = __webpack_require__(263);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.css\n\n \n \n \n \n \n \n \n \n \n\nvar sidebar_options = {};\n\nsidebar_options.styleTagTransform = (styleTagTransform_default());\nsidebar_options.setAttributes = (setAttributesWithoutAttributes_default());\nsidebar_options.insert = insertBySelector_default().bind(null, \"head\");\nsidebar_options.domAPI = (styleDomAPI_default());\nsidebar_options.insertStyleElement = (insertStyleElement_default());\n\nvar sidebar_update = injectStylesIntoStyleTag_default()(sidebar/* default */.A, sidebar_options);\n\n\n\n\n /* harmony default export */ const sidebar_sidebar = (sidebar/* default */.A && sidebar/* default */.A.locals ? sidebar/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/constants/excel_constants.js\n\n\n// sheets to expect on detail sheet\nconst SHEETS = {\n 'FTE, Salary-Wage, & Benefits': 'personnel',\n 'Overtime & Other Personnel': 'overtime',\n 'Non-Personnel': 'nonpersonnel',\n 'Revenue': 'revenue',\n 'Initiatives Summary': 'new-inits'\n};\n\n// where to find the general fund target\nconst TARGET_CELL_ADDRESS = 'C14';\nconst TOTAL_COLUMNS = {\n 'personnel': 'Total Sal/Wag & Ben Request',\n 'overtime': `FY${FISCAL_YEAR} Total OT/SP/Hol + FICA Request`,\n 'nonpersonnel': `FY${FISCAL_YEAR} Departmental Request Total`,\n 'revenue': `FY${FISCAL_YEAR} Departmental Estimate`,\n 'new-inits': `Total Initiative Request`\n};\nconst NEW_INIT_COLS = {\n 'personnel': 'Personnel Salary & Benefits',\n 'operating': 'Non-Personnel Operating',\n 'capital': 'Non-Personnel Capital',\n 'revenue': 'Revenue',\n 'name': 'Supplemental Initiative',\n 'total': TOTAL_COLUMNS['new-inits']\n};\n;// CONCATENATED MODULE: ./src/js/constants/index.js\n\n\n;// CONCATENATED MODULE: ./src/js/utils/common_utils.js\n// Function to format number as currency\nconst formatCurrency = (amount, return_zero = false) => {\n var amount = Math.round(parseFloat(amount));\n if (amount == NaN) {\n return \"$ -\";\n }\n if (amount < 0) {\n return '($' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ')';\n } else if (amount == 0) {\n if (return_zero) {\n return '$0';\n }\n return \"$ -\";\n }\n return '$' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// function to convert formatted number to a float\nconst unformatCurrency = formattedAmount => {\n if (!formattedAmount) {\n return 0;\n }\n ;\n // Remove any currency symbols and commas\n let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, \"\");\n if (numericalPart == '-') {\n return 0;\n }\n return parseFloat(numericalPart);\n};\nfunction displayWithCommas(value) {\n if (value == 0) {\n return 0;\n }\n return formatCurrency(value).replace('$', '');\n}\nfunction cleanString(str) {\n return str.toLowerCase().replaceAll(' ', '-');\n}\nfunction removeNewLines(str) {\n // replace all new lines with spaces\n str = str.replaceAll(/[\\r\\n]+/g, \" \");\n // remove any extra spaces or trailing/leading whitespace\n str = str.replaceAll(' ', ' ');\n str = str.replaceAll(' ', ' ');\n str = str.replace(/^\\s+|\\s+$/g, '');\n return str;\n}\nfunction colSum(table, colName) {\n // fill with zero until there is something saved in storage\n if (!table || table == '') {\n return 0;\n }\n const headers = Object.keys(table[0]);\n if (headers.includes(colName)) {\n let sum = 0;\n for (let i = 0; i < table.length; i++) {\n var value = Math.round(parseFloat(table[i][colName]));\n // treat NaN (non-numerics) as zeroes\n if (value) {\n sum += value;\n }\n }\n return sum;\n } else {\n // console.error(`Could not find expected total column in saved data for ${name}. Returning 0. See StoredTable.totalCol() switch.`);\n return 0;\n }\n}\nfunction getUniqueValues(data, key) {\n const values = data.map(obj => obj[key]);\n return Array.from(new Set(values));\n}\n;// CONCATENATED MODULE: ./src/js/models/fund_lookup_table.js\n\n\nconst FundLookupTable = {\n retrieve: function () {\n return JSON.parse(localStorage.getItem('fund-lookup-table')) || {};\n },\n save: function (fundDict) {\n localStorage.setItem('fund-lookup-table', JSON.stringify(fundDict));\n },\n update: function (fundData) {\n // reset\n this.reset();\n // fill in with data stored in fundDate\n const table = this.retrieve();\n for (let fund of Object.keys(fundData)) {\n // add to lookup table if not in there already\n if (!table[fund]) {\n // get fund name\n const fundName = fundData[fund][0]['Fund Name'];\n // add fund to dictionary\n table[fund] = {};\n table[fund]['name'] = fundName;\n table[fund]['viewed'] = false;\n // build lists of unique cost centers and appropriations\n table[fund]['approp'] = getUniqueValues(fundData[fund], 'Appropriation Name');\n table[fund]['cc'] = getUniqueValues(fundData[fund], 'Cost Center Name');\n }\n }\n // save any updates\n this.save(table);\n },\n getAll: function (key) {\n // function to aggregate all approps or CCs for every fund in one array\n const funds = this.retrieve();\n const ret = [];\n for (const fund in funds) {\n if (funds.hasOwnProperty(fund)) {\n for (let i in funds[fund][key]) {\n ret.push(funds[fund][key][i]);\n }\n }\n }\n return ret;\n },\n getCostCenters: function (extraOption) {\n // get current fund\n const fund = current_fund.number();\n let ret = [];\n if (this.retrieve()[fund]) {\n ret = this.retrieve()[fund]['cc'];\n } else {\n // if no fund (ie. we're on the new initiative page), return all options\n ret = this.getAll('cc');\n }\n ;\n // add extra option if given\n if (extraOption) {\n ret.push(extraOption);\n }\n return ret;\n },\n getApprops: function (extraOption) {\n // get current fund\n const fund = current_fund.number();\n let ret = [];\n if (this.retrieve()[fund]) {\n ret = this.retrieve()[fund]['approp'];\n } else {\n // if no fund (ie. we're on the new initiative page), return all options\n ret = this.getAll('approp');\n }\n ;\n // add extra option if given\n if (extraOption) {\n ret.push(extraOption);\n }\n return ret;\n },\n reset: function () {\n this.save({});\n },\n getName: function (number) {\n if (!number || !this.retrieve()) {\n return '';\n }\n ;\n return this.retrieve()[number]['name'];\n },\n listFunds: function () {\n return Object.keys(this.retrieve());\n },\n listFundNames: function (additionalOption) {\n const funds = this.retrieve();\n // initialize array\n var ret = [];\n Object.keys(funds).forEach(fund_number => {\n var fund_name = funds[fund_number]['name'];\n ret.push(fund_name);\n });\n if (additionalOption) {\n ret.push(additionalOption);\n }\n return ret;\n },\n editFund: function (fund) {\n const table = this.retrieve();\n if (table[fund]) {\n table[fund]['viewed'] = true;\n this.save(table);\n } else {\n console.error('No fund selected.');\n }\n },\n listUneditedFunds: function () {\n const table = this.retrieve();\n const ret = [];\n this.listFunds().forEach(key => {\n if (!table[key]['viewed']) {\n ret.push(key);\n }\n });\n return ret;\n },\n fundsLeft: function () {\n return this.listUneditedFunds().length > 0;\n }\n};\n/* harmony default export */ const fund_lookup_table = (FundLookupTable);\n;// CONCATENATED MODULE: ./src/js/models/current_fund.js\n\nconst CurrentFund = {\n update: function (fund) {\n localStorage.setItem('fund', fund);\n },\n number: function () {\n return localStorage.getItem(\"fund\");\n },\n name: function () {\n return fund_lookup_table.getName(this.number());\n },\n reset: function () {\n this.update('');\n }\n};\n/* harmony default export */ const current_fund = (CurrentFund);\n;// CONCATENATED MODULE: ./src/js/models/account_string.js\n\nconst AccountString = {\n getNumber: function (input) {\n // isolate the numerical part of a appropriation/cost center/object\n const match = input.match(/^\\d+/);\n return match ? match[0] : null;\n },\n build: function (approp, cc, obj = null, fund = null) {\n // put together account string fund-approp-costcenter[-obj] (w optional object)\n if (!fund) {\n fund = current_fund.number();\n }\n ;\n // hits error here\n approp = this.getNumber(approp);\n cc = this.getNumber(cc);\n var string = `${fund}-${approp}-${cc}`;\n string = obj ? `${string}-${this.getNumber(obj)}` : string;\n return string;\n },\n getAccountStringSection: function (account_string, section) {\n const sections = account_string.split(\"-\");\n return sections.length > section ? sections[section] : null;\n },\n fund: function (account_string) {\n return this.getAccountStringSection(account_string, 0);\n },\n approp: function (account_string) {\n return this.getAccountStringSection(account_string, 1);\n },\n costCenter: function (account_string) {\n return this.getAccountStringSection(account_string, 2);\n },\n object: function (account_string) {\n return this.getAccountStringSection(account_string, 3);\n }\n};\n/* harmony default export */ const account_string = (AccountString);\n;// CONCATENATED MODULE: ./src/js/models/fund.js\n\n\n\n// Helper function to create a unique list of appropriations represented in a table\nfunction fetchValueSet(table, key) {\n // IF there's no data, return an empty list\n if (!table) {\n return [];\n }\n\n // Use a Set to store unique values\n const uniqValues = new Set();\n\n // Iterate through each object in the table\n table.forEach(row => {\n if (row[key]) {\n uniqValues.add(row[key]);\n }\n });\n\n // Convert the Set to an array if needed\n return uniqValues;\n}\n\n// Class to hold information on a specific fund and table\nclass StoredTable {\n constructor(page, fund) {\n this.name = `${page}_${fund}`;\n this.page = page;\n this.table = JSON.parse(localStorage.getItem(this.name));\n this.approps = fetchValueSet(this.table, 'Appropriation');\n this.cc = fetchValueSet(this.table, 'Cost Center');\n }\n totalCol() {\n return TOTAL_COLUMNS[this.page];\n }\n getSum() {\n // fill with zero until there is something saved in storage\n return colSum(this.table, this.totalCol(), this.name);\n }\n\n // key is the column to filter on (ie. Cost Center)\n filter(key, value) {\n if (this.table) {\n // reassign underlying data in object if there's data to filter\n this.table = this.table.filter(row => {\n return row[key] && row[key] == value;\n });\n }\n return this;\n }\n}\nclass CostCenter {\n constructor(fund, approp, cc) {\n const AppropObj = new Appropriation(fund, approp);\n this.personnel = AppropObj.personnel.filter('Cost Center', cc);\n this.nonpersonnel = AppropObj.nonpersonnel.filter('Cost Center', cc);\n this.overtime = AppropObj.overtime.filter('Cost Center', cc);\n this.revenue = AppropObj.revenue.filter('Cost Center', cc);\n this.cc = cc;\n this.account_string = `${AppropObj.accountString()}-${cc}`;\n }\n getPersonnelCost() {\n return this.personnel.getSum();\n }\n getOvertimeCost() {\n return this.overtime.getSum();\n }\n getNonPersonnelCost() {\n return this.nonpersonnel.getSum();\n }\n getRevenue() {\n return this.revenue.getSum();\n }\n getTotal() {\n // only sum expenditures, not net of revenue\n return this.getNonPersonnelCost() + this.getOvertimeCost() + this.getPersonnelCost();\n }\n getName() {\n // just grab the value in the approp name column for the first row of the first non-empty table\n const tables = [this.nonpersonnel.table, this.personnel.table, this.overtime.table, this.revenue.table];\n for (let table of tables) {\n if (table.length > 0 && table[0]['Cost Center Name']) {\n return 'Cost Center ' + table[0]['Cost Center Name'];\n }\n }\n\n // If all tables are empty, return ''\n return '';\n }\n accountString() {\n return this.account_string;\n }\n}\nclass Appropriation {\n constructor(fund, approp) {\n const fundObj = new Fund(fund);\n this.personnel = fundObj.personnel.filter('Appropriation', approp);\n this.nonpersonnel = fundObj.nonpersonnel.filter('Appropriation', approp);\n this.overtime = fundObj.overtime.filter('Appropriation', approp);\n this.revenue = fundObj.revenue.filter('Appropriation', approp);\n // own data\n this.approp = approp;\n this.fund = fundObj.fund;\n }\n getCostCenters() {\n // build a set of unique appropriations across all line items for the fund\n const cc = new Set([...this.personnel.cc, ...this.overtime.cc, ...this.nonpersonnel.cc, ...this.revenue.cc]);\n\n // initialize a list placeholder for the appropriations objects\n const ccList = [];\n // build out list\n cc.forEach(num => {\n ccList.push(new CostCenter(this.fund, this.approp, num));\n });\n return ccList;\n }\n total() {\n return this.personnel.getSum() + this.overtime.getSum() + this.nonpersonnel.getSum();\n }\n name() {\n // just grab the value in the approp name column for the first row of the first non-empty table\n const tables = [this.nonpersonnel.table, this.personnel.table, this.overtime.table, this.revenue.table];\n for (let table of tables) {\n if (table.length > 0 && table[0]['Appropriation Name']) {\n return 'Appropriation ' + table[0]['Appropriation Name'];\n }\n }\n\n // If all tables are empty, return ''\n return '';\n }\n accountString() {\n return `${this.fund}-${this.approp}`;\n }\n}\n\n// Holds all the detailed data for one fund's budget\nclass Fund {\n constructor(fund) {\n this.fund = fund;\n this.personnel = new StoredTable('personnel', fund);\n this.overtime = new StoredTable('overtime', fund);\n this.nonpersonnel = new StoredTable('nonpersonnel', fund);\n this.revenue = new StoredTable('revenue', fund);\n }\n getAppropriations() {\n // build a set of unique appropriations across all line items for the fund\n const approps = new Set([...this.personnel.approps, ...this.overtime.approps, ...this.nonpersonnel.approps, ...this.revenue.approps]);\n\n // initialize a list placeholder for the appropriations objects\n const appropsList = [];\n // build out list\n approps.forEach(approp => {\n appropsList.push(new Appropriation(this.fund, approp));\n });\n return appropsList;\n }\n getPersonnelCost() {\n return this.personnel.getSum();\n }\n getOvertimeCost() {\n return this.overtime.getSum();\n }\n getNonPersonnelCost() {\n return this.nonpersonnel.getSum();\n }\n getRevenue() {\n return this.revenue.getSum();\n }\n getTotal() {\n // only sum expenditures, not net of revenue\n return this.getNonPersonnelCost() + this.getOvertimeCost() + this.getPersonnelCost();\n }\n}\n/* harmony default export */ const models_fund = (Fund);\n;// CONCATENATED MODULE: ./src/js/models/baseline.js\n\n\nclass Baseline {\n // baseline will just contain a list of funds, each with\n // running tallies for their budgets\n constructor() {\n const allFunds = fund_lookup_table.listFunds();\n this.funds = [];\n allFunds.forEach(fund => {\n this.funds.push(new models_fund(fund));\n });\n }\n static target() {\n return localStorage.getItem('target');\n }\n personnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getPersonnelCost();\n });\n return total;\n }\n overtime() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getOvertimeCost();\n });\n return total;\n }\n nonpersonnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getNonPersonnelCost();\n });\n return total;\n }\n revenue() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getRevenue();\n });\n return total;\n }\n total() {\n return this.nonpersonnel() + this.personnel() + this.overtime();\n }\n genFundTotal() {\n const GF = new models_fund(1000);\n return GF.getTotal();\n }\n}\n/* harmony default export */ const models_baseline = (Baseline);\n;// CONCATENATED MODULE: ./src/js/models/initiative.js\n// data structure to hold information on new initiatives\n\n\n\nclass Initiative {\n constructor(row) {\n this.data = row;\n this.name = row[NEW_INIT_COLS['name']];\n }\n id() {\n let hash = 5381;\n for (let i = 0; i < this.name.length; i++) {\n hash = (hash << 5) + hash + this.name.charCodeAt(i); // hash * 33 + c\n }\n return hash >>> 0; // Ensure positive unsigned 32-bit integer\n }\n personnel() {\n if (this.data[NEW_INIT_COLS['personnel']]) {\n return this.data[NEW_INIT_COLS['personnel']];\n } else {\n return 0;\n }\n }\n operating() {\n if (this.data[NEW_INIT_COLS['operating']]) {\n return this.data[NEW_INIT_COLS['operating']];\n } else {\n return 0;\n }\n }\n capital() {\n if (this.data[NEW_INIT_COLS['capital']]) {\n return this.data[NEW_INIT_COLS['capital']];\n } else {\n return 0;\n }\n }\n revenue() {\n if (this.data[NEW_INIT_COLS['revenue']]) {\n return this.data[NEW_INIT_COLS['revenue']];\n } else {\n return 0;\n }\n }\n total() {\n if (this.data[NEW_INIT_COLS['total']]) {\n return this.data[NEW_INIT_COLS['total']];\n } else {\n return 0;\n }\n }\n}\n/* harmony default export */ const initiative = (Initiative);\n;// CONCATENATED MODULE: ./src/js/models/services.js\n// data structure to save the possible service options for the department\nconst Services = {\n save: function (services) {\n localStorage.setItem('services-list', JSON.stringify(services));\n },\n list: function () {\n return JSON.parse(localStorage.getItem('services-list')) || {};\n }\n};\n/* harmony default export */ const services = (Services);\n;// CONCATENATED MODULE: ./src/js/models/supplemental.js\n\n\n\n\n// data structure to hold supplemental requests\nclass Supplemental {\n constructor() {\n this.table = JSON.parse(localStorage.getItem('new-inits'));\n this.initiatives = [];\n if (this.table) {\n this.table.forEach(row => {\n this.initiatives.push(new initiative(row));\n });\n }\n }\n getInits() {\n return this.table.map(item => {\n return item[NEW_INIT_COLS['name']];\n });\n }\n personnel() {\n return colSum(this.table, NEW_INIT_COLS['personnel']);\n }\n operating() {\n return colSum(this.table, NEW_INIT_COLS['operating']);\n }\n capital() {\n return colSum(this.table, NEW_INIT_COLS['capital']);\n }\n revenue() {\n return colSum(this.table, NEW_INIT_COLS['revenue']);\n }\n total() {\n return colSum(this.table, TOTAL_COLUMNS['new-inits']);\n }\n}\n/* harmony default export */ const supplemental = (Supplemental);\n;// CONCATENATED MODULE: ./src/js/models/index.js\n// models/index.js\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/js/components/sidebar/subcomponents/baseline_section.js\n\n\n\n\nconst BaselineSection = {\n _data: new models_baseline(),\n _genFund: new models_fund(1000),\n get data() {\n this._data = new models_baseline();\n return this._data;\n },\n set data(newData) {\n this._data = newData;\n },\n get genFund() {\n this._genFund = new models_fund(1000);\n return this._genFund;\n },\n set genFund(newFund) {\n this._genFund = newFund;\n },\n target_html() {\n return `\n \n \n
`;\n },\n fund_html(fund) {\n return `\n
${fund_lookup_table.getName(fund.fund)}
\n
\n \n \n \n \n \n
`;\n },\n linkEditBtns() {\n let btns = document.querySelectorAll('.edit-icon');\n btns.forEach(btn => {\n // Get the fund from the div the button is in\n let fund = btn.closest('.fund-div').id.replace('fund_', '');\n let page = btn.closest('.sidebar-stat-line').classList[1];\n btn.addEventListener('click', function () {\n current_fund.update(fund);\n visitPage(page);\n });\n });\n },\n update() {\n const baselineDiv = document.querySelector('#baseline-stats');\n baselineDiv.innerHTML = this.target_html();\n this.data.funds.forEach(fund => {\n var fundDiv = document.createElement('div');\n fundDiv.id = `fund_${fund.fund}`;\n fundDiv.classList.add('fund-div');\n fundDiv.innerHTML = this.fund_html(fund);\n baselineDiv.appendChild(fundDiv);\n });\n if (this.genFund.getTotal() <= models_baseline.target()) {\n document.querySelector('#GF-total .stat').style.color = \"green\";\n // document.querySelector('#fund_1000 .sidebar-stat-line:last-of-type .stat').style.color = \"green\";\n } else {\n document.querySelector('#GF-total .stat').style.color = \"red\";\n // document.querySelector('#fund_1000 .sidebar-stat-line:last-of-type .stat').style.color = \"red\";\n }\n this.linkEditBtns();\n }\n};\n;// CONCATENATED MODULE: ./src/js/components/sidebar/subcomponents/supp_section.js\n\n\n\nconst SuppSection = {\n html() {\n var supp = new supplemental();\n return `\n \n \n \n \n `;\n },\n linkEditBtns() {\n let btns = document.querySelectorAll('.edit-supp');\n btns.forEach(btn => {\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n });\n },\n update() {\n const suppDiv = document.querySelector('#supp-stats');\n suppDiv.innerHTML = this.html();\n this.linkEditBtns();\n }\n};\n/* harmony default export */ const supp_section = (SuppSection);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n// fetch CSS variables saved in :root\nconst root = document.documentElement;\nconst sideBarWidth = getComputedStyle(root).getPropertyValue('--sidebar-width').trim();\nfunction hideSidebar() {\n document.getElementById('sidebar-panel').style.display = 'none';\n document.getElementById('main-panel').style.width = '100%';\n document.querySelector('header').style.width = '100%';\n}\nfunction showSidebar() {\n const sidebar = document.getElementById('sidebar-panel');\n const mainPanel = document.getElementById('main-panel');\n const header = document.querySelector('header');\n\n // update values\n updateTotals();\n sidebar.style.display = 'block'; // Show the sidebar\n\n // Calculate the remaining width for the main panel and header\n var contentWidth = document.documentElement.clientWidth;\n mainPanel.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n header.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n\n // add event listener to resize content if window is adjusted\n window.addEventListener('resize', showSidebar);\n}\nfunction updateSidebarTitle(new_title) {\n document.getElementById('sidebar-title').textContent = new_title;\n}\nfunction updateTotals() {\n supp_section.update();\n BaselineSection.update();\n}\nfunction resetAll() {\n localStorage.clear();\n // reset all stats to 0\n updateTotals();\n}\nconst Sidebar = {\n SuppSection: supp_section,\n BaselineSection: BaselineSection,\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n updateTotals: updateTotals,\n reset: resetAll\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/nav_buttons/nav_buttons.css\nvar nav_buttons = __webpack_require__(595);\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.css\n\n \n \n \n \n \n \n \n \n \n\nvar nav_buttons_options = {};\n\nnav_buttons_options.styleTagTransform = (styleTagTransform_default());\nnav_buttons_options.setAttributes = (setAttributesWithoutAttributes_default());\nnav_buttons_options.insert = insertBySelector_default().bind(null, \"head\");\nnav_buttons_options.domAPI = (styleDomAPI_default());\nnav_buttons_options.insertStyleElement = (insertStyleElement_default());\n\nvar nav_buttons_update = injectStylesIntoStyleTag_default()(nav_buttons/* default */.A, nav_buttons_options);\n\n\n\n\n /* harmony default export */ const nav_buttons_nav_buttons = (nav_buttons/* default */.A && nav_buttons/* default */.A.locals ? nav_buttons/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.js\n// nav_buttons.js\n\n\nfunction initializeNavButtons() {\n // initialize last button\n const last_btn = document.getElementById('btn-last');\n last_btn.addEventListener('click', lastPage);\n // initialize next button\n const next_btn = document.getElementById('btn-next');\n next_btn.addEventListener('click', nextPage);\n}\nfunction nav_buttons_disable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.add('disabled');\n button.disabled = true; // Also disable it at the DOM level\n}\nfunction nav_buttons_enable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.remove('disabled');\n button.disabled = false; // Enable it at the DOM level\n}\nconst Next = {\n disable: function () {\n nav_buttons_disable('btn-next');\n },\n enable: function () {\n nav_buttons_enable('btn-next');\n },\n addAction: function (fn) {\n document.querySelector(`#btn-next`).addEventListener('click', fn);\n },\n removeAction: function (fn) {\n document.querySelector(`#btn-next`).removeEventListener('click', fn);\n }\n};\nconst Last = {\n disable: function () {\n nav_buttons_disable('btn-last');\n },\n enable: function () {\n nav_buttons_enable('btn-last');\n }\n};\nconst NavButtons = {\n hide: function () {\n document.getElementById('nav-btns').style.display = 'none';\n },\n show: function () {\n document.getElementById('nav-btns').style.display = 'block';\n initializeNavButtons();\n },\n Next: Next,\n Last: Last\n};\n/* harmony default export */ const components_nav_buttons_nav_buttons = (NavButtons);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/body/body.css\nvar body = __webpack_require__(9);\n;// CONCATENATED MODULE: ./src/js/components/body/body.css\n\n \n \n \n \n \n \n \n \n \n\nvar body_options = {};\n\nbody_options.styleTagTransform = (styleTagTransform_default());\nbody_options.setAttributes = (setAttributesWithoutAttributes_default());\nbody_options.insert = insertBySelector_default().bind(null, \"head\");\nbody_options.domAPI = (styleDomAPI_default());\nbody_options.insertStyleElement = (insertStyleElement_default());\n\nvar body_update = injectStylesIntoStyleTag_default()(body/* default */.A, body_options);\n\n\n\n\n /* harmony default export */ const body_body = (body/* default */.A && body/* default */.A.locals ? body/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/accordion/accordion.css\nvar accordion = __webpack_require__(995);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.css\n\n \n \n \n \n \n \n \n \n \n\nvar accordion_options = {};\n\naccordion_options.styleTagTransform = (styleTagTransform_default());\naccordion_options.setAttributes = (setAttributesWithoutAttributes_default());\naccordion_options.insert = insertBySelector_default().bind(null, \"head\");\naccordion_options.domAPI = (styleDomAPI_default());\naccordion_options.insertStyleElement = (insertStyleElement_default());\n\nvar accordion_update = injectStylesIntoStyleTag_default()(accordion/* default */.A, accordion_options);\n\n\n\n\n /* harmony default export */ const accordion_accordion = (accordion/* default */.A && accordion/* default */.A.locals ? accordion/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/table/table.css\nvar table = __webpack_require__(279);\n;// CONCATENATED MODULE: ./src/js/components/table/table.css\n\n \n \n \n \n \n \n \n \n \n\nvar table_options = {};\n\ntable_options.styleTagTransform = (styleTagTransform_default());\ntable_options.setAttributes = (setAttributesWithoutAttributes_default());\ntable_options.insert = insertBySelector_default().bind(null, \"head\");\ntable_options.domAPI = (styleDomAPI_default());\ntable_options.insertStyleElement = (insertStyleElement_default());\n\nvar table_update = injectStylesIntoStyleTag_default()(table/* default */.A, table_options);\n\n\n\n\n /* harmony default export */ const table_table = (table/* default */.A && table/* default */.A.locals ? table/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/headers.js\nfunction addTableHeaders(cols) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // Create a table header row element\n const headerRow = document.createElement('tr');\n cols.forEach(col => {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = col['title'];\n headerCell.classList.add(col['className']);\n\n // Append the header cell to the header row\n headerRow.appendChild(headerCell);\n });\n\n // Append the header row to the table header\n let thead = table.querySelector('thead');\n thead.appendChild(headerRow);\n}\nconst Header = {\n add: function (header_array) {\n addTableHeaders(header_array);\n }\n};\n/* harmony default export */ const headers = (Header);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/rows.js\n\n\nasync function addNewRow(data_dictionary, columns = []) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // check if header has already been added\n let header_row = table.querySelector('thead tr');\n if (!header_row) {\n headers.add(columns);\n header_row = table.querySelector('thead tr');\n }\n\n // initialize new row of data\n const new_row = document.createElement('tr');\n\n // go through each header and add the right cell value depending on its class\n let thElements = header_row.querySelectorAll('th');\n thElements.forEach(header_cell => {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n new_row.appendChild(newCell);\n // if the data has an appropriate class, add the info to the cell. \n // Otherwise, keep empty cell\n Object.keys(data_dictionary).forEach(className => {\n if (header_cell.classList.contains(className)) {\n newCell.textContent = data_dictionary[className];\n newCell.classList.add(className);\n }\n });\n });\n\n // Append the new row to the table body\n let tbody = table.querySelector('tbody');\n tbody.appendChild(new_row);\n}\nfunction saveRowEdits(row) {\n var cells = row.querySelectorAll('td');\n cells.forEach(cell => {\n // save dropdown values\n if (cell.querySelector('select')) {\n var serviceSelector = cell.querySelector('select');\n cell.textContent = serviceSelector.value;\n } else if (cell.querySelector('input')) {\n // save new entered value in textbox\n var textbox = cell.querySelector('input');\n var enteredValue = textbox.value;\n // update display and format with currency if relevant\n if (cell.classList.contains('cost')) {\n // if cost, remove commas first\n enteredValue = enteredValue.replaceAll(',', '');\n cell.textContent = formatCurrency(enteredValue);\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n } else {\n cell.textContent = enteredValue;\n }\n } else if (cell.querySelector('textarea')) {\n // save new entered value in textbox\n var enteredValue = cell.querySelector('textarea').value;\n cell.textContent = enteredValue;\n }\n });\n}\nconst Rows = {\n add: function (data_dictionary, cols) {\n addNewRow(data_dictionary, cols);\n },\n saveEdits: function (row) {\n saveRowEdits(row);\n }\n};\n/* harmony default export */ const rows = (Rows);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/buttons.js\n\nfunction hideButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'none';\n }\n };\n}\nfunction showButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'inline';\n }\n };\n}\nfunction updateButtonText(className, text) {\n document.querySelector(`.${className}`).textContent = text;\n}\nfunction handleRowEdit(actionOnClick, updateCallback = null) {\n // attach an event listener to each edit button in every row\n var editButtons = document.getElementsByClassName('btn-edit');\n for (var i = 0; i < editButtons.length; i++) {\n editButtons[i].addEventListener('click', async function (event) {\n // Determine what was clicked on within the table\n var rowToEdit = event.target.closest('tr');\n // mark row as being edited\n rowToEdit.classList.add('active-editing');\n\n // turn relevant entries into textboxes, usually\n actionOnClick();\n\n // hide edit buttons\n Edit.hide();\n if (updateCallback) {\n initializeConfirmButton(updateCallback);\n }\n });\n }\n ;\n}\nfunction initializeConfirmButton(updateCallback) {\n // get element and add listener for click\n var rowToEdit = document.querySelector('.active-editing');\n const confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n // show the row's confirm button\n confirm_btn.style.display = 'block';\n confirm_btn.addEventListener('click', function () {\n ;\n // save row edits\n rows.saveEdits(rowToEdit);\n // update values in sidebar\n updateCallback();\n // make row no longer green\n rowToEdit.classList.remove('active-editing');\n // show edit buttons and hide confirm buttons\n Edit.show();\n Confirm.hide();\n });\n}\nconst Edit = {\n html: '',\n hide: hideButton('btn-edit'),\n show: showButton('btn-edit'),\n init: function (actionOnClick, updateCallback) {\n handleRowEdit(actionOnClick, updateCallback);\n }\n};\nconst Delete = {\n html: '',\n hide: hideButton('btn-delete'),\n show: showButton('btn-delete')\n};\nconst Confirm = {\n html: '',\n hide: hideButton('btn-confirm'),\n show: showButton('btn-confirm')\n};\nconst AddRow = {\n hide: hideButton('btn-add'),\n show: showButton('btn-add'),\n updateText: function (text) {\n updateButtonText('btn-add', text);\n }\n};\nconst buttons_Buttons = {\n Delete: Delete,\n Edit: Edit,\n Confirm: Confirm,\n AddRow: AddRow,\n edit_confirm_btns: Edit.html + Confirm.html,\n all_btns: Delete.html + Edit.html + Confirm.html\n};\n/* harmony default export */ const subcomponents_buttons = (buttons_Buttons);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/dropdown.js\nfunction createDropdown(dataArray) {\n // Creating a select element\n const selectElement = document.createElement('select');\n\n // add a default blank option to the dataArray\n dataArray = [''].concat(dataArray);\n\n // Looping through the array and creating an option for each element\n dataArray.forEach(item => {\n const optionElement = document.createElement('option');\n optionElement.value = item;\n optionElement.textContent = item;\n selectElement.appendChild(optionElement); // Appending the option to the select\n });\n\n // Return the select element so it can be appended to the document\n return selectElement;\n}\nconst Dropdown = {\n create: function (dataArray) {\n return createDropdown(dataArray);\n }\n};\n/* harmony default export */ const subcomponents_dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\n\n\n\n\n// return cell value attribute or 0 if it does not exist\nfunction getCellValue(row, className) {\n var cell = row.querySelector(`.${className}`);\n var cellValue = cell ? cell.getAttribute('value') : null;\n return cellValue ? parseFloat(cellValue) : 0;\n}\n\n// return text in cell\nfunction getCellText(row, className) {\n var cell = row.querySelector(`.${className}`);\n if (cell) {\n return cell.textContent;\n } else {\n //console.log(`Error retrieving cell text for class ${className}`);\n return '';\n }\n}\nfunction updateTableCell(row, col_class, new_value) {\n const cell = row.querySelector(`.${col_class}`);\n cell.setAttribute('value', new_value);\n cell.textContent = formatCurrency(new_value);\n}\nfunction createEditableCell(cellClass, isCost, type = 'input') {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // Create an input element to edit the value\n var textbox = document.createElement(type);\n if (type == 'input') {\n textbox.type = 'text';\n }\n ;\n if (isCost) {\n var value = cell.getAttribute('value');\n textbox.value = displayWithCommas(value);\n } else {\n textbox.value = cell.textContent;\n }\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nfunction cells_createDropdown(cellClass, optionArray) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const dropdown = subcomponents_dropdown.create(optionArray);\n dropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(dropdown);\n}\nconst Cell = {\n getValue: function (row, className) {\n return getCellValue(row, className);\n },\n getText: function (row, className) {\n return getCellText(row, className);\n },\n updateValue: function (row, col_class, new_value) {\n updateTableCell(row, col_class, new_value);\n },\n createTextbox: function (className, isCost, type) {\n createEditableCell(className, isCost, type);\n },\n createServiceDropdown: () => {\n cells_createDropdown('service', services.list());\n },\n createDropdown: cells_createDropdown\n};\n/* harmony default export */ const cells = (Cell);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/columns.js\n\n\n// position is index at which new column will be inserted\nfunction addCol(position, htmlContent = '', headerTitle = '') {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Validate position\n let maxPosition = table.rows[0].cells.length;\n if (position < 0 || position > maxPosition) {\n console.error(`Position ${position} is out of bounds.`);\n return;\n }\n\n // Insert the header if provided\n let thead = table.tHead;\n if (headerTitle && thead) {\n let th = document.createElement('th');\n th.innerHTML = headerTitle; // Use innerHTML to insert HTML content\n thead.rows[0].insertBefore(th, thead.rows[0].cells[position]);\n }\n\n // Insert new cells into each row of the table body\n let tbody = table.tBodies[0];\n if (tbody) {\n for (let i = 0; i < tbody.rows.length; i++) {\n let row = tbody.rows[i];\n let td = document.createElement('td');\n td.innerHTML = htmlContent; // Use innerHTML to insert HTML content\n row.insertBefore(td, row.cells[position]);\n }\n }\n}\nfunction ncols() {\n const table = document.getElementById('main-table');\n // Ensure that the row exists before counting the columns\n return table.rows[0].cells.length;\n}\nfunction addColToEnd(htmlContents = [], headerTitle = '') {\n // count columns and add new column to the end\n const position = ncols('main-table');\n addCol(position, htmlContents, headerTitle);\n}\nfunction assignClassToColumn(headerName, className) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Find the index of the column by its header name\n const thead = table.tHead;\n let headerCellIndex = -1;\n const headerCells = thead.rows[0].cells; // Assuming the first row contains header cells ()\n for (let i = 0; i < headerCells.length; i++) {\n if (headerCells[i].textContent.trim() === headerName) {\n // assign the class to the header cell\n headerCells[i].classList.add(className);\n headerCellIndex = i;\n break;\n }\n }\n\n // error check\n if (headerCellIndex === -1) {\n console.error(`No header found with name \"${headerName}\"`);\n return;\n }\n\n // Assign the class to each cell in the specified column index within the tbody\n let tbody = table.tBodies[0];\n if (tbody) {\n let bodyRows = tbody.rows;\n for (let row of bodyRows) {\n if (row.cells[headerCellIndex]) {\n row.cells[headerCellIndex].classList.add(className);\n }\n }\n }\n}\nfunction addCostClass(headerName) {\n assignClassToColumn(headerName, 'cost');\n\n // Get all the cells with the specified class name\n const cells = document.querySelectorAll(`td.cost`);\n cells.forEach(cell => {\n // Get the current text content of the cell and assign it to 'value' attribute\n if (!cell.getAttribute('value')) {\n const cellText = cell.textContent.trim();\n const cellValue = isNaN(cellText) || cellText === '' ? 0 : parseFloat(cellText);\n cell.setAttribute('value', cellValue);\n\n // Now format the text content like currency and replace it in the cell\n const formattedCurrency = formatCurrency(parseFloat(cellValue));\n cell.textContent = formattedCurrency;\n }\n });\n}\nfunction assignColumnClasses(columnDefinitions) {\n columnDefinitions.forEach(column => {\n // Assign class to column\n assignClassToColumn(column.title, column.className);\n\n // If the column is a cost column, add the specific cost class\n if (column.isCost) {\n addCostClass(column.title);\n }\n\n // show the column\n if (!column.hide) {\n showColumnByTitle(column.title);\n }\n });\n}\nfunction hideColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'none';\n }\n }\n}\n\n// Function to show a specific column\nfunction showColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'table-cell';\n }\n }\n}\n\n// Function to get the column index by title\nfunction getColumnIndexByTitle(table, title) {\n var headers = table.querySelectorAll('th');\n for (var i = 0; i < headers.length; i++) {\n if (headers[i].innerText === title) {\n return i;\n }\n }\n return -1; // Column not found\n}\n\n// Function to hide a column by title\nfunction hideColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n hideColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\n\n// Function to show a column by title\nfunction showColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n showColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\nconst Column = {\n add: function (position, htmlContent, headerTitle) {\n return addCol(position, htmlContent, headerTitle);\n },\n addAtEnd: function (htmlContent, headerTitle) {\n return addColToEnd(htmlContent, headerTitle);\n },\n assignClasses: function (column_definitions) {\n return assignColumnClasses(column_definitions);\n },\n hide: function (colName) {\n hideColumnByTitle(colName);\n },\n show: function (colName) {\n showColumnByTitle(colName);\n }\n};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\n\n\n\nfunction fillTable(data) {\n try {\n const table = document.getElementById('main-table');\n const thead = table.querySelector('thead');\n const tbody = table.querySelector('tbody');\n\n // clear existing data\n thead.innerHTML = '';\n tbody.innerHTML = '';\n\n // Create table header row\n const headerRow = document.createElement('tr');\n Object.keys(data[0]).forEach(key => {\n const header = document.createElement('th');\n header.textContent = key;\n headerRow.appendChild(header);\n });\n thead.appendChild(headerRow);\n\n // Create table body rows\n data.forEach(item => {\n const row = document.createElement('tr');\n Object.values(item).forEach(val => {\n const cell = document.createElement('td');\n cell.innerHTML = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } catch (error) {\n console.error('No table saved in localStorage:', error);\n }\n}\nasync function loadFromStorage() {\n // look up table name in storage\n if (current_fund.number()) {\n var key = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var key = current_page.load();\n }\n // load from local storage\n const data = localStorage.getItem(key);\n // if nothing in storage, return a zero\n if (!data) {\n return 0;\n } else {\n // otherwise, fill table in HTML and return success (1)\n components_table_table.show();\n fillTable(await JSON.parse(data));\n return 1;\n }\n}\nfunction loadFunds() {\n // get list of funds from storage\n const fundDict = fund_lookup_table.retrieve();\n // build out data in correct format\n const ret = [];\n Object.keys(fundDict).forEach(key => {\n // determine if the fund has already been edited\n if (fundDict[key]['viewed']) {\n // todo: add a checkmark here\n ret.push({\n 'Fund': ` \n \n ${fundDict[key]['name']}\n `\n });\n } else {\n ret.push({\n 'Fund': ` \n ${fundDict[key]['name']}\n `\n });\n }\n });\n fillTable(ret);\n}\nfunction getColumnIndexByClass(tbody, className) {\n const firstRow = tbody.rows[0];\n if (!firstRow) return -1; // Return -1 if there's no row to examine\n for (let cellIndex = 0; cellIndex < firstRow.cells.length; cellIndex++) {\n if (firstRow.cells[cellIndex].classList.contains(className)) {\n return cellIndex;\n }\n }\n return -1; // Return -1 if class name not found\n}\n\n// function sort(primaryClass, secondaryClass) {\n// const table = document.getElementById('main-table');\n// const tbody = table.tBodies[0];\n// const rows = Array.from(tbody.rows);\n\n// // Get the column indices by class name\n// const primaryColIndex = getColumnIndexByClass(tbody, primaryClass);\n// const secondaryColIndex = getColumnIndexByClass(tbody, secondaryClass);\n\n// // exit if classes don't exist\n// if (primaryColIndex === -1 ) {\n// console.error(`Column class ${classA} not found in table`);\n// return; \n// } else if (secondaryColIndex === -1) {\n// console.error(`Column class ${classB} not found in table`);\n// return; \n// }\n\n// // Sort the rows based on the text content of the cells\n// rows.sort((rowA, rowB) => {\n// // Primary column comparison\n// const primaryA = unformatCurrency(rowA.cells[primaryColIndex].textContent);\n// const primaryB = unformatCurrency(rowB.cells[primaryColIndex].textContent);\n\n// if (primaryA < primaryB) return -1;\n// if (primaryA > primaryB) return 1;\n\n// // Secondary column comparison (if primary is equal)\n// const secondaryA = unformatCurrency(rowA.cells[secondaryColIndex].textContent);\n// const secondaryB = unformatCurrency(rowB.cells[secondaryColIndex].textContent);\n\n// if (secondaryA < secondaryB) return -1;\n// if (secondaryA > secondaryB) return 1;\n\n// // If both columns are equal\n// return 0;\n// });\n\n// // Reattach sorted rows to the table body\n// rows.forEach((row) => tbody.appendChild(row));\n// }\n\nconst Data = {\n load: loadFromStorage,\n loadFunds: loadFunds,\n sort: function (colA, colB) {\n sort(colA, colB);\n }\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/filters.js\n// Helper functions & constants\n\n// object to hold all current filter statuses\nconst filterSettings = {\n 'approp-name': '',\n 'cc-name': '',\n 'object-name': '',\n 'object-category': ''\n};\n\n// helper function to filter data based on all filters\nfunction filterData() {\n // Get all rows in the table\n const rows = document.querySelectorAll('#main-table tbody tr');\n\n // Iterate through each row and determine if it should be hidden or shown\n rows.forEach(row => {\n let isVisible = true;\n\n // Check each filter setting against the row's cells\n for (const [filterId, filterValue] of Object.entries(filterSettings)) {\n const cell = row.querySelector(`.${filterId}`);\n\n // only show row if values pass through all filters \n if (filterValue && cell && cell.textContent.trim() !== filterValue) {\n isVisible = false;\n break;\n }\n }\n\n // Show or hide the row based on visibility\n row.classList.toggle('hidden', !isVisible);\n });\n}\nconst Filter = {\n html(filterLabel, filterClass) {\n // basic html with only 'All' option\n return `\n `;\n },\n addOption(filterClass, option) {\n // Add another option to the dropdown for the filter\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n const optionObj = document.createElement('option');\n optionObj.value = option;\n optionObj.textContent = option;\n filterObj.appendChild(optionObj);\n },\n add(filterLabel, filterClass) {\n // create a div to contain the html and insert inside filter-container\n const filterContainer = document.querySelector('#filter-container');\n const filterDiv = document.createElement('div');\n filterDiv.innerHTML = this.html(filterLabel, filterClass);\n filterContainer.appendChild(filterDiv);\n // add all relevant options from that column in the table\n this.addAllOptions(filterClass);\n // Bind change event to the select element\n filterDiv.querySelector('.filter-dropdown').addEventListener('change', event => {\n // Update filter settings\n filterSettings[filterClass] = event.target.value;\n // Apply all filters\n filterData();\n });\n },\n addAllOptions(filterClass) {\n // get matching column from table\n const column = document.querySelectorAll(`#main-table td.${filterClass}`);\n\n // Use a Set to store unique values in the column of interest\n const uniqueValues = new Set();\n\n // Iterate over the NodeList to get the unique values\n column.forEach(td => {\n // Add each textContent to the Set\n uniqueValues.add(td.textContent.trim());\n });\n // add all values as options to the filter dropdown\n uniqueValues.forEach(option => {\n this.addOption(filterClass, option);\n });\n },\n deleteAll() {\n document.querySelector('#filter-container').innerHTML = '';\n },\n updateOptions(filterClass) {\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n if (filterObj) {\n // Clear all existing options except for the default 'All' option\n filterObj.options.length = 1;\n // Add new options\n this.addAllOptions(filterClass);\n }\n }\n};\n/* harmony default export */ const filters = (Filter);\n;// CONCATENATED MODULE: ./src/js/models/gold_book.js\n// the Gold Book contains a lookup table for each job code, which maps to the BU, the job title, and the fringe rate\n\nconst GoldBook = {\n init(sheet) {\n // Convert sheet to JSON, with no automatic header row parsing\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Assuming header is the second row (index 1), and data starts at the third row (index 2)\n const headers = rawData[1];\n const data = rawData.slice(2);\n\n // Store headers and data in localStorage\n localStorage.setItem('goldbook_headers', JSON.stringify(headers));\n localStorage.setItem('goldbook_data', JSON.stringify(data));\n },\n fetch() {\n const headers = JSON.parse(localStorage.getItem('goldbook_headers'));\n const data = JSON.parse(localStorage.getItem('goldbook_data'));\n return {\n headers,\n data\n };\n },\n fetchByCode(job_code) {\n const {\n headers,\n data\n } = this.fetch();\n\n // Create a map of column names to their respective indices\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return data.filter(row => row[headerMap['Job Code']] == job_code);\n },\n getHeaderIX(header_name) {\n const {\n headers\n } = this.fetch();\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return headerMap[header_name];\n },\n lookupByJobCode(job_code, header_name) {\n const codeData = this.fetchByCode(job_code);\n if (codeData.length > 0) {\n return codeData[0][this.getHeaderIX(header_name)];\n }\n return null;\n },\n getTitle(job_code) {\n return this.lookupByJobCode(job_code, 'Job Description');\n },\n getFringeRate(job_code) {\n return parseFloat(this.lookupByJobCode(job_code, 'Fringe Rate'));\n },\n codeExists(job_code) {\n return this.fetchByCode(job_code).length > 0;\n },\n // method to add GoldBook data as a new sheet to the workbook\n xlsx() {\n const {\n headers,\n data\n } = this.fetch();\n\n // Combine headers and data into one array\n const combinedData = [headers].concat(data);\n\n // Create a worksheet\n return XLSX.utils.aoa_to_sheet(combinedData);\n }\n};\n/* harmony default export */ const gold_book = (GoldBook);\n;// CONCATENATED MODULE: ./src/js/utils/XLSX_handlers.js\n\n\n\n\n\n\n\n// Helper functions\n\n/**\r\n * Deletes the top rows until a row containing complete data is found.\r\n * @param {Array} data - The raw data extracted from the sheet.\r\n * @returns {Array} - The cleaned data with incomplete top rows removed.\r\n */\nfunction deleteTopRowsUntilFullData(data) {\n let fullDataRowFound = false;\n while (!fullDataRowFound && data.length > 0) {\n const row = data[0]; // Get the top row\n let hasAllData = true;\n for (const cell of row) {\n if (cell == null || cell === '') {\n hasAllData = false;\n break;\n }\n }\n if (hasAllData && row.length > 1) {\n fullDataRowFound = true;\n } else {\n // delete the top row if it's not the header row\n data.shift();\n }\n }\n return data;\n}\n\n/**\r\n * Reads the workbook from the provided array buffer.\r\n * @param {ArrayBuffer} arrayBuffer - The array buffer containing the workbook data.\r\n * @returns {Object} - The parsed workbook.\r\n */\nfunction readWorkbook(arrayBuffer) {\n return XLSX.read(arrayBuffer, {\n type: 'array'\n });\n}\n\n/**\r\n * Processes sheets to be split by fund and saves the relevant data.\r\n * @param {string} sheetName - The name of the sheet being processed.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processSheet(sheetName, sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n const fundIndex = headers.indexOf('Fund');\n if (fundIndex === -1) {\n console.error(`No 'Fund' column found in sheet ${sheetName}`);\n return;\n }\n\n // Save a dictionary of data for each fund for each sheet\n const fundData = {};\n dataRows.forEach(row => {\n const fund = row[fundIndex];\n if (fund && fund !== \"Fund\") {\n if (!fundData[fund]) {\n fundData[fund] = [];\n }\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n fundData[fund].push(rowData);\n }\n });\n\n // Save fund number and name as we go along\n fund_lookup_table.update(fundData);\n console.log('updating fund lookup table');\n Object.keys(fundData).forEach(fund => {\n const key = `${SHEETS[sheetName]}_${fund}`;\n localStorage.setItem(key, JSON.stringify(fundData[fund]));\n });\n}\n\n/**\r\n * Processes the 'Drop-Down Menus' sheet to extract services data.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDropDownMenusSheet(sheet) {\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n const headerRow = sheetData[0];\n const servicesIndex = headerRow.indexOf('Services');\n\n // save drop down menu for later excel downloads\n localStorage.setItem('dropdowns', JSON.stringify(sheetData));\n if (servicesIndex === -1) {\n console.error('Header \"Services\" not found');\n } else {\n const servicesColumn = sheetData.slice(1).map(row => row[servicesIndex]);\n const cleanedServicesColumn = servicesColumn.filter(value => value != null);\n services.save(cleanedServicesColumn);\n }\n}\n\n/**\r\n * Processes the 'Dept Summary' sheet to get and save the target for the general fund.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDeptSummarySheet(sheet) {\n if (sheet[TARGET_CELL_ADDRESS]) {\n const cellValue = sheet[TARGET_CELL_ADDRESS].v; // Access the cell value\n localStorage.setItem('target', cellValue);\n } else {\n console.error(`Cell ${TARGET_CELL_ADDRESS} not found`);\n }\n\n // save the sheet to add to future excel downloads\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n // TODO: remove excess empty rows\n const newSheetData = sheetData.map(row => row.slice(0, 3));\n localStorage.setItem('dept-summary', JSON.stringify(newSheetData));\n}\n\n/**\r\n * Processes the 'FY{FISCAL_YEAR} Gold Book' sheet to initialize the Gold Book.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processGoldBookSheet(sheet) {\n gold_book.init(sheet);\n}\nfunction processNewInitsSheet(sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n // final data output\n let fullData = [];\n\n // Convert data to JSON form and filter out rows where first value is missing\n dataRows.slice(1).forEach(row => {\n // Skip headers row\n // skip any empty rows at the end\n if (row[0] != '' && row[0] != '-') {\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n // only keep supplemental initiatives \n if (rowData['Baseline or Supplemental'].includes('Supplemental')) {\n fullData.push(rowData);\n }\n }\n });\n // save in local storage\n localStorage.setItem('new-inits', JSON.stringify(fullData));\n}\n\n// Main function to read and process the workbook\nfunction processWorkbook(arrayBuffer) {\n const workbook = readWorkbook(arrayBuffer);\n workbook.SheetNames.forEach(sheetName => {\n // Only convert sheets we need; treat new inits separately because they shouldn't save by fund\n if (sheetName == Object.keys(SHEETS)[4]) {\n const sheet = workbook.Sheets[sheetName];\n processNewInitsSheet(sheet);\n } else if (Object.keys(SHEETS).includes(sheetName)) {\n const sheet = workbook.Sheets[sheetName];\n processSheet(sheetName, sheet);\n } else if (sheetName === 'Drop-Down Menus') {\n const sheet = workbook.Sheets[sheetName];\n processDropDownMenusSheet(sheet);\n } else if (sheetName === 'Dept Summary') {\n const sheet = workbook.Sheets[sheetName];\n processDeptSummarySheet(sheet);\n } else if (sheetName === `FY${FISCAL_YEAR} Gold Book`) {\n const sheet = workbook.Sheets[sheetName];\n processGoldBookSheet(sheet);\n }\n });\n console.log('all excel data saved');\n}\n\n// Utility function to append a sheet to the workbook if data is present\nfunction appendSheetToWorkbook(workbook, data, sheetName) {\n if (data.length > 0) {\n const sheet = XLSX.utils.json_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, sheet, sheetName);\n }\n}\nfunction downloadXLSX() {\n // grab data from baseline object\n const baseline = new models_baseline();\n const workbook = XLSX.utils.book_new(); // Create a new workbook\n\n // Initialize sheet data based on the names of each tab in the Excel doc\n const sheetData = Object.keys(SHEETS).reduce((acc, key) => {\n acc[key] = [];\n return acc;\n }, {});\n\n // Aggregate all rows across funds and combine for each tab\n baseline.funds.forEach(fund => {\n Object.keys(SHEETS).forEach(sheetName => {\n if (fund[SHEETS[sheetName]] && fund[SHEETS[sheetName]].table) {\n sheetData[sheetName].push(...fund[SHEETS[sheetName]].table);\n }\n });\n });\n\n // Add initiatives data (which isn't stored by fund)\n sheetData[Object.keys(SHEETS)[4]] = JSON.parse(localStorage.getItem('new-inits'));\n\n // Create a tab for each table\n Object.keys(sheetData).forEach(sheetName => {\n appendSheetToWorkbook(workbook, sheetData[sheetName], sheetName);\n });\n\n // Add a tab for the GoldBook\n XLSX.utils.book_append_sheet(workbook, gold_book.xlsx(), `FY${FISCAL_YEAR} Gold Book`);\n\n // add a tab for the drop downs and dept summary (just targets)\n writeJSONtoNewTab('dropdowns', 'Drop-Down Menus', workbook);\n writeJSONtoNewTab('dept-summary', 'Dept Summary', workbook);\n\n // Generate a downloadable file\n const wbout = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array'\n });\n const blob = new Blob([wbout], {\n type: 'application/octet-stream'\n });\n\n // Create a link and trigger the download\n const link = document.createElement(\"a\");\n link.href = URL.createObjectURL(blob);\n link.download = \"Filled_Detail_Sheet.xlsx\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\nfunction writeJSONtoNewTab(storage_key, tab_name, workbook) {\n const data = JSON.parse(localStorage.getItem(storage_key));\n console.log(data);\n const worksheet = XLSX.utils.aoa_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, worksheet, tab_name);\n}\nfunction excelSerialDateToJSDate(serial) {\n if (!serial) {\n return null;\n }\n ;\n // Excel considers 1900-01-01 as day 1, but JavaScript's Date considers\n // 1970-01-01 as day 0. Therefore, we calculate the number of milliseconds\n // between 1900-01-01 and 1970-01-01.\n const excelEpoch = new Date(Date.UTC(1899, 11, 30)); // JavaScript Consider December month as '11'\n\n // Calculate the JS date by adding serial days to the epoch date\n const date = new Date(excelEpoch.getTime() + serial * 24 * 60 * 60 * 1000);\n\n // Set the time part to zero (midnight)\n date.setUTCHours(0, 0, 0, 0);\n\n // Return the date part of the ISO string\n return date.toISOString().split('T')[0];\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/tooltip/tooltip.css\nvar tooltip = __webpack_require__(843);\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.css\n\n \n \n \n \n \n \n \n \n \n\nvar tooltip_options = {};\n\ntooltip_options.styleTagTransform = (styleTagTransform_default());\ntooltip_options.setAttributes = (setAttributesWithoutAttributes_default());\ntooltip_options.insert = insertBySelector_default().bind(null, \"head\");\ntooltip_options.domAPI = (styleDomAPI_default());\ntooltip_options.insertStyleElement = (insertStyleElement_default());\n\nvar tooltip_update = injectStylesIntoStyleTag_default()(tooltip/* default */.A, tooltip_options);\n\n\n\n\n /* harmony default export */ const tooltip_tooltip = (tooltip/* default */.A && tooltip/* default */.A.locals ? tooltip/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.js\n\n\n\n\n\n\nfunction hideTooltip() {\n document.getElementById('tooltip').style.visibility = 'hidden';\n}\nfunction showTooltip() {\n document.getElementById('tooltip').style.visibility = 'visible';\n}\nfunction editTooltipText(newText) {\n // edit text to display inside tooltip\n const tooltip = document.getElementById('tooltip');\n tooltip.innerHTML = newText;\n}\nfunction showAccountString(row) {\n const approp = cells.getText(row, 'approp-name');\n const cc = cells.getText(row, 'cc-name');\n const obj = cells.getText(row, 'object-name');\n const fund = cells.getText(row, 'fund-name');\n var message = `Fund: ${fund}
\n Appropriation: ${approp}
\n Cost Center: ${cc}`;\n if (obj) {\n message += `
Object: ${obj}`;\n }\n message += `
If you believe this account string is incorrect, please leave a comment \n in the comment column.`;\n editTooltipText(message);\n}\nfunction showSalaryProjection(row) {\n const general_increase = cells.getText(row, 'general-increase-rate');\n const merit_increase = cells.getText(row, 'merit-increase-rate');\n const current_salary = cells.getValue(row, 'current-salary');\n const proj_salary = cells.getValue(row, 'avg-salary');\n if (current_salary) {\n var message = `The average salary/wage for this position was \n ${formatCurrency(current_salary)} as of September 20${FISCAL_YEAR - 2}. \n Given a ${general_increase * 100}% general increase rate and a ${merit_increase * 100}% \n merit increase, the FY${FISCAL_YEAR} projection for this position's average \n annual salary/wage is ${formatCurrency(proj_salary)}. This projection takes into \n account the number of vacant vs. full positions.`;\n } else {\n var message = `The average salary/wage for this position was \n unknown as of September 20${FISCAL_YEAR - 2}, or the position\n did not exist. The FY${FISCAL_YEAR} projection for this position's \n average annual salary/wage is ${formatCurrency(proj_salary)}.`;\n }\n editTooltipText(message);\n}\nfunction showFinalPersonnelCost(row) {\n const proj_salary = cells.getValue(row, 'avg-salary');\n const ftes = cells.getText(row, 'baseline-ftes');\n const fringe = parseFloat(cells.getText(row, 'fringe'));\n const avg_benefits = proj_salary * fringe;\n const message = `The total cost captures ${ftes} position(s) at\n an annual salary/wage of ${formatCurrency(proj_salary)}, \n plus fringe benefits that cost ${formatCurrency(avg_benefits)} \n per position per year, on average.`;\n editTooltipText(message);\n}\nfunction showFICA(row) {\n const fica = parseFloat(cells.getText(row, 'fica'));\n const ficaPercentage = (fica * 100).toFixed(2);\n const message = `This total is overtime / holiday / shift premium pay, plus FICA (payroll tax), \n which is ${ficaPercentage}% for this cost center.`;\n editTooltipText(message);\n}\nfunction showCPA(row) {\n const cpa = parseFloat(cells.getText(row, 'cpa'));\n const description = cells.getText(row, 'cpa-description');\n const vendor = cells.getText(row, 'vendor');\n var contract_end = cells.getText(row, 'contract-end');\n // convert to normal date format from excel \n contract_end = excelSerialDateToJSDate(contract_end);\n const remaining = cells.getValue(row, 'remaining');\n if (cpa) {\n var message = `CPA #${cpa}`;\n } else {\n var message = `No CPA`;\n }\n if (vendor) {\n message += `
Vendor: ${vendor}`;\n }\n ;\n if (description) {\n message += `
Description: ${description}`;\n }\n ;\n if (contract_end) {\n message += `
Contract End Date: ${contract_end}`;\n }\n if (remaining) {\n message += `
Amount Remaining on Contract: ${formatCurrency(remaining)}`;\n }\n editTooltipText(message);\n}\nfunction tooltip_link(element, displayFn) {\n // add class to show cell with an underline, etc\n element.classList.add('tooltip-cell');\n\n // Create and append (detail)\n const detail = document.createElement('span');\n detail.classList.add('detail');\n detail.textContent = '(detail)';\n element.appendChild(detail);\n\n // add event listener to show tooltip on mouseover\n element.addEventListener('click', function (event) {\n const row = event.target.closest('tr');\n displayFn(row);\n showTooltip();\n });\n // and hide when mouse moves off\n element.addEventListener('mouseout', function () {\n hideTooltip();\n });\n // Update tooltip position on mouse move\n element.addEventListener('mousemove', function (event) {\n const tooltip = document.getElementById('tooltip');\n tooltip.style.top = event.clientY + 10 + 'px';\n tooltip.style.left = event.clientX + 10 + 'px';\n });\n}\nfunction linkAccountStringCol() {\n // get all relevant cells\n document.querySelectorAll('td.account-string').forEach(cell => {\n tooltip_link(cell, showAccountString);\n });\n}\nfunction linkSalaryCol() {\n // get all relevant cells\n document.querySelectorAll('td.avg-salary').forEach(cell => {\n tooltip_link(cell, showSalaryProjection);\n });\n}\nfunction linkTotalPersonnelCostCol() {\n // get all relevant cells\n document.querySelectorAll('td.total-baseline').forEach(cell => {\n tooltip_link(cell, showFinalPersonnelCost);\n });\n}\nfunction linkTotalOTCol() {\n // get all relevant cells\n document.querySelectorAll('td.total').forEach(cell => {\n tooltip_link(cell, showFICA);\n });\n}\nfunction linkCPACol() {\n // get all relevant cells\n document.querySelectorAll('td.cpa').forEach(cell => {\n tooltip_link(cell, showCPA);\n });\n}\nconst Tooltip = {\n hide: hideTooltip,\n show: showTooltip,\n linkAll: () => {\n linkAccountStringCol();\n switch (current_page.load()) {\n case 'personnel':\n // linkAccountStringCol();\n linkSalaryCol();\n linkTotalPersonnelCostCol();\n break;\n case 'overtime':\n linkTotalOTCol();\n // linkAccountStringCol();\n break;\n case 'nonpersonnel':\n // linkAccountStringCol();\n linkCPACol();\n break;\n // case 'revenue':\n // linkAccountStringCol();\n // break;\n // case 'new-inits':\n // linkAccountStringCol();\n // break;\n default:\n break;\n }\n },\n unlink: function () {\n let details = document.querySelectorAll('.detail');\n details.forEach(span => {\n span.remove();\n });\n }\n};\n/* harmony default export */ const components_tooltip_tooltip = (Tooltip);\n;// CONCATENATED MODULE: ./src/js/utils/JSON_data_handlers.js\nasync function fetchJSON(jsonFilePath) {\n return fetch(jsonFilePath).then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n });\n}\nfunction convertToJSON(table, colsToRemove = []) {\n const rows = table.rows;\n // Extract headers from the first row\n const headerRow = rows[0].cells;\n const headers = [];\n for (let j = 0; j < headerRow.length; j++) {\n headers.push(headerRow[j].innerText);\n }\n\n // initialize data\n var tableData = [];\n for (var i = 1; i < rows.length; i++) {\n const cols = rows[i].cells;\n const rowData = {};\n headers.forEach((header, index) => {\n if (colsToRemove.includes(header)) {\n return;\n } else if (cols[index].classList.contains('cost')) {\n rowData[header] = cols[index].getAttribute('value');\n } else {\n rowData[header] = cols[index].innerText;\n }\n });\n tableData.push(rowData);\n }\n return JSON.stringify(tableData);\n}\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction adjustTableWidth(width_pct) {\n const table = document.getElementById('main-table');\n table.style.width = width_pct;\n}\nfunction showTable() {\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = Table.html;\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n // delete table object from table container\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = '';\n subcomponents_buttons.AddRow.hide();\n}\nfunction saveTableData() {\n // remove the detail text\n components_tooltip_tooltip.unlink();\n // get table\n var table = document.getElementById('main-table');\n // determine save_as name\n if (current_fund.number()) {\n var save_as = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var save_as = current_page.load();\n }\n localStorage.setItem(save_as, convertToJSON(table, ['Edit']));\n // update sidebar with new data\n components_sidebar_sidebar.updateTotals();\n // relink, depending on page\n components_tooltip_tooltip.linkAll();\n}\nconst Table = {\n html: `\n \n \n \n
`,\n Buttons: subcomponents_buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n Filter: filters,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: hideTable,\n hide: hideTable,\n show: showTable,\n save: saveTableData\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.js\n\n\n\n\n\nfunction redirectForEdit() {\n const row = document.querySelector(`.active-editing`);\n const table = row.parentElement;\n const section = table.closest('.summary-container');\n // new initiative edits should all redirect to the new-inits page\n if (section.id == 'supp-accordion') {\n visitPage('new-inits');\n } else {\n // Split the string into parts using '-' as the delimiter; retain fund as 1st numeric segment\n const fund = table.id.split('-')[1];\n current_fund.update(fund);\n const lineItem = row.querySelector('.line-item').textContent;\n // visit the correct page for editing\n switch (lineItem) {\n case 'Personnel Expenditures':\n visitPage('personnel');\n break;\n case 'Non-Personnel Expenditures':\n visitPage('nonpersonnel');\n break;\n case 'Revenues':\n visitPage('revenue');\n break;\n case 'Overtime Expenditures':\n visitPage('overtime');\n break;\n default:\n console.error('Name of line item in table does not match a page destination.');\n }\n }\n}\nconst ExpenseTable = {\n table_id: account_string => {\n return `table-${account_string}`;\n },\n init(account_string) {\n // create empty table and put it in the accordion\n var table = document.createElement('table');\n table.id = this.table_id(account_string);\n table.classList.add('accordion-table');\n var parent = document.querySelector(`#string_${account_string}_content .accordion-body`);\n parent.appendChild(table);\n },\n createNewCell(content, row, className) {\n const newCell = document.createElement('td');\n newCell.innerHTML = content;\n newCell.classList.add(className);\n row.appendChild(newCell);\n },\n addRow(account_string, row_name, number) {\n var table = document.getElementById(this.table_id(account_string));\n var new_row = document.createElement('tr');\n table.appendChild(new_row);\n // Create a cell for the line item label\n this.createNewCell(row_name, new_row, 'line-item');\n // create a cell for the amount\n this.createNewCell(formatCurrency(number), new_row, 'cost');\n // create Edit button \n var button = '';\n if (row_name != 'Net Expenditures (Revenues)') {\n button = components_table_table.Buttons.Edit.html;\n }\n this.createNewCell(button, new_row);\n },\n fillFromFund(fund) {\n // use just fund as account string to initialize table inside accordion\n this.init(fund);\n const fundObject = new models_fund(fund);\n\n // Add a row for each appropriation in the fund\n const id = cleanString(fund);\n fundObject.getAppropriations().forEach(appropObj => {\n // if the total for the appropriation is > $0, add an accordion for all the CCs\n if (appropObj.total() != 0) {\n Item.add(appropObj.accountString(), `#string_${id}_content .accordion-body`);\n Item.updateHeader(appropObj.name(), appropObj.accountString(), appropObj.total());\n this.fillFromApprop(appropObj);\n }\n });\n },\n fillFromApprop(appropObj) {\n // initialize the table object\n this.init(appropObj.accountString());\n // add a collapsible row for each cost center\n appropObj.getCostCenters().forEach(ccObj => {\n if (ccObj.getTotal() != 0) {\n Item.add(ccObj.accountString(), `#string_${appropObj.accountString()}_content .accordion-body`);\n Item.updateHeader(ccObj.getName(), ccObj.accountString(), ccObj.getTotal());\n this.fillFromCC(ccObj);\n }\n });\n },\n fillFromCC(ccObj) {\n // initialize a table and summarize the line items\n this.init(ccObj.accountString());\n this.addRow(ccObj.accountString(), 'Personnel Expenditures', ccObj.getPersonnelCost());\n this.addRow(ccObj.accountString(), 'Overtime Expenditures', ccObj.getOvertimeCost());\n this.addRow(ccObj.accountString(), 'Non-Personnel Expenditures', ccObj.getNonPersonnelCost());\n this.addRow(ccObj.accountString(), 'Revenues', ccObj.getRevenue());\n this.addRow(ccObj.accountString(), 'Net Expenditures (Revenues)', ccObj.getTotal());\n },\n fillFromInit(program) {\n // Fill out info for each supplemental init\n this.init(program.id());\n this.addRow(program.id(), 'Estimated Revenue', program.revenue());\n this.addRow(program.id(), 'Personnel Expenditures', program.personnel());\n this.addRow(program.id(), 'Non-Personnel Operating', program.operating());\n this.addRow(program.id(), 'Non-Personnel Capital', program.capital());\n this.addRow(program.id(), 'Total Expenditures', program.total());\n }\n};\nconst Item = {\n accountString(fund, approp = '', cc = '') {\n var account_string = cleanString(fund);\n if (approp) {\n account_string += approp;\n }\n ;\n if (cc) {\n account_string += cc;\n }\n ;\n return account_string;\n },\n html(account_string) {\n return `

\n \n

\n
\n
\n
`;\n },\n add: function (account_string, accordion_query) {\n // get accordion and add a new item to it\n const parent = document.querySelector(accordion_query);\n const item_element = document.createElement('div');\n item_element.classList.add('accordion-item');\n item_element.innerHTML = this.html(account_string);\n parent.appendChild(item_element);\n },\n ExpenseTable: ExpenseTable,\n updateHeader: function (title, account_string, new_amount) {\n const header_btn = document.querySelector(`#string_${account_string}_header button`);\n header_btn.querySelector('span.name').textContent = title;\n header_btn.querySelector('span.amount').textContent = formatCurrency(new_amount);\n }\n};\nconst AddInitButton = {\n init() {\n const btn = document.querySelector('.btn-add-init');\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n }\n};\nconst Accordion = {\n Item: Item,\n AddInitButton: AddInitButton,\n hide: function () {\n document.querySelector('#accordion-div').style.display = 'none';\n // reset to delete content\n document.querySelector('#baseline-accordion .summary-accordion').innerHTML = '';\n document.querySelector('#supp-accordion .summary-accordion').innerHTML = '';\n },\n show: function () {\n document.querySelector('#accordion-div').style.display = 'block';\n },\n async createBaseline() {\n var funds = fund_lookup_table.listFunds();\n funds.forEach(fund => {\n Item.add(fund, '#baseline-accordion .summary-accordion');\n Item.ExpenseTable.fillFromFund(fund);\n const fundObject = new models_fund(fund);\n Item.updateHeader(`Fund ${fund_lookup_table.getName(fund)}`, fund, fundObject.getTotal());\n });\n\n // color-code GF baseline\n const GF = new models_fund(1000);\n // text to color code\n let topline = document.querySelector('#string_1000_header .amount');\n if (GF.getTotal() <= models_baseline.target()) {\n topline.style.color = 'green';\n topline.style.weight = 4;\n } else {\n topline.style.color = 'red';\n }\n },\n createSupp() {\n const supp = new supplemental();\n supp.initiatives.forEach(program => {\n Item.add(program.id(), '#supp-accordion .summary-accordion');\n Item.ExpenseTable.fillFromInit(program);\n Item.updateHeader(program.name, program.id(), program.total());\n });\n },\n updateTopLines() {\n // adjuse baseline\n // const baseline = new Baseline;\n const baseline = new models_baseline();\n const baselineAmount = document.querySelector('#baseline-title .top-line-amount');\n baselineAmount.textContent = formatCurrency(baseline.total());\n // adjust supplementals\n const supp = new supplemental();\n const suppAmount = document.querySelector('#supp-title .top-line-amount');\n suppAmount.textContent = formatCurrency(supp.total());\n },\n build() {\n this.createBaseline();\n this.createSupp();\n // initialize edit buttons\n components_table_table.Buttons.Edit.init(redirectForEdit);\n this.AddInitButton.init();\n this.updateTopLines();\n }\n};\n/* harmony default export */ const components_accordion_accordion = (Accordion);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/file_upload/file_upload.css\nvar file_upload = __webpack_require__(39);\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.css\n\n \n \n \n \n \n \n \n \n \n\nvar file_upload_options = {};\n\nfile_upload_options.styleTagTransform = (styleTagTransform_default());\nfile_upload_options.setAttributes = (setAttributesWithoutAttributes_default());\nfile_upload_options.insert = insertBySelector_default().bind(null, \"head\");\nfile_upload_options.domAPI = (styleDomAPI_default());\nfile_upload_options.insertStyleElement = (insertStyleElement_default());\n\nvar file_upload_update = injectStylesIntoStyleTag_default()(file_upload/* default */.A, file_upload_options);\n\n\n\n\n /* harmony default export */ const file_upload_file_upload = (file_upload/* default */.A && file_upload/* default */.A.locals ? file_upload/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.js\n// file_upload.js\n\n\n\nconst FileUpload = {\n init: function () {\n components_nav_buttons_nav_buttons.Next.disable();\n const inputObject = document.getElementById('file-input');\n inputObject.addEventListener('change', function (event) {\n readXL(event);\n });\n },\n show: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = '';\n },\n hide: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = 'none';\n }\n};\nfunction readXL(event) {\n const file = event.target.files[0]; // read uploaded file\n const spinner = document.getElementById('upload-spinner'); // get the spinner element\n\n if (file) {\n // Show the spinner\n spinner.style.display = 'block';\n\n // read in new data\n const reader = new FileReader();\n reader.onload = function (e) {\n const arrayBuffer = e.target.result;\n try {\n processWorkbook(arrayBuffer);\n\n // Hide the spinner once processing is done\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Enable the next button after processing\n } catch (error) {\n console.error('Error processing workbook:', error);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n }\n };\n reader.onerror = function (err) {\n console.error('Error reading file:', err);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n };\n reader.readAsArrayBuffer(file); // Read the file as an ArrayBuffer\n }\n}\n/* harmony default export */ const components_file_upload_file_upload = (FileUpload);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/modal/modal.css\nvar modal = __webpack_require__(95);\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.css\n\n \n \n \n \n \n \n \n \n \n\nvar modal_options = {};\n\nmodal_options.styleTagTransform = (styleTagTransform_default());\nmodal_options.setAttributes = (setAttributesWithoutAttributes_default());\nmodal_options.insert = insertBySelector_default().bind(null, \"head\");\nmodal_options.domAPI = (styleDomAPI_default());\nmodal_options.insertStyleElement = (insertStyleElement_default());\n\nvar modal_update = injectStylesIntoStyleTag_default()(modal/* default */.A, modal_options);\n\n\n\n\n /* harmony default export */ const modal_modal = (modal/* default */.A && modal/* default */.A.locals ? modal/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.js\n\nfunction clearModal() {\n updateModalTitle('');\n document.getElementById('modal-body').innerHTML = '';\n}\nfunction hideModal() {\n $('#main-modal').modal('hide');\n}\nfunction showModal() {\n $('#main-modal').modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\n}\nconst Submit = {\n handler: null,\n init: function (onSubmit) {\n const modal = document.getElementById('main-modal');\n\n // Deinitialize first to avoid multiple bindings\n this.deinit();\n this.handler = function (event) {\n event.preventDefault();\n onSubmit(event);\n };\n\n // Adding the handler as the event listener\n modal.addEventListener('submit', this.handler);\n\n // add event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.addEventListener('click', hideModal);\n },\n deinit: function () {\n const modal = document.getElementById('main-modal');\n if (this.handler !== null) {\n // Removing the event listener and clear the handler\n modal.removeEventListener('submit', this.handler);\n this.handler = null;\n }\n\n // remove event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.removeEventListener('click', hideModal);\n }\n};\nconst Link = {\n add: function (button_id) {\n document.getElementById(button_id).addEventListener('click', showModalHandler);\n },\n remove: function (button_id) {\n document.getElementById(button_id).removeEventListener('click', showModalHandler);\n }\n};\nfunction updateModalTitle(title) {\n document.getElementById('modal-title').textContent = title;\n}\nconst Title = {\n update: function (title) {\n updateModalTitle(title);\n }\n};\nconst Modal = {\n hide: hideModal,\n show: showModal,\n clear: clearModal,\n Title: Title,\n Link: Link,\n Submit: Submit\n};\n/* harmony default export */ const components_modal_modal = (Modal);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\n\n\n\n\n\n\n\n\n\n\nfunction resetPage() {\n // hide everything in the body\n components_welcome_welcome.hide();\n components_modal_modal.clear();\n components_modal_modal.hide();\n components_nav_buttons_nav_buttons.hide();\n js_components_prompt_prompt.hide();\n components_table_table.hide();\n components_sidebar_sidebar.hide();\n components_accordion_accordion.hide();\n components_file_upload_file_upload.hide();\n components_tooltip_tooltip.hide();\n\n // reset filter dropdowns\n components_table_table.Filter.deleteAll();\n js_components_prompt_prompt.Buttons.reset();\n // disable submit button\n components_modal_modal.Submit.deinit();\n}\nconst Body = {\n reset: resetPage\n};\n/* harmony default export */ const components_body_body = (Body);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/header/header.css\nvar header = __webpack_require__(107);\n;// CONCATENATED MODULE: ./src/js/components/header/header.css\n\n \n \n \n \n \n \n \n \n \n\nvar header_options = {};\n\nheader_options.styleTagTransform = (styleTagTransform_default());\nheader_options.setAttributes = (setAttributesWithoutAttributes_default());\nheader_options.insert = insertBySelector_default().bind(null, \"head\");\nheader_options.domAPI = (styleDomAPI_default());\nheader_options.insertStyleElement = (insertStyleElement_default());\n\nvar header_update = injectStylesIntoStyleTag_default()(header/* default */.A, header_options);\n\n\n\n\n /* harmony default export */ const header_header = (header/* default */.A && header/* default */.A.locals ? header/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/header/header.js\n\n\n\nconst header_Title = {\n update: function (title) {\n document.getElementById(\"title\").textContent = title;\n },\n default() {\n this.update(`FY${FISCAL_YEAR} Budget Request`);\n }\n};\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = current_fund.name();\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/form/form.css\nvar form_form = __webpack_require__(109);\n;// CONCATENATED MODULE: ./src/js/components/form/form.css\n\n \n \n \n \n \n \n \n \n \n\nvar form_options = {};\n\nform_options.styleTagTransform = (styleTagTransform_default());\nform_options.setAttributes = (setAttributesWithoutAttributes_default());\nform_options.insert = insertBySelector_default().bind(null, \"head\");\nform_options.domAPI = (styleDomAPI_default());\nform_options.insertStyleElement = (insertStyleElement_default());\n\nvar form_update = injectStylesIntoStyleTag_default()(form_form/* default */.A, form_options);\n\n\n\n\n /* harmony default export */ const components_form_form = (form_form/* default */.A && form_form/* default */.A.locals ? form_form/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/fields.js\n// function to add questions to forms\n\n\n\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(label, inputEl, inputId, required) {\n // change if we want forms elsewhere\n const form = document.getElementById('new-form');\n\n // create outer wrapper for element\n const wrapper = document.createElement('div');\n\n // label question\n const labelEl = document.createElement('label');\n labelEl.textContent = label;\n\n // mark as required if applicable\n inputEl.required = required;\n\n // If an ID is provided, set it on the element\n if (inputId) {\n //inputEl.id = `input-${inputId}`;\n inputEl.id = inputId;\n }\n\n // create validation text/ a place to display errors\n const validationText = document.createElement('p');\n validationText.id = `${inputId}-validation`;\n validationText.classList.add('error-message');\n validationText.style.color = 'red';\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n wrapper.appendChild(validationText);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'text';\n appendFormElement(label, inputEl, inputId, required);\n },\n longText: function (label, inputId, required = false) {\n const inputEl = document.createElement('textarea');\n appendFormElement(label, inputEl, inputId, required);\n },\n numericInput: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'number';\n appendFormElement(label, inputEl, inputId, required);\n },\n dropdown: function (label, inputId, optionArray, required = false) {\n var inputEl = subcomponents_dropdown.create(optionArray);\n appendFormElement(label, inputEl, inputId, required);\n }\n};\n/* harmony default export */ const fields = (NewField);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/submit.js\nfunction addSubmitButtonToForm(form_id) {\n // Find the form by its ID\n const form = document.getElementById(form_id);\n\n // Create the container `div` for the button\n const buttonContainer = document.createElement('div');\n buttonContainer.id = 'submit-btn-container';\n\n // Create the submit input\n const submitInput = document.createElement('input');\n submitInput.className = 'btn btn-submit'; // Use appropriate class for your design\n submitInput.type = 'submit';\n submitInput.value = 'Submit';\n\n // Append the submit input to the container\n buttonContainer.appendChild(submitInput);\n\n // Append the container to the form\n form.appendChild(buttonContainer);\n}\nconst SubmitButton = {\n add: function () {\n addSubmitButtonToForm('new-form');\n }\n};\n/* harmony default export */ const subcomponents_submit = (SubmitButton);\n;// CONCATENATED MODULE: ./src/js/components/form/form.js\n\n\n\n\nfunction fetchAllResponses(event) {\n // Assuming `event.target` is the form itself\n const form = event.target;\n\n // Initialize an empty array to hold the input values\n let formData = {};\n\n // Loop through each form element\n for (let i = 0; i < form.elements.length; i++) {\n const element = form.elements[i];\n\n // Exclude elements that aren't inputs, textareas, or select\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\n // Exclude input types that are not considered for submission (such as `submit`)\n if (element.type !== 'submit' && element.type !== 'button') {\n formData[element.id] = element.value;\n }\n }\n }\n form.reset();\n return formData;\n}\nfunction addForm(element_id = 'modal-body', form_id = 'new-form') {\n const target_elem = document.getElementById(element_id);\n\n // create form\n const form = document.createElement('form');\n form.setAttribute('id', form_id);\n\n // Append the form to the modal body\n target_elem.appendChild(form);\n}\nconst Form = {\n new: function (parent_elem_id) {\n addForm(parent_elem_id, 'new-form');\n },\n fetchAllResponses: function (event) {\n return fetchAllResponses(event);\n },\n NewField: fields,\n Dropdown: subcomponents_dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/view_class.js\n\n\n\n\n\n\n\n\n\nclass View {\n constructor() {\n // page state in local storage\n this.page_state = '';\n\n // whether to display\n this.navButtons = true;\n this.sidebar = true;\n\n // text to show in the prompt area\n this.prompt = null;\n\n // subtitle text\n this.subtitle = '';\n\n // table object of class ViewTable or null\n this.table = null;\n }\n visit() {\n // update page state\n current_page.update(this.page_state);\n\n // start with a blank page\n components_body_body.reset();\n\n // add default title\n header_Title.default();\n\n // default to showing navbuttons\n if (this.navButtons) {\n components_nav_buttons_nav_buttons.show();\n }\n ;\n\n // default to showing sidebar\n if (this.sidebar) {\n components_sidebar_sidebar.show();\n }\n ;\n\n // initialize prompt text and buttons\n if (this.prompt) {\n js_components_prompt_prompt.Text.update(this.prompt);\n }\n ;\n\n // initialize table\n if (this.table) {\n this.table.build();\n }\n\n // show page subtitle\n if (this.subtitle) {\n Subtitle.update(this.subtitle);\n }\n ;\n }\n cleanup() {\n return;\n }\n}\nclass ViewTable {\n constructor() {\n // Ensure methods retain the correct `this` context\n this.submitNewRow = this.submitNewRow.bind(this);\n this.columns = [{\n title: 'Account String',\n className: 'account-string'\n }, {\n title: 'Appropriation Name',\n className: 'approp-name',\n hide: true\n }, {\n title: 'Appropriation',\n className: 'approp',\n hide: true\n }, {\n title: 'Cost Center Name',\n className: 'cc-name',\n hide: true\n }, {\n title: 'Cost Center',\n className: 'cc',\n hide: true\n }, {\n title: 'Fund Name',\n className: 'fund-name',\n hide: true\n }, {\n title: 'Fund',\n className: 'fund',\n hide: true\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n\n // whether to add an edit column\n this.addEdit = true;\n\n // message to show if there's no saved data\n this.noDataMessage = null;\n\n // text to show for new row button\n this.addButtonText = null;\n\n // whether to show as a datatable\n this.dataTable = true;\n }\n async refreshData() {\n // check for data\n await components_table_table.Data.load();\n\n // create a datatable object\n if (this.dataTable) {\n this.initDataTable();\n }\n\n // add an edit column if needed\n if (this.addEdit) {\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, 'Edit');\n // activate edit buttons\n components_table_table.Buttons.Edit.init(this.actionOnEdit, this.updateTable);\n }\n\n // assign the correct classes based on the table columns\n components_table_table.Columns.assignClasses(this.columns);\n\n // Apply any update function to make sure sidebar is up to date\n this.updateTable();\n // add any newly created cc or approp to the filters\n this.updateFilters();\n }\n async build() {\n // build table from local storage and initialize edit buttons\n\n // add the add new row button if needed\n if (this.addButtonText) {\n this.setUpForm();\n }\n\n // check for data\n if (await components_table_table.Data.load()) {\n // if there's data, update the table and add filters \n this.addFilters();\n await this.refreshData();\n } else {\n // show a message if there's no saved table data for the selected fund\n if (this.noDataMessage) {\n js_components_prompt_prompt.Text.update(this.noDataMessage);\n }\n }\n }\n addFilters() {\n // Add all relevant filters to table\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.add('Appropriation', 'approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.add('Cost Center', 'cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.add('Object', 'object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.add('Object Category', 'object-category');\n }\n }\n updateFilters() {\n // update filters with any new values\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.updateOptions('Appropriation', 'approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.updateOptions('Cost Center', 'cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.updateOptions('object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.updateOptions('object-category');\n }\n }\n initDataTable() {\n components_table_table.adjustWidth('100%');\n // Initialize Datatables\n if (!$.fn.dataTable.isDataTable('#main-table')) {\n $('#main-table').DataTable({\n paging: false,\n // Disable pagination\n info: false,\n // Disable table information display\n searching: false // Disable the search bar\n });\n }\n ;\n }\n\n // placeholder for action on row edit click\n actionOnEdit() {\n return;\n }\n\n // update function for the sidebar; default to just saving the table\n updateTable() {\n components_table_table.save();\n }\n\n // extra questions of the form to add a new row\n addCustomQuestions() {\n return;\n }\n addValidationListener(inputId, fieldLabel, validationId, length) {\n const inputElement = document.getElementById(inputId);\n inputElement.addEventListener('change', function () {\n if (inputElement.value === 'Add new') {\n // Add a new field after the selected element\n js_components_form_form.NewField.shortText(`Type new ${fieldLabel}:`, inputId.slice(0, -5), true);\n let newInputElement = document.getElementById(inputId.slice(0, -5)); // Remove '-name' suffix\n inputElement.parentElement.insertAdjacentElement('afterend', newInputElement.parentElement);\n\n // Add an event listener for validation on the new input field\n newInputElement.addEventListener('blur', function () {\n let validationText = document.getElementById(validationId);\n validationText.textContent = '';\n if (newInputElement.value.length !== length) {\n validationText.textContent = `${fieldLabel} codes must be exactly ${length} numbers.`;\n } else if (isNaN(Number(newInputElement.value))) {\n validationText.textContent = `${fieldLabel} codes must be numeric.`;\n }\n });\n } else {\n // Remove the new input field if 'Add new' is not selected\n let newInputElement = document.getElementById(inputId.slice(0, -5));\n if (newInputElement) {\n newInputElement.parentElement.innerHTML = '';\n }\n }\n });\n }\n\n // Modified addModalValidation method\n addModalValidation() {\n this.addValidationListener('approp-name', 'Appropriation', 'approp-validation', 5);\n this.addValidationListener('cc-name', 'Cost Center', 'cc-validation', 6);\n }\n setUpForm() {\n // show add button\n components_table_table.Buttons.AddRow.show();\n components_table_table.Buttons.AddRow.updateText(this.addButtonText);\n\n // set up modal for form when add button is pressed\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update(this.addButtonText);\n\n // create form\n js_components_form_form.new('modal-body');\n\n // add custom questions\n this.addCustomQuestions();\n // any validation or special functions\n this.addModalValidation();\n // add submit button\n js_components_form_form.SubmitButton.add();\n\n // Initialize form submission to table data\n components_modal_modal.Submit.init(this.submitNewRow);\n }\n editColumns(responses) {\n // if a new appropriation was entered, fix it\n if (responses['approp']) {\n responses['approp-name'] = `${responses['approp']} - New`;\n }\n ;\n // same for cost center\n if (responses['cc']) {\n responses['cc-name'] = `${responses['cc']} - New`;\n }\n ;\n\n // get numbers from account string names\n if (responses['fund-name']) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n }\n ;\n if (responses['approp-name']) {\n responses['approp'] = account_string.getNumber(responses['approp-name']);\n }\n ;\n if (responses['cc-name']) {\n responses['cc'] = account_string.getNumber(responses['cc-name']);\n }\n ;\n if (responses['object-name']) {\n responses['object'] = account_string.getNumber(responses['object-name']);\n }\n ;\n responses['account-string'] = account_string.build(responses['approp-name'], responses['cc-name'], responses['object-name'], responses['fund']);\n return responses;\n }\n submitNewRow(event) {\n // get answers from form, hide form, show answers in table\n var responses = js_components_form_form.fetchAllResponses(event);\n\n // edit inputs from modal\n responses = this.editColumns(responses);\n\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n\n // add data to table\n components_table_table.Rows.add(responses, this.columns);\n components_table_table.save();\n\n // rebuild table\n this.refreshData();\n }\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome.js\n\n\n\n\nclass WelcomeView extends View {\n constructor() {\n super();\n this.page_state = 'welcome';\n this.subtitle = 'Welcome';\n this.sidebar = false;\n this.navButtons = false;\n this.prompt = `This tool will help you prepare your budget request submission for fiscal year \n 20${FISCAL_YEAR}. Start by uploading the detail sheet sent to you by your budget analyst. This\n tool will use the data in that sheet to pre-fill your submission with last year's request.\n

\n Then, you will be guided through each fund to make any adjustments from last year's request. \n As you \n make these adjustments, you will see a sidebar tracking your total expenditures by fund and your target\n baseline for the general fund. \n

\n Once you get through all funds and set your request at or below the \n target, you will be able to download a filled version of the Excel detail sheet. Downloading \n this file is the only permanent way to save your progress.`;\n }\n visit() {\n super.visit();\n\n // show welcome section\n components_welcome_welcome.show();\n\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', () => visitPage('upload'));\n // document.getElementById('step-initiatives').addEventListener('click', () => visitPage('new-inits'));\n // document.getElementById('step-revenue').addEventListener('click', () => visitPage('baseline-landing'));\n // document.getElementById('step-finish').addEventListener('click', () => visitPage('summary'));\n }\n}\n/* harmony default export */ const _00_welcome = (WelcomeView);\n;// CONCATENATED MODULE: ./src/js/views/01_upload.js\n\n\nclass UploadView extends View {\n constructor() {\n super();\n this.page_state = 'upload';\n this.prompt = `Upload the baseline detail sheet given by your budget analyst.`;\n this.subtitle = 'Excel Upload';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n components_file_upload_file_upload.show();\n components_file_upload_file_upload.init();\n }\n}\n/* harmony default export */ const _01_upload = (UploadView);\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing.js\n\n\n\n\nclass FundView extends View {\n constructor() {\n super();\n this.page_state = 'baseline-landing';\n this.prompt = `We will now ask you a series of questions about your BASELINE budget request.\n At the end, we will ask you about any new initiatives (ie. supplemental requests).\n Select one of your funds then click continue.`;\n this.subtitle = 'Baseline Budget Request';\n this.table = new FundTable();\n this.sidebar = false;\n this.dataTable = false;\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n }\n}\nclass FundTable extends ViewTable {\n constructor() {\n super();\n\n // add additional revenue columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund-name'\n }];\n this.noDataMessage = 'No funds found.';\n this.addEdit = false;\n }\n build() {\n // load in fund data\n components_table_table.show();\n components_table_table.Data.loadFunds();\n components_table_table.Columns.assignClasses(this.columns);\n components_table_table.adjustWidth('30%');\n\n // disable next button until a fund is selected\n components_nav_buttons_nav_buttons.Next.disable();\n allowRowSelection();\n }\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\n\n // enable highlight on hover and on select\n tableRows.forEach(function (row) {\n row.addEventListener('mouseover', function () {\n this.classList.add('hover-effect');\n });\n row.addEventListener('mouseout', function () {\n this.classList.remove('hover-effect');\n });\n row.addEventListener('click', function () {\n selectFund(tableRows, this);\n });\n });\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n\n // add selected class to clicked row\n selected_row.classList.add('selected');\n\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n var fundNumber = parseInt(fund);\n current_fund.update(fundNumber);\n\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n/* harmony default export */ const _02_baseline_landing = (FundView);\n;// CONCATENATED MODULE: ./src/js/views/03_revenue.js\n\n\nclass RevenueView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'revenue';\n this.prompt = `Review and edit revenue line items. If you change the estimate or \n notice an error in an account string, please note it in the notes column. Click edit \n to change values in a row.`;\n this.subtitle = 'Revenues';\n this.table = new RevenueTable(fiscal_year);\n }\n}\nclass RevenueTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional revenue columns to the table\n this.columns = this.columns.concat([{\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Object Category',\n className: 'object-category'\n }, {\n title: `FY${fiscal_year} Departmental Estimate Total`,\n className: 'request',\n isCost: true\n }, {\n title: 'Departmental Estimate Notes',\n className: 'notes'\n },\n // hidden\n {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }]);\n this.noDataMessage = 'No revenues for this fund.';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n // only allow edits in the notes box\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n}\n/* harmony default export */ const _03_revenue = (RevenueView);\n;// CONCATENATED MODULE: ./src/js/views/04_personnel.js\n\n\n\n\n\n\n\nclass PersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'personnel';\n this.prompt = `\n This table displays the number of FTEs in each job code for in your department's \n current (amended) FY25 budget. To make edits to the number of positions, click the\n \"Edit\" button on the row you would like to edit. The \"Total Cost\" column and the \n summary sidebar will also update to reflect any edits.`;\n this.subtitle = 'Personnel';\n this.table = new PersonnelTable(fiscal_year);\n }\n}\nclass PersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n this.fiscal_year = fiscal_year;\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: 'Job Title',\n className: 'job-name'\n }, {\n title: 'Job Code',\n className: 'job-code'\n }, {\n title: 'Employee Type',\n className: 'employee-type'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: `FY${this.fiscal_year} Requested FTE`,\n className: 'baseline-ftes'\n }, {\n title: `FY${this.fiscal_year} Projected Average Salary/Wage`,\n className: 'avg-salary',\n isCost: true\n }, {\n title: 'Total Sal/Wag & Ben Request',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'Fringe Benefits Rate',\n className: 'fringe',\n hide: true\n }, {\n title: 'General Increase Rate',\n className: 'general-increase-rate',\n hide: true\n }, {\n title: 'Step/Merit Increase Rate',\n className: 'merit-increase-rate',\n hide: true\n }, {\n title: `Average Salary/Wage as of 9/1/20${this.fiscal_year - 2}`,\n className: 'current-salary',\n isCost: true,\n hide: true\n }]);\n this.noDataMessage = 'No personnel expenditures for this fund.';\n this.addButtonText = 'Add new job';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let avg_salary = components_table_table.Cell.getValue(rows[i], 'avg-salary');\n let fringe = parseFloat(components_table_table.Cell.getText(rows[i], 'fringe'));\n let baseline_ftes = components_table_table.Cell.getText(rows[i], 'baseline-ftes');\n\n // calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe\n let total_baseline_cost = avg_salary * baseline_ftes * (1 + fringe);\n\n // update total column\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.shortText('Job Code:', 'job-code', true);\n js_components_form_form.NewField.shortText('Job Title:', 'job-name', true);\n js_components_form_form.NewField.dropdown('Employee Type:', 'employee-type', EMPLOYEE_TYPES, true), js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.shortText('Number of FTEs requested:', 'baseline-ftes', true);\n js_components_form_form.NewField.shortText(`Projected average salary IN FISCAL YEAR ${this.fiscal_year}:`, 'avg-salary', true);\n //Form.NewField.shortText(`Expected fringe rate (as a percentage)`, 'fringe', true);\n }\n addModalValidation() {\n super.addModalValidation();\n\n // lock the job description \n const jobDescription = document.getElementById('job-name');\n jobDescription.readOnly = true;\n // give a message if attempt to edit\n const nameValidationText = document.getElementById('job-name-validation');\n jobDescription.addEventListener('click', function () {\n nameValidationText.textContent = 'This field is not editable and will auto-fill from the job code above.';\n });\n // hide message on blur\n jobDescription.addEventListener('blur', function () {\n nameValidationText.textContent = '';\n });\n\n // confirm that entered job code is in the gold book\n const jobCodeInput = document.getElementById('job-code');\n jobCodeInput.addEventListener('blur', function () {\n // get entered job code\n const jobCode = jobCodeInput.value;\n // get validation text element\n const validationText = document.getElementById('job-code-validation');\n if (!gold_book.codeExists(jobCode)) {\n // if the job code doesn't exist, show an error message\n validationText.textContent = 'This job code does not exist in the current Gold Book. Please enter another code.';\n // and clear any previous entry in the job title \n jobDescription.value = '';\n } else {\n // if it does exist, change the job title accordingly\n jobDescription.value = gold_book.getTitle(jobCode);\n // and clear any error messages\n validationText.textContent = '';\n }\n });\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n // use gold book to look up info based on job code\n responses['job-name'] = gold_book.getTitle(responses['job-code']);\n responses['fringe'] = gold_book.getFringeRate(responses['job-code']);\n return responses;\n }\n}\n/* harmony default export */ const _04_personnel = (PersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/05_overtime.js\n\n\n\n\n\n\nclass OvertimeView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'overtime';\n this.prompt = `\n Please see your baseline overtime / holiday pay / shift premiums in the table below.\n Make any edits and continue.`;\n this.subtitle = 'Overtime Estimates';\n this.table = new OvertimeTable(fiscal_year);\n }\n}\nclass OvertimeTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional OT columns to the table\n this.columns = this.columns.concat([{\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Departmental Request OT/SP/Hol',\n className: 'OT-pay',\n isCost: true\n }, {\n title: `FY${fiscal_year} Total OT/SP/Hol + FICA Request`,\n className: 'total',\n isCost: true\n }, {\n title: 'Object Name',\n className: 'object-name'\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'FICA Rate',\n className: 'fica',\n hide: true\n }]);\n this.noDataMessage = 'No overtime expenditures for this fund.';\n this.addButtonText = 'Add new cost center';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('OT-pay', true);\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createDropdown('object-name', OT_OBJECTS);\n components_table_table.Cell.createTextbox('notes');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let OT_salary = components_table_table.Cell.getValue(rows[i], 'OT-pay');\n let fica_rate = components_table_table.Cell.getText(rows[i], 'fica');\n\n // add salary and wages and fringe benefits (FICA)\n let row_total = OT_salary * (1 + parseFloat(fica_rate));\n\n // update total\n components_table_table.Cell.updateValue(rows[i], 'total', row_total);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object (salary or wage):', 'object-name', OT_OBJECTS, true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Overtime amount requested:', 'OT-pay', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['OT-pay'] = unformatCurrency(responses['OT-pay']);\n responses['fica'] = 0.0765;\n return responses;\n }\n}\n/* harmony default export */ const _05_overtime = (OvertimeView);\n;// CONCATENATED MODULE: ./src/js/views/06_nonpersonnel.js\n\n\n\n\n\n\nclass NonPersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'nonpersonnel';\n this.prompt = `Review and edit non-personnel line items. The CPA numbers are the \n Contract and Procurement Account numbers. Click on the 'detail' link for a CPA \n to see the contract details. Some line items won't have a CPA number.`;\n this.subtitle = 'Non-Personnel';\n this.table = new NonPersonnelTable(fiscal_year);\n }\n}\nclass NonPersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: `FY${fiscal_year} Departmental Request Total`,\n className: 'request',\n isCost: true\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Vendor Name',\n className: 'vendor'\n }, {\n title: 'CPA #',\n className: 'cpa'\n },\n // hidden columns\n {\n title: 'End Date',\n className: 'contract-end',\n hide: true\n }, {\n title: 'BPA/CPA Amount Remaining',\n className: 'remaining',\n isCost: true,\n hide: true\n }, {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }, {\n title: 'Object Category',\n className: 'object-category',\n hide: true\n }, {\n title: 'BPA/CPA Description',\n className: 'cpa-description',\n hide: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n }]);\n this.noDataMessage = 'No non-personnel expenditures for this fund.';\n this.addButtonText = 'Add new non-personnel item';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('request', true);\n components_table_table.Cell.createServiceDropdown();\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createTextbox('notes');\n }\n addCustomQuestions() {\n // form questions to add a new row\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object Category:', 'object-category', OBJ_CATEGORIES.list, true);\n // TODO: maybe give dropdown based on selected obj category\n js_components_form_form.NewField.shortText('Object Number (if known):', 'object', false);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.longText('Describe your new request:', 'cpa-description', true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Amount requested:', 'request', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n responses['fringe'] = parseFloat(responses['fringe']) / 100;\n return responses;\n }\n}\n/* harmony default export */ const _06_nonpersonnel = (NonPersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/07_new_initiatives.js\n\n\n\n\n\n\nconst dropdownOptions = ['N/A', 'One-Time', 'Recurring'];\n\n// set up page and initialize all buttons\nclass InitiativesView extends View {\n constructor() {\n super();\n this.page_state = 'new-inits';\n this.prompt = `\n This is the place to propose new initiatives for FY${FISCAL_YEAR}.\n New initiative submissions will count as supplemental line items and will be the starting \n point for a conversation with both OB and ODFS, who will help with the details.`;\n this.subtitle = 'New Initiatives';\n this.table = new InitiativesTable();\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n }\n}\nclass InitiativesTable extends ViewTable {\n constructor() {\n super();\n\n // add additional columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund'\n }, {\n title: 'Supplemental Initiative',\n className: 'init-name'\n }, {\n title: 'Total Initiative Request',\n className: 'total',\n isCost: true\n },\n // { title: 'Personnel FTE', className: 'ftes'},\n {\n title: 'Personnel Salary & Benefits',\n className: 'personnel',\n isCost: true\n }, {\n title: 'Non-Personnel Operating',\n className: 'nonpersonnel',\n isCost: true\n }, {\n title: 'Non-Personnel Capital',\n className: 'nonpersonnel-capital',\n isCost: true\n },\n // { title: 'Revenue', className: 'revenue', isCost: true },\n // { title: 'Revenue Type', className: 'rev-type' },\n {\n title: 'Description & Justification',\n className: 'notes'\n }, {\n title: 'Recurring or One-Time',\n className: 'rev-type'\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n this.addButtonText = 'Add new initiative';\n }\n addCustomQuestions() {\n // general questions\n js_components_form_form.NewField.shortText('Initiative Name:', 'init-name', true);\n js_components_form_form.NewField.longText('What is the business case for the Initiative?', 'q1', true);\n js_components_form_form.NewField.longText(`Why is the initiative needed? What is the value-add to residents? \n What is the Department’s plan for implementing the Initiative?`, 'q2', true);\n js_components_form_form.NewField.longText(`Why can’t the Initiative be funded with the Department’s baseline budget?`, 'q3', true);\n js_components_form_form.NewField.dropdown(`Is this initiative one-time or recurring?`, 'rev-type', dropdownOptions);\n\n // Account string info\n js_components_form_form.NewField.dropdown('Fund:', 'fund-name', fund_lookup_table.listFundNames('Add new'), true);\n\n // Numbers\n js_components_form_form.NewField.numericInput('What is your ballpark estimate of TOTAL ADDITONAL expenses associated with this initiative?', 'total', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'personnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel operating cost?', 'nonpersonnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel capital costs?', 'nonpersonnel-capital', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL revenue (if applicable)?', 'revenue', false);\n }\n editColumns(responses) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n responses['notes'] = `${responses['q1']} ${responses['q2']} ${responses['q3']}`;\n return responses;\n }\n addModalValidation() {\n super.addValidationListener('fund-name', 'Fund', 'fund-validation', 4);\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('total', true);\n // Table.Cell.createTextbox('revenue', true);\n components_table_table.Cell.createTextbox('personnel', true);\n components_table_table.Cell.createTextbox('nonpersonnel', true);\n components_table_table.Cell.createTextbox('nonpersonnel-capital', true);\n components_table_table.Cell.createTextbox('init-name');\n components_table_table.Cell.createDropdown('rev-type', dropdownOptions);\n components_table_table.Cell.createTextbox('notes');\n }\n}\n/* harmony default export */ const _07_new_initiatives = (InitiativesView);\n;// CONCATENATED MODULE: ./src/js/views/08_summary.js\n\n\n\n\n\n\n\n\nfunction compareToTarget() {\n const baseline = new models_baseline();\n if (baseline.genFundTotal() <= models_baseline.target()) {\n js_components_prompt_prompt.Text.update(`Congrats! Your General Fund budget is below your target! \n Edit any line items below or download your completed Excel.`);\n } else {\n js_components_prompt_prompt.Text.update(`Your General Fund budget is above your GF target of ${formatCurrency(models_baseline.target())}. \n Please expand the summary table below and edit line items until you meet your target. \n When you meet the target, you will be able to download the Excel sheet.`);\n js_components_prompt_prompt.Buttons.Right.disable();\n }\n js_components_prompt_prompt.show();\n}\nfunction returnToWelcome() {\n const welcome = new _00_welcome();\n const left = document.getElementById('option1');\n welcome.visit();\n}\n;\nclass SummaryView extends View {\n constructor() {\n super();\n this.page_state = 'summary';\n this.subtitle = 'Summary';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n\n // reset fund\n current_fund.reset();\n\n // show summary accordion\n Accordion.build();\n Accordion.show();\n\n // add prompt buttons\n js_components_prompt_prompt.Buttons.Right.updateText('Download Excel');\n js_components_prompt_prompt.Buttons.Left.updateText('Start over with new Excel upload');\n // add button links\n js_components_prompt_prompt.Buttons.Left.addAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.addAction(downloadXLSX);\n\n // update prompt text depending on target matching\n compareToTarget();\n }\n cleanup() {\n // delete event listeners\n js_components_prompt_prompt.Buttons.Left.removeAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.removeAction(downloadXLSX);\n js_components_prompt_prompt.Buttons.Right.enable();\n }\n}\n/* harmony default export */ const _08_summary = (SummaryView);\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\n\n// Initialize pages globally once\nconst PAGES = {\n 'welcome': new _00_welcome(),\n 'upload': new _01_upload(),\n 'baseline-landing': new _02_baseline_landing(),\n 'revenue': new _03_revenue(FISCAL_YEAR),\n 'personnel': new _04_personnel(FISCAL_YEAR),\n 'overtime': new _05_overtime(FISCAL_YEAR),\n 'nonpersonnel': new _06_nonpersonnel(FISCAL_YEAR),\n 'new-inits': new _07_new_initiatives(),\n 'summary': new _08_summary()\n};\nfunction visitPage(new_page_key) {\n var page_state = current_page.load();\n\n // Perform cleanup from the current page\n if (PAGES[page_state]) {\n PAGES[page_state].cleanup();\n }\n if (PAGES[new_page_key]) {\n PAGES[new_page_key].visit();\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n}\nfunction nextPage() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n const returnPages = ['revenue', 'nonpersonnel', 'new-inits', 'overtime', 'personnel'];\n if (!fund_lookup_table.fundsLeft() && returnPages.includes(current_page.load())) {\n visitPage('summary');\n return;\n }\n if (current_page.load() == 'nonpersonnel') {\n fund_lookup_table.editFund(current_fund.number());\n if (fund_lookup_table.fundsLeft()) {\n visitPage('baseline-landing');\n return;\n }\n }\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n const nextKey = keys[currentIndex + 1];\n visitPage(nextKey);\n }\n}\nfunction lastPage() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n if (current_page.load() == 'new-inits') {\n visitPage('baseline-landing');\n return;\n }\n if (currentIndex >= 1) {\n const lastKey = keys[currentIndex - 1];\n visitPage(lastKey);\n }\n}\n;// CONCATENATED MODULE: ./src/js/models/current_page.js\n\nconst CurrentPage = {\n update: function (page) {\n localStorage.setItem('page_state', page);\n },\n load: function () {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n },\n visit: function () {\n visitPage(this.load());\n }\n};\n/* harmony default export */ const current_page = (CurrentPage);\n;// CONCATENATED MODULE: ./src/js/utils/storage_utils.js\nfunction getLocalStorageSize() {\n let total = 0;\n for (let key in localStorage) {\n if (localStorage.hasOwnProperty(key)) {\n let keySize = key.length * 2; // each character is 2 bytes\n let valueSize = localStorage[key].length * 2; // each character is 2 bytes\n total += keySize + valueSize;\n }\n }\n return formatBytes(total);\n}\nfunction formatBytes(bytes, decimals = 2) {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// Import styles\n\n\n// Import functions\n\n\n\n// Initialize only once when the document is fully loaded\ndocument.addEventListener('DOMContentLoaded', function () {\n current_page.visit();\n console.log('Local Storage Used:', getLocalStorageSize());\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDZkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTs7QUFFQTtBQUNBO0FBWUE7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDOUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNsSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDekNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2xOQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxREE7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNUQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQzNDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbkRBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0JBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0VBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3ZHQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDekJBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOztBQzNFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNyTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7QUMvSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3ZHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQzFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM3TUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0VBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7O0FDck9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ25GQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBOztBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM1REE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7QUM1Q0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUMzRkE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzNDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNmQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/OGZmNiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzcz9kZWUxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanM/NTM1YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbnN0YW50cy9idWRnZXRfY29uc3RhbnRzLmpzPzE1MDIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzPzMyOGIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9zdWJjb21wb25lbnRzL3RleHQuanM/ZjZkZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcz84ZDNiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzP2E3NzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3M/M2JjNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbnN0YW50cy9leGNlbF9jb25zdGFudHMuanM/ZjY4NyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbnN0YW50cy9pbmRleC5qcz8yNWM0Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvY29tbW9uX3V0aWxzLmpzPzQ0ZjIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvZnVuZF9sb29rdXBfdGFibGUuanM/ZGM2NiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9jdXJyZW50X2Z1bmQuanM/ZTZkYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9hY2NvdW50X3N0cmluZy5qcz82YzhkIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2Z1bmQuanM/NmNmYSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9iYXNlbGluZS5qcz9kNDk0Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2luaXRpYXRpdmUuanM/Zjk2YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9zZXJ2aWNlcy5qcz8xMzlmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL3N1cHBsZW1lbnRhbC5qcz85OWNlIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2luZGV4LmpzPzA1ZTEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc3ViY29tcG9uZW50cy9iYXNlbGluZV9zZWN0aW9uLmpzPzEzYmQiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc3ViY29tcG9uZW50cy9zdXBwX3NlY3Rpb24uanM/MGM0ZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzPzgwZjAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmNzcz83MDdmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcz9hYmQxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzP2QxYzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2FjY29yZGlvbi9hY2NvcmRpb24uY3NzPzVhNmMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNzcz83ODRjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2hlYWRlcnMuanM/MTYyMyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9yb3dzLmpzP2ZiNzkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcz9jOTkyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanM/YmE2YiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9jZWxscy5qcz83M2NiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2NvbHVtbnMuanM/Njc0YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9kYXRhLmpzP2Q5YjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvZmlsdGVycy5qcz9hZWNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2dvbGRfYm9vay5qcz82NmM1Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvWExTWF9oYW5kbGVycy5qcz9iYThhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuY3NzP2JjOGMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5qcz9kMjNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvSlNPTl9kYXRhX2hhbmRsZXJzLmpzP2M5ZDIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzPzMwNzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2FjY29yZGlvbi9hY2NvcmRpb24uanM/MWYzNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuY3NzP2RiMDkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmpzPzUxODgiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL21vZGFsL21vZGFsLmNzcz80MGRiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcz81NTMzIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuanM/ZjliYSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jc3M/NzJkNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcz9hMGE1Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzPzU0MTUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9maWVsZHMuanM/NDU5ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL3N1Ym1pdC5qcz9jNTk2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uanM/ZDk0MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzL3ZpZXdfY2xhc3MuanM/YTc5ZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAwX3dlbGNvbWUuanM/MDhiYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAxX3VwbG9hZC5qcz9jNDQ4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDJfYmFzZWxpbmVfbGFuZGluZy5qcz83YjhlIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDNfcmV2ZW51ZS5qcz9iODc4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDRfcGVyc29ubmVsLmpzP2ZiZmYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNV9vdmVydGltZS5qcz9iZjcwIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDZfbm9ucGVyc29ubmVsLmpzPzRkM2QiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wN19uZXdfaW5pdGlhdGl2ZXMuanM/NDFhNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA4X3N1bW1hcnkuanM/OGIzMiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzL3ZpZXdfbG9naWMuanM/NDZjNiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9jdXJyZW50X3BhZ2UuanM/ZmZiMCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL3N0b3JhZ2VfdXRpbHMuanM/ZmRmNCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2luaXQuanM/MWIyYSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY29tbW9uLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2NvbW1vbi5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vd2VsY29tZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi93ZWxjb21lLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCAnLi93ZWxjb21lLmNzcyc7XHJcblxyXG4vLyBIaWRlIGFuZCB1bmhpZGUgd2VsY29tZSBidXR0b25zXHJcbmZ1bmN0aW9uIHVuaGlkZVdlbGNvbWVCdXR0b25zKCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndlbGNvbWUtcGFnZVwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG59XHJcbmZ1bmN0aW9uIGhpZGVXZWxjb21lQnV0dG9ucygpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3ZWxjb21lLXBhZ2VcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgV2VsY29tZSA9IHtcclxuICAgIHNob3c6IHVuaGlkZVdlbGNvbWVCdXR0b25zLFxyXG4gICAgaGlkZSA6IGhpZGVXZWxjb21lQnV0dG9uc1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWxjb21lOyIsIi8vIFNldCB0byBlcXVhbCBjdXJyZW50IGZpc2NhbCB5ZWFyXHJcbmV4cG9ydCB2YXIgRklTQ0FMX1lFQVIgPSAnMjYnO1xyXG5cclxuLy8gb2JqZWN0IGNhdGVnb3JpZXMgKGZyb20gb2JqIHBhcnQgb2YgYWNjb3VudCBzdHJpbmcpXHJcbmV4cG9ydCBjb25zdCBPQkpfQ0FURUdPUklFUyA9IHtcclxuICAgIGxpc3QgOiBbXHJcbiAgICAgICAgLy8gJ1NhbGFyaWVzICYgV2FnZXMnLFxyXG4gICAgICAgIC8vICdFbXBsb3llZSBCZW5lZml0cycsXHJcbiAgICAgICAgJ1Byb2Zlc3Npb25hbCAmIENvbnRyYWN0dWFsIFNlcnZpY2VzJyxcclxuICAgICAgICAnT3BlcmF0aW5nIFN1cHBsaWVzJyxcclxuICAgICAgICAnT3BlcmF0aW5nIFNlcnZpY2VzJyxcclxuICAgICAgICAnRXF1aXBtZW50IEFjcXVpc2l0aW9uJyxcclxuICAgICAgICAnQ2FwaXRhbCBPdXRsYXlzJyxcclxuICAgICAgICAnRml4ZWQgQ2hhcmdlcycsXHJcbiAgICAgICAgJ090aGVyIEV4cGVuc2VzJ1xyXG4gICAgXVxyXG59XHJcblxyXG4vLyBmcm9tIHRoZSBkcm9wLWRvd24gbWVudVxyXG5leHBvcnQgY29uc3QgRU1QTE9ZRUVfVFlQRVMgPSBbXHJcbiAgICAnUmVndWxhcicsXHJcbiAgICAnVEFTUycsXHJcbiAgICAnU2Vhc29uYWwnLFxyXG4gICAgJ1VuaWZvcm0gRmlyZScsXHJcbiAgICAnVW5pZm9ybSBQb2xpY2UnLFxyXG4gICAgJ0FwcG9pbnRlZCcsXHJcbiAgICAnRWxlY3RlZCcsXHJcbiAgICAnTG9uZyBUZXJtIERpc2FiaWxpdHknLFxyXG4gICAgJ05ldyBQb3NpdGlvbidcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IE9UX09CSkVDVFMgPSBbXHJcbiAgICAnNjAxMzAwIC0gU2FsYXItT3ZlcnRpbWUtR2VuIENpdHknLCBcclxuICAgICc2MDEzMDUgLSBTYWxhcmllcy1PdmVydGltZS1Qb2xpY2UgVW5pZicsXHJcbiAgICAnNjAxMzEwIC0gU2FsYXJpZXMtT3ZlcnRpbWUtRmlyZSBVbmlmJyxcclxuICAgICc2MDIzMDAgLSBXYWdlcy1PdmVydGltZS1HZW4gQ2l0eSdcclxuXSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9wcm9tcHQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJvbXB0LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImZ1bmN0aW9uIHNob3dQcm9tcHQoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJvbXB0LWRpdlwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlUHJvbXB0KCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvbXB0LWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVQcm9tcHQocHJvbXB0KXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9tcHQnKS5pbm5lckhUTUwgPSBwcm9tcHQ7XHJcbiAgICBzaG93UHJvbXB0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBUZXh0ID0ge1xyXG4gICAgc2hvdyA6IHNob3dQcm9tcHQsXHJcbiAgICBoaWRlIDogaGlkZVByb21wdCxcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0KHRleHQpIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGV4dDsiLCJmdW5jdGlvbiBzaG93UHJvbXB0QnV0dG9uKGlkKXtcclxuICAgIC8vIG1ha2UgYnV0dG9ucyB2aXNpYmxlXHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVQcm9tcHRCdXR0b24oaWQsIHRleHQpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIHNob3dQcm9tcHRCdXR0b24oaWQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlUHJvbXB0QnV0dG9uKGlkKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1bmNsaWNrQWxsKCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B0aW9uMScpLmNsYXNzTGlzdC5yZW1vdmUoJ2NsaWNrZWQnKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24yJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUNsaWNrZWRTdHlsZShidXR0b24pe1xyXG4gICAgdW5jbGlja0FsbCgpO1xyXG4gICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2NsaWNrZWQnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkUHJvbXB0QnV0dG9uQWN0aW9uKGJ1dHRvbl9pZCwgYWN0aW9uX2ZuKXtcclxuICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xyXG4gICAgYnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFjdGlvbl9mbik7XHJcbiAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXtcclxuICAgICAgICBhcHBseUNsaWNrZWRTdHlsZSh0aGlzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGFjdGlvbl9mbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRpc2FibGUoYnV0dG9uX2lkKXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2J1dHRvbl9pZH1gKS5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmFibGUoYnV0dG9uX2lkKXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2J1dHRvbl9pZH1gKS5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTGVmdCA9IHtcclxuICAgIHNob3cgOiBmdW5jdGlvbigpIHsgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMScpIH0sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKSB9LFxyXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJywgdGV4dCkgfSxcclxuICAgIGFkZEFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyBhZGRQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjEnLCBhY3Rpb25fZm4pIH0sXHJcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24xJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdvcHRpb24xJykgfSxcclxuICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ29wdGlvbjEnKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSaWdodCA9IHtcclxuICAgIHNob3cgOiBmdW5jdGlvbigpIHsgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMicpIH0sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjInKSB9LFxyXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJywgdGV4dCkgfSxcclxuICAgIGFkZEFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyBhZGRQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjInLCBhY3Rpb25fZm4pIH0sXHJcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24yJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdvcHRpb24yJykgfSxcclxuICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ29wdGlvbjInKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBCdXR0b25zID0ge1xyXG4gICAgTGVmdCA6IExlZnQsXHJcbiAgICBSaWdodCA6IFJpZ2h0LFxyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcclxuICAgICAgICBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24yJyk7XHJcbiAgICB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcclxuICAgICAgICBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJyk7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQgOiB1bmNsaWNrQWxsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiaW1wb3J0ICcuL3Byb21wdC5jc3MnO1xyXG5cclxuaW1wb3J0IFRleHQgZnJvbSBcIi4vc3ViY29tcG9uZW50cy90ZXh0LmpzXCI7XHJcbmltcG9ydCBCdXR0b25zIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFByb21wdCA9IHtcclxuICAgIFRleHQgOiBUZXh0LFxyXG4gICAgQnV0dG9ucyA6IEJ1dHRvbnMsXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKXtcclxuICAgICAgICBUZXh0LmhpZGUoKTtcclxuICAgICAgICBCdXR0b25zLmhpZGUoKTtcclxuICAgIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKXtcclxuICAgICAgICBUZXh0LnNob3coKTtcclxuICAgICAgICBCdXR0b25zLnNob3coKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvbXB0IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZGViYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lkZWJhci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gXCIuL2J1ZGdldF9jb25zdGFudHNcIjtcclxuXHJcbi8vIHNoZWV0cyB0byBleHBlY3Qgb24gZGV0YWlsIHNoZWV0XHJcbmV4cG9ydCBjb25zdCBTSEVFVFMgPSB7XHJcbiAgICAnRlRFLCBTYWxhcnktV2FnZSwgJiBCZW5lZml0cycgOiAncGVyc29ubmVsJyAsXHJcbiAgICAnT3ZlcnRpbWUgJiBPdGhlciBQZXJzb25uZWwnIDogJ292ZXJ0aW1lJyxcclxuICAgICdOb24tUGVyc29ubmVsJyA6ICdub25wZXJzb25uZWwnLFxyXG4gICAgJ1JldmVudWUnIDogJ3JldmVudWUnLFxyXG4gICAgJ0luaXRpYXRpdmVzIFN1bW1hcnknOiAnbmV3LWluaXRzJ1xyXG59XHJcblxyXG4vLyB3aGVyZSB0byBmaW5kIHRoZSBnZW5lcmFsIGZ1bmQgdGFyZ2V0XHJcbmV4cG9ydCBjb25zdCBUQVJHRVRfQ0VMTF9BRERSRVNTID0gJ0MxNCdcclxuXHJcbmV4cG9ydCBjb25zdCBUT1RBTF9DT0xVTU5TID0ge1xyXG4gICAgJ3BlcnNvbm5lbCc6ICdUb3RhbCBTYWwvV2FnICYgQmVuIFJlcXVlc3QnLFxyXG4gICAgJ292ZXJ0aW1lJzpgRlkke0ZJU0NBTF9ZRUFSfSBUb3RhbCBPVC9TUC9Ib2wgKyBGSUNBIFJlcXVlc3RgLFxyXG4gICAgJ25vbnBlcnNvbm5lbCc6IGBGWSR7RklTQ0FMX1lFQVJ9IERlcGFydG1lbnRhbCBSZXF1ZXN0IFRvdGFsYCxcclxuICAgICdyZXZlbnVlJzogYEZZJHtGSVNDQUxfWUVBUn0gRGVwYXJ0bWVudGFsIEVzdGltYXRlYCxcclxuICAgICduZXctaW5pdHMnOiBgVG90YWwgSW5pdGlhdGl2ZSBSZXF1ZXN0YFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE5FV19JTklUX0NPTFMgPSB7XHJcbiAgICAncGVyc29ubmVsJyA6ICdQZXJzb25uZWwgU2FsYXJ5ICYgQmVuZWZpdHMnLFxyXG4gICAgJ29wZXJhdGluZycgOiAnTm9uLVBlcnNvbm5lbCBPcGVyYXRpbmcnLFxyXG4gICAgJ2NhcGl0YWwnIDogJ05vbi1QZXJzb25uZWwgQ2FwaXRhbCcsXHJcbiAgICAncmV2ZW51ZScgOiAnUmV2ZW51ZScsXHJcbiAgICAnbmFtZScgOiAnU3VwcGxlbWVudGFsIEluaXRpYXRpdmUnLFxyXG4gICAgJ3RvdGFsJyA6IFRPVEFMX0NPTFVNTlNbJ25ldy1pbml0cyddXHJcbn0iLCJleHBvcnQgKiBmcm9tICcuL2J1ZGdldF9jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2V4Y2VsX2NvbnN0YW50cyc7IiwiLy8gRnVuY3Rpb24gdG8gZm9ybWF0IG51bWJlciBhcyBjdXJyZW5jeVxyXG5leHBvcnQgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSAoYW1vdW50LCByZXR1cm5femVybyA9IGZhbHNlKSA9PiB7XHJcbiAgICB2YXIgYW1vdW50ID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGFtb3VudCkpO1xyXG4gICAgaWYgKGFtb3VudCA9PSBOYU4pe1xyXG4gICAgICAgIHJldHVybiBcIiQgLVwiXHJcbiAgICB9XHJcbiAgICBpZiAoYW1vdW50IDwgMCl7XHJcbiAgICAgICAgcmV0dXJuICcoJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpICsgJyknO1xyXG4gICAgfSBlbHNlIGlmIChhbW91bnQgPT0gMCkge1xyXG4gICAgICAgIGlmIChyZXR1cm5femVybyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnJDAnOyAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcclxuICAgIH1cclxuICAgIHJldHVybiAnJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xyXG59IDtcclxuXHJcbi8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZm9ybWF0dGVkIG51bWJlciB0byBhIGZsb2F0XHJcbmV4cG9ydCBjb25zdCB1bmZvcm1hdEN1cnJlbmN5ID0gKGZvcm1hdHRlZEFtb3VudCkgPT4ge1xyXG4gICAgaWYgKCFmb3JtYXR0ZWRBbW91bnQpIHsgcmV0dXJuIDAgfTtcclxuICAgIC8vIFJlbW92ZSBhbnkgY3VycmVuY3kgc3ltYm9scyBhbmQgY29tbWFzXHJcbiAgICBsZXQgbnVtZXJpY2FsUGFydCA9IGZvcm1hdHRlZEFtb3VudC5yZXBsYWNlKC9bXjAtOS4tXSsvZywgXCJcIik7XHJcbiAgICBpZiAobnVtZXJpY2FsUGFydCA9PSAnLScpe1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobnVtZXJpY2FsUGFydCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVdpdGhDb21tYXModmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSAwKXtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSkucmVwbGFjZSgnJCcsICcnKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3RyaW5nKHN0cil7XHJcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgnICcsICctJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOZXdMaW5lcyhzdHIpe1xyXG4gICAgLy8gcmVwbGFjZSBhbGwgbmV3IGxpbmVzIHdpdGggc3BhY2VzXHJcbiAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgvW1xcclxcbl0rL2csIFwiIFwiKTtcclxuICAgIC8vIHJlbW92ZSBhbnkgZXh0cmEgc3BhY2VzIG9yIHRyYWlsaW5nL2xlYWRpbmcgd2hpdGVzcGFjZVxyXG4gICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoJyAgJywgJyAnKTtcclxuICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCcgICcsICcgJyk7XHJcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbFN1bSh0YWJsZSwgY29sTmFtZSkge1xyXG4gICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgIGlmKCF0YWJsZSB8fCB0YWJsZSA9PSAnJyl7IFxyXG4gICAgICAgIHJldHVybiAwOyBcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyh0YWJsZVswXSk7XHJcbiAgICBpZiAoaGVhZGVycy5pbmNsdWRlcyhjb2xOYW1lKSkge1xyXG4gICAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodGFibGVbaV1bY29sTmFtZV0pKTtcclxuICAgICAgICAgICAgLy8gdHJlYXQgTmFOIChub24tbnVtZXJpY3MpIGFzIHplcm9lc1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHsgc3VtICs9IHZhbHVlOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHRvdGFsIGNvbHVtbiBpbiBzYXZlZCBkYXRhIGZvciAke25hbWV9LiBSZXR1cm5pbmcgMC4gU2VlIFN0b3JlZFRhYmxlLnRvdGFsQ29sKCkgc3dpdGNoLmApO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVZhbHVlcyhkYXRhLCBrZXkpIHtcclxuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKG9iaiA9PiBvYmpba2V5XSk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcykpO1xyXG59XHJcbiIsImltcG9ydCBDdXJyZW50RnVuZCBmcm9tIFwiLi9jdXJyZW50X2Z1bmRcIjtcclxuaW1wb3J0IHsgZ2V0VW5pcXVlVmFsdWVzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vbl91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZ1bmRMb29rdXBUYWJsZSA9IHtcclxuICAgIHJldHJpZXZlIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJykpIHx8IHt9O1xyXG4gICAgfSxcclxuICAgIHNhdmUgOiBmdW5jdGlvbihmdW5kRGljdCl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJywgSlNPTi5zdHJpbmdpZnkoZnVuZERpY3QpKTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24oZnVuZERhdGEpe1xyXG4gICAgICAgIC8vIHJlc2V0XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgIC8vIGZpbGwgaW4gd2l0aCBkYXRhIHN0b3JlZCBpbiBmdW5kRGF0ZVxyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXRyaWV2ZSgpO1xyXG4gICAgICAgIGZvciAobGV0IGZ1bmQgb2YgT2JqZWN0LmtleXMoZnVuZERhdGEpKXtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0byBsb29rdXAgdGFibGUgaWYgbm90IGluIHRoZXJlIGFscmVhZHlcclxuICAgICAgICAgICAgaWYgKCF0YWJsZVtmdW5kXSl7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgZnVuZCBuYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdW5kTmFtZSA9IGZ1bmREYXRhW2Z1bmRdWzBdWydGdW5kIE5hbWUnXTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCBmdW5kIHRvIGRpY3Rpb25hcnlcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdID0ge307XHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsnbmFtZSddID0gZnVuZE5hbWU7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsndmlld2VkJ10gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGxpc3RzIG9mIHVuaXF1ZSBjb3N0IGNlbnRlcnMgYW5kIGFwcHJvcHJpYXRpb25zXHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsnYXBwcm9wJ10gPSBnZXRVbmlxdWVWYWx1ZXMoZnVuZERhdGFbZnVuZF0sICdBcHByb3ByaWF0aW9uIE5hbWUnKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdWydjYyddID0gZ2V0VW5pcXVlVmFsdWVzKGZ1bmREYXRhW2Z1bmRdLCAnQ29zdCBDZW50ZXIgTmFtZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNhdmUgYW55IHVwZGF0ZXNcclxuICAgICAgICB0aGlzLnNhdmUodGFibGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBbGw6IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGFnZ3JlZ2F0ZSBhbGwgYXBwcm9wcyBvciBDQ3MgZm9yIGV2ZXJ5IGZ1bmQgaW4gb25lIGFycmF5XHJcbiAgICAgICAgY29uc3QgZnVuZHMgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBmdW5kIGluIGZ1bmRzKSB7XHJcbiAgICAgICAgICAgIGlmIChmdW5kcy5oYXNPd25Qcm9wZXJ0eShmdW5kKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBmdW5kc1tmdW5kXVtrZXldKXtcclxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChmdW5kc1tmdW5kXVtrZXldW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb3N0Q2VudGVycyA6IGZ1bmN0aW9uKCBleHRyYU9wdGlvbiApIHtcclxuICAgICAgICAvLyBnZXQgY3VycmVudCBmdW5kXHJcbiAgICAgICAgY29uc3QgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpXHJcbiAgICAgICAgbGV0IHJldCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLnJldHJpZXZlKClbZnVuZF0pe1xyXG4gICAgICAgICAgICByZXQgPSB0aGlzLnJldHJpZXZlKClbZnVuZF1bJ2NjJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaWYgbm8gZnVuZCAoaWUuIHdlJ3JlIG9uIHRoZSBuZXcgaW5pdGlhdGl2ZSBwYWdlKSwgcmV0dXJuIGFsbCBvcHRpb25zXHJcbiAgICAgICAgICAgIHJldCA9IHRoaXMuZ2V0QWxsKCdjYycpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYWRkIGV4dHJhIG9wdGlvbiBpZiBnaXZlblxyXG4gICAgICAgIGlmIChleHRyYU9wdGlvbikge1xyXG4gICAgICAgICAgICByZXQucHVzaChleHRyYU9wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFwcHJvcHMgOiBmdW5jdGlvbiggZXh0cmFPcHRpb24gKSB7XHJcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgZnVuZFxyXG4gICAgICAgIGNvbnN0IGZ1bmQgPSBDdXJyZW50RnVuZC5udW1iZXIoKVxyXG4gICAgICAgIGxldCByZXQgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5yZXRyaWV2ZSgpW2Z1bmRdKXtcclxuICAgICAgICAgICAgcmV0ID0gdGhpcy5yZXRyaWV2ZSgpW2Z1bmRdWydhcHByb3AnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZiBubyBmdW5kIChpZS4gd2UncmUgb24gdGhlIG5ldyBpbml0aWF0aXZlIHBhZ2UpLCByZXR1cm4gYWxsIG9wdGlvbnNcclxuICAgICAgICAgICAgcmV0ID0gdGhpcy5nZXRBbGwoJ2FwcHJvcCcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYWRkIGV4dHJhIG9wdGlvbiBpZiBnaXZlblxyXG4gICAgICAgIGlmIChleHRyYU9wdGlvbikge1xyXG4gICAgICAgICAgICByZXQucHVzaChleHRyYU9wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlKHt9KTtcclxuICAgIH0sXHJcbiAgICBnZXROYW1lIDogZnVuY3Rpb24obnVtYmVyKXtcclxuICAgICAgICBpZighbnVtYmVyIHx8ICF0aGlzLnJldHJpZXZlKCkpIHsgcmV0dXJuICcnIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cmlldmUoKVtudW1iZXJdWyduYW1lJ107XHJcbiAgICB9LFxyXG4gICAgbGlzdEZ1bmRzIDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXRyaWV2ZSgpKTtcclxuICAgIH0sXHJcbiAgICBsaXN0RnVuZE5hbWVzIDogZnVuY3Rpb24oYWRkaXRpb25hbE9wdGlvbil7XHJcbiAgICAgICAgY29uc3QgZnVuZHMgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhcnJheVxyXG4gICAgICAgIHZhciByZXQgPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyhmdW5kcykuZm9yRWFjaCggKGZ1bmRfbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmdW5kX25hbWUgPSBmdW5kc1tmdW5kX251bWJlcl1bJ25hbWUnXTtcclxuICAgICAgICAgICAgcmV0LnB1c2goZnVuZF9uYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoYWRkaXRpb25hbE9wdGlvbil7XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGFkZGl0aW9uYWxPcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfSxcclxuICAgIGVkaXRGdW5kIDogZnVuY3Rpb24oZnVuZCl7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgaWYgKHRhYmxlW2Z1bmRdKXtcclxuICAgICAgICAgICAgdGFibGVbZnVuZF1bJ3ZpZXdlZCddID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlKHRhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBmdW5kIHNlbGVjdGVkLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH0sXHJcbiAgICBsaXN0VW5lZGl0ZWRGdW5kcyA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgdGhpcy5saXN0RnVuZHMoKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGFibGVba2V5XVsndmlld2VkJ10pe1xyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG4gICAgZnVuZHNMZWZ0IDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gKHRoaXMubGlzdFVuZWRpdGVkRnVuZHMoKS5sZW5ndGggPiAwKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuZExvb2t1cFRhYmxlIiwiXHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSBcIi4vZnVuZF9sb29rdXBfdGFibGVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBDdXJyZW50RnVuZCA9IHtcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKGZ1bmQpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmdW5kJywgZnVuZCk7XHJcbiAgICB9LFxyXG4gICAgbnVtYmVyIDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJmdW5kXCIpO1xyXG4gICAgfSxcclxuICAgIG5hbWUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBGdW5kTG9va3VwVGFibGUuZ2V0TmFtZSggdGhpcy5udW1iZXIoKSk7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZSgnJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEN1cnJlbnRGdW5kOyIsImltcG9ydCBDdXJyZW50RnVuZCBmcm9tIFwiLi9jdXJyZW50X2Z1bmRcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBY2NvdW50U3RyaW5nID0ge1xyXG4gICAgZ2V0TnVtYmVyOiBmdW5jdGlvbihpbnB1dCkge1xyXG4gICAgICAgIC8vIGlzb2xhdGUgdGhlIG51bWVyaWNhbCBwYXJ0IG9mIGEgYXBwcm9wcmlhdGlvbi9jb3N0IGNlbnRlci9vYmplY3RcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eXFxkKy8pO1xyXG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgYnVpbGQgOiBmdW5jdGlvbihhcHByb3AsIGNjLCBvYmogPSBudWxsLCBmdW5kID0gbnVsbCkge1xyXG4gICAgICAgIC8vIHB1dCB0b2dldGhlciBhY2NvdW50IHN0cmluZyBmdW5kLWFwcHJvcC1jb3N0Y2VudGVyWy1vYmpdICh3IG9wdGlvbmFsIG9iamVjdClcclxuICAgICAgICBpZiAoIWZ1bmQpIHsgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpIH07XHJcbiAgICAgICAgLy8gaGl0cyBlcnJvciBoZXJlXHJcbiAgICAgICAgYXBwcm9wID0gdGhpcy5nZXROdW1iZXIoYXBwcm9wKTtcclxuICAgICAgICBjYyA9IHRoaXMuZ2V0TnVtYmVyKGNjKTtcclxuICAgICAgICB2YXIgc3RyaW5nID0gYCR7ZnVuZH0tJHthcHByb3B9LSR7Y2N9YDtcclxuICAgICAgICBzdHJpbmcgPSBvYmogPyBgJHtzdHJpbmd9LSR7dGhpcy5nZXROdW1iZXIob2JqKX1gIDogc3RyaW5nO1xyXG4gICAgICAgIHJldHVybiBzdHJpbmc7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFjY291bnRTdHJpbmdTZWN0aW9uIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcsIHNlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGFjY291bnRfc3RyaW5nLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnMubGVuZ3RoID4gc2VjdGlvbiA/IHNlY3Rpb25zW3NlY3Rpb25dIDogbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgZnVuZCA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nKSB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAwKSBcclxuICAgIH0sXHJcblxyXG4gICAgYXBwcm9wIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcpIHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudFN0cmluZ1NlY3Rpb24oYWNjb3VudF9zdHJpbmcsIDEpIFxyXG4gICAgfSxcclxuXHJcbiAgICBjb3N0Q2VudGVyIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcpIHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudFN0cmluZ1NlY3Rpb24oYWNjb3VudF9zdHJpbmcsIDIpIFxyXG4gICAgfSxcclxuXHJcbiAgICBvYmplY3QgOiBmdW5jdGlvbihhY2NvdW50X3N0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAzKSBcclxuICAgIH0sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFjY291bnRTdHJpbmc7IiwiXHJcbmltcG9ydCB7IGNvbFN1bSB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuaW1wb3J0IHsgVE9UQUxfQ09MVU1OUyB9IGZyb20gJy4uL2NvbnN0YW50cy8nO1xyXG5cclxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHVuaXF1ZSBsaXN0IG9mIGFwcHJvcHJpYXRpb25zIHJlcHJlc2VudGVkIGluIGEgdGFibGVcclxuZnVuY3Rpb24gZmV0Y2hWYWx1ZVNldCh0YWJsZSwga2V5KSB7XHJcblxyXG4gICAgLy8gSUYgdGhlcmUncyBubyBkYXRhLCByZXR1cm4gYW4gZW1wdHkgbGlzdFxyXG4gICAgaWYoIXRhYmxlKXtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlIGEgU2V0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXNcclxuICAgIGNvbnN0IHVuaXFWYWx1ZXMgPSBuZXcgU2V0KCk7XHJcbiAgXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIHRhYmxlXHJcbiAgICB0YWJsZS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIGlmIChyb3dba2V5XSkge1xyXG4gICAgICAgIHVuaXFWYWx1ZXMuYWRkKHJvd1trZXldKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBDb252ZXJ0IHRoZSBTZXQgdG8gYW4gYXJyYXkgaWYgbmVlZGVkXHJcbiAgICByZXR1cm4gdW5pcVZhbHVlcztcclxuICB9XHJcblxyXG4vLyBDbGFzcyB0byBob2xkIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgZnVuZCBhbmQgdGFibGVcclxuY2xhc3MgU3RvcmVkVGFibGUge1xyXG4gICAgY29uc3RydWN0b3IocGFnZSwgZnVuZCl7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gYCR7cGFnZX1fJHtmdW5kfWA7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgICB0aGlzLnRhYmxlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpKTtcclxuICAgICAgICB0aGlzLmFwcHJvcHMgPSBmZXRjaFZhbHVlU2V0KHRoaXMudGFibGUsICdBcHByb3ByaWF0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5jYyA9IGZldGNoVmFsdWVTZXQodGhpcy50YWJsZSwgJ0Nvc3QgQ2VudGVyJyk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsQ29sKCkge1xyXG4gICAgICAgIHJldHVybiBUT1RBTF9DT0xVTU5TW3RoaXMucGFnZV07XHJcbiAgICB9XHJcbiAgICBnZXRTdW0oKSB7XHJcbiAgICAgICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIHRoaXMudG90YWxDb2woKSwgdGhpcy5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBrZXkgaXMgdGhlIGNvbHVtbiB0byBmaWx0ZXIgb24gKGllLiBDb3N0IENlbnRlcilcclxuICAgIGZpbHRlcihrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUpe1xyXG4gICAgICAgICAgICAvLyByZWFzc2lnbiB1bmRlcmx5aW5nIGRhdGEgaW4gb2JqZWN0IGlmIHRoZXJlJ3MgZGF0YSB0byBmaWx0ZXJcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRoaXMudGFibGUuZmlsdGVyKHJvdyA9PiB7ICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvd1trZXldKSAmJiAocm93W2tleV0gPT0gdmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29zdENlbnRlcntcclxuICAgIGNvbnN0cnVjdG9yKGZ1bmQsIGFwcHJvcCwgY2Mpe1xyXG4gICAgICAgIGNvbnN0IEFwcHJvcE9iaiA9IG5ldyBBcHByb3ByaWF0aW9uKGZ1bmQsIGFwcHJvcCk7XHJcbiAgICAgICAgdGhpcy5wZXJzb25uZWwgPSBBcHByb3BPYmoucGVyc29ubmVsLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5ub25wZXJzb25uZWwgPSBBcHByb3BPYmoubm9ucGVyc29ubmVsLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IEFwcHJvcE9iai5vdmVydGltZS5maWx0ZXIoJ0Nvc3QgQ2VudGVyJywgY2MpO1xyXG4gICAgICAgIHRoaXMucmV2ZW51ZSA9IEFwcHJvcE9iai5yZXZlbnVlLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5jYyA9IGNjO1xyXG4gICAgICAgIHRoaXMuYWNjb3VudF9zdHJpbmcgPSBgJHtBcHByb3BPYmouYWNjb3VudFN0cmluZygpfS0ke2NjfWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25uZWwuZ2V0U3VtKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIGdldE92ZXJ0aW1lQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVydGltZS5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXROb25QZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJldmVudWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoKSB7IFxyXG4gICAgICAgIC8vIG9ubHkgc3VtIGV4cGVuZGl0dXJlcywgbm90IG5ldCBvZiByZXZlbnVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9uUGVyc29ubmVsQ29zdCgpICsgdGhpcy5nZXRPdmVydGltZUNvc3QoKSArIHRoaXMuZ2V0UGVyc29ubmVsQ29zdCgpOyBcclxuICAgIH1cclxuXHJcbiAgICBnZXROYW1lKCl7XHJcbiAgICAgICAgLy8ganVzdCBncmFiIHRoZSB2YWx1ZSBpbiB0aGUgYXBwcm9wIG5hbWUgY29sdW1uIGZvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBmaXJzdCBub24tZW1wdHkgdGFibGVcclxuICAgICAgICBjb25zdCB0YWJsZXMgPSBbdGhpcy5ub25wZXJzb25uZWwudGFibGUsIHRoaXMucGVyc29ubmVsLnRhYmxlLCB0aGlzLm92ZXJ0aW1lLnRhYmxlLCB0aGlzLnJldmVudWUudGFibGVdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0YWJsZXMpIHtcclxuICAgICAgICAgIGlmICh0YWJsZS5sZW5ndGggPiAwICYmIHRhYmxlWzBdWydDb3N0IENlbnRlciBOYW1lJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuICdDb3N0IENlbnRlciAnICsgdGFibGVbMF1bJ0Nvc3QgQ2VudGVyIE5hbWUnXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvLyBJZiBhbGwgdGFibGVzIGFyZSBlbXB0eSwgcmV0dXJuICcnXHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSAgXHJcblxyXG4gICAgYWNjb3VudFN0cmluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY2NvdW50X3N0cmluZztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFwcHJvcHJpYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoZnVuZCwgYXBwcm9wKXtcclxuICAgICAgICBjb25zdCBmdW5kT2JqID0gbmV3IEZ1bmQoZnVuZCk7XHJcbiAgICAgICAgdGhpcy5wZXJzb25uZWwgPSBmdW5kT2JqLnBlcnNvbm5lbC5maWx0ZXIoJ0FwcHJvcHJpYXRpb24nLCBhcHByb3ApO1xyXG4gICAgICAgIHRoaXMubm9ucGVyc29ubmVsID0gZnVuZE9iai5ub25wZXJzb25uZWwuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICB0aGlzLm92ZXJ0aW1lID0gZnVuZE9iai5vdmVydGltZS5maWx0ZXIoJ0FwcHJvcHJpYXRpb24nLCBhcHByb3ApO1xyXG4gICAgICAgIHRoaXMucmV2ZW51ZSA9IGZ1bmRPYmoucmV2ZW51ZS5maWx0ZXIoJ0FwcHJvcHJpYXRpb24nLCBhcHByb3ApO1xyXG4gICAgICAgIC8vIG93biBkYXRhXHJcbiAgICAgICAgdGhpcy5hcHByb3AgPSBhcHByb3A7XHJcbiAgICAgICAgdGhpcy5mdW5kID0gZnVuZE9iai5mdW5kO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb3N0Q2VudGVycygpe1xyXG4gICAgICAgIC8vIGJ1aWxkIGEgc2V0IG9mIHVuaXF1ZSBhcHByb3ByaWF0aW9ucyBhY3Jvc3MgYWxsIGxpbmUgaXRlbXMgZm9yIHRoZSBmdW5kXHJcbiAgICAgICAgY29uc3QgY2MgPSBuZXcgU2V0KFsuLi50aGlzLnBlcnNvbm5lbC5jYyxcclxuICAgICAgICAgICAgLi4udGhpcy5vdmVydGltZS5jYywgXHJcbiAgICAgICAgICAgIC4uLnRoaXMubm9ucGVyc29ubmVsLmNjLCBcclxuICAgICAgICAgICAgLi4udGhpcy5yZXZlbnVlLmNjXSk7XHJcblxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYSBsaXN0IHBsYWNlaG9sZGVyIGZvciB0aGUgYXBwcm9wcmlhdGlvbnMgb2JqZWN0c1xyXG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IFtdO1xyXG4gICAgICAgIC8vIGJ1aWxkIG91dCBsaXN0XHJcbiAgICAgICAgY2MuZm9yRWFjaChudW0gPT4ge1xyXG4gICAgICAgICAgICBjY0xpc3QucHVzaChuZXcgQ29zdENlbnRlcih0aGlzLmZ1bmQsIHRoaXMuYXBwcm9wLCBudW0pKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gY2NMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29ubmVsLmdldFN1bSgpICsgdGhpcy5vdmVydGltZS5nZXRTdW0oKSArIHRoaXMubm9ucGVyc29ubmVsLmdldFN1bSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5hbWUoKXtcclxuICAgICAgICAvLyBqdXN0IGdyYWIgdGhlIHZhbHVlIGluIHRoZSBhcHByb3AgbmFtZSBjb2x1bW4gZm9yIHRoZSBmaXJzdCByb3cgb2YgdGhlIGZpcnN0IG5vbi1lbXB0eSB0YWJsZVxyXG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IFt0aGlzLm5vbnBlcnNvbm5lbC50YWJsZSwgdGhpcy5wZXJzb25uZWwudGFibGUsIHRoaXMub3ZlcnRpbWUudGFibGUsIHRoaXMucmV2ZW51ZS50YWJsZV07XHJcblxyXG4gICAgICAgIGZvciAobGV0IHRhYmxlIG9mIHRhYmxlcykge1xyXG4gICAgICAgICAgaWYgKHRhYmxlLmxlbmd0aCA+IDAgJiYgdGFibGVbMF1bJ0FwcHJvcHJpYXRpb24gTmFtZSddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQXBwcm9wcmlhdGlvbiAnICsgdGFibGVbMF1bJ0FwcHJvcHJpYXRpb24gTmFtZSddO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIC8vIElmIGFsbCB0YWJsZXMgYXJlIGVtcHR5LCByZXR1cm4gJydcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9ICBcclxuXHJcbiAgICBhY2NvdW50U3RyaW5nKCl7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZnVuZH0tJHt0aGlzLmFwcHJvcH1gO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLy8gSG9sZHMgYWxsIHRoZSBkZXRhaWxlZCBkYXRhIGZvciBvbmUgZnVuZCdzIGJ1ZGdldFxyXG5leHBvcnQgY2xhc3MgRnVuZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihmdW5kKXtcclxuICAgICAgICB0aGlzLmZ1bmQgPSBmdW5kO1xyXG4gICAgICAgIHRoaXMucGVyc29ubmVsID0gbmV3IFN0b3JlZFRhYmxlKCdwZXJzb25uZWwnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLm92ZXJ0aW1lID0gbmV3IFN0b3JlZFRhYmxlKCdvdmVydGltZScsIGZ1bmQpO1xyXG4gICAgICAgIHRoaXMubm9ucGVyc29ubmVsID0gbmV3IFN0b3JlZFRhYmxlKCdub25wZXJzb25uZWwnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLnJldmVudWUgPSBuZXcgU3RvcmVkVGFibGUoJ3JldmVudWUnLCBmdW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBcHByb3ByaWF0aW9ucygpe1xyXG4gICAgICAgIC8vIGJ1aWxkIGEgc2V0IG9mIHVuaXF1ZSBhcHByb3ByaWF0aW9ucyBhY3Jvc3MgYWxsIGxpbmUgaXRlbXMgZm9yIHRoZSBmdW5kXHJcbiAgICAgICAgY29uc3QgYXBwcm9wcyA9IG5ldyBTZXQoWy4uLnRoaXMucGVyc29ubmVsLmFwcHJvcHMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMub3ZlcnRpbWUuYXBwcm9wcywgXHJcbiAgICAgICAgICAgIC4uLnRoaXMubm9ucGVyc29ubmVsLmFwcHJvcHMsIFxyXG4gICAgICAgICAgICAuLi50aGlzLnJldmVudWUuYXBwcm9wc10pO1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIGEgbGlzdCBwbGFjZWhvbGRlciBmb3IgdGhlIGFwcHJvcHJpYXRpb25zIG9iamVjdHNcclxuICAgICAgICBjb25zdCBhcHByb3BzTGlzdCA9IFtdO1xyXG4gICAgICAgIC8vIGJ1aWxkIG91dCBsaXN0XHJcbiAgICAgICAgYXBwcm9wcy5mb3JFYWNoKGFwcHJvcCA9PiB7XHJcbiAgICAgICAgICAgIGFwcHJvcHNMaXN0LnB1c2goIG5ldyBBcHByb3ByaWF0aW9uKHRoaXMuZnVuZCwgYXBwcm9wKSApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBhcHByb3BzTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbm5lbC5nZXRTdW0oKTsgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3ZlcnRpbWVDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm92ZXJ0aW1lLmdldFN1bSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5vblBlcnNvbm5lbENvc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9ucGVyc29ubmVsLmdldFN1bSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJldmVudWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZW51ZS5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbCgpIHsgXHJcbiAgICAgICAgLy8gb25seSBzdW0gZXhwZW5kaXR1cmVzLCBub3QgbmV0IG9mIHJldmVudWVcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXROb25QZXJzb25uZWxDb3N0KCkgKyB0aGlzLmdldE92ZXJ0aW1lQ29zdCgpICsgdGhpcy5nZXRQZXJzb25uZWxDb3N0KCk7IFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGdW5kOyIsImltcG9ydCBGdW5kIGZyb20gXCIuL2Z1bmQuanNcIjtcclxuaW1wb3J0IEZ1bmRMb29rdXBUYWJsZSBmcm9tIFwiLi9mdW5kX2xvb2t1cF90YWJsZS5qc1wiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBCYXNlbGluZSB7XHJcbiAgICAvLyBiYXNlbGluZSB3aWxsIGp1c3QgY29udGFpbiBhIGxpc3Qgb2YgZnVuZHMsIGVhY2ggd2l0aFxyXG4gICAgLy8gcnVubmluZyB0YWxsaWVzIGZvciB0aGVpciBidWRnZXRzXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBjb25zdCBhbGxGdW5kcyA9IEZ1bmRMb29rdXBUYWJsZS5saXN0RnVuZHMoKTtcclxuICAgICAgICB0aGlzLmZ1bmRzID0gW107XHJcbiAgICAgICAgYWxsRnVuZHMuZm9yRWFjaCgoZnVuZCkgPT4geyBcclxuICAgICAgICAgICAgdGhpcy5mdW5kcy5wdXNoKG5ldyBGdW5kKGZ1bmQpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0gXHJcblxyXG4gICAgc3RhdGljIHRhcmdldCgpIHsgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0YXJnZXQnKSB9O1xyXG5cclxuICAgIHBlcnNvbm5lbCgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRQZXJzb25uZWxDb3N0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJ0aW1lKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldE92ZXJ0aW1lQ29zdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH1cclxuXHJcbiAgICBub25wZXJzb25uZWwoKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgICAgIHRvdGFsICs9IGZ1bmQuZ2V0Tm9uUGVyc29ubmVsQ29zdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH1cclxuXHJcbiAgICByZXZlbnVlKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldFJldmVudWUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgdG90YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9ucGVyc29ubmVsKCkgKyB0aGlzLnBlcnNvbm5lbCgpICsgdGhpcy5vdmVydGltZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbkZ1bmRUb3RhbCgpIHtcclxuICAgICAgICBjb25zdCBHRiA9IG5ldyBGdW5kKDEwMDApO1xyXG4gICAgICAgIHJldHVybiBHRi5nZXRUb3RhbCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYXNlbGluZTsiLCJcclxuLy8gZGF0YSBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBvbiBuZXcgaW5pdGlhdGl2ZXNcclxuXHJcbmltcG9ydCB7IE5FV19JTklUX0NPTFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IGNsZWFuU3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vbl91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEluaXRpYXRpdmUge1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3Rvcihyb3cpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSByb3c7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gcm93W05FV19JTklUX0NPTFNbJ25hbWUnXV07XHJcbiAgICB9XHJcblxyXG4gICAgaWQoKSB7XHJcbiAgICAgICAgbGV0IGhhc2ggPSA1MzgxO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYW1lLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSArIGhhc2ggKyB0aGlzLm5hbWUuY2hhckNvZGVBdChpKTsgIC8vIGhhc2ggKiAzMyArIGNcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhc2ggPj4+IDA7ICAvLyBFbnN1cmUgcG9zaXRpdmUgdW5zaWduZWQgMzItYml0IGludGVnZXJcclxuICAgIH1cclxuXHJcbiAgICBwZXJzb25uZWwoKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sncGVyc29ubmVsJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sncGVyc29ubmVsJ11dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvcGVyYXRpbmcoKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1snb3BlcmF0aW5nJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1snb3BlcmF0aW5nJ11dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYXBpdGFsKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ2NhcGl0YWwnXV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydjYXBpdGFsJ11dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXZlbnVlKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3JldmVudWUnXV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydyZXZlbnVlJ11dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0b3RhbCgpIHsgXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWyd0b3RhbCddXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3RvdGFsJ11dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluaXRpYXRpdmU7IiwiLy8gZGF0YSBzdHJ1Y3R1cmUgdG8gc2F2ZSB0aGUgcG9zc2libGUgc2VydmljZSBvcHRpb25zIGZvciB0aGUgZGVwYXJ0bWVudFxyXG5leHBvcnQgY29uc3QgU2VydmljZXMgPSB7XHJcbiAgICBzYXZlIDogZnVuY3Rpb24oc2VydmljZXMpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZXJ2aWNlcy1saXN0JywgSlNPTi5zdHJpbmdpZnkoc2VydmljZXMpKTtcclxuICAgIH0sXHJcbiAgICBsaXN0IDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VydmljZXMtbGlzdCcpKSB8fCB7fTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2VydmljZXM7IiwiXHJcbmltcG9ydCBJbml0aWF0aXZlIGZyb20gXCIuL2luaXRpYXRpdmUuanNcIjtcclxuaW1wb3J0IHsgY29sU3VtIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBORVdfSU5JVF9DT0xTLCBUT1RBTF9DT0xVTU5TIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9leGNlbF9jb25zdGFudHMuanNcIjtcclxuXHJcbi8vIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQgc3VwcGxlbWVudGFsIHJlcXVlc3RzXHJcbmV4cG9ydCBjbGFzcyBTdXBwbGVtZW50YWwge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ25ldy1pbml0cycpKTtcclxuICAgICAgICB0aGlzLmluaXRpYXRpdmVzID0gW107XHJcbiAgICAgICAgaWYodGhpcy50YWJsZSl7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGUuZm9yRWFjaCgocm93KSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWF0aXZlcy5wdXNoKG5ldyBJbml0aWF0aXZlKHJvdykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5pdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGUubWFwKChpdGVtKSA9PiB7IHJldHVybiBpdGVtW05FV19JTklUX0NPTFNbJ25hbWUnXV0gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGVyc29ubmVsKCkge1xyXG4gICAgICAgIHJldHVybiBjb2xTdW0odGhpcy50YWJsZSwgTkVXX0lOSVRfQ09MU1sncGVyc29ubmVsJ10pO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZXJhdGluZygpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ29wZXJhdGluZyddKTtcclxuICAgIH1cclxuXHJcbiAgICBjYXBpdGFsKCkge1xyXG4gICAgICAgIHJldHVybiBjb2xTdW0odGhpcy50YWJsZSwgTkVXX0lOSVRfQ09MU1snY2FwaXRhbCddKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiBjb2xTdW0odGhpcy50YWJsZSwgTkVXX0lOSVRfQ09MU1sncmV2ZW51ZSddKTtcclxuICAgIH1cclxuXHJcbiAgICB0b3RhbCgpe1xyXG4gICAgICAgIHJldHVybiBjb2xTdW0odGhpcy50YWJsZSwgVE9UQUxfQ09MVU1OU1snbmV3LWluaXRzJ10pO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VwcGxlbWVudGFsOyIsIi8vIG1vZGVscy9pbmRleC5qc1xyXG5cclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvdW50U3RyaW5nIH0gZnJvbSAnLi9hY2NvdW50X3N0cmluZy5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQmFzZWxpbmUgfSBmcm9tICcuL2Jhc2VsaW5lLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXJyZW50RnVuZCB9IGZyb20gJy4vY3VycmVudF9mdW5kLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXJyZW50UGFnZSB9IGZyb20gJy4vY3VycmVudF9wYWdlLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBGdW5kIH0gZnJvbSAnLi9mdW5kLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBGdW5kTG9va3VwVGFibGUgfSBmcm9tICcuL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbml0aWF0aXZlIH0gZnJvbSAnLi9pbml0aWF0aXZlLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBTZXJ2aWNlcyB9IGZyb20gJy4vc2VydmljZXMuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFN1cHBsZW1lbnRhbCB9IGZyb20gJy4vc3VwcGxlbWVudGFsLmpzJztcclxuIiwiaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IEJhc2VsaW5lLCBGdW5kTG9va3VwVGFibGUsIEZ1bmQsIEN1cnJlbnRGdW5kIH0gZnJvbSBcIi4uLy4uLy4uL21vZGVsc1wiO1xyXG5pbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSBcIi4uLy4uLy4uL3ZpZXdzL3ZpZXdfbG9naWNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBCYXNlbGluZVNlY3Rpb24gPSB7XHJcbiAgICBfZGF0YTogbmV3IEJhc2VsaW5lKCksXHJcbiAgICBfZ2VuRnVuZCA6IG5ldyBGdW5kKDEwMDApLFxyXG5cclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgQmFzZWxpbmUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0IGRhdGEobmV3RGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXQgZ2VuRnVuZCgpIHtcclxuICAgICAgICB0aGlzLl9nZW5GdW5kID0gbmV3IEZ1bmQoMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dlbkZ1bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldCBnZW5GdW5kKG5ld0Z1bmQpIHtcclxuICAgICAgICB0aGlzLl9nZW5GdW5kID0gbmV3RnVuZDtcclxuICAgIH0sXHJcblxyXG4gICAgdGFyZ2V0X2h0bWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIGBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUnIGlkPVwidGFyZ2V0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5GWSR7RklTQ0FMX1lFQVJ9IEdlbmVyYWwgRnVuZCBiYXNlbGluZSB0YXJnZXQ6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koQmFzZWxpbmUudGFyZ2V0KCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cIkdGLXRvdGFsXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5DdXJyZW50IEdGIGJhc2VsaW5lOjwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KHRoaXMuZ2VuRnVuZC5nZXRUb3RhbCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnI+YDtcclxuICAgIH0sXHJcbiAgICBcclxuICAgIGZ1bmRfaHRtbChmdW5kKSB7XHJcbiAgICAgICAgcmV0dXJuIGBcclxuICAgICAgICAgICAgPGg2PiR7RnVuZExvb2t1cFRhYmxlLmdldE5hbWUoZnVuZC5mdW5kKX08L2g2PlxyXG4gICAgICAgICAgICA8aHI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIHJldmVudWUnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+UHJvamVjdGVkIHJldmVudWVzOjwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KGZ1bmQuZ2V0UmV2ZW51ZSgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtaWNvblwiIHRpdGxlPVwiRWRpdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIHBlcnNvbm5lbCc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5QZXJzb25uZWwgY29zdDo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFBlcnNvbm5lbENvc3QoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSBvdmVydGltZSc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5PdmVydGltZSBjb3N0Ojwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KGZ1bmQuZ2V0T3ZlcnRpbWVDb3N0KCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1pY29uXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUgbm9ucGVyc29ubmVsJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPk5vbi1wZXJzb25uZWwgY29zdDo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldE5vblBlcnNvbm5lbENvc3QoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSBmdW5kLXRvdGFsJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPlRvdGFsIGV4cGVuZGl0dXJlczo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFRvdGFsKCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxicj5gO1xyXG4gICAgfSxcclxuXHJcbiAgICBsaW5rRWRpdEJ0bnMoKSB7XHJcbiAgICAgICAgbGV0IGJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdC1pY29uJyk7XHJcbiAgICAgICAgYnRucy5mb3JFYWNoKChidG4pID0+IHtcclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5kIGZyb20gdGhlIGRpdiB0aGUgYnV0dG9uIGlzIGluXHJcbiAgICAgICAgICAgIGxldCBmdW5kID0gYnRuLmNsb3Nlc3QoJy5mdW5kLWRpdicpLmlkLnJlcGxhY2UoJ2Z1bmRfJywgJycpO1xyXG4gICAgICAgICAgICBsZXQgcGFnZSA9IGJ0bi5jbG9zZXN0KCcuc2lkZWJhci1zdGF0LWxpbmUnKS5jbGFzc0xpc3RbMV07XHJcbiAgICBcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBDdXJyZW50RnVuZC51cGRhdGUoZnVuZCk7XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UocGFnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGUoKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZWxpbmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFzZWxpbmUtc3RhdHMnKTtcclxuICAgICAgICBiYXNlbGluZURpdi5pbm5lckhUTUwgPSB0aGlzLnRhcmdldF9odG1sKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5mdW5kcy5mb3JFYWNoKChmdW5kKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmdW5kRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGZ1bmREaXYuaWQgPSBgZnVuZF8ke2Z1bmQuZnVuZH1gO1xyXG4gICAgICAgICAgICBmdW5kRGl2LmNsYXNzTGlzdC5hZGQoJ2Z1bmQtZGl2Jyk7XHJcbiAgICAgICAgICAgIGZ1bmREaXYuaW5uZXJIVE1MID0gdGhpcy5mdW5kX2h0bWwoZnVuZCk7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lRGl2LmFwcGVuZENoaWxkKGZ1bmREaXYpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZih0aGlzLmdlbkZ1bmQuZ2V0VG90YWwoKSA8PSBCYXNlbGluZS50YXJnZXQoKSl7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNHRi10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJncmVlblwiO1xyXG4gICAgICAgICAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnVuZF8xMDAwIC5zaWRlYmFyLXN0YXQtbGluZTpsYXN0LW9mLXR5cGUgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwiZ3JlZW5cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjR0YtdG90YWwgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwicmVkXCI7XHJcbiAgICAgICAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmdW5kXzEwMDAgLnNpZGViYXItc3RhdC1saW5lOmxhc3Qtb2YtdHlwZSAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5rRWRpdEJ0bnMoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQgeyBTdXBwbGVtZW50YWwgfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlsc1wiO1xyXG5pbXBvcnQgeyB2aXNpdFBhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdmlld3Mvdmlld19sb2dpY1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFN1cHBTZWN0aW9uID0ge1xyXG4gICAgaHRtbCgpIHtcclxuICAgICAgICB2YXIgc3VwcCA9IG5ldyBTdXBwbGVtZW50YWw7XHJcbiAgICAgICAgcmV0dXJuIGBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUnIGlkPVwic3VwcC1yZXZlbnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Fc3RpbWF0ZWQgUmV2ZW51ZXM6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC5yZXZlbnVlKCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1zdXBwXCIgdGl0bGU9XCJFZGl0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nc2lkZWJhci1zdGF0LWxpbmUnIGlkPVwic3VwcC1leHBlbnNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+UGVyc29ubmVsIGNvc3Q6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC5wZXJzb25uZWwoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LXN1cHBcIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJzdXBwLWV4cGVuc2VzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ob24tUGVyc29ubmVsIE9wZXJhdGluZzo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShzdXBwLm9wZXJhdGluZygpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtc3VwcFwiIHRpdGxlPVwiRWRpdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cInN1cHAtZXhwZW5zZXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPk5vbi1QZXJzb25uZWwgQ2FwaXRhbDo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShzdXBwLmNhcGl0YWwoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LXN1cHBcIiB0aXRsZT1cIkVkaXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJzdXBwLWV4cGVuc2VzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ub3RhbCBleHBlbmRpdHVyZXM6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC50b3RhbCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtc3VwcFwiIHRpdGxlPVwiRWRpdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgfSxcclxuXHJcbiAgICBsaW5rRWRpdEJ0bnMoKSB7XHJcbiAgICAgICAgbGV0IGJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdC1zdXBwJyk7XHJcbiAgICAgICAgYnRucy5mb3JFYWNoKChidG4pID0+IHtcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UoJ25ldy1pbml0cycpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlKCkge1xyXG4gICAgICAgIGNvbnN0IHN1cHBEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3VwcC1zdGF0cycpO1xyXG4gICAgICAgIHN1cHBEaXYuaW5uZXJIVE1MID0gdGhpcy5odG1sKCk7XHJcbiAgICAgICAgdGhpcy5saW5rRWRpdEJ0bnMoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VwcFNlY3Rpb247IiwiaW1wb3J0ICcuL3NpZGViYXIuY3NzJ1xyXG5pbXBvcnQgeyBCYXNlbGluZVNlY3Rpb24gfSBmcm9tICcuL3N1YmNvbXBvbmVudHMvYmFzZWxpbmVfc2VjdGlvbic7XHJcblxyXG5pbXBvcnQgU3VwcFNlY3Rpb24gZnJvbSAnLi9zdWJjb21wb25lbnRzL3N1cHBfc2VjdGlvbidcclxuXHJcbi8vIGZldGNoIENTUyB2YXJpYWJsZXMgc2F2ZWQgaW4gOnJvb3RcclxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuY29uc3Qgc2lkZUJhcldpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpZGViYXItd2lkdGgnKS50cmltKCk7XHJcblxyXG5mdW5jdGlvbiBoaWRlU2lkZWJhcigpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXBhbmVsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJykuc3R5bGUud2lkdGggPSAnMTAwJSc7IFxyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJykuc3R5bGUud2lkdGggPSAnMTAwJSdcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1NpZGViYXIoKSB7XHJcbiAgICBjb25zdCBzaWRlYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKTtcclxuICAgIGNvbnN0IG1haW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJyk7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKTtcclxuXHJcbiAgICAvLyB1cGRhdGUgdmFsdWVzXHJcbiAgICB1cGRhdGVUb3RhbHMoKTtcclxuICAgIHNpZGViYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IC8vIFNob3cgdGhlIHNpZGViYXJcclxuICAgIFxyXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZW1haW5pbmcgd2lkdGggZm9yIHRoZSBtYWluIHBhbmVsIGFuZCBoZWFkZXJcclxuICAgIHZhciBjb250ZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICBtYWluUGFuZWwuc3R5bGUud2lkdGggPSBgJHtjb250ZW50V2lkdGggLSBwYXJzZUludChzaWRlQmFyV2lkdGgsIDEwKX1weGA7IFxyXG4gICAgaGVhZGVyLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcclxuXHJcbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXIgdG8gcmVzaXplIGNvbnRlbnQgaWYgd2luZG93IGlzIGFkanVzdGVkXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc2hvd1NpZGViYXIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTaWRlYmFyVGl0bGUobmV3X3RpdGxlKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXRpdGxlJykudGV4dENvbnRlbnQgPSBuZXdfdGl0bGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVRvdGFscygpe1xyXG4gICAgU3VwcFNlY3Rpb24udXBkYXRlKCk7XHJcbiAgICBCYXNlbGluZVNlY3Rpb24udXBkYXRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc2V0QWxsKCl7XHJcbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgIC8vIHJlc2V0IGFsbCBzdGF0cyB0byAwXHJcbiAgICB1cGRhdGVUb3RhbHMoKTtcclxufVxyXG5cclxuY29uc3QgU2lkZWJhciA9IHtcclxuICAgIFN1cHBTZWN0aW9uIDogU3VwcFNlY3Rpb24sXHJcbiAgICBCYXNlbGluZVNlY3Rpb24gOiBCYXNlbGluZVNlY3Rpb24sXHJcbiAgICBoaWRlOiBoaWRlU2lkZWJhcixcclxuICAgIHNob3c6IHNob3dTaWRlYmFyLFxyXG4gICAgdXBkYXRlVGl0bGU6IHVwZGF0ZVNpZGViYXJUaXRsZSxcclxuICAgIHVwZGF0ZVRvdGFsczogdXBkYXRlVG90YWxzLFxyXG4gICAgcmVzZXQ6IHJlc2V0QWxsXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWRlYmFyOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9uYXZfYnV0dG9ucy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9uYXZfYnV0dG9ucy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBuYXZfYnV0dG9ucy5qc1xyXG5pbXBvcnQgJy4vbmF2X2J1dHRvbnMuY3NzJztcclxuaW1wb3J0IHsgbmV4dFBhZ2UsIGxhc3RQYWdlIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlld19sb2dpYy5qcyc7XHJcblxyXG5mdW5jdGlvbiBpbml0aWFsaXplTmF2QnV0dG9ucygpIHtcclxuICAgIC8vIGluaXRpYWxpemUgbGFzdCBidXR0b25cclxuICAgIGNvbnN0IGxhc3RfYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1sYXN0Jyk7XHJcbiAgICBsYXN0X2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxhc3RQYWdlKTsgXHJcbiAgICAvLyBpbml0aWFsaXplIG5leHQgYnV0dG9uXHJcbiAgICBjb25zdCBuZXh0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tbmV4dCcpO1xyXG4gICAgbmV4dF9idG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBuZXh0UGFnZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRpc2FibGUoYnV0dG9uX2lkKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xyXG4gICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlOyAvLyBBbHNvIGRpc2FibGUgaXQgYXQgdGhlIERPTSBsZXZlbFxyXG59XHJcblxyXG5mdW5jdGlvbiBlbmFibGUoYnV0dG9uX2lkKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xyXG4gICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XHJcbiAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTsgLy8gRW5hYmxlIGl0IGF0IHRoZSBET00gbGV2ZWxcclxufVxyXG5cclxuY29uc3QgTmV4dCA9IHtcclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbmV4dCcpOyB9LFxyXG4gICAgZW5hYmxlOiBmdW5jdGlvbigpIHsgZW5hYmxlKCdidG4tbmV4dCcpOyB9LFxyXG4gICAgYWRkQWN0aW9uOiBmdW5jdGlvbihmbikge1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNidG4tbmV4dGApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZm4pO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZUFjdGlvbjogZnVuY3Rpb24oZm4pIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYnRuLW5leHRgKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGZuKTtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBMYXN0ID0ge1xyXG4gICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7IGRpc2FibGUoJ2J0bi1sYXN0Jyk7IH0sXHJcbiAgICBlbmFibGU6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ2J0bi1sYXN0Jyk7IH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgTmF2QnV0dG9ucyA9IHtcclxuICAgIGhpZGU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXYtYnRucycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9LFxyXG4gICAgc2hvdzogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdi1idG5zJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKTtcclxuICAgIH0sXHJcbiAgICBOZXh0OiBOZXh0LFxyXG4gICAgTGFzdDogTGFzdCxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5hdkJ1dHRvbnM7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2JvZHkuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYm9keS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYWNjb3JkaW9uLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjY29yZGlvbi5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZnVuY3Rpb24gYWRkVGFibGVIZWFkZXJzKGNvbHMpe1xyXG5cclxuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIFxyXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgaGVhZGVyIHJvdyBlbGVtZW50XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG5cclxuICAgIGNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIGhlYWRlciBjZWxsIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBoZWFkZXJDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICBoZWFkZXJDZWxsLnRleHRDb250ZW50ID0gY29sWyd0aXRsZSddO1xyXG4gICAgICAgIGhlYWRlckNlbGwuY2xhc3NMaXN0LmFkZChjb2xbJ2NsYXNzTmFtZSddKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBlbmQgdGhlIGhlYWRlciBjZWxsIHRvIHRoZSBoZWFkZXIgcm93XHJcbiAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGhlYWRlckNlbGwpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgcm93IHRvIHRoZSB0YWJsZSBoZWFkZXJcclxuICAgIGxldCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xyXG59XHJcblxyXG5jb25zdCBIZWFkZXIgPSB7XHJcbiAgICBhZGQ6IGZ1bmN0aW9uKGhlYWRlcl9hcnJheSl7XHJcbiAgICAgICAgYWRkVGFibGVIZWFkZXJzKGhlYWRlcl9hcnJheSlcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlcnMuanNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5LCBjb2x1bW5zID0gW10pe1xyXG4gICAgXHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWRcclxuICAgIGxldCBoZWFkZXJfcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQgdHInKTtcclxuICAgIGlmICghaGVhZGVyX3Jvdykge1xyXG4gICAgICAgIEhlYWRlci5hZGQoY29sdW1ucyk7XHJcbiAgICAgICAgaGVhZGVyX3JvdyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkIHRyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBuZXcgcm93IG9mIGRhdGFcclxuICAgIGNvbnN0IG5ld19yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG5cclxuICAgIC8vIGdvIHRocm91Z2ggZWFjaCBoZWFkZXIgYW5kIGFkZCB0aGUgcmlnaHQgY2VsbCB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIGNsYXNzXHJcbiAgICBsZXQgdGhFbGVtZW50cyA9IGhlYWRlcl9yb3cucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuICAgIHRoRWxlbWVudHMuZm9yRWFjaCggKGhlYWRlcl9jZWxsKSA9PiB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBjZWxsIGFuZCBhZGQgaXQgdG8gdGhlIHJvd1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgIG5ld19yb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XHJcbiAgICAgICAgLy8gaWYgdGhlIGRhdGEgaGFzIGFuIGFwcHJvcHJpYXRlIGNsYXNzLCBhZGQgdGhlIGluZm8gdG8gdGhlIGNlbGwuIFxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwga2VlcCBlbXB0eSBjZWxsXHJcbiAgICAgICAgT2JqZWN0LmtleXMoZGF0YV9kaWN0aW9uYXJ5KS5mb3JFYWNoKCAoY2xhc3NOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJfY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSApe1xyXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC50ZXh0Q29udGVudCA9IGRhdGFfZGljdGlvbmFyeVtjbGFzc05hbWVdO1xyXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgbmV3IHJvdyB0byB0aGUgdGFibGUgYm9keVxyXG4gICAgbGV0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIHRib2R5LmFwcGVuZENoaWxkKG5ld19yb3cpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzYXZlUm93RWRpdHMocm93KXtcclxuICAgIHZhciBjZWxscyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpXHJcbiAgICBjZWxscy5mb3JFYWNoKCBjZWxsID0+IHtcclxuICAgICAgICAvLyBzYXZlIGRyb3Bkb3duIHZhbHVlc1xyXG4gICAgICAgIGlmIChjZWxsLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpKXtcclxuICAgICAgICAgICAgdmFyIHNlcnZpY2VTZWxlY3RvciA9IGNlbGwucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XHJcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBzZXJ2aWNlU2VsZWN0b3IudmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjZWxsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykpIHtcclxuICAgICAgICAgICAgLy8gc2F2ZSBuZXcgZW50ZXJlZCB2YWx1ZSBpbiB0ZXh0Ym94XHJcbiAgICAgICAgICAgIHZhciB0ZXh0Ym94ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICB2YXIgZW50ZXJlZFZhbHVlID0gdGV4dGJveC52YWx1ZTtcclxuICAgICAgICAgICAgLy8gdXBkYXRlIGRpc3BsYXkgYW5kIGZvcm1hdCB3aXRoIGN1cnJlbmN5IGlmIHJlbGV2YW50XHJcbiAgICAgICAgICAgIGlmICggY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvc3QnKSApe1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgY29zdCwgcmVtb3ZlIGNvbW1hcyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgZW50ZXJlZFZhbHVlID0gZW50ZXJlZFZhbHVlLnJlcGxhY2VBbGwoJywnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3koZW50ZXJlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIG5ldyB1c2VyIGlucHV0XHJcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBlbnRlcmVkVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGVudGVyZWRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpKXtcclxuICAgICAgICAgICAgLy8gc2F2ZSBuZXcgZW50ZXJlZCB2YWx1ZSBpbiB0ZXh0Ym94XHJcbiAgICAgICAgICAgIHZhciBlbnRlcmVkVmFsdWUgPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykudmFsdWU7XHJcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBlbnRlcmVkVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufVxyXG5cclxuY29uc3QgUm93cyA9IHtcclxuICAgIGFkZCA6IGZ1bmN0aW9uKGRhdGFfZGljdGlvbmFyeSwgY29scyl7XHJcbiAgICAgICAgYWRkTmV3Um93KGRhdGFfZGljdGlvbmFyeSwgY29scylcclxuICAgIH0sXHJcbiAgICBzYXZlRWRpdHMgOiBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgIHNhdmVSb3dFZGl0cyhyb3cpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJvd3M7IiwiaW1wb3J0IFJvd3MgZnJvbSAnLi9yb3dzLmpzJ1xyXG5cclxuZnVuY3Rpb24gaGlkZUJ1dHRvbihjbGFzc05hbWUpe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93QnV0dG9uKGNsYXNzTmFtZSl7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbnNbaV0uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlQnV0dG9uVGV4dChjbGFzc05hbWUsIHRleHQpe1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApLnRleHRDb250ZW50ID0gdGV4dDtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUm93RWRpdChhY3Rpb25PbkNsaWNrLCB1cGRhdGVDYWxsYmFjayA9IG51bGwpe1xyXG4gICAgLy8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGVhY2ggZWRpdCBidXR0b24gaW4gZXZlcnkgcm93XHJcbiAgICB2YXIgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdidG4tZWRpdCcpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGl0QnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGVkaXRCdXR0b25zW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2FzIGNsaWNrZWQgb24gd2l0aGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgICB2YXIgcm93VG9FZGl0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XHJcbiAgICAgICAgICAgIC8vIG1hcmsgcm93IGFzIGJlaW5nIGVkaXRlZFxyXG4gICAgICAgICAgICByb3dUb0VkaXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLWVkaXRpbmcnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHR1cm4gcmVsZXZhbnQgZW50cmllcyBpbnRvIHRleHRib3hlcywgdXN1YWxseVxyXG4gICAgICAgICAgICBhY3Rpb25PbkNsaWNrKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBoaWRlIGVkaXQgYnV0dG9uc1xyXG4gICAgICAgICAgICBFZGl0LmhpZGUoKTtcclxuICAgICAgICAgICAgaWYodXBkYXRlQ2FsbGJhY2spe1xyXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbmZpcm1CdXR0b24odXBkYXRlQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayl7XHJcbiAgICAvLyBnZXQgZWxlbWVudCBhbmQgYWRkIGxpc3RlbmVyIGZvciBjbGlja1xyXG4gICAgdmFyIHJvd1RvRWRpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtZWRpdGluZycpO1xyXG4gICAgY29uc3QgY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcclxuICAgIC8vIHNob3cgdGhlIHJvdydzIGNvbmZpcm0gYnV0dG9uXHJcbiAgICBjb25maXJtX2J0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIGNvbmZpcm1fYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXs7XHJcbiAgICAgICAgLy8gc2F2ZSByb3cgZWRpdHNcclxuICAgICAgICBSb3dzLnNhdmVFZGl0cyhyb3dUb0VkaXQpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXMgaW4gc2lkZWJhclxyXG4gICAgICAgIHVwZGF0ZUNhbGxiYWNrKCk7XHJcbiAgICAgICAgLy8gbWFrZSByb3cgbm8gbG9uZ2VyIGdyZWVuXHJcbiAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1lZGl0aW5nJyk7XHJcbiAgICAgICAgLy8gc2hvdyBlZGl0IGJ1dHRvbnMgYW5kIGhpZGUgY29uZmlybSBidXR0b25zXHJcbiAgICAgICAgRWRpdC5zaG93KCk7XHJcbiAgICAgICAgQ29uZmlybS5oaWRlKCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgRWRpdCA9IHtcclxuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1lZGl0XCI+RWRpdCByb3c8L2J1dHRvbj4nLFxyXG4gICAgaGlkZTogaGlkZUJ1dHRvbignYnRuLWVkaXQnKSxcclxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1lZGl0JyksXHJcbiAgICBpbml0IDogZnVuY3Rpb24oYWN0aW9uT25DbGljaywgdXBkYXRlQ2FsbGJhY2spe1xyXG4gICAgICAgIGhhbmRsZVJvd0VkaXQoYWN0aW9uT25DbGljaywgdXBkYXRlQ2FsbGJhY2spXHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEZWxldGUgPSB7XHJcbiAgICBodG1sOiAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+JyxcclxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1kZWxldGUnKSxcclxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1kZWxldGUnKVxyXG59O1xyXG5cclxuY29uc3QgQ29uZmlybSA9IHtcclxuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jb25maXJtXCI+Q29uZmlybTwvYnV0dG9uPicsXHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tY29uZmlybScpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWNvbmZpcm0nKVxyXG59O1xyXG5cclxuY29uc3QgQWRkUm93ID0ge1xyXG4gICAgaGlkZTogaGlkZUJ1dHRvbignYnRuLWFkZCcpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWFkZCcpLFxyXG4gICAgdXBkYXRlVGV4dDogZnVuY3Rpb24odGV4dCl7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uVGV4dCgnYnRuLWFkZCcsIHRleHQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XHJcbiAgICBEZWxldGU6IERlbGV0ZSxcclxuICAgIEVkaXQgOiBFZGl0LFxyXG4gICAgQ29uZmlybSA6IENvbmZpcm0sXHJcbiAgICBBZGRSb3cgOiBBZGRSb3csXHJcbiAgICBlZGl0X2NvbmZpcm1fYnRucyA6IEVkaXQuaHRtbCArIENvbmZpcm0uaHRtbCAsXHJcbiAgICBhbGxfYnRucyA6IERlbGV0ZS5odG1sICsgRWRpdC5odG1sICsgQ29uZmlybS5odG1sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiZnVuY3Rpb24gY3JlYXRlRHJvcGRvd24oZGF0YUFycmF5KSB7XHJcblxyXG4gIC8vIENyZWF0aW5nIGEgc2VsZWN0IGVsZW1lbnRcclxuICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XHJcblxyXG4gIC8vIGFkZCBhIGRlZmF1bHQgYmxhbmsgb3B0aW9uIHRvIHRoZSBkYXRhQXJyYXlcclxuICBkYXRhQXJyYXkgPSBbJyddLmNvbmNhdChkYXRhQXJyYXkpO1xyXG5cclxuICAvLyBMb29waW5nIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGluZyBhbiBvcHRpb24gZm9yIGVhY2ggZWxlbWVudFxyXG4gIGRhdGFBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xyXG4gICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGl0ZW07XHJcbiAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gaXRlbTtcclxuICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7IC8vIEFwcGVuZGluZyB0aGUgb3B0aW9uIHRvIHRoZSBzZWxlY3RcclxuICB9KTtcclxuXHJcbiAgLy8gUmV0dXJuIHRoZSBzZWxlY3QgZWxlbWVudCBzbyBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50XHJcbiAgcmV0dXJuIHNlbGVjdEVsZW1lbnQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgRHJvcGRvd24gPSB7XHJcbiAgICBjcmVhdGUgOiBmdW5jdGlvbihkYXRhQXJyYXkpIHsgcmV0dXJuIGNyZWF0ZURyb3Bkb3duKGRhdGFBcnJheSkgfSxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd247IiwiaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3ksIGRpc3BsYXlXaXRoQ29tbWFzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5pbXBvcnQgU2VydmljZXMgZnJvbSBcIi4uLy4uLy4uL21vZGVscy9zZXJ2aWNlcy5qc1wiO1xyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4uLy4uL2Zvcm0vc3ViY29tcG9uZW50cy9kcm9wZG93bi5qc1wiO1xyXG5cclxuLy8gcmV0dXJuIGNlbGwgdmFsdWUgYXR0cmlidXRlIG9yIDAgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuZnVuY3Rpb24gZ2V0Q2VsbFZhbHVlKHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XHJcbiAgICB2YXIgY2VsbFZhbHVlID0gY2VsbCA/IGNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIDogbnVsbDtcclxuICAgIHJldHVybiBjZWxsVmFsdWUgPyBwYXJzZUZsb2F0KGNlbGxWYWx1ZSkgOiAwO1xyXG59XHJcblxyXG4vLyByZXR1cm4gdGV4dCBpbiBjZWxsXHJcbmZ1bmN0aW9uIGdldENlbGxUZXh0KHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XHJcbiAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgIHJldHVybiBjZWxsLnRleHRDb250ZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGBFcnJvciByZXRyaWV2aW5nIGNlbGwgdGV4dCBmb3IgY2xhc3MgJHtjbGFzc05hbWV9YCk7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVUYWJsZUNlbGwocm93LCBjb2xfY2xhc3MsIG5ld192YWx1ZSl7XHJcbiAgICBjb25zdCBjZWxsID0gcm93LnF1ZXJ5U2VsZWN0b3IoYC4ke2NvbF9jbGFzc31gKTtcclxuICAgIGNlbGwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5ld192YWx1ZSk7XHJcbiAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X3ZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRWRpdGFibGVDZWxsKGNlbGxDbGFzcywgaXNDb3N0LCB0eXBlID0gJ2lucHV0Jyl7XHJcbiAgICAvLyBnZXQgY2VsbFxyXG4gICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZyB0ZC4ke2NlbGxDbGFzc31gKTtcclxuICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBlbGVtZW50IHRvIGVkaXQgdGhlIHZhbHVlXHJcbiAgICB2YXIgdGV4dGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XHJcbiAgICBpZiAodHlwZSA9PSAnaW5wdXQnKXtcclxuICAgICAgICB0ZXh0Ym94LnR5cGUgPSAndGV4dCc7XHJcbiAgICB9O1xyXG4gICAgaWYgKGlzQ29zdCl7XHJcbiAgICAgICAgdmFyIHZhbHVlID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XHJcbiAgICAgICAgdGV4dGJveC52YWx1ZSA9IGRpc3BsYXlXaXRoQ29tbWFzKHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGV4dGJveC52YWx1ZSA9IGNlbGwudGV4dENvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcclxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBjZWxsLmFwcGVuZENoaWxkKHRleHRib3gpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVEcm9wZG93bihjZWxsQ2xhc3MsIG9wdGlvbkFycmF5KXtcclxuICAgIC8vIGdldCBjZWxsXHJcbiAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmFjdGl2ZS1lZGl0aW5nIHRkLiR7Y2VsbENsYXNzfWApO1xyXG4gICAgLy8gYWRkIHNlcnZpY2UgZHJvcGRvd25cclxuICAgIGNvbnN0IGRyb3Bkb3duID0gRHJvcGRvd24uY3JlYXRlKG9wdGlvbkFycmF5KTtcclxuICAgIGRyb3Bkb3duLnZhbHVlID0gY2VsbC50ZXh0Q29udGVudDtcclxuICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGNvbnRlbnQgYW5kIGFwcGVuZCB0aGUgdGV4dGJveCB0byB0aGUgY2VsbFxyXG4gICAgY2VsbC5pbm5lckhUTUwgPSAnJztcclxuICAgIGNlbGwuYXBwZW5kQ2hpbGQoZHJvcGRvd24pO1xyXG59XHJcblxyXG5jb25zdCBDZWxsID0ge1xyXG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldENlbGxWYWx1ZShyb3csIGNsYXNzTmFtZSk7IFxyXG4gICAgfSxcclxuICAgIGdldFRleHQ6IGZ1bmN0aW9uKHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldENlbGxUZXh0KHJvdywgY2xhc3NOYW1lKTsgXHJcbiAgICB9LFxyXG4gICAgdXBkYXRlVmFsdWU6IGZ1bmN0aW9uKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpIHtcclxuICAgICAgICB1cGRhdGVUYWJsZUNlbGwocm93LCBjb2xfY2xhc3MsIG5ld192YWx1ZSk7IFxyXG4gICAgfSxcclxuICAgIGNyZWF0ZVRleHRib3ggOiBmdW5jdGlvbihjbGFzc05hbWUsIGlzQ29zdCwgdHlwZSkge1xyXG4gICAgICAgIGNyZWF0ZUVkaXRhYmxlQ2VsbChjbGFzc05hbWUsIGlzQ29zdCwgdHlwZSlcclxuICAgIH0sXHJcbiAgICBjcmVhdGVTZXJ2aWNlRHJvcGRvd24gOiAgKCkgPT4geyBjcmVhdGVEcm9wZG93bignc2VydmljZScsIFNlcnZpY2VzLmxpc3QoKSkgfSxcclxuICAgIGNyZWF0ZURyb3Bkb3duIDogY3JlYXRlRHJvcGRvd25cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IENlbGw7IiwiaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcblxyXG4vLyBwb3NpdGlvbiBpcyBpbmRleCBhdCB3aGljaCBuZXcgY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWRcclxuZnVuY3Rpb24gYWRkQ29sKHBvc2l0aW9uLCBodG1sQ29udGVudCA9ICcnLCBoZWFkZXJUaXRsZSA9ICcnKSB7XHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBsZXQgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG5cclxuICAgIC8vIFZhbGlkYXRlIHBvc2l0aW9uXHJcbiAgICBsZXQgbWF4UG9zaXRpb24gPSB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDtcclxuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiBtYXhQb3NpdGlvbikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBQb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBvdXQgb2YgYm91bmRzLmApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBJbnNlcnQgdGhlIGhlYWRlciBpZiBwcm92aWRlZFxyXG4gICAgbGV0IHRoZWFkID0gdGFibGUudEhlYWQ7XHJcbiAgICBpZiAoaGVhZGVyVGl0bGUgJiYgdGhlYWQpIHtcclxuICAgICAgbGV0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgdGguaW5uZXJIVE1MID0gaGVhZGVyVGl0bGU7IC8vIFVzZSBpbm5lckhUTUwgdG8gaW5zZXJ0IEhUTUwgY29udGVudFxyXG4gICAgICB0aGVhZC5yb3dzWzBdLmluc2VydEJlZm9yZSh0aCwgdGhlYWQucm93c1swXS5jZWxsc1twb3NpdGlvbl0pO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gSW5zZXJ0IG5ldyBjZWxscyBpbnRvIGVhY2ggcm93IG9mIHRoZSB0YWJsZSBib2R5XHJcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdO1xyXG4gICAgaWYgKHRib2R5KSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGJvZHkucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCByb3cgPSB0Ym9keS5yb3dzW2ldO1xyXG4gICAgICAgIGxldCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XHJcbiAgICAgICAgdGQuaW5uZXJIVE1MID0gaHRtbENvbnRlbnQ7IC8vIFVzZSBpbm5lckhUTUwgdG8gaW5zZXJ0IEhUTUwgY29udGVudFxyXG4gICAgICAgIHJvdy5pbnNlcnRCZWZvcmUodGQsIHJvdy5jZWxsc1twb3NpdGlvbl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5jb2xzKCl7XHJcbiAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcm93IGV4aXN0cyBiZWZvcmUgY291bnRpbmcgdGhlIGNvbHVtbnNcclxuICAgIHJldHVybiB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDtcclxufVxyXG4gIFxyXG5mdW5jdGlvbiBhZGRDb2xUb0VuZChodG1sQ29udGVudHMgPSBbXSwgaGVhZGVyVGl0bGUgPSAnJyl7XHJcbiAgICAvLyBjb3VudCBjb2x1bW5zIGFuZCBhZGQgbmV3IGNvbHVtbiB0byB0aGUgZW5kXHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IG5jb2xzKCdtYWluLXRhYmxlJyk7XHJcbiAgICBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50cywgaGVhZGVyVGl0bGUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3NpZ25DbGFzc1RvQ29sdW1uKGhlYWRlck5hbWUsIGNsYXNzTmFtZSkge1xyXG4gICAgLy8gR2V0IHRoZSB0YWJsZSBlbGVtZW50IGJ5IGl0cyBJRFxyXG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuXHJcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGJ5IGl0cyBoZWFkZXIgbmFtZVxyXG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS50SGVhZDtcclxuICAgIGxldCBoZWFkZXJDZWxsSW5kZXggPSAtMTtcclxuICAgIGNvbnN0IGhlYWRlckNlbGxzID0gdGhlYWQucm93c1swXS5jZWxsczsgLy8gQXNzdW1pbmcgdGhlIGZpcnN0IHJvdyBjb250YWlucyBoZWFkZXIgY2VsbHMgKDx0aD4pXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlckNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGhlYWRlckNlbGxzW2ldLnRleHRDb250ZW50LnRyaW0oKSA9PT0gaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICAvLyBhc3NpZ24gdGhlIGNsYXNzIHRvIHRoZSBoZWFkZXIgY2VsbFxyXG4gICAgICAgICAgICBoZWFkZXJDZWxsc1tpXS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlcnJvciBjaGVja1xyXG4gICAgaWYgKGhlYWRlckNlbGxJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBoZWFkZXIgZm91bmQgd2l0aCBuYW1lIFwiJHtoZWFkZXJOYW1lfVwiYCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gQXNzaWduIHRoZSBjbGFzcyB0byBlYWNoIGNlbGwgaW4gdGhlIHNwZWNpZmllZCBjb2x1bW4gaW5kZXggd2l0aGluIHRoZSB0Ym9keVxyXG4gICAgbGV0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcclxuICAgIGlmICh0Ym9keSkge1xyXG4gICAgICBsZXQgYm9keVJvd3MgPSB0Ym9keS5yb3dzO1xyXG4gICAgICBmb3IgKGxldCByb3cgb2YgYm9keVJvd3MpIHtcclxuICAgICAgICBpZiAocm93LmNlbGxzW2hlYWRlckNlbGxJbmRleF0pIHtcclxuICAgICAgICAgIHJvdy5jZWxsc1toZWFkZXJDZWxsSW5kZXhdLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5mdW5jdGlvbiBhZGRDb3N0Q2xhc3MoaGVhZGVyTmFtZSl7XHJcbiAgICBhc3NpZ25DbGFzc1RvQ29sdW1uKCBoZWFkZXJOYW1lLCAnY29zdCcpO1xyXG5cclxuICAgIC8vIEdldCBhbGwgdGhlIGNlbGxzIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lXHJcbiAgICBjb25zdCBjZWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHRkLmNvc3RgKTtcclxuICAgICAgXHJcbiAgICBjZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGwgYW5kIGFzc2lnbiBpdCB0byAndmFsdWUnIGF0dHJpYnV0ZVxyXG4gICAgICAgIGlmICghY2VsbC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpe1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsVGV4dCA9IGNlbGwudGV4dENvbnRlbnQudHJpbSgpO1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBpc05hTihjZWxsVGV4dCkgfHwgY2VsbFRleHQgPT09ICcnID8gMCA6IHBhcnNlRmxvYXQoY2VsbFRleHQpO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBjZWxsVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gTm93IGZvcm1hdCB0aGUgdGV4dCBjb250ZW50IGxpa2UgY3VycmVuY3kgYW5kIHJlcGxhY2UgaXQgaW4gdGhlIGNlbGxcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkQ3VycmVuY3kgPSBmb3JtYXRDdXJyZW5jeShwYXJzZUZsb2F0KGNlbGxWYWx1ZSkpO1xyXG4gICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0dGVkQ3VycmVuY3k7XHJcbiAgICAgICAgfVxyXG4gICAgICBcclxuICAgIH0pO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXNzaWduQ29sdW1uQ2xhc3Nlcyhjb2x1bW5EZWZpbml0aW9ucykge1xyXG4gICAgY29sdW1uRGVmaW5pdGlvbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgIC8vIEFzc2lnbiBjbGFzcyB0byBjb2x1bW5cclxuICAgICAgICBhc3NpZ25DbGFzc1RvQ29sdW1uKGNvbHVtbi50aXRsZSwgY29sdW1uLmNsYXNzTmFtZSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgYSBjb3N0IGNvbHVtbiwgYWRkIHRoZSBzcGVjaWZpYyBjb3N0IGNsYXNzXHJcbiAgICAgICAgaWYgKGNvbHVtbi5pc0Nvc3QpIHtcclxuICAgICAgICAgICAgYWRkQ29zdENsYXNzKGNvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzaG93IHRoZSBjb2x1bW5cclxuICAgICAgICBpZiAoIWNvbHVtbi5oaWRlKXtcclxuICAgICAgICAgICAgc2hvd0NvbHVtbkJ5VGl0bGUoY29sdW1uLnRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGlkZUNvbHVtbihpbmRleCkge1xyXG4gIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzO1xyXG5cclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGluZGV4KSB7XHJcbiAgICAgICAgICBjZWxsc1tpbmRleF0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb24gdG8gc2hvdyBhIHNwZWNpZmljIGNvbHVtblxyXG5mdW5jdGlvbiBzaG93Q29sdW1uKGluZGV4KSB7XHJcbiAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICB2YXIgcm93cyA9IHRhYmxlLnJvd3M7XHJcblxyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgY2VsbHMgPSByb3dzW2ldLmNlbGxzO1xyXG4gICAgICBpZiAoY2VsbHMubGVuZ3RoID4gaW5kZXgpIHtcclxuICAgICAgICAgIGNlbGxzW2luZGV4XS5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlLWNlbGwnO1xyXG4gICAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGNvbHVtbiBpbmRleCBieSB0aXRsZVxyXG5mdW5jdGlvbiBnZXRDb2x1bW5JbmRleEJ5VGl0bGUodGFibGUsIHRpdGxlKSB7XHJcbiAgdmFyIGhlYWRlcnMgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoaGVhZGVyc1tpXS5pbm5lclRleHQgPT09IHRpdGxlKSB7XHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gIH1cclxuICByZXR1cm4gLTE7IC8vIENvbHVtbiBub3QgZm91bmRcclxufVxyXG5cclxuLy8gRnVuY3Rpb24gdG8gaGlkZSBhIGNvbHVtbiBieSB0aXRsZVxyXG5mdW5jdGlvbiBoaWRlQ29sdW1uQnlUaXRsZSh0aXRsZSkge1xyXG4gIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgdmFyIGluZGV4ID0gZ2V0Q29sdW1uSW5kZXhCeVRpdGxlKHRhYmxlLCB0aXRsZSk7XHJcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICBoaWRlQ29sdW1uKGluZGV4KTtcclxuICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZyhgQ29sdW1uIHdpdGggdGl0bGUgXCIke3RpdGxlfVwiIG5vdCBmb3VuZC5gKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNob3cgYSBjb2x1bW4gYnkgdGl0bGVcclxuZnVuY3Rpb24gc2hvd0NvbHVtbkJ5VGl0bGUodGl0bGUpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciBpbmRleCA9IGdldENvbHVtbkluZGV4QnlUaXRsZSh0YWJsZSwgdGl0bGUpO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgc2hvd0NvbHVtbihpbmRleCk7XHJcbiAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coYENvbHVtbiB3aXRoIHRpdGxlIFwiJHt0aXRsZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuY29uc3QgQ29sdW1uID0ge1xyXG4gIGFkZDogZnVuY3Rpb24ocG9zaXRpb24sIGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xyXG4gICAgICByZXR1cm4gYWRkQ29sKHBvc2l0aW9uLCBodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpO1xyXG4gIH0sXHJcbiAgYWRkQXRFbmQ6IGZ1bmN0aW9uKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xyXG4gICAgICByZXR1cm4gYWRkQ29sVG9FbmQoaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcclxuICB9LFxyXG4gIGFzc2lnbkNsYXNzZXM6IGZ1bmN0aW9uKGNvbHVtbl9kZWZpbml0aW9ucykge1xyXG4gICAgICByZXR1cm4gYXNzaWduQ29sdW1uQ2xhc3Nlcyhjb2x1bW5fZGVmaW5pdGlvbnMpO1xyXG4gIH0sXHJcbiAgaGlkZSA6IGZ1bmN0aW9uKGNvbE5hbWUpIHtcclxuICAgICAgaGlkZUNvbHVtbkJ5VGl0bGUoY29sTmFtZSk7XHJcbiAgfSxcclxuICBzaG93IDogZnVuY3Rpb24oY29sTmFtZSkge1xyXG4gICAgICBzaG93Q29sdW1uQnlUaXRsZShjb2xOYW1lKTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb2x1bW47IiwiaW1wb3J0IEZ1bmRMb29rdXBUYWJsZSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZnVuZF9sb29rdXBfdGFibGUuanMnO1xyXG5pbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qcydcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4uLy4uLy4uL21vZGVscy9jdXJyZW50X3BhZ2UuanMnXHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi90YWJsZS5qcyc7XHJcblxyXG5mdW5jdGlvbiBmaWxsVGFibGUoZGF0YSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICAgICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuXHJcbiAgICAgICAgLy8gY2xlYXIgZXhpc3RpbmcgZGF0YVxyXG4gICAgICAgIHRoZWFkLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIHRib2R5LmlubmVySFRNTCA9ICcnO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGFibGUgaGVhZGVyIHJvd1xyXG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZGF0YVswXSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpO1xyXG4gICAgICAgICAgICBoZWFkZXIudGV4dENvbnRlbnQgPSBrZXk7XHJcbiAgICAgICAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoZWFkLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0YWJsZSBib2R5IHJvd3NcclxuICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XHJcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XHJcbiAgICAgICAgICAgICAgICBjZWxsLmlubmVySFRNTCA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGNhdGNoKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGFibGUgc2F2ZWQgaW4gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcclxuICAgIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gbG9hZEZyb21TdG9yYWdlKCl7XHJcbiAgICAvLyBsb29rIHVwIHRhYmxlIG5hbWUgaW4gc3RvcmFnZVxyXG4gICAgaWYgKEN1cnJlbnRGdW5kLm51bWJlcigpKXtcclxuICAgICAgICB2YXIga2V5ID0gYCR7Q3VycmVudFBhZ2UubG9hZCgpfV8ke0N1cnJlbnRGdW5kLm51bWJlcigpfWA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBrZXkgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICAvLyBsb2FkIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAvLyBpZiBub3RoaW5nIGluIHN0b3JhZ2UsIHJldHVybiBhIHplcm9cclxuICAgIGlmICggIWRhdGEgKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIG90aGVyd2lzZSwgZmlsbCB0YWJsZSBpbiBIVE1MIGFuZCByZXR1cm4gc3VjY2VzcyAoMSlcclxuICAgICAgICBUYWJsZS5zaG93KCk7XHJcbiAgICAgICAgZmlsbFRhYmxlKGF3YWl0IEpTT04ucGFyc2UoZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gbG9hZEZ1bmRzKCl7XHJcbiAgICAvLyBnZXQgbGlzdCBvZiBmdW5kcyBmcm9tIHN0b3JhZ2VcclxuICAgIGNvbnN0IGZ1bmREaWN0ID0gRnVuZExvb2t1cFRhYmxlLnJldHJpZXZlKCk7XHJcbiAgICAvLyBidWlsZCBvdXQgZGF0YSBpbiBjb3JyZWN0IGZvcm1hdFxyXG4gICAgY29uc3QgcmV0ID0gW107XHJcbiAgICBPYmplY3Qua2V5cyhmdW5kRGljdCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgZnVuZCBoYXMgYWxyZWFkeSBiZWVuIGVkaXRlZFxyXG4gICAgICAgIGlmIChmdW5kRGljdFtrZXldWyd2aWV3ZWQnXSl7XHJcbiAgICAgICAgICAgIC8vIHRvZG86IGFkZCBhIGNoZWNrbWFyayBoZXJlXHJcbiAgICAgICAgICAgIHJldC5wdXNoKHsnRnVuZCcgOiAgYDxzcGFuIGNsYXNzID0gJ3ZpZXdlZC1mdW5kJz4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2Z1bmREaWN0W2tleV1bJ25hbWUnXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+YH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldC5wdXNoKHsnRnVuZCcgOiBgPHNwYW4gY2xhc3MgPSAndW52aWV3ZWQtZnVuZCc+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2Z1bmREaWN0W2tleV1bJ25hbWUnXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+YH0pOyAgIFxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZmlsbFRhYmxlKHJldCk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZXRDb2x1bW5JbmRleEJ5Q2xhc3ModGJvZHksIGNsYXNzTmFtZSkge1xyXG4gIGNvbnN0IGZpcnN0Um93ID0gdGJvZHkucm93c1swXTtcclxuICBpZiAoIWZpcnN0Um93KSByZXR1cm4gLTE7IC8vIFJldHVybiAtMSBpZiB0aGVyZSdzIG5vIHJvdyB0byBleGFtaW5lXHJcbiAgZm9yIChsZXQgY2VsbEluZGV4ID0gMDsgY2VsbEluZGV4IDwgZmlyc3RSb3cuY2VsbHMubGVuZ3RoOyBjZWxsSW5kZXgrKykge1xyXG4gICAgICBpZiAoZmlyc3RSb3cuY2VsbHNbY2VsbEluZGV4XS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGNlbGxJbmRleDtcclxuICAgICAgfVxyXG4gIH1cclxuICByZXR1cm4gLTE7IC8vIFJldHVybiAtMSBpZiBjbGFzcyBuYW1lIG5vdCBmb3VuZFxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBzb3J0KHByaW1hcnlDbGFzcywgc2Vjb25kYXJ5Q2xhc3MpIHtcclxuLy8gICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbi8vICAgY29uc3QgdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdO1xyXG4vLyAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRib2R5LnJvd3MpO1xyXG5cclxuLy8gICAvLyBHZXQgdGhlIGNvbHVtbiBpbmRpY2VzIGJ5IGNsYXNzIG5hbWVcclxuLy8gICBjb25zdCBwcmltYXJ5Q29sSW5kZXggPSBnZXRDb2x1bW5JbmRleEJ5Q2xhc3ModGJvZHksIHByaW1hcnlDbGFzcyk7XHJcbi8vICAgY29uc3Qgc2Vjb25kYXJ5Q29sSW5kZXggPSBnZXRDb2x1bW5JbmRleEJ5Q2xhc3ModGJvZHksIHNlY29uZGFyeUNsYXNzKTtcclxuXHJcbi8vICAgLy8gZXhpdCBpZiBjbGFzc2VzIGRvbid0IGV4aXN0XHJcbi8vICAgaWYgKHByaW1hcnlDb2xJbmRleCA9PT0gLTEgKSB7XHJcbi8vICAgICAgIGNvbnNvbGUuZXJyb3IoYENvbHVtbiBjbGFzcyAke2NsYXNzQX0gbm90IGZvdW5kIGluIHRhYmxlYCk7XHJcbi8vICAgICAgIHJldHVybjsgXHJcbi8vICAgfSBlbHNlIGlmIChzZWNvbmRhcnlDb2xJbmRleCA9PT0gLTEpIHtcclxuLy8gICAgICAgY29uc29sZS5lcnJvcihgQ29sdW1uIGNsYXNzICR7Y2xhc3NCfSBub3QgZm91bmQgaW4gdGFibGVgKTtcclxuLy8gICAgICAgcmV0dXJuOyBcclxuLy8gICB9XHJcblxyXG4vLyAgIC8vIFNvcnQgdGhlIHJvd3MgYmFzZWQgb24gdGhlIHRleHQgY29udGVudCBvZiB0aGUgY2VsbHNcclxuLy8gICByb3dzLnNvcnQoKHJvd0EsIHJvd0IpID0+IHtcclxuLy8gICAgICAgLy8gUHJpbWFyeSBjb2x1bW4gY29tcGFyaXNvblxyXG4vLyAgICAgICBjb25zdCBwcmltYXJ5QSA9IHVuZm9ybWF0Q3VycmVuY3kocm93QS5jZWxsc1twcmltYXJ5Q29sSW5kZXhdLnRleHRDb250ZW50KTtcclxuLy8gICAgICAgY29uc3QgcHJpbWFyeUIgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0IuY2VsbHNbcHJpbWFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcblxyXG4vLyAgICAgICBpZiAocHJpbWFyeUEgPCBwcmltYXJ5QikgcmV0dXJuIC0xO1xyXG4vLyAgICAgICBpZiAocHJpbWFyeUEgPiBwcmltYXJ5QikgcmV0dXJuIDE7XHJcblxyXG4vLyAgICAgICAvLyBTZWNvbmRhcnkgY29sdW1uIGNvbXBhcmlzb24gKGlmIHByaW1hcnkgaXMgZXF1YWwpXHJcbi8vICAgICAgIGNvbnN0IHNlY29uZGFyeUEgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0EuY2VsbHNbc2Vjb25kYXJ5Q29sSW5kZXhdLnRleHRDb250ZW50KTtcclxuLy8gICAgICAgY29uc3Qgc2Vjb25kYXJ5QiA9IHVuZm9ybWF0Q3VycmVuY3kocm93Qi5jZWxsc1tzZWNvbmRhcnlDb2xJbmRleF0udGV4dENvbnRlbnQpO1xyXG5cclxuLy8gICAgICAgaWYgKHNlY29uZGFyeUEgPCBzZWNvbmRhcnlCKSByZXR1cm4gLTE7XHJcbi8vICAgICAgIGlmIChzZWNvbmRhcnlBID4gc2Vjb25kYXJ5QikgcmV0dXJuIDE7XHJcblxyXG4vLyAgICAgICAvLyBJZiBib3RoIGNvbHVtbnMgYXJlIGVxdWFsXHJcbi8vICAgICAgIHJldHVybiAwO1xyXG4vLyAgIH0pO1xyXG5cclxuLy8gICAvLyBSZWF0dGFjaCBzb3J0ZWQgcm93cyB0byB0aGUgdGFibGUgYm9keVxyXG4vLyAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB0Ym9keS5hcHBlbmRDaGlsZChyb3cpKTtcclxuLy8gfVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEYXRhID0ge1xyXG4gICAgbG9hZCA6IGxvYWRGcm9tU3RvcmFnZSxcclxuICAgIGxvYWRGdW5kcyA6IGxvYWRGdW5kcyxcclxuICAgIHNvcnQgOiBmdW5jdGlvbihjb2xBLCBjb2xCKSB7IHNvcnQoY29sQSwgY29sQikgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhOyIsIi8vIEhlbHBlciBmdW5jdGlvbnMgJiBjb25zdGFudHNcclxuXHJcbi8vIG9iamVjdCB0byBob2xkIGFsbCBjdXJyZW50IGZpbHRlciBzdGF0dXNlc1xyXG5jb25zdCBmaWx0ZXJTZXR0aW5ncyA9IHtcclxuICAgICdhcHByb3AtbmFtZSc6ICcnLFxyXG4gICAgJ2NjLW5hbWUnOiAnJyxcclxuICAgICdvYmplY3QtbmFtZSc6ICcnLFxyXG4gICAgJ29iamVjdC1jYXRlZ29yeSc6ICcnXHJcbn07XHJcblxyXG4vLyBoZWxwZXIgZnVuY3Rpb24gdG8gZmlsdGVyIGRhdGEgYmFzZWQgb24gYWxsIGZpbHRlcnNcclxuZnVuY3Rpb24gZmlsdGVyRGF0YSgpIHtcclxuICAgIC8vIEdldCBhbGwgcm93cyBpbiB0aGUgdGFibGVcclxuICAgIGNvbnN0IHJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjbWFpbi10YWJsZSB0Ym9keSB0cicpO1xyXG4gICAgXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCByb3cgYW5kIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgaGlkZGVuIG9yIHNob3duXHJcbiAgICByb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBsZXQgaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDaGVjayBlYWNoIGZpbHRlciBzZXR0aW5nIGFnYWluc3QgdGhlIHJvdydzIGNlbGxzXHJcbiAgICAgICAgZm9yIChjb25zdCBbZmlsdGVySWQsIGZpbHRlclZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXJTZXR0aW5ncykpIHtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtmaWx0ZXJJZH1gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG9ubHkgc2hvdyByb3cgaWYgdmFsdWVzIHBhc3MgdGhyb3VnaCBhbGwgZmlsdGVycyBcclxuICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlICYmIGNlbGwgJiYgKGNlbGwudGV4dENvbnRlbnQudHJpbSgpICE9PSBmaWx0ZXJWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTaG93IG9yIGhpZGUgdGhlIHJvdyBiYXNlZCBvbiB2aXNpYmlsaXR5XHJcbiAgICAgICAgcm93LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsICFpc1Zpc2libGUpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IEZpbHRlciA9IHtcclxuICAgIGh0bWwoZmlsdGVyTGFiZWwsIGZpbHRlckNsYXNzKSB7XHJcbiAgICAgICAgLy8gYmFzaWMgaHRtbCB3aXRoIG9ubHkgJ0FsbCcgb3B0aW9uXHJcbiAgICAgICAgcmV0dXJuIGA8bGFiZWwgZm9yPVwiZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9XCI+RmlsdGVyIGJ5ICR7ZmlsdGVyTGFiZWx9OjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9XCIgY2xhc3M9XCJmaWx0ZXItZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5gXHJcbiAgICB9LFxyXG5cclxuICAgIGFkZE9wdGlvbihmaWx0ZXJDbGFzcywgb3B0aW9uKSB7XHJcbiAgICAgICAgLy8gQWRkIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBkcm9wZG93biBmb3IgdGhlIGZpbHRlclxyXG4gICAgICAgIGNvbnN0IGZpbHRlck9iaiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNmaWx0ZXItJHtmaWx0ZXJDbGFzc31gKTtcclxuICAgICAgICBjb25zdCBvcHRpb25PYmogPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcclxuICAgICAgICBvcHRpb25PYmoudmFsdWUgPSBvcHRpb247XHJcbiAgICAgICAgb3B0aW9uT2JqLnRleHRDb250ZW50ID0gb3B0aW9uO1xyXG4gICAgICAgIGZpbHRlck9iai5hcHBlbmRDaGlsZChvcHRpb25PYmopO1xyXG4gICAgfSxcclxuXHJcbiAgICBhZGQoZmlsdGVyTGFiZWwsIGZpbHRlckNsYXNzKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIGEgZGl2IHRvIGNvbnRhaW4gdGhlIGh0bWwgYW5kIGluc2VydCBpbnNpZGUgZmlsdGVyLWNvbnRhaW5lclxyXG4gICAgICAgIGNvbnN0IGZpbHRlckNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItY29udGFpbmVyJyk7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZmlsdGVyRGl2LmlubmVySFRNTCA9IHRoaXMuaHRtbChmaWx0ZXJMYWJlbCwgZmlsdGVyQ2xhc3MpO1xyXG4gICAgICAgIGZpbHRlckNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpO1xyXG4gICAgICAgIC8vIGFkZCBhbGwgcmVsZXZhbnQgb3B0aW9ucyBmcm9tIHRoYXQgY29sdW1uIGluIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuYWRkQWxsT3B0aW9ucyhmaWx0ZXJDbGFzcyk7XHJcbiAgICAgICAgLy8gQmluZCBjaGFuZ2UgZXZlbnQgdG8gdGhlIHNlbGVjdCBlbGVtZW50XHJcbiAgICAgICAgZmlsdGVyRGl2LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXItZHJvcGRvd24nKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgc2V0dGluZ3NcclxuICAgICAgICAgICAgZmlsdGVyU2V0dGluZ3NbZmlsdGVyQ2xhc3NdID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAvLyBBcHBseSBhbGwgZmlsdGVyc1xyXG4gICAgICAgICAgICBmaWx0ZXJEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGFkZEFsbE9wdGlvbnMoZmlsdGVyQ2xhc3MpIHtcclxuICAgICAgICAvLyBnZXQgbWF0Y2hpbmcgY29sdW1uIGZyb20gdGFibGVcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjbWFpbi10YWJsZSB0ZC4ke2ZpbHRlckNsYXNzfWApO1xyXG5cclxuICAgICAgICAvLyBVc2UgYSBTZXQgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcyBpbiB0aGUgY29sdW1uIG9mIGludGVyZXN0XHJcbiAgICAgICAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgTm9kZUxpc3QgdG8gZ2V0IHRoZSB1bmlxdWUgdmFsdWVzXHJcbiAgICAgICAgY29sdW1uLmZvckVhY2godGQgPT4ge1xyXG4gICAgICAgICAgICAvLyBBZGQgZWFjaCB0ZXh0Q29udGVudCB0byB0aGUgU2V0XHJcbiAgICAgICAgICAgIHVuaXF1ZVZhbHVlcy5hZGQodGQudGV4dENvbnRlbnQudHJpbSgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBhZGQgYWxsIHZhbHVlcyBhcyBvcHRpb25zIHRvIHRoZSBmaWx0ZXIgZHJvcGRvd25cclxuICAgICAgICB1bmlxdWVWYWx1ZXMuZm9yRWFjaChvcHRpb24gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE9wdGlvbihmaWx0ZXJDbGFzcywgb3B0aW9uKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZGVsZXRlQWxsKCl7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbHRlci1jb250YWluZXInKS5pbm5lckhUTUwgPSAnJztcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlT3B0aW9ucyhmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlck9iaiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNmaWx0ZXItJHtmaWx0ZXJDbGFzc31gKTtcclxuICAgICAgICBpZiAoZmlsdGVyT2JqKSB7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIGFsbCBleGlzdGluZyBvcHRpb25zIGV4Y2VwdCBmb3IgdGhlIGRlZmF1bHQgJ0FsbCcgb3B0aW9uXHJcbiAgICAgICAgICAgIGZpbHRlck9iai5vcHRpb25zLmxlbmd0aCA9IDE7XHJcbiAgICAgICAgICAgIC8vIEFkZCBuZXcgb3B0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLmFkZEFsbE9wdGlvbnMoZmlsdGVyQ2xhc3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyOyIsIi8vIHRoZSBHb2xkIEJvb2sgY29udGFpbnMgYSBsb29rdXAgdGFibGUgZm9yIGVhY2ggam9iIGNvZGUsIHdoaWNoIG1hcHMgdG8gdGhlIEJVLCB0aGUgam9iIHRpdGxlLCBhbmQgdGhlIGZyaW5nZSByYXRlXHJcblxyXG5jb25zdCBHb2xkQm9vayA9IHtcclxuICAgIGluaXQoc2hlZXQpIHtcclxuICAgICAgICAvLyBDb252ZXJ0IHNoZWV0IHRvIEpTT04sIHdpdGggbm8gYXV0b21hdGljIGhlYWRlciByb3cgcGFyc2luZ1xyXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxLCBkZWZ2YWw6ICcnIH0pO1xyXG5cclxuICAgICAgICAvLyBBc3N1bWluZyBoZWFkZXIgaXMgdGhlIHNlY29uZCByb3cgKGluZGV4IDEpLCBhbmQgZGF0YSBzdGFydHMgYXQgdGhlIHRoaXJkIHJvdyAoaW5kZXggMilcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gcmF3RGF0YVsxXTtcclxuICAgICAgICBjb25zdCBkYXRhID0gcmF3RGF0YS5zbGljZSgyKTsgXHJcblxyXG4gICAgICAgIC8vIFN0b3JlIGhlYWRlcnMgYW5kIGRhdGEgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2dvbGRib29rX2hlYWRlcnMnLCBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2dvbGRib29rX2RhdGEnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGZldGNoKCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdnb2xkYm9va19oZWFkZXJzJykpO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdnb2xkYm9va19kYXRhJykpO1xyXG4gICAgICAgIHJldHVybiB7IGhlYWRlcnMsIGRhdGEgfTtcclxuICAgIH0sXHJcblxyXG4gICAgZmV0Y2hCeUNvZGUoam9iX2NvZGUpIHtcclxuICAgICAgICBjb25zdCB7IGhlYWRlcnMsIGRhdGEgfSA9IHRoaXMuZmV0Y2goKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWFwIG9mIGNvbHVtbiBuYW1lcyB0byB0aGVpciByZXNwZWN0aXZlIGluZGljZXNcclxuICAgICAgICBjb25zdCBoZWFkZXJNYXAgPSBoZWFkZXJzLnJlZHVjZSgoYWNjLCBoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGFjY1toZWFkZXJdID0gaW5kZXg7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSwge30pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIocm93ID0+IHJvd1toZWFkZXJNYXBbJ0pvYiBDb2RlJ11dID09IGpvYl9jb2RlKTtcclxuICAgIH0sXHJcblxyXG4gICAgXHJcbiAgICBnZXRIZWFkZXJJWChoZWFkZXJfbmFtZSl7XHJcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSB0aGlzLmZldGNoKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck1hcCA9IGhlYWRlcnMucmVkdWNlKChhY2MsIGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBhY2NbaGVhZGVyXSA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIHt9KTtcclxuICAgICAgICByZXR1cm4gaGVhZGVyTWFwW2hlYWRlcl9uYW1lXTtcclxuICAgIH0sXHJcblxyXG4gICAgbG9va3VwQnlKb2JDb2RlKGpvYl9jb2RlLCBoZWFkZXJfbmFtZSl7XHJcbiAgICAgICAgY29uc3QgY29kZURhdGEgPSB0aGlzLmZldGNoQnlDb2RlKGpvYl9jb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKGNvZGVEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvZGVEYXRhWzBdW3RoaXMuZ2V0SGVhZGVySVgoaGVhZGVyX25hbWUpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFRpdGxlKGpvYl9jb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQnlKb2JDb2RlKGpvYl9jb2RlLCAnSm9iIERlc2NyaXB0aW9uJyk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBnZXRGcmluZ2VSYXRlKGpvYl9jb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5sb29rdXBCeUpvYkNvZGUoam9iX2NvZGUsICdGcmluZ2UgUmF0ZScpKTtcclxuICAgIH0sXHJcblxyXG4gICAgY29kZUV4aXN0cyhqb2JfY29kZSl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hCeUNvZGUoam9iX2NvZGUpLmxlbmd0aCA+IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIG1ldGhvZCB0byBhZGQgR29sZEJvb2sgZGF0YSBhcyBhIG5ldyBzaGVldCB0byB0aGUgd29ya2Jvb2tcclxuICAgIHhsc3goKSB7XHJcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzLCBkYXRhIH0gPSB0aGlzLmZldGNoKCk7XHJcblxyXG4gICAgICAgIC8vIENvbWJpbmUgaGVhZGVycyBhbmQgZGF0YSBpbnRvIG9uZSBhcnJheVxyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGF0YSA9IFtoZWFkZXJzXS5jb25jYXQoZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIHdvcmtzaGVldFxyXG4gICAgICAgIHJldHVybiBYTFNYLnV0aWxzLmFvYV90b19zaGVldChjb21iaW5lZERhdGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgR29sZEJvb2s7IiwiXHJcblxyXG5pbXBvcnQgeyBTSEVFVFMsIFRBUkdFVF9DRUxMX0FERFJFU1MsIEZJU0NBTF9ZRUFSIH0gZnJvbSAnLi4vY29uc3RhbnRzLyc7XHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSAnLi4vbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuaW1wb3J0IHsgcmVtb3ZlTmV3TGluZXMgfSBmcm9tICcuL2NvbW1vbl91dGlscy5qcyc7XHJcbmltcG9ydCBCYXNlbGluZSBmcm9tICcuLi9tb2RlbHMvYmFzZWxpbmUuanMnO1xyXG5pbXBvcnQgU2VydmljZXMgZnJvbSAnLi4vbW9kZWxzL3NlcnZpY2VzLmpzJztcclxuaW1wb3J0IEdvbGRCb29rIGZyb20gJy4uL21vZGVscy9nb2xkX2Jvb2suanMnO1xyXG5cclxuXHJcbi8vIEhlbHBlciBmdW5jdGlvbnNcclxuXHJcbi8qKlxyXG4gKiBEZWxldGVzIHRoZSB0b3Agcm93cyB1bnRpbCBhIHJvdyBjb250YWluaW5nIGNvbXBsZXRlIGRhdGEgaXMgZm91bmQuXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgLSBUaGUgcmF3IGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHNoZWV0LlxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IC0gVGhlIGNsZWFuZWQgZGF0YSB3aXRoIGluY29tcGxldGUgdG9wIHJvd3MgcmVtb3ZlZC5cclxuICovXHJcbmZ1bmN0aW9uIGRlbGV0ZVRvcFJvd3NVbnRpbEZ1bGxEYXRhKGRhdGEpIHtcclxuICAgIGxldCBmdWxsRGF0YVJvd0ZvdW5kID0gZmFsc2U7XHJcblxyXG4gICAgd2hpbGUgKCFmdWxsRGF0YVJvd0ZvdW5kICYmIGRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGRhdGFbMF07IC8vIEdldCB0aGUgdG9wIHJvd1xyXG4gICAgICAgIGxldCBoYXNBbGxEYXRhID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xyXG4gICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsIHx8IGNlbGwgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNBbGxEYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhhc0FsbERhdGEgJiYgcm93Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgZnVsbERhdGFSb3dGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0b3Agcm93IGlmIGl0J3Mgbm90IHRoZSBoZWFkZXIgcm93XHJcbiAgICAgICAgICAgIGRhdGEuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZWFkcyB0aGUgd29ya2Jvb2sgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgYnVmZmVyLlxyXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciAtIFRoZSBhcnJheSBidWZmZXIgY29udGFpbmluZyB0aGUgd29ya2Jvb2sgZGF0YS5cclxuICogQHJldHVybnMge09iamVjdH0gLSBUaGUgcGFyc2VkIHdvcmtib29rLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVhZFdvcmtib29rKGFycmF5QnVmZmVyKSB7XHJcbiAgICByZXR1cm4gWExTWC5yZWFkKGFycmF5QnVmZmVyLCB7IHR5cGU6ICdhcnJheScgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9jZXNzZXMgc2hlZXRzIHRvIGJlIHNwbGl0IGJ5IGZ1bmQgYW5kIHNhdmVzIHRoZSByZWxldmFudCBkYXRhLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2hlZXROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNoZWV0IGJlaW5nIHByb2Nlc3NlZC5cclxuICogQHBhcmFtIHtPYmplY3R9IHNoZWV0IC0gVGhlIHNoZWV0IG9iamVjdCBmcm9tIHRoZSB3b3JrYm9vay5cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NTaGVldChzaGVldE5hbWUsIHNoZWV0KSB7XHJcbiAgICAvLyBSZWFkIGluIHNoZWV0c1xyXG4gICAgY29uc3QgcmF3RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycgfSk7XHJcbiAgICBcclxuICAgIC8vIENsZWFuIHRoZSBkYXRhIGJ5IHJlbW92aW5nIHRvcCByb3dzIHdpdGggaW5jb21wbGV0ZSBkYXRhXHJcbiAgICBjb25zdCBkYXRhUm93cyA9IGRlbGV0ZVRvcFJvd3NVbnRpbEZ1bGxEYXRhKHJhd0RhdGEpO1xyXG5cclxuICAgIC8vIEdldCBuZXcgaGVhZGVyc1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGRhdGFSb3dzWzBdO1xyXG4gICAgY29uc3QgZnVuZEluZGV4ID0gaGVhZGVycy5pbmRleE9mKCdGdW5kJyk7XHJcbiAgICBpZiAoZnVuZEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vICdGdW5kJyBjb2x1bW4gZm91bmQgaW4gc2hlZXQgJHtzaGVldE5hbWV9YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNhdmUgYSBkaWN0aW9uYXJ5IG9mIGRhdGEgZm9yIGVhY2ggZnVuZCBmb3IgZWFjaCBzaGVldFxyXG4gICAgY29uc3QgZnVuZERhdGEgPSB7fTtcclxuXHJcbiAgICBkYXRhUm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgY29uc3QgZnVuZCA9IHJvd1tmdW5kSW5kZXhdO1xyXG4gICAgICAgIGlmKGZ1bmQgJiYgZnVuZCAhPT0gXCJGdW5kXCIpe1xyXG4gICAgICAgICAgICBpZiAoIWZ1bmREYXRhW2Z1bmRdKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5kRGF0YVtmdW5kXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcclxuICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhW3JlbW92ZU5ld0xpbmVzKGhlYWRlcildID0gcm93W2luZGV4XTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGZ1bmREYXRhW2Z1bmRdLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2F2ZSBmdW5kIG51bWJlciBhbmQgbmFtZSBhcyB3ZSBnbyBhbG9uZ1xyXG4gICAgRnVuZExvb2t1cFRhYmxlLnVwZGF0ZShmdW5kRGF0YSk7ICAgXHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRpbmcgZnVuZCBsb29rdXAgdGFibGUnKTsgICAgICAgXHJcblxyXG4gICAgT2JqZWN0LmtleXMoZnVuZERhdGEpLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7U0hFRVRTW3NoZWV0TmFtZV19XyR7ZnVuZH1gO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZnVuZERhdGFbZnVuZF0pKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHRoZSAnRHJvcC1Eb3duIE1lbnVzJyBzaGVldCB0byBleHRyYWN0IHNlcnZpY2VzIGRhdGEuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRHJvcERvd25NZW51c1NoZWV0KHNoZWV0KSB7XHJcbiAgICBjb25zdCBzaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gc2hlZXREYXRhWzBdO1xyXG4gICAgY29uc3Qgc2VydmljZXNJbmRleCA9IGhlYWRlclJvdy5pbmRleE9mKCdTZXJ2aWNlcycpO1xyXG5cclxuICAgIC8vIHNhdmUgZHJvcCBkb3duIG1lbnUgZm9yIGxhdGVyIGV4Y2VsIGRvd25sb2Fkc1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Ryb3Bkb3ducycsIEpTT04uc3RyaW5naWZ5KHNoZWV0RGF0YSkpO1xyXG5cclxuICAgIGlmIChzZXJ2aWNlc0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0hlYWRlciBcIlNlcnZpY2VzXCIgbm90IGZvdW5kJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzQ29sdW1uID0gc2hlZXREYXRhLnNsaWNlKDEpLm1hcChyb3cgPT4gcm93W3NlcnZpY2VzSW5kZXhdKTtcclxuICAgICAgICBjb25zdCBjbGVhbmVkU2VydmljZXNDb2x1bW4gPSBzZXJ2aWNlc0NvbHVtbi5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT0gbnVsbCk7XHJcbiAgICAgICAgU2VydmljZXMuc2F2ZShjbGVhbmVkU2VydmljZXNDb2x1bW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHRoZSAnRGVwdCBTdW1tYXJ5JyBzaGVldCB0byBnZXQgYW5kIHNhdmUgdGhlIHRhcmdldCBmb3IgdGhlIGdlbmVyYWwgZnVuZC5cclxuICogQHBhcmFtIHtPYmplY3R9IHNoZWV0IC0gVGhlIHNoZWV0IG9iamVjdCBmcm9tIHRoZSB3b3JrYm9vay5cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NEZXB0U3VtbWFyeVNoZWV0KHNoZWV0KSB7XHJcbiAgICBpZihzaGVldFtUQVJHRVRfQ0VMTF9BRERSRVNTXSkge1xyXG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHNoZWV0W1RBUkdFVF9DRUxMX0FERFJFU1NdLnY7IC8vIEFjY2VzcyB0aGUgY2VsbCB2YWx1ZVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXJnZXQnLCBjZWxsVmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBDZWxsICR7VEFSR0VUX0NFTExfQUREUkVTU30gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgc2hlZXQgdG8gYWRkIHRvIGZ1dHVyZSBleGNlbCBkb3dubG9hZHNcclxuICAgIGNvbnN0IHNoZWV0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEgfSk7XHJcbiAgICAvLyBUT0RPOiByZW1vdmUgZXhjZXNzIGVtcHR5IHJvd3NcclxuICAgIGNvbnN0IG5ld1NoZWV0RGF0YSA9IHNoZWV0RGF0YS5tYXAocm93ID0+IHJvdy5zbGljZSgwLCAzKSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGVwdC1zdW1tYXJ5JywgSlNPTi5zdHJpbmdpZnkobmV3U2hlZXREYXRhKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9jZXNzZXMgdGhlICdGWXtGSVNDQUxfWUVBUn0gR29sZCBCb29rJyBzaGVldCB0byBpbml0aWFsaXplIHRoZSBHb2xkIEJvb2suXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzR29sZEJvb2tTaGVldChzaGVldCkge1xyXG4gICAgR29sZEJvb2suaW5pdChzaGVldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NOZXdJbml0c1NoZWV0KHNoZWV0KXtcclxuICAgIC8vIFJlYWQgaW4gc2hlZXRzXHJcbiAgICBjb25zdCByYXdEYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHNoZWV0LCB7IGhlYWRlcjogMSwgZGVmdmFsOiAnJyB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgdG9wIHJvd3Mgd2l0aCBpbmNvbXBsZXRlIGRhdGFcclxuICAgIGNvbnN0IGRhdGFSb3dzID0gZGVsZXRlVG9wUm93c1VudGlsRnVsbERhdGEocmF3RGF0YSk7XHJcblxyXG4gICAgLy8gR2V0IG5ldyBoZWFkZXJzXHJcbiAgICBjb25zdCBoZWFkZXJzID0gZGF0YVJvd3NbMF07XHJcbiAgICAvLyBmaW5hbCBkYXRhIG91dHB1dFxyXG4gICAgbGV0IGZ1bGxEYXRhID0gW11cclxuICAgIFxyXG4gICAgLy8gQ29udmVydCBkYXRhIHRvIEpTT04gZm9ybSBhbmQgZmlsdGVyIG91dCByb3dzIHdoZXJlIGZpcnN0IHZhbHVlIGlzIG1pc3NpbmdcclxuICAgIGRhdGFSb3dzLnNsaWNlKDEpLmZvckVhY2gocm93ID0+IHsgLy8gU2tpcCBoZWFkZXJzIHJvd1xyXG4gICAgICAgIC8vIHNraXAgYW55IGVtcHR5IHJvd3MgYXQgdGhlIGVuZFxyXG4gICAgICAgIGlmICgocm93WzBdICE9ICcnKSAmJiAocm93WzBdICE9ICctJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJvd0RhdGFbcmVtb3ZlTmV3TGluZXMoaGVhZGVyKV0gPSByb3dbaW5kZXhdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gb25seSBrZWVwIHN1cHBsZW1lbnRhbCBpbml0aWF0aXZlcyBcclxuICAgICAgICAgICAgaWYgKHJvd0RhdGFbJ0Jhc2VsaW5lIG9yIFN1cHBsZW1lbnRhbCddLmluY2x1ZGVzKCdTdXBwbGVtZW50YWwnKSl7XHJcbiAgICAgICAgICAgICAgICBmdWxsRGF0YS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBzYXZlIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCduZXctaW5pdHMnLCBKU09OLnN0cmluZ2lmeShmdWxsRGF0YSkpO1xyXG59XHJcblxyXG4vLyBNYWluIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb2Nlc3MgdGhlIHdvcmtib29rXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzV29ya2Jvb2soYXJyYXlCdWZmZXIpIHtcclxuICAgIGNvbnN0IHdvcmtib29rID0gcmVhZFdvcmtib29rKGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICB3b3JrYm9vay5TaGVldE5hbWVzLmZvckVhY2goc2hlZXROYW1lID0+IHtcclxuICAgICAgICAvLyBPbmx5IGNvbnZlcnQgc2hlZXRzIHdlIG5lZWQ7IHRyZWF0IG5ldyBpbml0cyBzZXBhcmF0ZWx5IGJlY2F1c2UgdGhleSBzaG91bGRuJ3Qgc2F2ZSBieSBmdW5kXHJcbiAgICAgICAgaWYgKHNoZWV0TmFtZSA9PSBPYmplY3Qua2V5cyhTSEVFVFMpWzRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NOZXdJbml0c1NoZWV0KHNoZWV0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKFNIRUVUUykuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBwcm9jZXNzU2hlZXQoc2hlZXROYW1lLCBzaGVldCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzaGVldE5hbWUgPT09ICdEcm9wLURvd24gTWVudXMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NEcm9wRG93bk1lbnVzU2hlZXQoc2hlZXQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2hlZXROYW1lID09PSAnRGVwdCBTdW1tYXJ5Jykge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBwcm9jZXNzRGVwdFN1bW1hcnlTaGVldChzaGVldCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzaGVldE5hbWUgPT09IGBGWSR7RklTQ0FMX1lFQVJ9IEdvbGQgQm9va2ApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcclxuICAgICAgICAgICAgcHJvY2Vzc0dvbGRCb29rU2hlZXQoc2hlZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdhbGwgZXhjZWwgZGF0YSBzYXZlZCcpO1xyXG59XHJcblxyXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGFwcGVuZCBhIHNoZWV0IHRvIHRoZSB3b3JrYm9vayBpZiBkYXRhIGlzIHByZXNlbnRcclxuZnVuY3Rpb24gYXBwZW5kU2hlZXRUb1dvcmtib29rKHdvcmtib29rLCBkYXRhLCBzaGVldE5hbWUpIHtcclxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChkYXRhKTtcclxuICAgICAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCBzaGVldCwgc2hlZXROYW1lKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkWExTWCgpIHtcclxuICAgIC8vIGdyYWIgZGF0YSBmcm9tIGJhc2VsaW5lIG9iamVjdFxyXG4gICAgY29uc3QgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmUoKTtcclxuICAgIGNvbnN0IHdvcmtib29rID0gWExTWC51dGlscy5ib29rX25ldygpOyAvLyBDcmVhdGUgYSBuZXcgd29ya2Jvb2tcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIHNoZWV0IGRhdGEgYmFzZWQgb24gdGhlIG5hbWVzIG9mIGVhY2ggdGFiIGluIHRoZSBFeGNlbCBkb2NcclxuICAgIGNvbnN0IHNoZWV0RGF0YSA9IE9iamVjdC5rZXlzKFNIRUVUUykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgICAgIGFjY1trZXldID0gW107XHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuXHJcbiAgICAvLyBBZ2dyZWdhdGUgYWxsIHJvd3MgYWNyb3NzIGZ1bmRzIGFuZCBjb21iaW5lIGZvciBlYWNoIHRhYlxyXG4gICAgYmFzZWxpbmUuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICBPYmplY3Qua2V5cyhTSEVFVFMpLmZvckVhY2goc2hlZXROYW1lID0+IHtcclxuICAgICAgICAgICAgaWYgKGZ1bmRbU0hFRVRTW3NoZWV0TmFtZV1dICYmIGZ1bmRbU0hFRVRTW3NoZWV0TmFtZV1dLnRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldERhdGFbc2hlZXROYW1lXS5wdXNoKC4uLmZ1bmRbU0hFRVRTW3NoZWV0TmFtZV1dLnRhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQWRkIGluaXRpYXRpdmVzIGRhdGEgKHdoaWNoIGlzbid0IHN0b3JlZCBieSBmdW5kKVxyXG4gICAgc2hlZXREYXRhW09iamVjdC5rZXlzKFNIRUVUUylbNF1dID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbmV3LWluaXRzJykpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHRhYiBmb3IgZWFjaCB0YWJsZVxyXG4gICAgT2JqZWN0LmtleXMoc2hlZXREYXRhKS5mb3JFYWNoKHNoZWV0TmFtZSA9PiB7XHJcbiAgICAgICAgYXBwZW5kU2hlZXRUb1dvcmtib29rKHdvcmtib29rLCBzaGVldERhdGFbc2hlZXROYW1lXSwgc2hlZXROYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFkZCBhIHRhYiBmb3IgdGhlIEdvbGRCb29rXHJcbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCBHb2xkQm9vay54bHN4KCksIGBGWSR7RklTQ0FMX1lFQVJ9IEdvbGQgQm9va2ApO1xyXG5cclxuICAgIC8vIGFkZCBhIHRhYiBmb3IgdGhlIGRyb3AgZG93bnMgYW5kIGRlcHQgc3VtbWFyeSAoanVzdCB0YXJnZXRzKVxyXG4gICAgd3JpdGVKU09OdG9OZXdUYWIoJ2Ryb3Bkb3ducycsICdEcm9wLURvd24gTWVudXMnLCB3b3JrYm9vayk7IFxyXG4gICAgd3JpdGVKU09OdG9OZXdUYWIoJ2RlcHQtc3VtbWFyeScsICdEZXB0IFN1bW1hcnknLCB3b3JrYm9vayk7XHJcblxyXG4gICAgLy8gR2VuZXJhdGUgYSBkb3dubG9hZGFibGUgZmlsZVxyXG4gICAgY29uc3Qgd2JvdXQgPSBYTFNYLndyaXRlKHdvcmtib29rLCB7IGJvb2tUeXBlOiAneGxzeCcsIHR5cGU6ICdhcnJheScgfSk7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3dib3V0XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBsaW5rIGFuZCB0cmlnZ2VyIHRoZSBkb3dubG9hZFxyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBcIkZpbGxlZF9EZXRhaWxfU2hlZXQueGxzeFwiO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIGxpbmsuY2xpY2soKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlSlNPTnRvTmV3VGFiKHN0b3JhZ2Vfa2V5LCB0YWJfbmFtZSwgd29ya2Jvb2spe1xyXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZV9rZXkpKTtcclxuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gWExTWC51dGlscy5hb2FfdG9fc2hlZXQoZGF0YSk7XHJcbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCB3b3Jrc2hlZXQsIHRhYl9uYW1lKTsgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBleGNlbFNlcmlhbERhdGVUb0pTRGF0ZShzZXJpYWwpIHtcclxuXHJcbiAgICBpZiAoIXNlcmlhbCkgeyByZXR1cm4gbnVsbCB9O1xyXG4gICAgLy8gRXhjZWwgY29uc2lkZXJzIDE5MDAtMDEtMDEgYXMgZGF5IDEsIGJ1dCBKYXZhU2NyaXB0J3MgRGF0ZSBjb25zaWRlcnNcclxuICAgIC8vIDE5NzAtMDEtMDEgYXMgZGF5IDAuIFRoZXJlZm9yZSwgd2UgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXHJcbiAgICAvLyBiZXR3ZWVuIDE5MDAtMDEtMDEgYW5kIDE5NzAtMDEtMDEuXHJcbiAgICBjb25zdCBleGNlbEVwb2NoID0gbmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwgMTEsIDMwKSk7IC8vIEphdmFTY3JpcHQgQ29uc2lkZXIgRGVjZW1iZXIgbW9udGggYXMgJzExJ1xyXG4gICAgXHJcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEpTIGRhdGUgYnkgYWRkaW5nIHNlcmlhbCBkYXlzIHRvIHRoZSBlcG9jaCBkYXRlXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhjZWxFcG9jaC5nZXRUaW1lKCkgKyAoc2VyaWFsICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xyXG4gICAgXHJcbiAgICAvLyBTZXQgdGhlIHRpbWUgcGFydCB0byB6ZXJvIChtaWRuaWdodClcclxuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICBcclxuICAgIC8vIFJldHVybiB0aGUgZGF0ZSBwYXJ0IG9mIHRoZSBJU08gc3RyaW5nXHJcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XHJcbn1cclxuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Rvb2x0aXAuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9vbHRpcC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy8nO1xyXG5pbXBvcnQgQ2VsbCBmcm9tICcuLi90YWJsZS9zdWJjb21wb25lbnRzL2NlbGxzJztcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tICcuLi8uLi91dGlscy9jb21tb25fdXRpbHMnO1xyXG5pbXBvcnQgQ3VycmVudFBhZ2UgZnJvbSAnLi4vLi4vbW9kZWxzL2N1cnJlbnRfcGFnZSc7XHJcbmltcG9ydCB7IGV4Y2VsU2VyaWFsRGF0ZVRvSlNEYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvWExTWF9oYW5kbGVycyc7XHJcblxyXG5pbXBvcnQgJy4vdG9vbHRpcC5jc3MnXHJcblxyXG5mdW5jdGlvbiBoaWRlVG9vbHRpcCgpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJykuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VG9vbHRpcCgpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJykuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxufVxyXG5cclxuZnVuY3Rpb24gZWRpdFRvb2x0aXBUZXh0KG5ld1RleHQpe1xyXG4gICAgLy8gZWRpdCB0ZXh0IHRvIGRpc3BsYXkgaW5zaWRlIHRvb2x0aXBcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpO1xyXG4gICAgdG9vbHRpcC5pbm5lckhUTUwgPSBuZXdUZXh0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93QWNjb3VudFN0cmluZyhyb3cpe1xyXG4gICAgY29uc3QgYXBwcm9wID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2FwcHJvcC1uYW1lJyk7XHJcbiAgICBjb25zdCBjYyA9ICBDZWxsLmdldFRleHQocm93LCAnY2MtbmFtZScpO1xyXG4gICAgY29uc3Qgb2JqID0gIENlbGwuZ2V0VGV4dChyb3csICdvYmplY3QtbmFtZScpO1xyXG4gICAgY29uc3QgZnVuZCA9IENlbGwuZ2V0VGV4dChyb3csICdmdW5kLW5hbWUnKTtcclxuICAgIHZhciBtZXNzYWdlID0gXHJcbiAgICAgICAgYDxzdHJvbmc+RnVuZDwvc3Ryb25nPjogJHtmdW5kfTxicj5cclxuICAgICAgICA8c3Ryb25nPkFwcHJvcHJpYXRpb248L3N0cm9uZz46ICR7YXBwcm9wfTxicj5cclxuICAgICAgICA8c3Ryb25nPkNvc3QgQ2VudGVyPC9zdHJvbmc+OiAke2NjfWA7XHJcbiAgICBpZiAob2JqKSB7IG1lc3NhZ2UgKz0gYDxicj48c3Ryb25nPk9iamVjdDwvc3Ryb25nPjogJHtvYmp9YH1cclxuICAgIG1lc3NhZ2UgKz0gYDxicj4gSWYgeW91IGJlbGlldmUgdGhpcyBhY2NvdW50IHN0cmluZyBpcyBpbmNvcnJlY3QsIHBsZWFzZSBsZWF2ZSBhIGNvbW1lbnQgXHJcbiAgICAgICAgaW4gdGhlIGNvbW1lbnQgY29sdW1uLmBcclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1NhbGFyeVByb2plY3Rpb24ocm93KXtcclxuICAgIGNvbnN0IGdlbmVyYWxfaW5jcmVhc2UgPSBDZWxsLmdldFRleHQocm93LCAnZ2VuZXJhbC1pbmNyZWFzZS1yYXRlJyk7XHJcbiAgICBjb25zdCBtZXJpdF9pbmNyZWFzZSA9ICBDZWxsLmdldFRleHQocm93LCAnbWVyaXQtaW5jcmVhc2UtcmF0ZScpO1xyXG4gICAgY29uc3QgY3VycmVudF9zYWxhcnkgPSBDZWxsLmdldFZhbHVlKHJvdywgJ2N1cnJlbnQtc2FsYXJ5Jyk7XHJcbiAgICBjb25zdCBwcm9qX3NhbGFyeSA9IENlbGwuZ2V0VmFsdWUocm93LCAnYXZnLXNhbGFyeScpO1xyXG4gICAgaWYgKGN1cnJlbnRfc2FsYXJ5KXtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IGBUaGUgYXZlcmFnZSBzYWxhcnkvd2FnZSBmb3IgdGhpcyBwb3NpdGlvbiB3YXMgXHJcbiAgICAgICAgICAgICR7Zm9ybWF0Q3VycmVuY3koY3VycmVudF9zYWxhcnkpfSBhcyBvZiBTZXB0ZW1iZXIgMjAke0ZJU0NBTF9ZRUFSLTJ9LiBcclxuICAgICAgICAgICAgR2l2ZW4gYSAke2dlbmVyYWxfaW5jcmVhc2UqMTAwfSUgZ2VuZXJhbCBpbmNyZWFzZSByYXRlIGFuZCBhICR7bWVyaXRfaW5jcmVhc2UqMTAwfSUgXHJcbiAgICAgICAgICAgIG1lcml0IGluY3JlYXNlLCB0aGUgRlkke0ZJU0NBTF9ZRUFSfSBwcm9qZWN0aW9uIGZvciB0aGlzIHBvc2l0aW9uJ3MgYXZlcmFnZSBcclxuICAgICAgICAgICAgYW5udWFsIHNhbGFyeS93YWdlIGlzICR7Zm9ybWF0Q3VycmVuY3kocHJval9zYWxhcnkpfS4gVGhpcyBwcm9qZWN0aW9uIHRha2VzIGludG8gXHJcbiAgICAgICAgICAgIGFjY291bnQgdGhlIG51bWJlciBvZiB2YWNhbnQgdnMuIGZ1bGwgcG9zaXRpb25zLmA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBtZXNzYWdlID0gYFRoZSBhdmVyYWdlIHNhbGFyeS93YWdlIGZvciB0aGlzIHBvc2l0aW9uIHdhcyBcclxuICAgICAgICAgICAgdW5rbm93biBhcyBvZiBTZXB0ZW1iZXIgMjAke0ZJU0NBTF9ZRUFSLTJ9LCBvciB0aGUgcG9zaXRpb25cclxuICAgICAgICAgICAgZGlkIG5vdCBleGlzdC4gVGhlIEZZJHtGSVNDQUxfWUVBUn0gcHJvamVjdGlvbiBmb3IgdGhpcyBwb3NpdGlvbidzIFxyXG4gICAgICAgICAgICBhdmVyYWdlIGFubnVhbCBzYWxhcnkvd2FnZSBpcyAke2Zvcm1hdEN1cnJlbmN5KHByb2pfc2FsYXJ5KX0uYFxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ZpbmFsUGVyc29ubmVsQ29zdChyb3cpe1xyXG4gICAgY29uc3QgcHJval9zYWxhcnkgPSBDZWxsLmdldFZhbHVlKHJvdywgJ2F2Zy1zYWxhcnknKTtcclxuICAgIGNvbnN0IGZ0ZXMgPSBDZWxsLmdldFRleHQocm93LCAnYmFzZWxpbmUtZnRlcycpO1xyXG4gICAgY29uc3QgZnJpbmdlID0gcGFyc2VGbG9hdChDZWxsLmdldFRleHQocm93LCAnZnJpbmdlJykpO1xyXG4gICAgY29uc3QgYXZnX2JlbmVmaXRzID0gcHJval9zYWxhcnkgKiBmcmluZ2U7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gYFRoZSB0b3RhbCBjb3N0IGNhcHR1cmVzICR7ZnRlc30gcG9zaXRpb24ocykgYXRcclxuICAgICAgICAgICAgICAgICAgICBhbiBhbm51YWwgc2FsYXJ5L3dhZ2Ugb2YgJHtmb3JtYXRDdXJyZW5jeShwcm9qX3NhbGFyeSl9LCBcclxuICAgICAgICAgICAgICAgICAgICBwbHVzIGZyaW5nZSBiZW5lZml0cyB0aGF0IGNvc3QgJHtmb3JtYXRDdXJyZW5jeShhdmdfYmVuZWZpdHMpfSBcclxuICAgICAgICAgICAgICAgICAgICBwZXIgcG9zaXRpb24gcGVyIHllYXIsIG9uIGF2ZXJhZ2UuYFxyXG4gICAgZWRpdFRvb2x0aXBUZXh0KG1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93RklDQShyb3cpe1xyXG4gICAgY29uc3QgZmljYSA9IHBhcnNlRmxvYXQoQ2VsbC5nZXRUZXh0KHJvdywgJ2ZpY2EnKSk7XHJcbiAgICBjb25zdCBmaWNhUGVyY2VudGFnZSA9IChmaWNhICogMTAwKS50b0ZpeGVkKDIpO1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBUaGlzIHRvdGFsIGlzIG92ZXJ0aW1lIC8gaG9saWRheSAvIHNoaWZ0IHByZW1pdW0gcGF5LCBwbHVzIEZJQ0EgKHBheXJvbGwgdGF4KSwgXHJcbiAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzICR7ZmljYVBlcmNlbnRhZ2V9JSBmb3IgdGhpcyBjb3N0IGNlbnRlci5gXHJcbiAgICBlZGl0VG9vbHRpcFRleHQobWVzc2FnZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dDUEEocm93KXtcclxuICAgIGNvbnN0IGNwYSA9IHBhcnNlRmxvYXQoQ2VsbC5nZXRUZXh0KHJvdywgJ2NwYScpKTtcclxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2NwYS1kZXNjcmlwdGlvbicpO1xyXG4gICAgY29uc3QgdmVuZG9yID0gQ2VsbC5nZXRUZXh0KHJvdywgJ3ZlbmRvcicpO1xyXG4gICAgdmFyIGNvbnRyYWN0X2VuZCA9IENlbGwuZ2V0VGV4dChyb3csICdjb250cmFjdC1lbmQnKTtcclxuICAgIC8vIGNvbnZlcnQgdG8gbm9ybWFsIGRhdGUgZm9ybWF0IGZyb20gZXhjZWwgXHJcbiAgICBjb250cmFjdF9lbmQgPSBleGNlbFNlcmlhbERhdGVUb0pTRGF0ZShjb250cmFjdF9lbmQpO1xyXG4gICAgY29uc3QgcmVtYWluaW5nID0gQ2VsbC5nZXRWYWx1ZShyb3csICdyZW1haW5pbmcnKTtcclxuICAgIGlmIChjcGEpIHtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IGA8c3Ryb25nPkNQQSAjJHtjcGF9PC9zdHJvbmc+YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBgTm8gQ1BBYDtcclxuICAgIH1cclxuICAgIGlmICh2ZW5kb3IpIHttZXNzYWdlICs9IGA8YnI+PHN0cm9uZz5WZW5kb3I8L3N0cm9uZz46ICR7dmVuZG9yfWB9O1xyXG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz46ICR7ZGVzY3JpcHRpb259YH07XHJcbiAgICBpZiAoY29udHJhY3RfZW5kKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+Q29udHJhY3QgRW5kIERhdGU8L3N0cm9uZz46ICR7Y29udHJhY3RfZW5kfWB9XHJcbiAgICBpZiAocmVtYWluaW5nKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+QW1vdW50IFJlbWFpbmluZyBvbiBDb250cmFjdDwvc3Ryb25nPjogJHtmb3JtYXRDdXJyZW5jeShyZW1haW5pbmcpfWB9XHJcblxyXG4gICAgZWRpdFRvb2x0aXBUZXh0KG1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsaW5rKGVsZW1lbnQsIGRpc3BsYXlGbikge1xyXG5cclxuICAgIC8vIGFkZCBjbGFzcyB0byBzaG93IGNlbGwgd2l0aCBhbiB1bmRlcmxpbmUsIGV0Y1xyXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwLWNlbGwnKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW5kIGFwcGVuZCAoZGV0YWlsKVxyXG4gICAgY29uc3QgZGV0YWlsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgZGV0YWlsLmNsYXNzTGlzdC5hZGQoJ2RldGFpbCcpO1xyXG4gICAgZGV0YWlsLnRleHRDb250ZW50ID0gJyhkZXRhaWwpJztcclxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZGV0YWlsKTtcclxuXHJcbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXIgdG8gc2hvdyB0b29sdGlwIG9uIG1vdXNlb3ZlclxyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xyXG4gICAgICAgIGRpc3BsYXlGbihyb3cpO1xyXG4gICAgICAgIHNob3dUb29sdGlwKCk7XHJcbiAgICB9KTtcclxuICAgIC8vIGFuZCBoaWRlIHdoZW4gbW91c2UgbW92ZXMgb2ZmXHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGhpZGVUb29sdGlwKCk7XHJcbiAgICB9KTtcclxuICAgIC8vIFVwZGF0ZSB0b29sdGlwIHBvc2l0aW9uIG9uIG1vdXNlIG1vdmVcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJyk7XHJcbiAgICAgICAgdG9vbHRpcC5zdHlsZS50b3AgPSAoZXZlbnQuY2xpZW50WSArIDEwKSArICdweCc7XHJcbiAgICAgICAgdG9vbHRpcC5zdHlsZS5sZWZ0ID0gKGV2ZW50LmNsaWVudFggKyAxMCkgKyAncHgnO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbmtBY2NvdW50U3RyaW5nQ29sKCkge1xyXG4gICAgLy8gZ2V0IGFsbCByZWxldmFudCBjZWxsc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQuYWNjb3VudC1zdHJpbmcnKS5mb3JFYWNoKCAoY2VsbCkgPT4ge1xyXG4gICAgICAgIGxpbmsoY2VsbCwgc2hvd0FjY291bnRTdHJpbmcpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1NhbGFyeUNvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLmF2Zy1zYWxhcnknKS5mb3JFYWNoKCAoY2VsbCkgPT4ge1xyXG4gICAgICAgIGxpbmsoY2VsbCwgc2hvd1NhbGFyeVByb2plY3Rpb24pO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1RvdGFsUGVyc29ubmVsQ29zdENvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnRvdGFsLWJhc2VsaW5lJykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dGaW5hbFBlcnNvbm5lbENvc3QpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1RvdGFsT1RDb2woKSB7XHJcbiAgICAvLyBnZXQgYWxsIHJlbGV2YW50IGNlbGxzXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZC50b3RhbCcpLmZvckVhY2goIChjZWxsKSA9PiB7XHJcbiAgICAgICAgbGluayhjZWxsLCBzaG93RklDQSk7XHJcbiAgICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBsaW5rQ1BBQ29sKCkge1xyXG4gICAgLy8gZ2V0IGFsbCByZWxldmFudCBjZWxsc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQuY3BhJykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dDUEEpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRvb2x0aXAgPSB7XHJcblxyXG4gICAgaGlkZSA6IGhpZGVUb29sdGlwLFxyXG4gICAgc2hvdyA6IHNob3dUb29sdGlwLFxyXG5cclxuICAgIGxpbmtBbGwgOiAoKSA9PiB7XHJcbiAgICAgICAgbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICBzd2l0Y2goQ3VycmVudFBhZ2UubG9hZCgpKXtcclxuICAgICAgICAgICAgY2FzZSAncGVyc29ubmVsJyA6XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua1NhbGFyeUNvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua1RvdGFsUGVyc29ubmVsQ29zdENvbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ292ZXJ0aW1lJzpcclxuICAgICAgICAgICAgICAgIGxpbmtUb3RhbE9UQ29sKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ25vbnBlcnNvbm5lbCc6XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua0NQQUNvbCgpOyAgXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSAncmV2ZW51ZSc6XHJcbiAgICAgICAgICAgIC8vICAgICBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgJ25ldy1pbml0cyc6XHJcbiAgICAgICAgICAgIC8vICAgICBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICB1bmxpbmsgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgZGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXRhaWwnKTtcclxuICAgICAgICBkZXRhaWxzLmZvckVhY2goIChzcGFuKSA9PiB7XHJcbiAgICAgICAgICAgIHNwYW4ucmVtb3ZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcCIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpTT04oanNvbkZpbGVQYXRoKSB7XHJcbiAgcmV0dXJuIGZldGNoKGpzb25GaWxlUGF0aClcclxuICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvSlNPTih0YWJsZSwgY29sc1RvUmVtb3ZlID0gW10pe1xyXG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3M7XHJcbiAgICAvLyBFeHRyYWN0IGhlYWRlcnMgZnJvbSB0aGUgZmlyc3Qgcm93XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSByb3dzWzBdLmNlbGxzO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWFkZXJSb3cubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBoZWFkZXJzLnB1c2goaGVhZGVyUm93W2pdLmlubmVyVGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBkYXRhXHJcbiAgICB2YXIgdGFibGVEYXRhID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29scyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xzVG9SZW1vdmUuaW5jbHVkZXMoaGVhZGVyKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sc1tpbmRleF0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3N0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2hlYWRlcl0gPSBjb2xzW2luZGV4XS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbaGVhZGVyXSA9IGNvbHNbaW5kZXhdLmlubmVyVGV4dDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGFibGVEYXRhLnB1c2gocm93RGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGFibGVEYXRhKTtcclxufVxyXG5cclxuXHJcbiAgIiwiaW1wb3J0ICcuL3RhYmxlLmNzcyc7XHJcblxyXG5pbXBvcnQgQnV0dG9ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcydcclxuaW1wb3J0IENlbGwgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NlbGxzLmpzJ1xyXG5pbXBvcnQgQ29sdW1ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvY29sdW1ucy5qcydcclxuaW1wb3J0IEhlYWRlciBmcm9tICcuL3N1YmNvbXBvbmVudHMvaGVhZGVycy5qcydcclxuaW1wb3J0IFJvd3MgZnJvbSAnLi9zdWJjb21wb25lbnRzL3Jvd3MuanMnXHJcbmltcG9ydCBEYXRhIGZyb20gJy4vc3ViY29tcG9uZW50cy9kYXRhLmpzJ1xyXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4vc3ViY29tcG9uZW50cy9maWx0ZXJzLmpzJztcclxuXHJcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5qcyc7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0pTT04gfSBmcm9tIFwiLi4vLi4vdXRpbHMvSlNPTl9kYXRhX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XHJcbmltcG9ydCBDdXJyZW50RnVuZCBmcm9tICcuLi8uLi9tb2RlbHMvY3VycmVudF9mdW5kLmpzJztcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4uLy4uL21vZGVscy9jdXJyZW50X3BhZ2UuanMnO1xyXG5cclxuZnVuY3Rpb24gYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3Qpe1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgdGFibGUuc3R5bGUud2lkdGggPSB3aWR0aF9wY3Q7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dUYWJsZSgpe1xyXG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFibGUtY29udGFpbmVyJyk7XHJcbiAgICB0YWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBUYWJsZS5odG1sO1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgdGFibGUuc3R5bGUuZGlzcGxheSA9ICd0YWJsZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVUYWJsZSgpe1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0YWJsZSBvYmplY3QgZnJvbSB0YWJsZSBjb250YWluZXJcclxuICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYmxlLWNvbnRhaW5lcicpO1xyXG4gICAgdGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBCdXR0b25zLkFkZFJvdy5oaWRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhdmVUYWJsZURhdGEoKSB7XHJcbiAgICAvLyByZW1vdmUgdGhlIGRldGFpbCB0ZXh0XHJcbiAgICBUb29sdGlwLnVubGluaygpO1xyXG4gICAgLy8gZ2V0IHRhYmxlXHJcbiAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgLy8gZGV0ZXJtaW5lIHNhdmVfYXMgbmFtZVxyXG4gICAgaWYgKEN1cnJlbnRGdW5kLm51bWJlcigpKSB7XHJcbiAgICAgICAgdmFyIHNhdmVfYXMgPSBgJHtDdXJyZW50UGFnZS5sb2FkKCl9XyR7Q3VycmVudEZ1bmQubnVtYmVyKCl9YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIHNhdmVfYXMgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzYXZlX2FzLCBjb252ZXJ0VG9KU09OKHRhYmxlLCBbJ0VkaXQnXSkpO1xyXG4gICAgLy8gdXBkYXRlIHNpZGViYXIgd2l0aCBuZXcgZGF0YVxyXG4gICAgU2lkZWJhci51cGRhdGVUb3RhbHMoKTtcclxuICAgIC8vIHJlbGluaywgZGVwZW5kaW5nIG9uIHBhZ2VcclxuICAgIFRvb2x0aXAubGlua0FsbCgpO1xyXG59XHJcblxyXG5jb25zdCBUYWJsZSA9IHtcclxuICAgIGh0bWwgOiBgXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgbXQtMyBkaXNwbGF5XCIgaWQ9XCJtYWluLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBjbGFzcz1cInRoZWFkLWRhcmtcIj48L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHk+PC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPmAsXHJcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcclxuICAgIENlbGwgOiBDZWxsLFxyXG4gICAgQ29sdW1ucyA6IENvbHVtbnMsXHJcbiAgICBIZWFkZXIgOiBIZWFkZXIsXHJcbiAgICBSb3dzIDogUm93cyxcclxuICAgIERhdGEgOiBEYXRhLFxyXG4gICAgRmlsdGVyIDogRmlsdGVyLFxyXG4gICAgLy8gZnVuY3Rpb25zXHJcbiAgICBhZGp1c3RXaWR0aCA6IGZ1bmN0aW9uKHdpZHRoX3BjdCl7XHJcbiAgICAgICAgYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3QpXHJcbiAgICB9LFxyXG4gICAgY2xlYXIgOiBoaWRlVGFibGUsXHJcbiAgICBoaWRlIDogaGlkZVRhYmxlLFxyXG4gICAgc2hvdyA6IHNob3dUYWJsZSxcclxuICAgIHNhdmUgOiBzYXZlVGFibGVEYXRhXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhYmxlOyIsImltcG9ydCAnLi9hY2NvcmRpb24uY3NzJ1xyXG5cclxuXHJcbmltcG9ydCB7QmFzZWxpbmUsIEN1cnJlbnRGdW5kLCBGdW5kLCBTdXBwbGVtZW50YWwsIEZ1bmRMb29rdXBUYWJsZX0gZnJvbSAnLi4vLi4vbW9kZWxzJ1xyXG5pbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSwgY2xlYW5TdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlld19sb2dpYy5qcyc7XHJcblxyXG5mdW5jdGlvbiByZWRpcmVjdEZvckVkaXQoKXtcclxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZ2ApO1xyXG4gICAgY29uc3QgdGFibGUgPSByb3cucGFyZW50RWxlbWVudDtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0YWJsZS5jbG9zZXN0KCcuc3VtbWFyeS1jb250YWluZXInKTtcclxuICAgIC8vIG5ldyBpbml0aWF0aXZlIGVkaXRzIHNob3VsZCBhbGwgcmVkaXJlY3QgdG8gdGhlIG5ldy1pbml0cyBwYWdlXHJcbiAgICBpZiAoc2VjdGlvbi5pZCA9PSAnc3VwcC1hY2NvcmRpb24nKXtcclxuICAgICAgICB2aXNpdFBhZ2UoJ25ldy1pbml0cycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gU3BsaXQgdGhlIHN0cmluZyBpbnRvIHBhcnRzIHVzaW5nICctJyBhcyB0aGUgZGVsaW1pdGVyOyByZXRhaW4gZnVuZCBhcyAxc3QgbnVtZXJpYyBzZWdtZW50XHJcbiAgICAgICAgY29uc3QgZnVuZCA9IHRhYmxlLmlkLnNwbGl0KCctJylbMV1cclxuICAgICAgICBcclxuICAgICAgICBDdXJyZW50RnVuZC51cGRhdGUoZnVuZCk7XHJcbiAgICAgICAgY29uc3QgbGluZUl0ZW0gPSByb3cucXVlcnlTZWxlY3RvcignLmxpbmUtaXRlbScpLnRleHRDb250ZW50O1xyXG4gICAgICAgIC8vIHZpc2l0IHRoZSBjb3JyZWN0IHBhZ2UgZm9yIGVkaXRpbmdcclxuICAgICAgICBzd2l0Y2gobGluZUl0ZW0pe1xyXG4gICAgICAgICAgICBjYXNlICdQZXJzb25uZWwgRXhwZW5kaXR1cmVzJzpcclxuICAgICAgICAgICAgICAgIHZpc2l0UGFnZSgncGVyc29ubmVsJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnTm9uLVBlcnNvbm5lbCBFeHBlbmRpdHVyZXMnOlxyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCdub25wZXJzb25uZWwnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdSZXZlbnVlcyc6XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UoJ3JldmVudWUnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdPdmVydGltZSBFeHBlbmRpdHVyZXMnOlxyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCdvdmVydGltZScpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOYW1lIG9mIGxpbmUgaXRlbSBpbiB0YWJsZSBkb2VzIG5vdCBtYXRjaCBhIHBhZ2UgZGVzdGluYXRpb24uJylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IEV4cGVuc2VUYWJsZSA9IHtcclxuICAgIHRhYmxlX2lkIDogKGFjY291bnRfc3RyaW5nKSA9PiB7IHJldHVybiBgdGFibGUtJHthY2NvdW50X3N0cmluZ31gIH0sXHJcbiAgICBpbml0KGFjY291bnRfc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIGVtcHR5IHRhYmxlIGFuZCBwdXQgaXQgaW4gdGhlIGFjY29yZGlvblxyXG4gICAgICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XHJcbiAgICAgICAgdGFibGUuaWQgPSB0aGlzLnRhYmxlX2lkKGFjY291bnRfc3RyaW5nKTtcclxuICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKCdhY2NvcmRpb24tdGFibGUnKTtcclxuICAgICAgICB2YXIgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3N0cmluZ18ke2FjY291bnRfc3RyaW5nfV9jb250ZW50IC5hY2NvcmRpb24tYm9keWApO1xyXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0YWJsZSk7XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlTmV3Q2VsbChjb250ZW50LCByb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgIG5ld0NlbGwuaW5uZXJIVE1MID0gY29udGVudDtcclxuICAgICAgICBuZXdDZWxsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcclxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XHJcbiAgICB9LFxyXG4gICAgYWRkUm93KGFjY291bnRfc3RyaW5nLCByb3dfbmFtZSwgbnVtYmVyKXtcclxuICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhYmxlX2lkKGFjY291bnRfc3RyaW5nKSk7XHJcbiAgICAgICAgdmFyIG5ld19yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKG5ld19yb3cpO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIGNlbGwgZm9yIHRoZSBsaW5lIGl0ZW0gbGFiZWxcclxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0NlbGwocm93X25hbWUsIG5ld19yb3csICdsaW5lLWl0ZW0nKTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBjZWxsIGZvciB0aGUgYW1vdW50XHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdDZWxsKGZvcm1hdEN1cnJlbmN5KG51bWJlciksIG5ld19yb3csICdjb3N0Jyk7XHJcbiAgICAgICAgLy8gY3JlYXRlIEVkaXQgYnV0dG9uIFxyXG4gICAgICAgIHZhciBidXR0b24gPSAnJztcclxuICAgICAgICBpZiAocm93X25hbWUgIT0gJ05ldCBFeHBlbmRpdHVyZXMgKFJldmVudWVzKScpe1xyXG4gICAgICAgICAgICBidXR0b24gPSBUYWJsZS5CdXR0b25zLkVkaXQuaHRtbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdDZWxsKGJ1dHRvbiwgbmV3X3Jvdyk7XHJcbiAgICB9LFxyXG4gICAgZmlsbEZyb21GdW5kKGZ1bmQpIHtcclxuICAgICAgICAvLyB1c2UganVzdCBmdW5kIGFzIGFjY291bnQgc3RyaW5nIHRvIGluaXRpYWxpemUgdGFibGUgaW5zaWRlIGFjY29yZGlvblxyXG4gICAgICAgIHRoaXMuaW5pdChmdW5kKTtcclxuICAgICAgICBjb25zdCBmdW5kT2JqZWN0ID0gbmV3IEZ1bmQoZnVuZCk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBhIHJvdyBmb3IgZWFjaCBhcHByb3ByaWF0aW9uIGluIHRoZSBmdW5kXHJcbiAgICAgICAgY29uc3QgaWQgPSBjbGVhblN0cmluZyhmdW5kKTtcclxuXHJcbiAgICAgICAgZnVuZE9iamVjdC5nZXRBcHByb3ByaWF0aW9ucygpLmZvckVhY2goIGFwcHJvcE9iaiA9PiB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSB0b3RhbCBmb3IgdGhlIGFwcHJvcHJpYXRpb24gaXMgPiAkMCwgYWRkIGFuIGFjY29yZGlvbiBmb3IgYWxsIHRoZSBDQ3NcclxuICAgICAgICAgICAgaWYgKCBhcHByb3BPYmoudG90YWwoKSAhPSAwICl7XHJcbiAgICAgICAgICAgICAgICBJdGVtLmFkZChhcHByb3BPYmouYWNjb3VudFN0cmluZygpLCBgI3N0cmluZ18ke2lkfV9jb250ZW50IC5hY2NvcmRpb24tYm9keWApO1xyXG4gICAgICAgICAgICAgICAgSXRlbS51cGRhdGVIZWFkZXIoYXBwcm9wT2JqLm5hbWUoKSwgYXBwcm9wT2JqLmFjY291bnRTdHJpbmcoKSwgYXBwcm9wT2JqLnRvdGFsKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxsRnJvbUFwcHJvcChhcHByb3BPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0sXHJcbiAgICBmaWxsRnJvbUFwcHJvcChhcHByb3BPYmope1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHRhYmxlIG9iamVjdFxyXG4gICAgICAgIHRoaXMuaW5pdChhcHByb3BPYmouYWNjb3VudFN0cmluZygpKTtcclxuICAgICAgICAvLyBhZGQgYSBjb2xsYXBzaWJsZSByb3cgZm9yIGVhY2ggY29zdCBjZW50ZXJcclxuICAgICAgICBhcHByb3BPYmouZ2V0Q29zdENlbnRlcnMoKS5mb3JFYWNoKCBjY09iaiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjY09iai5nZXRUb3RhbCgpICE9IDAgKXtcclxuICAgICAgICAgICAgICAgIEl0ZW0uYWRkKGNjT2JqLmFjY291bnRTdHJpbmcoKSwgYCNzdHJpbmdfJHthcHByb3BPYmouYWNjb3VudFN0cmluZygpfV9jb250ZW50IC5hY2NvcmRpb24tYm9keWApO1xyXG4gICAgICAgICAgICAgICAgSXRlbS51cGRhdGVIZWFkZXIoY2NPYmouZ2V0TmFtZSgpLCBjY09iai5hY2NvdW50U3RyaW5nKCksIGNjT2JqLmdldFRvdGFsKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxsRnJvbUNDKGNjT2JqKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgZmlsbEZyb21DQyhjY09iail7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhIHRhYmxlIGFuZCBzdW1tYXJpemUgdGhlIGxpbmUgaXRlbXNcclxuICAgICAgICB0aGlzLmluaXQoY2NPYmouYWNjb3VudFN0cmluZygpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhjY09iai5hY2NvdW50U3RyaW5nKCksICdQZXJzb25uZWwgRXhwZW5kaXR1cmVzJywgY2NPYmouZ2V0UGVyc29ubmVsQ29zdCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhjY09iai5hY2NvdW50U3RyaW5nKCksICdPdmVydGltZSBFeHBlbmRpdHVyZXMnLCBjY09iai5nZXRPdmVydGltZUNvc3QoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coY2NPYmouYWNjb3VudFN0cmluZygpLCAnTm9uLVBlcnNvbm5lbCBFeHBlbmRpdHVyZXMnLCBjY09iai5nZXROb25QZXJzb25uZWxDb3N0KCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGNjT2JqLmFjY291bnRTdHJpbmcoKSwgJ1JldmVudWVzJywgY2NPYmouZ2V0UmV2ZW51ZSgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhjY09iai5hY2NvdW50U3RyaW5nKCksICdOZXQgRXhwZW5kaXR1cmVzIChSZXZlbnVlcyknLCBjY09iai5nZXRUb3RhbCgpKTtcclxuICAgIH0sXHJcbiAgICBmaWxsRnJvbUluaXQocHJvZ3JhbSkge1xyXG4gICAgICAgIC8vIEZpbGwgb3V0IGluZm8gZm9yIGVhY2ggc3VwcGxlbWVudGFsIGluaXRcclxuICAgICAgICB0aGlzLmluaXQocHJvZ3JhbS5pZCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhwcm9ncmFtLmlkKCksICdFc3RpbWF0ZWQgUmV2ZW51ZScsIHByb2dyYW0ucmV2ZW51ZSgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhwcm9ncmFtLmlkKCksICdQZXJzb25uZWwgRXhwZW5kaXR1cmVzJywgcHJvZ3JhbS5wZXJzb25uZWwoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3cocHJvZ3JhbS5pZCgpLCAnTm9uLVBlcnNvbm5lbCBPcGVyYXRpbmcnLCBwcm9ncmFtLm9wZXJhdGluZygpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhwcm9ncmFtLmlkKCksICdOb24tUGVyc29ubmVsIENhcGl0YWwnLCBwcm9ncmFtLmNhcGl0YWwoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3cocHJvZ3JhbS5pZCgpLCAnVG90YWwgRXhwZW5kaXR1cmVzJywgcHJvZ3JhbS50b3RhbCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgSXRlbSA9IHtcclxuICAgIGFjY291bnRTdHJpbmcoZnVuZCwgYXBwcm9wID0gJycsIGNjID0gJycpIHtcclxuICAgICAgICB2YXIgYWNjb3VudF9zdHJpbmcgPSBjbGVhblN0cmluZyhmdW5kKTtcclxuICAgICAgICBpZiAoYXBwcm9wKSB7IGFjY291bnRfc3RyaW5nICs9IGFwcHJvcCB9O1xyXG4gICAgICAgIGlmIChjYykgeyBhY2NvdW50X3N0cmluZyArPSBjYyB9O1xyXG4gICAgICAgIHJldHVybiBhY2NvdW50X3N0cmluZztcclxuICAgIH0sXHJcbiAgICBodG1sKGFjY291bnRfc3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gYDxoMiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIiBpZD1cInN0cmluZ18ke2FjY291bnRfc3RyaW5nfV9oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWNjb3JkaW9uLWJ1dHRvbiBjb2xsYXBzZWRcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI3N0cmluZ18ke2FjY291bnRfc3RyaW5nfV9jb250ZW50XCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1jb250cm9scz1cInN0cmluZ18ke2FjY291bnRfc3RyaW5nfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW1vdW50XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzdHJpbmdfJHthY2NvdW50X3N0cmluZ31fY29udGVudFwiIGNsYXNzPVwiYWNjb3JkaW9uLWNvbGxhcHNlIGNvbGxhcHNlXCIgYXJpYS1sYWJlbGxlZGJ5PVwic3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9X2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tYm9keVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgfSxcclxuICAgIGFkZCA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nLCBhY2NvcmRpb25fcXVlcnkpIHtcclxuICAgICAgICAvLyBnZXQgYWNjb3JkaW9uIGFuZCBhZGQgYSBuZXcgaXRlbSB0byBpdFxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYWNjb3JkaW9uX3F1ZXJ5KTtcclxuICAgICAgICBjb25zdCBpdGVtX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBpdGVtX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWNjb3JkaW9uLWl0ZW0nKTtcclxuICAgICAgICBpdGVtX2VsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5odG1sKGFjY291bnRfc3RyaW5nKTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoaXRlbV9lbGVtZW50KTtcclxuICAgIH0sXHJcbiAgICBFeHBlbnNlVGFibGUgOiBFeHBlbnNlVGFibGUsXHJcbiAgICB1cGRhdGVIZWFkZXIgOiBmdW5jdGlvbih0aXRsZSwgYWNjb3VudF9zdHJpbmcsIG5ld19hbW91bnQpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJfYnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3N0cmluZ18ke2FjY291bnRfc3RyaW5nfV9oZWFkZXIgYnV0dG9uYCk7XHJcbiAgICAgICAgaGVhZGVyX2J0bi5xdWVyeVNlbGVjdG9yKCdzcGFuLm5hbWUnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG4gICAgICAgIGhlYWRlcl9idG4ucXVlcnlTZWxlY3Rvcignc3Bhbi5hbW91bnQnKS50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KG5ld19hbW91bnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBBZGRJbml0QnV0dG9uID0ge1xyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLWFkZC1pbml0Jyk7XHJcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgdmlzaXRQYWdlKCduZXctaW5pdHMnKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQWNjb3JkaW9uID0ge1xyXG4gICAgSXRlbSA6IEl0ZW0sXHJcbiAgICBBZGRJbml0QnV0dG9uOiBBZGRJbml0QnV0dG9uLFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FjY29yZGlvbi1kaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIC8vIHJlc2V0IHRvIGRlbGV0ZSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Jhc2VsaW5lLWFjY29yZGlvbiAuc3VtbWFyeS1hY2NvcmRpb24nKS5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3VwcC1hY2NvcmRpb24gLnN1bW1hcnktYWNjb3JkaW9uJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB9LFxyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FjY29yZGlvbi1kaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIH0sXHJcbiAgICBhc3luYyBjcmVhdGVCYXNlbGluZSgpe1xyXG4gICAgICAgIHZhciBmdW5kcyA9IEZ1bmRMb29rdXBUYWJsZS5saXN0RnVuZHMoKTtcclxuICAgICAgICBmdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICBJdGVtLmFkZChmdW5kLCAnI2Jhc2VsaW5lLWFjY29yZGlvbiAuc3VtbWFyeS1hY2NvcmRpb24nKTtcclxuICAgICAgICAgICAgSXRlbS5FeHBlbnNlVGFibGUuZmlsbEZyb21GdW5kKGZ1bmQpO1xyXG4gICAgICAgICAgICBjb25zdCBmdW5kT2JqZWN0ID0gbmV3IEZ1bmQoZnVuZCk7XHJcbiAgICAgICAgICAgIEl0ZW0udXBkYXRlSGVhZGVyKGBGdW5kICR7RnVuZExvb2t1cFRhYmxlLmdldE5hbWUoZnVuZCl9YCwgZnVuZCwgZnVuZE9iamVjdC5nZXRUb3RhbCgpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gY29sb3ItY29kZSBHRiBiYXNlbGluZVxyXG4gICAgICAgIGNvbnN0IEdGID0gbmV3IEZ1bmQoMTAwMCk7XHJcbiAgICAgICAgLy8gdGV4dCB0byBjb2xvciBjb2RlXHJcbiAgICAgICAgbGV0IHRvcGxpbmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RyaW5nXzEwMDBfaGVhZGVyIC5hbW91bnQnKTtcclxuICAgICAgICBpZiAoR0YuZ2V0VG90YWwoKSA8PSBCYXNlbGluZS50YXJnZXQoKSl7XHJcbiAgICAgICAgICAgIHRvcGxpbmUuc3R5bGUuY29sb3IgPSAnZ3JlZW4nO1xyXG4gICAgICAgICAgICB0b3BsaW5lLnN0eWxlLndlaWdodCA9IDQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICB0b3BsaW5lLnN0eWxlLmNvbG9yID0gJ3JlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGNyZWF0ZVN1cHAoKSB7XHJcbiAgICAgICAgY29uc3Qgc3VwcCA9IG5ldyBTdXBwbGVtZW50YWw7XHJcbiAgICAgICAgc3VwcC5pbml0aWF0aXZlcy5mb3JFYWNoKHByb2dyYW0gPT4ge1xyXG4gICAgICAgICAgICBJdGVtLmFkZChwcm9ncmFtLmlkKCksICcjc3VwcC1hY2NvcmRpb24gLnN1bW1hcnktYWNjb3JkaW9uJyk7XHJcbiAgICAgICAgICAgIEl0ZW0uRXhwZW5zZVRhYmxlLmZpbGxGcm9tSW5pdChwcm9ncmFtKTtcclxuICAgICAgICAgICAgSXRlbS51cGRhdGVIZWFkZXIocHJvZ3JhbS5uYW1lLCBwcm9ncmFtLmlkKCksIHByb2dyYW0udG90YWwoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlVG9wTGluZXMoKSB7XHJcbiAgICAgICAgLy8gYWRqdXNlIGJhc2VsaW5lXHJcbiAgICAgICAgLy8gY29uc3QgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmU7XHJcbiAgICAgICAgY29uc3QgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmU7XHJcbiAgICAgICAgY29uc3QgYmFzZWxpbmVBbW91bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFzZWxpbmUtdGl0bGUgLnRvcC1saW5lLWFtb3VudCcpXHJcbiAgICAgICAgYmFzZWxpbmVBbW91bnQudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeShiYXNlbGluZS50b3RhbCgpKTtcclxuICAgICAgICAvLyBhZGp1c3Qgc3VwcGxlbWVudGFsc1xyXG4gICAgICAgIGNvbnN0IHN1cHAgPSBuZXcgU3VwcGxlbWVudGFsO1xyXG4gICAgICAgIGNvbnN0IHN1cHBBbW91bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3VwcC10aXRsZSAudG9wLWxpbmUtYW1vdW50JylcclxuICAgICAgICBzdXBwQW1vdW50LnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3koc3VwcC50b3RhbCgpKTtcclxuXHJcbiAgICB9LFxyXG4gICAgYnVpbGQoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVCYXNlbGluZSgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3VwcCgpO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgZWRpdCBidXR0b25zXHJcbiAgICAgICAgVGFibGUuQnV0dG9ucy5FZGl0LmluaXQocmVkaXJlY3RGb3JFZGl0KTtcclxuICAgICAgICB0aGlzLkFkZEluaXRCdXR0b24uaW5pdCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVG9wTGluZXMoKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbjtcclxuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2ZpbGVfdXBsb2FkLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2ZpbGVfdXBsb2FkLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8vIGZpbGVfdXBsb2FkLmpzXHJcbmltcG9ydCAnLi9maWxlX3VwbG9hZC5jc3MnO1xyXG5pbXBvcnQgeyBwcm9jZXNzV29ya2Jvb2sgfSBmcm9tIFwiLi4vLi4vdXRpbHMvWExTWF9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tICcuLi9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XHJcblxyXG5leHBvcnQgY29uc3QgRmlsZVVwbG9hZCA9IHtcclxuICAgIGluaXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBOYXZCdXR0b25zLk5leHQuZGlzYWJsZSgpO1xyXG4gICAgICAgIGNvbnN0IGlucHV0T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTtcclxuICAgICAgICBpbnB1dE9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihldmVudCkgeyByZWFkWEwoZXZlbnQpIH0pO1xyXG4gICAgfSxcclxuICAgIHNob3cgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IGlucHV0T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTtcclxuICAgICAgICBpbnB1dE9iamVjdC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgaW5wdXRPYmplY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1pbnB1dCcpO1xyXG4gICAgICAgIGlucHV0T2JqZWN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZWFkWEwoZXZlbnQpIHtcclxuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07IC8vIHJlYWQgdXBsb2FkZWQgZmlsZVxyXG4gICAgY29uc3Qgc3Bpbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtc3Bpbm5lcicpOyAvLyBnZXQgdGhlIHNwaW5uZXIgZWxlbWVudFxyXG5cclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgLy8gU2hvdyB0aGUgc3Bpbm5lclxyXG4gICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgIC8vIHJlYWQgaW4gbmV3IGRhdGFcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZS50YXJnZXQucmVzdWx0O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NXb3JrYm9vayhhcnJheUJ1ZmZlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBvbmNlIHByb2Nlc3NpbmcgaXMgZG9uZVxyXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpOyAvLyBFbmFibGUgdGhlIG5leHQgYnV0dG9uIGFmdGVyIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3Npbmcgd29ya2Jvb2s6JywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgaW4gY2FzZSBvZiBhbiBlcnJvclxyXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpOyAvLyBFbnN1cmUgdGhlIGJ1dHRvbiBpcyByZS1lbmFibGVkIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmaWxlOicsIGVycik7XHJcblxyXG4gICAgICAgICAgICAvLyBIaWRlIHRoZSBzcGlubmVyIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICAgICAgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7IC8vIEVuc3VyZSB0aGUgYnV0dG9uIGlzIHJlLWVuYWJsZWQgaW4gY2FzZSBvZiBhbiBlcnJvclxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTsgLy8gUmVhZCB0aGUgZmlsZSBhcyBhbiBBcnJheUJ1ZmZlclxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGaWxlVXBsb2FkOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vbW9kYWwuY3NzJztcclxuXHJcbmZ1bmN0aW9uIGNsZWFyTW9kYWwoKSB7XHJcbiAgICB1cGRhdGVNb2RhbFRpdGxlKCcnKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1ib2R5JykuaW5uZXJIVE1MID0gJyc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVNb2RhbCgpIHtcclxuICAgICQoJyNtYWluLW1vZGFsJykubW9kYWwoJ2hpZGUnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd01vZGFsKCkge1xyXG4gICAgJCgnI21haW4tbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93TW9kYWxIYW5kbGVyKCkge1xyXG4gICAgc2hvd01vZGFsKCdtYWluLW1vZGFsJyk7XHJcbn1cclxuXHJcbmNvbnN0IFN1Ym1pdCA9IHtcclxuICAgIGhhbmRsZXI6IG51bGwsXHJcblxyXG4gICAgaW5pdDogZnVuY3Rpb24ob25TdWJtaXQpIHtcclxuICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLW1vZGFsJyk7XHJcblxyXG4gICAgICAgIC8vIERlaW5pdGlhbGl6ZSBmaXJzdCB0byBhdm9pZCBtdWx0aXBsZSBiaW5kaW5nc1xyXG4gICAgICAgIHRoaXMuZGVpbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIG9uU3VibWl0KGV2ZW50KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBBZGRpbmcgdGhlIGhhbmRsZXIgYXMgdGhlIGV2ZW50IGxpc3RlbmVyXHJcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgdGhpcy5oYW5kbGVyKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIGVuYWJsZSBjbG9zZSB4XHJcbiAgICAgICAgY29uc3QgeCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJyNtb2RhbC1jbG9zZS14Jyk7XHJcbiAgICAgICAgeC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVNb2RhbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlaW5pdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1tb2RhbCcpO1xyXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhciB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICBtb2RhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLmhhbmRsZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIHRvIGVuYWJsZSBjbG9zZSB4XHJcbiAgICAgICAgY29uc3QgeCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJyNtb2RhbC1jbG9zZS14Jyk7XHJcbiAgICAgICAgeC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVNb2RhbCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBMaW5rID0ge1xyXG4gICAgYWRkIDogZnVuY3Rpb24oYnV0dG9uX2lkKXtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsSGFuZGxlcik7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlIDogZnVuY3Rpb24oYnV0dG9uX2lkKXtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsSGFuZGxlcik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVNb2RhbFRpdGxlKHRpdGxlKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG59XHJcblxyXG5jb25zdCBUaXRsZSA9IHtcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRpdGxlKSB7XHJcbiAgICAgICAgdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgTW9kYWwgPSB7XHJcbiAgICBoaWRlOiBoaWRlTW9kYWwsXHJcbiAgICBzaG93OiBzaG93TW9kYWwsXHJcbiAgICBjbGVhcjogY2xlYXJNb2RhbCxcclxuICAgIFRpdGxlOiBUaXRsZSxcclxuICAgIExpbms6IExpbmssXHJcbiAgICBTdWJtaXQ6IFN1Ym1pdFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTW9kYWw7IiwiaW1wb3J0ICcuL2JvZHkuY3NzJztcclxuXHJcbmltcG9ydCBXZWxjb21lIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzJ1xyXG5pbXBvcnQgQWNjb3JkaW9uIGZyb20gJy4uL2FjY29yZGlvbi9hY2NvcmRpb24uanMnO1xyXG5pbXBvcnQgRmlsZVVwbG9hZCBmcm9tICcuLi9maWxlX3VwbG9hZC9maWxlX3VwbG9hZC5qcyc7XHJcbmltcG9ydCBNb2RhbCBmcm9tICcuLi9tb2RhbC9tb2RhbC5qcyc7XHJcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzJztcclxuaW1wb3J0IFByb21wdCBmcm9tICcuLi9wcm9tcHQvcHJvbXB0LmpzJztcclxuaW1wb3J0IFNpZGViYXIgZnJvbSAnLi4vc2lkZWJhci9zaWRlYmFyLmpzJztcclxuaW1wb3J0IFRhYmxlIGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmpzJzsgIFxyXG5cclxuZnVuY3Rpb24gcmVzZXRQYWdlKCkge1xyXG4gICAgLy8gaGlkZSBldmVyeXRoaW5nIGluIHRoZSBib2R5XHJcbiAgICBXZWxjb21lLmhpZGUoKTtcclxuICAgIE1vZGFsLmNsZWFyKCk7XHJcbiAgICBNb2RhbC5oaWRlKCk7XHJcbiAgICBOYXZCdXR0b25zLmhpZGUoKTtcclxuICAgIFByb21wdC5oaWRlKCk7XHJcbiAgICBUYWJsZS5oaWRlKCk7XHJcbiAgICBTaWRlYmFyLmhpZGUoKTtcclxuICAgIEFjY29yZGlvbi5oaWRlKCk7XHJcbiAgICBGaWxlVXBsb2FkLmhpZGUoKTtcclxuICAgIFRvb2x0aXAuaGlkZSgpO1xyXG5cclxuICAgIC8vIHJlc2V0IGZpbHRlciBkcm9wZG93bnNcclxuICAgIFRhYmxlLkZpbHRlci5kZWxldGVBbGwoKTtcclxuXHJcbiAgICBQcm9tcHQuQnV0dG9ucy5yZXNldCgpO1xyXG4gICAgLy8gZGlzYWJsZSBzdWJtaXQgYnV0dG9uXHJcbiAgICBNb2RhbC5TdWJtaXQuZGVpbml0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBCb2R5ID0ge1xyXG4gICAgcmVzZXQgOiByZXNldFBhZ2VcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQm9keTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaGVhZGVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2hlYWRlci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vaGVhZGVyLmNzcyc7XHJcblxyXG5pbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vLi4vbW9kZWxzL2N1cnJlbnRfZnVuZCc7XHJcbmltcG9ydCB7IEZJU0NBTF9ZRUFSIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuXHJcbmV4cG9ydCBjb25zdCBUaXRsZSA9IHtcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRpdGxlKXtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICB9LFxyXG4gICAgZGVmYXVsdCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZShgRlkke0ZJU0NBTF9ZRUFSfSBCdWRnZXQgUmVxdWVzdGApXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBTdWJ0aXRsZSA9IHtcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHN1YnRpdGxlKXtcclxuICAgICAgICAvLyBnZXQgY3VycmVudCBmdW5kXHJcbiAgICAgICAgdmFyIGZ1bmQgPSBDdXJyZW50RnVuZC5uYW1lKCk7XHJcbiAgICAgICAgaWYgKGZ1bmQpe1xyXG4gICAgICAgICAgICB2YXIgc3VidGl0bGUgPSBgJHtzdWJ0aXRsZX06ICR7ZnVuZH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN1YnRpdGxlXCIpLnRleHRDb250ZW50ID0gc3VidGl0bGU7XHJcbiAgICB9XHJcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9mb3JtLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8vIGZ1bmN0aW9uIHRvIGFkZCBxdWVzdGlvbnMgdG8gZm9ybXNcclxuXHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9kcm9wZG93blwiO1xyXG5cclxuLy8gaW5wdXRUeXBlIGlzIGZvciB2YWxpZGF0aW9uICgnbnVtYmVyJyBvciAndGV4dCcsIGV0YylcclxuZnVuY3Rpb24gYXBwZW5kRm9ybUVsZW1lbnQobGFiZWwsIGlucHV0RWwsIGlucHV0SWQsIHJlcXVpcmVkKSB7XHJcblxyXG4gICAgLy8gY2hhbmdlIGlmIHdlIHdhbnQgZm9ybXMgZWxzZXdoZXJlXHJcbiAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1mb3JtJyk7XHJcblxyXG4gICAgLy8gY3JlYXRlIG91dGVyIHdyYXBwZXIgZm9yIGVsZW1lbnRcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgIFxyXG5cclxuICAgIC8vIGxhYmVsIHF1ZXN0aW9uXHJcbiAgICBjb25zdCBsYWJlbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcclxuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcclxuXHJcbiAgICAvLyBtYXJrIGFzIHJlcXVpcmVkIGlmIGFwcGxpY2FibGVcclxuICAgIGlucHV0RWwucmVxdWlyZWQgPSByZXF1aXJlZDtcclxuXHJcbiAgICAvLyBJZiBhbiBJRCBpcyBwcm92aWRlZCwgc2V0IGl0IG9uIHRoZSBlbGVtZW50XHJcbiAgICBpZiAoaW5wdXRJZCkge1xyXG4gICAgICAgIC8vaW5wdXRFbC5pZCA9IGBpbnB1dC0ke2lucHV0SWR9YDtcclxuICAgICAgICBpbnB1dEVsLmlkID0gaW5wdXRJZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjcmVhdGUgdmFsaWRhdGlvbiB0ZXh0LyBhIHBsYWNlIHRvIGRpc3BsYXkgZXJyb3JzXHJcbiAgICBjb25zdCB2YWxpZGF0aW9uVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgIHZhbGlkYXRpb25UZXh0LmlkID0gYCR7aW5wdXRJZH0tdmFsaWRhdGlvbmA7XHJcbiAgICB2YWxpZGF0aW9uVGV4dC5jbGFzc0xpc3QuYWRkKCdlcnJvci1tZXNzYWdlJyk7XHJcbiAgICB2YWxpZGF0aW9uVGV4dC5zdHlsZS5jb2xvciA9ICdyZWQnO1xyXG4gIFxyXG4gICAgLy8gYWRkIGVsZW1lbnRzXHJcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGxhYmVsRWwpO1xyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbnB1dEVsKTtcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQodmFsaWRhdGlvblRleHQpO1xyXG4gICAgZm9ybS5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcclxufSBcclxuXHJcbmV4cG9ydCBjb25zdCBOZXdGaWVsZCA9IHtcclxuICAgIHNob3J0VGV4dCA6IGZ1bmN0aW9uKGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRFbC50eXBlID0gJ3RleHQnO1xyXG4gICAgICAgIGFwcGVuZEZvcm1FbGVtZW50KGxhYmVsLCBpbnB1dEVsLCBpbnB1dElkLCByZXF1aXJlZCk7XHJcbiAgICB9LFxyXG4gICAgbG9uZ1RleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xyXG4gICAgICAgIGFwcGVuZEZvcm1FbGVtZW50KGxhYmVsLCBpbnB1dEVsLCBpbnB1dElkLCByZXF1aXJlZCk7XHJcbiAgICB9LFxyXG4gICAgbnVtZXJpY0lucHV0IDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICBpbnB1dEVsLnR5cGUgPSAnbnVtYmVyJztcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCxyZXF1aXJlZCk7XHJcbiAgICB9LFxyXG4gICAgZHJvcGRvd24gOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgb3B0aW9uQXJyYXksIHJlcXVpcmVkID0gZmFsc2Upe1xyXG4gICAgICAgIHZhciBpbnB1dEVsID0gRHJvcGRvd24uY3JlYXRlKG9wdGlvbkFycmF5KTtcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCwgcmVxdWlyZWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOZXdGaWVsZDsiLCJmdW5jdGlvbiBhZGRTdWJtaXRCdXR0b25Ub0Zvcm0oZm9ybV9pZCkge1xyXG4gICAgLy8gRmluZCB0aGUgZm9ybSBieSBpdHMgSURcclxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtX2lkKTtcclxuICBcclxuICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGBkaXZgIGZvciB0aGUgYnV0dG9uXHJcbiAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGJ1dHRvbkNvbnRhaW5lci5pZCA9ICdzdWJtaXQtYnRuLWNvbnRhaW5lcic7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSB0aGUgc3VibWl0IGlucHV0XHJcbiAgICBjb25zdCBzdWJtaXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICBzdWJtaXRJbnB1dC5jbGFzc05hbWUgPSAnYnRuIGJ0bi1zdWJtaXQnOyAvLyBVc2UgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIHlvdXIgZGVzaWduXHJcbiAgICBzdWJtaXRJbnB1dC50eXBlID0gJ3N1Ym1pdCc7XHJcbiAgICBzdWJtaXRJbnB1dC52YWx1ZSA9ICdTdWJtaXQnO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgc3VibWl0IGlucHV0IHRvIHRoZSBjb250YWluZXJcclxuICAgIGJ1dHRvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChzdWJtaXRJbnB1dCk7XHJcbiAgICBcclxuICAgIC8vIEFwcGVuZCB0aGUgY29udGFpbmVyIHRvIHRoZSBmb3JtXHJcbiAgICBmb3JtLmFwcGVuZENoaWxkKGJ1dHRvbkNvbnRhaW5lcik7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBTdWJtaXRCdXR0b24gPSB7XHJcbiAgICBhZGQgOiBmdW5jdGlvbigpIHsgYWRkU3VibWl0QnV0dG9uVG9Gb3JtKCduZXctZm9ybScpIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VibWl0QnV0dG9uOyIsImltcG9ydCAnLi9mb3JtLmNzcyc7XHJcblxyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vc3ViY29tcG9uZW50cy9kcm9wZG93bi5qc1wiO1xyXG5pbXBvcnQgTmV3RmllbGQgZnJvbSBcIi4vc3ViY29tcG9uZW50cy9maWVsZHMuanNcIjtcclxuaW1wb3J0IFN1Ym1pdEJ1dHRvbiBmcm9tIFwiLi9zdWJjb21wb25lbnRzL3N1Ym1pdC5qc1wiO1xyXG5cclxuZnVuY3Rpb24gZmV0Y2hBbGxSZXNwb25zZXMoZXZlbnQpIHtcclxuXHJcbiAgICAvLyBBc3N1bWluZyBgZXZlbnQudGFyZ2V0YCBpcyB0aGUgZm9ybSBpdHNlbGZcclxuICAgIGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQ7XHJcbiAgICBcclxuICAgIC8vIEluaXRpYWxpemUgYW4gZW1wdHkgYXJyYXkgdG8gaG9sZCB0aGUgaW5wdXQgdmFsdWVzXHJcbiAgICBsZXQgZm9ybURhdGEgPSB7fTtcclxuICAgIFxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZm9ybSBlbGVtZW50XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm0uZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGZvcm0uZWxlbWVudHNbaV07XHJcbiAgICAgIFxyXG4gICAgICAvLyBFeGNsdWRlIGVsZW1lbnRzIHRoYXQgYXJlbid0IGlucHV0cywgdGV4dGFyZWFzLCBvciBzZWxlY3RcclxuICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fFxyXG4gICAgICAgICAgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8XHJcbiAgICAgICAgICBlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XHJcbiAgICAgICAgLy8gRXhjbHVkZSBpbnB1dCB0eXBlcyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCBmb3Igc3VibWlzc2lvbiAoc3VjaCBhcyBgc3VibWl0YClcclxuICAgICAgICBpZiAoZWxlbWVudC50eXBlICE9PSAnc3VibWl0JyAmJiBlbGVtZW50LnR5cGUgIT09ICdidXR0b24nKSB7XHJcbiAgICAgICAgICBmb3JtRGF0YVtlbGVtZW50LmlkXSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZvcm0ucmVzZXQoKTtcclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkRm9ybShlbGVtZW50X2lkID0gJ21vZGFsLWJvZHknLCBmb3JtX2lkID0gJ25ldy1mb3JtJykge1xyXG4gIFxyXG4gIGNvbnN0IHRhcmdldF9lbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudF9pZCk7XHJcblxyXG4gIC8vIGNyZWF0ZSBmb3JtXHJcbiAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICBmb3JtLnNldEF0dHJpYnV0ZSgnaWQnLCBmb3JtX2lkKTtcclxuXHJcbiAgLy8gQXBwZW5kIHRoZSBmb3JtIHRvIHRoZSBtb2RhbCBib2R5XHJcbiAgdGFyZ2V0X2VsZW0uYXBwZW5kQ2hpbGQoZm9ybSk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRm9ybSA9IHtcclxuICBuZXcgOiBmdW5jdGlvbihwYXJlbnRfZWxlbV9pZCkgeyBhZGRGb3JtKHBhcmVudF9lbGVtX2lkLCAnbmV3LWZvcm0nKSB9LFxyXG4gIGZldGNoQWxsUmVzcG9uc2VzIDogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIGZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KSB9LFxyXG4gIE5ld0ZpZWxkIDogTmV3RmllbGQsXHJcbiAgRHJvcGRvd24gOiBEcm9wZG93bixcclxuICBTdWJtaXRCdXR0b24gOiBTdWJtaXRCdXR0b25cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRm9ybTsiLCJpbXBvcnQgUHJvbXB0IGZyb20gXCIuLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanNcIjtcclxuaW1wb3J0IFNpZGViYXIgZnJvbSBcIi4uL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzXCI7XHJcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gXCIuLi9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzXCI7XHJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xyXG5pbXBvcnQgeyBTdWJ0aXRsZSwgVGl0bGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzXCI7XHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xyXG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanNcIjtcclxuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi9jb21wb25lbnRzL21vZGFsL21vZGFsLmpzXCI7XHJcblxyXG5pbXBvcnQgeyBDdXJyZW50UGFnZSwgQWNjb3VudFN0cmluZyB9IGZyb20gJy4uL21vZGVscy8nXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8vIHBhZ2Ugc3RhdGUgaW4gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICcnO1xyXG5cclxuICAgICAgICAvLyB3aGV0aGVyIHRvIGRpc3BsYXlcclxuICAgICAgICB0aGlzLm5hdkJ1dHRvbnMgPSB0cnVlOyBcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyB0ZXh0IHRvIHNob3cgaW4gdGhlIHByb21wdCBhcmVhXHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBzdWJ0aXRsZSB0ZXh0XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICcnO1xyXG5cclxuICAgICAgICAvLyB0YWJsZSBvYmplY3Qgb2YgY2xhc3MgVmlld1RhYmxlIG9yIG51bGxcclxuICAgICAgICB0aGlzLnRhYmxlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICAvLyB1cGRhdGUgcGFnZSBzdGF0ZVxyXG4gICAgICAgIEN1cnJlbnRQYWdlLnVwZGF0ZSh0aGlzLnBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgICAgICAvLyBzdGFydCB3aXRoIGEgYmxhbmsgcGFnZVxyXG4gICAgICAgIEJvZHkucmVzZXQoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGRlZmF1bHQgdGl0bGVcclxuICAgICAgICBUaXRsZS5kZWZhdWx0KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZGVmYXVsdCB0byBzaG93aW5nIG5hdmJ1dHRvbnNcclxuICAgICAgICBpZiAodGhpcy5uYXZCdXR0b25zKSB7IE5hdkJ1dHRvbnMuc2hvdygpOyB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlZmF1bHQgdG8gc2hvd2luZyBzaWRlYmFyXHJcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhcikgeyBTaWRlYmFyLnNob3coKSB9O1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIHByb21wdCB0ZXh0IGFuZCBidXR0b25zXHJcbiAgICAgICAgaWYgKHRoaXMucHJvbXB0KSB7IFByb21wdC5UZXh0LnVwZGF0ZSh0aGlzLnByb21wdCkgfTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBpbml0aWFsaXplIHRhYmxlXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUpIHsgdGhpcy50YWJsZS5idWlsZCgpOyB9XHJcblxyXG4gICAgICAgIC8vIHNob3cgcGFnZSBzdWJ0aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnN1YnRpdGxlKSB7IFN1YnRpdGxlLnVwZGF0ZSh0aGlzLnN1YnRpdGxlKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFudXAoKSB7IHJldHVybjsgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvLyBFbnN1cmUgbWV0aG9kcyByZXRhaW4gdGhlIGNvcnJlY3QgYHRoaXNgIGNvbnRleHRcclxuICAgICAgICB0aGlzLnN1Ym1pdE5ld1JvdyA9IHRoaXMuc3VibWl0TmV3Um93LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQgU3RyaW5nJywgY2xhc3NOYW1lOiAnYWNjb3VudC1zdHJpbmcnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdBcHByb3ByaWF0aW9uIE5hbWUnLCBjbGFzc05hbWU6ICdhcHByb3AtbmFtZScsIGhpZGU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0FwcHJvcHJpYXRpb24nLCBjbGFzc05hbWU6ICdhcHByb3AnLCBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdDb3N0IENlbnRlciBOYW1lJywgY2xhc3NOYW1lOiAnY2MtbmFtZScsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdDb3N0IENlbnRlcicsIGNsYXNzTmFtZTogJ2NjJywgIGhpZGU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0Z1bmQgTmFtZScsIGNsYXNzTmFtZTogJ2Z1bmQtbmFtZScsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGdW5kJywgY2xhc3NOYW1lOiAnZnVuZCcsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdFZGl0JywgY2xhc3NOYW1lOiAnZWRpdCcgfSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gYWRkIGFuIGVkaXQgY29sdW1uXHJcbiAgICAgICAgdGhpcy5hZGRFZGl0ID0gdHJ1ZSA7XHJcblxyXG4gICAgICAgIC8vIG1lc3NhZ2UgdG8gc2hvdyBpZiB0aGVyZSdzIG5vIHNhdmVkIGRhdGFcclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICBcclxuICAgICAgICAvLyB0ZXh0IHRvIHNob3cgZm9yIG5ldyByb3cgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b25UZXh0ID0gbnVsbCA7XHJcblxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gc2hvdyBhcyBhIGRhdGF0YWJsZVxyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWZyZXNoRGF0YSgpIHtcclxuICAgICAgICBcclxuICAgICAgICAvLyBjaGVjayBmb3IgZGF0YVxyXG4gICAgICAgIGF3YWl0IFRhYmxlLkRhdGEubG9hZCgpO1xyXG5cclxuICAgICAgICAvLyBjcmVhdGUgYSBkYXRhdGFibGUgb2JqZWN0XHJcbiAgICAgICAgaWYodGhpcy5kYXRhVGFibGUpe3RoaXMuaW5pdERhdGFUYWJsZSgpfVxyXG5cclxuICAgICAgICAvLyBhZGQgYW4gZWRpdCBjb2x1bW4gaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkRWRpdCkgeyBcclxuICAgICAgICAgICAgVGFibGUuQ29sdW1ucy5hZGRBdEVuZChUYWJsZS5CdXR0b25zLmVkaXRfY29uZmlybV9idG5zLCAnRWRpdCcpOyBcclxuICAgICAgICAgICAgLy8gYWN0aXZhdGUgZWRpdCBidXR0b25zXHJcbiAgICAgICAgICAgIFRhYmxlLkJ1dHRvbnMuRWRpdC5pbml0KHRoaXMuYWN0aW9uT25FZGl0LCB0aGlzLnVwZGF0ZVRhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gYXNzaWduIHRoZSBjb3JyZWN0IGNsYXNzZXMgYmFzZWQgb24gdGhlIHRhYmxlIGNvbHVtbnNcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgLy8gQXBwbHkgYW55IHVwZGF0ZSBmdW5jdGlvbiB0byBtYWtlIHN1cmUgc2lkZWJhciBpcyB1cCB0byBkYXRlXHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJsZSgpO1xyXG4gICAgICAgIC8vIGFkZCBhbnkgbmV3bHkgY3JlYXRlZCBjYyBvciBhcHByb3AgdG8gdGhlIGZpbHRlcnNcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYnVpbGQoKSB7XHJcbiAgICAgICAgLy8gYnVpbGQgdGFibGUgZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCBpbml0aWFsaXplIGVkaXQgYnV0dG9uc1xyXG5cclxuICAgICAgICAvLyBhZGQgdGhlIGFkZCBuZXcgcm93IGJ1dHRvbiBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5hZGRCdXR0b25UZXh0KSB7IFxyXG4gICAgICAgICAgICB0aGlzLnNldFVwRm9ybSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRhdGFcclxuICAgICAgICBpZihhd2FpdCBUYWJsZS5EYXRhLmxvYWQoKSkgeyAgXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgZGF0YSwgdXBkYXRlIHRoZSB0YWJsZSBhbmQgYWRkIGZpbHRlcnMgIFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbHRlcnMoKTsgIFxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc2hvdyBhIG1lc3NhZ2UgaWYgdGhlcmUncyBubyBzYXZlZCB0YWJsZSBkYXRhIGZvciB0aGUgc2VsZWN0ZWQgZnVuZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub0RhdGFNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBQcm9tcHQuVGV4dC51cGRhdGUodGhpcy5ub0RhdGFNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRGaWx0ZXJzKCkge1xyXG4gICAgICAgIC8vIEFkZCBhbGwgcmVsZXZhbnQgZmlsdGVycyB0byB0YWJsZVxyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2FwcHJvcC1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdBcHByb3ByaWF0aW9uJywgJ2FwcHJvcC1uYW1lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2NjLW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci5hZGQoJ0Nvc3QgQ2VudGVyJywgJ2NjLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci5hZGQoJ09iamVjdCcsICdvYmplY3QtbmFtZScpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LWNhdGVnb3J5Jykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdPYmplY3QgQ2F0ZWdvcnknLCAnb2JqZWN0LWNhdGVnb3J5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUZpbHRlcnMoKSB7XHJcbiAgICAgICAgLy8gdXBkYXRlIGZpbHRlcnMgd2l0aCBhbnkgbmV3IHZhbHVlc1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2FwcHJvcC1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIudXBkYXRlT3B0aW9ucygnQXBwcm9wcmlhdGlvbicsICdhcHByb3AtbmFtZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdjYy1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIudXBkYXRlT3B0aW9ucygnQ29zdCBDZW50ZXInLCAnY2MtbmFtZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdvYmplY3QtbmFtZScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLnVwZGF0ZU9wdGlvbnMoJ29iamVjdC1uYW1lJyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5jbGFzc05hbWUgPT09ICdvYmplY3QtY2F0ZWdvcnknKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci51cGRhdGVPcHRpb25zKCdvYmplY3QtY2F0ZWdvcnknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdERhdGFUYWJsZSgpIHtcclxuICAgICAgICBUYWJsZS5hZGp1c3RXaWR0aCgnMTAwJScpO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgRGF0YXRhYmxlc1xyXG4gICAgICAgIGlmICggISQuZm4uZGF0YVRhYmxlLmlzRGF0YVRhYmxlKCcjbWFpbi10YWJsZScpICkge1xyXG4gICAgICAgICAgICAkKCcjbWFpbi10YWJsZScpLkRhdGFUYWJsZSh7XHJcbiAgICAgICAgICAgICAgICBwYWdpbmc6IGZhbHNlLCAvLyBEaXNhYmxlIHBhZ2luYXRpb25cclxuICAgICAgICAgICAgICAgIGluZm86IGZhbHNlLCAvLyBEaXNhYmxlIHRhYmxlIGluZm9ybWF0aW9uIGRpc3BsYXlcclxuICAgICAgICAgICAgICAgIHNlYXJjaGluZzogZmFsc2UgLy8gRGlzYWJsZSB0aGUgc2VhcmNoIGJhclxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBsYWNlaG9sZGVyIGZvciBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2tcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgcmV0dXJuIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgZnVuY3Rpb24gZm9yIHRoZSBzaWRlYmFyOyBkZWZhdWx0IHRvIGp1c3Qgc2F2aW5nIHRoZSB0YWJsZVxyXG4gICAgdXBkYXRlVGFibGUoKSB7IFRhYmxlLnNhdmUoKSB9XHJcblxyXG4gICAgLy8gZXh0cmEgcXVlc3Rpb25zIG9mIHRoZSBmb3JtIHRvIGFkZCBhIG5ldyByb3dcclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpIHsgcmV0dXJuIH07XHJcblxyXG4gICAgYWRkVmFsaWRhdGlvbkxpc3RlbmVyKGlucHV0SWQsIGZpZWxkTGFiZWwsIHZhbGlkYXRpb25JZCwgbGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XHJcbiAgICAgICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudC52YWx1ZSA9PT0gJ0FkZCBuZXcnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZmllbGQgYWZ0ZXIgdGhlIHNlbGVjdGVkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KGBUeXBlIG5ldyAke2ZpZWxkTGFiZWx9OmAsIGlucHV0SWQuc2xpY2UoMCwgLTUpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkLnNsaWNlKDAsIC01KSk7ICAvLyBSZW1vdmUgJy1uYW1lJyBzdWZmaXhcclxuICAgICAgICAgICAgICAgIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdJbnB1dEVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdmFsaWRhdGlvbiBvbiB0aGUgbmV3IGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgICAgICBuZXdJbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsaWRhdGlvblRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWxpZGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UZXh0LnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0lucHV0RWxlbWVudC52YWx1ZS5sZW5ndGggIT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9IGAke2ZpZWxkTGFiZWx9IGNvZGVzIG11c3QgYmUgZXhhY3RseSAke2xlbmd0aH0gbnVtYmVycy5gO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYU4oTnVtYmVyKG5ld0lucHV0RWxlbWVudC52YWx1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UZXh0LnRleHRDb250ZW50ID0gYCR7ZmllbGRMYWJlbH0gY29kZXMgbXVzdCBiZSBudW1lcmljLmA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldyBpbnB1dCBmaWVsZCBpZiAnQWRkIG5ldycgaXMgbm90IHNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZC5zbGljZSgwLCAtNSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0lucHV0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0lucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIE1vZGlmaWVkIGFkZE1vZGFsVmFsaWRhdGlvbiBtZXRob2RcclxuICAgIGFkZE1vZGFsVmFsaWRhdGlvbigpIHtcclxuICAgICAgICB0aGlzLmFkZFZhbGlkYXRpb25MaXN0ZW5lcignYXBwcm9wLW5hbWUnLCAnQXBwcm9wcmlhdGlvbicsICdhcHByb3AtdmFsaWRhdGlvbicsIDUpO1xyXG4gICAgICAgIHRoaXMuYWRkVmFsaWRhdGlvbkxpc3RlbmVyKCdjYy1uYW1lJywgJ0Nvc3QgQ2VudGVyJywgJ2NjLXZhbGlkYXRpb24nLCA2KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVcEZvcm0oKSB7XHJcbiAgICAgICAgLy8gc2hvdyBhZGQgYnV0dG9uXHJcbiAgICAgICAgVGFibGUuQnV0dG9ucy5BZGRSb3cuc2hvdygpO1xyXG4gICAgICAgIFRhYmxlLkJ1dHRvbnMuQWRkUm93LnVwZGF0ZVRleHQodGhpcy5hZGRCdXR0b25UZXh0KTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHVwIG1vZGFsIGZvciBmb3JtIHdoZW4gYWRkIGJ1dHRvbiBpcyBwcmVzc2VkXHJcbiAgICAgICAgTW9kYWwuY2xlYXIoKTtcclxuICAgICAgICBNb2RhbC5MaW5rLmFkZCgnYWRkLWJ0bicpO1xyXG4gICAgICAgIE1vZGFsLlRpdGxlLnVwZGF0ZSh0aGlzLmFkZEJ1dHRvblRleHQpO1xyXG5cclxuICAgICAgICAvLyBjcmVhdGUgZm9ybVxyXG4gICAgICAgIEZvcm0ubmV3KCdtb2RhbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBjdXN0b20gcXVlc3Rpb25zXHJcbiAgICAgICAgdGhpcy5hZGRDdXN0b21RdWVzdGlvbnMoKTtcclxuICAgICAgICAvLyBhbnkgdmFsaWRhdGlvbiBvciBzcGVjaWFsIGZ1bmN0aW9uc1xyXG4gICAgICAgIHRoaXMuYWRkTW9kYWxWYWxpZGF0aW9uKCk7XHJcbiAgICAgICAgLy8gYWRkIHN1Ym1pdCBidXR0b25cclxuICAgICAgICBGb3JtLlN1Ym1pdEJ1dHRvbi5hZGQoKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBmb3JtIHN1Ym1pc3Npb24gdG8gdGFibGUgZGF0YVxyXG4gICAgICAgIE1vZGFsLlN1Ym1pdC5pbml0KHRoaXMuc3VibWl0TmV3Um93KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0Q29sdW1ucyhyZXNwb25zZXMpIHsgXHJcbiAgICAgICAgLy8gaWYgYSBuZXcgYXBwcm9wcmlhdGlvbiB3YXMgZW50ZXJlZCwgZml4IGl0XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlc1snYXBwcm9wJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ2FwcHJvcC1uYW1lJ10gPSBgJHtyZXNwb25zZXNbJ2FwcHJvcCddfSAtIE5ld2A7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBzYW1lIGZvciBjb3N0IGNlbnRlclxyXG4gICAgICAgIGlmIChyZXNwb25zZXNbJ2NjJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ2NjLW5hbWUnXSA9IGAke3Jlc3BvbnNlc1snY2MnXX0gLSBOZXdgO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIGdldCBudW1iZXJzIGZyb20gYWNjb3VudCBzdHJpbmcgbmFtZXNcclxuICAgICAgICBpZihyZXNwb25zZXNbJ2Z1bmQtbmFtZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydmdW5kJ10gPSBBY2NvdW50U3RyaW5nLmdldE51bWJlcihyZXNwb25zZXNbJ2Z1bmQtbmFtZSddKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKHJlc3BvbnNlc1snYXBwcm9wLW5hbWUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snYXBwcm9wJ10gPSBBY2NvdW50U3RyaW5nLmdldE51bWJlcihyZXNwb25zZXNbJ2FwcHJvcC1uYW1lJ10pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYocmVzcG9uc2VzWydjYy1uYW1lJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ2NjJ10gPSBBY2NvdW50U3RyaW5nLmdldE51bWJlcihyZXNwb25zZXNbJ2NjLW5hbWUnXSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihyZXNwb25zZXNbJ29iamVjdC1uYW1lJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ29iamVjdCddID0gQWNjb3VudFN0cmluZy5nZXROdW1iZXIocmVzcG9uc2VzWydvYmplY3QtbmFtZSddKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlc3BvbnNlc1snYWNjb3VudC1zdHJpbmcnXSA9IFxyXG4gICAgICAgICAgICBBY2NvdW50U3RyaW5nLmJ1aWxkKHJlc3BvbnNlc1snYXBwcm9wLW5hbWUnXSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzWydjYy1uYW1lJ10sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlc1snb2JqZWN0LW5hbWUnXSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzWydmdW5kJ10pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3VibWl0TmV3Um93KGV2ZW50KSB7XHJcbiAgICAgICAgLy8gZ2V0IGFuc3dlcnMgZnJvbSBmb3JtLCBoaWRlIGZvcm0sIHNob3cgYW5zd2VycyBpbiB0YWJsZVxyXG4gICAgICAgIHZhciByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBlZGl0IGlucHV0cyBmcm9tIG1vZGFsXHJcbiAgICAgICAgcmVzcG9uc2VzID0gdGhpcy5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxyXG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKHJlc3BvbnNlcylbMF0gIT0gJycpe1xyXG5cclxuICAgICAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xyXG4gICAgICAgICAgICBNb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBhZGQgZGF0YSB0byB0YWJsZVxyXG4gICAgICAgICAgICBUYWJsZS5Sb3dzLmFkZChyZXNwb25zZXMsIHRoaXMuY29sdW1ucyk7XHJcbiAgICAgICAgICAgIFRhYmxlLnNhdmUoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHJlYnVpbGQgdGFibGVcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJcclxuaW1wb3J0IFdlbGNvbWUgZnJvbSAnLi4vY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanMnO1xyXG5pbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uL2NvbnN0YW50cy9idWRnZXRfY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmlldyB9IGZyb20gJy4vdmlld19jbGFzcy5qcyc7XHJcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gJy4vdmlld19sb2dpYy5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgV2VsY29tZVZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICd3ZWxjb21lJztcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ1dlbGNvbWUnO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmF2QnV0dG9ucyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFRoaXMgdG9vbCB3aWxsIGhlbHAgeW91IHByZXBhcmUgeW91ciBidWRnZXQgcmVxdWVzdCBzdWJtaXNzaW9uIGZvciBmaXNjYWwgeWVhciBcclxuICAgICAgICAgICAgMjAke0ZJU0NBTF9ZRUFSfS4gU3RhcnQgYnkgdXBsb2FkaW5nIHRoZSBkZXRhaWwgc2hlZXQgc2VudCB0byB5b3UgYnkgeW91ciBidWRnZXQgYW5hbHlzdC4gVGhpc1xyXG4gICAgICAgICAgICB0b29sIHdpbGwgdXNlIHRoZSBkYXRhIGluIHRoYXQgc2hlZXQgdG8gcHJlLWZpbGwgeW91ciBzdWJtaXNzaW9uIHdpdGggbGFzdCB5ZWFyJ3MgcmVxdWVzdC5cclxuICAgICAgICAgICAgPGJyPjxicj5cclxuICAgICAgICAgICAgVGhlbiwgeW91IHdpbGwgYmUgZ3VpZGVkIHRocm91Z2ggZWFjaCBmdW5kIHRvIG1ha2UgYW55IGFkanVzdG1lbnRzIGZyb20gbGFzdCB5ZWFyJ3MgcmVxdWVzdC4gXHJcbiAgICAgICAgICAgIEFzIHlvdSBcclxuICAgICAgICAgICAgbWFrZSB0aGVzZSBhZGp1c3RtZW50cywgeW91IHdpbGwgc2VlIGEgc2lkZWJhciB0cmFja2luZyB5b3VyIHRvdGFsIGV4cGVuZGl0dXJlcyBieSBmdW5kIGFuZCB5b3VyIHRhcmdldFxyXG4gICAgICAgICAgICBiYXNlbGluZSBmb3IgdGhlIGdlbmVyYWwgZnVuZC4gXHJcbiAgICAgICAgICAgIDxicj48YnI+XHJcbiAgICAgICAgICAgIE9uY2UgeW91IGdldCB0aHJvdWdoIGFsbCBmdW5kcyBhbmQgc2V0IHlvdXIgcmVxdWVzdCBhdCBvciBiZWxvdyB0aGUgXHJcbiAgICAgICAgICAgIHRhcmdldCwgeW91IHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCBhIGZpbGxlZCB2ZXJzaW9uIG9mIHRoZSBFeGNlbCBkZXRhaWwgc2hlZXQuIERvd25sb2FkaW5nIFxyXG4gICAgICAgICAgICB0aGlzIGZpbGUgaXMgdGhlIG9ubHkgcGVybWFuZW50IHdheSB0byBzYXZlIHlvdXIgcHJvZ3Jlc3MuYFxyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gc2hvdyB3ZWxjb21lIHNlY3Rpb25cclxuICAgICAgICBXZWxjb21lLnNob3coKTtcclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBsaW5rcyBpbiBidXR0b25zXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtdXBsb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB2aXNpdFBhZ2UoJ3VwbG9hZCcpKTtcclxuICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1pbml0aWF0aXZlcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdmlzaXRQYWdlKCduZXctaW5pdHMnKSk7XHJcbiAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtcmV2ZW51ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdmlzaXRQYWdlKCdiYXNlbGluZS1sYW5kaW5nJykpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLWZpbmlzaCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdmlzaXRQYWdlKCdzdW1tYXJ5JykpO1xyXG5cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlbGNvbWVWaWV3O1xyXG4iLCJpbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5cclxuaW1wb3J0IEZpbGVVcGxvYWQgZnJvbSBcIi4uL2NvbXBvbmVudHMvZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuanNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBVcGxvYWRWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAndXBsb2FkJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBVcGxvYWQgdGhlIGJhc2VsaW5lIGRldGFpbCBzaGVldCBnaXZlbiBieSB5b3VyIGJ1ZGdldCBhbmFseXN0LmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdFeGNlbCBVcGxvYWQnO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcbiAgICAgICAgRmlsZVVwbG9hZC5zaG93KCk7XHJcbiAgICAgICAgRmlsZVVwbG9hZC5pbml0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZFZpZXc7IiwiaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcclxuaW1wb3J0IFRhYmxlIGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gXCIuLi9tb2RlbHMvY3VycmVudF9mdW5kLmpzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRnVuZFZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdiYXNlbGluZS1sYW5kaW5nJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBXZSB3aWxsIG5vdyBhc2sgeW91IGEgc2VyaWVzIG9mIHF1ZXN0aW9ucyBhYm91dCB5b3VyIEJBU0VMSU5FIGJ1ZGdldCByZXF1ZXN0LlxyXG4gICAgICAgICAgICBBdCB0aGUgZW5kLCB3ZSB3aWxsIGFzayB5b3UgYWJvdXQgYW55IG5ldyBpbml0aWF0aXZlcyAoaWUuIHN1cHBsZW1lbnRhbCByZXF1ZXN0cykuXHJcbiAgICAgICAgICAgIFNlbGVjdCBvbmUgb2YgeW91ciBmdW5kcyB0aGVuIGNsaWNrIGNvbnRpbnVlLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdCYXNlbGluZSBCdWRnZXQgUmVxdWVzdCc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBGdW5kVGFibGUoKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBmdW5kIHNlbGVjdGlvblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XHJcbiAgICAgICAgc3VwZXIudmlzaXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRnVuZFRhYmxlIGV4dGVuZHMgVmlld1RhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCByZXZlbnVlIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRnVuZCcsIGNsYXNzTmFtZTogJ2Z1bmQtbmFtZScgfVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyBmdW5kcyBmb3VuZC4nXHJcbiAgICAgICAgdGhpcy5hZGRFZGl0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGQoKXtcclxuICAgICAgICAvLyBsb2FkIGluIGZ1bmQgZGF0YVxyXG4gICAgICAgIFRhYmxlLnNob3coKTtcclxuICAgICAgICBUYWJsZS5EYXRhLmxvYWRGdW5kcygpO1xyXG4gICAgICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3Nlcyh0aGlzLmNvbHVtbnMpO1xyXG4gICAgICAgIFRhYmxlLmFkanVzdFdpZHRoKCczMCUnKTtcclxuXHJcbiAgICAgICAgLy8gZGlzYWJsZSBuZXh0IGJ1dHRvbiB1bnRpbCBhIGZ1bmQgaXMgc2VsZWN0ZWRcclxuICAgICAgICBOYXZCdXR0b25zLk5leHQuZGlzYWJsZSgpO1xyXG4gICAgICAgIGFsbG93Um93U2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBhbGxvd1Jvd1NlbGVjdGlvbigpe1xyXG4gICAgXHJcbiAgICB2YXIgdGFibGVSb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInRib2R5IHRyXCIpO1xyXG4gICAgXHJcbiAgICAvLyBlbmFibGUgaGlnaGxpZ2h0IG9uIGhvdmVyIGFuZCBvbiBzZWxlY3RcclxuICAgIHRhYmxlUm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xyXG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdob3Zlci1lZmZlY3QnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKCdob3Zlci1lZmZlY3QnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgc2VsZWN0RnVuZCh0YWJsZVJvd3MsIHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlbGVjdEZ1bmQodGFibGVSb3dzLCBzZWxlY3RlZF9yb3cpe1xyXG5cclxuICAgIC8vIHJlbW92ZSBzZWxlY3RlZCBjbGFzcyBmcm9tIGFueSBvdGhlciByb3dzXHJcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbih0YWJsZVJvdykge1xyXG4gICAgICAgIHRhYmxlUm93LmNsYXNzTGlzdCA9ICcnO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gYWRkIHNlbGVjdGVkIGNsYXNzIHRvIGNsaWNrZWQgcm93XHJcbiAgICBzZWxlY3RlZF9yb3cuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAvLyBnZXQgZnVuZCBhbmQgc2F2ZSBzZWxlY3RlZCBmdW5kXHJcbiAgICB2YXIgZnVuZCA9IHNlbGVjdGVkX3Jvdy5xdWVyeVNlbGVjdG9yKCcuZnVuZC1uYW1lJykudGV4dENvbnRlbnQ7XHJcbiAgICB2YXIgZnVuZE51bWJlciA9IHBhcnNlSW50KGZ1bmQpO1xyXG4gICAgQ3VycmVudEZ1bmQudXBkYXRlKGZ1bmROdW1iZXIpO1xyXG5cclxuICAgIC8vIGVuYWJsZSBuZXh0IHN0ZXBcclxuICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuZFZpZXc7IiwiaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5cclxuaW1wb3J0IFRhYmxlIGZyb20gJy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJldmVudWVWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdyZXZlbnVlJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBSZXZpZXcgYW5kIGVkaXQgcmV2ZW51ZSBsaW5lIGl0ZW1zLiBJZiB5b3UgY2hhbmdlIHRoZSBlc3RpbWF0ZSBvciBcclxuICAgICAgICAgICAgbm90aWNlIGFuIGVycm9yIGluIGFuIGFjY291bnQgc3RyaW5nLCBwbGVhc2Ugbm90ZSBpdCBpbiB0aGUgbm90ZXMgY29sdW1uLiBDbGljayBlZGl0IFxyXG4gICAgICAgICAgICB0byBjaGFuZ2UgdmFsdWVzIGluIGEgcm93LmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdSZXZlbnVlcyc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBSZXZlbnVlVGFibGUoZmlzY2FsX3llYXIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBSZXZlbnVlVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcmV2ZW51ZSBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnUmVjdXJyaW5nIG9yIE9uZS1UaW1lJywgY2xhc3NOYW1lOiAncmVjdXJyaW5nJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QgQ2F0ZWdvcnknLCBjbGFzc05hbWU6ICdvYmplY3QtY2F0ZWdvcnknfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogYEZZJHtmaXNjYWxfeWVhcn0gRGVwYXJ0bWVudGFsIEVzdGltYXRlIFRvdGFsYCwgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXBhcnRtZW50YWwgRXN0aW1hdGUgTm90ZXMnLCBjbGFzc05hbWU6ICdub3Rlcyd9LFxyXG4gICAgICAgICAgICAvLyBoaWRkZW5cclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCBOYW1lJywgY2xhc3NOYW1lOiAnb2JqZWN0LW5hbWUnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCcsIGNsYXNzTmFtZTogJ29iamVjdCcsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gcmV2ZW51ZXMgZm9yIHRoaXMgZnVuZC4nXHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrOiBtYWtlIGNlbGxzIGVkaXRhYmxlXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IFxyXG4gICAgICAgIC8vIG9ubHkgYWxsb3cgZWRpdHMgaW4gdGhlIG5vdGVzIGJveFxyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm90ZXMnLCBmYWxzZSwgJ3RleHRhcmVhJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJldmVudWVWaWV3OyIsImltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuXHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xyXG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanNcIjtcclxuXHJcbmltcG9ydCB7IFNlcnZpY2VzLCBGdW5kTG9va3VwVGFibGUgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgdW5mb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IHsgRU1QTE9ZRUVfVFlQRVMgfSBmcm9tICcuLi9jb25zdGFudHMvYnVkZ2V0X2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCBHb2xkQm9vayBmcm9tICcuLi9tb2RlbHMvZ29sZF9ib29rLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25uZWxWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdwZXJzb25uZWwnO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFxyXG4gICAgICAgICAgICBUaGlzIHRhYmxlIGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgRlRFcyBpbiBlYWNoIGpvYiBjb2RlIGZvciBpbiB5b3VyIGRlcGFydG1lbnQncyBcclxuICAgICAgICAgICAgY3VycmVudCAoYW1lbmRlZCkgRlkyNSBidWRnZXQuIFRvIG1ha2UgZWRpdHMgdG8gdGhlIG51bWJlciBvZiBwb3NpdGlvbnMsIGNsaWNrIHRoZVxyXG4gICAgICAgICAgICBcIkVkaXRcIiBidXR0b24gb24gdGhlIHJvdyB5b3Ugd291bGQgbGlrZSB0byBlZGl0LiBUaGUgXCJUb3RhbCBDb3N0XCIgY29sdW1uIGFuZCB0aGUgXHJcbiAgICAgICAgICAgIHN1bW1hcnkgc2lkZWJhciB3aWxsIGFsc28gdXBkYXRlIHRvIHJlZmxlY3QgYW55IGVkaXRzLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdQZXJzb25uZWwnO1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBuZXcgUGVyc29ubmVsVGFibGUoZmlzY2FsX3llYXIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuY2xhc3MgUGVyc29ubmVsVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmZpc2NhbF95ZWFyID0gZmlzY2FsX3llYXI7XHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcGVyc29ubmVsIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdKb2IgVGl0bGUnLCBjbGFzc05hbWU6ICdqb2ItbmFtZScgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0pvYiBDb2RlJywgY2xhc3NOYW1lOiAnam9iLWNvZGUnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdFbXBsb3llZSBUeXBlJywgY2xhc3NOYW1lOiAnZW1wbG95ZWUtdHlwZSd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZTogJ3NlcnZpY2UnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7dGhpcy5maXNjYWxfeWVhcn0gUmVxdWVzdGVkIEZURWAsIGNsYXNzTmFtZTogJ2Jhc2VsaW5lLWZ0ZXMnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7dGhpcy5maXNjYWxfeWVhcn0gUHJvamVjdGVkIEF2ZXJhZ2UgU2FsYXJ5L1dhZ2VgLCBjbGFzc05hbWU6ICdhdmctc2FsYXJ5JywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdUb3RhbCBTYWwvV2FnICYgQmVuIFJlcXVlc3QnLCBjbGFzc05hbWU6ICd0b3RhbC1iYXNlbGluZScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVwYXJ0bWVudGFsIFJlcXVlc3QgTm90ZXMnLCBjbGFzc05hbWU6ICdub3Rlcyd9LFxyXG4gICAgICAgICAgICAvLyBoaWRkZW4gY29sdW1uc1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRnJpbmdlIEJlbmVmaXRzIFJhdGUnLCBjbGFzc05hbWU6ICdmcmluZ2UnLCBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdHZW5lcmFsIEluY3JlYXNlIFJhdGUnLCBjbGFzc05hbWU6ICdnZW5lcmFsLWluY3JlYXNlLXJhdGUnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1N0ZXAvTWVyaXQgSW5jcmVhc2UgUmF0ZScsIGNsYXNzTmFtZTogJ21lcml0LWluY3JlYXNlLXJhdGUnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogYEF2ZXJhZ2UgU2FsYXJ5L1dhZ2UgYXMgb2YgOS8xLzIwJHt0aGlzLmZpc2NhbF95ZWFyLTJ9YCwgY2xhc3NOYW1lOiAnY3VycmVudC1zYWxhcnknLCBpc0Nvc3Q6IHRydWUsIGhpZGU6IHRydWV9XHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyBwZXJzb25uZWwgZXhwZW5kaXR1cmVzIGZvciB0aGlzIGZ1bmQuJ1xyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uVGV4dCA9ICdBZGQgbmV3IGpvYicgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFjdGlvbiBvbiByb3cgZWRpdCBjbGljazogbWFrZSBjZWxscyBlZGl0YWJsZVxyXG4gICAgYWN0aW9uT25FZGl0KCkgeyBcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ2Jhc2VsaW5lLWZ0ZXMnKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVNlcnZpY2VEcm9wZG93bihTZXJ2aWNlcy5saXN0KCkpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm90ZXMnLCBmYWxzZSwgJ3RleHRhcmVhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVGFibGUoKXtcclxuICAgICAgICAvLyBjYWxjdWxhdGUgZm9yIGVhY2ggcm93XHJcbiAgICAgICAgbGV0IHJvd3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndHInKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJvd3MubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAvLyBmZXRjaCB2YWx1ZXMgZm9yIGNhbGN1bGF0aW9uc1xyXG4gICAgICAgICAgICBsZXQgYXZnX3NhbGFyeSA9IFRhYmxlLkNlbGwuZ2V0VmFsdWUocm93c1tpXSwgJ2F2Zy1zYWxhcnknKTtcclxuICAgICAgICAgICAgbGV0IGZyaW5nZSA9IHBhcnNlRmxvYXQoVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdmcmluZ2UnKSk7XHJcbiAgICAgICAgICAgIGxldCBiYXNlbGluZV9mdGVzID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdiYXNlbGluZS1mdGVzJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWF0ZSAjRlRFcyB4IGF2ZXJhZ2Ugc2FsYXJ5ICsgQ09MQSBhZGp1c3RtZW50cyArIG1lcml0IGFkanVzdG1lbnRzICsgZnJpbmdlXHJcbiAgICAgICAgICAgIGxldCB0b3RhbF9iYXNlbGluZV9jb3N0ID0gYXZnX3NhbGFyeSAqIGJhc2VsaW5lX2Z0ZXMgKiAoMSArIGZyaW5nZSk7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG90YWwgY29sdW1uXHJcbiAgICAgICAgICAgIFRhYmxlLkNlbGwudXBkYXRlVmFsdWUocm93c1tpXSwgJ3RvdGFsLWJhc2VsaW5lJywgdG90YWxfYmFzZWxpbmVfY29zdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTYXZlIHRoZSB0YWJsZSBhZnRlciBhbGwgdXBkYXRlcyBhcmUgZG9uZVxyXG4gICAgICAgIFRhYmxlLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDdXN0b21RdWVzdGlvbnMoKXtcclxuICAgICAgICAvLyBmb3JtIHF1ZXN0aW9ucyB0byBhZGQgYSBuZXcgam9iXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0pvYiBDb2RlOicsICdqb2ItY29kZScsIHRydWUpOyBcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnSm9iIFRpdGxlOicsICdqb2ItbmFtZScsIHRydWUpOyBcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdFbXBsb3llZSBUeXBlOicsICdlbXBsb3llZS10eXBlJywgRU1QTE9ZRUVfVFlQRVMsIHRydWUpLFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0FwcHJvcHJpYXRpb246JywgJ2FwcHJvcC1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldEFwcHJvcHMoJ0FkZCBuZXcnKSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignQ29zdCBDZW50ZXI6JywgJ2NjLW5hbWUnLCBGdW5kTG9va3VwVGFibGUuZ2V0Q29zdENlbnRlcnMoJ0FkZCBuZXcnKSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignU2VydmljZScsICdzZXJ2aWNlJywgU2VydmljZXMubGlzdCgpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnTnVtYmVyIG9mIEZURXMgcmVxdWVzdGVkOicsICdiYXNlbGluZS1mdGVzJywgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoYFByb2plY3RlZCBhdmVyYWdlIHNhbGFyeSBJTiBGSVNDQUwgWUVBUiAke3RoaXMuZmlzY2FsX3llYXJ9OmAsICdhdmctc2FsYXJ5JywgdHJ1ZSk7XHJcbiAgICAgICAgLy9Gb3JtLk5ld0ZpZWxkLnNob3J0VGV4dChgRXhwZWN0ZWQgZnJpbmdlIHJhdGUgKGFzIGEgcGVyY2VudGFnZSlgLCAnZnJpbmdlJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTW9kYWxWYWxpZGF0aW9uKCl7XHJcblxyXG4gICAgICAgIHN1cGVyLmFkZE1vZGFsVmFsaWRhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBsb2NrIHRoZSBqb2IgZGVzY3JpcHRpb24gXHJcbiAgICAgICAgY29uc3Qgam9iRGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLW5hbWUnKTtcclxuICAgICAgICBqb2JEZXNjcmlwdGlvbi5yZWFkT25seSA9IHRydWU7XHJcbiAgICAgICAgLy8gZ2l2ZSBhIG1lc3NhZ2UgaWYgYXR0ZW1wdCB0byBlZGl0XHJcbiAgICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb25UZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1uYW1lLXZhbGlkYXRpb24nKTtcclxuICAgICAgICBqb2JEZXNjcmlwdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBuYW1lVmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSAnVGhpcyBmaWVsZCBpcyBub3QgZWRpdGFibGUgYW5kIHdpbGwgYXV0by1maWxsIGZyb20gdGhlIGpvYiBjb2RlIGFib3ZlLic7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gaGlkZSBtZXNzYWdlIG9uIGJsdXJcclxuICAgICAgICBqb2JEZXNjcmlwdGlvbi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIG5hbWVWYWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25maXJtIHRoYXQgZW50ZXJlZCBqb2IgY29kZSBpcyBpbiB0aGUgZ29sZCBib29rXHJcbiAgICAgICAgY29uc3Qgam9iQ29kZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1jb2RlJyk7XHJcbiAgICAgICAgam9iQ29kZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIGdldCBlbnRlcmVkIGpvYiBjb2RlXHJcbiAgICAgICAgICAgIGNvbnN0IGpvYkNvZGUgPSBqb2JDb2RlSW5wdXQudmFsdWU7XHJcbiAgICAgICAgICAgIC8vIGdldCB2YWxpZGF0aW9uIHRleHQgZWxlbWVudFxyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItY29kZS12YWxpZGF0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmICghR29sZEJvb2suY29kZUV4aXN0cyhqb2JDb2RlKSl7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgam9iIGNvZGUgZG9lc24ndCBleGlzdCwgc2hvdyBhbiBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICdUaGlzIGpvYiBjb2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IEdvbGQgQm9vay4gUGxlYXNlIGVudGVyIGFub3RoZXIgY29kZS4nO1xyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIGFueSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgam9iIHRpdGxlIFxyXG4gICAgICAgICAgICAgICAgam9iRGVzY3JpcHRpb24udmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgZXhpc3QsIGNoYW5nZSB0aGUgam9iIHRpdGxlIGFjY29yZGluZ2x5XHJcbiAgICAgICAgICAgICAgICBqb2JEZXNjcmlwdGlvbi52YWx1ZSA9IEdvbGRCb29rLmdldFRpdGxlKGpvYkNvZGUpO1xyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIGFueSBlcnJvciBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRDb2x1bW5zKHJlc3BvbnNlcyl7XHJcbiAgICAgICAgcmVzcG9uc2VzID0gc3VwZXIuZWRpdENvbHVtbnMocmVzcG9uc2VzKTtcclxuICAgICAgICAvLyBlZGl0IGlucHV0cyBmcm9tIG1vZGFsXHJcbiAgICAgICAgcmVzcG9uc2VzWydhdmctc2FsYXJ5J10gPSB1bmZvcm1hdEN1cnJlbmN5KHJlc3BvbnNlc1snYXZnLXNhbGFyeSddKTtcclxuICAgICAgICAvLyB1c2UgZ29sZCBib29rIHRvIGxvb2sgdXAgaW5mbyBiYXNlZCBvbiBqb2IgY29kZVxyXG4gICAgICAgIHJlc3BvbnNlc1snam9iLW5hbWUnXSA9IEdvbGRCb29rLmdldFRpdGxlKHJlc3BvbnNlc1snam9iLWNvZGUnXSk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydmcmluZ2UnXSA9IEdvbGRCb29rLmdldEZyaW5nZVJhdGUocmVzcG9uc2VzWydqb2ItY29kZSddKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQZXJzb25uZWxWaWV3OyIsIlxyXG5cclxuaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qcyc7XHJcbmltcG9ydCBGb3JtIGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzJztcclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBTZXJ2aWNlcyB9IGZyb20gJy4uL21vZGVscy8nO1xyXG5pbXBvcnQgeyB1bmZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgT1RfT0JKRUNUUyB9IGZyb20gJy4uL2NvbnN0YW50cy8nO1xyXG5cclxuZXhwb3J0IGNsYXNzIE92ZXJ0aW1lVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnb3ZlcnRpbWUnO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFxyXG4gICAgICAgICAgICBQbGVhc2Ugc2VlIHlvdXIgYmFzZWxpbmUgb3ZlcnRpbWUgLyBob2xpZGF5IHBheSAvIHNoaWZ0IHByZW1pdW1zIGluIHRoZSB0YWJsZSBiZWxvdy5cclxuICAgICAgICAgICAgTWFrZSBhbnkgZWRpdHMgYW5kIGNvbnRpbnVlLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdPdmVydGltZSBFc3RpbWF0ZXMnO1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBuZXcgT3ZlcnRpbWVUYWJsZShmaXNjYWxfeWVhcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIE92ZXJ0aW1lVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgT1QgY29sdW1ucyB0byB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuY29uY2F0KFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1NlcnZpY2UnLCBjbGFzc05hbWU6ICdzZXJ2aWNlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnUmVjdXJyaW5nIG9yIE9uZS1UaW1lJywgY2xhc3NOYW1lOiAncmVjdXJyaW5nJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXBhcnRtZW50YWwgUmVxdWVzdCBPVC9TUC9Ib2wnLCBjbGFzc05hbWU6ICdPVC1wYXknLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogYEZZJHtmaXNjYWxfeWVhcn0gVG90YWwgT1QvU1AvSG9sICsgRklDQSBSZXF1ZXN0YCwgY2xhc3NOYW1lIDogJ3RvdGFsJywgaXNDb3N0OiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCBOYW1lJywgY2xhc3NOYW1lOiAnb2JqZWN0LW5hbWUnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBSZXF1ZXN0IE5vdGVzJywgY2xhc3NOYW1lOiAnbm90ZXMnfSxcclxuICAgICAgICAgICAgLy8gaGlkZGVuIGNvbHVtbnNcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0ZJQ0EgUmF0ZScsIGNsYXNzTmFtZTogJ2ZpY2EnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gJ05vIG92ZXJ0aW1lIGV4cGVuZGl0dXJlcyBmb3IgdGhpcyBmdW5kLidcclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBjb3N0IGNlbnRlcicgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFjdGlvbiBvbiByb3cgZWRpdCBjbGljazogbWFrZSBjZWxscyBlZGl0YWJsZVxyXG4gICAgYWN0aW9uT25FZGl0KCkgeyBcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ09ULXBheScsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlU2VydmljZURyb3Bkb3duKFNlcnZpY2VzLmxpc3QoKSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVEcm9wZG93bigncmVjdXJyaW5nJywgWydPbmUtVGltZScsICdSZWN1cnJpbmcnXSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVEcm9wZG93bignb2JqZWN0LW5hbWUnLCBPVF9PQkpFQ1RTKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vdGVzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVGFibGUoKXtcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xyXG4gICAgICAgIGxldCByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgICAgICAgbGV0IE9UX3NhbGFyeSA9IFRhYmxlLkNlbGwuZ2V0VmFsdWUocm93c1tpXSwgJ09ULXBheScpO1xyXG4gICAgICAgICAgICBsZXQgZmljYV9yYXRlID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdmaWNhJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgc2FsYXJ5IGFuZCB3YWdlcyBhbmQgZnJpbmdlIGJlbmVmaXRzIChGSUNBKVxyXG4gICAgICAgICAgICBsZXQgcm93X3RvdGFsID0gT1Rfc2FsYXJ5ICogKDEgKyBwYXJzZUZsb2F0KGZpY2FfcmF0ZSkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvdGFsXHJcbiAgICAgICAgICAgIFRhYmxlLkNlbGwudXBkYXRlVmFsdWUocm93c1tpXSwgJ3RvdGFsJywgcm93X3RvdGFsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNhdmUgdGhlIHRhYmxlIGFmdGVyIGFsbCB1cGRhdGVzIGFyZSBkb25lXHJcbiAgICAgICAgVGFibGUuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpe1xyXG4gICAgICAgIC8vIGZvcm0gcXVlc3Rpb25zIHRvIGFkZCBhIG5ldyBqb2JcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdBcHByb3ByaWF0aW9uOicsICdhcHByb3AtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRBcHByb3BzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Nvc3QgQ2VudGVyOicsICdjYy1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldENvc3RDZW50ZXJzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ09iamVjdCAoc2FsYXJ5IG9yIHdhZ2UpOicsICdvYmplY3QtbmFtZScsIE9UX09CSkVDVFMsIHRydWUpOyBcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdTZXJ2aWNlJywgJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ1JlY3VycmluZyBvciBPbmUtVGltZScsICdyZWN1cnJpbmcnLCBbJ1JlY3VycmluZycsICdPbmUtVGltZSddLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnT3ZlcnRpbWUgYW1vdW50IHJlcXVlc3RlZDonLCAnT1QtcGF5JywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKXtcclxuICAgICAgICByZXNwb25zZXMgPSBzdXBlci5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIC8vIGVkaXQgaW5wdXRzIGZyb20gbW9kYWxcclxuICAgICAgICByZXNwb25zZXNbJ09ULXBheSddID0gdW5mb3JtYXRDdXJyZW5jeShyZXNwb25zZXNbJ09ULXBheSddKTtcclxuICAgICAgICByZXNwb25zZXNbJ2ZpY2EnXSA9IDAuMDc2NTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBPdmVydGltZVZpZXc7IiwiaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5pbXBvcnQgRm9ybSBmcm9tICcuLi9jb21wb25lbnRzL2Zvcm0vZm9ybS5qcyc7XHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBTZXJ2aWNlcyB9IGZyb20gJy4uL21vZGVscy8nO1xyXG5pbXBvcnQgeyB1bmZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgT0JKX0NBVEVHT1JJRVMgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOb25QZXJzb25uZWxWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdub25wZXJzb25uZWwnO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFJldmlldyBhbmQgZWRpdCBub24tcGVyc29ubmVsIGxpbmUgaXRlbXMuIFRoZSBDUEEgbnVtYmVycyBhcmUgdGhlIFxyXG4gICAgICAgICAgICBDb250cmFjdCBhbmQgUHJvY3VyZW1lbnQgQWNjb3VudCBudW1iZXJzLiBDbGljayBvbiB0aGUgJ2RldGFpbCcgbGluayBmb3IgYSBDUEEgXHJcbiAgICAgICAgICAgIHRvIHNlZSB0aGUgY29udHJhY3QgZGV0YWlscy4gU29tZSBsaW5lIGl0ZW1zIHdvbid0IGhhdmUgYSBDUEEgbnVtYmVyLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdOb24tUGVyc29ubmVsJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IE5vblBlcnNvbm5lbFRhYmxlKGZpc2NhbF95ZWFyKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgTm9uUGVyc29ubmVsVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcGVyc29ubmVsIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7ZmlzY2FsX3llYXJ9IERlcGFydG1lbnRhbCBSZXF1ZXN0IFRvdGFsYCwgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZSA6ICdzZXJ2aWNlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnUmVjdXJyaW5nIG9yIE9uZS1UaW1lJywgY2xhc3NOYW1lOiAncmVjdXJyaW5nJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdWZW5kb3IgTmFtZScsIGNsYXNzTmFtZTogJ3ZlbmRvcid9LFxyXG4gICAgICAgICAgICB7IHRpdGxlIDogJ0NQQSAjJywgY2xhc3NOYW1lIDogJ2NwYSd9LFxyXG4gICAgICAgICAgICAvLyBoaWRkZW4gY29sdW1uc1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRW5kIERhdGUnLCBjbGFzc05hbWU6ICdjb250cmFjdC1lbmQnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0JQQS9DUEEgQW1vdW50IFJlbWFpbmluZycsIGNsYXNzTmFtZTogJ3JlbWFpbmluZycsIGlzQ29zdDogdHJ1ZSAsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IE5hbWUnLCBjbGFzc05hbWU6ICdvYmplY3QtbmFtZScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0JywgY2xhc3NOYW1lOiAnb2JqZWN0JywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QgQ2F0ZWdvcnknLCBjbGFzc05hbWU6ICdvYmplY3QtY2F0ZWdvcnknLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0JQQS9DUEEgRGVzY3JpcHRpb24nLCBjbGFzc05hbWU6ICdjcGEtZGVzY3JpcHRpb24nLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBSZXF1ZXN0IE5vdGVzJywgY2xhc3NOYW1lOiAnbm90ZXMnfSwgXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyBub24tcGVyc29ubmVsIGV4cGVuZGl0dXJlcyBmb3IgdGhpcyBmdW5kLidcclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBub24tcGVyc29ubmVsIGl0ZW0nIDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXF1ZXN0JywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVTZXJ2aWNlRHJvcGRvd24oKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdyZWN1cnJpbmcnLCBbJ09uZS1UaW1lJywgJ1JlY3VycmluZyddKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vdGVzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3VzdG9tUXVlc3Rpb25zKCl7XHJcbiAgICAgICAgLy8gZm9ybSBxdWVzdGlvbnMgdG8gYWRkIGEgbmV3IHJvd1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0FwcHJvcHJpYXRpb246JywgJ2FwcHJvcC1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldEFwcHJvcHMoJ0FkZCBuZXcnKSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignQ29zdCBDZW50ZXI6JywgJ2NjLW5hbWUnLCBGdW5kTG9va3VwVGFibGUuZ2V0Q29zdENlbnRlcnMoJ0FkZCBuZXcnKSwgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignT2JqZWN0IENhdGVnb3J5OicsICdvYmplY3QtY2F0ZWdvcnknLCBPQkpfQ0FURUdPUklFUy5saXN0LCB0cnVlKTtcclxuICAgICAgICAvLyBUT0RPOiBtYXliZSBnaXZlIGRyb3Bkb3duIGJhc2VkIG9uIHNlbGVjdGVkIG9iaiBjYXRlZ29yeVxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdPYmplY3QgTnVtYmVyIChpZiBrbm93bik6JywgJ29iamVjdCcsIGZhbHNlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdTZXJ2aWNlJywgJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoJ0Rlc2NyaWJlIHlvdXIgbmV3IHJlcXVlc3Q6JywgJ2NwYS1kZXNjcmlwdGlvbicsIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ1JlY3VycmluZyBvciBPbmUtVGltZScsICdyZWN1cnJpbmcnLCBbJ1JlY3VycmluZycsICdPbmUtVGltZSddLCB0cnVlKTsgXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0Ftb3VudCByZXF1ZXN0ZWQ6JywgJ3JlcXVlc3QnLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0Q29sdW1ucyhyZXNwb25zZXMpe1xyXG4gICAgICAgIHJlc3BvbnNlcyA9IHN1cGVyLmVkaXRDb2x1bW5zKHJlc3BvbnNlcyk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydhdmctc2FsYXJ5J10gPSB1bmZvcm1hdEN1cnJlbmN5KHJlc3BvbnNlc1snYXZnLXNhbGFyeSddKTtcclxuICAgICAgICByZXNwb25zZXNbJ2ZyaW5nZSddID0gcGFyc2VGbG9hdChyZXNwb25zZXNbJ2ZyaW5nZSddKSAvIDEwMDtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb25QZXJzb25uZWxWaWV3OyIsIlxyXG5pbXBvcnQgeyBWaWV3LCBWaWV3VGFibGUgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnXHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xyXG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanNcIjtcclxuaW1wb3J0IEZ1bmRMb29rdXBUYWJsZSBmcm9tICcuLi9tb2RlbHMvZnVuZF9sb29rdXBfdGFibGUuanMnO1xyXG5pbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uL2NvbnN0YW50cy8nO1xyXG5pbXBvcnQgQWNjb3VudFN0cmluZyBmcm9tICcuLi9tb2RlbHMvYWNjb3VudF9zdHJpbmcuanMnO1xyXG5cclxuXHJcbmNvbnN0IGRyb3Bkb3duT3B0aW9ucyA9IFsnTi9BJywgJ09uZS1UaW1lJywgJ1JlY3VycmluZyddXHJcblxyXG4vLyBzZXQgdXAgcGFnZSBhbmQgaW5pdGlhbGl6ZSBhbGwgYnV0dG9uc1xyXG5leHBvcnQgY2xhc3MgSW5pdGlhdGl2ZXNWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnbmV3LWluaXRzJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBcclxuICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGxhY2UgdG8gcHJvcG9zZSBuZXcgaW5pdGlhdGl2ZXMgZm9yIEZZJHtGSVNDQUxfWUVBUn0uXHJcbiAgICAgICAgICAgIE5ldyBpbml0aWF0aXZlIHN1Ym1pc3Npb25zIHdpbGwgY291bnQgYXMgc3VwcGxlbWVudGFsIGxpbmUgaXRlbXMgYW5kIHdpbGwgYmUgdGhlIHN0YXJ0aW5nIFxyXG4gICAgICAgICAgICBwb2ludCBmb3IgYSBjb252ZXJzYXRpb24gd2l0aCBib3RoIE9CIGFuZCBPREZTLCB3aG8gd2lsbCBoZWxwIHdpdGggdGhlIGRldGFpbHMuYDtcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ05ldyBJbml0aWF0aXZlcyc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBJbml0aWF0aXZlc1RhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmlzaXQoKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGZ1bmQgc2VsZWN0aW9uXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJmdW5kXCIsICcnKTtcclxuICAgICAgICBzdXBlci52aXNpdCgpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuY2xhc3MgSW5pdGlhdGl2ZXNUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgY29sdW1ucyB0byB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGdW5kJywgY2xhc3NOYW1lOiAnZnVuZCd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU3VwcGxlbWVudGFsIEluaXRpYXRpdmUnLCBjbGFzc05hbWU6ICdpbml0LW5hbWUnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdUb3RhbCBJbml0aWF0aXZlIFJlcXVlc3QnLCBjbGFzc05hbWU6ICd0b3RhbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAvLyB7IHRpdGxlOiAnUGVyc29ubmVsIEZURScsIGNsYXNzTmFtZTogJ2Z0ZXMnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1BlcnNvbm5lbCBTYWxhcnkgJiBCZW5lZml0cycsIGNsYXNzTmFtZTogJ3BlcnNvbm5lbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnTm9uLVBlcnNvbm5lbCBPcGVyYXRpbmcnLCBjbGFzc05hbWU6ICdub25wZXJzb25uZWwnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ05vbi1QZXJzb25uZWwgQ2FwaXRhbCcsIGNsYXNzTmFtZTogJ25vbnBlcnNvbm5lbC1jYXBpdGFsJywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIC8vIHsgdGl0bGU6ICdSZXZlbnVlJywgY2xhc3NOYW1lOiAncmV2ZW51ZScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAvLyB7IHRpdGxlOiAnUmV2ZW51ZSBUeXBlJywgY2xhc3NOYW1lOiAncmV2LXR5cGUnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXNjcmlwdGlvbiAmIEp1c3RpZmljYXRpb24nLCBjbGFzc05hbWU6ICdub3RlcycgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1JlY3VycmluZyBvciBPbmUtVGltZScsIGNsYXNzTmFtZTogJ3Jldi10eXBlJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdFZGl0JywgY2xhc3NOYW1lOiAnZWRpdCcgfVxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uVGV4dCA9ICdBZGQgbmV3IGluaXRpYXRpdmUnIDtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDdXN0b21RdWVzdGlvbnMoKXtcclxuXHJcbiAgICAgICAgLy8gZ2VuZXJhbCBxdWVzdGlvbnNcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnSW5pdGlhdGl2ZSBOYW1lOicsICdpbml0LW5hbWUnLCB0cnVlKTsgXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dCgnV2hhdCBpcyB0aGUgYnVzaW5lc3MgY2FzZSBmb3IgdGhlIEluaXRpYXRpdmU/JywgJ3ExJywgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dChgV2h5IGlzIHRoZSBpbml0aWF0aXZlIG5lZWRlZD8gV2hhdCBpcyB0aGUgdmFsdWUtYWRkIHRvIHJlc2lkZW50cz8gXHJcbiAgICAgICAgICAgIFdoYXQgaXMgdGhlIERlcGFydG1lbnTigJlzIHBsYW4gZm9yIGltcGxlbWVudGluZyB0aGUgSW5pdGlhdGl2ZT9gLCAncTInLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmxvbmdUZXh0KGBXaHkgY2Fu4oCZdCB0aGUgSW5pdGlhdGl2ZSBiZSBmdW5kZWQgd2l0aCB0aGUgRGVwYXJ0bWVudOKAmXMgYmFzZWxpbmUgYnVkZ2V0P2AsICdxMycsIHRydWUpO1xyXG5cclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKGBJcyB0aGlzIGluaXRpYXRpdmUgb25lLXRpbWUgb3IgcmVjdXJyaW5nP2AsIFxyXG4gICAgICAgICAgICAncmV2LXR5cGUnLCBkcm9wZG93bk9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvLyBBY2NvdW50IHN0cmluZyBpbmZvXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignRnVuZDonLCAnZnVuZC1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmxpc3RGdW5kTmFtZXMoJ0FkZCBuZXcnKSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIE51bWJlcnNcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLm51bWVyaWNJbnB1dCgnV2hhdCBpcyB5b3VyIGJhbGxwYXJrIGVzdGltYXRlIG9mIFRPVEFMIEFERElUT05BTCBleHBlbnNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbml0aWF0aXZlPycsIFxyXG4gICAgICAgICAgICAndG90YWwnLCBmYWxzZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCBwZXJzb25uZWwgY29zdD8nLCAncGVyc29ubmVsJywgZmFsc2UpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgbm9ucGVyc29ubmVsIG9wZXJhdGluZyBjb3N0PycsICdub25wZXJzb25uZWwnLCBmYWxzZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCBub25wZXJzb25uZWwgY2FwaXRhbCBjb3N0cz8nLCAnbm9ucGVyc29ubmVsLWNhcGl0YWwnLCBmYWxzZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCByZXZlbnVlIChpZiBhcHBsaWNhYmxlKT8nLCAncmV2ZW51ZScsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0Q29sdW1ucyhyZXNwb25zZXMpIHtcclxuICAgICAgICByZXNwb25zZXNbJ2Z1bmQnXSA9IEFjY291bnRTdHJpbmcuZ2V0TnVtYmVyKHJlc3BvbnNlc1snZnVuZC1uYW1lJ10pO1xyXG4gICAgICAgIHJlc3BvbnNlc1snbm90ZXMnXSA9IGAke3Jlc3BvbnNlc1sncTEnXX0gJHtyZXNwb25zZXNbJ3EyJ119ICR7cmVzcG9uc2VzWydxMyddfWA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxuXHJcbiAgICBhZGRNb2RhbFZhbGlkYXRpb24oKSB7IFxyXG4gICAgICAgIHN1cGVyLmFkZFZhbGlkYXRpb25MaXN0ZW5lcignZnVuZC1uYW1lJywgJ0Z1bmQnLCAnZnVuZC12YWxpZGF0aW9uJywgNCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrOiBtYWtlIGNlbGxzIGVkaXRhYmxlXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IFxyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgndG90YWwnLCB0cnVlKTtcclxuICAgICAgICAvLyBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ3JldmVudWUnLCB0cnVlKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ3BlcnNvbm5lbCcsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm9ucGVyc29ubmVsJywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub25wZXJzb25uZWwtY2FwaXRhbCcsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnaW5pdC1uYW1lJyk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVEcm9wZG93bigncmV2LXR5cGUnLCBkcm9wZG93bk9wdGlvbnMpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm90ZXMnKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluaXRpYXRpdmVzVmlldzsiLCJpbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmltcG9ydCBCYXNlbGluZSBmcm9tICcuLi9tb2RlbHMvYmFzZWxpbmUuanMnO1xyXG5pbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmpzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXdfY2xhc3MuanNcIjtcclxuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCB7IGRvd25sb2FkWExTWCB9IGZyb20gXCIuLi91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBXZWxjb21lVmlldyBmcm9tICcuLzAwX3dlbGNvbWUuanMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVUb1RhcmdldCgpe1xyXG4gICAgY29uc3QgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmU7XHJcbiAgICBpZiAoYmFzZWxpbmUuZ2VuRnVuZFRvdGFsKCkgPD0gQmFzZWxpbmUudGFyZ2V0KCkpe1xyXG4gICAgICAgIFByb21wdC5UZXh0LnVwZGF0ZShgQ29uZ3JhdHMhIFlvdXIgR2VuZXJhbCBGdW5kIGJ1ZGdldCBpcyBiZWxvdyB5b3VyIHRhcmdldCEgXHJcbiAgICAgICAgICAgIEVkaXQgYW55IGxpbmUgaXRlbXMgYmVsb3cgb3IgZG93bmxvYWQgeW91ciBjb21wbGV0ZWQgRXhjZWwuYCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIFByb21wdC5UZXh0LnVwZGF0ZShgWW91ciBHZW5lcmFsIEZ1bmQgYnVkZ2V0IGlzIGFib3ZlIHlvdXIgR0YgdGFyZ2V0IG9mICR7Zm9ybWF0Q3VycmVuY3koQmFzZWxpbmUudGFyZ2V0KCkpfS4gXHJcbiAgICAgICAgICAgIFBsZWFzZSBleHBhbmQgdGhlIHN1bW1hcnkgdGFibGUgYmVsb3cgYW5kIGVkaXQgbGluZSBpdGVtcyB1bnRpbCB5b3UgbWVldCB5b3VyIHRhcmdldC4gXHJcbiAgICAgICAgICAgIFdoZW4geW91IG1lZXQgdGhlIHRhcmdldCwgeW91IHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCB0aGUgRXhjZWwgc2hlZXQuYCk7XHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgUHJvbXB0LnNob3coKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmV0dXJuVG9XZWxjb21lKCkge1xyXG4gICAgY29uc3Qgd2VsY29tZSA9IG5ldyBXZWxjb21lVmlldygpO1xyXG4gICAgY29uc3QgbGVmdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJyk7XHJcbiAgICB3ZWxjb21lLnZpc2l0KCk7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgU3VtbWFyeVZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdzdW1tYXJ5JztcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ1N1bW1hcnknO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGZ1bmRcclxuICAgICAgICBDdXJyZW50RnVuZC5yZXNldCgpO1xyXG5cclxuICAgICAgICAvLyBzaG93IHN1bW1hcnkgYWNjb3JkaW9uXHJcbiAgICAgICAgQWNjb3JkaW9uLmJ1aWxkKCk7XHJcbiAgICAgICAgQWNjb3JkaW9uLnNob3coKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIHByb21wdCBidXR0b25zXHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQudXBkYXRlVGV4dCgnRG93bmxvYWQgRXhjZWwnKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1N0YXJ0IG92ZXIgd2l0aCBuZXcgRXhjZWwgdXBsb2FkJyk7XHJcbiAgICAgICAgLy8gYWRkIGJ1dHRvbiBsaW5rc1xyXG4gICAgICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKHJldHVyblRvV2VsY29tZSk7XHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuYWRkQWN0aW9uKGRvd25sb2FkWExTWCk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBwcm9tcHQgdGV4dCBkZXBlbmRpbmcgb24gdGFyZ2V0IG1hdGNoaW5nXHJcbiAgICAgICAgY29tcGFyZVRvVGFyZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW51cCgpIHtcclxuICAgICAgICAvLyBkZWxldGUgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24ocmV0dXJuVG9XZWxjb21lKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5yZW1vdmVBY3Rpb24oZG93bmxvYWRYTFNYKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5lbmFibGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VtbWFyeVZpZXc7IiwiaW1wb3J0IFdlbGNvbWVWaWV3IGZyb20gJy4vMDBfd2VsY29tZS5qcyc7XHJcbmltcG9ydCBVcGxvYWRWaWV3IGZyb20gJy4vMDFfdXBsb2FkLmpzJztcclxuaW1wb3J0IEZ1bmRWaWV3IGZyb20gJy4vMDJfYmFzZWxpbmVfbGFuZGluZy5qcyc7XHJcbmltcG9ydCBSZXZlbnVlVmlldyBmcm9tICcuLzAzX3JldmVudWUuanMnO1xyXG5pbXBvcnQgUGVyc29ubmVsVmlldyBmcm9tICcuLzA0X3BlcnNvbm5lbC5qcyc7XHJcbmltcG9ydCBPdmVydGltZVZpZXcgZnJvbSAnLi8wNV9vdmVydGltZS5qcyc7XHJcbmltcG9ydCBOb25QZXJzb25uZWxWaWV3IGZyb20gJy4vMDZfbm9ucGVyc29ubmVsLmpzJztcclxuaW1wb3J0IEluaXRpYXRpdmVzVmlldyBmcm9tICcuLzA3X25ld19pbml0aWF0aXZlcy5qcyc7XHJcbmltcG9ydCBTdW1tYXJ5VmlldyBmcm9tICcuLzA4X3N1bW1hcnkuanMnO1xyXG5cclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBDdXJyZW50RnVuZCwgQ3VycmVudFBhZ2UgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbi8vIEluaXRpYWxpemUgcGFnZXMgZ2xvYmFsbHkgb25jZVxyXG5jb25zdCBQQUdFUyA9IHtcclxuICAgICd3ZWxjb21lJzogbmV3IFdlbGNvbWVWaWV3KCksXHJcbiAgICAndXBsb2FkJzogbmV3IFVwbG9hZFZpZXcoKSxcclxuICAgICdiYXNlbGluZS1sYW5kaW5nJzogbmV3IEZ1bmRWaWV3KCksXHJcbiAgICAncmV2ZW51ZSc6IG5ldyBSZXZlbnVlVmlldyhGSVNDQUxfWUVBUiksXHJcbiAgICAncGVyc29ubmVsJzogbmV3IFBlcnNvbm5lbFZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ292ZXJ0aW1lJzogbmV3IE92ZXJ0aW1lVmlldyhGSVNDQUxfWUVBUiksXHJcbiAgICAnbm9ucGVyc29ubmVsJzogbmV3IE5vblBlcnNvbm5lbFZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ25ldy1pbml0cyc6IG5ldyBJbml0aWF0aXZlc1ZpZXcoKSxcclxuICAgICdzdW1tYXJ5JzogbmV3IFN1bW1hcnlWaWV3KClcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KSB7XHJcbiAgICB2YXIgcGFnZV9zdGF0ZSA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuXHJcbiAgICAvLyBQZXJmb3JtIGNsZWFudXAgZnJvbSB0aGUgY3VycmVudCBwYWdlXHJcbiAgICBpZiAoUEFHRVNbcGFnZV9zdGF0ZV0pIHtcclxuICAgICAgICBQQUdFU1twYWdlX3N0YXRlXS5jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFBBR0VTW25ld19wYWdlX2tleV0pIHtcclxuICAgICAgICBQQUdFU1tuZXdfcGFnZV9rZXldLnZpc2l0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIHBhZ2UgaW5pdGlhbGl6ZXIgZm91bmQgZm9yIHN0YXRlOiAke25ld19wYWdlX2tleX1gKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5leHRQYWdlKCkge1xyXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgIGNvbnN0IHJldHVyblBhZ2VzID0gWydyZXZlbnVlJywgJ25vbnBlcnNvbm5lbCcsICduZXctaW5pdHMnLCAnb3ZlcnRpbWUnLCAncGVyc29ubmVsJ107XHJcbiAgICBpZiAoIUZ1bmRMb29rdXBUYWJsZS5mdW5kc0xlZnQoKSAmJiByZXR1cm5QYWdlcy5pbmNsdWRlcyhDdXJyZW50UGFnZS5sb2FkKCkpKSB7XHJcbiAgICAgICAgdmlzaXRQYWdlKCdzdW1tYXJ5Jyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDdXJyZW50UGFnZS5sb2FkKCkgPT0gJ25vbnBlcnNvbm5lbCcpIHtcclxuICAgICAgICBGdW5kTG9va3VwVGFibGUuZWRpdEZ1bmQoQ3VycmVudEZ1bmQubnVtYmVyKCkpO1xyXG4gICAgICAgIGlmIChGdW5kTG9va3VwVGFibGUuZnVuZHNMZWZ0KCkpIHtcclxuICAgICAgICAgICAgdmlzaXRQYWdlKCdiYXNlbGluZS1sYW5kaW5nJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwICYmIGN1cnJlbnRJbmRleCA8IGtleXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGNvbnN0IG5leHRLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCArIDFdO1xyXG4gICAgICAgIHZpc2l0UGFnZShuZXh0S2V5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RQYWdlKCkge1xyXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgIGlmIChDdXJyZW50UGFnZS5sb2FkKCkgPT0gJ25ldy1pbml0cycpIHtcclxuICAgICAgICB2aXNpdFBhZ2UoJ2Jhc2VsaW5lLWxhbmRpbmcnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xyXG4gICAgICAgIHZpc2l0UGFnZShsYXN0S2V5KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQ3VycmVudFBhZ2UgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihwYWdlKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xyXG4gICAgfSxcclxuICAgIGxvYWQgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcclxuICAgIH0sXHJcbiAgICB2aXNpdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdmlzaXRQYWdlKHRoaXMubG9hZCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3VycmVudFBhZ2U7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsU3RvcmFnZVNpemUoKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiBsb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IGtleVNpemUgPSBrZXkubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVTaXplID0gbG9jYWxTdG9yYWdlW2tleV0ubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICB0b3RhbCArPSBrZXlTaXplICsgdmFsdWVTaXplO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0Qnl0ZXModG90YWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMgPSAyKSB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XHJcbiAgICBjb25zdCBrID0gMTAyNDtcclxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV07XHJcbn1cclxuIiwiLy8gSW1wb3J0IHN0eWxlc1xyXG5pbXBvcnQgJy4uL2Nzcy9jb21tb24uY3NzJztcclxuXHJcbi8vIEltcG9ydCBmdW5jdGlvbnNcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4vbW9kZWxzL2N1cnJlbnRfcGFnZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBnZXRMb2NhbFN0b3JhZ2VTaXplIH0gZnJvbSAnLi91dGlscy9zdG9yYWdlX3V0aWxzLmpzJztcclxuXHJcbi8vIEluaXRpYWxpemUgb25seSBvbmNlIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZFxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgQ3VycmVudFBhZ2UudmlzaXQoKTtcclxuICAgIGNvbnNvbGUubG9nKCdMb2NhbCBTdG9yYWdlIFVzZWQ6JywgZ2V0TG9jYWxTdG9yYWdlU2l6ZSgpKTtcclxufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///863\n")},404:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\r\n /* colors */\r\n --orange: #FB6523;\r\n --yellow: #D99733;\r\n --blue: #43748E;\r\n --lightBlue: #b7c9e2;\r\n --darkGray: #373A37;\r\n --mediumGray: #D0D0D0;\r\n --lightGray: #F2F2F2;\r\n --white: #FBFDFB;\r\n --black: #212121;\r\n --green: #71BC78;\r\n --citygreen: #004445;\r\n --spiritgreen: #279989;\r\n --palegreen: #9FD5B3;\r\n --verypalegreen: #DFF5E3;\r\n --accentyellow: #feb70d;\r\n --nearblack: #18252a;\r\n /* fonts */\r\n font-family: \'Nunito\', sans-serif;\r\n font-size: 14px;\r\n /* spacing */\r\n --header-height : 105px;\r\n --sidebar-width: 300px;\r\n}\r\n\r\n/* Button styling */\r\n\r\n.btn {\r\n cursor: pointer;\r\n padding: 6px;\r\n margin-top: 5px;\r\n margin-right : 2px;\r\n margin-left: 2px;\r\n border-radius: 10px;\r\n background-color: gray;\r\n color: white; \r\n}\r\n\r\n/* Font application for all text */\r\nbody, button, input, textarea, select, .sidebar, table {\r\n font-family: var(--font-family), sans-serif;\r\n }\r\n\r\n#main-panel {\r\n /* display: flex; */\r\n /* flex-direction: column; */\r\n justify-content: center; /* This will center content vertically */\r\n min-height: calc(100vh - var(--header-height)) ; \r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n padding-top: 25px;\r\n padding-bottom: 25px;\r\n margin: 0;\r\n}\r\n\r\n/* Font awesome */\r\n\r\ni.fas.fa-check { \r\n font-size: 1.5em;\r\n color: var(--spiritgreen);\r\n margin-right: 10px;\r\n}\r\n`, "",{"version":3,"sources":["webpack://./src/css/common.css"],"names":[],"mappings":"AAAA;IACI,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,UAAU;IACV,iCAAiC;IACjC,eAAe;IACf,YAAY;IACZ,uBAAuB;IACvB,sBAAsB;AAC1B;;AAEA,mBAAmB;;AAEnB;IACI,eAAe;IACf,YAAY;IACZ,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,YAAY;AAChB;;AAEA,mCAAmC;AACnC;IACI,2CAA2C;EAC7C;;AAEF;IACI,mBAAmB;IACnB,4BAA4B;IAC5B,uBAAuB,EAAE,wCAAwC;IACjE,+CAA+C;IAC/C,oDAAoD;IACpD,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;AACb;;AAEA,iBAAiB;;AAEjB;IACI,gBAAgB;IAChB,yBAAyB;IACzB,kBAAkB;AACtB","sourcesContent":[":root {\\r\\n /* colors */\\r\\n --orange: #FB6523;\\r\\n --yellow: #D99733;\\r\\n --blue: #43748E;\\r\\n --lightBlue: #b7c9e2;\\r\\n --darkGray: #373A37;\\r\\n --mediumGray: #D0D0D0;\\r\\n --lightGray: #F2F2F2;\\r\\n --white: #FBFDFB;\\r\\n --black: #212121;\\r\\n --green: #71BC78;\\r\\n --citygreen: #004445;\\r\\n --spiritgreen: #279989;\\r\\n --palegreen: #9FD5B3;\\r\\n --verypalegreen: #DFF5E3;\\r\\n --accentyellow: #feb70d;\\r\\n --nearblack: #18252a;\\r\\n /* fonts */\\r\\n font-family: \'Nunito\', sans-serif;\\r\\n font-size: 14px;\\r\\n /* spacing */\\r\\n --header-height : 105px;\\r\\n --sidebar-width: 300px;\\r\\n}\\r\\n\\r\\n/* Button styling */\\r\\n\\r\\n.btn {\\r\\n cursor: pointer;\\r\\n padding: 6px;\\r\\n margin-top: 5px;\\r\\n margin-right : 2px;\\r\\n margin-left: 2px;\\r\\n border-radius: 10px;\\r\\n background-color: gray;\\r\\n color: white; \\r\\n}\\r\\n\\r\\n/* Font application for all text */\\r\\nbody, button, input, textarea, select, .sidebar, table {\\r\\n font-family: var(--font-family), sans-serif;\\r\\n }\\r\\n\\r\\n#main-panel {\\r\\n /* display: flex; */\\r\\n /* flex-direction: column; */\\r\\n justify-content: center; /* This will center content vertically */\\r\\n min-height: calc(100vh - var(--header-height)) ; \\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-top: 25px;\\r\\n padding-bottom: 25px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n/* Font awesome */\\r\\n\\r\\ni.fas.fa-check { \\r\\n font-size: 1.5em;\\r\\n color: var(--spiritgreen);\\r\\n margin-right: 10px;\\r\\n}\\r\\n"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/ZjdjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xyXG4gICAgLyogY29sb3JzICovXHJcbiAgICAtLW9yYW5nZTogI0ZCNjUyMztcclxuICAgIC0teWVsbG93OiAjRDk5NzMzO1xyXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xyXG4gICAgLS1saWdodEJsdWU6ICNiN2M5ZTI7XHJcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xyXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xyXG4gICAgLS1saWdodEdyYXk6ICNGMkYyRjI7XHJcbiAgICAtLXdoaXRlOiAjRkJGREZCO1xyXG4gICAgLS1ibGFjazogIzIxMjEyMTtcclxuICAgIC0tZ3JlZW46ICM3MUJDNzg7XHJcbiAgICAtLWNpdHlncmVlbjogIzAwNDQ0NTtcclxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XHJcbiAgICAtLXBhbGVncmVlbjogIzlGRDVCMztcclxuICAgIC0tdmVyeXBhbGVncmVlbjogI0RGRjVFMztcclxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xyXG4gICAgLS1uZWFyYmxhY2s6ICMxODI1MmE7XHJcbiAgICAvKiBmb250cyAqL1xyXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgLyogc3BhY2luZyAqL1xyXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XHJcbiAgICAtLXNpZGViYXItd2lkdGg6IDMwMHB4O1xyXG59XHJcblxyXG4vKiBCdXR0b24gc3R5bGluZyAqL1xyXG5cclxuLmJ0biB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwYWRkaW5nOiA2cHg7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgICBjb2xvcjogd2hpdGU7IFxyXG59XHJcblxyXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cclxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcclxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuI21haW4tcGFuZWwge1xyXG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cclxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cclxuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcclxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXHJcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG59XHJcblxyXG4vKiBGb250IGF3ZXNvbWUgKi9cclxuXHJcbmkuZmFzLmZhLWNoZWNrIHsgXHJcbiAgICBmb250LXNpemU6IDEuNWVtO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jc3MvY29tbW9uLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGlDQUFpQztJQUNqQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixZQUFZO0FBQ2hCOztBQUVBLG1DQUFtQztBQUNuQztJQUNJLDJDQUEyQztFQUM3Qzs7QUFFRjtJQUNJLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsdUJBQXVCLEVBQUUsd0NBQXdDO0lBQ2pFLCtDQUErQztJQUMvQyxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixTQUFTO0FBQ2I7O0FBRUEsaUJBQWlCOztBQUVqQjtJQUNJLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXHJcXG4gICAgLyogY29sb3JzICovXFxyXFxuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xcclxcbiAgICAtLXllbGxvdzogI0Q5OTczMztcXHJcXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xcclxcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcXHJcXG4gICAgLS1kYXJrR3JheTogIzM3M0EzNztcXHJcXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xcclxcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXHJcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXHJcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXHJcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXHJcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxyXFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxyXFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcclxcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxyXFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcclxcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXHJcXG4gICAgLyogZm9udHMgKi9cXHJcXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIC8qIHNwYWNpbmcgKi9cXHJcXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XFxyXFxuICAgIC0tc2lkZWJhci13aWR0aDogMzAwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcGFkZGluZzogNnB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIG1hcmdpbi1yaWdodCA6IDJweDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gICAgY29sb3I6IHdoaXRlOyBcXHJcXG59XFxyXFxuXFxyXFxuLyogRm9udCBhcHBsaWNhdGlvbiBmb3IgYWxsIHRleHQgICovXFxyXFxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KSwgc2Fucy1zZXJpZjtcXHJcXG4gIH1cXHJcXG5cXHJcXG4jbWFpbi1wYW5lbCB7XFxyXFxuICAgIC8qIGRpc3BsYXk6IGZsZXg7ICovXFxyXFxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBUaGlzIHdpbGwgY2VudGVyIGNvbnRlbnQgdmVydGljYWxseSAqL1xcclxcbiAgICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gdmFyKC0taGVhZGVyLWhlaWdodCkpIDsgXFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMjVweDtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGb250IGF3ZXNvbWUgKi9cXHJcXG5cXHJcXG5pLmZhcy5mYS1jaGVjayB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///404\n')},995:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.summary-accordion {\r\n width: 60%;\r\n margin: auto;\r\n}\r\n\r\n.accordion-title {\r\n margin-left: 20%;\r\n font-weight: bold;\r\n /* font-size: 20px; */\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-top: 30px;\r\n}\r\n\r\n.accordion-button:active, .accordion-button:not(.collapsed) {\r\n background-color: var(--palegreen);\r\n color: var(--citygreen);\r\n /* font-size: 20px; */\r\n}\r\n\r\n.accordion-table { \r\n width: 100%;\r\n font-size: 1.2em;\r\n /* border-collapse: separate; This is required for rounded corners */\r\n}\r\n\r\n.accordion-table td:last-child {\r\n text-align: right;\r\n padding-right: 15px;\r\n padding-bottom: 5px\r\n}\r\n\r\n.accordion-table tr {\r\n border-bottom: 1px solid black;\r\n border-top: none;\r\n border-right: none;\r\n border-left: none;\r\n}\r\n\r\n.accordion-table tr:last-child {\r\n border-bottom: none;\r\n background-color: var(--mediumGray);\r\n height : 50px;\r\n}\r\n\r\nspan.amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: 60px;\r\n}\r\n\r\n.accordion-header button {\r\n font-size: 0.8em;\r\n}\r\n\r\n.btn-add-init {\r\n background-color: var(--spiritgreen);\r\n border-color: var(--citygreen);\r\n /* position: absolute; */\r\n right: 0;\r\n /* margin-left: 20px; */\r\n /* margin-right: calc(20vw + 15px); */\r\n margin-top: 15px;\r\n}\r\n\r\n#supp-title {\r\n margin-top: 20px;\r\n}\r\n\r\n.btn-add-init:hover {\r\n background-color: var(--palegreen);\r\n}\r\n.add-init-btn-div{\r\n text-align: center;\r\n}\r\n\r\nspan.top-line-amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: calc(20vw + 20px);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/accordion/accordion.css"],"names":[],"mappings":"AAAA;IACI,UAAU;IACV,YAAY;AAChB;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;IAClC,uBAAuB;IACvB,qBAAqB;AACzB;;AAEA;IACI,WAAW;IACX,gBAAgB;IAChB,oEAAoE;AACxE;;AAEA;IACI,iBAAiB;IACjB,mBAAmB;IACnB;AACJ;;AAEA;IACI,8BAA8B;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;IACnB,mCAAmC;IACnC,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,oCAAoC;IACpC,8BAA8B;IAC9B,wBAAwB;IACxB,QAAQ;IACR,uBAAuB;IACvB,qCAAqC;IACrC,gBAAgB;AACpB;;AAEA;GACG,gBAAgB;AACnB;;AAEA;IACI,kCAAkC;AACtC;AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,+BAA+B;AACnC","sourcesContent":[".summary-accordion {\\r\\n width: 60%;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.accordion-title {\\r\\n margin-left: 20%;\\r\\n font-weight: bold;\\r\\n /* font-size: 20px; */\\r\\n padding-bottom: 10px;\\r\\n padding-left: 15px;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.accordion-button:active, .accordion-button:not(.collapsed) {\\r\\n background-color: var(--palegreen);\\r\\n color: var(--citygreen);\\r\\n /* font-size: 20px; */\\r\\n}\\r\\n\\r\\n.accordion-table { \\r\\n width: 100%;\\r\\n font-size: 1.2em;\\r\\n /* border-collapse: separate; This is required for rounded corners */\\r\\n}\\r\\n\\r\\n.accordion-table td:last-child {\\r\\n text-align: right;\\r\\n padding-right: 15px;\\r\\n padding-bottom: 5px\\r\\n}\\r\\n\\r\\n.accordion-table tr {\\r\\n border-bottom: 1px solid black;\\r\\n border-top: none;\\r\\n border-right: none;\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.accordion-table tr:last-child {\\r\\n border-bottom: none;\\r\\n background-color: var(--mediumGray);\\r\\n height : 50px;\\r\\n}\\r\\n\\r\\nspan.amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: 60px;\\r\\n}\\r\\n\\r\\n.accordion-header button {\\r\\n font-size: 0.8em;\\r\\n}\\r\\n\\r\\n.btn-add-init {\\r\\n background-color: var(--spiritgreen);\\r\\n border-color: var(--citygreen);\\r\\n /* position: absolute; */\\r\\n right: 0;\\r\\n /* margin-left: 20px; */\\r\\n /* margin-right: calc(20vw + 15px); */\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n#supp-title {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.btn-add-init:hover {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n.add-init-btn-div{\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nspan.top-line-amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: calc(20vw + 20px);\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3M/ZjBmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnN1bW1hcnktYWNjb3JkaW9uIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGl0bGUge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMzBweDtcclxufVxyXG5cclxuLmFjY29yZGlvbi1idXR0b246YWN0aXZlLCAuYWNjb3JkaW9uLWJ1dHRvbjpub3QoLmNvbGxhcHNlZCkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLXRhYmxlIHsgXHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGZvbnQtc2l6ZTogMS4yZW07XHJcbiAgICAvKiBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBUaGlzIGlzIHJlcXVpcmVkIGZvciByb3VuZGVkIGNvcm5lcnMgKi9cclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ZDpsYXN0LWNoaWxkIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHhcclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ciB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XHJcbiAgICBib3JkZXItdG9wOiBub25lO1xyXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xyXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGFibGUgdHI6bGFzdC1jaGlsZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XHJcbiAgICBoZWlnaHQgOiA1MHB4O1xyXG59XHJcblxyXG5zcGFuLmFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xyXG4gICAgZm9udC1zaXplOiAwLjhlbTtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7ICovXHJcbiAgICByaWdodDogMDtcclxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xyXG4gICAgLyogbWFyZ2luLXJpZ2h0OiBjYWxjKDIwdncgKyAxNXB4KTsgKi9cclxuICAgIG1hcmdpbi10b3A6IDE1cHg7XHJcbn1cclxuXHJcbiNzdXBwLXRpdGxlIHtcclxuICAgbWFyZ2luLXRvcDogMjBweDtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG59XHJcbi5hZGQtaW5pdC1idG4tZGl2e1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5zcGFuLnRvcC1saW5lLWFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDIwdncgKyAyMHB4KTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksa0NBQWtDO0lBQ2xDLHVCQUF1QjtJQUN2QixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG9FQUFvRTtBQUN4RTs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkI7QUFDSjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQixtQ0FBbUM7SUFDbkMsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyw4QkFBOEI7SUFDOUIsd0JBQXdCO0lBQ3hCLFFBQVE7SUFDUix1QkFBdUI7SUFDdkIscUNBQXFDO0lBQ3JDLGdCQUFnQjtBQUNwQjs7QUFFQTtHQUNHLGdCQUFnQjtBQUNuQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0QztBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsK0JBQStCO0FBQ25DXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5zdW1tYXJ5LWFjY29yZGlvbiB7XFxyXFxuICAgIHdpZHRoOiA2MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10aXRsZSB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWJ1dHRvbjphY3RpdmUsIC5hY2NvcmRpb24tYnV0dG9uOm5vdCguY29sbGFwc2VkKSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxufVxcclxcblxcclxcbi5hY2NvcmRpb24tdGFibGUgeyBcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMS4yZW07XFxyXFxuICAgIC8qIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IFRoaXMgaXMgcmVxdWlyZWQgZm9yIHJvdW5kZWQgY29ybmVycyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRkOmxhc3QtY2hpbGQge1xcclxcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDVweFxcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBib3JkZXItdG9wOiBub25lO1xcclxcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyOmxhc3QtY2hpbGQge1xcclxcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcXHJcXG4gICAgaGVpZ2h0IDogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5hbW91bnQge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICByaWdodDogMDtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xcclxcbiAgICBmb250LXNpemU6IDAuOGVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWFkZC1pbml0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XFxyXFxuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgKi9cXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xcclxcbiAgICAvKiBtYXJnaW4tcmlnaHQ6IGNhbGMoMjB2dyArIDE1cHgpOyAqL1xcclxcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4jc3VwcC10aXRsZSB7XFxyXFxuICAgbWFyZ2luLXRvcDogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxufVxcclxcbi5hZGQtaW5pdC1idG4tZGl2e1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbnNwYW4udG9wLWxpbmUtYW1vdW50IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogY2FsYygyMHZ3ICsgMjBweCk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///995\n')},9:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `body {\r\n background-color: var(--lightGray);\r\n margin: 0;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\r\\n background-color: var(--lightGray);\\r\\n margin: 0;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxuICAgIG1hcmdpbjogMDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n')},39:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#file-input {\r\n margin-left: 40%;\r\n}\r\n\r\n/* Spinner Styles */\r\n.spinner {\r\n display: inline-block;\r\n width: 150px;\r\n height: 150px;\r\n border: 20px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: var(--spiritgreen);\r\n animation: spin 1s ease-in-out infinite;\r\n position: fixed; /* Ensures it stays fixed relative to the viewport */\r\n top: 20%; /* Center vertically */\r\n left: 43%; /* Center horizontally */\r\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\r\n z-index: 9999; /* Ensures it appears in front of other elements */\r\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\r\n padding: 20px; /* Optional: extra padding for better visibility */\r\n }\r\n \r\n @keyframes spin {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }`, "",{"version":3,"sources":["webpack://./src/js/components/file_upload/file_upload.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB;;AAEA,mBAAmB;AACnB;IACI,qBAAqB;IACrB,YAAY;IACZ,aAAa;IACb,qCAAqC;IACrC,kBAAkB;IAClB,oCAAoC;IACpC,uCAAuC;IACvC,eAAe,EAAE,oDAAoD;IACrE,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAE,wBAAwB;IACnC,gCAAgC,EAAE,mCAAmC;IACrE,aAAa,EAAE,kDAAkD;IACjE,0CAA0C,EAAE,+BAA+B;IAC3E,aAAa,EAAE,kDAAkD;EACnE;;EAEA;IACE;MACE,uBAAuB;IACzB;IACA;MACE,yBAAyB;IAC3B;EACF","sourcesContent":["#file-input {\\r\\n margin-left: 40%;\\r\\n}\\r\\n\\r\\n/* Spinner Styles */\\r\\n.spinner {\\r\\n display: inline-block;\\r\\n width: 150px;\\r\\n height: 150px;\\r\\n border: 20px solid rgba(0, 0, 0, 0.1);\\r\\n border-radius: 50%;\\r\\n border-top-color: var(--spiritgreen);\\r\\n animation: spin 1s ease-in-out infinite;\\r\\n position: fixed; /* Ensures it stays fixed relative to the viewport */\\r\\n top: 20%; /* Center vertically */\\r\\n left: 43%; /* Center horizontally */\\r\\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\\r\\n z-index: 9999; /* Ensures it appears in front of other elements */\\r\\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\\r\\n padding: 20px; /* Optional: extra padding for better visibility */\\r\\n }\\r\\n \\r\\n @keyframes spin {\\r\\n 0% {\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n 100% {\\r\\n transform: rotate(360deg);\\r\\n }\\r\\n }"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9jNTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjZmlsZS1pbnB1dCB7XHJcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xyXG59XHJcblxyXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xyXG4uc3Bpbm5lciB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMTUwcHg7XHJcbiAgICBoZWlnaHQ6IDE1MHB4O1xyXG4gICAgYm9yZGVyOiAyMHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGFuaW1hdGlvbjogc3BpbiAxcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cclxuICAgIHRvcDogMjAlOyAvKiBDZW50ZXIgdmVydGljYWxseSAqL1xyXG4gICAgbGVmdDogNDMlOyAvKiBDZW50ZXIgaG9yaXpvbnRhbGx5ICovXHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXHJcbiAgICB6LWluZGV4OiA5OTk5OyAvKiBFbnN1cmVzIGl0IGFwcGVhcnMgaW4gZnJvbnQgb2Ygb3RoZXIgZWxlbWVudHMgKi9cclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgLyogT3B0aW9uYWw6IGxpZ2h0IGJhY2tncm91bmQgKi9cclxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xyXG4gIH1cclxuICBcclxuICBAa2V5ZnJhbWVzIHNwaW4ge1xyXG4gICAgMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICAgIH1cclxuICAgIDEwMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gICAgfVxyXG4gIH1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQSxtQkFBbUI7QUFDbkI7SUFDSSxxQkFBcUI7SUFDckIsWUFBWTtJQUNaLGFBQWE7SUFDYixxQ0FBcUM7SUFDckMsa0JBQWtCO0lBQ2xCLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsZUFBZSxFQUFFLG9EQUFvRDtJQUNyRSxRQUFRLEVBQUUsc0JBQXNCO0lBQ2hDLFNBQVMsRUFBRSx3QkFBd0I7SUFDbkMsZ0NBQWdDLEVBQUUsbUNBQW1DO0lBQ3JFLGFBQWEsRUFBRSxrREFBa0Q7SUFDakUsMENBQTBDLEVBQUUsK0JBQStCO0lBQzNFLGFBQWEsRUFBRSxrREFBa0Q7RUFDbkU7O0VBRUE7SUFDRTtNQUNFLHVCQUF1QjtJQUN6QjtJQUNBO01BQ0UseUJBQXlCO0lBQzNCO0VBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI2ZpbGUtaW5wdXQge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xcclxcbi5zcGlubmVyIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB3aWR0aDogMTUwcHg7XFxyXFxuICAgIGhlaWdodDogMTUwcHg7XFxyXFxuICAgIGJvcmRlcjogMjBweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBhbmltYXRpb246IHNwaW4gMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cXHJcXG4gICAgdG9wOiAyMCU7IC8qIENlbnRlciB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIGxlZnQ6IDQzJTsgLyogQ2VudGVyIGhvcml6b250YWxseSAqL1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXFxyXFxuICAgIHotaW5kZXg6IDk5OTk7IC8qIEVuc3VyZXMgaXQgYXBwZWFycyBpbiBmcm9udCBvZiBvdGhlciBlbGVtZW50cyAqL1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7IC8qIE9wdGlvbmFsOiBsaWdodCBiYWNrZ3JvdW5kICovXFxyXFxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICBAa2V5ZnJhbWVzIHNwaW4ge1xcclxcbiAgICAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxyXFxuICAgIH1cXHJcXG4gICAgMTAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gICAgfVxcclxcbiAgfVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n')},109:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `textarea {height: 100px; width: 100%;}\r\n\r\ntextarea, input, select {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.btn-submit {\r\n margin-top: 20px;\r\n width: 60%;\r\n margin-left: 20%;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#new-form label {\r\n display: block; /* Ensure label is on its own line */\r\n margin-bottom: 0.25em; \r\n}\r\n\r\n#new-form select {\r\n min-width: 300px;\r\n}\r\n\r\n/* Thicker red border when focused */\r\ninput[readonly]:focus {\r\n border: 2px solid red;\r\n outline: none; /* Remove the default outline */\r\n}\r\n\r\n.error-message {\r\n color: red;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC;;AAEA;IACI,cAAc,EAAE,oCAAoC;IACpD,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;AACpB;;AAEA,oCAAoC;AACpC;IACI,qBAAqB;IACrB,aAAa,EAAE,+BAA+B;AAClD;;AAEA;IACI,UAAU;AACd","sourcesContent":["textarea {height: 100px; width: 100%;}\\r\\n\\r\\ntextarea, input, select {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.btn-submit {\\r\\n margin-top: 20px;\\r\\n width: 60%;\\r\\n margin-left: 20%;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#new-form label {\\r\\n display: block; /* Ensure label is on its own line */\\r\\n margin-bottom: 0.25em; \\r\\n}\\r\\n\\r\\n#new-form select {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n/* Thicker red border when focused */\\r\\ninput[readonly]:focus {\\r\\n border: 2px solid red;\\r\\n outline: none; /* Remove the default outline */\\r\\n}\\r\\n\\r\\n.error-message {\\r\\n color: red;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3M/ZTM4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgdGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cclxuXHJcbnRleHRhcmVhLCBpbnB1dCwgc2VsZWN0IHtcclxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcclxufVxyXG5cclxuLmJ0bi1zdWJtaXQge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG59XHJcblxyXG4jbmV3LWZvcm0gbGFiZWwge1xyXG4gICAgZGlzcGxheTogYmxvY2s7IC8qIEVuc3VyZSBsYWJlbCBpcyBvbiBpdHMgb3duIGxpbmUgKi9cclxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXHJcbn1cclxuXHJcbiNuZXctZm9ybSBzZWxlY3Qge1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxufVxyXG5cclxuLyogVGhpY2tlciByZWQgYm9yZGVyIHdoZW4gZm9jdXNlZCAqL1xyXG5pbnB1dFtyZWFkb25seV06Zm9jdXMge1xyXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xyXG4gICAgb3V0bGluZTogbm9uZTsgLyogUmVtb3ZlIHRoZSBkZWZhdWx0IG91dGxpbmUgKi9cclxufVxyXG5cclxuLmVycm9yLW1lc3NhZ2Uge1xyXG4gICAgY29sb3I6IHJlZDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxVQUFVLGFBQWEsRUFBRSxXQUFXLENBQUM7O0FBRXJDO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksY0FBYyxFQUFFLG9DQUFvQztJQUNwRCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUEsb0NBQW9DO0FBQ3BDO0lBQ0kscUJBQXFCO0lBQ3JCLGFBQWEsRUFBRSwrQkFBK0I7QUFDbEQ7O0FBRUE7SUFDSSxVQUFVO0FBQ2RcIixcInNvdXJjZXNDb250ZW50XCI6W1widGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cXHJcXG5cXHJcXG50ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdCB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1zdWJtaXQge1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICB3aWR0aDogNjAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBsYWJlbCB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBFbnN1cmUgbGFiZWwgaXMgb24gaXRzIG93biBsaW5lICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBzZWxlY3Qge1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUaGlja2VyIHJlZCBib3JkZXIgd2hlbiBmb2N1c2VkICovXFxyXFxuaW5wdXRbcmVhZG9ubHldOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xcclxcbiAgICBvdXRsaW5lOiBub25lOyAvKiBSZW1vdmUgdGhlIGRlZmF1bHQgb3V0bGluZSAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZXJyb3ItbWVzc2FnZSB7XFxyXFxuICAgIGNvbG9yOiByZWQ7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n')},107:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\r\nh1 {\r\n text-align: center;\r\n font-size: 30px;\r\n}\r\n\r\nh2 {\r\n color: var(--darkGray);\r\n text-align: center;\r\n font-size: 20px;\r\n}\r\n\r\nheader {\r\n align-items: center;\r\n background-color: white;\r\n padding: 5px;\r\n border-bottom: 1px solid var(--citygreen); \r\n /* border: 1px solid var(--citygreen); */\r\n height: var(--header-height);\r\n /* width: calc(100vw - var(--sidebar-width)); */\r\n padding-left: 20px;\r\n}\r\n\r\n/* Logo styling */\r\n#logo {\r\n height: 50px; /* Or your desired size */\r\n margin-right: 20px; /* Optional: space between logo and title */\r\n margin-bottom: -50px;\r\n margin-top: 10px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,YAAY;IACZ,yCAAyC;IACzC,yCAAyC;IACzC,4BAA4B;IAC5B,+CAA+C;IAC/C,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,YAAY,EAAE,yBAAyB;IACvC,kBAAkB,EAAE,2CAA2C;IAC/D,oBAAoB;IACpB,gBAAgB;AACpB","sourcesContent":["\\r\\nh1 {\\r\\n text-align: center;\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\nh2 {\\r\\n color: var(--darkGray);\\r\\n text-align: center;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\nheader {\\r\\n align-items: center;\\r\\n background-color: white;\\r\\n padding: 5px;\\r\\n border-bottom: 1px solid var(--citygreen); \\r\\n /* border: 1px solid var(--citygreen); */\\r\\n height: var(--header-height);\\r\\n /* width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n/* Logo styling */\\r\\n#logo {\\r\\n height: 50px; /* Or your desired size */\\r\\n margin-right: 20px; /* Optional: space between logo and title */\\r\\n margin-bottom: -50px;\\r\\n margin-top: 10px;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmNzcz8yZjRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBcclxuaDEge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG59XHJcblxyXG5oZWFkZXIge1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgcGFkZGluZzogNXB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7IFxyXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXHJcbiAgICBoZWlnaHQ6IHZhcigtLWhlYWRlci1oZWlnaHQpO1xyXG4gICAgLyogd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICovXHJcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbn1cclxuXHJcbi8qIExvZ28gc3R5bGluZyAqL1xyXG4jbG9nbyB7XHJcbiAgICBoZWlnaHQ6IDUwcHg7IC8qIE9yIHlvdXIgZGVzaXJlZCBzaXplICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXHJcbiAgICBtYXJnaW4tYm90dG9tOiAtNTBweDtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1oseUNBQXlDO0lBQ3pDLHlDQUF5QztJQUN6Qyw0QkFBNEI7SUFDNUIsK0NBQStDO0lBQy9DLGtCQUFrQjtBQUN0Qjs7QUFFQSxpQkFBaUI7QUFDakI7SUFDSSxZQUFZLEVBQUUseUJBQXlCO0lBQ3ZDLGtCQUFrQixFQUFFLDJDQUEyQztJQUMvRCxvQkFBb0I7SUFDcEIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIlxcclxcbmgxIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDMwcHg7XFxyXFxufVxcclxcblxcclxcbmgyIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbmhlYWRlciB7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXHJcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxyXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxyXFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIExvZ28gc3R5bGluZyAqL1xcclxcbiNsb2dvIHtcXHJcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n')},95:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, "",{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY3NzPzZhY2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///95\n')},595:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#nav-btns {\r\n margin: 20px;\r\n text-align: center;\r\n margin-top: 5px;\r\n margin-bottom: 5px;\r\n /* position: absolute; or \'absolute\' depending on use-case */\r\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\r\n}\r\n\r\n#btn-next, #btn-last {\r\n background-color: var(--darkGray);\r\n}\r\n\r\n#btn-next:hover, #btn-last:hover {\r\n background-color: var(--yellow);\r\n color: var(--darkGray);\r\n}\r\n\r\n/* Add style for when you cannot click the next button */\r\n#btn-next.disabled, #btn-last.disabled,\r\n#btn-next.disabled:hover, #btn-last.disabled:hover {\r\n background-color: gray;\r\n color: white;\r\n pointer-events: none;\r\n \r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,4DAA4D;IAC5D,yFAAyF;AAC7F;;AAEA;IACI,iCAAiC;AACrC;;AAEA;IACI,+BAA+B;IAC/B,sBAAsB;AAC1B;;AAEA,wDAAwD;AACxD;;IAEI,sBAAsB;IACtB,YAAY;IACZ,oBAAoB;;AAExB","sourcesContent":["#nav-btns {\\r\\n margin: 20px;\\r\\n text-align: center;\\r\\n margin-top: 5px;\\r\\n margin-bottom: 5px;\\r\\n /* position: absolute; or \'absolute\' depending on use-case */\\r\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\r\\n}\\r\\n\\r\\n#btn-next, #btn-last {\\r\\n background-color: var(--darkGray);\\r\\n}\\r\\n\\r\\n#btn-next:hover, #btn-last:hover {\\r\\n background-color: var(--yellow);\\r\\n color: var(--darkGray);\\r\\n}\\r\\n\\r\\n/* Add style for when you cannot click the next button */\\r\\n#btn-next.disabled, #btn-last.disabled,\\r\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\r\\n background-color: gray;\\r\\n color: white;\\r\\n pointer-events: none;\\r\\n \\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzPzkwNWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYCNuYXYtYnRucyB7XHJcbiAgICBtYXJnaW46IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXHJcbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cclxufVxyXG5cclxuI2J0bi1uZXh0LCAjYnRuLWxhc3Qge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG59XHJcblxyXG4jYnRuLW5leHQ6aG92ZXIsICNidG4tbGFzdDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS15ZWxsb3cpO1xyXG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcclxufVxyXG5cclxuLyogQWRkIHN0eWxlIGZvciB3aGVuIHlvdSBjYW5ub3QgY2xpY2sgdGhlIG5leHQgYnV0dG9uICovXHJcbiNidG4tbmV4dC5kaXNhYmxlZCwgI2J0bi1sYXN0LmRpc2FibGVkLFxyXG4jYnRuLW5leHQuZGlzYWJsZWQ6aG92ZXIsICNidG4tbGFzdC5kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgICBcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLDREQUE0RDtJQUM1RCx5RkFBeUY7QUFDN0Y7O0FBRUE7SUFDSSxpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSwrQkFBK0I7SUFDL0Isc0JBQXNCO0FBQzFCOztBQUVBLHdEQUF3RDtBQUN4RDs7SUFFSSxzQkFBc0I7SUFDdEIsWUFBWTtJQUNaLG9CQUFvQjs7QUFFeEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI25hdi1idG5zIHtcXHJcXG4gICAgbWFyZ2luOiAyMHB4O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXFxyXFxuICAgIC8qIHRvcDogMTAwcHg7IERpc3RhbmNlIGZyb20gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQgb3IgdGhlIGNsb3Nlc3QgcG9zaXRpb25lZCBhbmNlc3RvciAqL1xcclxcbn1cXHJcXG5cXHJcXG4jYnRuLW5leHQsICNidG4tbGFzdCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS15ZWxsb3cpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgc3R5bGUgZm9yIHdoZW4geW91IGNhbm5vdCBjbGljayB0aGUgbmV4dCBidXR0b24gKi9cXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQ6aG92ZXIsICNidG4tbGFzdC5kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAgIFxcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///595\n')},225:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `div#prompt-div {\r\n display: none;\r\n width: 80%;\r\n margin: auto;\r\n text-align: center;\r\n}\r\n\r\nh3#prompt {\r\n text-align: center;\r\n font-size : 1.2em;\r\n}\r\n\r\n#option1, #option2 { \r\n font-size: 1.5em;\r\n border-color: var(--citygreen); \r\n border-width: 2px;\r\n background-color: var(--white);\r\n color: var(--citygreen);\r\n}\r\n\r\n#option1:hover, #option2:hover { \r\n background-color: var(--spiritgreen);\r\n color: white;\r\n}\r\n\r\n#option2.clicked, #option1.clicked {\r\n font-weight: bold;\r\n background-color: var(--spiritgreen);\r\n color: white;\r\n border-width: 3;\r\n}\r\n\r\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\r\n background-color: lightgray;\r\n color: gray;\r\n pointer-events: none;\r\n border-color: gray;\r\n}\r\n\r\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,UAAU;IACV,YAAY;IACZ,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;IACjB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,oCAAoC;IACpC,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,oCAAoC;IACpC,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI,2BAA2B;IAC3B,WAAW;IACX,oBAAoB;IACpB,kBAAkB;AACtB","sourcesContent":["div#prompt-div {\\r\\n display: none;\\r\\n width: 80%;\\r\\n margin: auto;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nh3#prompt {\\r\\n text-align: center;\\r\\n font-size : 1.2em;\\r\\n}\\r\\n\\r\\n#option1, #option2 { \\r\\n font-size: 1.5em;\\r\\n border-color: var(--citygreen); \\r\\n border-width: 2px;\\r\\n background-color: var(--white);\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n#option1:hover, #option2:hover { \\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n#option2.clicked, #option1.clicked {\\r\\n font-weight: bold;\\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n border-width: 3;\\r\\n}\\r\\n\\r\\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\\r\\n background-color: lightgray;\\r\\n color: gray;\\r\\n pointer-events: none;\\r\\n border-color: gray;\\r\\n}\\r\\n\\r\\n"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzP2U2OTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGRpdiNwcm9tcHQtZGl2IHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB3aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5oMyNwcm9tcHQge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplIDogMS4yZW07XHJcbn1cclxuXHJcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxyXG4gICAgZm9udC1zaXplOiAxLjVlbTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTsgXHJcbiAgICBib3JkZXItd2lkdGg6IDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG59XHJcblxyXG4jb3B0aW9uMTpob3ZlciwgI29wdGlvbjI6aG92ZXIgeyBcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci13aWR0aDogMztcclxufVxyXG5cclxuI29wdGlvbjEuZGlzYWJsZWQsICNvcHRpb24yLmRpc2FibGVkLCAjb3B0aW9uMS5kaXNhYmxlZDpob3ZlciwgI29wdGlvbjIuZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xyXG4gICAgY29sb3I6IGdyYXk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcclxufVxyXG5cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlCQUFpQjtJQUNqQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdiNwcm9tcHQtZGl2IHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmgzI3Byb21wdCB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC1zaXplIDogMS4yZW07XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3JkZXItd2lkdGg6IDM7XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLmRpc2FibGVkLCAjb3B0aW9uMi5kaXNhYmxlZCwgI29wdGlvbjEuZGlzYWJsZWQ6aG92ZXIsICNvcHRpb24yLmRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcclxcbiAgICBjb2xvcjogZ3JheTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///225\n')},263:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar-panel {\r\n background-color: lightgrey; \r\n /* min-height: 100vh; Full height of viewport */\r\n }\r\n\r\n#supp-total .stat {\r\n color: var(--yellow);\r\n}\r\n\r\n.stat {\r\n font-weight: bold;\r\n}\r\n\r\n#sidebar-panel {\r\n height: 100%; /* Full height of the viewport */\r\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\r\n z-index: 1; /* Stay on top */\r\n top: 0; /* Stay at the top */\r\n right: 0; /* Sidebar appears on the left */\r\n background-color: #FFFFFF; /* White background color */\r\n overflow-x: hidden; /* Disable horizontal scroll */\r\n padding: 20px;\r\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\r\n border-right: 2px solid #DDDDDD; /* Right border */\r\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\r\n /* margin-top: var(--header-height); */\r\n width: var(--sidebar-width);\r\n margin: 0px;\r\n }\r\n \r\n.sidebar a {\r\n padding: 10px 15px;\r\n text-decoration: none;\r\n font-size: 18px;\r\n color: #818181;\r\n display: block;\r\n transition: 0.3s;\r\n}\r\n\r\n#sidebar-title {\r\n color: var(--darkGray);\r\n font-weight: bold;\r\n border-bottom: 1px solid var(--citygreen);\r\n}\r\n\r\nhr {\r\n margin-top: -5px;\r\n margin-bottom: 8px;\r\n}\r\n\r\nh6 {\r\n font-weight: 600;\r\n}\r\n\r\n.section-header {\r\n background-color: var(--mediumGray);\r\n}\r\n\r\n.sidebar-stat-line {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between; /* Distribute space between children */\r\n padding: 2px;\r\n border-bottom: 1px solid #ddd;\r\n}\r\n\r\n.edit-icon, .edit-supp {\r\n color: var(--spiritgreen);\r\n cursor: pointer;\r\n font-size: 16px; /* Adjust the size as needed */\r\n margin-left: 10px;\r\n}\r\n\r\n.edit-icon:hover .edit-supp:hover {\r\n color: var(--citygreen);\r\n}\r\n\r\n.stat-label {\r\n margin-right: auto; /* Push next elements to the right */\r\n}\r\n\r\n.stat {\r\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\r\n}\r\n\r\n.sidebar-stat-line.fund-total .stat {\r\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/sidebar/sidebar.css"],"names":[],"mappings":"AAAA;IACI,2BAA2B;IAC3B,+CAA+C;EACjD;;AAEF;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,4CAA4C;IAC7D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,gCAAgC;IAC1C,yBAAyB,EAAE,2BAA2B;IACtD,kBAAkB,EAAE,8BAA8B;IAClD,aAAa;IACb,wCAAwC,EAAE,8BAA8B;IACxE,+BAA+B,EAAE,iBAAiB;IAClD,+BAA+B,EAAE,gCAAgC;IACjE,sCAAsC;IACtC,2BAA2B;IAC3B,WAAW;EACb;;AAEF;IACI,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;AACpB;;AAEA;EACE,sBAAsB;EACtB,iBAAiB;EACjB,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B,EAAE,sCAAsC;EACtE,YAAY;EACZ,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,eAAe;EACf,eAAe,EAAE,8BAA8B;EAC/C,iBAAiB;AACnB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,kBAAkB,EAAE,oCAAoC;AAC1D;;AAEA;EACE,gBAAgB,EAAE,4DAA4D;AAChF;;AAEA;EACE,kBAAkB,EAAE,sDAAsD;AAC5E","sourcesContent":["#sidebar-panel {\\r\\n background-color: lightgrey; \\r\\n /* min-height: 100vh; Full height of viewport */\\r\\n }\\r\\n\\r\\n#supp-total .stat {\\r\\n color: var(--yellow);\\r\\n}\\r\\n\\r\\n.stat {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n#sidebar-panel {\\r\\n height: 100%; /* Full height of the viewport */\\r\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\r\\n z-index: 1; /* Stay on top */\\r\\n top: 0; /* Stay at the top */\\r\\n right: 0; /* Sidebar appears on the left */\\r\\n background-color: #FFFFFF; /* White background color */\\r\\n overflow-x: hidden; /* Disable horizontal scroll */\\r\\n padding: 20px;\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\r\\n border-right: 2px solid #DDDDDD; /* Right border */\\r\\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\\r\\n /* margin-top: var(--header-height); */\\r\\n width: var(--sidebar-width);\\r\\n margin: 0px;\\r\\n }\\r\\n \\r\\n.sidebar a {\\r\\n padding: 10px 15px;\\r\\n text-decoration: none;\\r\\n font-size: 18px;\\r\\n color: #818181;\\r\\n display: block;\\r\\n transition: 0.3s;\\r\\n}\\r\\n\\r\\n#sidebar-title {\\r\\n color: var(--darkGray);\\r\\n font-weight: bold;\\r\\n border-bottom: 1px solid var(--citygreen);\\r\\n}\\r\\n\\r\\nhr {\\r\\n margin-top: -5px;\\r\\n margin-bottom: 8px;\\r\\n}\\r\\n\\r\\nh6 {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.section-header {\\r\\n background-color: var(--mediumGray);\\r\\n}\\r\\n\\r\\n.sidebar-stat-line {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between; /* Distribute space between children */\\r\\n padding: 2px;\\r\\n border-bottom: 1px solid #ddd;\\r\\n}\\r\\n\\r\\n.edit-icon, .edit-supp {\\r\\n color: var(--spiritgreen);\\r\\n cursor: pointer;\\r\\n font-size: 16px; /* Adjust the size as needed */\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.edit-icon:hover .edit-supp:hover {\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n.stat-label {\\r\\n margin-right: auto; /* Push next elements to the right */\\r\\n}\\r\\n\\r\\n.stat {\\r\\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\\r\\n}\\r\\n\\r\\n.sidebar-stat-line.fund-total .stat {\\r\\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3M/M2IwMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3NpZGViYXItcGFuZWwge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXHJcbiAgICAvKiBtaW4taGVpZ2h0OiAxMDB2aDsgRnVsbCBoZWlnaHQgb2Ygdmlld3BvcnQgKi9cclxuICB9XHJcblxyXG4jc3VwcC10b3RhbCAuc3RhdCB7XHJcbiAgICBjb2xvcjogdmFyKC0teWVsbG93KTtcclxufVxyXG5cclxuLnN0YXQge1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbiNzaWRlYmFyLXBhbmVsIHtcclxuICAgIGhlaWdodDogMTAwJTsgLyogRnVsbCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0ICovXHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7IC8qIEZpeGVkIFNpZGViYXIgKHN0YXkgaW4gcGxhY2Ugb24gc2Nyb2xsKSAqL1xyXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cclxuICAgIHRvcDogMDsgLyogU3RheSBhdCB0aGUgdG9wICovXHJcbiAgICByaWdodDogMDsgLyogU2lkZWJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0ICovXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXHJcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47IC8qIERpc2FibGUgaG9yaXpvbnRhbCBzY3JvbGwgKi9cclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXHJcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjREREREREOyAvKiBSaWdodCBib3JkZXIgKi9cclxuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xyXG4gICAgLyogbWFyZ2luLXRvcDogdmFyKC0taGVhZGVyLWhlaWdodCk7ICovXHJcbiAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aCk7XHJcbiAgICBtYXJnaW46IDBweDtcclxuICB9XHJcbiAgXHJcbi5zaWRlYmFyIGEge1xyXG4gICAgcGFkZGluZzogMTBweCAxNXB4O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6ICM4MTgxODE7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHRyYW5zaXRpb246IDAuM3M7XHJcbn1cclxuXHJcbiNzaWRlYmFyLXRpdGxlIHtcclxuICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xyXG59XHJcblxyXG5ociB7XHJcbiAgbWFyZ2luLXRvcDogLTVweDtcclxuICBtYXJnaW4tYm90dG9tOiA4cHg7XHJcbn1cclxuXHJcbmg2IHtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG59XHJcblxyXG4uc2VjdGlvbi1oZWFkZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lZGl1bUdyYXkpO1xyXG59XHJcblxyXG4uc2lkZWJhci1zdGF0LWxpbmUge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IC8qIERpc3RyaWJ1dGUgc3BhY2UgYmV0d2VlbiBjaGlsZHJlbiAqL1xyXG4gIHBhZGRpbmc6IDJweDtcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcclxufVxyXG5cclxuLmVkaXQtaWNvbiwgLmVkaXQtc3VwcCB7XHJcbiAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgZm9udC1zaXplOiAxNnB4OyAvKiBBZGp1c3QgdGhlIHNpemUgYXMgbmVlZGVkICovXHJcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbn1cclxuXHJcbi5lZGl0LWljb246aG92ZXIgLmVkaXQtc3VwcDpob3ZlciB7XHJcbiAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbn1cclxuXHJcbi5zdGF0LWxhYmVsIHtcclxuICBtYXJnaW4tcmlnaHQ6IGF1dG87IC8qIFB1c2ggbmV4dCBlbGVtZW50cyB0byB0aGUgcmlnaHQgKi9cclxufVxyXG5cclxuLnN0YXQge1xyXG4gIG1hcmdpbi1sZWZ0OiA1cHg7IC8qIE9wdGlvbmFsOiBBZGQgc29tZSBzcGFjZSBiZXR3ZWVuIGN1cnJlbmN5IGFuZCBlZGl0IGljb24gKi9cclxufVxyXG5cclxuLnNpZGViYXItc3RhdC1saW5lLmZ1bmQtdG90YWwgLnN0YXQge1xyXG4gIG1hcmdpbi1yaWdodDogMDVweDsgLyogMjVweCBsaW5lcyB1cCB3aXRoIGxpbmVzIGFib3ZlICh3aXRoIGVkaXQgc3ltYm9sKSAqL1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksMkJBQTJCO0lBQzNCLCtDQUErQztFQUNqRDs7QUFFRjtJQUNJLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLFlBQVksRUFBRSxnQ0FBZ0M7SUFDOUMsZUFBZSxFQUFFLDRDQUE0QztJQUM3RCxVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLE1BQU0sRUFBRSxvQkFBb0I7SUFDNUIsUUFBUSxFQUFFLGdDQUFnQztJQUMxQyx5QkFBeUIsRUFBRSwyQkFBMkI7SUFDdEQsa0JBQWtCLEVBQUUsOEJBQThCO0lBQ2xELGFBQWE7SUFDYix3Q0FBd0MsRUFBRSw4QkFBOEI7SUFDeEUsK0JBQStCLEVBQUUsaUJBQWlCO0lBQ2xELCtCQUErQixFQUFFLGdDQUFnQztJQUNqRSxzQ0FBc0M7SUFDdEMsMkJBQTJCO0lBQzNCLFdBQVc7RUFDYjs7QUFFRjtJQUNJLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZ0JBQWdCO0FBQ3BCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGlCQUFpQjtFQUNqQix5Q0FBeUM7QUFDM0M7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsbUNBQW1DO0FBQ3JDOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQiw4QkFBOEIsRUFBRSxzQ0FBc0M7RUFDdEUsWUFBWTtFQUNaLDZCQUE2QjtBQUMvQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixlQUFlO0VBQ2YsZUFBZSxFQUFFLDhCQUE4QjtFQUMvQyxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxvQ0FBb0M7QUFDMUQ7O0FBRUE7RUFDRSxnQkFBZ0IsRUFBRSw0REFBNEQ7QUFDaEY7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxzREFBc0Q7QUFDNUVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI3NpZGViYXItcGFuZWwge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7ICBcXHJcXG4gICAgLyogbWluLWhlaWdodDogMTAwdmg7IEZ1bGwgaGVpZ2h0IG9mIHZpZXdwb3J0ICovXFxyXFxuICB9XFxyXFxuXFxyXFxuI3N1cHAtdG90YWwgLnN0YXQge1xcclxcbiAgICBjb2xvcjogdmFyKC0teWVsbG93KTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG59XFxyXFxuXFxyXFxuI3NpZGViYXItcGFuZWwge1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7IC8qIEZ1bGwgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAqL1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7IC8qIEZpeGVkIFNpZGViYXIgKHN0YXkgaW4gcGxhY2Ugb24gc2Nyb2xsKSAqL1xcclxcbiAgICB6LWluZGV4OiAxOyAvKiBTdGF5IG9uIHRvcCAqL1xcclxcbiAgICB0b3A6IDA7IC8qIFN0YXkgYXQgdGhlIHRvcCAqL1xcclxcbiAgICByaWdodDogMDsgLyogU2lkZWJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0ICovXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IC8qIFdoaXRlIGJhY2tncm91bmQgY29sb3IgKi9cXHJcXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuOyAvKiBEaXNhYmxlIGhvcml6b250YWwgc2Nyb2xsICovXFxyXFxuICAgIHBhZGRpbmc6IDIwcHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7IC8qIEFkZCBzaGFkb3cgZm9yIHNvbWUgZGVwdGggKi9cXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0RERERERDsgLyogUmlnaHQgYm9yZGVyICovXFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDBweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xcclxcbiAgICAvKiBtYXJnaW4tdG9wOiB2YXIoLS1oZWFkZXItaGVpZ2h0KTsgKi9cXHJcXG4gICAgd2lkdGg6IHZhcigtLXNpZGViYXItd2lkdGgpO1xcclxcbiAgICBtYXJnaW46IDBweDtcXHJcXG4gIH1cXHJcXG4gIFxcclxcbi5zaWRlYmFyIGEge1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gICAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgICBjb2xvcjogIzgxODE4MTtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxyXFxufVxcclxcblxcclxcbiNzaWRlYmFyLXRpdGxlIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG5ociB7XFxyXFxuICBtYXJnaW4tdG9wOiAtNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5oNiB7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VjdGlvbi1oZWFkZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XFxyXFxufVxcclxcblxcclxcbi5zaWRlYmFyLXN0YXQtbGluZSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgLyogRGlzdHJpYnV0ZSBzcGFjZSBiZXR3ZWVuIGNoaWxkcmVuICovXFxyXFxuICBwYWRkaW5nOiAycHg7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbiwgLmVkaXQtc3VwcCB7XFxyXFxuICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgZm9udC1zaXplOiAxNnB4OyAvKiBBZGp1c3QgdGhlIHNpemUgYXMgbmVlZGVkICovXFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbjpob3ZlciAuZWRpdC1zdXBwOmhvdmVyIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdC1sYWJlbCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87IC8qIFB1c2ggbmV4dCBlbGVtZW50cyB0byB0aGUgcmlnaHQgKi9cXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDVweDsgLyogT3B0aW9uYWw6IEFkZCBzb21lIHNwYWNlIGJldHdlZW4gY3VycmVuY3kgYW5kIGVkaXQgaWNvbiAqL1xcclxcbn1cXHJcXG5cXHJcXG4uc2lkZWJhci1zdGF0LWxpbmUuZnVuZC10b3RhbCAuc3RhdCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDA1cHg7IC8qIDI1cHggbGluZXMgdXAgd2l0aCBsaW5lcyBhYm92ZSAod2l0aCBlZGl0IHN5bWJvbCkgKi9cXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///263\n')},279:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#main-table {\r\n font-size: 12px;\r\n /* calc(0.5vw + 0.5em); */\r\n margin: auto;\r\n width: 100%;\r\n}\r\n\r\n#main-table thead > tr > th {\r\n text-align: left;\r\n background-color: var(--darkGray);\r\n color: white;\r\n position: -webkit-sticky; /* For Safari */\r\n position: sticky;\r\n top: 0;\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\nth {\r\n background-color: var(--lightGray);\r\n}\r\n\r\ntr {\r\n border-width: 2px;\r\n background-color: white;\r\n}\r\n\r\ntr td {\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Default to hidden columns */\r\n\r\n#main-table tbody > tr > td {\r\n display : none;\r\n}\r\n#main-table thead > tr > th {\r\n display : none;\r\n}\r\n\r\n/* textbox width in table */\r\ninput {\r\n width: 100%;\r\n}\r\n\r\nselect {\r\n max-width: 100px;\r\n}\r\n\r\ndiv.table-container {\r\n overflow-x: auto; \r\n overflow-y: auto;\r\n margin-left: max(65px, 7vh);\r\n margin-right: max(65px, 7vh);\r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n /* margin: auto; */\r\n max-height: max(350px, 6vh);\r\n /* min-height: 350px; */\r\n\r\n}\r\n \r\n/* Buttons */\r\n\r\n/* Add new row button */\r\n.btn-add { \r\n background-color: var(--spiritgreen);\r\n margin-top: 20px;\r\n display: none;\r\n}\r\n\r\n.btn-delete {\r\n background-color: var(--orange);\r\n}\r\n\r\n#add-btn-div {\r\n display: flex;\r\n justify-content: center; /* Aligns horizontally */\r\n align-items: center; /* Aligns vertically */\r\n width: 100%;\r\n}\r\n\r\n.btn-edit {\r\n background-color: var(--spiritgreen);\r\n line-height: 1.1;\r\n}\r\n\r\n.active-editing, .selected {\r\n background-color: var(--palegreen);\r\n}\r\n\r\n.selected { \r\n font-weight: bold;\r\n}\r\n\r\n.btn-confirm {\r\n display: none;\r\n}\r\n\r\n.confirm-btn:hover {\r\n background-color: var(--green);\r\n}\r\n\r\n.hover-effect:hover {\r\n cursor: pointer;\r\n background-color: var(--verypalegreen); \r\n}\r\n\r\n/* Fund table */\r\n.fund-name > .viewed-fund {\r\n color: gray;\r\n}\r\n\r\n/* made edit column narrower */\r\nth.edit, td.edit {\r\n width: 20px;\r\n}\r\n\r\n/* Class for hidden rows on filter */\r\n.hidden {\r\n display: none;\r\n}\r\n\r\n/* Filter styling for the dropdown options */\r\n#filter-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 2px; /* Adjust the gap as needed */\r\n font-size: 11px;\r\n margin-left: 10%;\r\n margin-right: 10%;\r\n margin-bottom: 5px;\r\n}\r\n\r\n#filter-container div {\r\n display: flex;\r\n align-items: center;\r\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\r\n}\r\n\r\n#filter-container label {\r\n width: 200px; /* Adjust the width as needed */\r\n text-align: right;\r\n margin-right: 10px; /* Spacing between label and select */\r\n}\r\n\r\n/* Ensure all select boxes are wide enough to show text */\r\n.filter-dropdown {\r\n flex: 1;\r\n min-width: 200px; /* Adjust the min-width as needed */\r\n}\r\n\r\n/* Optional styling to make the select dropdown look better */\r\n.filter-dropdown {\r\n padding: 5px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n}\r\n\r\n/* Responsive adjustment: On smaller screens, stack elements vertically */\r\n@media (max-width: 800px) {\r\n #filter-container div {\r\n width: 100%;\r\n }\r\n\r\n #filter-container label {\r\n text-align: left;\r\n width: auto;\r\n margin-right: 0;\r\n margin-bottom: 5px;\r\n }\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,yBAAyB;IACzB,YAAY;IACZ,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,iCAAiC;IACjC,YAAY;IACZ,wBAAwB,EAAE,eAAe;IACzC,gBAAgB;IAChB,MAAM;IACN,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;AAC3B;;AAEA;IACI,8BAA8B;AAClC;;AAEA,8BAA8B;;AAE9B;IACI,cAAc;AAClB;AACA;IACI,cAAc;AAClB;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,4BAA4B;IAC5B,oDAAoD;IACpD,kBAAkB;IAClB,2BAA2B;IAC3B,uBAAuB;;AAE3B;;AAEA,YAAY;;AAEZ,uBAAuB;AACvB;IACI,oCAAoC;IACpC,gBAAgB;IAChB,aAAa;AACjB;;AAEA;IACI,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW;AACf;;AAEA;IACI,oCAAoC;IACpC,gBAAgB;AACpB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC;AAC1C;;AAEA,eAAe;AACf;IACI,WAAW;AACf;;AAEA,8BAA8B;AAC9B;IACI,WAAW;AACf;;AAEA,oCAAoC;AACpC;IACI,aAAa;AACjB;;AAEA,4CAA4C;AAC5C;IACI,aAAa;IACb,eAAe;IACf,QAAQ,EAAE,6BAA6B;IACvC,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB,EAAE,mDAAmD;AAChF;;AAEA;IACI,YAAY,EAAE,+BAA+B;IAC7C,iBAAiB;IACjB,kBAAkB,EAAE,qCAAqC;AAC7D;;AAEA,yDAAyD;AACzD;IACI,OAAO;IACP,gBAAgB,EAAE,mCAAmC;AACzD;;AAEA,6DAA6D;AAC7D;IACI,YAAY;IACZ,sBAAsB;IACtB,kBAAkB;AACtB;;AAEA,yEAAyE;AACzE;IACI;QACI,WAAW;IACf;;IAEA;QACI,gBAAgB;QAChB,WAAW;QACX,eAAe;QACf,kBAAkB;IACtB;AACJ","sourcesContent":["#main-table {\\r\\n font-size: 12px;\\r\\n /* calc(0.5vw + 0.5em); */\\r\\n margin: auto;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n#main-table thead > tr > th {\\r\\n text-align: left;\\r\\n background-color: var(--darkGray);\\r\\n color: white;\\r\\n position: -webkit-sticky; /* For Safari */\\r\\n position: sticky;\\r\\n top: 0;\\r\\n padding-top: 5px;\\r\\n padding-bottom: 5px;\\r\\n padding-left: 5px;\\r\\n}\\r\\n\\r\\nth {\\r\\n background-color: var(--lightGray);\\r\\n}\\r\\n\\r\\ntr {\\r\\n border-width: 2px;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\ntr td {\\r\\n border-bottom: 1px solid black;\\r\\n}\\r\\n\\r\\n/* Default to hidden columns */\\r\\n\\r\\n#main-table tbody > tr > td {\\r\\n display : none;\\r\\n}\\r\\n#main-table thead > tr > th {\\r\\n display : none;\\r\\n}\\r\\n\\r\\n/* textbox width in table */\\r\\ninput {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\nselect {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\ndiv.table-container {\\r\\n overflow-x: auto; \\r\\n overflow-y: auto;\\r\\n margin-left: max(65px, 7vh);\\r\\n margin-right: max(65px, 7vh);\\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n /* margin: auto; */\\r\\n max-height: max(350px, 6vh);\\r\\n /* min-height: 350px; */\\r\\n\\r\\n}\\r\\n \\r\\n/* Buttons */\\r\\n\\r\\n/* Add new row button */\\r\\n.btn-add { \\r\\n background-color: var(--spiritgreen);\\r\\n margin-top: 20px;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.btn-delete {\\r\\n background-color: var(--orange);\\r\\n}\\r\\n\\r\\n#add-btn-div {\\r\\n display: flex;\\r\\n justify-content: center; /* Aligns horizontally */\\r\\n align-items: center; /* Aligns vertically */\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.btn-edit {\\r\\n background-color: var(--spiritgreen);\\r\\n line-height: 1.1;\\r\\n}\\r\\n\\r\\n.active-editing, .selected {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n\\r\\n.selected { \\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.btn-confirm {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.confirm-btn:hover {\\r\\n background-color: var(--green);\\r\\n}\\r\\n\\r\\n.hover-effect:hover {\\r\\n cursor: pointer;\\r\\n background-color: var(--verypalegreen); \\r\\n}\\r\\n\\r\\n/* Fund table */\\r\\n.fund-name > .viewed-fund {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n/* made edit column narrower */\\r\\nth.edit, td.edit {\\r\\n width: 20px;\\r\\n}\\r\\n\\r\\n/* Class for hidden rows on filter */\\r\\n.hidden {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* Filter styling for the dropdown options */\\r\\n#filter-container {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 2px; /* Adjust the gap as needed */\\r\\n font-size: 11px;\\r\\n margin-left: 10%;\\r\\n margin-right: 10%;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n#filter-container div {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\\r\\n}\\r\\n\\r\\n#filter-container label {\\r\\n width: 200px; /* Adjust the width as needed */\\r\\n text-align: right;\\r\\n margin-right: 10px; /* Spacing between label and select */\\r\\n}\\r\\n\\r\\n/* Ensure all select boxes are wide enough to show text */\\r\\n.filter-dropdown {\\r\\n flex: 1;\\r\\n min-width: 200px; /* Adjust the min-width as needed */\\r\\n}\\r\\n\\r\\n/* Optional styling to make the select dropdown look better */\\r\\n.filter-dropdown {\\r\\n padding: 5px;\\r\\n border: 1px solid #ccc;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n/* Responsive adjustment: On smaller screens, stack elements vertically */\\r\\n@media (max-width: 800px) {\\r\\n #filter-container div {\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n #filter-container label {\\r\\n text-align: left;\\r\\n width: auto;\\r\\n margin-right: 0;\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNzcz81MjM3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjbWFpbi10YWJsZSB7XHJcbiAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAvKiBjYWxjKDAuNXZ3ICsgMC41ZW0pOyAqL1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyAvKiBGb3IgU2FmYXJpICovXHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxufVxyXG5cclxudGgge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxufVxyXG5cclxudHIge1xyXG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxudHIgdGQge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xyXG59XHJcblxyXG4vKiBEZWZhdWx0IHRvIGhpZGRlbiBjb2x1bW5zICovXHJcblxyXG4jbWFpbi10YWJsZSB0Ym9keSA+IHRyID4gdGQge1xyXG4gICAgZGlzcGxheSA6IG5vbmU7XHJcbn1cclxuI21haW4tdGFibGUgdGhlYWQgPiB0ciA+IHRoIHtcclxuICAgIGRpc3BsYXkgOiBub25lO1xyXG59XHJcblxyXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXHJcbmlucHV0IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG5zZWxlY3Qge1xyXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcclxufVxyXG5cclxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XHJcbiAgICBvdmVyZmxvdy14OiBhdXRvOyBcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICBtYXJnaW4tbGVmdDogbWF4KDY1cHgsIDd2aCk7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IG1heCg2NXB4LCA3dmgpO1xyXG4gICAgLyogbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAgKi9cclxuICAgIC8qIG1hcmdpbjogYXV0bzsgKi9cclxuICAgIG1heC1oZWlnaHQ6IG1heCgzNTBweCwgNnZoKTtcclxuICAgIC8qIG1pbi1oZWlnaHQ6IDM1MHB4OyAqL1xyXG5cclxufVxyXG4gIFxyXG4vKiBCdXR0b25zICovXHJcblxyXG4vKiBBZGQgbmV3IHJvdyBidXR0b24gKi9cclxuLmJ0bi1hZGQgeyBcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uYnRuLWRlbGV0ZSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xyXG59XHJcblxyXG4jYWRkLWJ0bi1kaXYge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBBbGlnbnMgaG9yaXpvbnRhbGx5ICovXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5idG4tZWRpdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBsaW5lLWhlaWdodDogMS4xO1xyXG59XHJcblxyXG4uYWN0aXZlLWVkaXRpbmcsIC5zZWxlY3RlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG59XHJcblxyXG4uc2VsZWN0ZWQgeyBcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uYnRuLWNvbmZpcm0ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmNvbmZpcm0tYnRuOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdyZWVuKTtcclxufVxyXG5cclxuLmhvdmVyLWVmZmVjdDpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12ZXJ5cGFsZWdyZWVuKTsgXHJcbn1cclxuXHJcbi8qIEZ1bmQgdGFibGUgKi9cclxuLmZ1bmQtbmFtZSA+IC52aWV3ZWQtZnVuZCB7XHJcbiAgICBjb2xvcjogZ3JheTtcclxufVxyXG5cclxuLyogbWFkZSBlZGl0IGNvbHVtbiBuYXJyb3dlciAqL1xyXG50aC5lZGl0LCB0ZC5lZGl0IHtcclxuICAgIHdpZHRoOiAyMHB4O1xyXG59XHJcblxyXG4vKiBDbGFzcyBmb3IgaGlkZGVuIHJvd3Mgb24gZmlsdGVyICovXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLyogRmlsdGVyIHN0eWxpbmcgZm9yIHRoZSBkcm9wZG93biBvcHRpb25zICovXHJcbiNmaWx0ZXItY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICBnYXA6IDJweDsgLyogQWRqdXN0IHRoZSBnYXAgYXMgbmVlZGVkICovXHJcbiAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMTAlO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMCU7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbn1cclxuXHJcbiNmaWx0ZXItY29udGFpbmVyIGRpdiB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIHdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpOyAvKiBBZGp1c3Qgd2lkdGggdG8gZml0IHR3byBpdGVtcyBwZXIgcm93IHdpdGggZ2FwICovXHJcbn1cclxuXHJcbiNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcclxuICAgIHdpZHRoOiAyMDBweDsgLyogQWRqdXN0IHRoZSB3aWR0aCBhcyBuZWVkZWQgKi9cclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyAvKiBTcGFjaW5nIGJldHdlZW4gbGFiZWwgYW5kIHNlbGVjdCAqL1xyXG59XHJcblxyXG4vKiBFbnN1cmUgYWxsIHNlbGVjdCBib3hlcyBhcmUgd2lkZSBlbm91Z2ggdG8gc2hvdyB0ZXh0ICovXHJcbi5maWx0ZXItZHJvcGRvd24ge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgbWluLXdpZHRoIGFzIG5lZWRlZCAqL1xyXG59XHJcblxyXG4vKiBPcHRpb25hbCBzdHlsaW5nIHRvIG1ha2UgdGhlIHNlbGVjdCBkcm9wZG93biBsb29rIGJldHRlciAqL1xyXG4uZmlsdGVyLWRyb3Bkb3duIHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbn1cclxuXHJcbi8qIFJlc3BvbnNpdmUgYWRqdXN0bWVudDogT24gc21hbGxlciBzY3JlZW5zLCBzdGFjayBlbGVtZW50cyB2ZXJ0aWNhbGx5ICovXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xyXG4gICAgI2ZpbHRlci1jb250YWluZXIgZGl2IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAjZmlsdGVyLWNvbnRhaW5lciBsYWJlbCB7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgICAgICB3aWR0aDogYXV0bztcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xyXG4gICAgfVxyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaUNBQWlDO0lBQ2pDLFlBQVk7SUFDWix3QkFBd0IsRUFBRSxlQUFlO0lBQ3pDLGdCQUFnQjtJQUNoQixNQUFNO0lBQ04sZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxrQ0FBa0M7QUFDdEM7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBLDhCQUE4Qjs7QUFFOUI7SUFDSSxjQUFjO0FBQ2xCO0FBQ0E7SUFDSSxjQUFjO0FBQ2xCOztBQUVBLDJCQUEyQjtBQUMzQjtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1QixvREFBb0Q7SUFDcEQsa0JBQWtCO0lBQ2xCLDJCQUEyQjtJQUMzQix1QkFBdUI7O0FBRTNCOztBQUVBLFlBQVk7O0FBRVosdUJBQXVCO0FBQ3ZCO0lBQ0ksb0NBQW9DO0lBQ3BDLGdCQUFnQjtJQUNoQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksK0JBQStCO0FBQ25DOztBQUVBO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QixFQUFFLHdCQUF3QjtJQUNqRCxtQkFBbUIsRUFBRSxzQkFBc0I7SUFDM0MsV0FBVztBQUNmOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0Qzs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysc0NBQXNDO0FBQzFDOztBQUVBLGVBQWU7QUFDZjtJQUNJLFdBQVc7QUFDZjs7QUFFQSw4QkFBOEI7QUFDOUI7SUFDSSxXQUFXO0FBQ2Y7O0FBRUEsb0NBQW9DO0FBQ3BDO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLFFBQVEsRUFBRSw2QkFBNkI7SUFDdkMsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUIsRUFBRSxtREFBbUQ7QUFDaEY7O0FBRUE7SUFDSSxZQUFZLEVBQUUsK0JBQStCO0lBQzdDLGlCQUFpQjtJQUNqQixrQkFBa0IsRUFBRSxxQ0FBcUM7QUFDN0Q7O0FBRUEseURBQXlEO0FBQ3pEO0lBQ0ksT0FBTztJQUNQLGdCQUFnQixFQUFFLG1DQUFtQztBQUN6RDs7QUFFQSw2REFBNkQ7QUFDN0Q7SUFDSSxZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLGtCQUFrQjtBQUN0Qjs7QUFFQSx5RUFBeUU7QUFDekU7SUFDSTtRQUNJLFdBQVc7SUFDZjs7SUFFQTtRQUNJLGdCQUFnQjtRQUNoQixXQUFXO1FBQ1gsZUFBZTtRQUNmLGtCQUFrQjtJQUN0QjtBQUNKXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNtYWluLXRhYmxlIHtcXHJcXG4gICAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgICAvKiBjYWxjKDAuNXZ3ICsgMC41ZW0pOyAqL1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4jbWFpbi10YWJsZSB0aGVhZCA+IHRyID4gdGgge1xcclxcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyAvKiBGb3IgU2FmYXJpICovXFxyXFxuICAgIHBvc2l0aW9uOiBzdGlja3k7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgcGFkZGluZy10b3A6IDVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxyXFxufVxcclxcblxcclxcbnRoIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxudHIge1xcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbnRyIHRkIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBEZWZhdWx0IHRvIGhpZGRlbiBjb2x1bW5zICovXFxyXFxuXFxyXFxuI21haW4tdGFibGUgdGJvZHkgPiB0ciA+IHRkIHtcXHJcXG4gICAgZGlzcGxheSA6IG5vbmU7XFxyXFxufVxcclxcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XFxyXFxuICAgIGRpc3BsYXkgOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXFxyXFxuaW5wdXQge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuc2VsZWN0IHtcXHJcXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XFxyXFxuICAgIG92ZXJmbG93LXg6IGF1dG87IFxcclxcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tbGVmdDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIC8qIG1hcmdpbjogYXV0bzsgKi9cXHJcXG4gICAgbWF4LWhlaWdodDogbWF4KDM1MHB4LCA2dmgpO1xcclxcbiAgICAvKiBtaW4taGVpZ2h0OiAzNTBweDsgKi9cXHJcXG5cXHJcXG59XFxyXFxuICBcXHJcXG4vKiBCdXR0b25zICovXFxyXFxuXFxyXFxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXFxyXFxuLmJ0bi1hZGQgeyBcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWRlbGV0ZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW9yYW5nZSk7XFxyXFxufVxcclxcblxcclxcbiNhZGQtYnRuLWRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBBbGlnbnMgaG9yaXpvbnRhbGx5ICovXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIEFsaWducyB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWVkaXQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIGxpbmUtaGVpZ2h0OiAxLjE7XFxyXFxufVxcclxcblxcclxcbi5hY3RpdmUtZWRpdGluZywgLnNlbGVjdGVkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdGVkIHsgXFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWNvbmZpcm0ge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlybS1idG46aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ncmVlbik7XFxyXFxufVxcclxcblxcclxcbi5ob3Zlci1lZmZlY3Q6aG92ZXIge1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZlcnlwYWxlZ3JlZW4pOyBcXHJcXG59XFxyXFxuXFxyXFxuLyogRnVuZCB0YWJsZSAqL1xcclxcbi5mdW5kLW5hbWUgPiAudmlld2VkLWZ1bmQge1xcclxcbiAgICBjb2xvcjogZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuLyogbWFkZSBlZGl0IGNvbHVtbiBuYXJyb3dlciAqL1xcclxcbnRoLmVkaXQsIHRkLmVkaXQge1xcclxcbiAgICB3aWR0aDogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ2xhc3MgZm9yIGhpZGRlbiByb3dzIG9uIGZpbHRlciAqL1xcclxcbi5oaWRkZW4ge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGaWx0ZXIgc3R5bGluZyBmb3IgdGhlIGRyb3Bkb3duIG9wdGlvbnMgKi9cXHJcXG4jZmlsdGVyLWNvbnRhaW5lciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGZsZXgtd3JhcDogd3JhcDtcXHJcXG4gICAgZ2FwOiAycHg7IC8qIEFkanVzdCB0aGUgZ2FwIGFzIG5lZWRlZCAqL1xcclxcbiAgICBmb250LXNpemU6IDExcHg7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAxMCU7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMTAlO1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XFxyXFxufVxcclxcblxcclxcbiNmaWx0ZXItY29udGFpbmVyIGRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIHdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpOyAvKiBBZGp1c3Qgd2lkdGggdG8gZml0IHR3byBpdGVtcyBwZXIgcm93IHdpdGggZ2FwICovXFxyXFxufVxcclxcblxcclxcbiNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcXHJcXG4gICAgd2lkdGg6IDIwMHB4OyAvKiBBZGp1c3QgdGhlIHdpZHRoIGFzIG5lZWRlZCAqL1xcclxcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyAvKiBTcGFjaW5nIGJldHdlZW4gbGFiZWwgYW5kIHNlbGVjdCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBFbnN1cmUgYWxsIHNlbGVjdCBib3hlcyBhcmUgd2lkZSBlbm91Z2ggdG8gc2hvdyB0ZXh0ICovXFxyXFxuLmZpbHRlci1kcm9wZG93biB7XFxyXFxuICAgIGZsZXg6IDE7XFxyXFxuICAgIG1pbi13aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgbWluLXdpZHRoIGFzIG5lZWRlZCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBPcHRpb25hbCBzdHlsaW5nIHRvIG1ha2UgdGhlIHNlbGVjdCBkcm9wZG93biBsb29rIGJldHRlciAqL1xcclxcbi5maWx0ZXItZHJvcGRvd24ge1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogUmVzcG9uc2l2ZSBhZGp1c3RtZW50OiBPbiBzbWFsbGVyIHNjcmVlbnMsIHN0YWNrIGVsZW1lbnRzIHZlcnRpY2FsbHkgKi9cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogODAwcHgpIHtcXHJcXG4gICAgI2ZpbHRlci1jb250YWluZXIgZGl2IHtcXHJcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICB9XFxyXFxuXFxyXFxuICAgICNmaWx0ZXItY29udGFpbmVyIGxhYmVsIHtcXHJcXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICAgICAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgICAgIG1hcmdpbi1yaWdodDogMDtcXHJcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG4gICAgfVxcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///279\n')},843:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#tooltip {\r\n position: absolute;\r\n background-color: black;\r\n color: white;\r\n padding: 5px;\r\n border-radius: 3px;\r\n visibility: hidden;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n z-index: 1000;\r\n max-width: 300px;\r\n word-wrap: break-word;\r\n white-space: normal;\r\n}\r\n\r\n.tooltip-cell {\r\n /* color: blue; */\r\n /* text-decoration: underline; */\r\n cursor: pointer;\r\n}\r\n\r\n.tooltip-cell .info-icon {\r\n margin-left: 5px;\r\n color: var(--spiritgreen);\r\n font-size: 15px;\r\n}\r\n\r\n.tooltip-cell:hover {\r\n background-color: #f0f0f0; /* Change background on hover */\r\n}\r\n\r\n.detail {\r\n color: blue;\r\n color: var(--spiritgreen);\r\n text-decoration: underline;\r\n margin-left: 5px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/tooltip/tooltip.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,uBAAuB;IACvB,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;AACvB;;AAEA;IACI,iBAAiB;IACjB,gCAAgC;IAChC,eAAe;AACnB;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;AACnB;;AAEA;IACI,yBAAyB,EAAE,+BAA+B;AAC9D;;AAEA;IACI,WAAW;IACX,yBAAyB;IACzB,0BAA0B;IAC1B,gBAAgB;AACpB","sourcesContent":["#tooltip {\\r\\n position: absolute;\\r\\n background-color: black;\\r\\n color: white;\\r\\n padding: 5px;\\r\\n border-radius: 3px;\\r\\n visibility: hidden;\\r\\n white-space: nowrap;\\r\\n font-size: 14px;\\r\\n z-index: 1000;\\r\\n max-width: 300px;\\r\\n word-wrap: break-word;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.tooltip-cell {\\r\\n /* color: blue; */\\r\\n /* text-decoration: underline; */\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tooltip-cell .info-icon {\\r\\n margin-left: 5px;\\r\\n color: var(--spiritgreen);\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.tooltip-cell:hover {\\r\\n background-color: #f0f0f0; /* Change background on hover */\\r\\n}\\r\\n\\r\\n.detail {\\r\\n color: blue;\\r\\n color: var(--spiritgreen);\\r\\n text-decoration: underline;\\r\\n margin-left: 5px;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5jc3M/N2ZkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3Rvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgei1pbmRleDogMTAwMDtcclxuICAgIG1heC13aWR0aDogMzAwcHg7XHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG59XHJcblxyXG4udG9vbHRpcC1jZWxsIHtcclxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xyXG4gICAgLyogdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7ICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi50b29sdGlwLWNlbGwgLmluZm8taWNvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGZvbnQtc2l6ZTogMTVweDtcclxufVxyXG5cclxuLnRvb2x0aXAtY2VsbDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xyXG59XHJcblxyXG4uZGV0YWlsIHtcclxuICAgIGNvbG9yOiBibHVlO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCLEVBQUUsK0JBQStCO0FBQzlEOztBQUVBO0lBQ0ksV0FBVztJQUNYLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiN0b29sdGlwIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIHotaW5kZXg6IDEwMDA7XFxyXFxuICAgIG1heC13aWR0aDogMzAwcHg7XFxyXFxuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXHJcXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvb2x0aXAtY2VsbCB7XFxyXFxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xcclxcbiAgICAvKiB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udG9vbHRpcC1jZWxsIC5pbmZvLWljb24ge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBmb250LXNpemU6IDE1cHg7XFxyXFxufVxcclxcblxcclxcbi50b29sdGlwLWNlbGw6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZGV0YWlsIHtcXHJcXG4gICAgY29sb3I6IGJsdWU7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///843\n')},235:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Welcome page (index.html) */\r\n\r\n.step {\r\n width: 60%;\r\n height: 80px;\r\n font-size: 1.75em;\r\n margin-bottom: 0px; /* Adds spacing between buttons */\r\n margin-left: 20%;\r\n border-color: var(--citygreen);\r\n border-width: 2;\r\n color: var(--citygreen);\r\n background-color: white;\r\n}\r\n\r\n.step:hover {\r\n color: white;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#welcome-page {\r\n justify-content: center; \r\n align-items: center; \r\n padding-top: 20px;\r\n}\r\n.step.disabled {\r\n opacity: 50%;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/welcome/welcome.css"],"names":[],"mappings":"AAAA,8BAA8B;;AAE9B;IACI,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB,EAAE,iCAAiC;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,eAAe;IACf,uBAAuB;IACvB,uBAAuB;AAC3B;;AAEA;IACI,YAAY;IACZ,oCAAoC;AACxC;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;AACrB;AACA;IACI,YAAY;AAChB","sourcesContent":["/* Welcome page (index.html) */\\r\\n\\r\\n.step {\\r\\n width: 60%;\\r\\n height: 80px;\\r\\n font-size: 1.75em;\\r\\n margin-bottom: 0px; /* Adds spacing between buttons */\\r\\n margin-left: 20%;\\r\\n border-color: var(--citygreen);\\r\\n border-width: 2;\\r\\n color: var(--citygreen);\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.step:hover {\\r\\n color: white;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#welcome-page {\\r\\n justify-content: center; \\r\\n align-items: center; \\r\\n padding-top: 20px;\\r\\n}\\r\\n.step.disabled {\\r\\n opacity: 50%;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cclxuXHJcbi5zdGVwIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBoZWlnaHQ6IDgwcHg7XHJcbiAgICBmb250LXNpemU6IDEuNzVlbTtcclxuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcclxuICAgIGJvcmRlci13aWR0aDogMjtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5zdGVwOmhvdmVyIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufVxyXG5cclxuI3dlbGNvbWUtcGFnZSB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG59XHJcbi5zdGVwLmRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDUwJTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSw4QkFBOEI7O0FBRTlCO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsa0JBQWtCLEVBQUUsaUNBQWlDO0lBQ3JELGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxZQUFZO0lBQ1osb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogV2VsY29tZSBwYWdlIChpbmRleC5odG1sKSAqL1xcclxcblxcclxcbi5zdGVwIHtcXHJcXG4gICAgd2lkdGg6IDYwJTtcXHJcXG4gICAgaGVpZ2h0OiA4MHB4O1xcclxcbiAgICBmb250LXNpemU6IDEuNzVlbTtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMHB4OyAvKiBBZGRzIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAyO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5zdGVwOmhvdmVyIHtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiN3ZWxjb21lLXBhZ2Uge1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IFxcclxcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcXHJcXG59XFxyXFxuLnN0ZXAuZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///235\n')},314:module=>{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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///314\n')},354:module=>{eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///354\n')},72:module=>{eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72\n')},659:module=>{eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///659\n')},540:module=>{eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcz9kZTZjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///540\n')},56:(module,__unused_webpack_exports,__webpack_require__)=>{eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n')},825:module=>{eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///825\n')},113:module=>{eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\n")}},__webpack_module_cache__={};function __webpack_require__(n){var c=__webpack_module_cache__[n];if(void 0!==c)return c.exports;var t=__webpack_module_cache__[n]={id:n,exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=n=>{var c=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(c,{a:c}),c},__webpack_require__.d=(n,c)=>{for(var t in c)__webpack_require__.o(c,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:c[t]})},__webpack_require__.o=(n,c)=>Object.prototype.hasOwnProperty.call(n,c),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(863)})(); \ No newline at end of file +(()=>{"use strict";var __webpack_modules__={424:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{eval("\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(72);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(825);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(659);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(56);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(540);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(113);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/css/common.css\nvar common = __webpack_require__(404);\n;// CONCATENATED MODULE: ./src/css/common.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\noptions.insert = insertBySelector_default().bind(null, \"head\");\noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(common/* default */.A, options);\n\n\n\n\n /* harmony default export */ const css_common = (common/* default */.A && common/* default */.A.locals ? common/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/welcome/welcome.css\nvar welcome = __webpack_require__(235);\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.css\n\n \n \n \n \n \n \n \n \n \n\nvar welcome_options = {};\n\nwelcome_options.styleTagTransform = (styleTagTransform_default());\nwelcome_options.setAttributes = (setAttributesWithoutAttributes_default());\nwelcome_options.insert = insertBySelector_default().bind(null, \"head\");\nwelcome_options.domAPI = (styleDomAPI_default());\nwelcome_options.insertStyleElement = (insertStyleElement_default());\n\nvar welcome_update = injectStylesIntoStyleTag_default()(welcome/* default */.A, welcome_options);\n\n\n\n\n /* harmony default export */ const welcome_welcome = (welcome/* default */.A && welcome/* default */.A.locals ? welcome/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.js\n\n\n// Hide and unhide welcome buttons\nfunction unhideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"block\";\n}\nfunction hideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"none\";\n}\nconst Welcome = {\n show: unhideWelcomeButtons,\n hide: hideWelcomeButtons\n};\n/* harmony default export */ const components_welcome_welcome = (Welcome);\n;// CONCATENATED MODULE: ./src/js/constants/budget_constants.js\n// Set to equal current fiscal year\nvar FISCAL_YEAR = '26';\n\n// object categories (from obj part of account string)\nconst OBJ_CATEGORIES = {\n list: [\n // 'Salaries & Wages',\n // 'Employee Benefits',\n 'Professional & Contractual Services', 'Operating Supplies', 'Operating Services', 'Equipment Acquisition', 'Capital Outlays', 'Fixed Charges', 'Other Expenses']\n};\n\n// from the drop-down menu\nconst EMPLOYEE_TYPES = ['Regular', 'TASS', 'Seasonal', 'Uniform Fire', 'Uniform Police', 'Appointed', 'Elected', 'Long Term Disability', 'New Position'];\nconst OT_OBJECTS = ['601300 - Salar-Overtime-Gen City', '601305 - Salaries-Overtime-Police Unif', '601310 - Salaries-Overtime-Fire Unif', '602300 - Wages-Overtime-Gen City'];\n\n// Nice names for the pages\nconst PAGE_LABELS = {\n 'welcome': 'Welcome Page',\n 'upload': 'Excel Upload',\n 'baseline-landing': 'Fund Selection',\n 'revenue': 'Revenue',\n 'personnel': 'Personnel',\n 'overtime': 'Overtime',\n 'nonpersonnel': 'Non-Personnel',\n 'new-inits': 'New Initiatives (Supplementals)',\n 'summary': 'Summary Page',\n 'finish': 'Download & Finish'\n};\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(225);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.css\n\n \n \n \n \n \n \n \n \n \n\nvar prompt_options = {};\n\nprompt_options.styleTagTransform = (styleTagTransform_default());\nprompt_options.setAttributes = (setAttributesWithoutAttributes_default());\nprompt_options.insert = insertBySelector_default().bind(null, \"head\");\nprompt_options.domAPI = (styleDomAPI_default());\nprompt_options.insertStyleElement = (insertStyleElement_default());\n\nvar prompt_update = injectStylesIntoStyleTag_default()(prompt_prompt/* default */.A, prompt_options);\n\n\n\n\n /* harmony default export */ const components_prompt_prompt = (prompt_prompt/* default */.A && prompt_prompt/* default */.A.locals ? prompt_prompt/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/text.js\nfunction showPrompt() {\n document.getElementById(\"prompt-div\").style.display = \"block\";\n}\nfunction hidePrompt() {\n document.getElementById('prompt-div').style.display = 'none';\n}\nfunction updatePrompt(prompt) {\n document.getElementById('prompt').innerHTML = prompt;\n showPrompt();\n}\nconst Text = {\n show: showPrompt,\n hide: hidePrompt,\n update: function (text) {\n updatePrompt(text);\n }\n};\n/* harmony default export */ const subcomponents_text = (Text);\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/buttons.js\nfunction showPromptButton(id) {\n // make buttons visible\n document.getElementById(id).style.display = 'inline';\n}\nfunction updatePromptButton(id, text) {\n document.getElementById(id).textContent = text;\n showPromptButton(id);\n}\nfunction hidePromptButton(id) {\n document.getElementById(id).style.display = 'none';\n}\nfunction unclickAll() {\n document.getElementById('option1').classList.remove('clicked');\n document.getElementById('option2').classList.remove('clicked');\n}\nfunction applyClickedStyle(button) {\n unclickAll();\n button.classList.add('clicked');\n}\nfunction addPromptButtonAction(button_id, action_fn) {\n const buttonElement = document.getElementById(button_id);\n buttonElement.addEventListener('click', action_fn);\n buttonElement.addEventListener('click', function () {\n applyClickedStyle(this);\n });\n}\nfunction removePromptButtonAction(button_id, action_fn) {\n document.getElementById(button_id).removeEventListener('click', action_fn);\n}\nfunction disable(button_id) {\n document.querySelector(`#${button_id}`).classList.add('disabled');\n}\nfunction enable(button_id) {\n document.querySelector(`#${button_id}`).classList.remove('disabled');\n}\nconst Left = {\n show: function () {\n showPromptButton('option1');\n },\n hide: function () {\n hidePromptButton('option1');\n },\n updateText: function (text) {\n updatePromptButton('option1', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option1', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option1', action_fn);\n },\n disable: function () {\n disable('option1');\n },\n enable: function () {\n enable('option1');\n }\n};\nconst Right = {\n show: function () {\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option2');\n },\n updateText: function (text) {\n updatePromptButton('option2', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option2', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option2', action_fn);\n },\n disable: function () {\n disable('option2');\n },\n enable: function () {\n enable('option2');\n }\n};\nconst Buttons = {\n Left: Left,\n Right: Right,\n show: function () {\n showPromptButton('option1');\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option1');\n hidePromptButton('option2');\n },\n reset: unclickAll\n};\n/* harmony default export */ const buttons = (Buttons);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.js\n\n\n\nconst Prompt = {\n Text: subcomponents_text,\n Buttons: buttons,\n hide: function () {\n subcomponents_text.hide();\n buttons.hide();\n },\n show: function () {\n subcomponents_text.show();\n buttons.show();\n }\n};\n/* harmony default export */ const js_components_prompt_prompt = (Prompt);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/sidebar/sidebar.css\nvar sidebar = __webpack_require__(263);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.css\n\n \n \n \n \n \n \n \n \n \n\nvar sidebar_options = {};\n\nsidebar_options.styleTagTransform = (styleTagTransform_default());\nsidebar_options.setAttributes = (setAttributesWithoutAttributes_default());\nsidebar_options.insert = insertBySelector_default().bind(null, \"head\");\nsidebar_options.domAPI = (styleDomAPI_default());\nsidebar_options.insertStyleElement = (insertStyleElement_default());\n\nvar sidebar_update = injectStylesIntoStyleTag_default()(sidebar/* default */.A, sidebar_options);\n\n\n\n\n /* harmony default export */ const sidebar_sidebar = (sidebar/* default */.A && sidebar/* default */.A.locals ? sidebar/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/constants/excel_constants.js\n\n\n// sheets to expect on detail sheet\nconst SHEETS = {\n 'FTE, Salary-Wage, & Benefits': 'personnel',\n 'Overtime & Other Personnel': 'overtime',\n 'Non-Personnel': 'nonpersonnel',\n 'Revenue': 'revenue',\n 'Initiatives Summary': 'new-inits'\n};\n\n// where to find the general fund target\nconst TARGET_CELL_ADDRESS = 'C14';\nconst TOTAL_COLUMNS = {\n 'personnel': 'Total Sal/Wag & Ben Request',\n 'overtime': `FY${FISCAL_YEAR} Total OT/SP/Hol + FICA Request`,\n 'nonpersonnel': `FY${FISCAL_YEAR} Departmental Request Total`,\n 'revenue': `FY${FISCAL_YEAR} Departmental Estimate Total`,\n 'new-inits': `Total Initiative Request`\n};\nconst NEW_INIT_COLS = {\n 'personnel': 'Personnel Salary & Benefits',\n 'operating': 'Non-Personnel Operating',\n 'capital': 'Non-Personnel Capital',\n 'revenue': 'Revenue',\n 'name': 'Supplemental Initiative',\n 'total': TOTAL_COLUMNS['new-inits']\n};\n;// CONCATENATED MODULE: ./src/js/constants/index.js\n\n\n;// CONCATENATED MODULE: ./src/js/utils/common_utils.js\n// Function to format number as currency\nconst formatCurrency = (amount, return_zero = false) => {\n var amount = Math.round(parseFloat(amount));\n if (amount == NaN) {\n return \"$ -\";\n }\n if (amount < 0) {\n return '($' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ')';\n } else if (amount == 0) {\n if (return_zero) {\n return '$0';\n }\n return \"$ -\";\n }\n return '$' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// function to convert formatted number to a float\nconst unformatCurrency = formattedAmount => {\n if (!formattedAmount) {\n return 0;\n }\n ;\n // Remove any currency symbols and commas\n let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, \"\");\n if (numericalPart == '-') {\n return 0;\n }\n return parseFloat(numericalPart);\n};\nfunction displayWithCommas(value) {\n if (value == 0) {\n return 0;\n }\n return formatCurrency(value).replace('$', '');\n}\nfunction cleanString(str) {\n return str.toLowerCase().replaceAll(' ', '-');\n}\nfunction removeNewLines(str) {\n // replace all new lines with spaces\n str = str.replaceAll(/[\\r\\n]+/g, \" \");\n // remove any extra spaces or trailing/leading whitespace\n str = str.replaceAll(' ', ' ');\n str = str.replaceAll(' ', ' ');\n str = str.replace(/^\\s+|\\s+$/g, '');\n return str;\n}\nfunction colSum(table, colName) {\n // fill with zero until there is something saved in storage\n if (!table || table == '') {\n return 0;\n }\n const headers = Object.keys(table[0]);\n if (headers.includes(colName)) {\n let sum = 0;\n for (let i = 0; i < table.length; i++) {\n var value = Math.round(parseFloat(table[i][colName]));\n // treat NaN (non-numerics) as zeroes\n if (value) {\n sum += value;\n }\n }\n return sum;\n } else {\n // console.error(`Could not find expected total column in saved data for ${name}. Returning 0. See StoredTable.totalCol() switch.`);\n return 0;\n }\n}\nfunction getUniqueValues(data, key) {\n const values = data.map(obj => obj[key]);\n return Array.from(new Set(values));\n}\n\n// Define a function to introduce a delay\nfunction delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n;// CONCATENATED MODULE: ./src/js/models/fund_lookup_table.js\n\n\nconst FundLookupTable = {\n retrieve: function () {\n return JSON.parse(localStorage.getItem('fund-lookup-table')) || {};\n },\n save: function (fundDict) {\n localStorage.setItem('fund-lookup-table', JSON.stringify(fundDict));\n },\n update: function (fundData) {\n // reset\n this.reset();\n // fill in with data stored in fundDate\n const table = this.retrieve();\n for (let fund of Object.keys(fundData)) {\n // add to lookup table if not in there already\n if (!table[fund]) {\n // get fund name\n const fundName = fundData[fund][0]['Fund Name'];\n // add fund to dictionary\n table[fund] = {};\n table[fund]['name'] = fundName;\n table[fund]['viewed'] = false;\n // build lists of unique cost centers and appropriations\n table[fund]['approp'] = getUniqueValues(fundData[fund], 'Appropriation Name');\n table[fund]['cc'] = getUniqueValues(fundData[fund], 'Cost Center Name');\n }\n }\n // save any updates\n this.save(table);\n },\n getAll: function (key) {\n // function to aggregate all approps or CCs for every fund in one array\n const funds = this.retrieve();\n const ret = [];\n for (const fund in funds) {\n if (funds.hasOwnProperty(fund)) {\n for (let i in funds[fund][key]) {\n ret.push(funds[fund][key][i]);\n }\n }\n }\n return ret;\n },\n getCostCenters: function (extraOption) {\n // get current fund\n const fund = current_fund.number();\n let ret = [];\n if (this.retrieve()[fund]) {\n ret = this.retrieve()[fund]['cc'];\n } else {\n // if no fund (ie. we're on the new initiative page), return all options\n ret = this.getAll('cc');\n }\n ;\n // add extra option if given\n if (extraOption) {\n ret.push(extraOption);\n }\n return ret;\n },\n getApprops: function (extraOption) {\n // get current fund\n const fund = current_fund.number();\n let ret = [];\n if (this.retrieve()[fund]) {\n ret = this.retrieve()[fund]['approp'];\n } else {\n // if no fund (ie. we're on the new initiative page), return all options\n ret = this.getAll('approp');\n }\n ;\n // add extra option if given\n if (extraOption) {\n ret.push(extraOption);\n }\n return ret;\n },\n reset: function () {\n this.save({});\n },\n getName: function (number) {\n if (!number || !this.retrieve()) {\n return '';\n }\n ;\n return this.retrieve()[number]['name'];\n },\n listFunds: function () {\n return Object.keys(this.retrieve());\n },\n listFundNames: function (additionalOption) {\n const funds = this.retrieve();\n // initialize array\n var ret = [];\n Object.keys(funds).forEach(fund_number => {\n var fund_name = funds[fund_number]['name'];\n ret.push(fund_name);\n });\n if (additionalOption) {\n ret.push(additionalOption);\n }\n return ret;\n },\n editFund: function (fund) {\n const table = this.retrieve();\n if (table[fund]) {\n table[fund]['viewed'] = true;\n this.save(table);\n } else {\n console.error('No fund selected.');\n }\n },\n listUneditedFunds: function () {\n const table = this.retrieve();\n const ret = [];\n this.listFunds().forEach(key => {\n if (!table[key]['viewed']) {\n ret.push(key);\n }\n });\n return ret;\n },\n fundsLeft: function () {\n return this.listUneditedFunds().length > 0;\n }\n};\n/* harmony default export */ const fund_lookup_table = (FundLookupTable);\n;// CONCATENATED MODULE: ./src/js/models/current_fund.js\n\nconst CurrentFund = {\n update: function (fund) {\n localStorage.setItem('fund', fund);\n },\n number: function () {\n return localStorage.getItem(\"fund\");\n },\n name: function () {\n return fund_lookup_table.getName(this.number());\n },\n reset: function () {\n this.update('');\n }\n};\n/* harmony default export */ const current_fund = (CurrentFund);\n;// CONCATENATED MODULE: ./src/js/models/account_string.js\n\nconst AccountString = {\n getNumber: function (input) {\n // isolate the numerical part of a appropriation/cost center/object\n const match = input.match(/^\\d+/);\n return match ? match[0] : null;\n },\n build: function (approp, cc, obj = null, fund = null) {\n // put together account string fund-approp-costcenter[-obj] (w optional object)\n if (!fund) {\n fund = current_fund.number();\n }\n ;\n // hits error here\n approp = this.getNumber(approp);\n cc = this.getNumber(cc);\n var string = `${fund}-${approp}-${cc}`;\n string = obj ? `${string}-${this.getNumber(obj)}` : string;\n return string;\n },\n getAccountStringSection: function (account_string, section) {\n const sections = account_string.split(\"-\");\n return sections.length > section ? sections[section] : null;\n },\n fund: function (account_string) {\n return this.getAccountStringSection(account_string, 0);\n },\n approp: function (account_string) {\n return this.getAccountStringSection(account_string, 1);\n },\n costCenter: function (account_string) {\n return this.getAccountStringSection(account_string, 2);\n },\n object: function (account_string) {\n return this.getAccountStringSection(account_string, 3);\n }\n};\n/* harmony default export */ const account_string = (AccountString);\n;// CONCATENATED MODULE: ./src/js/models/fund.js\n\n\n\n// Helper function to create a unique list of appropriations represented in a table\nfunction fetchValueSet(table, key) {\n // IF there's no data, return an empty list\n if (!table) {\n return [];\n }\n\n // Use a Set to store unique values\n const uniqValues = new Set();\n\n // Iterate through each object in the table\n table.forEach(row => {\n if (row[key]) {\n uniqValues.add(row[key]);\n }\n });\n\n // Convert the Set to an array if needed\n return uniqValues;\n}\n\n// Class to hold information on a specific fund and table\nclass StoredTable {\n constructor(page, fund) {\n this.name = `${page}_${fund}`;\n this.page = page;\n this.table = JSON.parse(localStorage.getItem(this.name));\n this.approps = fetchValueSet(this.table, 'Appropriation');\n this.cc = fetchValueSet(this.table, 'Cost Center');\n }\n totalCol() {\n return TOTAL_COLUMNS[this.page];\n }\n getSum() {\n // fill with zero until there is something saved in storage\n return colSum(this.table, this.totalCol(), this.name);\n }\n\n // key is the column to filter on (ie. Cost Center)\n filter(key, value) {\n if (this.table) {\n // reassign underlying data in object if there's data to filter\n this.table = this.table.filter(row => {\n return row[key] && row[key] == value;\n });\n }\n return this;\n }\n}\nclass CostCenter {\n constructor(fund, approp, cc) {\n const AppropObj = new Appropriation(fund, approp);\n this.personnel = AppropObj.personnel.filter('Cost Center', cc);\n this.nonpersonnel = AppropObj.nonpersonnel.filter('Cost Center', cc);\n this.overtime = AppropObj.overtime.filter('Cost Center', cc);\n this.revenue = AppropObj.revenue.filter('Cost Center', cc);\n this.cc = cc;\n this.account_string = `${AppropObj.accountString()}-${cc}`;\n }\n getPersonnelCost() {\n return this.personnel.getSum();\n }\n getOvertimeCost() {\n return this.overtime.getSum();\n }\n getNonPersonnelCost() {\n return this.nonpersonnel.getSum();\n }\n getRevenue() {\n return this.revenue.getSum();\n }\n getTotal() {\n // only sum expenditures, not net of revenue\n return this.getNonPersonnelCost() + this.getOvertimeCost() + this.getPersonnelCost();\n }\n getName() {\n // just grab the value in the approp name column for the first row of the first non-empty table\n const tables = [this.nonpersonnel.table, this.personnel.table, this.overtime.table, this.revenue.table];\n for (let table of tables) {\n if (table.length > 0 && table[0]['Cost Center Name']) {\n return table[0]['Cost Center Name'];\n }\n }\n\n // If all tables are empty, return ''\n return '';\n }\n accountString() {\n return this.account_string;\n }\n}\nclass Appropriation {\n constructor(fund, approp) {\n const fundObj = new Fund(fund);\n this.personnel = fundObj.personnel.filter('Appropriation', approp);\n this.nonpersonnel = fundObj.nonpersonnel.filter('Appropriation', approp);\n this.overtime = fundObj.overtime.filter('Appropriation', approp);\n this.revenue = fundObj.revenue.filter('Appropriation', approp);\n // own data\n this.approp = approp;\n this.fund = fundObj.fund;\n }\n getCostCenters() {\n // build a set of unique appropriations across all line items for the fund\n const cc = new Set([...this.personnel.cc, ...this.overtime.cc, ...this.nonpersonnel.cc, ...this.revenue.cc]);\n\n // initialize a list placeholder for the appropriations objects\n const ccList = [];\n // build out list\n cc.forEach(num => {\n ccList.push(new CostCenter(this.fund, this.approp, num));\n });\n return ccList;\n }\n total() {\n return this.personnel.getSum() + this.overtime.getSum() + this.nonpersonnel.getSum();\n }\n name() {\n // just grab the value in the approp name column for the first row of the first non-empty table\n const tables = [this.nonpersonnel.table, this.personnel.table, this.overtime.table, this.revenue.table];\n for (let table of tables) {\n if (table && table[0] && table[0]['Appropriation Name']) {\n return table[0]['Appropriation Name'];\n }\n }\n\n // If all tables are empty, return ''\n return '';\n }\n accountString() {\n return `${this.fund}-${this.approp}`;\n }\n}\n\n// Holds all the detailed data for one fund's budget\nclass Fund {\n constructor(fund) {\n this.fund = fund;\n this.personnel = new StoredTable('personnel', fund);\n this.overtime = new StoredTable('overtime', fund);\n this.nonpersonnel = new StoredTable('nonpersonnel', fund);\n this.revenue = new StoredTable('revenue', fund);\n }\n getAppropriations() {\n // build a set of unique appropriations across all line items for the fund\n const approps = new Set([...this.personnel.approps, ...this.overtime.approps, ...this.nonpersonnel.approps, ...this.revenue.approps]);\n\n // initialize a list placeholder for the appropriations objects\n const appropsList = [];\n // build out list\n approps.forEach(approp => {\n appropsList.push(new Appropriation(this.fund, approp));\n });\n return appropsList;\n }\n getPersonnelCost() {\n return this.personnel.getSum();\n }\n getOvertimeCost() {\n return this.overtime.getSum();\n }\n getNonPersonnelCost() {\n return this.nonpersonnel.getSum();\n }\n getRevenue() {\n return this.revenue.getSum();\n }\n getTotal() {\n // only sum expenditures, not net of revenue\n return this.getNonPersonnelCost() + this.getOvertimeCost() + this.getPersonnelCost();\n }\n}\n/* harmony default export */ const models_fund = (Fund);\n;// CONCATENATED MODULE: ./src/js/models/baseline.js\n\n\nclass Baseline {\n // baseline will just contain a list of funds, each with\n // running tallies for their budgets\n constructor() {\n const allFunds = fund_lookup_table.listFunds();\n this.funds = [];\n allFunds.forEach(fund => {\n this.funds.push(new models_fund(fund));\n });\n }\n static target() {\n return localStorage.getItem('target');\n }\n personnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getPersonnelCost();\n });\n return total;\n }\n overtime() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getOvertimeCost();\n });\n return total;\n }\n nonpersonnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getNonPersonnelCost();\n });\n return total;\n }\n revenue() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getRevenue();\n });\n return total;\n }\n total() {\n return this.nonpersonnel() + this.personnel() + this.overtime();\n }\n genFundTotal() {\n const GF = new models_fund(1000);\n return GF.getTotal();\n }\n}\n/* harmony default export */ const models_baseline = (Baseline);\n;// CONCATENATED MODULE: ./src/js/models/initiative.js\n// data structure to hold information on new initiatives\n\n\n\nclass Initiative {\n constructor(row) {\n this.data = row;\n this.name = row[NEW_INIT_COLS['name']];\n }\n id() {\n let hash = 5381;\n for (let i = 0; i < this.name.length; i++) {\n hash = (hash << 5) + hash + this.name.charCodeAt(i); // hash * 33 + c\n }\n return hash >>> 0; // Ensure positive unsigned 32-bit integer\n }\n personnel() {\n if (this.data[NEW_INIT_COLS['personnel']]) {\n return this.data[NEW_INIT_COLS['personnel']];\n } else {\n return 0;\n }\n }\n operating() {\n if (this.data[NEW_INIT_COLS['operating']]) {\n return this.data[NEW_INIT_COLS['operating']];\n } else {\n return 0;\n }\n }\n capital() {\n if (this.data[NEW_INIT_COLS['capital']]) {\n return this.data[NEW_INIT_COLS['capital']];\n } else {\n return 0;\n }\n }\n revenue() {\n if (this.data[NEW_INIT_COLS['revenue']]) {\n return this.data[NEW_INIT_COLS['revenue']];\n } else {\n return 0;\n }\n }\n total() {\n if (this.data[NEW_INIT_COLS['total']]) {\n return this.data[NEW_INIT_COLS['total']];\n } else {\n return 0;\n }\n }\n}\n/* harmony default export */ const initiative = (Initiative);\n;// CONCATENATED MODULE: ./src/js/models/services.js\n// data structure to save the possible service options for the department\nconst Services = {\n save: function (services) {\n localStorage.setItem('services-list', JSON.stringify(services));\n },\n list: function () {\n return JSON.parse(localStorage.getItem('services-list')) || {};\n }\n};\n/* harmony default export */ const services = (Services);\n;// CONCATENATED MODULE: ./src/js/models/supplemental.js\n\n\n\n\n// data structure to hold supplemental requests\nclass Supplemental {\n constructor() {\n this.table = JSON.parse(localStorage.getItem('new-inits'));\n this.initiatives = [];\n if (this.table) {\n this.table.forEach(row => {\n this.initiatives.push(new initiative(row));\n });\n }\n }\n getInits() {\n return this.table.map(item => {\n return item[NEW_INIT_COLS['name']];\n });\n }\n personnel() {\n return colSum(this.table, NEW_INIT_COLS['personnel']);\n }\n operating() {\n return colSum(this.table, NEW_INIT_COLS['operating']);\n }\n capital() {\n return colSum(this.table, NEW_INIT_COLS['capital']);\n }\n revenue() {\n return colSum(this.table, NEW_INIT_COLS['revenue']);\n }\n total() {\n return colSum(this.table, TOTAL_COLUMNS['new-inits']);\n }\n}\n/* harmony default export */ const supplemental = (Supplemental);\n;// CONCATENATED MODULE: ./src/js/models/index.js\n// models/index.js\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/js/components/sidebar/subcomponents/baseline_section.js\n\n\n\n\nconst BaselineSection = {\n _data: new models_baseline(),\n _genFund: new models_fund(1000),\n get data() {\n this._data = new models_baseline();\n return this._data;\n },\n set data(newData) {\n this._data = newData;\n },\n get genFund() {\n this._genFund = new models_fund(1000);\n return this._genFund;\n },\n set genFund(newFund) {\n this._genFund = newFund;\n },\n target_html() {\n return `\n \n \n
`;\n },\n fund_html(fund) {\n return `\n
${fund_lookup_table.getName(fund.fund)}
\n
\n \n \n \n \n \n
`;\n },\n linkEditBtns() {\n let btns = document.querySelectorAll('.edit-icon');\n btns.forEach(btn => {\n // Get the fund from the div the button is in\n let fund = btn.closest('.fund-div').id.replace('fund_', '');\n let page = btn.closest('.sidebar-stat-line').classList[1];\n btn.addEventListener('click', function () {\n current_fund.update(fund);\n visitPage(page);\n });\n });\n },\n update() {\n const baselineDiv = document.querySelector('#baseline-stats');\n baselineDiv.innerHTML = this.target_html();\n this.data.funds.forEach(fund => {\n var fundDiv = document.createElement('div');\n fundDiv.id = `fund_${fund.fund}`;\n fundDiv.classList.add('fund-div');\n fundDiv.innerHTML = this.fund_html(fund);\n baselineDiv.appendChild(fundDiv);\n });\n if (this.genFund.getTotal() <= models_baseline.target()) {\n document.querySelector('#GF-total .stat').style.color = \"green\";\n // document.querySelector('#fund_1000 .sidebar-stat-line:last-of-type .stat').style.color = \"green\";\n } else {\n document.querySelector('#GF-total .stat').style.color = \"red\";\n // document.querySelector('#fund_1000 .sidebar-stat-line:last-of-type .stat').style.color = \"red\";\n }\n this.linkEditBtns();\n }\n};\n;// CONCATENATED MODULE: ./src/js/components/sidebar/subcomponents/arrow.js\n\nconst Arrow = {\n html: ``,\n currentLine() {\n let page = current_page.load();\n let line;\n if (page == 'new-inits') {\n line = document.querySelector('#supp-expenses');\n } else {\n let fund = current_fund.number();\n line = document.querySelector(`#fund_${fund} .sidebar-stat-line.${page}`);\n }\n ;\n return line;\n },\n mark() {\n let line = this.currentLine();\n const arrow = document.createElement('div');\n arrow.innerHTML = this.html;\n line.appendChild(arrow);\n }\n};\n;// CONCATENATED MODULE: ./src/js/components/sidebar/subcomponents/supp_section.js\n\n\n\nconst SuppSection = {\n html() {\n var supp = new supplemental();\n return `\n `;\n },\n linkEditBtns() {\n let btns = document.querySelectorAll('.edit-supp');\n btns.forEach(btn => {\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n });\n },\n update() {\n const suppDiv = document.querySelector('#supp-stats');\n suppDiv.innerHTML = this.html();\n this.linkEditBtns();\n }\n};\n/* harmony default export */ const supp_section = (SuppSection);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n\n\n// fetch CSS variables saved in :root\nconst root = document.documentElement;\nconst sideBarWidth = getComputedStyle(root).getPropertyValue('--sidebar-width').trim();\nfunction hideSidebar() {\n document.getElementById('sidebar-panel').style.display = 'none';\n document.getElementById('main-panel').style.width = '100%';\n document.querySelector('header').style.width = '100%';\n\n // remove event listeners\n const btn = document.getElementById('summary-btn-sidebar');\n btn.removeEventListener('click', visitSummary);\n // add event listener to resize content if window is adjusted\n window.removeEventListener('resize', showSidebar);\n}\nfunction showSidebar() {\n const sidebar = document.getElementById('sidebar-panel');\n const mainPanel = document.getElementById('main-panel');\n const header = document.querySelector('header');\n\n // update values\n updateTotals();\n sidebar.style.display = 'block'; // Show the sidebar\n\n // Calculate the remaining width for the main panel and header\n var contentWidth = document.documentElement.clientWidth;\n mainPanel.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n header.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n\n // enable summary button\n const btn = document.getElementById('summary-btn-sidebar');\n btn.addEventListener('click', visitSummary);\n // add event listener to resize content if window is adjusted\n window.addEventListener('resize', showSidebar);\n}\nfunction updateSidebarTitle(new_title) {\n document.getElementById('sidebar-title').textContent = new_title;\n}\nfunction updateTotals() {\n // get current value\n let value;\n if (Arrow.currentLine()) {\n value = Arrow.currentLine().querySelector(`.stat`).textContent;\n }\n ;\n // update values in sidebar\n supp_section.update();\n BaselineSection.update();\n // mark current page with green arrow\n Arrow.mark();\n //if value changed, highlight it\n if (value != Arrow.currentLine().querySelector(`.stat`).textContent) {\n indicateChange();\n }\n}\nfunction resetAll() {\n localStorage.clear();\n // reset all stats to 0\n updateTotals();\n}\nfunction visitSummary() {\n visitPage('summary');\n}\nfunction indicateChange() {\n // get the right color from the root() defined in common.css\n const rootStyle = getComputedStyle(document.documentElement);\n const palegreen = rootStyle.getPropertyValue('--palegreen').trim();\n // identify changed rows = current page and total\n let changedRow = Arrow.currentLine();\n let totalRow = Arrow.currentLine().parentElement.querySelector('.fund-total');\n // make any edited rows green\n changedRow.style.backgroundColor = palegreen;\n if (totalRow) {\n totalRow.style.backgroundColor = palegreen;\n }\n ;\n // Fade back to default after 0.75 seconds\n setTimeout(() => {\n changedRow.style.backgroundColor = '';\n if (totalRow) {\n totalRow.style.backgroundColor = '';\n }\n ;\n }, 750);\n}\nconst Sidebar = {\n SuppSection: supp_section,\n BaselineSection: BaselineSection,\n Arrow: Arrow,\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n updateTotals: updateTotals,\n reset: resetAll\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/nav_buttons/nav_buttons.css\nvar nav_buttons = __webpack_require__(595);\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.css\n\n \n \n \n \n \n \n \n \n \n\nvar nav_buttons_options = {};\n\nnav_buttons_options.styleTagTransform = (styleTagTransform_default());\nnav_buttons_options.setAttributes = (setAttributesWithoutAttributes_default());\nnav_buttons_options.insert = insertBySelector_default().bind(null, \"head\");\nnav_buttons_options.domAPI = (styleDomAPI_default());\nnav_buttons_options.insertStyleElement = (insertStyleElement_default());\n\nvar nav_buttons_update = injectStylesIntoStyleTag_default()(nav_buttons/* default */.A, nav_buttons_options);\n\n\n\n\n /* harmony default export */ const nav_buttons_nav_buttons = (nav_buttons/* default */.A && nav_buttons/* default */.A.locals ? nav_buttons/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.js\n// nav_buttons.js\n\n\nfunction initializeNavButtons() {\n // initialize last button\n const last_btn = document.getElementById('btn-last');\n last_btn.addEventListener('click', lastPage);\n // initialize next button\n const next_btn = document.getElementById('btn-next');\n next_btn.addEventListener('click', nextPage);\n}\nfunction nav_buttons_disable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.add('disabled');\n button.disabled = true; // Also disable it at the DOM level\n}\nfunction nav_buttons_enable(button_id) {\n const button = document.getElementById(button_id);\n button.classList.remove('disabled');\n button.disabled = false; // Enable it at the DOM level\n}\nconst Next = {\n disable: function () {\n nav_buttons_disable('btn-next');\n },\n enable: function () {\n nav_buttons_enable('btn-next');\n },\n addAction: function (fn) {\n document.querySelector(`#btn-next`).addEventListener('click', fn);\n },\n removeAction: function (fn) {\n document.querySelector(`#btn-next`).removeEventListener('click', fn);\n },\n hide() {\n document.querySelector(`#btn-next`).style.display = 'none';\n },\n show() {\n const btn = document.querySelector(`#btn-next`);\n btn.textContent = `Continue to ${nextPageLabel()} >>`;\n btn.style.display = '';\n }\n};\nconst Last = {\n disable: function () {\n nav_buttons_disable('btn-last');\n },\n enable: function () {\n nav_buttons_enable('btn-last');\n },\n hide() {\n document.querySelector(`#btn-last`).style.display = 'none';\n },\n show() {\n const btn = document.querySelector(`#btn-last`);\n btn.textContent = `<< Return to ${lastPageLabel()}`;\n btn.style.display = '';\n }\n};\nfunction visitSummaryPage() {\n visitPage('summary');\n}\nconst ReturnToSummary = {\n show: function () {\n const btn = document.getElementById('return-to-summary');\n btn.style.display = '';\n btn.addEventListener('click', visitSummaryPage);\n },\n hide: function () {\n const btn = document.getElementById('return-to-summary');\n btn.style.display = 'none';\n btn.removeEventListener('click', visitSummaryPage);\n }\n};\nconst NavButtons = {\n hide: function () {\n Next.hide();\n Last.hide();\n },\n show: function () {\n Next.show();\n Last.show();\n ;\n initializeNavButtons();\n },\n Next: Next,\n Last: Last,\n ReturnToSummary: ReturnToSummary\n};\n/* harmony default export */ const components_nav_buttons_nav_buttons = (NavButtons);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/body/body.css\nvar body = __webpack_require__(9);\n;// CONCATENATED MODULE: ./src/js/components/body/body.css\n\n \n \n \n \n \n \n \n \n \n\nvar body_options = {};\n\nbody_options.styleTagTransform = (styleTagTransform_default());\nbody_options.setAttributes = (setAttributesWithoutAttributes_default());\nbody_options.insert = insertBySelector_default().bind(null, \"head\");\nbody_options.domAPI = (styleDomAPI_default());\nbody_options.insertStyleElement = (insertStyleElement_default());\n\nvar body_update = injectStylesIntoStyleTag_default()(body/* default */.A, body_options);\n\n\n\n\n /* harmony default export */ const body_body = (body/* default */.A && body/* default */.A.locals ? body/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/accordion/accordion.css\nvar accordion = __webpack_require__(995);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.css\n\n \n \n \n \n \n \n \n \n \n\nvar accordion_options = {};\n\naccordion_options.styleTagTransform = (styleTagTransform_default());\naccordion_options.setAttributes = (setAttributesWithoutAttributes_default());\naccordion_options.insert = insertBySelector_default().bind(null, \"head\");\naccordion_options.domAPI = (styleDomAPI_default());\naccordion_options.insertStyleElement = (insertStyleElement_default());\n\nvar accordion_update = injectStylesIntoStyleTag_default()(accordion/* default */.A, accordion_options);\n\n\n\n\n /* harmony default export */ const accordion_accordion = (accordion/* default */.A && accordion/* default */.A.locals ? accordion/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/table/table.css\nvar table = __webpack_require__(279);\n;// CONCATENATED MODULE: ./src/js/components/table/table.css\n\n \n \n \n \n \n \n \n \n \n\nvar table_options = {};\n\ntable_options.styleTagTransform = (styleTagTransform_default());\ntable_options.setAttributes = (setAttributesWithoutAttributes_default());\ntable_options.insert = insertBySelector_default().bind(null, \"head\");\ntable_options.domAPI = (styleDomAPI_default());\ntable_options.insertStyleElement = (insertStyleElement_default());\n\nvar table_update = injectStylesIntoStyleTag_default()(table/* default */.A, table_options);\n\n\n\n\n /* harmony default export */ const table_table = (table/* default */.A && table/* default */.A.locals ? table/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/headers.js\nfunction addTableHeaders(cols) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // Create a table header row element\n const headerRow = document.createElement('tr');\n cols.forEach(col => {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = col['title'];\n headerCell.classList.add(col['className']);\n\n // Append the header cell to the header row\n headerRow.appendChild(headerCell);\n });\n\n // Append the header row to the table header\n let thead = table.querySelector('thead');\n thead.appendChild(headerRow);\n}\nconst Header = {\n add: function (header_array) {\n addTableHeaders(header_array);\n }\n};\n/* harmony default export */ const headers = (Header);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/rows.js\n\n\n\nasync function addNewRow(data_dictionary, columns = []) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // create table if it's not there\n if (!table) {\n await components_table_table.show();\n table = document.getElementById('main-table');\n }\n\n // check if header has already been added\n let header_row = table.querySelector('thead tr');\n if (!header_row) {\n headers.add(columns);\n header_row = table.querySelector('thead tr');\n }\n\n // initialize new row of data\n const new_row = document.createElement('tr');\n\n // go through each header and add the right cell value depending on its class\n let thElements = header_row.querySelectorAll('th');\n thElements.forEach(header_cell => {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n new_row.appendChild(newCell);\n // if the data has an appropriate class, add the info to the cell. \n // Otherwise, keep empty cell\n Object.keys(data_dictionary).forEach(className => {\n if (header_cell.classList.contains(className)) {\n newCell.textContent = data_dictionary[className];\n newCell.classList.add(className);\n }\n });\n });\n\n // Append the new row to the top of the table body\n let tbody = table.querySelector('tbody');\n if (tbody.firstChild) {\n tbody.insertBefore(new_row, tbody.firstChild);\n } else {\n tbody.appendChild(new_row);\n }\n}\nfunction saveRowEdits(row) {\n var cells = row.querySelectorAll('td');\n cells.forEach(cell => {\n // save dropdown values\n if (cell.querySelector('select')) {\n var serviceSelector = cell.querySelector('select');\n cell.textContent = serviceSelector.value;\n } else if (cell.querySelector('input')) {\n // save new entered value in textbox\n var textbox = cell.querySelector('input');\n var enteredValue = textbox.value;\n // update display and format with currency if relevant\n if (cell.classList.contains('cost')) {\n // if cost, remove commas first\n enteredValue = enteredValue.replaceAll(',', '');\n cell.textContent = formatCurrency(enteredValue);\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n } else {\n cell.textContent = enteredValue;\n }\n } else if (cell.querySelector('textarea')) {\n // save new entered value in textbox\n var enteredValue = cell.querySelector('textarea').value;\n cell.textContent = enteredValue;\n }\n });\n}\nfunction markNewRow() {\n // Get the table element by its ID and fetch first row\n let first_row = document.querySelector('#main-table tbody').firstChild;\n // get the right color from the root() defined in common.css\n const rootStyle = getComputedStyle(document.documentElement);\n const palegreen = rootStyle.getPropertyValue('--palegreen').trim();\n // make first row (with new row) green\n first_row.style.backgroundColor = palegreen;\n // Fade back to default after 0.75 seconds\n setTimeout(() => {\n first_row.style.backgroundColor = '';\n }, 750);\n}\nconst Rows = {\n add: async function (data_dictionary, cols) {\n addNewRow(data_dictionary, cols);\n },\n saveEdits: function (row) {\n saveRowEdits(row);\n },\n markNewRow: markNewRow\n};\n/* harmony default export */ const rows = (Rows);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/buttons.js\n\nfunction hideButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'none';\n }\n };\n}\nfunction showButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'inline';\n }\n };\n}\nfunction updateButtonText(className, text) {\n document.querySelector(`.${className}`).textContent = text;\n}\nfunction handleRowEdit(actionOnClick, updateCallback = null) {\n // attach an event listener to each edit button in every row\n var editButtons = document.getElementsByClassName('btn-edit');\n for (var i = 0; i < editButtons.length; i++) {\n editButtons[i].addEventListener('click', async function (event) {\n // Determine what was clicked on within the table\n var rowToEdit = event.target.closest('tr');\n // mark row as being edited\n rowToEdit.classList.add('active-editing');\n\n // turn relevant entries into textboxes, usually\n actionOnClick();\n\n // hide edit buttons\n Edit.hide();\n if (updateCallback) {\n initializeConfirmButton(updateCallback);\n }\n });\n }\n ;\n}\nfunction initializeConfirmButton(updateCallback) {\n // get element and add listener for click\n var rowToEdit = document.querySelector('.active-editing');\n const confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n\n // Remove existing click event listener to prevent multiple-event additions\n confirm_btn.replaceWith(confirm_btn.cloneNode(true));\n const new_confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n\n // show the row's confirm button\n new_confirm_btn.style.display = 'block';\n new_confirm_btn.addEventListener('click', function () {\n ;\n // save row edits\n rows.saveEdits(rowToEdit);\n // update values in sidebar\n updateCallback();\n // make row no longer green\n rowToEdit.classList.remove('active-editing');\n // show edit buttons and hide confirm buttons\n Edit.show();\n Confirm.hide();\n });\n}\nconst Edit = {\n html(text = 'Edit row') {\n return ``;\n },\n hide: hideButton('btn-edit'),\n show: showButton('btn-edit'),\n init: function (actionOnClick, updateCallback) {\n handleRowEdit(actionOnClick, updateCallback);\n }\n};\nconst Confirm = {\n html() {\n return ``;\n },\n hide: hideButton('btn-confirm'),\n show: showButton('btn-confirm')\n};\nconst AddRow = {\n hide: hideButton('btn-add'),\n show: showButton('btn-add'),\n updateText: function (text) {\n updateButtonText('btn-add', text);\n }\n};\nconst buttons_Buttons = {\n Edit: Edit,\n Confirm: Confirm,\n AddRow: AddRow,\n edit_confirm_btns: Edit.html() + Confirm.html()\n};\n/* harmony default export */ const subcomponents_buttons = (buttons_Buttons);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/dropdown.js\nfunction createDropdown(dataArray) {\n // Creating a select element\n const selectElement = document.createElement('select');\n\n // add a default blank option to the dataArray\n dataArray = [''].concat(dataArray);\n\n // Looping through the array and creating an option for each element\n dataArray.forEach(item => {\n const optionElement = document.createElement('option');\n optionElement.value = item;\n optionElement.textContent = item;\n selectElement.appendChild(optionElement); // Appending the option to the select\n });\n\n // Return the select element so it can be appended to the document\n return selectElement;\n}\nconst Dropdown = {\n create: function (dataArray) {\n return createDropdown(dataArray);\n }\n};\n/* harmony default export */ const subcomponents_dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\n\n\n\n\n// return cell value attribute or 0 if it does not exist\nfunction getCellValue(row, className) {\n var cell = row.querySelector(`.${className}`);\n var cellValue = cell ? cell.getAttribute('value') : null;\n return cellValue ? parseFloat(cellValue) : 0;\n}\n\n// return text in cell\nfunction getCellText(row, className) {\n var cell = row.querySelector(`.${className}`);\n if (cell) {\n return cell.textContent;\n } else {\n //console.log(`Error retrieving cell text for class ${className}`);\n return '';\n }\n}\nfunction updateTableCell(row, col_class, new_value) {\n const cell = row.querySelector(`.${col_class}`);\n cell.setAttribute('value', new_value);\n cell.textContent = formatCurrency(new_value);\n}\nfunction createEditableCell(cellClass, isCost, type = 'input') {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // Create an input element to edit the value\n var textbox = document.createElement(type);\n if (type == 'input') {\n textbox.type = 'text';\n }\n ;\n if (isCost) {\n var value = cell.getAttribute('value');\n textbox.value = displayWithCommas(value);\n } else {\n textbox.value = cell.textContent;\n }\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nfunction cells_createDropdown(cellClass, optionArray) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const dropdown = subcomponents_dropdown.create(optionArray);\n dropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(dropdown);\n}\nconst Cell = {\n getValue: function (row, className) {\n return getCellValue(row, className);\n },\n getText: function (row, className) {\n return getCellText(row, className);\n },\n updateValue: function (row, col_class, new_value) {\n updateTableCell(row, col_class, new_value);\n },\n createTextbox: function (className, isCost, type) {\n createEditableCell(className, isCost, type);\n },\n createServiceDropdown: () => {\n cells_createDropdown('service', services.list());\n },\n createDropdown: cells_createDropdown\n};\n/* harmony default export */ const cells = (Cell);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/columns.js\n\n\n// position is index at which new column will be inserted\nfunction addCol(position, htmlContent = '', headerTitle = '') {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Validate position\n let maxPosition = table.rows[0].cells.length;\n if (position < 0 || position > maxPosition) {\n console.error(`Position ${position} is out of bounds.`);\n return;\n }\n\n // Insert the header if provided\n let thead = table.tHead;\n if (headerTitle && thead) {\n let th = document.createElement('th');\n th.innerHTML = headerTitle; // Use innerHTML to insert HTML content\n thead.rows[0].insertBefore(th, thead.rows[0].cells[position]);\n }\n\n // Insert new cells into each row of the table body\n let tbody = table.tBodies[0];\n if (tbody) {\n for (let i = 0; i < tbody.rows.length; i++) {\n let row = tbody.rows[i];\n let td = document.createElement('td');\n td.innerHTML = htmlContent; // Use innerHTML to insert HTML content\n row.insertBefore(td, row.cells[position]);\n }\n }\n}\nfunction ncols() {\n const table = document.getElementById('main-table');\n // Ensure that the row exists before counting the columns\n return table.rows[0].cells.length;\n}\nfunction addColToEnd(htmlContents = [], headerTitle = '') {\n // count columns and add new column to the end\n const position = ncols('main-table');\n addCol(position, htmlContents, headerTitle);\n}\nfunction assignClassToColumn(headerName, className) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Find the index of the column by its header name\n const thead = table.tHead;\n let headerCellIndex = -1;\n const headerCells = thead.rows[0].cells; // Assuming the first row contains header cells ()\n for (let i = 0; i < headerCells.length; i++) {\n if (headerCells[i].textContent.trim() === headerName) {\n // assign the class to the header cell\n headerCells[i].classList.add(className);\n headerCellIndex = i;\n break;\n }\n }\n\n // error check\n if (headerCellIndex === -1) {\n console.error(`No header found with name \"${headerName}\"`);\n return;\n }\n\n // Assign the class to each cell in the specified column index within the tbody\n let tbody = table.tBodies[0];\n if (tbody) {\n let bodyRows = tbody.rows;\n for (let row of bodyRows) {\n if (row.cells[headerCellIndex]) {\n row.cells[headerCellIndex].classList.add(className);\n }\n }\n }\n}\nfunction addCostClass(headerName) {\n assignClassToColumn(headerName, 'cost');\n\n // Get all the cells with the specified class name\n const cells = document.querySelectorAll(`td.cost`);\n cells.forEach(cell => {\n // Get the current text content of the cell and assign it to 'value' attribute\n if (!cell.getAttribute('value')) {\n const cellText = cell.textContent.trim();\n const cellValue = isNaN(cellText) || cellText === '' ? 0 : parseFloat(cellText);\n cell.setAttribute('value', cellValue);\n\n // Now format the text content like currency and replace it in the cell\n const formattedCurrency = formatCurrency(parseFloat(cellValue));\n cell.textContent = formattedCurrency;\n }\n });\n}\nfunction assignColumnClasses(columnDefinitions) {\n columnDefinitions.forEach(column => {\n // Assign class to column\n assignClassToColumn(column.title, column.className);\n\n // If the column is a cost column, add the specific cost class\n if (column.isCost) {\n addCostClass(column.title);\n }\n\n // show the column\n if (!column.hide) {\n showColumnByTitle(column.title);\n }\n });\n}\nfunction hideColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'none';\n }\n }\n}\n\n// Function to show a specific column\nfunction showColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'table-cell';\n }\n }\n}\n\n// Function to get the column index by title\nfunction getColumnIndexByTitle(table, title) {\n var headers = table.querySelectorAll('th');\n for (var i = 0; i < headers.length; i++) {\n if (headers[i].innerText === title) {\n return i;\n }\n }\n return -1; // Column not found\n}\n\n// Function to hide a column by title\nfunction hideColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n hideColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\n\n// Function to show a column by title\nfunction showColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n showColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\nconst Column = {\n add: function (position, htmlContent, headerTitle) {\n return addCol(position, htmlContent, headerTitle);\n },\n addAtEnd: function (htmlContent, headerTitle) {\n return addColToEnd(htmlContent, headerTitle);\n },\n assignClasses: function (column_definitions) {\n return assignColumnClasses(column_definitions);\n },\n hide: function (colName) {\n hideColumnByTitle(colName);\n },\n show: function (colName) {\n showColumnByTitle(colName);\n }\n};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\n\n\n\nfunction fillTable(data) {\n try {\n const table = document.getElementById('main-table');\n const thead = table.querySelector('thead');\n const tbody = table.querySelector('tbody');\n\n // clear existing data\n thead.innerHTML = '';\n tbody.innerHTML = '';\n\n // Create table header row\n const headerRow = document.createElement('tr');\n Object.keys(data[0]).forEach(key => {\n const header = document.createElement('th');\n header.textContent = key;\n headerRow.appendChild(header);\n });\n thead.appendChild(headerRow);\n\n // Create table body rows\n data.forEach(item => {\n const row = document.createElement('tr');\n Object.values(item).forEach(val => {\n const cell = document.createElement('td');\n cell.innerHTML = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } catch (error) {\n console.error('No table saved in localStorage:', error);\n }\n}\nasync function loadFromStorage() {\n // look up table name in storage\n if (current_fund.number()) {\n var key = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var key = current_page.load();\n }\n // load from local storage\n const data = localStorage.getItem(key);\n // if nothing in storage, return a zero\n if (!data) {\n return 0;\n } else {\n // otherwise, fill table in HTML and return success (1)\n components_table_table.show();\n fillTable(await JSON.parse(data));\n return 1;\n }\n}\nfunction loadFunds() {\n // get list of funds from storage\n const fundDict = fund_lookup_table.retrieve();\n // build out data in correct format\n const ret = [];\n Object.keys(fundDict).forEach(key => {\n // determine if the fund has already been edited\n if (fundDict[key]['viewed']) {\n // todo: add a checkmark here\n ret.push({\n 'Fund': ` \n \n ${fundDict[key]['name']}\n `\n });\n } else {\n ret.push({\n 'Fund': ` \n ${fundDict[key]['name']}\n `\n });\n }\n });\n fillTable(ret);\n}\nfunction getColumnIndexByClass(tbody, className) {\n const firstRow = tbody.rows[0];\n if (!firstRow) return -1; // Return -1 if there's no row to examine\n for (let cellIndex = 0; cellIndex < firstRow.cells.length; cellIndex++) {\n if (firstRow.cells[cellIndex].classList.contains(className)) {\n return cellIndex;\n }\n }\n return -1; // Return -1 if class name not found\n}\n\n// function sort(primaryClass, secondaryClass) {\n// const table = document.getElementById('main-table');\n// const tbody = table.tBodies[0];\n// const rows = Array.from(tbody.rows);\n\n// // Get the column indices by class name\n// const primaryColIndex = getColumnIndexByClass(tbody, primaryClass);\n// const secondaryColIndex = getColumnIndexByClass(tbody, secondaryClass);\n\n// // exit if classes don't exist\n// if (primaryColIndex === -1 ) {\n// console.error(`Column class ${classA} not found in table`);\n// return; \n// } else if (secondaryColIndex === -1) {\n// console.error(`Column class ${classB} not found in table`);\n// return; \n// }\n\n// // Sort the rows based on the text content of the cells\n// rows.sort((rowA, rowB) => {\n// // Primary column comparison\n// const primaryA = unformatCurrency(rowA.cells[primaryColIndex].textContent);\n// const primaryB = unformatCurrency(rowB.cells[primaryColIndex].textContent);\n\n// if (primaryA < primaryB) return -1;\n// if (primaryA > primaryB) return 1;\n\n// // Secondary column comparison (if primary is equal)\n// const secondaryA = unformatCurrency(rowA.cells[secondaryColIndex].textContent);\n// const secondaryB = unformatCurrency(rowB.cells[secondaryColIndex].textContent);\n\n// if (secondaryA < secondaryB) return -1;\n// if (secondaryA > secondaryB) return 1;\n\n// // If both columns are equal\n// return 0;\n// });\n\n// // Reattach sorted rows to the table body\n// rows.forEach((row) => tbody.appendChild(row));\n// }\n\nconst Data = {\n load: loadFromStorage,\n loadFunds: loadFunds,\n sort: function (colA, colB) {\n sort(colA, colB);\n }\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/filters.js\n// Helper functions & constants\n\n// helper function to filter data based on all filters\nfunction filterData() {\n // Get all rows in the table\n const rows = document.querySelectorAll('#main-table tbody tr');\n\n // Iterate through each row and determine if it should be hidden or shown\n rows.forEach(row => {\n let isVisible = true;\n const filters = document.querySelectorAll('.filter-dropdown');\n filters.forEach(filter => {\n // Check each filter setting against the row's cells\n let filterID = filter.id.replace('filter-', '');\n const cell = row.querySelector(`.${filterID}`);\n\n // only show row if values pass through all filters \n if (filter.value && cell && cell.textContent.trim() !== filter.value) {\n isVisible = false;\n }\n });\n\n // Show or hide the row based on visibility\n row.classList.toggle('hidden', !isVisible);\n });\n}\nconst Filter = {\n html(filterLabel, filterClass) {\n // basic html with only 'All' option\n return `\n `;\n },\n addOption(filterClass, option) {\n // Add another option to the dropdown for the filter\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n const optionObj = document.createElement('option');\n optionObj.value = option;\n optionObj.textContent = option;\n filterObj.appendChild(optionObj);\n },\n add(filterLabel, filterClass) {\n // create a div to contain the html and insert inside filter-container\n const filterContainer = document.querySelector('#filter-container');\n const filterDiv = document.createElement('div');\n filterDiv.innerHTML = this.html(filterLabel, filterClass);\n filterContainer.appendChild(filterDiv);\n // add all relevant options from that column in the table\n this.addAllOptions(filterClass);\n // Bind change event to the select element\n filterDiv.querySelector('.filter-dropdown').addEventListener('change', event => {\n // save filter value\n this.saveFilterValues();\n // Apply all filters\n filterData();\n });\n },\n addAllOptions(filterClass) {\n // get matching column from table\n const column = document.querySelectorAll(`#main-table td.${filterClass}`);\n\n // Use a Set to store unique values in the column of interest\n const uniqueValues = new Set();\n\n // Iterate over the NodeList to get the unique values\n column.forEach(td => {\n // Add each textContent to the Set\n uniqueValues.add(td.textContent.trim());\n });\n // add all values as options to the filter dropdown\n uniqueValues.forEach(option => {\n this.addOption(filterClass, option);\n });\n },\n deleteAll() {\n document.querySelector('#filter-container').innerHTML = '';\n },\n updateOptions(filterClass) {\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n if (filterObj) {\n // Clear all existing options except for the default 'All' option\n filterObj.options.length = 1;\n // Add new options\n this.addAllOptions(filterClass);\n }\n // update selection to match saved values\n this.setFiltersFromStorage();\n },\n resetFilter(filterClass) {\n const filterObj = document.querySelector(`#filter-${filterClass}`);\n if (filterObj) {\n // Set filter to 'All' option\n filterObj.value = \"All\";\n }\n },\n resetAllFilters() {\n const filters = document.querySelectorAll('.filter-dropdown');\n filters.forEach(filter => {\n filter.value = '';\n localStorage.setItem(filter.id, '');\n });\n },\n resetAfterNewRow(responses) {\n const filters = document.querySelectorAll('.filter-dropdown');\n filters.forEach(filter => {\n // Get the filter class to tell us what's in the filter\n let filterID = filter.id.replace('filter-', '');\n // If the value from the new poistion doesn't match the filter value, \n // reset it so that the new position will show up\n if (filter.value != responses[filterID]) {\n this.resetFilter(filterID);\n }\n });\n },\n saveFilterValues() {\n const filters = document.querySelectorAll('.filter-dropdown');\n filters.forEach(filter => {\n localStorage.setItem(filter.id, filter.value);\n });\n },\n setFiltersFromStorage() {\n const filters = document.querySelectorAll('.filter-dropdown');\n filters.forEach(filter => {\n // get the stored value for the filter and apply it\n let storedValue = localStorage.getItem(filter.id);\n // if the filter has never been used, default to \"All\"\n if (!storedValue) {\n storedValue = '';\n }\n ;\n filter.value = storedValue;\n });\n // actually filter data based on selections\n filterData();\n }\n};\n/* harmony default export */ const filters = (Filter);\n;// CONCATENATED MODULE: ./src/js/models/gold_book.js\n// the Gold Book contains a lookup table for each job code, which maps to the BU, the job title, and the fringe rate\n\nconst GoldBook = {\n init(sheet) {\n // Convert sheet to JSON, with no automatic header row parsing\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Assuming header is the second row (index 1), and data starts at the third row (index 2)\n const headers = rawData[1];\n const data = rawData.slice(2);\n\n // Store headers and data in localStorage\n localStorage.setItem('goldbook_headers', JSON.stringify(headers));\n localStorage.setItem('goldbook_data', JSON.stringify(data));\n },\n fetch() {\n const headers = JSON.parse(localStorage.getItem('goldbook_headers'));\n const data = JSON.parse(localStorage.getItem('goldbook_data'));\n return {\n headers,\n data\n };\n },\n fetchByCode(job_code) {\n const {\n headers,\n data\n } = this.fetch();\n\n // Create a map of column names to their respective indices\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return data.filter(row => row[headerMap['Job Code']] == job_code);\n },\n getHeaderIX(header_name) {\n const {\n headers\n } = this.fetch();\n const headerMap = headers.reduce((acc, header, index) => {\n acc[header] = index;\n return acc;\n }, {});\n return headerMap[header_name];\n },\n lookupByJobCode(job_code, header_name) {\n const codeData = this.fetchByCode(job_code);\n if (codeData.length > 0) {\n return codeData[0][this.getHeaderIX(header_name)];\n }\n return null;\n },\n getTitle(job_code) {\n return this.lookupByJobCode(job_code, 'Job Description');\n },\n getFringeRate(job_code) {\n return parseFloat(this.lookupByJobCode(job_code, 'Fringe Rate'));\n },\n codeExists(job_code) {\n return this.fetchByCode(job_code).length > 0;\n },\n // method to add GoldBook data as a new sheet to the workbook\n xlsx() {\n const {\n headers,\n data\n } = this.fetch();\n\n // Combine headers and data into one array\n const combinedData = [headers].concat(data);\n\n // Create a worksheet\n return XLSX.utils.aoa_to_sheet(combinedData);\n }\n};\n/* harmony default export */ const gold_book = (GoldBook);\n;// CONCATENATED MODULE: ./src/js/utils/XLSX_handlers.js\n\n\n\n\n\n\n\n// Helper functions\n\n/**\r\n * Deletes the top rows until a row containing complete data is found.\r\n * @param {Array} data - The raw data extracted from the sheet.\r\n * @returns {Array} - The cleaned data with incomplete top rows removed.\r\n */\nfunction deleteTopRowsUntilFullData(data) {\n let fullDataRowFound = false;\n while (!fullDataRowFound && data.length > 0) {\n const row = data[0]; // Get the top row\n let hasAllData = true;\n for (const cell of row) {\n if (cell == null || cell === '') {\n hasAllData = false;\n break;\n }\n }\n if (hasAllData && row.length > 1) {\n fullDataRowFound = true;\n } else {\n // delete the top row if it's not the header row\n data.shift();\n }\n }\n return data;\n}\n\n/**\r\n * Reads the workbook from the provided array buffer.\r\n * @param {ArrayBuffer} arrayBuffer - The array buffer containing the workbook data.\r\n * @returns {Object} - The parsed workbook.\r\n */\nfunction readWorkbook(arrayBuffer) {\n return XLSX.read(arrayBuffer, {\n type: 'array'\n });\n}\n\n/**\r\n * Processes sheets to be split by fund and saves the relevant data.\r\n * @param {string} sheetName - The name of the sheet being processed.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processSheet(sheetName, sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n const fundIndex = headers.indexOf('Fund');\n if (fundIndex === -1) {\n console.error(`No 'Fund' column found in sheet ${sheetName}`);\n return;\n }\n\n // Save a dictionary of data for each fund for each sheet\n const fundData = {};\n dataRows.forEach(row => {\n const fund = row[fundIndex];\n if (fund && fund !== \"Fund\") {\n if (!fundData[fund]) {\n fundData[fund] = [];\n }\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n fundData[fund].push(rowData);\n }\n });\n\n // Save fund number and name as we go along\n fund_lookup_table.update(fundData);\n\n // save data by fund\n Object.keys(fundData).forEach(fund => {\n const key = `${SHEETS[sheetName]}_${fund}`;\n localStorage.setItem(key, JSON.stringify(fundData[fund]));\n });\n}\n\n/**\r\n * Processes the 'Drop-Down Menus' sheet to extract services data.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDropDownMenusSheet(sheet) {\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n const headerRow = sheetData[0];\n const servicesIndex = headerRow.indexOf('Services');\n\n // save drop down menu for later excel downloads\n localStorage.setItem('dropdowns', JSON.stringify(sheetData));\n if (servicesIndex === -1) {\n console.error('Header \"Services\" not found');\n } else {\n const servicesColumn = sheetData.slice(1).map(row => row[servicesIndex]);\n const cleanedServicesColumn = servicesColumn.filter(value => value != null);\n services.save(cleanedServicesColumn);\n }\n}\n\n/**\r\n * Processes the 'Dept Summary' sheet to get and save the target for the general fund.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processDeptSummarySheet(sheet) {\n if (sheet[TARGET_CELL_ADDRESS]) {\n const cellValue = sheet[TARGET_CELL_ADDRESS].v; // Access the cell value\n localStorage.setItem('target', cellValue);\n } else {\n console.error(`Cell ${TARGET_CELL_ADDRESS} not found`);\n }\n\n // save the sheet to add to future excel downloads\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n // TODO: remove excess empty rows\n const newSheetData = sheetData.map(row => row.slice(0, 3));\n localStorage.setItem('dept-summary', JSON.stringify(newSheetData));\n}\n\n/**\r\n * Processes the 'FY{FISCAL_YEAR} Gold Book' sheet to initialize the Gold Book.\r\n * @param {Object} sheet - The sheet object from the workbook.\r\n */\nfunction processGoldBookSheet(sheet) {\n gold_book.init(sheet);\n}\nfunction processNewInitsSheet(sheet) {\n // Read in sheets\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // Get new headers\n const headers = dataRows[0];\n // final data output\n let fullData = [];\n\n // Convert data to JSON form and filter out rows where first value is missing\n dataRows.slice(1).forEach(row => {\n // Skip headers row\n // skip any empty rows at the end\n if (row[0] != '' && row[0] != '-') {\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n // only keep supplemental initiatives \n if (rowData['Baseline or Supplemental'].includes('Supplemental')) {\n fullData.push(rowData);\n }\n }\n });\n // save in local storage\n localStorage.setItem('new-inits', JSON.stringify(fullData));\n}\n\n// Main function to read and process the workbook\nfunction processWorkbook(arrayBuffer) {\n const workbook = readWorkbook(arrayBuffer);\n workbook.SheetNames.forEach(sheetName => {\n // Only convert sheets we need; treat new inits separately because they shouldn't save by fund\n if (sheetName == Object.keys(SHEETS)[4]) {\n const sheet = workbook.Sheets[sheetName];\n processNewInitsSheet(sheet);\n // convert personnel, nonpersonnel, revenue, overtime\n } else if (Object.keys(SHEETS).includes(sheetName)) {\n const sheet = workbook.Sheets[sheetName];\n processSheet(sheetName, sheet);\n } else if (sheetName === 'Drop-Down Menus') {\n const sheet = workbook.Sheets[sheetName];\n processDropDownMenusSheet(sheet);\n } else if (sheetName === 'Dept Summary') {\n const sheet = workbook.Sheets[sheetName];\n processDeptSummarySheet(sheet);\n } else if (sheetName === `FY${FISCAL_YEAR} Gold Book`) {\n const sheet = workbook.Sheets[sheetName];\n processGoldBookSheet(sheet);\n }\n });\n console.log('all excel data saved');\n}\n\n// Utility function to append a sheet to the workbook if data is present\nfunction appendSheetToWorkbook(workbook, data, sheetName) {\n if (data.length > 0) {\n const sheet = XLSX.utils.json_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, sheet, sheetName);\n }\n}\nfunction downloadXLSX() {\n // grab data from baseline object\n const baseline = new models_baseline();\n const workbook = XLSX.utils.book_new(); // Create a new workbook\n\n // Initialize sheet data based on the names of each tab in the Excel doc\n const sheetData = Object.keys(SHEETS).reduce((acc, key) => {\n acc[key] = [];\n return acc;\n }, {});\n\n // Aggregate all rows across funds and combine for each tab\n baseline.funds.forEach(fund => {\n Object.keys(SHEETS).forEach(sheetName => {\n if (fund[SHEETS[sheetName]] && fund[SHEETS[sheetName]].table) {\n sheetData[sheetName].push(...fund[SHEETS[sheetName]].table);\n }\n });\n });\n\n // Add initiatives data (which isn't stored by fund)\n sheetData[Object.keys(SHEETS)[4]] = JSON.parse(localStorage.getItem('new-inits'));\n\n // Create a tab for each table\n Object.keys(sheetData).forEach(sheetName => {\n appendSheetToWorkbook(workbook, sheetData[sheetName], sheetName);\n });\n\n // Add a tab for the GoldBook\n XLSX.utils.book_append_sheet(workbook, gold_book.xlsx(), `FY${FISCAL_YEAR} Gold Book`);\n\n // add a tab for the drop downs and dept summary (just targets)\n writeJSONtoNewTab('dropdowns', 'Drop-Down Menus', workbook);\n writeJSONtoNewTab('dept-summary', 'Dept Summary', workbook);\n\n // Generate a downloadable file\n const wbout = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array'\n });\n const blob = new Blob([wbout], {\n type: 'application/octet-stream'\n });\n\n // Create a link and trigger the download\n const link = document.createElement(\"a\");\n link.href = URL.createObjectURL(blob);\n link.download = \"Filled_Detail_Sheet.xlsx\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\nfunction writeJSONtoNewTab(storage_key, tab_name, workbook) {\n const data = JSON.parse(localStorage.getItem(storage_key));\n const worksheet = XLSX.utils.aoa_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, worksheet, tab_name);\n}\nfunction excelSerialDateToJSDate(serial) {\n if (!serial) {\n return null;\n }\n ;\n // Excel considers 1900-01-01 as day 1, but JavaScript's Date considers\n // 1970-01-01 as day 0. Therefore, we calculate the number of milliseconds\n // between 1900-01-01 and 1970-01-01.\n const excelEpoch = new Date(Date.UTC(1899, 11, 30)); // JavaScript Consider December month as '11'\n\n // Calculate the JS date by adding serial days to the epoch date\n const date = new Date(excelEpoch.getTime() + serial * 24 * 60 * 60 * 1000);\n\n // Set the time part to zero (midnight)\n date.setUTCHours(0, 0, 0, 0);\n\n // Return the date part of the ISO string\n return date.toISOString().split('T')[0];\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/tooltip/tooltip.css\nvar tooltip = __webpack_require__(843);\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.css\n\n \n \n \n \n \n \n \n \n \n\nvar tooltip_options = {};\n\ntooltip_options.styleTagTransform = (styleTagTransform_default());\ntooltip_options.setAttributes = (setAttributesWithoutAttributes_default());\ntooltip_options.insert = insertBySelector_default().bind(null, \"head\");\ntooltip_options.domAPI = (styleDomAPI_default());\ntooltip_options.insertStyleElement = (insertStyleElement_default());\n\nvar tooltip_update = injectStylesIntoStyleTag_default()(tooltip/* default */.A, tooltip_options);\n\n\n\n\n /* harmony default export */ const tooltip_tooltip = (tooltip/* default */.A && tooltip/* default */.A.locals ? tooltip/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/tooltip/tooltip.js\n\n\n\n\n\n\nfunction hideTooltip() {\n document.getElementById('tooltip').style.visibility = 'hidden';\n}\nfunction showTooltip() {\n document.getElementById('tooltip').style.visibility = 'visible';\n}\nfunction editTooltipText(newText) {\n // edit text to display inside tooltip\n const tooltip = document.getElementById('tooltip');\n tooltip.innerHTML = newText;\n}\nfunction showAccountString(row) {\n const approp = cells.getText(row, 'approp-name');\n const cc = cells.getText(row, 'cc-name');\n const obj = cells.getText(row, 'object-name');\n const fund = cells.getText(row, 'fund-name');\n var message = `Fund: ${fund}
\n Appropriation: ${approp}
\n Cost Center: ${cc}`;\n if (obj) {\n message += `
Object: ${obj}`;\n }\n message += `
If you believe this account string is incorrect, please leave a comment \n in the comment column.`;\n editTooltipText(message);\n}\nfunction showSalaryProjection(row) {\n const general_increase = cells.getText(row, 'general-increase-rate');\n const merit_increase = cells.getText(row, 'merit-increase-rate');\n const current_salary = cells.getValue(row, 'current-salary');\n const proj_salary = cells.getValue(row, 'avg-salary');\n if (current_salary) {\n var message = `The average salary/wage for this position was \n ${formatCurrency(current_salary)} as of September 20${FISCAL_YEAR - 2}. \n Given a ${general_increase * 100}% general increase rate and a ${merit_increase * 100}% \n merit increase, the FY${FISCAL_YEAR} projection for this position's average \n annual salary/wage is ${formatCurrency(proj_salary)}. This projection takes into \n account the number of vacant vs. full positions.`;\n } else {\n var message = `The average salary/wage for this position was \n unknown as of September 20${FISCAL_YEAR - 2}, or the position\n did not exist. The FY${FISCAL_YEAR} projection for this position's \n average annual salary/wage is ${formatCurrency(proj_salary)}.`;\n }\n editTooltipText(message);\n}\nfunction showFinalPersonnelCost(row) {\n const proj_salary = cells.getValue(row, 'avg-salary');\n const ftes = cells.getText(row, 'baseline-ftes');\n const fringe = parseFloat(cells.getText(row, 'fringe'));\n const avg_benefits = proj_salary * fringe;\n const message = `The total cost captures ${ftes} position(s) at\n an annual salary/wage of ${formatCurrency(proj_salary)}, \n plus fringe benefits that cost ${formatCurrency(avg_benefits)} \n per position per year, on average.`;\n editTooltipText(message);\n}\nfunction showFICA(row) {\n const fica = parseFloat(cells.getText(row, 'fica'));\n const ficaPercentage = (fica * 100).toFixed(2);\n const message = `This total is overtime / holiday / shift premium pay, plus FICA (payroll tax), \n which is ${ficaPercentage}% for this cost center.`;\n editTooltipText(message);\n}\nfunction showCPA(row) {\n const cpa = parseFloat(cells.getText(row, 'cpa'));\n const description = cells.getText(row, 'cpa-description');\n const vendor = cells.getText(row, 'vendor');\n var contract_end = cells.getText(row, 'contract-end');\n // convert to normal date format from excel \n contract_end = excelSerialDateToJSDate(contract_end);\n const remaining = cells.getValue(row, 'remaining');\n if (cpa) {\n var message = `CPA #${cpa}`;\n } else {\n var message = `No CPA`;\n }\n if (vendor) {\n message += `
Vendor: ${vendor}`;\n }\n ;\n if (description) {\n message += `
Description: ${description}`;\n }\n ;\n if (contract_end) {\n message += `
Contract End Date: ${contract_end}`;\n }\n if (remaining) {\n message += `
Amount Remaining on Contract: ${formatCurrency(remaining)}`;\n }\n editTooltipText(message);\n}\nfunction tooltip_link(element, displayFn) {\n // add class to show cell with an underline, etc\n element.classList.add('tooltip-cell');\n\n // Create and append (detail)\n const detail = document.createElement('span');\n detail.classList.add('detail');\n detail.textContent = '(detail)';\n element.appendChild(detail);\n\n // add event listener to show tooltip on mouseover\n element.addEventListener('click', function (event) {\n const row = event.target.closest('tr');\n displayFn(row);\n showTooltip();\n });\n // and hide when mouse moves off\n element.addEventListener('mouseout', function () {\n hideTooltip();\n });\n // Update tooltip position on mouse move\n element.addEventListener('mousemove', function (event) {\n const tooltip = document.getElementById('tooltip');\n tooltip.style.top = event.clientY + 10 + 'px';\n tooltip.style.left = event.clientX + 10 + 'px';\n });\n}\nfunction linkAccountStringCol() {\n // get all relevant cells\n document.querySelectorAll('td.account-string').forEach(cell => {\n tooltip_link(cell, showAccountString);\n });\n}\nfunction linkSalaryCol() {\n // get all relevant cells\n document.querySelectorAll('td.avg-salary').forEach(cell => {\n tooltip_link(cell, showSalaryProjection);\n });\n}\nfunction linkTotalPersonnelCostCol() {\n // get all relevant cells\n document.querySelectorAll('td.total-baseline').forEach(cell => {\n tooltip_link(cell, showFinalPersonnelCost);\n });\n}\nfunction linkTotalOTCol() {\n // get all relevant cells\n document.querySelectorAll('td.total').forEach(cell => {\n tooltip_link(cell, showFICA);\n });\n}\nfunction linkCPACol() {\n // get all relevant cells\n document.querySelectorAll('td.cpa').forEach(cell => {\n tooltip_link(cell, showCPA);\n });\n}\nconst Tooltip = {\n hide: hideTooltip,\n show: showTooltip,\n linkAll: () => {\n linkAccountStringCol();\n switch (current_page.load()) {\n case 'personnel':\n // linkAccountStringCol();\n linkSalaryCol();\n linkTotalPersonnelCostCol();\n break;\n case 'overtime':\n linkTotalOTCol();\n // linkAccountStringCol();\n break;\n case 'nonpersonnel':\n // linkAccountStringCol();\n linkCPACol();\n break;\n // case 'revenue':\n // linkAccountStringCol();\n // break;\n // case 'new-inits':\n // linkAccountStringCol();\n // break;\n default:\n break;\n }\n },\n unlink: function () {\n let details = document.querySelectorAll('.detail');\n details.forEach(span => {\n span.remove();\n });\n }\n};\n/* harmony default export */ const components_tooltip_tooltip = (Tooltip);\n;// CONCATENATED MODULE: ./src/js/utils/JSON_data_handlers.js\nasync function fetchJSON(jsonFilePath) {\n return fetch(jsonFilePath).then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n });\n}\nfunction convertToJSON(table, colsToRemove = []) {\n const rows = table.rows;\n // Extract headers from the first row\n const headerRow = rows[0].cells;\n const headers = [];\n for (let j = 0; j < headerRow.length; j++) {\n headers.push(headerRow[j].innerText);\n }\n\n // initialize data\n var tableData = [];\n for (var i = 1; i < rows.length; i++) {\n const cols = rows[i].cells;\n const rowData = {};\n headers.forEach((header, index) => {\n if (colsToRemove.includes(header)) {\n return;\n } else if (cols[index].classList.contains('cost')) {\n rowData[header] = cols[index].getAttribute('value');\n } else {\n rowData[header] = cols[index].innerText;\n }\n });\n tableData.push(rowData);\n }\n return JSON.stringify(tableData);\n}\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction adjustTableWidth(width_pct) {\n const table = document.getElementById('main-table');\n table.style.width = width_pct;\n}\nasync function showTable() {\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = Table.html;\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n // delete table object from table container\n const tableContainer = document.querySelector('.table-container');\n tableContainer.innerHTML = '';\n subcomponents_buttons.AddRow.hide();\n}\nfunction saveTableData() {\n // remove the detail text\n components_tooltip_tooltip.unlink();\n // get table\n var table = document.getElementById('main-table');\n // determine save_as name\n if (current_fund.number()) {\n var save_as = `${current_page.load()}_${current_fund.number()}`;\n } else {\n var save_as = current_page.load();\n }\n localStorage.setItem(save_as, convertToJSON(table, ['Edit']));\n // update sidebar with new data\n components_sidebar_sidebar.updateTotals();\n // relink, depending on page\n components_tooltip_tooltip.linkAll();\n}\nconst Table = {\n html: `\n \n \n \n
`,\n Buttons: subcomponents_buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n Filter: filters,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: hideTable,\n hide: hideTable,\n show: showTable,\n save: saveTableData\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.js\n\n\n\n\n\n\nfunction redirectForEdit() {\n // action taken when user clicks on any of the edit buttons in the accordion\n const row = document.querySelector(`.active-editing`);\n const table = row.parentElement;\n const section = table.closest('.summary-container');\n // new initiative edits should all redirect to the new-inits page\n if (section.id == 'supp-accordion') {\n visitPage('new-inits');\n } else {\n // Split the string into parts using '-' as the delimiter; retain fund as 1st numeric segment\n const fund = table.id.split('-')[1];\n // record the fund\n current_fund.update(fund);\n // record the appropriation and cost center\n let approp = new Appropriation(fund, table.id.split('-')[2]);\n let cc = new CostCenter(fund, table.id.split('-')[2], table.id.split('-')[3]);\n localStorage.setItem('filter-approp-name', approp.name());\n localStorage.setItem('filter-cc-name', cc.getName());\n\n // visit the correct page for editing\n const lineItem = row.querySelector('.line-item').textContent;\n switch (lineItem) {\n case 'Personnel Expenditures':\n visitPage('personnel');\n break;\n case 'Non-Personnel Expenditures':\n visitPage('nonpersonnel');\n break;\n case 'Revenues':\n visitPage('revenue');\n break;\n case 'Overtime Expenditures':\n visitPage('overtime');\n break;\n default:\n console.error('Name of line item in table does not match a page destination.');\n }\n }\n}\nconst ExpenseTable = {\n table_id: account_string => {\n return `table-${account_string}`;\n },\n init(account_string) {\n // create empty table and put it in the accordion\n var table = document.createElement('table');\n table.id = this.table_id(account_string);\n table.classList.add('accordion-table');\n var parent = document.querySelector(`#string_${account_string}_content .accordion-body`);\n parent.appendChild(table);\n },\n createNewCell(content, row, className) {\n const newCell = document.createElement('td');\n newCell.innerHTML = content;\n newCell.classList.add(className);\n row.appendChild(newCell);\n },\n addRow(account_string, row_name, number) {\n var table = document.getElementById(this.table_id(account_string));\n var new_row = document.createElement('tr');\n table.appendChild(new_row);\n // Create a cell for the line item label\n this.createNewCell(row_name, new_row, 'line-item');\n // create a cell for the amount\n this.createNewCell(formatCurrency(number), new_row, 'cost');\n // create Edit button \n var button = '';\n if (row_name != 'Total Expenditures') {\n button = components_table_table.Buttons.Edit.html(`Edit in table`);\n }\n this.createNewCell(button, new_row);\n },\n fillFromFund(fund) {\n // use just fund as account string to initialize table inside accordion\n this.init(fund);\n const fundObject = new models_fund(fund);\n\n // Add a row for each appropriation in the fund\n const id = cleanString(fund);\n fundObject.getAppropriations().forEach(appropObj => {\n // if the total for the appropriation is > $0, add an accordion for all the CCs\n if (appropObj.total() != 0) {\n Item.add(appropObj.accountString(), `#string_${id}_content .accordion-body`);\n Item.updateHeader(appropObj.name(), appropObj.accountString(), appropObj.total());\n this.fillFromApprop(appropObj);\n }\n });\n },\n fillFromApprop(appropObj) {\n // initialize the table object\n this.init(appropObj.accountString());\n // add a collapsible row for each cost center\n appropObj.getCostCenters().forEach(ccObj => {\n if (ccObj.getTotal() != 0) {\n Item.add(ccObj.accountString(), `#string_${appropObj.accountString()}_content .accordion-body`);\n Item.updateHeader(ccObj.getName(), ccObj.accountString(), ccObj.getTotal());\n this.fillFromCC(ccObj);\n }\n });\n },\n fillFromCC(ccObj) {\n // initialize a table and summarize the line items\n this.init(ccObj.accountString());\n this.addRow(ccObj.accountString(), 'Personnel Expenditures', ccObj.getPersonnelCost());\n this.addRow(ccObj.accountString(), 'Overtime Expenditures', ccObj.getOvertimeCost());\n this.addRow(ccObj.accountString(), 'Non-Personnel Expenditures', ccObj.getNonPersonnelCost());\n this.addRow(ccObj.accountString(), 'Revenues', ccObj.getRevenue());\n this.addRow(ccObj.accountString(), 'Total Expenditures', ccObj.getTotal());\n },\n fillFromInit(program) {\n // Fill out info for each supplemental init\n this.init(program.id());\n this.addRow(program.id(), 'Estimated Revenue', program.revenue());\n this.addRow(program.id(), 'Personnel Expenditures', program.personnel());\n this.addRow(program.id(), 'Non-Personnel Operating', program.operating());\n this.addRow(program.id(), 'Non-Personnel Capital', program.capital());\n this.addRow(program.id(), 'Total Expenditures', program.total());\n }\n};\nconst Item = {\n accountString(fund, approp = '', cc = '') {\n var account_string = cleanString(fund);\n if (approp) {\n account_string += approp;\n }\n ;\n if (cc) {\n account_string += cc;\n }\n ;\n return account_string;\n },\n html(account_string) {\n return `

\n \n

\n
\n
\n
`;\n },\n add: function (account_string, accordion_query) {\n // get accordion and add a new item to it\n const parent = document.querySelector(accordion_query);\n const item_element = document.createElement('div');\n item_element.classList.add('accordion-item');\n item_element.innerHTML = this.html(account_string);\n parent.appendChild(item_element);\n },\n ExpenseTable: ExpenseTable,\n updateHeader: function (title, account_string, new_amount) {\n const header_btn = document.querySelector(`#string_${account_string}_header button`);\n header_btn.querySelector('span.name').textContent = title;\n header_btn.querySelector('span.amount').textContent = formatCurrency(new_amount);\n }\n};\nconst AddInitButton = {\n init() {\n const btn = document.querySelector('.btn-add-init');\n btn.addEventListener('click', function () {\n visitPage('new-inits');\n });\n }\n};\nconst Accordion = {\n Item: Item,\n AddInitButton: AddInitButton,\n hide: function () {\n document.querySelector('#accordion-div').style.display = 'none';\n // reset to delete content\n document.querySelector('#baseline-accordion .summary-accordion').innerHTML = '';\n document.querySelector('#supp-accordion .summary-accordion').innerHTML = '';\n },\n show: function () {\n document.querySelector('#accordion-div').style.display = 'block';\n },\n async createBaseline() {\n var funds = fund_lookup_table.listFunds();\n funds.forEach(fund => {\n Item.add(fund, '#baseline-accordion .summary-accordion');\n Item.ExpenseTable.fillFromFund(fund);\n const fundObject = new models_fund(fund);\n Item.updateHeader(`Fund ${fund_lookup_table.getName(fund)}`, fund, fundObject.getTotal());\n });\n\n // color-code GF baseline\n const GF = new models_fund(1000);\n // text to color code\n let topline = document.querySelector('#string_1000_header .amount');\n if (GF.getTotal() <= models_baseline.target()) {\n topline.style.color = 'green';\n topline.style.weight = 4;\n } else {\n topline.style.color = 'red';\n }\n },\n createSupp() {\n const supp = new supplemental();\n supp.initiatives.forEach(program => {\n Item.add(program.id(), '#supp-accordion .summary-accordion');\n Item.ExpenseTable.fillFromInit(program);\n Item.updateHeader(program.name, program.id(), program.total());\n });\n },\n build() {\n this.createBaseline();\n this.createSupp();\n // initialize edit buttons\n components_table_table.Buttons.Edit.init(redirectForEdit);\n this.AddInitButton.init();\n }\n};\n/* harmony default export */ const components_accordion_accordion = (Accordion);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/file_upload/file_upload.css\nvar file_upload = __webpack_require__(39);\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.css\n\n \n \n \n \n \n \n \n \n \n\nvar file_upload_options = {};\n\nfile_upload_options.styleTagTransform = (styleTagTransform_default());\nfile_upload_options.setAttributes = (setAttributesWithoutAttributes_default());\nfile_upload_options.insert = insertBySelector_default().bind(null, \"head\");\nfile_upload_options.domAPI = (styleDomAPI_default());\nfile_upload_options.insertStyleElement = (insertStyleElement_default());\n\nvar file_upload_update = injectStylesIntoStyleTag_default()(file_upload/* default */.A, file_upload_options);\n\n\n\n\n /* harmony default export */ const file_upload_file_upload = (file_upload/* default */.A && file_upload/* default */.A.locals ? file_upload/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.js\n// file_upload.js\n\n\n\nconst FileUpload = {\n init: function () {\n components_nav_buttons_nav_buttons.Next.disable();\n const inputObject = document.getElementById('file-input');\n inputObject.addEventListener('change', function (event) {\n readXL(event);\n });\n },\n show: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = '';\n },\n hide: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = 'none';\n }\n};\nfunction readXL(event) {\n const file = event.target.files[0]; // read uploaded file\n const spinner = document.getElementById('upload-spinner'); // get the spinner element\n\n if (file) {\n // Show the spinner\n spinner.style.display = 'block';\n\n // read in new data\n const reader = new FileReader();\n reader.onload = function (e) {\n const arrayBuffer = e.target.result;\n try {\n processWorkbook(arrayBuffer);\n\n // Hide the spinner once processing is done\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Enable the next button after processing\n } catch (error) {\n console.error('Error processing workbook:', error);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n }\n };\n reader.onerror = function (err) {\n console.error('Error reading file:', err);\n\n // Hide the spinner in case of an error\n spinner.style.display = 'none';\n components_nav_buttons_nav_buttons.Next.enable(); // Ensure the button is re-enabled in case of an error\n };\n reader.readAsArrayBuffer(file); // Read the file as an ArrayBuffer\n }\n}\n/* harmony default export */ const components_file_upload_file_upload = (FileUpload);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/modal/modal.css\nvar modal = __webpack_require__(95);\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.css\n\n \n \n \n \n \n \n \n \n \n\nvar modal_options = {};\n\nmodal_options.styleTagTransform = (styleTagTransform_default());\nmodal_options.setAttributes = (setAttributesWithoutAttributes_default());\nmodal_options.insert = insertBySelector_default().bind(null, \"head\");\nmodal_options.domAPI = (styleDomAPI_default());\nmodal_options.insertStyleElement = (insertStyleElement_default());\n\nvar modal_update = injectStylesIntoStyleTag_default()(modal/* default */.A, modal_options);\n\n\n\n\n /* harmony default export */ const modal_modal = (modal/* default */.A && modal/* default */.A.locals ? modal/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.js\n\nfunction clearModal() {\n updateModalTitle('');\n document.getElementById('modal-body').innerHTML = '';\n}\nfunction hideModal() {\n $('#main-modal').modal('hide');\n}\nfunction showModal() {\n $('#main-modal').modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\n}\nconst Submit = {\n handler: null,\n init: function (onSubmit) {\n const modal = document.getElementById('main-modal');\n\n // Deinitialize first to avoid multiple bindings\n this.deinit();\n this.handler = function (event) {\n event.preventDefault();\n onSubmit(event);\n };\n\n // Adding the handler as the event listener\n modal.addEventListener('submit', this.handler);\n\n // add event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.addEventListener('click', hideModal);\n },\n deinit: function () {\n const modal = document.getElementById('main-modal');\n if (this.handler !== null) {\n // Removing the event listener and clear the handler\n modal.removeEventListener('submit', this.handler);\n this.handler = null;\n }\n\n // remove event listener to enable close x\n const x = modal.querySelector('#modal-close-x');\n x.removeEventListener('click', hideModal);\n }\n};\nconst Link = {\n add: function (button_id) {\n document.getElementById(button_id).addEventListener('click', showModalHandler);\n },\n remove: function (button_id) {\n document.getElementById(button_id).removeEventListener('click', showModalHandler);\n }\n};\nfunction updateModalTitle(title) {\n document.getElementById('modal-title').textContent = title;\n}\nconst Title = {\n update: function (title) {\n updateModalTitle(title);\n }\n};\nconst Modal = {\n hide: hideModal,\n show: showModal,\n clear: clearModal,\n Title: Title,\n Link: Link,\n Submit: Submit\n};\n/* harmony default export */ const components_modal_modal = (Modal);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\n\n\n\n\n\n\n\n\n\n\nfunction resetPage() {\n // hide everything in the body\n components_welcome_welcome.hide();\n components_modal_modal.clear();\n components_modal_modal.hide();\n components_nav_buttons_nav_buttons.hide();\n components_nav_buttons_nav_buttons.ReturnToSummary.hide();\n js_components_prompt_prompt.hide();\n components_table_table.hide();\n components_sidebar_sidebar.hide();\n components_accordion_accordion.hide();\n components_file_upload_file_upload.hide();\n components_tooltip_tooltip.hide();\n\n // reset filter dropdowns\n components_table_table.Filter.deleteAll();\n js_components_prompt_prompt.Buttons.reset();\n // disable submit button\n components_modal_modal.Submit.deinit();\n}\nconst Body = {\n reset: resetPage\n};\n/* harmony default export */ const components_body_body = (Body);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/header/header.css\nvar header = __webpack_require__(107);\n;// CONCATENATED MODULE: ./src/js/components/header/header.css\n\n \n \n \n \n \n \n \n \n \n\nvar header_options = {};\n\nheader_options.styleTagTransform = (styleTagTransform_default());\nheader_options.setAttributes = (setAttributesWithoutAttributes_default());\nheader_options.insert = insertBySelector_default().bind(null, \"head\");\nheader_options.domAPI = (styleDomAPI_default());\nheader_options.insertStyleElement = (insertStyleElement_default());\n\nvar header_update = injectStylesIntoStyleTag_default()(header/* default */.A, header_options);\n\n\n\n\n /* harmony default export */ const header_header = (header/* default */.A && header/* default */.A.locals ? header/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/header/header.js\n\n\n\nconst header_Title = {\n update: function (title) {\n document.getElementById(\"title\").textContent = title;\n },\n default() {\n this.update(`FY${FISCAL_YEAR} Budget Request`);\n }\n};\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = current_fund.name();\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/form/form.css\nvar form_form = __webpack_require__(109);\n;// CONCATENATED MODULE: ./src/js/components/form/form.css\n\n \n \n \n \n \n \n \n \n \n\nvar form_options = {};\n\nform_options.styleTagTransform = (styleTagTransform_default());\nform_options.setAttributes = (setAttributesWithoutAttributes_default());\nform_options.insert = insertBySelector_default().bind(null, \"head\");\nform_options.domAPI = (styleDomAPI_default());\nform_options.insertStyleElement = (insertStyleElement_default());\n\nvar form_update = injectStylesIntoStyleTag_default()(form_form/* default */.A, form_options);\n\n\n\n\n /* harmony default export */ const components_form_form = (form_form/* default */.A && form_form/* default */.A.locals ? form_form/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/fields.js\n// function to add questions to forms\n\n\n\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(label, inputEl, inputId, required) {\n // change if we want forms elsewhere\n const form = document.getElementById('new-form');\n\n // create outer wrapper for element\n const wrapper = document.createElement('div');\n\n // label question\n const labelEl = document.createElement('label');\n labelEl.textContent = label;\n\n // mark as required if applicable\n inputEl.required = required;\n\n // If an ID is provided, set it on the element\n if (inputId) {\n //inputEl.id = `input-${inputId}`;\n inputEl.id = inputId;\n }\n\n // create validation text/ a place to display errors\n const validationText = document.createElement('p');\n validationText.id = `${inputId}-validation`;\n validationText.classList.add('error-message');\n validationText.style.color = 'red';\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n wrapper.appendChild(validationText);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'text';\n appendFormElement(label, inputEl, inputId, required);\n },\n longText: function (label, inputId, required = false) {\n const inputEl = document.createElement('textarea');\n appendFormElement(label, inputEl, inputId, required);\n },\n numericInput: function (label, inputId, required = false) {\n const inputEl = document.createElement('input');\n inputEl.type = 'number';\n appendFormElement(label, inputEl, inputId, required);\n },\n dropdown: function (label, inputId, optionArray, required = false) {\n var inputEl = subcomponents_dropdown.create(optionArray);\n appendFormElement(label, inputEl, inputId, required);\n }\n};\n/* harmony default export */ const fields = (NewField);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/submit.js\nfunction addSubmitButtonToForm(form_id) {\n // Find the form by its ID\n const form = document.getElementById(form_id);\n\n // Create the container `div` for the button\n const buttonContainer = document.createElement('div');\n buttonContainer.id = 'submit-btn-container';\n\n // Create the submit input\n const submitInput = document.createElement('input');\n submitInput.className = 'btn btn-submit'; // Use appropriate class for your design\n submitInput.type = 'submit';\n submitInput.value = 'Submit';\n\n // Append the submit input to the container\n buttonContainer.appendChild(submitInput);\n\n // Append the container to the form\n form.appendChild(buttonContainer);\n}\nconst SubmitButton = {\n add: function () {\n addSubmitButtonToForm('new-form');\n }\n};\n/* harmony default export */ const subcomponents_submit = (SubmitButton);\n;// CONCATENATED MODULE: ./src/js/components/form/form.js\n\n\n\n\nfunction fetchAllResponses(event) {\n // Assuming `event.target` is the form itself\n const form = event.target;\n\n // Initialize an empty array to hold the input values\n let formData = {};\n\n // Loop through each form element\n for (let i = 0; i < form.elements.length; i++) {\n const element = form.elements[i];\n\n // Exclude elements that aren't inputs, textareas, or select\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\n // Exclude input types that are not considered for submission (such as `submit`)\n if (element.type !== 'submit' && element.type !== 'button') {\n formData[element.id] = element.value;\n }\n }\n }\n form.reset();\n return formData;\n}\nfunction addForm(element_id = 'modal-body', form_id = 'new-form') {\n const target_elem = document.getElementById(element_id);\n\n // create form\n const form = document.createElement('form');\n form.setAttribute('id', form_id);\n\n // Append the form to the modal body\n target_elem.appendChild(form);\n}\nconst Form = {\n new: function (parent_elem_id) {\n addForm(parent_elem_id, 'new-form');\n },\n fetchAllResponses: function (event) {\n return fetchAllResponses(event);\n },\n NewField: fields,\n Dropdown: subcomponents_dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/view_class.js\n\n\n\n\n\n\n\n\n\n\nclass View {\n constructor() {\n // page state in local storage\n this.page_state = '';\n\n // whether to display\n this.navButtons = true;\n this.sidebar = true;\n\n // text to show in the prompt area\n this.prompt = null;\n\n // subtitle text\n this.subtitle = '';\n\n // table object of class ViewTable or null\n this.table = null;\n }\n visit() {\n // update page state\n current_page.update(this.page_state);\n\n // start with a blank page\n components_body_body.reset();\n\n // add default title\n header_Title.default();\n\n // default to showing navbuttons\n if (this.navButtons) {\n // if all the funds are filled out, assume you came from the summary page \n // and then only show return button and not nav buttons\n const returnPages = ['revenue', 'nonpersonnel', 'overtime', 'personnel'];\n if (!fund_lookup_table.fundsLeft() && returnPages.includes(current_page.load())) {\n components_nav_buttons_nav_buttons.ReturnToSummary.show();\n } else {\n components_nav_buttons_nav_buttons.show();\n }\n }\n ;\n\n // default to showing sidebar\n if (this.sidebar) {\n components_sidebar_sidebar.show();\n }\n ;\n\n // initialize prompt text and buttons\n if (this.prompt) {\n js_components_prompt_prompt.Text.update(this.prompt);\n }\n ;\n\n // initialize table\n if (this.table) {\n this.table.build();\n }\n\n // show page subtitle\n if (this.subtitle) {\n Subtitle.update(this.subtitle);\n }\n ;\n }\n cleanup() {\n filters.resetAllFilters();\n }\n}\nclass ViewTable {\n constructor() {\n // Ensure methods retain the correct `this` context\n this.submitNewRow = this.submitNewRow.bind(this);\n this.columns = [{\n title: 'Account String',\n className: 'account-string'\n }, {\n title: 'Appropriation Name',\n className: 'approp-name',\n hide: true\n }, {\n title: 'Appropriation',\n className: 'approp',\n hide: true\n }, {\n title: 'Cost Center Name',\n className: 'cc-name',\n hide: true\n }, {\n title: 'Cost Center',\n className: 'cc',\n hide: true\n }, {\n title: 'Fund Name',\n className: 'fund-name',\n hide: true\n }, {\n title: 'Fund',\n className: 'fund',\n hide: true\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n\n // whether to add an edit column\n this.addEdit = true;\n\n // message to show if there's no saved data\n this.noDataMessage = null;\n\n // text to show for new row button\n this.addButtonText = null;\n\n // whether to show as a datatable\n this.dataTable = true;\n }\n async refreshData() {\n // check for data\n await components_table_table.Data.load();\n\n // create a datatable object\n if (this.dataTable) {\n this.initDataTable();\n }\n\n // add an edit column if needed\n if (this.addEdit) {\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, 'Edit');\n // activate edit buttons\n components_table_table.Buttons.Edit.init(this.actionOnEdit, this.updateTable);\n }\n\n // assign the correct classes based on the table columns\n components_table_table.Columns.assignClasses(this.columns);\n\n // Apply any update function to make sure sidebar is up to date\n this.updateTable();\n // add any newly created cc or approp to the filters\n this.updateFilters();\n }\n async build() {\n // build table from local storage and initialize edit buttons\n\n // add the add new row button if needed\n if (this.addButtonText) {\n this.setUpForm();\n }\n\n // check for data\n if (await components_table_table.Data.load()) {\n // if there's data, update the table and add filters \n this.addFilters();\n await this.refreshData();\n } else {\n // show a message if there's no saved table data for the selected fund\n if (this.noDataMessage) {\n js_components_prompt_prompt.Text.update(this.noDataMessage);\n }\n }\n }\n addFilters() {\n // Add all relevant filters to table\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.add('Appropriation', 'approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.add('Cost Center', 'cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.add('Object', 'object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.add('Object Category', 'object-category');\n }\n }\n updateFilters() {\n // update filters with any new values\n if (this.columns.some(column => column.className === 'approp-name')) {\n components_table_table.Filter.updateOptions('approp-name');\n }\n if (this.columns.some(column => column.className === 'cc-name')) {\n components_table_table.Filter.updateOptions('cc-name');\n }\n if (this.columns.some(column => column.className === 'object-name')) {\n components_table_table.Filter.updateOptions('object-name');\n }\n ;\n if (this.columns.some(column => column.className === 'object-category')) {\n components_table_table.Filter.updateOptions('object-category');\n }\n }\n initDataTable() {\n components_table_table.adjustWidth('100%');\n // Initialize Datatables\n if (!$.fn.dataTable.isDataTable('#main-table')) {\n $('#main-table').DataTable({\n paging: false,\n // Disable pagination\n info: false,\n // Disable table information display\n searching: false // Disable the search bar\n });\n }\n ;\n }\n\n // placeholder for action on row edit click\n actionOnEdit() {\n return;\n }\n\n // update function for the sidebar; default to just saving the table\n updateTable() {\n components_table_table.save();\n }\n\n // extra questions of the form to add a new row\n addCustomQuestions() {\n return;\n }\n addValidationListener(inputId, fieldLabel, validationId, length) {\n const inputElement = document.getElementById(inputId);\n inputElement.addEventListener('change', function () {\n if (inputElement.value === 'Add new') {\n // Add a new field after the selected element\n js_components_form_form.NewField.shortText(`Type new ${fieldLabel}:`, inputId.slice(0, -5), true);\n let newInputElement = document.getElementById(inputId.slice(0, -5)); // Remove '-name' suffix\n inputElement.parentElement.insertAdjacentElement('afterend', newInputElement.parentElement);\n\n // Add an event listener for validation on the new input field\n newInputElement.addEventListener('blur', function () {\n let validationText = document.getElementById(validationId);\n validationText.textContent = '';\n if (newInputElement.value.length !== length) {\n validationText.textContent = `${fieldLabel} codes must be exactly ${length} numbers.`;\n } else if (isNaN(Number(newInputElement.value))) {\n validationText.textContent = `${fieldLabel} codes must be numeric.`;\n }\n });\n } else {\n // Remove the new input field if 'Add new' is not selected\n let newInputElement = document.getElementById(inputId.slice(0, -5));\n if (newInputElement) {\n newInputElement.parentElement.innerHTML = '';\n }\n }\n });\n }\n\n // Modified addModalValidation method\n addModalValidation() {\n this.addValidationListener('approp-name', 'Appropriation', 'approp-validation', 5);\n this.addValidationListener('cc-name', 'Cost Center', 'cc-validation', 6);\n //this.addValidationListener('object-name', 'Object', 'obj-validation', 7);\n }\n setUpForm() {\n // show add button\n components_table_table.Buttons.AddRow.show();\n components_table_table.Buttons.AddRow.updateText(this.addButtonText);\n\n // set up modal for form when add button is pressed\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update(this.addButtonText);\n\n // create form\n js_components_form_form.new('modal-body');\n\n // add custom questions\n this.addCustomQuestions();\n // any validation or special functions\n this.addModalValidation();\n // add submit button\n js_components_form_form.SubmitButton.add();\n\n // Initialize form submission to table data\n components_modal_modal.Submit.init(this.submitNewRow);\n }\n editColumns(responses) {\n // reset filters if relevant to ensure that new job shows up\n components_table_table.Filter.resetAfterNewRow(responses);\n // if a new appropriation was entered, fix it\n if (responses['approp']) {\n responses['approp-name'] = `${responses['approp']} - New`;\n }\n ;\n // same for cost center\n if (responses['cc']) {\n responses['cc-name'] = `${responses['cc']} - New`;\n }\n ;\n\n // get numbers from account string names\n if (responses['fund-name']) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n }\n ;\n if (responses['approp-name']) {\n responses['approp'] = account_string.getNumber(responses['approp-name']);\n }\n ;\n if (responses['cc-name']) {\n responses['cc'] = account_string.getNumber(responses['cc-name']);\n }\n ;\n if (responses['object-name']) {\n responses['object'] = account_string.getNumber(responses['object-name']);\n }\n ;\n responses['account-string'] = account_string.build(responses['approp-name'], responses['cc-name'], responses['object-name'], responses['fund']);\n return responses;\n }\n async submitNewRow(event) {\n // get answers from form, hide form, show answers in table\n var responses = js_components_form_form.fetchAllResponses(event);\n\n // edit inputs from modal\n responses = this.editColumns(responses);\n\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n\n // add data to table\n await components_table_table.Rows.add(responses, this.columns);\n components_table_table.save();\n\n // rebuild table\n await this.refreshData();\n\n // mark new row\n components_table_table.Rows.markNewRow();\n }\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome.js\n\n\n\n\nclass WelcomeView extends View {\n constructor() {\n super();\n this.page_state = 'welcome';\n this.subtitle = 'Welcome';\n this.sidebar = false;\n this.navButtons = false;\n this.prompt = `This tool will help you prepare your budget request submission for fiscal year \n 20${FISCAL_YEAR}. Start by uploading the detail sheet sent to you by your budget analyst. This\n tool will use the data in that sheet to pre-fill your submission with last year's request.\n

\n Then, you will be guided through each fund to make any adjustments from last year's request. \n As you \n make these adjustments, you will see a sidebar tracking your total expenditures by fund and your target\n baseline for the general fund. \n

\n Once you get through all funds and set your request at or below the \n target, you will be able to download a filled version of the Excel detail sheet. Downloading \n this file is the only permanent way to save your progress.`;\n }\n visit() {\n super.visit();\n\n // show welcome section\n components_welcome_welcome.show();\n\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', () => visitPage('upload'));\n // document.getElementById('step-initiatives').addEventListener('click', () => visitPage('new-inits'));\n // document.getElementById('step-revenue').addEventListener('click', () => visitPage('baseline-landing'));\n // document.getElementById('step-finish').addEventListener('click', () => visitPage('summary'));\n }\n}\n/* harmony default export */ const _00_welcome = (WelcomeView);\n;// CONCATENATED MODULE: ./src/js/views/01_upload.js\n\n\n\nclass UploadView extends View {\n constructor() {\n super();\n this.page_state = 'upload';\n this.prompt = `Upload the baseline detail sheet given by your budget analyst.`;\n this.subtitle = 'Excel Upload';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n components_file_upload_file_upload.show();\n components_file_upload_file_upload.init();\n }\n}\n/* harmony default export */ const _01_upload = (UploadView);\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing.js\n\n\n\n\nclass FundView extends View {\n constructor() {\n super();\n this.page_state = 'baseline-landing';\n this.prompt = `We will now ask you a series of questions about your BASELINE budget request.\n At the end, we will ask you about any new initiatives (ie. supplemental requests).\n Select one of your funds then click continue.`;\n this.subtitle = 'Baseline Budget Request';\n this.table = new FundTable();\n this.sidebar = false;\n this.dataTable = false;\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n\n // hide back button to avoid confusion\n components_nav_buttons_nav_buttons.Last.hide();\n }\n}\nclass FundTable extends ViewTable {\n constructor() {\n super();\n\n // add additional revenue columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund-name'\n }];\n this.noDataMessage = 'No funds found.';\n this.addEdit = false;\n }\n build() {\n // load in fund data\n components_table_table.show();\n components_table_table.Data.loadFunds();\n components_table_table.Columns.assignClasses(this.columns);\n components_table_table.adjustWidth('30%');\n\n // disable next button until a fund is selected\n components_nav_buttons_nav_buttons.Next.disable();\n allowRowSelection();\n }\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\n\n // enable highlight on hover and on select\n tableRows.forEach(function (row) {\n row.addEventListener('mouseover', function () {\n this.classList.add('hover-effect');\n });\n row.addEventListener('mouseout', function () {\n this.classList.remove('hover-effect');\n });\n row.addEventListener('click', function () {\n selectFund(tableRows, this);\n });\n });\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n\n // add selected class to clicked row\n selected_row.classList.add('selected');\n\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n var fundNumber = parseInt(fund);\n current_fund.update(fundNumber);\n\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n/* harmony default export */ const _02_baseline_landing = (FundView);\n;// CONCATENATED MODULE: ./src/js/views/03_revenue.js\n\n\nclass RevenueView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'revenue';\n this.prompt = `Review revenue line items. Revenue estimates are from the \n September Revenue Estimating Conference and cannot be edited here. If you \n notice an error in an account string or estimate, \n please note it in the notes column by clicking edit \n in the relevant row.`;\n this.subtitle = 'Revenues';\n this.table = new RevenueTable(fiscal_year);\n }\n}\nclass RevenueTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional revenue columns to the table\n this.columns = this.columns.concat([{\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Object Category',\n className: 'object-category'\n }, {\n title: `FY${fiscal_year} Departmental Estimate Total`,\n className: 'request',\n isCost: true\n }, {\n title: 'Departmental Estimate Notes',\n className: 'notes'\n },\n // hidden\n {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }]);\n this.noDataMessage = 'No revenues for this fund.';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n // only allow edits in the notes box\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n}\n/* harmony default export */ const _03_revenue = (RevenueView);\n;// CONCATENATED MODULE: ./src/js/views/04_personnel.js\n\n\n\n\n\n\n\nclass PersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'personnel';\n this.prompt = `\n This table displays the number of FTEs in each job code for in your department's \n current (amended) FY25 budget. To make edits to the number of positions, click the\n \"Edit\" button on the row you would like to edit. The \"Total Cost\" column and the \n summary sidebar will also update to reflect any edits.`;\n this.subtitle = 'Personnel';\n this.table = new PersonnelTable(fiscal_year);\n }\n}\nclass PersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n this.fiscal_year = fiscal_year;\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: 'Job Title',\n className: 'job-name'\n }, {\n title: 'Job Code',\n className: 'job-code'\n }, {\n title: 'Employee Type',\n className: 'employee-type'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: `FY${this.fiscal_year} Requested FTE`,\n className: 'baseline-ftes'\n }, {\n title: `FY${this.fiscal_year} Projected Average Salary/Wage`,\n className: 'avg-salary',\n isCost: true\n }, {\n title: 'Total Sal/Wag & Ben Request',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'Fringe Benefits Rate',\n className: 'fringe',\n hide: true\n }, {\n title: 'General Increase Rate',\n className: 'general-increase-rate',\n hide: true\n }, {\n title: 'Step/Merit Increase Rate',\n className: 'merit-increase-rate',\n hide: true\n }, {\n title: `Average Salary/Wage as of 9/1/20${this.fiscal_year - 2}`,\n className: 'current-salary',\n isCost: true,\n hide: true\n }]);\n this.noDataMessage = 'No personnel expenditures for this fund.';\n this.addButtonText = 'Add new job';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let avg_salary = components_table_table.Cell.getValue(rows[i], 'avg-salary');\n let fringe = parseFloat(components_table_table.Cell.getText(rows[i], 'fringe'));\n let baseline_ftes = components_table_table.Cell.getText(rows[i], 'baseline-ftes');\n\n // calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe\n let total_baseline_cost = avg_salary * baseline_ftes * (1 + fringe);\n\n // update total column\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.shortText('Job Code:', 'job-code', true);\n js_components_form_form.NewField.shortText('Job Title:', 'job-name', true);\n js_components_form_form.NewField.dropdown('Employee Type:', 'employee-type', EMPLOYEE_TYPES, true), js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.shortText('Number of FTEs requested:', 'baseline-ftes', true);\n js_components_form_form.NewField.shortText(`Projected average salary IN FISCAL YEAR ${this.fiscal_year}:`, 'avg-salary', true);\n //Form.NewField.shortText(`Expected fringe rate (as a percentage)`, 'fringe', true);\n }\n addModalValidation() {\n super.addModalValidation();\n\n // lock the job description \n const jobDescription = document.getElementById('job-name');\n jobDescription.readOnly = true;\n // give a message if attempt to edit\n const nameValidationText = document.getElementById('job-name-validation');\n jobDescription.addEventListener('click', function () {\n nameValidationText.textContent = 'This field is not editable and will auto-fill from the job code above.';\n });\n // hide message on blur\n jobDescription.addEventListener('blur', function () {\n nameValidationText.textContent = '';\n });\n // hide this box until job code entered\n jobDescription.style.display = 'none';\n\n // confirm that entered job code is in the gold book\n const jobCodeInput = document.getElementById('job-code');\n jobCodeInput.addEventListener('blur', function () {\n // get entered job code\n const jobCode = jobCodeInput.value.toString();\n // get validation text element\n const validationText = document.getElementById('job-code-validation');\n if (!gold_book.codeExists(jobCode)) {\n // if the job code doesn't exist, show an error message\n validationText.textContent = 'This job code does not exist in the current Gold Book. Please enter another code.';\n // and clear any previous entry in the job title \n jobDescription.value = '';\n } else {\n // if it does exist, change the job title accordingly\n jobDescription.value = gold_book.getTitle(jobCode);\n // and clear any error messages\n validationText.textContent = '';\n // and show the job title\n jobDescription.style.display = '';\n }\n });\n }\n editColumns(responses) {\n // Edit responses to fit into table\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n // use gold book to look up info based on job code\n responses['job-name'] = gold_book.getTitle(responses['job-code']);\n responses['fringe'] = gold_book.getFringeRate(responses['job-code']);\n return responses;\n }\n}\n/* harmony default export */ const _04_personnel = (PersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/05_overtime.js\n\n\n\n\n\n\nclass OvertimeView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'overtime';\n this.prompt = `\n Please see your baseline overtime / holiday pay / shift premiums in the table below.\n Make any edits and continue.`;\n this.subtitle = 'Overtime Estimates';\n this.table = new OvertimeTable(fiscal_year);\n }\n}\nclass OvertimeTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional OT columns to the table\n this.columns = this.columns.concat([{\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Departmental Request OT/SP/Hol',\n className: 'OT-pay',\n isCost: true\n }, {\n title: `FY${fiscal_year} Total OT/SP/Hol + FICA Request`,\n className: 'total',\n isCost: true\n }, {\n title: 'Object Name',\n className: 'object-name'\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n },\n // hidden columns\n {\n title: 'FICA Rate',\n className: 'fica',\n hide: true\n }]);\n this.noDataMessage = 'No overtime expenditures for this fund.';\n this.addButtonText = 'Add new cost center';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('OT-pay', true);\n components_table_table.Cell.createServiceDropdown(services.list());\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createDropdown('object-name', OT_OBJECTS);\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n updateTable() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let OT_salary = components_table_table.Cell.getValue(rows[i], 'OT-pay');\n let fica_rate = components_table_table.Cell.getText(rows[i], 'fica');\n\n // add salary and wages and fringe benefits (FICA)\n let row_total = OT_salary * (1 + parseFloat(fica_rate));\n\n // update total\n components_table_table.Cell.updateValue(rows[i], 'total', row_total);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n }\n addCustomQuestions() {\n // form questions to add a new job\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object (salary or wage):', 'object-name', OT_OBJECTS, true);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Overtime amount requested:', 'OT-pay', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n // edit inputs from modal\n responses['OT-pay'] = unformatCurrency(responses['OT-pay']);\n responses['fica'] = 0.0765;\n return responses;\n }\n}\n/* harmony default export */ const _05_overtime = (OvertimeView);\n;// CONCATENATED MODULE: ./src/js/views/06_nonpersonnel.js\n\n\n\n\n\n\nclass NonPersonnelView extends View {\n constructor(fiscal_year) {\n super();\n this.page_state = 'nonpersonnel';\n this.prompt = `Review and edit non-personnel line items. The CPA numbers are the \n Contract and Procurement Account numbers. Click on the 'detail' link for a CPA \n to see the contract details. Some line items won't have a CPA number.`;\n this.subtitle = 'Non-Personnel';\n this.table = new NonPersonnelTable(fiscal_year);\n }\n}\nclass NonPersonnelTable extends ViewTable {\n constructor(fiscal_year) {\n super();\n\n // add additional personnel columns to the table\n this.columns = this.columns.concat([{\n title: `FY${fiscal_year} Departmental Request Total`,\n className: 'request',\n isCost: true\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Vendor Name',\n className: 'vendor'\n }, {\n title: 'CPA #',\n className: 'cpa'\n },\n // hidden columns\n {\n title: 'End Date',\n className: 'contract-end',\n hide: true\n }, {\n title: 'BPA/CPA Amount Remaining',\n className: 'remaining',\n isCost: true,\n hide: true\n }, {\n title: 'Object Name',\n className: 'object-name',\n hide: true\n }, {\n title: 'Object',\n className: 'object',\n hide: true\n }, {\n title: 'Object Category',\n className: 'object-category',\n hide: true\n }, {\n title: 'BPA/CPA Description',\n className: 'cpa-description',\n hide: true\n }, {\n title: 'Departmental Request Notes',\n className: 'notes'\n }]);\n this.noDataMessage = 'No non-personnel expenditures for this fund.';\n this.addButtonText = 'Add new non-personnel item';\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('request', true);\n components_table_table.Cell.createServiceDropdown();\n components_table_table.Cell.createDropdown('recurring', ['One-Time', 'Recurring']);\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n addCustomQuestions() {\n // form questions to add a new row\n js_components_form_form.NewField.dropdown('Appropriation:', 'approp-name', fund_lookup_table.getApprops('Add new'), true);\n js_components_form_form.NewField.dropdown('Cost Center:', 'cc-name', fund_lookup_table.getCostCenters('Add new'), true);\n js_components_form_form.NewField.dropdown('Object Category:', 'object-category', OBJ_CATEGORIES.list, true);\n // TODO: maybe give dropdown based on selected obj category\n js_components_form_form.NewField.shortText('Object Number (if known):', 'object', false);\n js_components_form_form.NewField.dropdown('Service', 'service', services.list(), true);\n js_components_form_form.NewField.longText('Describe your new request:', 'cpa-description', true);\n js_components_form_form.NewField.dropdown('Recurring or One-Time', 'recurring', ['Recurring', 'One-Time'], true);\n js_components_form_form.NewField.shortText('Amount requested:', 'request', true);\n }\n editColumns(responses) {\n responses = super.editColumns(responses);\n responses['avg-salary'] = unformatCurrency(responses['avg-salary']);\n responses['fringe'] = parseFloat(responses['fringe']) / 100;\n return responses;\n }\n}\n/* harmony default export */ const _06_nonpersonnel = (NonPersonnelView);\n;// CONCATENATED MODULE: ./src/js/views/07_new_initiatives.js\n\n\n\n\n\n\n\nconst dropdownOptions = ['N/A', 'One-Time', 'Recurring'];\n\n// set up page and initialize all buttons\nclass InitiativesView extends View {\n constructor() {\n super();\n this.page_state = 'new-inits';\n this.prompt = `\n This is the place to propose new initiatives for FY${FISCAL_YEAR}.\n New initiative submissions will count as supplemental line items and will be the starting \n point for a conversation with both OB and ODFS, who will help with the details.`;\n this.subtitle = 'New Initiatives';\n this.table = new InitiativesTable();\n }\n visit() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n super.visit();\n\n // hide back button to avoid confusion\n components_nav_buttons_nav_buttons.Last.hide();\n }\n}\nclass InitiativesTable extends ViewTable {\n constructor() {\n super();\n\n // add additional columns to the table\n this.columns = [{\n title: 'Fund',\n className: 'fund'\n }, {\n title: 'Supplemental Initiative',\n className: 'init-name'\n }, {\n title: 'Total Initiative Request',\n className: 'total',\n isCost: true\n },\n // { title: 'Personnel FTE', className: 'ftes'},\n {\n title: 'Personnel Salary & Benefits',\n className: 'personnel',\n isCost: true\n }, {\n title: 'Non-Personnel Operating',\n className: 'nonpersonnel',\n isCost: true\n }, {\n title: 'Non-Personnel Capital',\n className: 'nonpersonnel-capital',\n isCost: true\n }, {\n title: 'Description & Justification',\n className: 'notes'\n }, {\n title: 'Recurring or One-Time',\n className: 'rev-type'\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n this.addButtonText = 'Add new initiative';\n }\n addCustomQuestions() {\n // general questions\n js_components_form_form.NewField.shortText('Initiative Name:', 'init-name', true);\n js_components_form_form.NewField.longText('What is the business case for the Initiative?', 'q1', true);\n js_components_form_form.NewField.longText(`Why is the initiative needed? What is the value-add to residents? \n What is the Department’s plan for implementing the Initiative?`, 'q2', true);\n js_components_form_form.NewField.longText(`Why can’t the Initiative be funded with the Department’s baseline budget?`, 'q3', true);\n js_components_form_form.NewField.dropdown(`Is this initiative one-time or recurring?`, 'rev-type', dropdownOptions);\n\n // Account string info\n js_components_form_form.NewField.dropdown('Fund:', 'fund-name', fund_lookup_table.listFundNames('Add new'), true);\n\n // Numbers\n js_components_form_form.NewField.numericInput('What is your ballpark estimate of TOTAL ADDITONAL expenditures associated with this initiative?', 'total', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'personnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel operating cost?', 'nonpersonnel', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel capital costs?', 'nonpersonnel-capital', false);\n }\n editColumns(responses) {\n responses['fund'] = account_string.getNumber(responses['fund-name']);\n responses['notes'] = `${responses['q1']} ${responses['q2']} ${responses['q3']}`;\n return responses;\n }\n addModalValidation() {\n super.addValidationListener('fund-name', 'Fund', 'fund-validation', 4);\n }\n\n // action on row edit click: make cells editable\n actionOnEdit() {\n components_table_table.Cell.createTextbox('total', true);\n // Table.Cell.createTextbox('revenue', true);\n components_table_table.Cell.createTextbox('personnel', true);\n components_table_table.Cell.createTextbox('nonpersonnel', true);\n components_table_table.Cell.createTextbox('nonpersonnel-capital', true);\n components_table_table.Cell.createTextbox('init-name');\n components_table_table.Cell.createDropdown('rev-type', dropdownOptions);\n components_table_table.Cell.createTextbox('notes', false, 'textarea');\n }\n}\n/* harmony default export */ const _07_new_initiatives = (InitiativesView);\n;// CONCATENATED MODULE: ./src/js/views/08_summary.js\n\n\n\n\n\n\n\n\n\nfunction compareToTarget() {\n const baseline = new models_baseline();\n if (baseline.genFundTotal() <= models_baseline.target()) {\n js_components_prompt_prompt.Text.update(`Your General Fund budget is below your target! \n Edit any line items below or continue to the final page.`);\n } else {\n js_components_prompt_prompt.Text.update(`Your General Fund budget is above your GF target of ${formatCurrency(models_baseline.target())}. \n Please expand the summary table below and edit line items until you meet your target. \n When you meet the target, you will be able to continue to the final page.`);\n components_nav_buttons_nav_buttons.Next.disable();\n }\n}\nclass SummaryView extends View {\n constructor() {\n super();\n this.page_state = 'summary';\n this.subtitle = 'Summary';\n this.sidebar = false;\n }\n visit() {\n super.visit();\n\n // reset fund\n current_fund.reset();\n\n // show summary accordion\n Accordion.build();\n Accordion.show();\n\n // update prompt text depending on target matching\n compareToTarget();\n\n // force Excel download on next button\n components_nav_buttons_nav_buttons.Next.addAction(downloadXLSX);\n }\n async cleanup() {\n // delete event listeners\n // delay to make sure download happens before event listener is removed\n await delay(100);\n components_nav_buttons_nav_buttons.Next.removeAction(downloadXLSX);\n }\n}\n/* harmony default export */ const _08_summary = (SummaryView);\n;// CONCATENATED MODULE: ./src/js/views/09_finish.js\n\n\n\n\n\n\nfunction returnToWelcome() {\n const welcome = new _00_welcome();\n welcome.visit();\n}\n;\nclass FinishView extends View {\n constructor() {\n super();\n this.page_state = 'finish';\n this.subtitle = 'Finish';\n this.sidebar = false;\n // todo toggle to false\n this.navButtons = true;\n this.prompt = `Congratulations! A copy of your completed Excel file has been downloaded.\n Download another copy below, or start over with a new Excel upload. Please email the Excel download \n along with the rest of you budget submission.`;\n }\n visit() {\n super.visit();\n\n // reset fund\n current_fund.reset();\n\n // add prompt buttons\n js_components_prompt_prompt.Buttons.Right.updateText('Download completed Excel');\n js_components_prompt_prompt.Buttons.Left.updateText('Start over with new Excel file');\n // add button links\n js_components_prompt_prompt.Buttons.Left.addAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.addAction(downloadXLSX);\n js_components_prompt_prompt.show();\n\n // hide next button\n components_nav_buttons_nav_buttons.Next.hide();\n }\n cleanup() {\n // delete event listeners\n js_components_prompt_prompt.Buttons.Left.removeAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Right.removeAction(downloadXLSX);\n js_components_prompt_prompt.Buttons.Right.enable();\n }\n}\n/* harmony default export */ const _09_finish = (FinishView);\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Initialize pages globally once\nconst PAGES = {\n 'welcome': new _00_welcome(),\n 'upload': new _01_upload(),\n 'baseline-landing': new _02_baseline_landing(),\n 'revenue': new _03_revenue(FISCAL_YEAR),\n 'personnel': new _04_personnel(FISCAL_YEAR),\n 'overtime': new _05_overtime(FISCAL_YEAR),\n 'nonpersonnel': new _06_nonpersonnel(FISCAL_YEAR),\n 'new-inits': new _07_new_initiatives(),\n 'summary': new _08_summary(),\n 'finish': new _09_finish()\n};\nfunction visitPage(new_page_key) {\n var page_state = current_page.load();\n\n // Perform cleanup from the current page\n if (PAGES[page_state]) {\n PAGES[page_state].cleanup();\n }\n if (PAGES[new_page_key]) {\n PAGES[new_page_key].visit();\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n}\nfunction nextPageValue() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n if (current_page.load() == 'nonpersonnel') {\n fund_lookup_table.editFund(current_fund.number());\n if (fund_lookup_table.fundsLeft()) {\n return 'baseline-landing';\n }\n }\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n const nextKey = keys[currentIndex + 1];\n return nextKey;\n }\n}\nfunction nextPage() {\n visitPage(nextPageValue());\n}\nfunction nextPageLabel() {\n return PAGE_LABELS[nextPageValue()];\n}\nfunction lastPageValue() {\n var page_state = current_page.load();\n const keys = Object.keys(PAGES);\n const currentIndex = keys.indexOf(page_state);\n if (currentIndex >= 1) {\n return keys[currentIndex - 1];\n }\n}\nfunction lastPage() {\n visitPage(lastPageValue());\n}\nfunction lastPageLabel() {\n return PAGE_LABELS[lastPageValue()];\n}\n;// CONCATENATED MODULE: ./src/js/models/current_page.js\n\nconst CurrentPage = {\n update: function (page) {\n localStorage.setItem('page_state', page);\n },\n load: function () {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n },\n visit: function () {\n visitPage(this.load());\n }\n};\n/* harmony default export */ const current_page = (CurrentPage);\n;// CONCATENATED MODULE: ./src/js/utils/storage_utils.js\nfunction getLocalStorageSize() {\n let total = 0;\n for (let key in localStorage) {\n if (localStorage.hasOwnProperty(key)) {\n let keySize = key.length * 2; // each character is 2 bytes\n let valueSize = localStorage[key].length * 2; // each character is 2 bytes\n total += keySize + valueSize;\n }\n }\n return formatBytes(total);\n}\nfunction formatBytes(bytes, decimals = 2) {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// Import styles\n\n\n// Import functions\n\n\n\n// Initialize only once when the document is fully loaded\ndocument.addEventListener('DOMContentLoaded', function () {\n current_page.visit();\n console.log('Local Storage Used:', getLocalStorageSize());\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDZkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTs7QUFFQTtBQUNBO0FBWUE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDOUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNsSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDekNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2xOQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxREE7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNUQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQzNDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDckdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzdCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUN2R0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNwR0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7QUMzRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDck1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDL0lBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNuSkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FDMVJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzdNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM3RUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7OztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNuRkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBOztBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUM1REE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7QUM1Q0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FDL0ZBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0NBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQ3JGQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2ZBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9jc3MvY29tbW9uLmNzcz84ZmY2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2RlZTEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5qcz81MzVhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29uc3RhbnRzL2J1ZGdldF9jb25zdGFudHMuanM/MTUwMiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3M/MzI4YiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3N1YmNvbXBvbmVudHMvdGV4dC5qcz9mNmRmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvc3ViY29tcG9uZW50cy9idXR0b25zLmpzPzhkM2IiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanM/YTc3MSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzcz8zYmM3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29uc3RhbnRzL2V4Y2VsX2NvbnN0YW50cy5qcz9mNjg3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29uc3RhbnRzL2luZGV4LmpzPzI1YzQiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy91dGlscy9jb21tb25fdXRpbHMuanM/NDRmMiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL21vZGVscy9mdW5kX2xvb2t1cF90YWJsZS5qcz9kYzY2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2N1cnJlbnRfZnVuZC5qcz9lNmRiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2FjY291bnRfc3RyaW5nLmpzPzZjOGQiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvZnVuZC5qcz82Y2ZhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2Jhc2VsaW5lLmpzP2Q0OTQiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvaW5pdGlhdGl2ZS5qcz9mOTZhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL3NlcnZpY2VzLmpzPzEzOWYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvc3VwcGxlbWVudGFsLmpzPzk5Y2UiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9tb2RlbHMvaW5kZXguanM/MDVlMSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zdWJjb21wb25lbnRzL2Jhc2VsaW5lX3NlY3Rpb24uanM/MTNiZCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zdWJjb21wb25lbnRzL2Fycm93LmpzPzAzMzYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc3ViY29tcG9uZW50cy9zdXBwX3NlY3Rpb24uanM/MGM0ZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzPzgwZjAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmNzcz83MDdmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcz9hYmQxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzP2QxYzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2FjY29yZGlvbi9hY2NvcmRpb24uY3NzPzVhNmMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNzcz83ODRjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2hlYWRlcnMuanM/MTYyMyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9yb3dzLmpzP2ZiNzkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcz9jOTkyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanM/YmE2YiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9jZWxscy5qcz83M2NiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2NvbHVtbnMuanM/Njc0YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9kYXRhLmpzP2Q5YjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvZmlsdGVycy5qcz9hZWNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2dvbGRfYm9vay5qcz82NmM1Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvWExTWF9oYW5kbGVycy5qcz9iYThhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuY3NzP2JjOGMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5qcz9kMjNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvSlNPTl9kYXRhX2hhbmRsZXJzLmpzP2M5ZDIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzPzMwNzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2FjY29yZGlvbi9hY2NvcmRpb24uanM/MWYzNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuY3NzP2RiMDkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmpzPzUxODgiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL21vZGFsL21vZGFsLmNzcz80MGRiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcz81NTMzIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuanM/ZjliYSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jc3M/NzJkNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcz9hMGE1Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzPzU0MTUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9maWVsZHMuanM/NDU5ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL3N1Ym1pdC5qcz9jNTk2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uanM/ZDk0MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzL3ZpZXdfY2xhc3MuanM/YTc5ZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAwX3dlbGNvbWUuanM/MDhiYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAxX3VwbG9hZC5qcz9jNDQ4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDJfYmFzZWxpbmVfbGFuZGluZy5qcz83YjhlIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDNfcmV2ZW51ZS5qcz9iODc4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDRfcGVyc29ubmVsLmpzP2ZiZmYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNV9vdmVydGltZS5qcz9iZjcwIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDZfbm9ucGVyc29ubmVsLmpzPzRkM2QiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wN19uZXdfaW5pdGlhdGl2ZXMuanM/NDFhNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA4X3N1bW1hcnkuanM/OGIzMiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA5X2ZpbmlzaC5qcz83Mzc3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3Mvdmlld19sb2dpYy5qcz80NmM2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvbW9kZWxzL2N1cnJlbnRfcGFnZS5qcz9mZmIwIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvc3RvcmFnZV91dGlscy5qcz9mZGY0Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvaW5pdC5qcz8xYjJhIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jb21tb24uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY29tbW9uLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi93ZWxjb21lLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlbGNvbWUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL3dlbGNvbWUuY3NzJztcclxuXHJcbi8vIEhpZGUgYW5kIHVuaGlkZSB3ZWxjb21lIGJ1dHRvbnNcclxuZnVuY3Rpb24gdW5oaWRlV2VsY29tZUJ1dHRvbnMoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2VsY29tZS1wYWdlXCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbn1cclxuZnVuY3Rpb24gaGlkZVdlbGNvbWVCdXR0b25zKCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndlbGNvbWUtcGFnZVwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBXZWxjb21lID0ge1xyXG4gICAgc2hvdzogdW5oaWRlV2VsY29tZUJ1dHRvbnMsXHJcbiAgICBoaWRlIDogaGlkZVdlbGNvbWVCdXR0b25zXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlbGNvbWU7IiwiLy8gU2V0IHRvIGVxdWFsIGN1cnJlbnQgZmlzY2FsIHllYXJcclxuZXhwb3J0IHZhciBGSVNDQUxfWUVBUiA9ICcyNic7XHJcblxyXG4vLyBvYmplY3QgY2F0ZWdvcmllcyAoZnJvbSBvYmogcGFydCBvZiBhY2NvdW50IHN0cmluZylcclxuZXhwb3J0IGNvbnN0IE9CSl9DQVRFR09SSUVTID0ge1xyXG4gICAgbGlzdCA6IFtcclxuICAgICAgICAvLyAnU2FsYXJpZXMgJiBXYWdlcycsXHJcbiAgICAgICAgLy8gJ0VtcGxveWVlIEJlbmVmaXRzJyxcclxuICAgICAgICAnUHJvZmVzc2lvbmFsICYgQ29udHJhY3R1YWwgU2VydmljZXMnLFxyXG4gICAgICAgICdPcGVyYXRpbmcgU3VwcGxpZXMnLFxyXG4gICAgICAgICdPcGVyYXRpbmcgU2VydmljZXMnLFxyXG4gICAgICAgICdFcXVpcG1lbnQgQWNxdWlzaXRpb24nLFxyXG4gICAgICAgICdDYXBpdGFsIE91dGxheXMnLFxyXG4gICAgICAgICdGaXhlZCBDaGFyZ2VzJyxcclxuICAgICAgICAnT3RoZXIgRXhwZW5zZXMnXHJcbiAgICBdXHJcbn1cclxuXHJcbi8vIGZyb20gdGhlIGRyb3AtZG93biBtZW51XHJcbmV4cG9ydCBjb25zdCBFTVBMT1lFRV9UWVBFUyA9IFtcclxuICAgICdSZWd1bGFyJyxcclxuICAgICdUQVNTJyxcclxuICAgICdTZWFzb25hbCcsXHJcbiAgICAnVW5pZm9ybSBGaXJlJyxcclxuICAgICdVbmlmb3JtIFBvbGljZScsXHJcbiAgICAnQXBwb2ludGVkJyxcclxuICAgICdFbGVjdGVkJyxcclxuICAgICdMb25nIFRlcm0gRGlzYWJpbGl0eScsXHJcbiAgICAnTmV3IFBvc2l0aW9uJ1xyXG5dXHJcblxyXG5leHBvcnQgY29uc3QgT1RfT0JKRUNUUyA9IFtcclxuICAgICc2MDEzMDAgLSBTYWxhci1PdmVydGltZS1HZW4gQ2l0eScsIFxyXG4gICAgJzYwMTMwNSAtIFNhbGFyaWVzLU92ZXJ0aW1lLVBvbGljZSBVbmlmJyxcclxuICAgICc2MDEzMTAgLSBTYWxhcmllcy1PdmVydGltZS1GaXJlIFVuaWYnLFxyXG4gICAgJzYwMjMwMCAtIFdhZ2VzLU92ZXJ0aW1lLUdlbiBDaXR5J1xyXG5dXHJcblxyXG4vLyBOaWNlIG5hbWVzIGZvciB0aGUgcGFnZXNcclxuZXhwb3J0IGNvbnN0IFBBR0VfTEFCRUxTID0ge1xyXG4gICAgJ3dlbGNvbWUnOiAnV2VsY29tZSBQYWdlJyxcclxuICAgICd1cGxvYWQnOiAnRXhjZWwgVXBsb2FkJyxcclxuICAgICdiYXNlbGluZS1sYW5kaW5nJzogJ0Z1bmQgU2VsZWN0aW9uJyxcclxuICAgICdyZXZlbnVlJzogJ1JldmVudWUnLFxyXG4gICAgJ3BlcnNvbm5lbCc6ICdQZXJzb25uZWwnLFxyXG4gICAgJ292ZXJ0aW1lJzogJ092ZXJ0aW1lJyxcclxuICAgICdub25wZXJzb25uZWwnOiAnTm9uLVBlcnNvbm5lbCcsXHJcbiAgICAnbmV3LWluaXRzJzogJ05ldyBJbml0aWF0aXZlcyAoU3VwcGxlbWVudGFscyknLFxyXG4gICAgJ3N1bW1hcnknOiAnU3VtbWFyeSBQYWdlJyxcclxuICAgICdmaW5pc2gnIDogJ0Rvd25sb2FkICYgRmluaXNoJ1xyXG59OyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9wcm9tcHQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJvbXB0LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImZ1bmN0aW9uIHNob3dQcm9tcHQoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJvbXB0LWRpdlwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlUHJvbXB0KCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvbXB0LWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVQcm9tcHQocHJvbXB0KXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9tcHQnKS5pbm5lckhUTUwgPSBwcm9tcHQ7XHJcbiAgICBzaG93UHJvbXB0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBUZXh0ID0ge1xyXG4gICAgc2hvdyA6IHNob3dQcm9tcHQsXHJcbiAgICBoaWRlIDogaGlkZVByb21wdCxcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0KHRleHQpIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGV4dDsiLCJmdW5jdGlvbiBzaG93UHJvbXB0QnV0dG9uKGlkKXtcclxuICAgIC8vIG1ha2UgYnV0dG9ucyB2aXNpYmxlXHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVQcm9tcHRCdXR0b24oaWQsIHRleHQpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIHNob3dQcm9tcHRCdXR0b24oaWQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlUHJvbXB0QnV0dG9uKGlkKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1bmNsaWNrQWxsKCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B0aW9uMScpLmNsYXNzTGlzdC5yZW1vdmUoJ2NsaWNrZWQnKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24yJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUNsaWNrZWRTdHlsZShidXR0b24pe1xyXG4gICAgdW5jbGlja0FsbCgpO1xyXG4gICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2NsaWNrZWQnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkUHJvbXB0QnV0dG9uQWN0aW9uKGJ1dHRvbl9pZCwgYWN0aW9uX2ZuKXtcclxuICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xyXG4gICAgYnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFjdGlvbl9mbik7XHJcbiAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXtcclxuICAgICAgICBhcHBseUNsaWNrZWRTdHlsZSh0aGlzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGFjdGlvbl9mbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRpc2FibGUoYnV0dG9uX2lkKXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2J1dHRvbl9pZH1gKS5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbmFibGUoYnV0dG9uX2lkKXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2J1dHRvbl9pZH1gKS5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTGVmdCA9IHtcclxuICAgIHNob3cgOiBmdW5jdGlvbigpIHsgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMScpIH0sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKSB9LFxyXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJywgdGV4dCkgfSxcclxuICAgIGFkZEFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyBhZGRQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjEnLCBhY3Rpb25fZm4pIH0sXHJcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24xJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdvcHRpb24xJykgfSxcclxuICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ29wdGlvbjEnKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSaWdodCA9IHtcclxuICAgIHNob3cgOiBmdW5jdGlvbigpIHsgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMicpIH0sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjInKSB9LFxyXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJywgdGV4dCkgfSxcclxuICAgIGFkZEFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyBhZGRQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjInLCBhY3Rpb25fZm4pIH0sXHJcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24yJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdvcHRpb24yJykgfSxcclxuICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ29wdGlvbjInKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBCdXR0b25zID0ge1xyXG4gICAgTGVmdCA6IExlZnQsXHJcbiAgICBSaWdodCA6IFJpZ2h0LFxyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcclxuICAgICAgICBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24yJyk7XHJcbiAgICB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcclxuICAgICAgICBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJyk7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQgOiB1bmNsaWNrQWxsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiaW1wb3J0ICcuL3Byb21wdC5jc3MnO1xyXG5cclxuaW1wb3J0IFRleHQgZnJvbSBcIi4vc3ViY29tcG9uZW50cy90ZXh0LmpzXCI7XHJcbmltcG9ydCBCdXR0b25zIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFByb21wdCA9IHtcclxuICAgIFRleHQgOiBUZXh0LFxyXG4gICAgQnV0dG9ucyA6IEJ1dHRvbnMsXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKXtcclxuICAgICAgICBUZXh0LmhpZGUoKTtcclxuICAgICAgICBCdXR0b25zLmhpZGUoKTtcclxuICAgIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKXtcclxuICAgICAgICBUZXh0LnNob3coKTtcclxuICAgICAgICBCdXR0b25zLnNob3coKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvbXB0IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZGViYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lkZWJhci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gXCIuL2J1ZGdldF9jb25zdGFudHNcIjtcclxuXHJcbi8vIHNoZWV0cyB0byBleHBlY3Qgb24gZGV0YWlsIHNoZWV0XHJcbmV4cG9ydCBjb25zdCBTSEVFVFMgPSB7XHJcbiAgICAnRlRFLCBTYWxhcnktV2FnZSwgJiBCZW5lZml0cycgOiAncGVyc29ubmVsJyAsXHJcbiAgICAnT3ZlcnRpbWUgJiBPdGhlciBQZXJzb25uZWwnIDogJ292ZXJ0aW1lJyxcclxuICAgICdOb24tUGVyc29ubmVsJyA6ICdub25wZXJzb25uZWwnLFxyXG4gICAgJ1JldmVudWUnIDogJ3JldmVudWUnLFxyXG4gICAgJ0luaXRpYXRpdmVzIFN1bW1hcnknOiAnbmV3LWluaXRzJ1xyXG59XHJcblxyXG4vLyB3aGVyZSB0byBmaW5kIHRoZSBnZW5lcmFsIGZ1bmQgdGFyZ2V0XHJcbmV4cG9ydCBjb25zdCBUQVJHRVRfQ0VMTF9BRERSRVNTID0gJ0MxNCdcclxuXHJcbmV4cG9ydCBjb25zdCBUT1RBTF9DT0xVTU5TID0ge1xyXG4gICAgJ3BlcnNvbm5lbCc6ICdUb3RhbCBTYWwvV2FnICYgQmVuIFJlcXVlc3QnLFxyXG4gICAgJ292ZXJ0aW1lJzpgRlkke0ZJU0NBTF9ZRUFSfSBUb3RhbCBPVC9TUC9Ib2wgKyBGSUNBIFJlcXVlc3RgLFxyXG4gICAgJ25vbnBlcnNvbm5lbCc6IGBGWSR7RklTQ0FMX1lFQVJ9IERlcGFydG1lbnRhbCBSZXF1ZXN0IFRvdGFsYCxcclxuICAgICdyZXZlbnVlJzogYEZZJHtGSVNDQUxfWUVBUn0gRGVwYXJ0bWVudGFsIEVzdGltYXRlIFRvdGFsYCxcclxuICAgICduZXctaW5pdHMnOiBgVG90YWwgSW5pdGlhdGl2ZSBSZXF1ZXN0YFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE5FV19JTklUX0NPTFMgPSB7XHJcbiAgICAncGVyc29ubmVsJyA6ICdQZXJzb25uZWwgU2FsYXJ5ICYgQmVuZWZpdHMnLFxyXG4gICAgJ29wZXJhdGluZycgOiAnTm9uLVBlcnNvbm5lbCBPcGVyYXRpbmcnLFxyXG4gICAgJ2NhcGl0YWwnIDogJ05vbi1QZXJzb25uZWwgQ2FwaXRhbCcsXHJcbiAgICAncmV2ZW51ZScgOiAnUmV2ZW51ZScsXHJcbiAgICAnbmFtZScgOiAnU3VwcGxlbWVudGFsIEluaXRpYXRpdmUnLFxyXG4gICAgJ3RvdGFsJyA6IFRPVEFMX0NPTFVNTlNbJ25ldy1pbml0cyddXHJcbn0iLCJleHBvcnQgKiBmcm9tICcuL2J1ZGdldF9jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2V4Y2VsX2NvbnN0YW50cyc7IiwiLy8gRnVuY3Rpb24gdG8gZm9ybWF0IG51bWJlciBhcyBjdXJyZW5jeVxyXG5leHBvcnQgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSAoYW1vdW50LCByZXR1cm5femVybyA9IGZhbHNlKSA9PiB7XHJcbiAgICB2YXIgYW1vdW50ID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGFtb3VudCkpO1xyXG4gICAgaWYgKGFtb3VudCA9PSBOYU4pe1xyXG4gICAgICAgIHJldHVybiBcIiQgLVwiXHJcbiAgICB9XHJcbiAgICBpZiAoYW1vdW50IDwgMCl7XHJcbiAgICAgICAgcmV0dXJuICcoJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpICsgJyknO1xyXG4gICAgfSBlbHNlIGlmIChhbW91bnQgPT0gMCkge1xyXG4gICAgICAgIGlmIChyZXR1cm5femVybyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnJDAnOyAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcclxuICAgIH1cclxuICAgIHJldHVybiAnJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xyXG59IDtcclxuXHJcbi8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZm9ybWF0dGVkIG51bWJlciB0byBhIGZsb2F0XHJcbmV4cG9ydCBjb25zdCB1bmZvcm1hdEN1cnJlbmN5ID0gKGZvcm1hdHRlZEFtb3VudCkgPT4ge1xyXG4gICAgaWYgKCFmb3JtYXR0ZWRBbW91bnQpIHsgcmV0dXJuIDAgfTtcclxuICAgIC8vIFJlbW92ZSBhbnkgY3VycmVuY3kgc3ltYm9scyBhbmQgY29tbWFzXHJcbiAgICBsZXQgbnVtZXJpY2FsUGFydCA9IGZvcm1hdHRlZEFtb3VudC5yZXBsYWNlKC9bXjAtOS4tXSsvZywgXCJcIik7XHJcbiAgICBpZiAobnVtZXJpY2FsUGFydCA9PSAnLScpe1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobnVtZXJpY2FsUGFydCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVdpdGhDb21tYXModmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSAwKXtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSkucmVwbGFjZSgnJCcsICcnKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3RyaW5nKHN0cil7XHJcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgnICcsICctJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOZXdMaW5lcyhzdHIpe1xyXG4gICAgLy8gcmVwbGFjZSBhbGwgbmV3IGxpbmVzIHdpdGggc3BhY2VzXHJcbiAgICBzdHIgPSBzdHIucmVwbGFjZUFsbCgvW1xcclxcbl0rL2csIFwiIFwiKTtcclxuICAgIC8vIHJlbW92ZSBhbnkgZXh0cmEgc3BhY2VzIG9yIHRyYWlsaW5nL2xlYWRpbmcgd2hpdGVzcGFjZVxyXG4gICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoJyAgJywgJyAnKTtcclxuICAgIHN0ciA9IHN0ci5yZXBsYWNlQWxsKCcgICcsICcgJyk7XHJcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbFN1bSh0YWJsZSwgY29sTmFtZSkge1xyXG4gICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgIGlmKCF0YWJsZSB8fCB0YWJsZSA9PSAnJyl7IFxyXG4gICAgICAgIHJldHVybiAwOyBcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyh0YWJsZVswXSk7XHJcbiAgICBpZiAoaGVhZGVycy5pbmNsdWRlcyhjb2xOYW1lKSkge1xyXG4gICAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodGFibGVbaV1bY29sTmFtZV0pKTtcclxuICAgICAgICAgICAgLy8gdHJlYXQgTmFOIChub24tbnVtZXJpY3MpIGFzIHplcm9lc1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHsgc3VtICs9IHZhbHVlOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHRvdGFsIGNvbHVtbiBpbiBzYXZlZCBkYXRhIGZvciAke25hbWV9LiBSZXR1cm5pbmcgMC4gU2VlIFN0b3JlZFRhYmxlLnRvdGFsQ29sKCkgc3dpdGNoLmApO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVZhbHVlcyhkYXRhLCBrZXkpIHtcclxuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKG9iaiA9PiBvYmpba2V5XSk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcykpO1xyXG59XHJcblxyXG4vLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBpbnRyb2R1Y2UgYSBkZWxheVxyXG5leHBvcnQgZnVuY3Rpb24gZGVsYXkobXMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxufSIsImltcG9ydCBDdXJyZW50RnVuZCBmcm9tIFwiLi9jdXJyZW50X2Z1bmRcIjtcclxuaW1wb3J0IHsgZ2V0VW5pcXVlVmFsdWVzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vbl91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZ1bmRMb29rdXBUYWJsZSA9IHtcclxuICAgIHJldHJpZXZlIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJykpIHx8IHt9O1xyXG4gICAgfSxcclxuICAgIHNhdmUgOiBmdW5jdGlvbihmdW5kRGljdCl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJywgSlNPTi5zdHJpbmdpZnkoZnVuZERpY3QpKTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24oZnVuZERhdGEpe1xyXG4gICAgICAgIC8vIHJlc2V0XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgIC8vIGZpbGwgaW4gd2l0aCBkYXRhIHN0b3JlZCBpbiBmdW5kRGF0ZVxyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXRyaWV2ZSgpO1xyXG4gICAgICAgIGZvciAobGV0IGZ1bmQgb2YgT2JqZWN0LmtleXMoZnVuZERhdGEpKXtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0byBsb29rdXAgdGFibGUgaWYgbm90IGluIHRoZXJlIGFscmVhZHlcclxuICAgICAgICAgICAgaWYgKCF0YWJsZVtmdW5kXSl7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgZnVuZCBuYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdW5kTmFtZSA9IGZ1bmREYXRhW2Z1bmRdWzBdWydGdW5kIE5hbWUnXTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCBmdW5kIHRvIGRpY3Rpb25hcnlcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdID0ge307XHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsnbmFtZSddID0gZnVuZE5hbWU7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsndmlld2VkJ10gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGxpc3RzIG9mIHVuaXF1ZSBjb3N0IGNlbnRlcnMgYW5kIGFwcHJvcHJpYXRpb25zXHJcbiAgICAgICAgICAgICAgICB0YWJsZVtmdW5kXVsnYXBwcm9wJ10gPSBnZXRVbmlxdWVWYWx1ZXMoZnVuZERhdGFbZnVuZF0sICdBcHByb3ByaWF0aW9uIE5hbWUnKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdWydjYyddID0gZ2V0VW5pcXVlVmFsdWVzKGZ1bmREYXRhW2Z1bmRdLCAnQ29zdCBDZW50ZXIgTmFtZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNhdmUgYW55IHVwZGF0ZXNcclxuICAgICAgICB0aGlzLnNhdmUodGFibGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBbGw6IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGFnZ3JlZ2F0ZSBhbGwgYXBwcm9wcyBvciBDQ3MgZm9yIGV2ZXJ5IGZ1bmQgaW4gb25lIGFycmF5XHJcbiAgICAgICAgY29uc3QgZnVuZHMgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBmdW5kIGluIGZ1bmRzKSB7XHJcbiAgICAgICAgICAgIGlmIChmdW5kcy5oYXNPd25Qcm9wZXJ0eShmdW5kKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBmdW5kc1tmdW5kXVtrZXldKXtcclxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChmdW5kc1tmdW5kXVtrZXldW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb3N0Q2VudGVycyA6IGZ1bmN0aW9uKCBleHRyYU9wdGlvbiApIHtcclxuICAgICAgICAvLyBnZXQgY3VycmVudCBmdW5kXHJcbiAgICAgICAgY29uc3QgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpXHJcbiAgICAgICAgbGV0IHJldCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLnJldHJpZXZlKClbZnVuZF0pe1xyXG4gICAgICAgICAgICByZXQgPSB0aGlzLnJldHJpZXZlKClbZnVuZF1bJ2NjJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaWYgbm8gZnVuZCAoaWUuIHdlJ3JlIG9uIHRoZSBuZXcgaW5pdGlhdGl2ZSBwYWdlKSwgcmV0dXJuIGFsbCBvcHRpb25zXHJcbiAgICAgICAgICAgIHJldCA9IHRoaXMuZ2V0QWxsKCdjYycpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYWRkIGV4dHJhIG9wdGlvbiBpZiBnaXZlblxyXG4gICAgICAgIGlmIChleHRyYU9wdGlvbikge1xyXG4gICAgICAgICAgICByZXQucHVzaChleHRyYU9wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFwcHJvcHMgOiBmdW5jdGlvbiggZXh0cmFPcHRpb24gKSB7XHJcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgZnVuZFxyXG4gICAgICAgIGNvbnN0IGZ1bmQgPSBDdXJyZW50RnVuZC5udW1iZXIoKVxyXG4gICAgICAgIGxldCByZXQgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5yZXRyaWV2ZSgpW2Z1bmRdKXtcclxuICAgICAgICAgICAgcmV0ID0gdGhpcy5yZXRyaWV2ZSgpW2Z1bmRdWydhcHByb3AnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZiBubyBmdW5kIChpZS4gd2UncmUgb24gdGhlIG5ldyBpbml0aWF0aXZlIHBhZ2UpLCByZXR1cm4gYWxsIG9wdGlvbnNcclxuICAgICAgICAgICAgcmV0ID0gdGhpcy5nZXRBbGwoJ2FwcHJvcCcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYWRkIGV4dHJhIG9wdGlvbiBpZiBnaXZlblxyXG4gICAgICAgIGlmIChleHRyYU9wdGlvbikge1xyXG4gICAgICAgICAgICByZXQucHVzaChleHRyYU9wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlKHt9KTtcclxuICAgIH0sXHJcbiAgICBnZXROYW1lIDogZnVuY3Rpb24obnVtYmVyKXtcclxuICAgICAgICBpZighbnVtYmVyIHx8ICF0aGlzLnJldHJpZXZlKCkpIHsgcmV0dXJuICcnIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cmlldmUoKVtudW1iZXJdWyduYW1lJ107XHJcbiAgICB9LFxyXG4gICAgbGlzdEZ1bmRzIDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXRyaWV2ZSgpKTtcclxuICAgIH0sXHJcbiAgICBsaXN0RnVuZE5hbWVzIDogZnVuY3Rpb24oYWRkaXRpb25hbE9wdGlvbil7XHJcbiAgICAgICAgY29uc3QgZnVuZHMgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhcnJheVxyXG4gICAgICAgIHZhciByZXQgPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyhmdW5kcykuZm9yRWFjaCggKGZ1bmRfbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmdW5kX25hbWUgPSBmdW5kc1tmdW5kX251bWJlcl1bJ25hbWUnXTtcclxuICAgICAgICAgICAgcmV0LnB1c2goZnVuZF9uYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoYWRkaXRpb25hbE9wdGlvbil7XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGFkZGl0aW9uYWxPcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfSxcclxuICAgIGVkaXRGdW5kIDogZnVuY3Rpb24oZnVuZCl7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgaWYgKHRhYmxlW2Z1bmRdKXtcclxuICAgICAgICAgICAgdGFibGVbZnVuZF1bJ3ZpZXdlZCddID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlKHRhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBmdW5kIHNlbGVjdGVkLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH0sXHJcbiAgICBsaXN0VW5lZGl0ZWRGdW5kcyA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgdGhpcy5saXN0RnVuZHMoKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGFibGVba2V5XVsndmlld2VkJ10pe1xyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9LFxyXG4gICAgZnVuZHNMZWZ0IDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gKHRoaXMubGlzdFVuZWRpdGVkRnVuZHMoKS5sZW5ndGggPiAwKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuZExvb2t1cFRhYmxlIiwiXHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSBcIi4vZnVuZF9sb29rdXBfdGFibGVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBDdXJyZW50RnVuZCA9IHtcclxuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKGZ1bmQpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmdW5kJywgZnVuZCk7XHJcbiAgICB9LFxyXG4gICAgbnVtYmVyIDogZnVuY3Rpb24oKXtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJmdW5kXCIpO1xyXG4gICAgfSxcclxuICAgIG5hbWUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBGdW5kTG9va3VwVGFibGUuZ2V0TmFtZSggdGhpcy5udW1iZXIoKSk7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZSgnJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEN1cnJlbnRGdW5kOyIsImltcG9ydCBDdXJyZW50RnVuZCBmcm9tIFwiLi9jdXJyZW50X2Z1bmRcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBY2NvdW50U3RyaW5nID0ge1xyXG4gICAgZ2V0TnVtYmVyOiBmdW5jdGlvbihpbnB1dCkge1xyXG4gICAgICAgIC8vIGlzb2xhdGUgdGhlIG51bWVyaWNhbCBwYXJ0IG9mIGEgYXBwcm9wcmlhdGlvbi9jb3N0IGNlbnRlci9vYmplY3RcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eXFxkKy8pO1xyXG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgYnVpbGQgOiBmdW5jdGlvbihhcHByb3AsIGNjLCBvYmogPSBudWxsLCBmdW5kID0gbnVsbCkge1xyXG4gICAgICAgIC8vIHB1dCB0b2dldGhlciBhY2NvdW50IHN0cmluZyBmdW5kLWFwcHJvcC1jb3N0Y2VudGVyWy1vYmpdICh3IG9wdGlvbmFsIG9iamVjdClcclxuICAgICAgICBpZiAoIWZ1bmQpIHsgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpIH07XHJcbiAgICAgICAgLy8gaGl0cyBlcnJvciBoZXJlXHJcbiAgICAgICAgYXBwcm9wID0gdGhpcy5nZXROdW1iZXIoYXBwcm9wKTtcclxuICAgICAgICBjYyA9IHRoaXMuZ2V0TnVtYmVyKGNjKTtcclxuICAgICAgICB2YXIgc3RyaW5nID0gYCR7ZnVuZH0tJHthcHByb3B9LSR7Y2N9YDtcclxuICAgICAgICBzdHJpbmcgPSBvYmogPyBgJHtzdHJpbmd9LSR7dGhpcy5nZXROdW1iZXIob2JqKX1gIDogc3RyaW5nO1xyXG4gICAgICAgIHJldHVybiBzdHJpbmc7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFjY291bnRTdHJpbmdTZWN0aW9uIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcsIHNlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGFjY291bnRfc3RyaW5nLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnMubGVuZ3RoID4gc2VjdGlvbiA/IHNlY3Rpb25zW3NlY3Rpb25dIDogbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgZnVuZCA6IGZ1bmN0aW9uKGFjY291bnRfc3RyaW5nKSB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAwKSBcclxuICAgIH0sXHJcblxyXG4gICAgYXBwcm9wIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcpIHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudFN0cmluZ1NlY3Rpb24oYWNjb3VudF9zdHJpbmcsIDEpIFxyXG4gICAgfSxcclxuXHJcbiAgICBjb3N0Q2VudGVyIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcpIHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudFN0cmluZ1NlY3Rpb24oYWNjb3VudF9zdHJpbmcsIDIpIFxyXG4gICAgfSxcclxuXHJcbiAgICBvYmplY3QgOiBmdW5jdGlvbihhY2NvdW50X3N0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjY291bnRTdHJpbmdTZWN0aW9uKGFjY291bnRfc3RyaW5nLCAzKSBcclxuICAgIH0sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFjY291bnRTdHJpbmc7IiwiXHJcbmltcG9ydCB7IGNvbFN1bSB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuaW1wb3J0IHsgVE9UQUxfQ09MVU1OUyB9IGZyb20gJy4uL2NvbnN0YW50cy8nO1xyXG5cclxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHVuaXF1ZSBsaXN0IG9mIGFwcHJvcHJpYXRpb25zIHJlcHJlc2VudGVkIGluIGEgdGFibGVcclxuZnVuY3Rpb24gZmV0Y2hWYWx1ZVNldCh0YWJsZSwga2V5KSB7XHJcblxyXG4gICAgLy8gSUYgdGhlcmUncyBubyBkYXRhLCByZXR1cm4gYW4gZW1wdHkgbGlzdFxyXG4gICAgaWYoIXRhYmxlKXtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlIGEgU2V0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXNcclxuICAgIGNvbnN0IHVuaXFWYWx1ZXMgPSBuZXcgU2V0KCk7XHJcbiAgXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIHRhYmxlXHJcbiAgICB0YWJsZS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIGlmIChyb3dba2V5XSkge1xyXG4gICAgICAgIHVuaXFWYWx1ZXMuYWRkKHJvd1trZXldKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBDb252ZXJ0IHRoZSBTZXQgdG8gYW4gYXJyYXkgaWYgbmVlZGVkXHJcbiAgICByZXR1cm4gdW5pcVZhbHVlcztcclxuICB9XHJcblxyXG4vLyBDbGFzcyB0byBob2xkIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgZnVuZCBhbmQgdGFibGVcclxuY2xhc3MgU3RvcmVkVGFibGUge1xyXG4gICAgY29uc3RydWN0b3IocGFnZSwgZnVuZCl7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gYCR7cGFnZX1fJHtmdW5kfWA7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgICB0aGlzLnRhYmxlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpKTtcclxuICAgICAgICB0aGlzLmFwcHJvcHMgPSBmZXRjaFZhbHVlU2V0KHRoaXMudGFibGUsICdBcHByb3ByaWF0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5jYyA9IGZldGNoVmFsdWVTZXQodGhpcy50YWJsZSwgJ0Nvc3QgQ2VudGVyJyk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsQ29sKCkge1xyXG4gICAgICAgIHJldHVybiBUT1RBTF9DT0xVTU5TW3RoaXMucGFnZV07XHJcbiAgICB9XHJcbiAgICBnZXRTdW0oKSB7XHJcbiAgICAgICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIHRoaXMudG90YWxDb2woKSwgdGhpcy5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBrZXkgaXMgdGhlIGNvbHVtbiB0byBmaWx0ZXIgb24gKGllLiBDb3N0IENlbnRlcilcclxuICAgIGZpbHRlcihrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUpe1xyXG4gICAgICAgICAgICAvLyByZWFzc2lnbiB1bmRlcmx5aW5nIGRhdGEgaW4gb2JqZWN0IGlmIHRoZXJlJ3MgZGF0YSB0byBmaWx0ZXJcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRoaXMudGFibGUuZmlsdGVyKHJvdyA9PiB7ICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvd1trZXldKSAmJiAocm93W2tleV0gPT0gdmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29zdENlbnRlcntcclxuICAgIGNvbnN0cnVjdG9yKGZ1bmQsIGFwcHJvcCwgY2Mpe1xyXG4gICAgICAgIGNvbnN0IEFwcHJvcE9iaiA9IG5ldyBBcHByb3ByaWF0aW9uKGZ1bmQsIGFwcHJvcCk7XHJcbiAgICAgICAgdGhpcy5wZXJzb25uZWwgPSBBcHByb3BPYmoucGVyc29ubmVsLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5ub25wZXJzb25uZWwgPSBBcHByb3BPYmoubm9ucGVyc29ubmVsLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IEFwcHJvcE9iai5vdmVydGltZS5maWx0ZXIoJ0Nvc3QgQ2VudGVyJywgY2MpO1xyXG4gICAgICAgIHRoaXMucmV2ZW51ZSA9IEFwcHJvcE9iai5yZXZlbnVlLmZpbHRlcignQ29zdCBDZW50ZXInLCBjYyk7XHJcbiAgICAgICAgdGhpcy5jYyA9IGNjO1xyXG4gICAgICAgIHRoaXMuYWNjb3VudF9zdHJpbmcgPSBgJHtBcHByb3BPYmouYWNjb3VudFN0cmluZygpfS0ke2NjfWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25uZWwuZ2V0U3VtKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIGdldE92ZXJ0aW1lQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVydGltZS5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXROb25QZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJldmVudWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoKSB7IFxyXG4gICAgICAgIC8vIG9ubHkgc3VtIGV4cGVuZGl0dXJlcywgbm90IG5ldCBvZiByZXZlbnVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9uUGVyc29ubmVsQ29zdCgpICsgdGhpcy5nZXRPdmVydGltZUNvc3QoKSArIHRoaXMuZ2V0UGVyc29ubmVsQ29zdCgpOyBcclxuICAgIH1cclxuXHJcbiAgICBnZXROYW1lKCl7XHJcbiAgICAgICAgLy8ganVzdCBncmFiIHRoZSB2YWx1ZSBpbiB0aGUgYXBwcm9wIG5hbWUgY29sdW1uIGZvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBmaXJzdCBub24tZW1wdHkgdGFibGVcclxuICAgICAgICBjb25zdCB0YWJsZXMgPSBbdGhpcy5ub25wZXJzb25uZWwudGFibGUsIHRoaXMucGVyc29ubmVsLnRhYmxlLCB0aGlzLm92ZXJ0aW1lLnRhYmxlLCB0aGlzLnJldmVudWUudGFibGVdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0YWJsZXMpIHtcclxuICAgICAgICAgIGlmICh0YWJsZS5sZW5ndGggPiAwICYmIHRhYmxlWzBdWydDb3N0IENlbnRlciBOYW1lJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlWzBdWydDb3N0IENlbnRlciBOYW1lJ107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLy8gSWYgYWxsIHRhYmxlcyBhcmUgZW1wdHksIHJldHVybiAnJ1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH0gIFxyXG5cclxuICAgIGFjY291bnRTdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjb3VudF9zdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBcHByb3ByaWF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKGZ1bmQsIGFwcHJvcCl7XHJcbiAgICAgICAgY29uc3QgZnVuZE9iaiA9IG5ldyBGdW5kKGZ1bmQpO1xyXG4gICAgICAgIHRoaXMucGVyc29ubmVsID0gZnVuZE9iai5wZXJzb25uZWwuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICB0aGlzLm5vbnBlcnNvbm5lbCA9IGZ1bmRPYmoubm9ucGVyc29ubmVsLmZpbHRlcignQXBwcm9wcmlhdGlvbicsIGFwcHJvcCk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IGZ1bmRPYmoub3ZlcnRpbWUuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICB0aGlzLnJldmVudWUgPSBmdW5kT2JqLnJldmVudWUuZmlsdGVyKCdBcHByb3ByaWF0aW9uJywgYXBwcm9wKTtcclxuICAgICAgICAvLyBvd24gZGF0YVxyXG4gICAgICAgIHRoaXMuYXBwcm9wID0gYXBwcm9wO1xyXG4gICAgICAgIHRoaXMuZnVuZCA9IGZ1bmRPYmouZnVuZDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29zdENlbnRlcnMoKXtcclxuICAgICAgICAvLyBidWlsZCBhIHNldCBvZiB1bmlxdWUgYXBwcm9wcmlhdGlvbnMgYWNyb3NzIGFsbCBsaW5lIGl0ZW1zIGZvciB0aGUgZnVuZFxyXG4gICAgICAgIGNvbnN0IGNjID0gbmV3IFNldChbLi4udGhpcy5wZXJzb25uZWwuY2MsXHJcbiAgICAgICAgICAgIC4uLnRoaXMub3ZlcnRpbWUuY2MsIFxyXG4gICAgICAgICAgICAuLi50aGlzLm5vbnBlcnNvbm5lbC5jYywgXHJcbiAgICAgICAgICAgIC4uLnRoaXMucmV2ZW51ZS5jY10pO1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIGEgbGlzdCBwbGFjZWhvbGRlciBmb3IgdGhlIGFwcHJvcHJpYXRpb25zIG9iamVjdHNcclxuICAgICAgICBjb25zdCBjY0xpc3QgPSBbXTtcclxuICAgICAgICAvLyBidWlsZCBvdXQgbGlzdFxyXG4gICAgICAgIGNjLmZvckVhY2gobnVtID0+IHtcclxuICAgICAgICAgICAgY2NMaXN0LnB1c2gobmV3IENvc3RDZW50ZXIodGhpcy5mdW5kLCB0aGlzLmFwcHJvcCwgbnVtKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNjTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICB0b3RhbCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbm5lbC5nZXRTdW0oKSArIHRoaXMub3ZlcnRpbWUuZ2V0U3VtKCkgKyB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBuYW1lKCl7XHJcbiAgICAgICAgLy8ganVzdCBncmFiIHRoZSB2YWx1ZSBpbiB0aGUgYXBwcm9wIG5hbWUgY29sdW1uIGZvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBmaXJzdCBub24tZW1wdHkgdGFibGVcclxuICAgICAgICBjb25zdCB0YWJsZXMgPSBbdGhpcy5ub25wZXJzb25uZWwudGFibGUsIHRoaXMucGVyc29ubmVsLnRhYmxlLCB0aGlzLm92ZXJ0aW1lLnRhYmxlLCB0aGlzLnJldmVudWUudGFibGVdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YWJsZSBvZiB0YWJsZXMpIHtcclxuICAgICAgICAgIGlmICh0YWJsZSAmJiB0YWJsZVswXSAmJiB0YWJsZVswXVsnQXBwcm9wcmlhdGlvbiBOYW1lJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlWzBdWydBcHByb3ByaWF0aW9uIE5hbWUnXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvLyBJZiBhbGwgdGFibGVzIGFyZSBlbXB0eSwgcmV0dXJuICcnXHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSAgXHJcblxyXG4gICAgYWNjb3VudFN0cmluZygpe1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmZ1bmR9LSR7dGhpcy5hcHByb3B9YDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8vIEhvbGRzIGFsbCB0aGUgZGV0YWlsZWQgZGF0YSBmb3Igb25lIGZ1bmQncyBidWRnZXRcclxuZXhwb3J0IGNsYXNzIEZ1bmQge1xyXG4gICAgY29uc3RydWN0b3IoZnVuZCl7XHJcbiAgICAgICAgdGhpcy5mdW5kID0gZnVuZDtcclxuICAgICAgICB0aGlzLnBlcnNvbm5lbCA9IG5ldyBTdG9yZWRUYWJsZSgncGVyc29ubmVsJywgZnVuZCk7XHJcbiAgICAgICAgdGhpcy5vdmVydGltZSA9IG5ldyBTdG9yZWRUYWJsZSgnb3ZlcnRpbWUnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLm5vbnBlcnNvbm5lbCA9IG5ldyBTdG9yZWRUYWJsZSgnbm9ucGVyc29ubmVsJywgZnVuZCk7XHJcbiAgICAgICAgdGhpcy5yZXZlbnVlID0gbmV3IFN0b3JlZFRhYmxlKCdyZXZlbnVlJywgZnVuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXBwcm9wcmlhdGlvbnMoKXtcclxuICAgICAgICAvLyBidWlsZCBhIHNldCBvZiB1bmlxdWUgYXBwcm9wcmlhdGlvbnMgYWNyb3NzIGFsbCBsaW5lIGl0ZW1zIGZvciB0aGUgZnVuZFxyXG4gICAgICAgIGNvbnN0IGFwcHJvcHMgPSBuZXcgU2V0KFsuLi50aGlzLnBlcnNvbm5lbC5hcHByb3BzLFxyXG4gICAgICAgICAgICAuLi50aGlzLm92ZXJ0aW1lLmFwcHJvcHMsIFxyXG4gICAgICAgICAgICAuLi50aGlzLm5vbnBlcnNvbm5lbC5hcHByb3BzLCBcclxuICAgICAgICAgICAgLi4udGhpcy5yZXZlbnVlLmFwcHJvcHNdKTtcclxuXHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhIGxpc3QgcGxhY2Vob2xkZXIgZm9yIHRoZSBhcHByb3ByaWF0aW9ucyBvYmplY3RzXHJcbiAgICAgICAgY29uc3QgYXBwcm9wc0xpc3QgPSBbXTtcclxuICAgICAgICAvLyBidWlsZCBvdXQgbGlzdFxyXG4gICAgICAgIGFwcHJvcHMuZm9yRWFjaChhcHByb3AgPT4ge1xyXG4gICAgICAgICAgICBhcHByb3BzTGlzdC5wdXNoKCBuZXcgQXBwcm9wcmlhdGlvbih0aGlzLmZ1bmQsIGFwcHJvcCkgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYXBwcm9wc0xpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25uZWwuZ2V0U3VtKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIGdldE92ZXJ0aW1lQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVydGltZS5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXROb25QZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbC5nZXRTdW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJldmVudWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoKSB7IFxyXG4gICAgICAgIC8vIG9ubHkgc3VtIGV4cGVuZGl0dXJlcywgbm90IG5ldCBvZiByZXZlbnVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9uUGVyc29ubmVsQ29zdCgpICsgdGhpcy5nZXRPdmVydGltZUNvc3QoKSArIHRoaXMuZ2V0UGVyc29ubmVsQ29zdCgpOyBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuZDsiLCJpbXBvcnQgRnVuZCBmcm9tIFwiLi9mdW5kLmpzXCI7XHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSBcIi4vZnVuZF9sb29rdXBfdGFibGUuanNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQmFzZWxpbmUge1xyXG4gICAgLy8gYmFzZWxpbmUgd2lsbCBqdXN0IGNvbnRhaW4gYSBsaXN0IG9mIGZ1bmRzLCBlYWNoIHdpdGhcclxuICAgIC8vIHJ1bm5pbmcgdGFsbGllcyBmb3IgdGhlaXIgYnVkZ2V0c1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc3QgYWxsRnVuZHMgPSBGdW5kTG9va3VwVGFibGUubGlzdEZ1bmRzKCk7XHJcbiAgICAgICAgdGhpcy5mdW5kcyA9IFtdO1xyXG4gICAgICAgIGFsbEZ1bmRzLmZvckVhY2goKGZ1bmQpID0+IHsgXHJcbiAgICAgICAgICAgIHRoaXMuZnVuZHMucHVzaChuZXcgRnVuZChmdW5kKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IFxyXG5cclxuICAgIHN0YXRpYyB0YXJnZXQoKSB7IHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGFyZ2V0JykgfTtcclxuXHJcbiAgICBwZXJzb25uZWwoKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgICAgIHRvdGFsICs9IGZ1bmQuZ2V0UGVyc29ubmVsQ29zdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH1cclxuXHJcbiAgICBvdmVydGltZSgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRPdmVydGltZUNvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgbm9ucGVyc29ubmVsKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldE5vblBlcnNvbm5lbENvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRSZXZlbnVlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbCgpICsgdGhpcy5wZXJzb25uZWwoKSArIHRoaXMub3ZlcnRpbWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5GdW5kVG90YWwoKSB7XHJcbiAgICAgICAgY29uc3QgR0YgPSBuZXcgRnVuZCgxMDAwKTtcclxuICAgICAgICByZXR1cm4gR0YuZ2V0VG90YWwoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzZWxpbmU7IiwiXHJcbi8vIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gb24gbmV3IGluaXRpYXRpdmVzXHJcblxyXG5pbXBvcnQgeyBORVdfSU5JVF9DT0xTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBjbGVhblN0cmluZyB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbml0aWF0aXZlIHtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3Iocm93KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcm93O1xyXG4gICAgICAgIHRoaXMubmFtZSA9IHJvd1tORVdfSU5JVF9DT0xTWyduYW1lJ11dO1xyXG4gICAgfVxyXG5cclxuICAgIGlkKCkge1xyXG4gICAgICAgIGxldCBoYXNoID0gNTM4MTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmFtZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgNSkgKyBoYXNoICsgdGhpcy5uYW1lLmNoYXJDb2RlQXQoaSk7ICAvLyBoYXNoICogMzMgKyBjXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwOyAgLy8gRW5zdXJlIHBvc2l0aXZlIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyXHJcbiAgICB9XHJcblxyXG4gICAgcGVyc29ubmVsKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3BlcmF0aW5nKCkgeyBcclxuICAgICAgICBpZiAodGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ29wZXJhdGluZyddXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhW05FV19JTklUX0NPTFNbJ29wZXJhdGluZyddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2FwaXRhbCgpIHsgXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydjYXBpdGFsJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1snY2FwaXRhbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHsgXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWydyZXZlbnVlJ11dKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sncmV2ZW51ZSddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG90YWwoKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbTkVXX0lOSVRfQ09MU1sndG90YWwnXV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtORVdfSU5JVF9DT0xTWyd0b3RhbCddXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbml0aWF0aXZlOyIsIi8vIGRhdGEgc3RydWN0dXJlIHRvIHNhdmUgdGhlIHBvc3NpYmxlIHNlcnZpY2Ugb3B0aW9ucyBmb3IgdGhlIGRlcGFydG1lbnRcclxuZXhwb3J0IGNvbnN0IFNlcnZpY2VzID0ge1xyXG4gICAgc2F2ZSA6IGZ1bmN0aW9uKHNlcnZpY2VzKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2VydmljZXMtbGlzdCcsIEpTT04uc3RyaW5naWZ5KHNlcnZpY2VzKSk7XHJcbiAgICB9LFxyXG4gICAgbGlzdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VzLWxpc3QnKSkgfHwge307XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzOyIsIlxyXG5pbXBvcnQgSW5pdGlhdGl2ZSBmcm9tIFwiLi9pbml0aWF0aXZlLmpzXCI7XHJcbmltcG9ydCB7IGNvbFN1bSB9IGZyb20gXCIuLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IHsgTkVXX0lOSVRfQ09MUywgVE9UQUxfQ09MVU1OUyB9IGZyb20gXCIuLi9jb25zdGFudHMvZXhjZWxfY29uc3RhbnRzLmpzXCI7XHJcblxyXG4vLyBkYXRhIHN0cnVjdHVyZSB0byBob2xkIHN1cHBsZW1lbnRhbCByZXF1ZXN0c1xyXG5leHBvcnQgY2xhc3MgU3VwcGxlbWVudGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCduZXctaW5pdHMnKSk7XHJcbiAgICAgICAgdGhpcy5pbml0aWF0aXZlcyA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMudGFibGUpe1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLmZvckVhY2goKHJvdykgPT4geyBcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhdGl2ZXMucHVzaChuZXcgSW5pdGlhdGl2ZShyb3cpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEluaXRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLm1hcCgoaXRlbSkgPT4geyByZXR1cm4gaXRlbVtORVdfSU5JVF9DT0xTWyduYW1lJ11dIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBlcnNvbm5lbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ3BlcnNvbm5lbCddKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVyYXRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbFN1bSh0aGlzLnRhYmxlLCBORVdfSU5JVF9DT0xTWydvcGVyYXRpbmcnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FwaXRhbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ2NhcGl0YWwnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIE5FV19JTklUX0NPTFNbJ3JldmVudWUnXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG90YWwoKXtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIFRPVEFMX0NPTFVNTlNbJ25ldy1pbml0cyddKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1cHBsZW1lbnRhbDsiLCIvLyBtb2RlbHMvaW5kZXguanNcclxuXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3VudFN0cmluZyB9IGZyb20gJy4vYWNjb3VudF9zdHJpbmcuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIEJhc2VsaW5lIH0gZnJvbSAnLi9iYXNlbGluZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VycmVudEZ1bmQgfSBmcm9tICcuL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VycmVudFBhZ2UgfSBmcm9tICcuL2N1cnJlbnRfcGFnZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRnVuZCB9IGZyb20gJy4vZnVuZC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRnVuZExvb2t1cFRhYmxlIH0gZnJvbSAnLi9mdW5kX2xvb2t1cF90YWJsZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5pdGlhdGl2ZSB9IGZyb20gJy4vaW5pdGlhdGl2ZS5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VydmljZXMgfSBmcm9tICcuL3NlcnZpY2VzLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdXBwbGVtZW50YWwgfSBmcm9tICcuL3N1cHBsZW1lbnRhbC5qcyc7XHJcbiIsImltcG9ydCB7IEZJU0NBTF9ZRUFSIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCYXNlbGluZSwgRnVuZExvb2t1cFRhYmxlLCBGdW5kLCBDdXJyZW50RnVuZCB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzXCI7XHJcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi8uLi8uLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQmFzZWxpbmVTZWN0aW9uID0ge1xyXG4gICAgX2RhdGE6IG5ldyBCYXNlbGluZSgpLFxyXG4gICAgX2dlbkZ1bmQgOiBuZXcgRnVuZCgxMDAwKSxcclxuXHJcbiAgICBnZXQgZGF0YSgpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEJhc2VsaW5lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldCBkYXRhKG5ld0RhdGEpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0IGdlbkZ1bmQoKSB7XHJcbiAgICAgICAgdGhpcy5fZ2VuRnVuZCA9IG5ldyBGdW5kKDEwMDApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5GdW5kO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXQgZ2VuRnVuZChuZXdGdW5kKSB7XHJcbiAgICAgICAgdGhpcy5fZ2VuRnVuZCA9IG5ld0Z1bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIHRhcmdldF9odG1sKCkge1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lJyBpZD1cInRhcmdldFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+Rlkke0ZJU0NBTF9ZRUFSfSBHZW5lcmFsIEZ1bmQgYmFzZWxpbmUgdGFyZ2V0Ojwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRcIj4ke2Zvcm1hdEN1cnJlbmN5KEJhc2VsaW5lLnRhcmdldCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJHRi10b3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+Q3VycmVudCBHRiBiYXNlbGluZTo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeSh0aGlzLmdlbkZ1bmQuZ2V0VG90YWwoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJyPmA7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICBmdW5kX2h0bWwoZnVuZCkge1xyXG4gICAgICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIDxoNj4ke0Z1bmRMb29rdXBUYWJsZS5nZXROYW1lKGZ1bmQuZnVuZCl9PC9oNj5cclxuICAgICAgICAgICAgPGhyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSByZXZlbnVlJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPlByb2plY3RlZCByZXZlbnVlczo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFJldmVudWUoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkp1bXAgdG8gcGFnZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIHBlcnNvbm5lbCc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5QZXJzb25uZWwgY29zdDo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFBlcnNvbm5lbENvc3QoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkp1bXAgdG8gcGFnZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIG92ZXJ0aW1lJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPk92ZXJ0aW1lIGNvc3Q6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koZnVuZC5nZXRPdmVydGltZUNvc3QoKSl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZWRpdCBlZGl0LWljb25cIiB0aXRsZT1cIkp1bXAgdG8gcGFnZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NpZGViYXItc3RhdC1saW5lIG5vbnBlcnNvbm5lbCc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ob24tcGVyc29ubmVsIGNvc3Q6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koZnVuZC5nZXROb25QZXJzb25uZWxDb3N0KCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXQgZWRpdC1pY29uXCIgdGl0bGU9XCJKdW1wIHRvIHBhZ2VcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZSBmdW5kLXRvdGFsJz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPlRvdGFsIGV4cGVuZGl0dXJlczo8L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0XCI+JHtmb3JtYXRDdXJyZW5jeShmdW5kLmdldFRvdGFsKCkpfTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxicj5gO1xyXG4gICAgfSxcclxuXHJcbiAgICBsaW5rRWRpdEJ0bnMoKSB7XHJcbiAgICAgICAgbGV0IGJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdC1pY29uJyk7XHJcbiAgICAgICAgYnRucy5mb3JFYWNoKChidG4pID0+IHtcclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5kIGZyb20gdGhlIGRpdiB0aGUgYnV0dG9uIGlzIGluXHJcbiAgICAgICAgICAgIGxldCBmdW5kID0gYnRuLmNsb3Nlc3QoJy5mdW5kLWRpdicpLmlkLnJlcGxhY2UoJ2Z1bmRfJywgJycpO1xyXG4gICAgICAgICAgICBsZXQgcGFnZSA9IGJ0bi5jbG9zZXN0KCcuc2lkZWJhci1zdGF0LWxpbmUnKS5jbGFzc0xpc3RbMV07XHJcbiAgICBcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBDdXJyZW50RnVuZC51cGRhdGUoZnVuZCk7XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UocGFnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGUoKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZWxpbmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFzZWxpbmUtc3RhdHMnKTtcclxuICAgICAgICBiYXNlbGluZURpdi5pbm5lckhUTUwgPSB0aGlzLnRhcmdldF9odG1sKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5mdW5kcy5mb3JFYWNoKChmdW5kKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmdW5kRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGZ1bmREaXYuaWQgPSBgZnVuZF8ke2Z1bmQuZnVuZH1gO1xyXG4gICAgICAgICAgICBmdW5kRGl2LmNsYXNzTGlzdC5hZGQoJ2Z1bmQtZGl2Jyk7XHJcbiAgICAgICAgICAgIGZ1bmREaXYuaW5uZXJIVE1MID0gdGhpcy5mdW5kX2h0bWwoZnVuZCk7XHJcbiAgICAgICAgICAgIGJhc2VsaW5lRGl2LmFwcGVuZENoaWxkKGZ1bmREaXYpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZih0aGlzLmdlbkZ1bmQuZ2V0VG90YWwoKSA8PSBCYXNlbGluZS50YXJnZXQoKSl7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNHRi10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJncmVlblwiO1xyXG4gICAgICAgICAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnVuZF8xMDAwIC5zaWRlYmFyLXN0YXQtbGluZTpsYXN0LW9mLXR5cGUgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwiZ3JlZW5cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjR0YtdG90YWwgLnN0YXQnKS5zdHlsZS5jb2xvciA9IFwicmVkXCI7XHJcbiAgICAgICAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmdW5kXzEwMDAgLnNpZGViYXItc3RhdC1saW5lOmxhc3Qtb2YtdHlwZSAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5rRWRpdEJ0bnMoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQgeyBDdXJyZW50RnVuZCwgQ3VycmVudFBhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBBcnJvdyA9IHtcclxuICAgIGh0bWwgOiBgPGRpdiBjbGFzcz0nYXJyb3cnIGlkPSdtZW51LWFycm93Jz48L2Rpdj5gLFxyXG4gICAgY3VycmVudExpbmUoKSB7XHJcbiAgICAgICAgbGV0IHBhZ2UgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICAgICAgbGV0IGxpbmU7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT0gJ25ldy1pbml0cycpe1xyXG4gICAgICAgICAgICBsaW5lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1cHAtZXhwZW5zZXMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZnVuZCA9IEN1cnJlbnRGdW5kLm51bWJlcigpO1xyXG4gICAgICAgICAgICBsaW5lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI2Z1bmRfJHtmdW5kfSAuc2lkZWJhci1zdGF0LWxpbmUuJHtwYWdlfWApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9LFxyXG4gICAgbWFyaygpIHtcclxuICAgICAgICBsZXQgbGluZSA9IHRoaXMuY3VycmVudExpbmUoKTtcclxuICAgICAgICBjb25zdCBhcnJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGFycm93LmlubmVySFRNTCA9IHRoaXMuaHRtbDtcclxuICAgICAgICBsaW5lLmFwcGVuZENoaWxkKGFycm93KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFN1cHBsZW1lbnRhbCB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzXCI7XHJcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi8uLi8uLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgU3VwcFNlY3Rpb24gPSB7XHJcbiAgICBodG1sKCkge1xyXG4gICAgICAgIHZhciBzdXBwID0gbmV3IFN1cHBsZW1lbnRhbDtcclxuICAgICAgICByZXR1cm4gYFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdzaWRlYmFyLXN0YXQtbGluZScgaWQ9XCJzdXBwLWV4cGVuc2VzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXQtbGFiZWxcIj5Ub3RhbCBleHBlbmRpdHVyZXM6PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdFwiPiR7Zm9ybWF0Q3VycmVuY3koc3VwcC50b3RhbCgpKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lZGl0IGVkaXQtc3VwcFwiIHRpdGxlPVwiSnVtcCB0byBwYWdlXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICB9LFxyXG5cclxuICAgIGxpbmtFZGl0QnRucygpIHtcclxuICAgICAgICBsZXQgYnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lZGl0LXN1cHAnKTtcclxuICAgICAgICBidG5zLmZvckVhY2goKGJ0bikgPT4ge1xyXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZpc2l0UGFnZSgnbmV3LWluaXRzJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGUoKSB7XHJcbiAgICAgICAgY29uc3Qgc3VwcERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdXBwLXN0YXRzJyk7XHJcbiAgICAgICAgc3VwcERpdi5pbm5lckhUTUwgPSB0aGlzLmh0bWwoKTtcclxuICAgICAgICB0aGlzLmxpbmtFZGl0QnRucygpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdXBwU2VjdGlvbjsiLCJpbXBvcnQgeyB2aXNpdFBhZ2UgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3X2xvZ2ljJztcclxuaW1wb3J0ICcuL3NpZGViYXIuY3NzJ1xyXG5pbXBvcnQgeyBCYXNlbGluZVNlY3Rpb24gfSBmcm9tICcuL3N1YmNvbXBvbmVudHMvYmFzZWxpbmVfc2VjdGlvbic7XHJcbmltcG9ydCB7IEFycm93IH0gZnJvbSAnLi9zdWJjb21wb25lbnRzL2Fycm93JztcclxuXHJcbmltcG9ydCBTdXBwU2VjdGlvbiBmcm9tICcuL3N1YmNvbXBvbmVudHMvc3VwcF9zZWN0aW9uJ1xyXG5cclxuLy8gZmV0Y2ggQ1NTIHZhcmlhYmxlcyBzYXZlZCBpbiA6cm9vdFxyXG5jb25zdCByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5jb25zdCBzaWRlQmFyV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tc2lkZWJhci13aWR0aCcpLnRyaW0oKTtcclxuXHJcbmZ1bmN0aW9uIGhpZGVTaWRlYmFyKCkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tcGFuZWwnKS5zdHlsZS53aWR0aCA9ICcxMDAlJzsgXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5zdHlsZS53aWR0aCA9ICcxMDAlJ1xyXG5cclxuICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcclxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LWJ0bi1zaWRlYmFyJyk7XHJcbiAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB2aXNpdFN1bW1hcnkpO1xyXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlc2l6ZSBjb250ZW50IGlmIHdpbmRvdyBpcyBhZGp1c3RlZFxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHNob3dTaWRlYmFyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1NpZGViYXIoKSB7XHJcbiAgICBjb25zdCBzaWRlYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKTtcclxuICAgIGNvbnN0IG1haW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJyk7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKTtcclxuXHJcbiAgICAvLyB1cGRhdGUgdmFsdWVzXHJcbiAgICB1cGRhdGVUb3RhbHMoKTtcclxuICAgIHNpZGViYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IC8vIFNob3cgdGhlIHNpZGViYXJcclxuICAgIFxyXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZW1haW5pbmcgd2lkdGggZm9yIHRoZSBtYWluIHBhbmVsIGFuZCBoZWFkZXJcclxuICAgIHZhciBjb250ZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICBtYWluUGFuZWwuc3R5bGUud2lkdGggPSBgJHtjb250ZW50V2lkdGggLSBwYXJzZUludChzaWRlQmFyV2lkdGgsIDEwKX1weGA7IFxyXG4gICAgaGVhZGVyLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcclxuXHJcbiAgICAvLyBlbmFibGUgc3VtbWFyeSBidXR0b25cclxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdW1tYXJ5LWJ0bi1zaWRlYmFyJyk7XHJcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB2aXNpdFN1bW1hcnkpO1xyXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlc2l6ZSBjb250ZW50IGlmIHdpbmRvdyBpcyBhZGp1c3RlZFxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHNob3dTaWRlYmFyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclRpdGxlKG5ld190aXRsZSl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci10aXRsZScpLnRleHRDb250ZW50ID0gbmV3X3RpdGxlO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVUb3RhbHMoKXtcclxuICAgIC8vIGdldCBjdXJyZW50IHZhbHVlXHJcbiAgICBsZXQgdmFsdWU7XHJcbiAgICBpZiAoQXJyb3cuY3VycmVudExpbmUoKSkgeyBcclxuICAgICAgICB2YWx1ZSA9IEFycm93LmN1cnJlbnRMaW5lKCkucXVlcnlTZWxlY3RvcihgLnN0YXRgKS50ZXh0Q29udGVudDtcclxuICAgIH07XHJcbiAgICAvLyB1cGRhdGUgdmFsdWVzIGluIHNpZGViYXJcclxuICAgIFN1cHBTZWN0aW9uLnVwZGF0ZSgpO1xyXG4gICAgQmFzZWxpbmVTZWN0aW9uLnVwZGF0ZSgpO1xyXG4gICAgLy8gbWFyayBjdXJyZW50IHBhZ2Ugd2l0aCBncmVlbiBhcnJvd1xyXG4gICAgQXJyb3cubWFyaygpO1xyXG4gICAgLy9pZiB2YWx1ZSBjaGFuZ2VkLCBoaWdobGlnaHQgaXRcclxuICAgIGlmICh2YWx1ZSAhPSBBcnJvdy5jdXJyZW50TGluZSgpLnF1ZXJ5U2VsZWN0b3IoYC5zdGF0YCkudGV4dENvbnRlbnQpeyAgICBcclxuICAgICAgICBpbmRpY2F0ZUNoYW5nZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNldEFsbCgpe1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAvLyByZXNldCBhbGwgc3RhdHMgdG8gMFxyXG4gICAgdXBkYXRlVG90YWxzKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZpc2l0U3VtbWFyeSgpIHsgdmlzaXRQYWdlKCdzdW1tYXJ5JykgfVxyXG5cclxuZnVuY3Rpb24gaW5kaWNhdGVDaGFuZ2UoKSB7XHJcbiAgICAvLyBnZXQgdGhlIHJpZ2h0IGNvbG9yIGZyb20gdGhlIHJvb3QoKSBkZWZpbmVkIGluIGNvbW1vbi5jc3NcclxuICAgIGNvbnN0IHJvb3RTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IHBhbGVncmVlbiA9IHJvb3RTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBhbGVncmVlbicpLnRyaW0oKTtcclxuICAgIC8vIGlkZW50aWZ5IGNoYW5nZWQgcm93cyA9IGN1cnJlbnQgcGFnZSBhbmQgdG90YWxcclxuICAgIGxldCBjaGFuZ2VkUm93ID0gQXJyb3cuY3VycmVudExpbmUoKTtcclxuICAgIGxldCB0b3RhbFJvdyA9IEFycm93LmN1cnJlbnRMaW5lKCkucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZnVuZC10b3RhbCcpO1xyXG4gICAgLy8gbWFrZSBhbnkgZWRpdGVkIHJvd3MgZ3JlZW5cclxuICAgIGNoYW5nZWRSb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFsZWdyZWVuO1xyXG4gICAgaWYodG90YWxSb3cpIHsgdG90YWxSb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFsZWdyZWVuIH07XHJcbiAgICAvLyBGYWRlIGJhY2sgdG8gZGVmYXVsdCBhZnRlciAwLjc1IHNlY29uZHNcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNoYW5nZWRSb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7XHJcbiAgICAgICAgaWYodG90YWxSb3cpIHsgdG90YWxSb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJycgfTtcclxuICAgIH0sIDc1MCk7XHJcbn1cclxuXHJcbmNvbnN0IFNpZGViYXIgPSB7XHJcbiAgICBTdXBwU2VjdGlvbiA6IFN1cHBTZWN0aW9uLFxyXG4gICAgQmFzZWxpbmVTZWN0aW9uIDogQmFzZWxpbmVTZWN0aW9uLFxyXG4gICAgQXJyb3cgOiBBcnJvdyxcclxuICAgIGhpZGU6IGhpZGVTaWRlYmFyLFxyXG4gICAgc2hvdzogc2hvd1NpZGViYXIsXHJcbiAgICB1cGRhdGVUaXRsZTogdXBkYXRlU2lkZWJhclRpdGxlLFxyXG4gICAgdXBkYXRlVG90YWxzOiB1cGRhdGVUb3RhbHMsXHJcbiAgICByZXNldDogcmVzZXRBbGwsXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWRlYmFyOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9uYXZfYnV0dG9ucy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9uYXZfYnV0dG9ucy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBuYXZfYnV0dG9ucy5qc1xyXG5pbXBvcnQgJy4vbmF2X2J1dHRvbnMuY3NzJztcclxuaW1wb3J0IHsgbmV4dFBhZ2UsIGxhc3RQYWdlLCB2aXNpdFBhZ2UsIGxhc3RQYWdlTGFiZWwsIG5leHRQYWdlTGFiZWwgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3X2xvZ2ljLmpzJztcclxuXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVOYXZCdXR0b25zKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBsYXN0IGJ1dHRvblxyXG4gICAgY29uc3QgbGFzdF9idG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLWxhc3QnKTtcclxuICAgIGxhc3RfYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGFzdFBhZ2UpOyBcclxuICAgIC8vIGluaXRpYWxpemUgbmV4dCBidXR0b25cclxuICAgIGNvbnN0IG5leHRfYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1uZXh0Jyk7XHJcbiAgICBuZXh0X2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG5leHRQYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGlzYWJsZShidXR0b25faWQpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCk7XHJcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcclxuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7IC8vIEFsc28gZGlzYWJsZSBpdCBhdCB0aGUgRE9NIGxldmVsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuYWJsZShidXR0b25faWQpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCk7XHJcbiAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcclxuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOyAvLyBFbmFibGUgaXQgYXQgdGhlIERPTSBsZXZlbFxyXG59XHJcblxyXG5jb25zdCBOZXh0ID0ge1xyXG4gICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7IGRpc2FibGUoJ2J0bi1uZXh0Jyk7IH0sXHJcbiAgICBlbmFibGU6IGZ1bmN0aW9uKCkgeyBlbmFibGUoJ2J0bi1uZXh0Jyk7IH0sXHJcbiAgICBhZGRBY3Rpb246IGZ1bmN0aW9uKGZuKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI2J0bi1uZXh0YCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmbik7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlQWN0aW9uOiBmdW5jdGlvbihmbikge1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNidG4tbmV4dGApLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZm4pO1xyXG4gICAgfSxcclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI2J0bi1uZXh0YCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH0sXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYnRuLW5leHRgKTtcclxuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBgQ29udGludWUgdG8gJHtuZXh0UGFnZUxhYmVsKCl9ID4+YDtcclxuICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgTGFzdCA9IHtcclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbGFzdCcpOyB9LFxyXG4gICAgZW5hYmxlOiBmdW5jdGlvbigpIHsgZW5hYmxlKCdidG4tbGFzdCcpOyB9LFxyXG4gICAgaGlkZSgpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYnRuLWxhc3RgKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfSxcclxuICAgIHNob3coKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNidG4tbGFzdGApO1xyXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IGA8PCBSZXR1cm4gdG8gJHtsYXN0UGFnZUxhYmVsKCl9YDtcclxuICAgICAgICBidG4uc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gdmlzaXRTdW1tYXJ5UGFnZSgpIHsgdmlzaXRQYWdlKCdzdW1tYXJ5JykgfVxyXG5cclxuY29uc3QgUmV0dXJuVG9TdW1tYXJ5ID0ge1xyXG4gICAgc2hvdzogZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm4tdG8tc3VtbWFyeScpXHJcbiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB2aXNpdFN1bW1hcnlQYWdlKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV0dXJuLXRvLXN1bW1hcnknKVxyXG4gICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIGJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHZpc2l0U3VtbWFyeVBhZ2UpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE5hdkJ1dHRvbnMgPSB7XHJcbiAgICBoaWRlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBOZXh0LmhpZGUoKTtcclxuICAgICAgICBMYXN0LmhpZGUoKTtcclxuICAgIH0sXHJcbiAgICBzaG93OiBmdW5jdGlvbigpIHtcclxuICAgICAgICBOZXh0LnNob3coKTtcclxuICAgICAgICBMYXN0LnNob3coKTs7XHJcbiAgICAgICAgaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKTtcclxuICAgIH0sXHJcbiAgICBOZXh0OiBOZXh0LFxyXG4gICAgTGFzdDogTGFzdCxcclxuICAgIFJldHVyblRvU3VtbWFyeTogUmV0dXJuVG9TdW1tYXJ5XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOYXZCdXR0b25zOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ib2R5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2JvZHkuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjY29yZGlvbi5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY2NvcmRpb24uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RhYmxlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RhYmxlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImZ1bmN0aW9uIGFkZFRhYmxlSGVhZGVycyhjb2xzKXtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGhlYWRlciByb3cgZWxlbWVudFxyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuXHJcbiAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAvLyBDcmVhdGUgYSBoZWFkZXIgY2VsbCBlbGVtZW50XHJcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgICAgaGVhZGVyQ2VsbC50ZXh0Q29udGVudCA9IGNvbFsndGl0bGUnXTtcclxuICAgICAgICBoZWFkZXJDZWxsLmNsYXNzTGlzdC5hZGQoY29sWydjbGFzc05hbWUnXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgY2VsbCB0byB0aGUgaGVhZGVyIHJvd1xyXG4gICAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXJDZWxsKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgaGVhZGVyIHJvdyB0byB0aGUgdGFibGUgaGVhZGVyXHJcbiAgICBsZXQgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgdGhlYWQuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcclxufVxyXG5cclxuY29uc3QgSGVhZGVyID0ge1xyXG4gICAgYWRkOiBmdW5jdGlvbihoZWFkZXJfYXJyYXkpe1xyXG4gICAgICAgIGFkZFRhYmxlSGVhZGVycyhoZWFkZXJfYXJyYXkpXHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIZWFkZXI7IiwiaW1wb3J0IEhlYWRlciBmcm9tIFwiLi9oZWFkZXJzLmpzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL3RhYmxlLmpzXCI7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5LCBjb2x1bW5zID0gW10pe1xyXG4gICAgXHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBsZXQgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSB0YWJsZSBpZiBpdCdzIG5vdCB0aGVyZVxyXG4gICAgaWYgKCF0YWJsZSl7XHJcbiAgICAgICAgYXdhaXQgVGFibGUuc2hvdygpO1xyXG4gICAgICAgIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBpZiBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBhZGRlZFxyXG4gICAgbGV0IGhlYWRlcl9yb3cgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cicpO1xyXG4gICAgaWYgKCFoZWFkZXJfcm93KSB7XHJcbiAgICAgICAgSGVhZGVyLmFkZChjb2x1bW5zKTtcclxuICAgICAgICBoZWFkZXJfcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQgdHInKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpbml0aWFsaXplIG5ldyByb3cgb2YgZGF0YVxyXG4gICAgY29uc3QgbmV3X3JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XHJcblxyXG4gICAgLy8gZ28gdGhyb3VnaCBlYWNoIGhlYWRlciBhbmQgYWRkIHRoZSByaWdodCBjZWxsIHZhbHVlIGRlcGVuZGluZyBvbiBpdHMgY2xhc3NcclxuICAgIGxldCB0aEVsZW1lbnRzID0gaGVhZGVyX3Jvdy5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpO1xyXG4gICAgdGhFbGVtZW50cy5mb3JFYWNoKCAoaGVhZGVyX2NlbGwpID0+IHtcclxuICAgICAgICAvLyBDcmVhdGUgbmV3IGNlbGwgYW5kIGFkZCBpdCB0byB0aGUgcm93XHJcbiAgICAgICAgY29uc3QgbmV3Q2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XHJcbiAgICAgICAgbmV3X3Jvdy5hcHBlbmRDaGlsZChuZXdDZWxsKTtcclxuICAgICAgICAvLyBpZiB0aGUgZGF0YSBoYXMgYW4gYXBwcm9wcmlhdGUgY2xhc3MsIGFkZCB0aGUgaW5mbyB0byB0aGUgY2VsbC4gXHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBrZWVwIGVtcHR5IGNlbGxcclxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhX2RpY3Rpb25hcnkpLmZvckVhY2goIChjbGFzc05hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGhlYWRlcl9jZWxsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICl7XHJcbiAgICAgICAgICAgICAgICBuZXdDZWxsLnRleHRDb250ZW50ID0gZGF0YV9kaWN0aW9uYXJ5W2NsYXNzTmFtZV07XHJcbiAgICAgICAgICAgICAgICBuZXdDZWxsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBuZXcgcm93IHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlIGJvZHlcclxuICAgIGxldCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcbiAgICBpZiAodGJvZHkuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgIHRib2R5Lmluc2VydEJlZm9yZShuZXdfcm93LCB0Ym9keS5maXJzdENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQobmV3X3Jvdyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhdmVSb3dFZGl0cyhyb3cpe1xyXG4gICAgdmFyIGNlbGxzID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJylcclxuICAgIGNlbGxzLmZvckVhY2goIGNlbGwgPT4ge1xyXG4gICAgICAgIC8vIHNhdmUgZHJvcGRvd24gdmFsdWVzXHJcbiAgICAgICAgaWYgKGNlbGwucXVlcnlTZWxlY3Rvcignc2VsZWN0Jykpe1xyXG4gICAgICAgICAgICB2YXIgc2VydmljZVNlbGVjdG9yID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcclxuICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IHNlcnZpY2VTZWxlY3Rvci52YWx1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNlbGwucXVlcnlTZWxlY3RvcignaW5wdXQnKSkge1xyXG4gICAgICAgICAgICAvLyBzYXZlIG5ldyBlbnRlcmVkIHZhbHVlIGluIHRleHRib3hcclxuICAgICAgICAgICAgdmFyIHRleHRib3ggPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIHZhciBlbnRlcmVkVmFsdWUgPSB0ZXh0Ym94LnZhbHVlO1xyXG4gICAgICAgICAgICAvLyB1cGRhdGUgZGlzcGxheSBhbmQgZm9ybWF0IHdpdGggY3VycmVuY3kgaWYgcmVsZXZhbnRcclxuICAgICAgICAgICAgaWYgKCBjZWxsLmNsYXNzTGlzdC5jb250YWlucygnY29zdCcpICl7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiBjb3N0LCByZW1vdmUgY29tbWFzIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBlbnRlcmVkVmFsdWUgPSBlbnRlcmVkVmFsdWUucmVwbGFjZUFsbCgnLCcsICcnKTtcclxuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeShlbnRlcmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgbmV3IHVzZXIgaW5wdXRcclxuICAgICAgICAgICAgICAgIGNlbGwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGVudGVyZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZW50ZXJlZFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjZWxsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykpe1xyXG4gICAgICAgICAgICAvLyBzYXZlIG5ldyBlbnRlcmVkIHZhbHVlIGluIHRleHRib3hcclxuICAgICAgICAgICAgdmFyIGVudGVyZWRWYWx1ZSA9IGNlbGwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKS52YWx1ZTtcclxuICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGVudGVyZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBtYXJrTmV3Um93KCl7XHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEIGFuZCBmZXRjaCBmaXJzdCByb3dcclxuICAgIGxldCBmaXJzdF9yb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi10YWJsZSB0Ym9keScpLmZpcnN0Q2hpbGQ7XHJcbiAgICAvLyBnZXQgdGhlIHJpZ2h0IGNvbG9yIGZyb20gdGhlIHJvb3QoKSBkZWZpbmVkIGluIGNvbW1vbi5jc3NcclxuICAgIGNvbnN0IHJvb3RTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IHBhbGVncmVlbiA9IHJvb3RTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBhbGVncmVlbicpLnRyaW0oKTtcclxuICAgIC8vIG1ha2UgZmlyc3Qgcm93ICh3aXRoIG5ldyByb3cpIGdyZWVuXHJcbiAgICBmaXJzdF9yb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFsZWdyZWVuO1xyXG4gICAgLy8gRmFkZSBiYWNrIHRvIGRlZmF1bHQgYWZ0ZXIgMC43NSBzZWNvbmRzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBmaXJzdF9yb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7XHJcbiAgICB9LCA3NTApO1xyXG59XHJcblxyXG5jb25zdCBSb3dzID0ge1xyXG4gICAgYWRkIDogYXN5bmMgZnVuY3Rpb24oZGF0YV9kaWN0aW9uYXJ5LCBjb2xzKXtcclxuICAgICAgICBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5LCBjb2xzKTtcclxuICAgIH0sXHJcbiAgICBzYXZlRWRpdHMgOiBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgIHNhdmVSb3dFZGl0cyhyb3cpO1xyXG4gICAgfSxcclxuICAgIG1hcmtOZXdSb3cgOiBtYXJrTmV3Um93XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJvd3M7IiwiaW1wb3J0IFJvd3MgZnJvbSAnLi9yb3dzLmpzJ1xyXG5cclxuZnVuY3Rpb24gaGlkZUJ1dHRvbihjbGFzc05hbWUpe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93QnV0dG9uKGNsYXNzTmFtZSl7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbnNbaV0uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlQnV0dG9uVGV4dChjbGFzc05hbWUsIHRleHQpe1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApLnRleHRDb250ZW50ID0gdGV4dDtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUm93RWRpdChhY3Rpb25PbkNsaWNrLCB1cGRhdGVDYWxsYmFjayA9IG51bGwpe1xyXG4gICAgLy8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGVhY2ggZWRpdCBidXR0b24gaW4gZXZlcnkgcm93XHJcbiAgICB2YXIgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdidG4tZWRpdCcpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGl0QnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGVkaXRCdXR0b25zW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2FzIGNsaWNrZWQgb24gd2l0aGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgICB2YXIgcm93VG9FZGl0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XHJcbiAgICAgICAgICAgIC8vIG1hcmsgcm93IGFzIGJlaW5nIGVkaXRlZFxyXG4gICAgICAgICAgICByb3dUb0VkaXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLWVkaXRpbmcnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHR1cm4gcmVsZXZhbnQgZW50cmllcyBpbnRvIHRleHRib3hlcywgdXN1YWxseVxyXG4gICAgICAgICAgICBhY3Rpb25PbkNsaWNrKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBoaWRlIGVkaXQgYnV0dG9uc1xyXG4gICAgICAgICAgICBFZGl0LmhpZGUoKTtcclxuICAgICAgICAgICAgaWYodXBkYXRlQ2FsbGJhY2spe1xyXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbmZpcm1CdXR0b24odXBkYXRlQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayl7XHJcbiAgICAvLyBnZXQgZWxlbWVudCBhbmQgYWRkIGxpc3RlbmVyIGZvciBjbGlja1xyXG4gICAgdmFyIHJvd1RvRWRpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtZWRpdGluZycpO1xyXG4gICAgY29uc3QgY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcclxuXHJcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gcHJldmVudCBtdWx0aXBsZS1ldmVudCBhZGRpdGlvbnNcclxuICAgIGNvbmZpcm1fYnRuLnJlcGxhY2VXaXRoKGNvbmZpcm1fYnRuLmNsb25lTm9kZSh0cnVlKSk7XHJcbiAgICBjb25zdCBuZXdfY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcclxuXHJcbiAgICAvLyBzaG93IHRoZSByb3cncyBjb25maXJtIGJ1dHRvblxyXG4gICAgbmV3X2NvbmZpcm1fYnRuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgbmV3X2NvbmZpcm1fYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXs7XHJcbiAgICAgICAgLy8gc2F2ZSByb3cgZWRpdHNcclxuICAgICAgICBSb3dzLnNhdmVFZGl0cyhyb3dUb0VkaXQpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXMgaW4gc2lkZWJhclxyXG4gICAgICAgIHVwZGF0ZUNhbGxiYWNrKCk7XHJcbiAgICAgICAgLy8gbWFrZSByb3cgbm8gbG9uZ2VyIGdyZWVuXHJcbiAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1lZGl0aW5nJyk7XHJcbiAgICAgICAgLy8gc2hvdyBlZGl0IGJ1dHRvbnMgYW5kIGhpZGUgY29uZmlybSBidXR0b25zXHJcbiAgICAgICAgRWRpdC5zaG93KCk7XHJcbiAgICAgICAgQ29uZmlybS5oaWRlKCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgRWRpdCA9IHtcclxuICAgIGh0bWwodGV4dCA9ICdFZGl0IHJvdycpeyByZXR1cm4gYDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWVkaXRcIj4ke3RleHR9PC9idXR0b24+YH0sXHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tZWRpdCcpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWVkaXQnKSxcclxuICAgIGluaXQgOiBmdW5jdGlvbihhY3Rpb25PbkNsaWNrLCB1cGRhdGVDYWxsYmFjayl7XHJcbiAgICAgICAgaGFuZGxlUm93RWRpdChhY3Rpb25PbkNsaWNrLCB1cGRhdGVDYWxsYmFjaylcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IENvbmZpcm0gPSB7XHJcbiAgICBodG1sKCkge3JldHVybiBgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tY29uZmlybVwiPkNvbmZpcm08L2J1dHRvbj5gfSxcclxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1jb25maXJtJyksXHJcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tY29uZmlybScpXHJcbn07XHJcblxyXG5jb25zdCBBZGRSb3cgPSB7XHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tYWRkJyksXHJcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tYWRkJyksXHJcbiAgICB1cGRhdGVUZXh0OiBmdW5jdGlvbih0ZXh0KXtcclxuICAgICAgICB1cGRhdGVCdXR0b25UZXh0KCdidG4tYWRkJywgdGV4dCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgQnV0dG9ucyA9IHtcclxuICAgIEVkaXQgOiBFZGl0LFxyXG4gICAgQ29uZmlybSA6IENvbmZpcm0sXHJcbiAgICBBZGRSb3cgOiBBZGRSb3csXHJcbiAgICBlZGl0X2NvbmZpcm1fYnRucyA6IEVkaXQuaHRtbCgpICsgQ29uZmlybS5odG1sKCkgLFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXR0b25zOyIsImZ1bmN0aW9uIGNyZWF0ZURyb3Bkb3duKGRhdGFBcnJheSkge1xyXG5cclxuICAvLyBDcmVhdGluZyBhIHNlbGVjdCBlbGVtZW50XHJcbiAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xyXG5cclxuICAvLyBhZGQgYSBkZWZhdWx0IGJsYW5rIG9wdGlvbiB0byB0aGUgZGF0YUFycmF5XHJcbiAgZGF0YUFycmF5ID0gWycnXS5jb25jYXQoZGF0YUFycmF5KTtcclxuXHJcbiAgLy8gTG9vcGluZyB0aHJvdWdoIHRoZSBhcnJheSBhbmQgY3JlYXRpbmcgYW4gb3B0aW9uIGZvciBlYWNoIGVsZW1lbnRcclxuICBkYXRhQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcclxuICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBpdGVtO1xyXG4gICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGl0ZW07XHJcbiAgICBzZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpOyAvLyBBcHBlbmRpbmcgdGhlIG9wdGlvbiB0byB0aGUgc2VsZWN0XHJcbiAgfSk7XHJcblxyXG4gIC8vIFJldHVybiB0aGUgc2VsZWN0IGVsZW1lbnQgc28gaXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudFxyXG4gIHJldHVybiBzZWxlY3RFbGVtZW50O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IERyb3Bkb3duID0ge1xyXG4gICAgY3JlYXRlIDogZnVuY3Rpb24oZGF0YUFycmF5KSB7IHJldHVybiBjcmVhdGVEcm9wZG93bihkYXRhQXJyYXkpIH0sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duOyIsImltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBkaXNwbGF5V2l0aENvbW1hcyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuLi8uLi8uLi9tb2RlbHMvc2VydmljZXMuanNcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuLi8uLi9mb3JtL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcclxuXHJcbi8vIHJldHVybiBjZWxsIHZhbHVlIGF0dHJpYnV0ZSBvciAwIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbmZ1bmN0aW9uIGdldENlbGxWYWx1ZShyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xyXG4gICAgdmFyIGNlbGxWYWx1ZSA9IGNlbGwgPyBjZWxsLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGw7XHJcbiAgICByZXR1cm4gY2VsbFZhbHVlID8gcGFyc2VGbG9hdChjZWxsVmFsdWUpIDogMDtcclxufVxyXG5cclxuLy8gcmV0dXJuIHRleHQgaW4gY2VsbFxyXG5mdW5jdGlvbiBnZXRDZWxsVGV4dChyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xyXG4gICAgaWYgKGNlbGwpIHtcclxuICAgICAgICByZXR1cm4gY2VsbC50ZXh0Q29udGVudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgRXJyb3IgcmV0cmlldmluZyBjZWxsIHRleHQgZm9yIGNsYXNzICR7Y2xhc3NOYW1lfWApO1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlVGFibGVDZWxsKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpe1xyXG4gICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjb2xfY2xhc3N9YCk7XHJcbiAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBuZXdfdmFsdWUpO1xyXG4gICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KG5ld192YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVkaXRhYmxlQ2VsbChjZWxsQ2xhc3MsIGlzQ29zdCwgdHlwZSA9ICdpbnB1dCcpe1xyXG4gICAgLy8gZ2V0IGNlbGxcclxuICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuYWN0aXZlLWVkaXRpbmcgdGQuJHtjZWxsQ2xhc3N9YCk7XHJcbiAgICAvLyBDcmVhdGUgYW4gaW5wdXQgZWxlbWVudCB0byBlZGl0IHRoZSB2YWx1ZVxyXG4gICAgdmFyIHRleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xyXG4gICAgaWYgKHR5cGUgPT0gJ2lucHV0Jyl7XHJcbiAgICAgICAgdGV4dGJveC50eXBlID0gJ3RleHQnO1xyXG4gICAgfTtcclxuICAgIGlmIChpc0Nvc3Qpe1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IGNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xyXG4gICAgICAgIHRleHRib3gudmFsdWUgPSBkaXNwbGF5V2l0aENvbW1hcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRleHRib3gudmFsdWUgPSBjZWxsLnRleHRDb250ZW50O1xyXG4gICAgfVxyXG4gICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgY29udGVudCBhbmQgYXBwZW5kIHRoZSB0ZXh0Ym94IHRvIHRoZSBjZWxsXHJcbiAgICBjZWxsLmlubmVySFRNTCA9ICcnO1xyXG4gICAgY2VsbC5hcHBlbmRDaGlsZCh0ZXh0Ym94KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRHJvcGRvd24oY2VsbENsYXNzLCBvcHRpb25BcnJheSl7XHJcbiAgICAvLyBnZXQgY2VsbFxyXG4gICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZyB0ZC4ke2NlbGxDbGFzc31gKTtcclxuICAgIC8vIGFkZCBzZXJ2aWNlIGRyb3Bkb3duXHJcbiAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duLmNyZWF0ZShvcHRpb25BcnJheSk7XHJcbiAgICBkcm9wZG93bi52YWx1ZSA9IGNlbGwudGV4dENvbnRlbnQ7XHJcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcclxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBjZWxsLmFwcGVuZENoaWxkKGRyb3Bkb3duKTtcclxufVxyXG5cclxuY29uc3QgQ2VsbCA9IHtcclxuICAgIGdldFZhbHVlOiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBnZXRDZWxsVmFsdWUocm93LCBjbGFzc05hbWUpOyBcclxuICAgIH0sXHJcbiAgICBnZXRUZXh0OiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBnZXRDZWxsVGV4dChyb3csIGNsYXNzTmFtZSk7IFxyXG4gICAgfSxcclxuICAgIHVwZGF0ZVZhbHVlOiBmdW5jdGlvbihyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKSB7XHJcbiAgICAgICAgdXBkYXRlVGFibGVDZWxsKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpOyBcclxuICAgIH0sXHJcbiAgICBjcmVhdGVUZXh0Ym94IDogZnVuY3Rpb24oY2xhc3NOYW1lLCBpc0Nvc3QsIHR5cGUpIHtcclxuICAgICAgICBjcmVhdGVFZGl0YWJsZUNlbGwoY2xhc3NOYW1lLCBpc0Nvc3QsIHR5cGUpXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlU2VydmljZURyb3Bkb3duIDogICgpID0+IHsgY3JlYXRlRHJvcGRvd24oJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCkpIH0sXHJcbiAgICBjcmVhdGVEcm9wZG93biA6IGNyZWF0ZURyb3Bkb3duXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDZWxsOyIsImltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5cclxuLy8gcG9zaXRpb24gaXMgaW5kZXggYXQgd2hpY2ggbmV3IGNvbHVtbiB3aWxsIGJlIGluc2VydGVkXHJcbmZ1bmN0aW9uIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQgPSAnJywgaGVhZGVyVGl0bGUgPSAnJykge1xyXG4gICAgLy8gR2V0IHRoZSB0YWJsZSBlbGVtZW50IGJ5IGl0cyBJRFxyXG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuXHJcbiAgICAvLyBWYWxpZGF0ZSBwb3NpdGlvblxyXG4gICAgbGV0IG1heFBvc2l0aW9uID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XHJcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gbWF4UG9zaXRpb24pIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgUG9zaXRpb24gJHtwb3NpdGlvbn0gaXMgb3V0IG9mIGJvdW5kcy5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gSW5zZXJ0IHRoZSBoZWFkZXIgaWYgcHJvdmlkZWRcclxuICAgIGxldCB0aGVhZCA9IHRhYmxlLnRIZWFkO1xyXG4gICAgaWYgKGhlYWRlclRpdGxlICYmIHRoZWFkKSB7XHJcbiAgICAgIGxldCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgIHRoLmlubmVySFRNTCA9IGhlYWRlclRpdGxlOyAvLyBVc2UgaW5uZXJIVE1MIHRvIGluc2VydCBIVE1MIGNvbnRlbnRcclxuICAgICAgdGhlYWQucm93c1swXS5pbnNlcnRCZWZvcmUodGgsIHRoZWFkLnJvd3NbMF0uY2VsbHNbcG9zaXRpb25dKTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIEluc2VydCBuZXcgY2VsbHMgaW50byBlYWNoIHJvdyBvZiB0aGUgdGFibGUgYm9keVxyXG4gICAgbGV0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcclxuICAgIGlmICh0Ym9keSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRib2R5LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcm93ID0gdGJvZHkucm93c1tpXTtcclxuICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgIHRkLmlubmVySFRNTCA9IGh0bWxDb250ZW50OyAvLyBVc2UgaW5uZXJIVE1MIHRvIGluc2VydCBIVE1MIGNvbnRlbnRcclxuICAgICAgICByb3cuaW5zZXJ0QmVmb3JlKHRkLCByb3cuY2VsbHNbcG9zaXRpb25dKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBuY29scygpe1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJvdyBleGlzdHMgYmVmb3JlIGNvdW50aW5nIHRoZSBjb2x1bW5zXHJcbiAgICByZXR1cm4gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XHJcbn1cclxuICBcclxuZnVuY3Rpb24gYWRkQ29sVG9FbmQoaHRtbENvbnRlbnRzID0gW10sIGhlYWRlclRpdGxlID0gJycpe1xyXG4gICAgLy8gY291bnQgY29sdW1ucyBhbmQgYWRkIG5ldyBjb2x1bW4gdG8gdGhlIGVuZFxyXG4gICAgY29uc3QgcG9zaXRpb24gPSBuY29scygnbWFpbi10YWJsZScpO1xyXG4gICAgYWRkQ29sKHBvc2l0aW9uLCBodG1sQ29udGVudHMsIGhlYWRlclRpdGxlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXNzaWduQ2xhc3NUb0NvbHVtbihoZWFkZXJOYW1lLCBjbGFzc05hbWUpIHtcclxuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcclxuICAgIGxldCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcblxyXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBieSBpdHMgaGVhZGVyIG5hbWVcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUudEhlYWQ7XHJcbiAgICBsZXQgaGVhZGVyQ2VsbEluZGV4ID0gLTE7XHJcbiAgICBjb25zdCBoZWFkZXJDZWxscyA9IHRoZWFkLnJvd3NbMF0uY2VsbHM7IC8vIEFzc3VtaW5nIHRoZSBmaXJzdCByb3cgY29udGFpbnMgaGVhZGVyIGNlbGxzICg8dGg+KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJDZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChoZWFkZXJDZWxsc1tpXS50ZXh0Q29udGVudC50cmltKCkgPT09IGhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSBjbGFzcyB0byB0aGUgaGVhZGVyIGNlbGxcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbHNbaV0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsSW5kZXggPSBpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXJyb3IgY2hlY2tcclxuICAgIGlmIChoZWFkZXJDZWxsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgTm8gaGVhZGVyIGZvdW5kIHdpdGggbmFtZSBcIiR7aGVhZGVyTmFtZX1cImApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICBcclxuICAgIC8vIEFzc2lnbiB0aGUgY2xhc3MgdG8gZWFjaCBjZWxsIGluIHRoZSBzcGVjaWZpZWQgY29sdW1uIGluZGV4IHdpdGhpbiB0aGUgdGJvZHlcclxuICAgIGxldCB0Ym9keSA9IHRhYmxlLnRCb2RpZXNbMF07XHJcbiAgICBpZiAodGJvZHkpIHtcclxuICAgICAgbGV0IGJvZHlSb3dzID0gdGJvZHkucm93cztcclxuICAgICAgZm9yIChsZXQgcm93IG9mIGJvZHlSb3dzKSB7XHJcbiAgICAgICAgaWYgKHJvdy5jZWxsc1toZWFkZXJDZWxsSW5kZXhdKSB7XHJcbiAgICAgICAgICByb3cuY2VsbHNbaGVhZGVyQ2VsbEluZGV4XS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuZnVuY3Rpb24gYWRkQ29zdENsYXNzKGhlYWRlck5hbWUpe1xyXG4gICAgYXNzaWduQ2xhc3NUb0NvbHVtbiggaGVhZGVyTmFtZSwgJ2Nvc3QnKTtcclxuXHJcbiAgICAvLyBHZXQgYWxsIHRoZSBjZWxscyB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZVxyXG4gICAgY29uc3QgY2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGB0ZC5jb3N0YCk7XHJcbiAgICAgIFxyXG4gICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBjZWxsIGFuZCBhc3NpZ24gaXQgdG8gJ3ZhbHVlJyBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKXtcclxuICAgICAgICAgICAgY29uc3QgY2VsbFRleHQgPSBjZWxsLnRleHRDb250ZW50LnRyaW0oKTtcclxuICAgICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gaXNOYU4oY2VsbFRleHQpIHx8IGNlbGxUZXh0ID09PSAnJyA/IDAgOiBwYXJzZUZsb2F0KGNlbGxUZXh0KTtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgY2VsbFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5vdyBmb3JtYXQgdGhlIHRleHQgY29udGVudCBsaWtlIGN1cnJlbmN5IGFuZCByZXBsYWNlIGl0IGluIHRoZSBjZWxsXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEN1cnJlbmN5ID0gZm9ybWF0Q3VycmVuY3kocGFyc2VGbG9hdChjZWxsVmFsdWUpKTtcclxuICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdHRlZEN1cnJlbmN5O1xyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICB9KTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uRGVmaW5pdGlvbnMpIHtcclxuICAgIGNvbHVtbkRlZmluaXRpb25zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAvLyBBc3NpZ24gY2xhc3MgdG8gY29sdW1uXHJcbiAgICAgICAgYXNzaWduQ2xhc3NUb0NvbHVtbihjb2x1bW4udGl0bGUsIGNvbHVtbi5jbGFzc05hbWUpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGEgY29zdCBjb2x1bW4sIGFkZCB0aGUgc3BlY2lmaWMgY29zdCBjbGFzc1xyXG4gICAgICAgIGlmIChjb2x1bW4uaXNDb3N0KSB7XHJcbiAgICAgICAgICAgIGFkZENvc3RDbGFzcyhjb2x1bW4udGl0bGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2hvdyB0aGUgY29sdW1uXHJcbiAgICAgICAgaWYgKCFjb2x1bW4uaGlkZSl7XHJcbiAgICAgICAgICAgIHNob3dDb2x1bW5CeVRpdGxlKGNvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVDb2x1bW4oaW5kZXgpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciByb3dzID0gdGFibGUucm93cztcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgIGlmIChjZWxscy5sZW5ndGggPiBpbmRleCkge1xyXG4gICAgICAgICAgY2VsbHNbaW5kZXhdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNob3cgYSBzcGVjaWZpYyBjb2x1bW5cclxuZnVuY3Rpb24gc2hvd0NvbHVtbihpbmRleCkge1xyXG4gIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzO1xyXG5cclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGluZGV4KSB7XHJcbiAgICAgICAgICBjZWxsc1tpbmRleF0uc3R5bGUuZGlzcGxheSA9ICd0YWJsZS1jZWxsJztcclxuICAgICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBjb2x1bW4gaW5kZXggYnkgdGl0bGVcclxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXhCeVRpdGxlKHRhYmxlLCB0aXRsZSkge1xyXG4gIHZhciBoZWFkZXJzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGhlYWRlcnNbaV0uaW5uZXJUZXh0ID09PSB0aXRsZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIC0xOyAvLyBDb2x1bW4gbm90IGZvdW5kXHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIGhpZGUgYSBjb2x1bW4gYnkgdGl0bGVcclxuZnVuY3Rpb24gaGlkZUNvbHVtbkJ5VGl0bGUodGl0bGUpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciBpbmRleCA9IGdldENvbHVtbkluZGV4QnlUaXRsZSh0YWJsZSwgdGl0bGUpO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgaGlkZUNvbHVtbihpbmRleCk7XHJcbiAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coYENvbHVtbiB3aXRoIHRpdGxlIFwiJHt0aXRsZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbiB0byBzaG93IGEgY29sdW1uIGJ5IHRpdGxlXHJcbmZ1bmN0aW9uIHNob3dDb2x1bW5CeVRpdGxlKHRpdGxlKSB7XHJcbiAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICB2YXIgaW5kZXggPSBnZXRDb2x1bW5JbmRleEJ5VGl0bGUodGFibGUsIHRpdGxlKTtcclxuICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHNob3dDb2x1bW4oaW5kZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBDb2x1bW4gd2l0aCB0aXRsZSBcIiR7dGl0bGV9XCIgbm90IGZvdW5kLmApO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IENvbHVtbiA9IHtcclxuICBhZGQ6IGZ1bmN0aW9uKHBvc2l0aW9uLCBodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcclxuICB9LFxyXG4gIGFkZEF0RW5kOiBmdW5jdGlvbihodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbFRvRW5kKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSk7XHJcbiAgfSxcclxuICBhc3NpZ25DbGFzc2VzOiBmdW5jdGlvbihjb2x1bW5fZGVmaW5pdGlvbnMpIHtcclxuICAgICAgcmV0dXJuIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uX2RlZmluaXRpb25zKTtcclxuICB9LFxyXG4gIGhpZGUgOiBmdW5jdGlvbihjb2xOYW1lKSB7XHJcbiAgICAgIGhpZGVDb2x1bW5CeVRpdGxlKGNvbE5hbWUpO1xyXG4gIH0sXHJcbiAgc2hvdyA6IGZ1bmN0aW9uKGNvbE5hbWUpIHtcclxuICAgICAgc2hvd0NvbHVtbkJ5VGl0bGUoY29sTmFtZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsImltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gJy4uLy4uLy4uL21vZGVscy9jdXJyZW50X2Z1bmQuanMnXHJcbmltcG9ydCBDdXJyZW50UGFnZSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY3VycmVudF9wYWdlLmpzJ1xyXG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vdGFibGUuanMnO1xyXG5cclxuZnVuY3Rpb24gZmlsbFRhYmxlKGRhdGEpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgICAgICBjb25zdCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFyIGV4aXN0aW5nIGRhdGFcclxuICAgICAgICB0aGVhZC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICB0Ym9keS5pbm5lckhUTUwgPSAnJztcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIGhlYWRlciByb3dcclxuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFbMF0pLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICAgICAgaGVhZGVyLnRleHRDb250ZW50ID0ga2V5O1xyXG4gICAgICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGFibGUgYm9keSByb3dzXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgICAgICAgICAgY2VsbC5pbm5lckhUTUwgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBjYXRjaChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRhYmxlIHNhdmVkIGluIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGxvYWRGcm9tU3RvcmFnZSgpe1xyXG4gICAgLy8gbG9vayB1cCB0YWJsZSBuYW1lIGluIHN0b3JhZ2VcclxuICAgIGlmIChDdXJyZW50RnVuZC5udW1iZXIoKSl7XHJcbiAgICAgICAgdmFyIGtleSA9IGAke0N1cnJlbnRQYWdlLmxvYWQoKX1fJHtDdXJyZW50RnVuZC5udW1iZXIoKX1gO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIga2V5ID0gQ3VycmVudFBhZ2UubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gbG9hZCBmcm9tIGxvY2FsIHN0b3JhZ2VcclxuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgLy8gaWYgbm90aGluZyBpbiBzdG9yYWdlLCByZXR1cm4gYSB6ZXJvXHJcbiAgICBpZiAoICFkYXRhICkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvdGhlcndpc2UsIGZpbGwgdGFibGUgaW4gSFRNTCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKDEpXHJcbiAgICAgICAgVGFibGUuc2hvdygpO1xyXG4gICAgICAgIGZpbGxUYWJsZShhd2FpdCBKU09OLnBhcnNlKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGxvYWRGdW5kcygpe1xyXG4gICAgLy8gZ2V0IGxpc3Qgb2YgZnVuZHMgZnJvbSBzdG9yYWdlXHJcbiAgICBjb25zdCBmdW5kRGljdCA9IEZ1bmRMb29rdXBUYWJsZS5yZXRyaWV2ZSgpO1xyXG4gICAgLy8gYnVpbGQgb3V0IGRhdGEgaW4gY29ycmVjdCBmb3JtYXRcclxuICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgT2JqZWN0LmtleXMoZnVuZERpY3QpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAvLyBkZXRlcm1pbmUgaWYgdGhlIGZ1bmQgaGFzIGFscmVhZHkgYmVlbiBlZGl0ZWRcclxuICAgICAgICBpZiAoZnVuZERpY3Rba2V5XVsndmlld2VkJ10pe1xyXG4gICAgICAgICAgICAvLyB0b2RvOiBhZGQgYSBjaGVja21hcmsgaGVyZVxyXG4gICAgICAgICAgICByZXQucHVzaCh7J0Z1bmQnIDogIGA8c3BhbiBjbGFzcyA9ICd2aWV3ZWQtZnVuZCc+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmdW5kRGljdFtrZXldWyduYW1lJ119XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPmB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXQucHVzaCh7J0Z1bmQnIDogYDxzcGFuIGNsYXNzID0gJ3Vudmlld2VkLWZ1bmQnPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmdW5kRGljdFtrZXldWyduYW1lJ119XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPmB9KTsgICBcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGZpbGxUYWJsZShyZXQpO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBjbGFzc05hbWUpIHtcclxuICBjb25zdCBmaXJzdFJvdyA9IHRib2R5LnJvd3NbMF07XHJcbiAgaWYgKCFmaXJzdFJvdykgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgdGhlcmUncyBubyByb3cgdG8gZXhhbWluZVxyXG4gIGZvciAobGV0IGNlbGxJbmRleCA9IDA7IGNlbGxJbmRleCA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgY2VsbEluZGV4KyspIHtcclxuICAgICAgaWYgKGZpcnN0Um93LmNlbGxzW2NlbGxJbmRleF0uY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgIHJldHVybiBjZWxsSW5kZXg7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgY2xhc3MgbmFtZSBub3QgZm91bmRcclxufVxyXG5cclxuLy8gZnVuY3Rpb24gc29ydChwcmltYXJ5Q2xhc3MsIHNlY29uZGFyeUNsYXNzKSB7XHJcbi8vICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4vLyAgIGNvbnN0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcclxuLy8gICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0Ym9keS5yb3dzKTtcclxuXHJcbi8vICAgLy8gR2V0IHRoZSBjb2x1bW4gaW5kaWNlcyBieSBjbGFzcyBuYW1lXHJcbi8vICAgY29uc3QgcHJpbWFyeUNvbEluZGV4ID0gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBwcmltYXJ5Q2xhc3MpO1xyXG4vLyAgIGNvbnN0IHNlY29uZGFyeUNvbEluZGV4ID0gZ2V0Q29sdW1uSW5kZXhCeUNsYXNzKHRib2R5LCBzZWNvbmRhcnlDbGFzcyk7XHJcblxyXG4vLyAgIC8vIGV4aXQgaWYgY2xhc3NlcyBkb24ndCBleGlzdFxyXG4vLyAgIGlmIChwcmltYXJ5Q29sSW5kZXggPT09IC0xICkge1xyXG4vLyAgICAgICBjb25zb2xlLmVycm9yKGBDb2x1bW4gY2xhc3MgJHtjbGFzc0F9IG5vdCBmb3VuZCBpbiB0YWJsZWApO1xyXG4vLyAgICAgICByZXR1cm47IFxyXG4vLyAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5Q29sSW5kZXggPT09IC0xKSB7XHJcbi8vICAgICAgIGNvbnNvbGUuZXJyb3IoYENvbHVtbiBjbGFzcyAke2NsYXNzQn0gbm90IGZvdW5kIGluIHRhYmxlYCk7XHJcbi8vICAgICAgIHJldHVybjsgXHJcbi8vICAgfVxyXG5cclxuLy8gICAvLyBTb3J0IHRoZSByb3dzIGJhc2VkIG9uIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGxzXHJcbi8vICAgcm93cy5zb3J0KChyb3dBLCByb3dCKSA9PiB7XHJcbi8vICAgICAgIC8vIFByaW1hcnkgY29sdW1uIGNvbXBhcmlzb25cclxuLy8gICAgICAgY29uc3QgcHJpbWFyeUEgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0EuY2VsbHNbcHJpbWFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcbi8vICAgICAgIGNvbnN0IHByaW1hcnlCID0gdW5mb3JtYXRDdXJyZW5jeShyb3dCLmNlbGxzW3ByaW1hcnlDb2xJbmRleF0udGV4dENvbnRlbnQpO1xyXG5cclxuLy8gICAgICAgaWYgKHByaW1hcnlBIDwgcHJpbWFyeUIpIHJldHVybiAtMTtcclxuLy8gICAgICAgaWYgKHByaW1hcnlBID4gcHJpbWFyeUIpIHJldHVybiAxO1xyXG5cclxuLy8gICAgICAgLy8gU2Vjb25kYXJ5IGNvbHVtbiBjb21wYXJpc29uIChpZiBwcmltYXJ5IGlzIGVxdWFsKVxyXG4vLyAgICAgICBjb25zdCBzZWNvbmRhcnlBID0gdW5mb3JtYXRDdXJyZW5jeShyb3dBLmNlbGxzW3NlY29uZGFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcbi8vICAgICAgIGNvbnN0IHNlY29uZGFyeUIgPSB1bmZvcm1hdEN1cnJlbmN5KHJvd0IuY2VsbHNbc2Vjb25kYXJ5Q29sSW5kZXhdLnRleHRDb250ZW50KTtcclxuXHJcbi8vICAgICAgIGlmIChzZWNvbmRhcnlBIDwgc2Vjb25kYXJ5QikgcmV0dXJuIC0xO1xyXG4vLyAgICAgICBpZiAoc2Vjb25kYXJ5QSA+IHNlY29uZGFyeUIpIHJldHVybiAxO1xyXG5cclxuLy8gICAgICAgLy8gSWYgYm90aCBjb2x1bW5zIGFyZSBlcXVhbFxyXG4vLyAgICAgICByZXR1cm4gMDtcclxuLy8gICB9KTtcclxuXHJcbi8vICAgLy8gUmVhdHRhY2ggc29ydGVkIHJvd3MgdG8gdGhlIHRhYmxlIGJvZHlcclxuLy8gICByb3dzLmZvckVhY2goKHJvdykgPT4gdGJvZHkuYXBwZW5kQ2hpbGQocm93KSk7XHJcbi8vIH1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgRGF0YSA9IHtcclxuICAgIGxvYWQgOiBsb2FkRnJvbVN0b3JhZ2UsXHJcbiAgICBsb2FkRnVuZHMgOiBsb2FkRnVuZHMsXHJcbiAgICBzb3J0IDogZnVuY3Rpb24oY29sQSwgY29sQikgeyBzb3J0KGNvbEEsIGNvbEIpIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YTsiLCIvLyBIZWxwZXIgZnVuY3Rpb25zICYgY29uc3RhbnRzXHJcblxyXG4vLyBoZWxwZXIgZnVuY3Rpb24gdG8gZmlsdGVyIGRhdGEgYmFzZWQgb24gYWxsIGZpbHRlcnNcclxuZnVuY3Rpb24gZmlsdGVyRGF0YSgpIHtcclxuICAgIC8vIEdldCBhbGwgcm93cyBpbiB0aGUgdGFibGVcclxuICAgIGNvbnN0IHJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjbWFpbi10YWJsZSB0Ym9keSB0cicpO1xyXG4gICAgXHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCByb3cgYW5kIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgaGlkZGVuIG9yIHNob3duXHJcbiAgICByb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBsZXQgaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpbHRlci1kcm9wZG93bicpO1xyXG4gICAgICAgIGZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICAgICAgICAvLyBDaGVjayBlYWNoIGZpbHRlciBzZXR0aW5nIGFnYWluc3QgdGhlIHJvdydzIGNlbGxzXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJJRCA9IGZpbHRlci5pZC5yZXBsYWNlKCdmaWx0ZXItJywgJycpO1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LnF1ZXJ5U2VsZWN0b3IoYC4ke2ZpbHRlcklEfWApO1xyXG4gICAgXHJcbiAgICAgICAgICAgIC8vIG9ubHkgc2hvdyByb3cgaWYgdmFsdWVzIHBhc3MgdGhyb3VnaCBhbGwgZmlsdGVycyBcclxuICAgICAgICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiBjZWxsICYmIChjZWxsLnRleHRDb250ZW50LnRyaW0oKSAhPT0gZmlsdGVyLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSByb3cgYmFzZWQgb24gdmlzaWJpbGl0eVxyXG4gICAgICAgIHJvdy5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCAhaXNWaXNpYmxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5jb25zdCBGaWx0ZXIgPSB7XHJcbiAgICBodG1sKGZpbHRlckxhYmVsLCBmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIC8vIGJhc2ljIGh0bWwgd2l0aCBvbmx5ICdBbGwnIG9wdGlvblxyXG4gICAgICAgIHJldHVybiBgPGxhYmVsIGZvcj1cImZpbHRlci0ke2ZpbHRlckNsYXNzfVwiPkZpbHRlciBieSAke2ZpbHRlckxhYmVsfTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImZpbHRlci0ke2ZpbHRlckNsYXNzfVwiIGNsYXNzPVwiZmlsdGVyLWRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+YFxyXG4gICAgfSxcclxuXHJcbiAgICBhZGRPcHRpb24oZmlsdGVyQ2xhc3MsIG9wdGlvbikge1xyXG4gICAgICAgIC8vIEFkZCBhbm90aGVyIG9wdGlvbiB0byB0aGUgZHJvcGRvd24gZm9yIHRoZSBmaWx0ZXJcclxuICAgICAgICBjb25zdCBmaWx0ZXJPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9YCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uT2JqID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XHJcbiAgICAgICAgb3B0aW9uT2JqLnZhbHVlID0gb3B0aW9uO1xyXG4gICAgICAgIG9wdGlvbk9iai50ZXh0Q29udGVudCA9IG9wdGlvbjtcclxuICAgICAgICBmaWx0ZXJPYmouYXBwZW5kQ2hpbGQob3B0aW9uT2JqKTtcclxuICAgIH0sXHJcblxyXG4gICAgYWRkKGZpbHRlckxhYmVsLCBmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIGRpdiB0byBjb250YWluIHRoZSBodG1sIGFuZCBpbnNlcnQgaW5zaWRlIGZpbHRlci1jb250YWluZXJcclxuICAgICAgICBjb25zdCBmaWx0ZXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWNvbnRhaW5lcicpO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGZpbHRlckRpdi5pbm5lckhUTUwgPSB0aGlzLmh0bWwoZmlsdGVyTGFiZWwsIGZpbHRlckNsYXNzKTtcclxuICAgICAgICBmaWx0ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcclxuICAgICAgICAvLyBhZGQgYWxsIHJlbGV2YW50IG9wdGlvbnMgZnJvbSB0aGF0IGNvbHVtbiBpbiB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmFkZEFsbE9wdGlvbnMoZmlsdGVyQ2xhc3MpO1xyXG4gICAgICAgIC8vIEJpbmQgY2hhbmdlIGV2ZW50IHRvIHRoZSBzZWxlY3QgZWxlbWVudFxyXG4gICAgICAgIGZpbHRlckRpdi5xdWVyeVNlbGVjdG9yKCcuZmlsdGVyLWRyb3Bkb3duJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAvLyBzYXZlIGZpbHRlciB2YWx1ZVxyXG4gICAgICAgICAgICB0aGlzLnNhdmVGaWx0ZXJWYWx1ZXMoKTtcclxuICAgICAgICAgICAgLy8gQXBwbHkgYWxsIGZpbHRlcnNcclxuICAgICAgICAgICAgZmlsdGVyRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBhZGRBbGxPcHRpb25zKGZpbHRlckNsYXNzKSB7XHJcbiAgICAgICAgLy8gZ2V0IG1hdGNoaW5nIGNvbHVtbiBmcm9tIHRhYmxlXHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgI21haW4tdGFibGUgdGQuJHtmaWx0ZXJDbGFzc31gKTtcclxuXHJcbiAgICAgICAgLy8gVXNlIGEgU2V0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBvZiBpbnRlcmVzdFxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIE5vZGVMaXN0IHRvIGdldCB0aGUgdW5pcXVlIHZhbHVlc1xyXG4gICAgICAgIGNvbHVtbi5mb3JFYWNoKHRkID0+IHtcclxuICAgICAgICAgICAgLy8gQWRkIGVhY2ggdGV4dENvbnRlbnQgdG8gdGhlIFNldFxyXG4gICAgICAgICAgICB1bmlxdWVWYWx1ZXMuYWRkKHRkLnRleHRDb250ZW50LnRyaW0oKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYWRkIGFsbCB2YWx1ZXMgYXMgb3B0aW9ucyB0byB0aGUgZmlsdGVyIGRyb3Bkb3duXHJcbiAgICAgICAgdW5pcXVlVmFsdWVzLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRPcHRpb24oZmlsdGVyQ2xhc3MsIG9wdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlbGV0ZUFsbCgpe1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItY29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZU9wdGlvbnMoZmlsdGVyQ2xhc3MpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyQ2xhc3N9YCk7XHJcbiAgICAgICAgaWYgKGZpbHRlck9iaikge1xyXG4gICAgICAgICAgICAvLyBDbGVhciBhbGwgZXhpc3Rpbmcgb3B0aW9ucyBleGNlcHQgZm9yIHRoZSBkZWZhdWx0ICdBbGwnIG9wdGlvblxyXG4gICAgICAgICAgICBmaWx0ZXJPYmoub3B0aW9ucy5sZW5ndGggPSAxO1xyXG4gICAgICAgICAgICAvLyBBZGQgbmV3IG9wdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5hZGRBbGxPcHRpb25zKGZpbHRlckNsYXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdXBkYXRlIHNlbGVjdGlvbiB0byBtYXRjaCBzYXZlZCB2YWx1ZXNcclxuICAgICAgICB0aGlzLnNldEZpbHRlcnNGcm9tU3RvcmFnZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXNldEZpbHRlcihmaWx0ZXJDbGFzcykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlck9iaiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNmaWx0ZXItJHtmaWx0ZXJDbGFzc31gKTtcclxuICAgICAgICBpZiAoZmlsdGVyT2JqKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCBmaWx0ZXIgdG8gJ0FsbCcgb3B0aW9uXHJcbiAgICAgICAgICAgIGZpbHRlck9iai52YWx1ZSA9IFwiQWxsXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIFxyXG4gICAgcmVzZXRBbGxGaWx0ZXJzKCkge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVyLWRyb3Bkb3duJyk7XHJcbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgZmlsdGVyLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGZpbHRlci5pZCwgJycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXNldEFmdGVyTmV3Um93KHJlc3BvbnNlcykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVyLWRyb3Bkb3duJyk7XHJcbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWx0ZXIgY2xhc3MgdG8gdGVsbCB1cyB3aGF0J3MgaW4gdGhlIGZpbHRlclxyXG4gICAgICAgICAgICBsZXQgZmlsdGVySUQgPSBmaWx0ZXIuaWQucmVwbGFjZSgnZmlsdGVyLScsICcnKTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGZyb20gdGhlIG5ldyBwb2lzdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSBmaWx0ZXIgdmFsdWUsIFxyXG4gICAgICAgICAgICAvLyByZXNldCBpdCBzbyB0aGF0IHRoZSBuZXcgcG9zaXRpb24gd2lsbCBzaG93IHVwXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudmFsdWUgIT0gcmVzcG9uc2VzW2ZpbHRlcklEXSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyKGZpbHRlcklEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBzYXZlRmlsdGVyVmFsdWVzKCl7XHJcbiAgICAgICAgY29uc3QgZmlsdGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWx0ZXItZHJvcGRvd24nKTtcclxuICAgICAgICBmaWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShmaWx0ZXIuaWQsIGZpbHRlci52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldEZpbHRlcnNGcm9tU3RvcmFnZSgpe1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVyLWRyb3Bkb3duJyk7XHJcbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBzdG9yZWQgdmFsdWUgZm9yIHRoZSBmaWx0ZXIgYW5kIGFwcGx5IGl0XHJcbiAgICAgICAgICAgIGxldCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGZpbHRlci5pZCk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBmaWx0ZXIgaGFzIG5ldmVyIGJlZW4gdXNlZCwgZGVmYXVsdCB0byBcIkFsbFwiXHJcbiAgICAgICAgICAgIGlmICghc3RvcmVkVmFsdWUpIHsgc3RvcmVkVmFsdWUgPSAnJyB9O1xyXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBzdG9yZWRWYWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBhY3R1YWxseSBmaWx0ZXIgZGF0YSBiYXNlZCBvbiBzZWxlY3Rpb25zXHJcbiAgICAgICAgZmlsdGVyRGF0YSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXI7IiwiLy8gdGhlIEdvbGQgQm9vayBjb250YWlucyBhIGxvb2t1cCB0YWJsZSBmb3IgZWFjaCBqb2IgY29kZSwgd2hpY2ggbWFwcyB0byB0aGUgQlUsIHRoZSBqb2IgdGl0bGUsIGFuZCB0aGUgZnJpbmdlIHJhdGVcclxuXHJcbmNvbnN0IEdvbGRCb29rID0ge1xyXG4gICAgaW5pdChzaGVldCkge1xyXG4gICAgICAgIC8vIENvbnZlcnQgc2hlZXQgdG8gSlNPTiwgd2l0aCBubyBhdXRvbWF0aWMgaGVhZGVyIHJvdyBwYXJzaW5nXHJcbiAgICAgICAgY29uc3QgcmF3RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycgfSk7XHJcblxyXG4gICAgICAgIC8vIEFzc3VtaW5nIGhlYWRlciBpcyB0aGUgc2Vjb25kIHJvdyAoaW5kZXggMSksIGFuZCBkYXRhIHN0YXJ0cyBhdCB0aGUgdGhpcmQgcm93IChpbmRleCAyKVxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSByYXdEYXRhWzFdO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSByYXdEYXRhLnNsaWNlKDIpOyBcclxuXHJcbiAgICAgICAgLy8gU3RvcmUgaGVhZGVycyBhbmQgZGF0YSBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ29sZGJvb2tfaGVhZGVycycsIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ29sZGJvb2tfZGF0YScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH0sXHJcblxyXG4gICAgZmV0Y2goKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dvbGRib29rX2hlYWRlcnMnKSk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dvbGRib29rX2RhdGEnKSk7XHJcbiAgICAgICAgcmV0dXJuIHsgaGVhZGVycywgZGF0YSB9O1xyXG4gICAgfSxcclxuXHJcbiAgICBmZXRjaEJ5Q29kZShqb2JfY29kZSkge1xyXG4gICAgICAgIGNvbnN0IHsgaGVhZGVycywgZGF0YSB9ID0gdGhpcy5mZXRjaCgpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBtYXAgb2YgY29sdW1uIG5hbWVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgaW5kaWNlc1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck1hcCA9IGhlYWRlcnMucmVkdWNlKChhY2MsIGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgYWNjW2hlYWRlcl0gPSBpbmRleDtcclxuICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihyb3cgPT4gcm93W2hlYWRlck1hcFsnSm9iIENvZGUnXV0gPT0gam9iX2NvZGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBcclxuICAgIGdldEhlYWRlcklYKGhlYWRlcl9uYW1lKXtcclxuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHRoaXMuZmV0Y2goKTtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyTWFwID0gaGVhZGVycy5yZWR1Y2UoKGFjYywgaGVhZGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIGFjY1toZWFkZXJdID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgIHJldHVybiBoZWFkZXJNYXBbaGVhZGVyX25hbWVdO1xyXG4gICAgfSxcclxuXHJcbiAgICBsb29rdXBCeUpvYkNvZGUoam9iX2NvZGUsIGhlYWRlcl9uYW1lKXtcclxuICAgICAgICBjb25zdCBjb2RlRGF0YSA9IHRoaXMuZmV0Y2hCeUNvZGUoam9iX2NvZGUpO1xyXG5cclxuICAgICAgICBpZiAoY29kZURhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29kZURhdGFbMF1bdGhpcy5nZXRIZWFkZXJJWChoZWFkZXJfbmFtZSldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VGl0bGUoam9iX2NvZGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCeUpvYkNvZGUoam9iX2NvZGUsICdKb2IgRGVzY3JpcHRpb24nKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIGdldEZyaW5nZVJhdGUoam9iX2NvZGUpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLmxvb2t1cEJ5Sm9iQ29kZShqb2JfY29kZSwgJ0ZyaW5nZSBSYXRlJykpO1xyXG4gICAgfSxcclxuXHJcbiAgICBjb2RlRXhpc3RzKGpvYl9jb2RlKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEJ5Q29kZShqb2JfY29kZSkubGVuZ3RoID4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gbWV0aG9kIHRvIGFkZCBHb2xkQm9vayBkYXRhIGFzIGEgbmV3IHNoZWV0IHRvIHRoZSB3b3JrYm9va1xyXG4gICAgeGxzeCgpIHtcclxuICAgICAgICBjb25zdCB7IGhlYWRlcnMsIGRhdGEgfSA9IHRoaXMuZmV0Y2goKTtcclxuXHJcbiAgICAgICAgLy8gQ29tYmluZSBoZWFkZXJzIGFuZCBkYXRhIGludG8gb25lIGFycmF5XHJcbiAgICAgICAgY29uc3QgY29tYmluZWREYXRhID0gW2hlYWRlcnNdLmNvbmNhdChkYXRhKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgd29ya3NoZWV0XHJcbiAgICAgICAgcmV0dXJuIFhMU1gudXRpbHMuYW9hX3RvX3NoZWV0KGNvbWJpbmVkRGF0YSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHb2xkQm9vazsiLCJcclxuXHJcbmltcG9ydCB7IFNIRUVUUywgVEFSR0VUX0NFTExfQUREUkVTUywgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuaW1wb3J0IEZ1bmRMb29rdXBUYWJsZSBmcm9tICcuLi9tb2RlbHMvZnVuZF9sb29rdXBfdGFibGUuanMnO1xyXG5pbXBvcnQgeyByZW1vdmVOZXdMaW5lcyB9IGZyb20gJy4vY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IEJhc2VsaW5lIGZyb20gJy4uL21vZGVscy9iYXNlbGluZS5qcyc7XHJcbmltcG9ydCBTZXJ2aWNlcyBmcm9tICcuLi9tb2RlbHMvc2VydmljZXMuanMnO1xyXG5pbXBvcnQgR29sZEJvb2sgZnJvbSAnLi4vbW9kZWxzL2dvbGRfYm9vay5qcyc7XHJcblxyXG5cclxuLy8gSGVscGVyIGZ1bmN0aW9uc1xyXG5cclxuLyoqXHJcbiAqIERlbGV0ZXMgdGhlIHRvcCByb3dzIHVudGlsIGEgcm93IGNvbnRhaW5pbmcgY29tcGxldGUgZGF0YSBpcyBmb3VuZC5cclxuICogQHBhcmFtIHtBcnJheX0gZGF0YSAtIFRoZSByYXcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgc2hlZXQuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gLSBUaGUgY2xlYW5lZCBkYXRhIHdpdGggaW5jb21wbGV0ZSB0b3Agcm93cyByZW1vdmVkLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVsZXRlVG9wUm93c1VudGlsRnVsbERhdGEoZGF0YSkge1xyXG4gICAgbGV0IGZ1bGxEYXRhUm93Rm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICB3aGlsZSAoIWZ1bGxEYXRhUm93Rm91bmQgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gZGF0YVswXTsgLy8gR2V0IHRoZSB0b3Agcm93XHJcbiAgICAgICAgbGV0IGhhc0FsbERhdGEgPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93KSB7XHJcbiAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwgfHwgY2VsbCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGhhc0FsbERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGFzQWxsRGF0YSAmJiByb3cubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBmdWxsRGF0YVJvd0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRvcCByb3cgaWYgaXQncyBub3QgdGhlIGhlYWRlciByb3dcclxuICAgICAgICAgICAgZGF0YS5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlYWRzIHRoZSB3b3JrYm9vayBmcm9tIHRoZSBwcm92aWRlZCBhcnJheSBidWZmZXIuXHJcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIC0gVGhlIGFycmF5IGJ1ZmZlciBjb250YWluaW5nIHRoZSB3b3JrYm9vayBkYXRhLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBwYXJzZWQgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiByZWFkV29ya2Jvb2soYXJyYXlCdWZmZXIpIHtcclxuICAgIHJldHVybiBYTFNYLnJlYWQoYXJyYXlCdWZmZXIsIHsgdHlwZTogJ2FycmF5JyB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3NlcyBzaGVldHMgdG8gYmUgc3BsaXQgYnkgZnVuZCBhbmQgc2F2ZXMgdGhlIHJlbGV2YW50IGRhdGEuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaGVldE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2hlZXQgYmVpbmcgcHJvY2Vzc2VkLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc2hlZXQgLSBUaGUgc2hlZXQgb2JqZWN0IGZyb20gdGhlIHdvcmtib29rLlxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc1NoZWV0KHNoZWV0TmFtZSwgc2hlZXQpIHtcclxuICAgIC8vIFJlYWQgaW4gc2hlZXRzXHJcbiAgICBjb25zdCByYXdEYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHNoZWV0LCB7IGhlYWRlcjogMSwgZGVmdmFsOiAnJyB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgdG9wIHJvd3Mgd2l0aCBpbmNvbXBsZXRlIGRhdGFcclxuICAgIGNvbnN0IGRhdGFSb3dzID0gZGVsZXRlVG9wUm93c1VudGlsRnVsbERhdGEocmF3RGF0YSk7XHJcblxyXG4gICAgLy8gR2V0IG5ldyBoZWFkZXJzXHJcbiAgICBjb25zdCBoZWFkZXJzID0gZGF0YVJvd3NbMF07XHJcbiAgICBjb25zdCBmdW5kSW5kZXggPSBoZWFkZXJzLmluZGV4T2YoJ0Z1bmQnKTtcclxuICAgIGlmIChmdW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgTm8gJ0Z1bmQnIGNvbHVtbiBmb3VuZCBpbiBzaGVldCAke3NoZWV0TmFtZX1gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSBhIGRpY3Rpb25hcnkgb2YgZGF0YSBmb3IgZWFjaCBmdW5kIGZvciBlYWNoIHNoZWV0XHJcbiAgICBjb25zdCBmdW5kRGF0YSA9IHt9O1xyXG5cclxuICAgIGRhdGFSb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBjb25zdCBmdW5kID0gcm93W2Z1bmRJbmRleF07XHJcbiAgICAgICAgaWYoZnVuZCAmJiBmdW5kICE9PSBcIkZ1bmRcIil7XHJcbiAgICAgICAgICAgIGlmICghZnVuZERhdGFbZnVuZF0pIHtcclxuICAgICAgICAgICAgICAgIGZ1bmREYXRhW2Z1bmRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJvd0RhdGFbcmVtb3ZlTmV3TGluZXMoaGVhZGVyKV0gPSByb3dbaW5kZXhdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZnVuZERhdGFbZnVuZF0ucHVzaChyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTYXZlIGZ1bmQgbnVtYmVyIGFuZCBuYW1lIGFzIHdlIGdvIGFsb25nXHJcbiAgICBGdW5kTG9va3VwVGFibGUudXBkYXRlKGZ1bmREYXRhKTsgICBcclxuXHJcbiAgICAvLyBzYXZlIGRhdGEgYnkgZnVuZFxyXG4gICAgT2JqZWN0LmtleXMoZnVuZERhdGEpLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7U0hFRVRTW3NoZWV0TmFtZV19XyR7ZnVuZH1gO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZnVuZERhdGFbZnVuZF0pKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHRoZSAnRHJvcC1Eb3duIE1lbnVzJyBzaGVldCB0byBleHRyYWN0IHNlcnZpY2VzIGRhdGEuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRHJvcERvd25NZW51c1NoZWV0KHNoZWV0KSB7XHJcbiAgICBjb25zdCBzaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gc2hlZXREYXRhWzBdO1xyXG4gICAgY29uc3Qgc2VydmljZXNJbmRleCA9IGhlYWRlclJvdy5pbmRleE9mKCdTZXJ2aWNlcycpO1xyXG5cclxuICAgIC8vIHNhdmUgZHJvcCBkb3duIG1lbnUgZm9yIGxhdGVyIGV4Y2VsIGRvd25sb2Fkc1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Ryb3Bkb3ducycsIEpTT04uc3RyaW5naWZ5KHNoZWV0RGF0YSkpO1xyXG5cclxuICAgIGlmIChzZXJ2aWNlc0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0hlYWRlciBcIlNlcnZpY2VzXCIgbm90IGZvdW5kJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzQ29sdW1uID0gc2hlZXREYXRhLnNsaWNlKDEpLm1hcChyb3cgPT4gcm93W3NlcnZpY2VzSW5kZXhdKTtcclxuICAgICAgICBjb25zdCBjbGVhbmVkU2VydmljZXNDb2x1bW4gPSBzZXJ2aWNlc0NvbHVtbi5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT0gbnVsbCk7XHJcbiAgICAgICAgU2VydmljZXMuc2F2ZShjbGVhbmVkU2VydmljZXNDb2x1bW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUHJvY2Vzc2VzIHRoZSAnRGVwdCBTdW1tYXJ5JyBzaGVldCB0byBnZXQgYW5kIHNhdmUgdGhlIHRhcmdldCBmb3IgdGhlIGdlbmVyYWwgZnVuZC5cclxuICogQHBhcmFtIHtPYmplY3R9IHNoZWV0IC0gVGhlIHNoZWV0IG9iamVjdCBmcm9tIHRoZSB3b3JrYm9vay5cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NEZXB0U3VtbWFyeVNoZWV0KHNoZWV0KSB7XHJcbiAgICBpZihzaGVldFtUQVJHRVRfQ0VMTF9BRERSRVNTXSkge1xyXG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHNoZWV0W1RBUkdFVF9DRUxMX0FERFJFU1NdLnY7IC8vIEFjY2VzcyB0aGUgY2VsbCB2YWx1ZVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0YXJnZXQnLCBjZWxsVmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBDZWxsICR7VEFSR0VUX0NFTExfQUREUkVTU30gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgc2hlZXQgdG8gYWRkIHRvIGZ1dHVyZSBleGNlbCBkb3dubG9hZHNcclxuICAgIGNvbnN0IHNoZWV0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEgfSk7XHJcbiAgICAvLyBUT0RPOiByZW1vdmUgZXhjZXNzIGVtcHR5IHJvd3NcclxuICAgIGNvbnN0IG5ld1NoZWV0RGF0YSA9IHNoZWV0RGF0YS5tYXAocm93ID0+IHJvdy5zbGljZSgwLCAzKSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGVwdC1zdW1tYXJ5JywgSlNPTi5zdHJpbmdpZnkobmV3U2hlZXREYXRhKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9jZXNzZXMgdGhlICdGWXtGSVNDQUxfWUVBUn0gR29sZCBCb29rJyBzaGVldCB0byBpbml0aWFsaXplIHRoZSBHb2xkIEJvb2suXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzaGVldCAtIFRoZSBzaGVldCBvYmplY3QgZnJvbSB0aGUgd29ya2Jvb2suXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzR29sZEJvb2tTaGVldChzaGVldCkge1xyXG4gICAgR29sZEJvb2suaW5pdChzaGVldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NOZXdJbml0c1NoZWV0KHNoZWV0KXtcclxuICAgIC8vIFJlYWQgaW4gc2hlZXRzXHJcbiAgICBjb25zdCByYXdEYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHNoZWV0LCB7IGhlYWRlcjogMSwgZGVmdmFsOiAnJyB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgdG9wIHJvd3Mgd2l0aCBpbmNvbXBsZXRlIGRhdGFcclxuICAgIGNvbnN0IGRhdGFSb3dzID0gZGVsZXRlVG9wUm93c1VudGlsRnVsbERhdGEocmF3RGF0YSk7XHJcblxyXG4gICAgLy8gR2V0IG5ldyBoZWFkZXJzXHJcbiAgICBjb25zdCBoZWFkZXJzID0gZGF0YVJvd3NbMF07XHJcbiAgICAvLyBmaW5hbCBkYXRhIG91dHB1dFxyXG4gICAgbGV0IGZ1bGxEYXRhID0gW11cclxuICAgIFxyXG4gICAgLy8gQ29udmVydCBkYXRhIHRvIEpTT04gZm9ybSBhbmQgZmlsdGVyIG91dCByb3dzIHdoZXJlIGZpcnN0IHZhbHVlIGlzIG1pc3NpbmdcclxuICAgIGRhdGFSb3dzLnNsaWNlKDEpLmZvckVhY2gocm93ID0+IHsgLy8gU2tpcCBoZWFkZXJzIHJvd1xyXG4gICAgICAgIC8vIHNraXAgYW55IGVtcHR5IHJvd3MgYXQgdGhlIGVuZFxyXG4gICAgICAgIGlmICgocm93WzBdICE9ICcnKSAmJiAocm93WzBdICE9ICctJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJvd0RhdGFbcmVtb3ZlTmV3TGluZXMoaGVhZGVyKV0gPSByb3dbaW5kZXhdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gb25seSBrZWVwIHN1cHBsZW1lbnRhbCBpbml0aWF0aXZlcyBcclxuICAgICAgICAgICAgaWYgKHJvd0RhdGFbJ0Jhc2VsaW5lIG9yIFN1cHBsZW1lbnRhbCddLmluY2x1ZGVzKCdTdXBwbGVtZW50YWwnKSl7XHJcbiAgICAgICAgICAgICAgICBmdWxsRGF0YS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBzYXZlIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCduZXctaW5pdHMnLCBKU09OLnN0cmluZ2lmeShmdWxsRGF0YSkpO1xyXG59XHJcblxyXG4vLyBNYWluIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb2Nlc3MgdGhlIHdvcmtib29rXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzV29ya2Jvb2soYXJyYXlCdWZmZXIpIHtcclxuICAgIGNvbnN0IHdvcmtib29rID0gcmVhZFdvcmtib29rKGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICB3b3JrYm9vay5TaGVldE5hbWVzLmZvckVhY2goc2hlZXROYW1lID0+IHtcclxuICAgICAgICAvLyBPbmx5IGNvbnZlcnQgc2hlZXRzIHdlIG5lZWQ7IHRyZWF0IG5ldyBpbml0cyBzZXBhcmF0ZWx5IGJlY2F1c2UgdGhleSBzaG91bGRuJ3Qgc2F2ZSBieSBmdW5kXHJcbiAgICAgICAgaWYgKHNoZWV0TmFtZSA9PSBPYmplY3Qua2V5cyhTSEVFVFMpWzRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NOZXdJbml0c1NoZWV0KHNoZWV0KTtcclxuICAgICAgICAvLyBjb252ZXJ0IHBlcnNvbm5lbCwgbm9ucGVyc29ubmVsLCByZXZlbnVlLCBvdmVydGltZVxyXG4gICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXMoU0hFRVRTKS5pbmNsdWRlcyhzaGVldE5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NTaGVldChzaGVldE5hbWUsIHNoZWV0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNoZWV0TmFtZSA9PT0gJ0Ryb3AtRG93biBNZW51cycpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcclxuICAgICAgICAgICAgcHJvY2Vzc0Ryb3BEb3duTWVudXNTaGVldChzaGVldCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzaGVldE5hbWUgPT09ICdEZXB0IFN1bW1hcnknKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIHByb2Nlc3NEZXB0U3VtbWFyeVNoZWV0KHNoZWV0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNoZWV0TmFtZSA9PT0gYEZZJHtGSVNDQUxfWUVBUn0gR29sZCBCb29rYCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICAgICAgICBwcm9jZXNzR29sZEJvb2tTaGVldChzaGVldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ2FsbCBleGNlbCBkYXRhIHNhdmVkJyk7XHJcbn1cclxuXHJcbi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gYXBwZW5kIGEgc2hlZXQgdG8gdGhlIHdvcmtib29rIGlmIGRhdGEgaXMgcHJlc2VudFxyXG5mdW5jdGlvbiBhcHBlbmRTaGVldFRvV29ya2Jvb2sod29ya2Jvb2ssIGRhdGEsIHNoZWV0TmFtZSkge1xyXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHNoZWV0ID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KGRhdGEpO1xyXG4gICAgICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHNoZWV0LCBzaGVldE5hbWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRYTFNYKCkge1xyXG4gICAgLy8gZ3JhYiBkYXRhIGZyb20gYmFzZWxpbmUgb2JqZWN0XHJcbiAgICBjb25zdCBiYXNlbGluZSA9IG5ldyBCYXNlbGluZSgpO1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KCk7IC8vIENyZWF0ZSBhIG5ldyB3b3JrYm9va1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2hlZXQgZGF0YSBiYXNlZCBvbiB0aGUgbmFtZXMgb2YgZWFjaCB0YWIgaW4gdGhlIEV4Y2VsIGRvY1xyXG4gICAgY29uc3Qgc2hlZXREYXRhID0gT2JqZWN0LmtleXMoU0hFRVRTKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XHJcbiAgICAgICAgYWNjW2tleV0gPSBbXTtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIC8vIEFnZ3JlZ2F0ZSBhbGwgcm93cyBhY3Jvc3MgZnVuZHMgYW5kIGNvbWJpbmUgZm9yIGVhY2ggdGFiXHJcbiAgICBiYXNlbGluZS5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKFNIRUVUUykuZm9yRWFjaChzaGVldE5hbWUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZnVuZFtTSEVFVFNbc2hlZXROYW1lXV0gJiYgZnVuZFtTSEVFVFNbc2hlZXROYW1lXV0udGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHNoZWV0RGF0YVtzaGVldE5hbWVdLnB1c2goLi4uZnVuZFtTSEVFVFNbc2hlZXROYW1lXV0udGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBZGQgaW5pdGlhdGl2ZXMgZGF0YSAod2hpY2ggaXNuJ3Qgc3RvcmVkIGJ5IGZ1bmQpXHJcbiAgICBzaGVldERhdGFbT2JqZWN0LmtleXMoU0hFRVRTKVs0XV0gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCduZXctaW5pdHMnKSk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgdGFiIGZvciBlYWNoIHRhYmxlXHJcbiAgICBPYmplY3Qua2V5cyhzaGVldERhdGEpLmZvckVhY2goc2hlZXROYW1lID0+IHtcclxuICAgICAgICBhcHBlbmRTaGVldFRvV29ya2Jvb2sod29ya2Jvb2ssIHNoZWV0RGF0YVtzaGVldE5hbWVdLCBzaGVldE5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQWRkIGEgdGFiIGZvciB0aGUgR29sZEJvb2tcclxuICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIEdvbGRCb29rLnhsc3goKSwgYEZZJHtGSVNDQUxfWUVBUn0gR29sZCBCb29rYCk7XHJcblxyXG4gICAgLy8gYWRkIGEgdGFiIGZvciB0aGUgZHJvcCBkb3ducyBhbmQgZGVwdCBzdW1tYXJ5IChqdXN0IHRhcmdldHMpXHJcbiAgICB3cml0ZUpTT050b05ld1RhYignZHJvcGRvd25zJywgJ0Ryb3AtRG93biBNZW51cycsIHdvcmtib29rKTsgXHJcbiAgICB3cml0ZUpTT050b05ld1RhYignZGVwdC1zdW1tYXJ5JywgJ0RlcHQgU3VtbWFyeScsIHdvcmtib29rKTtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBhIGRvd25sb2FkYWJsZSBmaWxlXHJcbiAgICBjb25zdCB3Ym91dCA9IFhMU1gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbd2JvdXRdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIGxpbmsgYW5kIHRyaWdnZXIgdGhlIGRvd25sb2FkXHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgbGluay5kb3dubG9hZCA9IFwiRmlsbGVkX0RldGFpbF9TaGVldC54bHN4XCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVKU09OdG9OZXdUYWIoc3RvcmFnZV9rZXksIHRhYl9uYW1lLCB3b3JrYm9vayl7XHJcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlX2tleSkpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gWExTWC51dGlscy5hb2FfdG9fc2hlZXQoZGF0YSk7XHJcbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCB3b3Jrc2hlZXQsIHRhYl9uYW1lKTsgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBleGNlbFNlcmlhbERhdGVUb0pTRGF0ZShzZXJpYWwpIHtcclxuXHJcbiAgICBpZiAoIXNlcmlhbCkgeyByZXR1cm4gbnVsbCB9O1xyXG4gICAgLy8gRXhjZWwgY29uc2lkZXJzIDE5MDAtMDEtMDEgYXMgZGF5IDEsIGJ1dCBKYXZhU2NyaXB0J3MgRGF0ZSBjb25zaWRlcnNcclxuICAgIC8vIDE5NzAtMDEtMDEgYXMgZGF5IDAuIFRoZXJlZm9yZSwgd2UgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXHJcbiAgICAvLyBiZXR3ZWVuIDE5MDAtMDEtMDEgYW5kIDE5NzAtMDEtMDEuXHJcbiAgICBjb25zdCBleGNlbEVwb2NoID0gbmV3IERhdGUoRGF0ZS5VVEMoMTg5OSwgMTEsIDMwKSk7IC8vIEphdmFTY3JpcHQgQ29uc2lkZXIgRGVjZW1iZXIgbW9udGggYXMgJzExJ1xyXG4gICAgXHJcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEpTIGRhdGUgYnkgYWRkaW5nIHNlcmlhbCBkYXlzIHRvIHRoZSBlcG9jaCBkYXRlXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXhjZWxFcG9jaC5nZXRUaW1lKCkgKyAoc2VyaWFsICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xyXG4gICAgXHJcbiAgICAvLyBTZXQgdGhlIHRpbWUgcGFydCB0byB6ZXJvIChtaWRuaWdodClcclxuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICBcclxuICAgIC8vIFJldHVybiB0aGUgZGF0ZSBwYXJ0IG9mIHRoZSBJU08gc3RyaW5nXHJcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XHJcbn1cclxuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Rvb2x0aXAuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9vbHRpcC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy8nO1xyXG5pbXBvcnQgQ2VsbCBmcm9tICcuLi90YWJsZS9zdWJjb21wb25lbnRzL2NlbGxzJztcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tICcuLi8uLi91dGlscy9jb21tb25fdXRpbHMnO1xyXG5pbXBvcnQgQ3VycmVudFBhZ2UgZnJvbSAnLi4vLi4vbW9kZWxzL2N1cnJlbnRfcGFnZSc7XHJcbmltcG9ydCB7IGV4Y2VsU2VyaWFsRGF0ZVRvSlNEYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvWExTWF9oYW5kbGVycyc7XHJcblxyXG5pbXBvcnQgJy4vdG9vbHRpcC5jc3MnXHJcblxyXG5mdW5jdGlvbiBoaWRlVG9vbHRpcCgpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJykuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VG9vbHRpcCgpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJykuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxufVxyXG5cclxuZnVuY3Rpb24gZWRpdFRvb2x0aXBUZXh0KG5ld1RleHQpe1xyXG4gICAgLy8gZWRpdCB0ZXh0IHRvIGRpc3BsYXkgaW5zaWRlIHRvb2x0aXBcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpO1xyXG4gICAgdG9vbHRpcC5pbm5lckhUTUwgPSBuZXdUZXh0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93QWNjb3VudFN0cmluZyhyb3cpe1xyXG4gICAgY29uc3QgYXBwcm9wID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2FwcHJvcC1uYW1lJyk7XHJcbiAgICBjb25zdCBjYyA9ICBDZWxsLmdldFRleHQocm93LCAnY2MtbmFtZScpO1xyXG4gICAgY29uc3Qgb2JqID0gIENlbGwuZ2V0VGV4dChyb3csICdvYmplY3QtbmFtZScpO1xyXG4gICAgY29uc3QgZnVuZCA9IENlbGwuZ2V0VGV4dChyb3csICdmdW5kLW5hbWUnKTtcclxuICAgIHZhciBtZXNzYWdlID0gXHJcbiAgICAgICAgYDxzdHJvbmc+RnVuZDwvc3Ryb25nPjogJHtmdW5kfTxicj5cclxuICAgICAgICA8c3Ryb25nPkFwcHJvcHJpYXRpb248L3N0cm9uZz46ICR7YXBwcm9wfTxicj5cclxuICAgICAgICA8c3Ryb25nPkNvc3QgQ2VudGVyPC9zdHJvbmc+OiAke2NjfWA7XHJcbiAgICBpZiAob2JqKSB7IG1lc3NhZ2UgKz0gYDxicj48c3Ryb25nPk9iamVjdDwvc3Ryb25nPjogJHtvYmp9YH1cclxuICAgIG1lc3NhZ2UgKz0gYDxicj4gSWYgeW91IGJlbGlldmUgdGhpcyBhY2NvdW50IHN0cmluZyBpcyBpbmNvcnJlY3QsIHBsZWFzZSBsZWF2ZSBhIGNvbW1lbnQgXHJcbiAgICAgICAgaW4gdGhlIGNvbW1lbnQgY29sdW1uLmBcclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1NhbGFyeVByb2plY3Rpb24ocm93KXtcclxuICAgIGNvbnN0IGdlbmVyYWxfaW5jcmVhc2UgPSBDZWxsLmdldFRleHQocm93LCAnZ2VuZXJhbC1pbmNyZWFzZS1yYXRlJyk7XHJcbiAgICBjb25zdCBtZXJpdF9pbmNyZWFzZSA9ICBDZWxsLmdldFRleHQocm93LCAnbWVyaXQtaW5jcmVhc2UtcmF0ZScpO1xyXG4gICAgY29uc3QgY3VycmVudF9zYWxhcnkgPSBDZWxsLmdldFZhbHVlKHJvdywgJ2N1cnJlbnQtc2FsYXJ5Jyk7XHJcbiAgICBjb25zdCBwcm9qX3NhbGFyeSA9IENlbGwuZ2V0VmFsdWUocm93LCAnYXZnLXNhbGFyeScpO1xyXG4gICAgaWYgKGN1cnJlbnRfc2FsYXJ5KXtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IGBUaGUgYXZlcmFnZSBzYWxhcnkvd2FnZSBmb3IgdGhpcyBwb3NpdGlvbiB3YXMgXHJcbiAgICAgICAgICAgICR7Zm9ybWF0Q3VycmVuY3koY3VycmVudF9zYWxhcnkpfSBhcyBvZiBTZXB0ZW1iZXIgMjAke0ZJU0NBTF9ZRUFSLTJ9LiBcclxuICAgICAgICAgICAgR2l2ZW4gYSAke2dlbmVyYWxfaW5jcmVhc2UqMTAwfSUgZ2VuZXJhbCBpbmNyZWFzZSByYXRlIGFuZCBhICR7bWVyaXRfaW5jcmVhc2UqMTAwfSUgXHJcbiAgICAgICAgICAgIG1lcml0IGluY3JlYXNlLCB0aGUgRlkke0ZJU0NBTF9ZRUFSfSBwcm9qZWN0aW9uIGZvciB0aGlzIHBvc2l0aW9uJ3MgYXZlcmFnZSBcclxuICAgICAgICAgICAgYW5udWFsIHNhbGFyeS93YWdlIGlzICR7Zm9ybWF0Q3VycmVuY3kocHJval9zYWxhcnkpfS4gVGhpcyBwcm9qZWN0aW9uIHRha2VzIGludG8gXHJcbiAgICAgICAgICAgIGFjY291bnQgdGhlIG51bWJlciBvZiB2YWNhbnQgdnMuIGZ1bGwgcG9zaXRpb25zLmA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBtZXNzYWdlID0gYFRoZSBhdmVyYWdlIHNhbGFyeS93YWdlIGZvciB0aGlzIHBvc2l0aW9uIHdhcyBcclxuICAgICAgICAgICAgdW5rbm93biBhcyBvZiBTZXB0ZW1iZXIgMjAke0ZJU0NBTF9ZRUFSLTJ9LCBvciB0aGUgcG9zaXRpb25cclxuICAgICAgICAgICAgZGlkIG5vdCBleGlzdC4gVGhlIEZZJHtGSVNDQUxfWUVBUn0gcHJvamVjdGlvbiBmb3IgdGhpcyBwb3NpdGlvbidzIFxyXG4gICAgICAgICAgICBhdmVyYWdlIGFubnVhbCBzYWxhcnkvd2FnZSBpcyAke2Zvcm1hdEN1cnJlbmN5KHByb2pfc2FsYXJ5KX0uYFxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRUb29sdGlwVGV4dChtZXNzYWdlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0ZpbmFsUGVyc29ubmVsQ29zdChyb3cpe1xyXG4gICAgY29uc3QgcHJval9zYWxhcnkgPSBDZWxsLmdldFZhbHVlKHJvdywgJ2F2Zy1zYWxhcnknKTtcclxuICAgIGNvbnN0IGZ0ZXMgPSBDZWxsLmdldFRleHQocm93LCAnYmFzZWxpbmUtZnRlcycpO1xyXG4gICAgY29uc3QgZnJpbmdlID0gcGFyc2VGbG9hdChDZWxsLmdldFRleHQocm93LCAnZnJpbmdlJykpO1xyXG4gICAgY29uc3QgYXZnX2JlbmVmaXRzID0gcHJval9zYWxhcnkgKiBmcmluZ2U7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gYFRoZSB0b3RhbCBjb3N0IGNhcHR1cmVzICR7ZnRlc30gcG9zaXRpb24ocykgYXRcclxuICAgICAgICAgICAgICAgICAgICBhbiBhbm51YWwgc2FsYXJ5L3dhZ2Ugb2YgJHtmb3JtYXRDdXJyZW5jeShwcm9qX3NhbGFyeSl9LCBcclxuICAgICAgICAgICAgICAgICAgICBwbHVzIGZyaW5nZSBiZW5lZml0cyB0aGF0IGNvc3QgJHtmb3JtYXRDdXJyZW5jeShhdmdfYmVuZWZpdHMpfSBcclxuICAgICAgICAgICAgICAgICAgICBwZXIgcG9zaXRpb24gcGVyIHllYXIsIG9uIGF2ZXJhZ2UuYFxyXG4gICAgZWRpdFRvb2x0aXBUZXh0KG1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93RklDQShyb3cpe1xyXG4gICAgY29uc3QgZmljYSA9IHBhcnNlRmxvYXQoQ2VsbC5nZXRUZXh0KHJvdywgJ2ZpY2EnKSk7XHJcbiAgICBjb25zdCBmaWNhUGVyY2VudGFnZSA9IChmaWNhICogMTAwKS50b0ZpeGVkKDIpO1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBUaGlzIHRvdGFsIGlzIG92ZXJ0aW1lIC8gaG9saWRheSAvIHNoaWZ0IHByZW1pdW0gcGF5LCBwbHVzIEZJQ0EgKHBheXJvbGwgdGF4KSwgXHJcbiAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzICR7ZmljYVBlcmNlbnRhZ2V9JSBmb3IgdGhpcyBjb3N0IGNlbnRlci5gXHJcbiAgICBlZGl0VG9vbHRpcFRleHQobWVzc2FnZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dDUEEocm93KXtcclxuICAgIGNvbnN0IGNwYSA9IHBhcnNlRmxvYXQoQ2VsbC5nZXRUZXh0KHJvdywgJ2NwYScpKTtcclxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gQ2VsbC5nZXRUZXh0KHJvdywgJ2NwYS1kZXNjcmlwdGlvbicpO1xyXG4gICAgY29uc3QgdmVuZG9yID0gQ2VsbC5nZXRUZXh0KHJvdywgJ3ZlbmRvcicpO1xyXG4gICAgdmFyIGNvbnRyYWN0X2VuZCA9IENlbGwuZ2V0VGV4dChyb3csICdjb250cmFjdC1lbmQnKTtcclxuICAgIC8vIGNvbnZlcnQgdG8gbm9ybWFsIGRhdGUgZm9ybWF0IGZyb20gZXhjZWwgXHJcbiAgICBjb250cmFjdF9lbmQgPSBleGNlbFNlcmlhbERhdGVUb0pTRGF0ZShjb250cmFjdF9lbmQpO1xyXG4gICAgY29uc3QgcmVtYWluaW5nID0gQ2VsbC5nZXRWYWx1ZShyb3csICdyZW1haW5pbmcnKTtcclxuICAgIGlmIChjcGEpIHtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IGA8c3Ryb25nPkNQQSAjJHtjcGF9PC9zdHJvbmc+YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBgTm8gQ1BBYDtcclxuICAgIH1cclxuICAgIGlmICh2ZW5kb3IpIHttZXNzYWdlICs9IGA8YnI+PHN0cm9uZz5WZW5kb3I8L3N0cm9uZz46ICR7dmVuZG9yfWB9O1xyXG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz46ICR7ZGVzY3JpcHRpb259YH07XHJcbiAgICBpZiAoY29udHJhY3RfZW5kKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+Q29udHJhY3QgRW5kIERhdGU8L3N0cm9uZz46ICR7Y29udHJhY3RfZW5kfWB9XHJcbiAgICBpZiAocmVtYWluaW5nKSB7bWVzc2FnZSArPSBgPGJyPjxzdHJvbmc+QW1vdW50IFJlbWFpbmluZyBvbiBDb250cmFjdDwvc3Ryb25nPjogJHtmb3JtYXRDdXJyZW5jeShyZW1haW5pbmcpfWB9XHJcblxyXG4gICAgZWRpdFRvb2x0aXBUZXh0KG1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsaW5rKGVsZW1lbnQsIGRpc3BsYXlGbikge1xyXG5cclxuICAgIC8vIGFkZCBjbGFzcyB0byBzaG93IGNlbGwgd2l0aCBhbiB1bmRlcmxpbmUsIGV0Y1xyXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwLWNlbGwnKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW5kIGFwcGVuZCAoZGV0YWlsKVxyXG4gICAgY29uc3QgZGV0YWlsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgZGV0YWlsLmNsYXNzTGlzdC5hZGQoJ2RldGFpbCcpO1xyXG4gICAgZGV0YWlsLnRleHRDb250ZW50ID0gJyhkZXRhaWwpJztcclxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZGV0YWlsKTtcclxuXHJcbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXIgdG8gc2hvdyB0b29sdGlwIG9uIG1vdXNlb3ZlclxyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xyXG4gICAgICAgIGRpc3BsYXlGbihyb3cpO1xyXG4gICAgICAgIHNob3dUb29sdGlwKCk7XHJcbiAgICB9KTtcclxuICAgIC8vIGFuZCBoaWRlIHdoZW4gbW91c2UgbW92ZXMgb2ZmXHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGhpZGVUb29sdGlwKCk7XHJcbiAgICB9KTtcclxuICAgIC8vIFVwZGF0ZSB0b29sdGlwIHBvc2l0aW9uIG9uIG1vdXNlIG1vdmVcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJyk7XHJcbiAgICAgICAgdG9vbHRpcC5zdHlsZS50b3AgPSAoZXZlbnQuY2xpZW50WSArIDEwKSArICdweCc7XHJcbiAgICAgICAgdG9vbHRpcC5zdHlsZS5sZWZ0ID0gKGV2ZW50LmNsaWVudFggKyAxMCkgKyAncHgnO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbmtBY2NvdW50U3RyaW5nQ29sKCkge1xyXG4gICAgLy8gZ2V0IGFsbCByZWxldmFudCBjZWxsc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQuYWNjb3VudC1zdHJpbmcnKS5mb3JFYWNoKCAoY2VsbCkgPT4ge1xyXG4gICAgICAgIGxpbmsoY2VsbCwgc2hvd0FjY291bnRTdHJpbmcpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1NhbGFyeUNvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLmF2Zy1zYWxhcnknKS5mb3JFYWNoKCAoY2VsbCkgPT4ge1xyXG4gICAgICAgIGxpbmsoY2VsbCwgc2hvd1NhbGFyeVByb2plY3Rpb24pO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1RvdGFsUGVyc29ubmVsQ29zdENvbCgpIHtcclxuICAgIC8vIGdldCBhbGwgcmVsZXZhbnQgY2VsbHNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnRvdGFsLWJhc2VsaW5lJykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dGaW5hbFBlcnNvbm5lbENvc3QpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gbGlua1RvdGFsT1RDb2woKSB7XHJcbiAgICAvLyBnZXQgYWxsIHJlbGV2YW50IGNlbGxzXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZC50b3RhbCcpLmZvckVhY2goIChjZWxsKSA9PiB7XHJcbiAgICAgICAgbGluayhjZWxsLCBzaG93RklDQSk7XHJcbiAgICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBsaW5rQ1BBQ29sKCkge1xyXG4gICAgLy8gZ2V0IGFsbCByZWxldmFudCBjZWxsc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQuY3BhJykuZm9yRWFjaCggKGNlbGwpID0+IHtcclxuICAgICAgICBsaW5rKGNlbGwsIHNob3dDUEEpO1xyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRvb2x0aXAgPSB7XHJcblxyXG4gICAgaGlkZSA6IGhpZGVUb29sdGlwLFxyXG4gICAgc2hvdyA6IHNob3dUb29sdGlwLFxyXG5cclxuICAgIGxpbmtBbGwgOiAoKSA9PiB7XHJcbiAgICAgICAgbGlua0FjY291bnRTdHJpbmdDb2woKTtcclxuICAgICAgICBzd2l0Y2goQ3VycmVudFBhZ2UubG9hZCgpKXtcclxuICAgICAgICAgICAgY2FzZSAncGVyc29ubmVsJyA6XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua1NhbGFyeUNvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua1RvdGFsUGVyc29ubmVsQ29zdENvbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ292ZXJ0aW1lJzpcclxuICAgICAgICAgICAgICAgIGxpbmtUb3RhbE9UQ29sKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ25vbnBlcnNvbm5lbCc6XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAgICAgbGlua0NQQUNvbCgpOyAgXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gY2FzZSAncmV2ZW51ZSc6XHJcbiAgICAgICAgICAgIC8vICAgICBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgJ25ldy1pbml0cyc6XHJcbiAgICAgICAgICAgIC8vICAgICBsaW5rQWNjb3VudFN0cmluZ0NvbCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICB1bmxpbmsgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgZGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXRhaWwnKTtcclxuICAgICAgICBkZXRhaWxzLmZvckVhY2goIChzcGFuKSA9PiB7XHJcbiAgICAgICAgICAgIHNwYW4ucmVtb3ZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcCIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpTT04oanNvbkZpbGVQYXRoKSB7XHJcbiAgcmV0dXJuIGZldGNoKGpzb25GaWxlUGF0aClcclxuICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvSlNPTih0YWJsZSwgY29sc1RvUmVtb3ZlID0gW10pe1xyXG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3M7XHJcbiAgICAvLyBFeHRyYWN0IGhlYWRlcnMgZnJvbSB0aGUgZmlyc3Qgcm93XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSByb3dzWzBdLmNlbGxzO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWFkZXJSb3cubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBoZWFkZXJzLnB1c2goaGVhZGVyUm93W2pdLmlubmVyVGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBkYXRhXHJcbiAgICB2YXIgdGFibGVEYXRhID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29scyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xzVG9SZW1vdmUuaW5jbHVkZXMoaGVhZGVyKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sc1tpbmRleF0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3N0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2hlYWRlcl0gPSBjb2xzW2luZGV4XS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbaGVhZGVyXSA9IGNvbHNbaW5kZXhdLmlubmVyVGV4dDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGFibGVEYXRhLnB1c2gocm93RGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGFibGVEYXRhKTtcclxufVxyXG5cclxuXHJcbiAgIiwiaW1wb3J0ICcuL3RhYmxlLmNzcyc7XHJcblxyXG5pbXBvcnQgQnV0dG9ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcydcclxuaW1wb3J0IENlbGwgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NlbGxzLmpzJ1xyXG5pbXBvcnQgQ29sdW1ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvY29sdW1ucy5qcydcclxuaW1wb3J0IEhlYWRlciBmcm9tICcuL3N1YmNvbXBvbmVudHMvaGVhZGVycy5qcydcclxuaW1wb3J0IFJvd3MgZnJvbSAnLi9zdWJjb21wb25lbnRzL3Jvd3MuanMnXHJcbmltcG9ydCBEYXRhIGZyb20gJy4vc3ViY29tcG9uZW50cy9kYXRhLmpzJ1xyXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4vc3ViY29tcG9uZW50cy9maWx0ZXJzLmpzJztcclxuXHJcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5qcyc7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0pTT04gfSBmcm9tIFwiLi4vLi4vdXRpbHMvSlNPTl9kYXRhX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XHJcbmltcG9ydCBDdXJyZW50RnVuZCBmcm9tICcuLi8uLi9tb2RlbHMvY3VycmVudF9mdW5kLmpzJztcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4uLy4uL21vZGVscy9jdXJyZW50X3BhZ2UuanMnO1xyXG5cclxuZnVuY3Rpb24gYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3Qpe1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgdGFibGUuc3R5bGUud2lkdGggPSB3aWR0aF9wY3Q7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHNob3dUYWJsZSgpe1xyXG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFibGUtY29udGFpbmVyJyk7XHJcbiAgICB0YWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBUYWJsZS5odG1sO1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgdGFibGUuc3R5bGUuZGlzcGxheSA9ICd0YWJsZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVUYWJsZSgpe1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0YWJsZSBvYmplY3QgZnJvbSB0YWJsZSBjb250YWluZXJcclxuICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYmxlLWNvbnRhaW5lcicpO1xyXG4gICAgdGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBCdXR0b25zLkFkZFJvdy5oaWRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhdmVUYWJsZURhdGEoKSB7XHJcbiAgICAvLyByZW1vdmUgdGhlIGRldGFpbCB0ZXh0XHJcbiAgICBUb29sdGlwLnVubGluaygpO1xyXG4gICAgLy8gZ2V0IHRhYmxlXHJcbiAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgLy8gZGV0ZXJtaW5lIHNhdmVfYXMgbmFtZVxyXG4gICAgaWYgKEN1cnJlbnRGdW5kLm51bWJlcigpKSB7XHJcbiAgICAgICAgdmFyIHNhdmVfYXMgPSBgJHtDdXJyZW50UGFnZS5sb2FkKCl9XyR7Q3VycmVudEZ1bmQubnVtYmVyKCl9YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIHNhdmVfYXMgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzYXZlX2FzLCBjb252ZXJ0VG9KU09OKHRhYmxlLCBbJ0VkaXQnXSkpO1xyXG4gICAgLy8gdXBkYXRlIHNpZGViYXIgd2l0aCBuZXcgZGF0YVxyXG4gICAgU2lkZWJhci51cGRhdGVUb3RhbHMoKTtcclxuICAgIC8vIHJlbGluaywgZGVwZW5kaW5nIG9uIHBhZ2VcclxuICAgIFRvb2x0aXAubGlua0FsbCgpO1xyXG59XHJcblxyXG5jb25zdCBUYWJsZSA9IHtcclxuICAgIGh0bWwgOiBgXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgbXQtMyBkaXNwbGF5XCIgaWQ9XCJtYWluLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBjbGFzcz1cInRoZWFkLWRhcmtcIj48L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHk+PC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPmAsXHJcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcclxuICAgIENlbGwgOiBDZWxsLFxyXG4gICAgQ29sdW1ucyA6IENvbHVtbnMsXHJcbiAgICBIZWFkZXIgOiBIZWFkZXIsXHJcbiAgICBSb3dzIDogUm93cyxcclxuICAgIERhdGEgOiBEYXRhLFxyXG4gICAgRmlsdGVyIDogRmlsdGVyLFxyXG4gICAgLy8gZnVuY3Rpb25zXHJcbiAgICBhZGp1c3RXaWR0aCA6IGZ1bmN0aW9uKHdpZHRoX3BjdCl7XHJcbiAgICAgICAgYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3QpXHJcbiAgICB9LFxyXG4gICAgY2xlYXIgOiBoaWRlVGFibGUsXHJcbiAgICBoaWRlIDogaGlkZVRhYmxlLFxyXG4gICAgc2hvdyA6IHNob3dUYWJsZSxcclxuICAgIHNhdmUgOiBzYXZlVGFibGVEYXRhXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhYmxlOyIsImltcG9ydCAnLi9hY2NvcmRpb24uY3NzJ1xyXG5cclxuXHJcbmltcG9ydCB7QmFzZWxpbmUsIEN1cnJlbnRGdW5kLCBGdW5kLCBTdXBwbGVtZW50YWwsIEZ1bmRMb29rdXBUYWJsZX0gZnJvbSAnLi4vLi4vbW9kZWxzJ1xyXG5pbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSwgY2xlYW5TdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlld19sb2dpYy5qcyc7XHJcbmltcG9ydCB7IEFwcHJvcHJpYXRpb24sIENvc3RDZW50ZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvZnVuZC5qcyc7XHJcblxyXG5mdW5jdGlvbiByZWRpcmVjdEZvckVkaXQoKXtcclxuICAgIC8vIGFjdGlvbiB0YWtlbiB3aGVuIHVzZXIgY2xpY2tzIG9uIGFueSBvZiB0aGUgZWRpdCBidXR0b25zIGluIHRoZSBhY2NvcmRpb25cclxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZ2ApO1xyXG4gICAgY29uc3QgdGFibGUgPSByb3cucGFyZW50RWxlbWVudDtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0YWJsZS5jbG9zZXN0KCcuc3VtbWFyeS1jb250YWluZXInKTtcclxuICAgIC8vIG5ldyBpbml0aWF0aXZlIGVkaXRzIHNob3VsZCBhbGwgcmVkaXJlY3QgdG8gdGhlIG5ldy1pbml0cyBwYWdlXHJcbiAgICBpZiAoc2VjdGlvbi5pZCA9PSAnc3VwcC1hY2NvcmRpb24nKXtcclxuICAgICAgICB2aXNpdFBhZ2UoJ25ldy1pbml0cycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gU3BsaXQgdGhlIHN0cmluZyBpbnRvIHBhcnRzIHVzaW5nICctJyBhcyB0aGUgZGVsaW1pdGVyOyByZXRhaW4gZnVuZCBhcyAxc3QgbnVtZXJpYyBzZWdtZW50XHJcbiAgICAgICAgY29uc3QgZnVuZCA9IHRhYmxlLmlkLnNwbGl0KCctJylbMV1cclxuICAgICAgICAvLyByZWNvcmQgdGhlIGZ1bmRcclxuICAgICAgICBDdXJyZW50RnVuZC51cGRhdGUoZnVuZCk7XHJcbiAgICAgICAgLy8gcmVjb3JkIHRoZSBhcHByb3ByaWF0aW9uIGFuZCBjb3N0IGNlbnRlclxyXG4gICAgICAgIGxldCBhcHByb3AgPSBuZXcgQXBwcm9wcmlhdGlvbihmdW5kLCB0YWJsZS5pZC5zcGxpdCgnLScpWzJdKTtcclxuICAgICAgICBsZXQgY2MgPSBuZXcgQ29zdENlbnRlcihmdW5kLCB0YWJsZS5pZC5zcGxpdCgnLScpWzJdLCB0YWJsZS5pZC5zcGxpdCgnLScpWzNdKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZmlsdGVyLWFwcHJvcC1uYW1lJywgYXBwcm9wLm5hbWUoKSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2ZpbHRlci1jYy1uYW1lJywgY2MuZ2V0TmFtZSgpKTtcclxuXHJcbiAgICAgICAgLy8gdmlzaXQgdGhlIGNvcnJlY3QgcGFnZSBmb3IgZWRpdGluZ1xyXG4gICAgICAgIGNvbnN0IGxpbmVJdGVtID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLWl0ZW0nKS50ZXh0Q29udGVudDtcclxuICAgICAgICBzd2l0Y2gobGluZUl0ZW0pe1xyXG4gICAgICAgICAgICBjYXNlICdQZXJzb25uZWwgRXhwZW5kaXR1cmVzJzpcclxuICAgICAgICAgICAgICAgIHZpc2l0UGFnZSgncGVyc29ubmVsJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnTm9uLVBlcnNvbm5lbCBFeHBlbmRpdHVyZXMnOlxyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCdub25wZXJzb25uZWwnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdSZXZlbnVlcyc6XHJcbiAgICAgICAgICAgICAgICB2aXNpdFBhZ2UoJ3JldmVudWUnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdPdmVydGltZSBFeHBlbmRpdHVyZXMnOlxyXG4gICAgICAgICAgICAgICAgdmlzaXRQYWdlKCdvdmVydGltZScpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOYW1lIG9mIGxpbmUgaXRlbSBpbiB0YWJsZSBkb2VzIG5vdCBtYXRjaCBhIHBhZ2UgZGVzdGluYXRpb24uJylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IEV4cGVuc2VUYWJsZSA9IHtcclxuICAgIHRhYmxlX2lkIDogKGFjY291bnRfc3RyaW5nKSA9PiB7IHJldHVybiBgdGFibGUtJHthY2NvdW50X3N0cmluZ31gIH0sXHJcbiAgICBpbml0KGFjY291bnRfc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIGVtcHR5IHRhYmxlIGFuZCBwdXQgaXQgaW4gdGhlIGFjY29yZGlvblxyXG4gICAgICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XHJcbiAgICAgICAgdGFibGUuaWQgPSB0aGlzLnRhYmxlX2lkKGFjY291bnRfc3RyaW5nKTtcclxuICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKCdhY2NvcmRpb24tdGFibGUnKTtcclxuICAgICAgICB2YXIgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3N0cmluZ18ke2FjY291bnRfc3RyaW5nfV9jb250ZW50IC5hY2NvcmRpb24tYm9keWApO1xyXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0YWJsZSk7XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlTmV3Q2VsbChjb250ZW50LCByb3csIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgIG5ld0NlbGwuaW5uZXJIVE1MID0gY29udGVudDtcclxuICAgICAgICBuZXdDZWxsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcclxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XHJcbiAgICB9LFxyXG4gICAgYWRkUm93KGFjY291bnRfc3RyaW5nLCByb3dfbmFtZSwgbnVtYmVyKXtcclxuICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhYmxlX2lkKGFjY291bnRfc3RyaW5nKSk7XHJcbiAgICAgICAgdmFyIG5ld19yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKG5ld19yb3cpO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIGNlbGwgZm9yIHRoZSBsaW5lIGl0ZW0gbGFiZWxcclxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0NlbGwocm93X25hbWUsIG5ld19yb3csICdsaW5lLWl0ZW0nKTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBjZWxsIGZvciB0aGUgYW1vdW50XHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdDZWxsKGZvcm1hdEN1cnJlbmN5KG51bWJlciksIG5ld19yb3csICdjb3N0Jyk7XHJcbiAgICAgICAgLy8gY3JlYXRlIEVkaXQgYnV0dG9uIFxyXG4gICAgICAgIHZhciBidXR0b24gPSAnJztcclxuICAgICAgICBpZiAocm93X25hbWUgIT0gJ1RvdGFsIEV4cGVuZGl0dXJlcycpe1xyXG4gICAgICAgICAgICBidXR0b24gPSBUYWJsZS5CdXR0b25zLkVkaXQuaHRtbChgRWRpdCBpbiB0YWJsZWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0NlbGwoYnV0dG9uLCBuZXdfcm93KTtcclxuICAgIH0sXHJcbiAgICBmaWxsRnJvbUZ1bmQoZnVuZCkge1xyXG4gICAgICAgIC8vIHVzZSBqdXN0IGZ1bmQgYXMgYWNjb3VudCBzdHJpbmcgdG8gaW5pdGlhbGl6ZSB0YWJsZSBpbnNpZGUgYWNjb3JkaW9uXHJcbiAgICAgICAgdGhpcy5pbml0KGZ1bmQpO1xyXG4gICAgICAgIGNvbnN0IGZ1bmRPYmplY3QgPSBuZXcgRnVuZChmdW5kKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIGEgcm93IGZvciBlYWNoIGFwcHJvcHJpYXRpb24gaW4gdGhlIGZ1bmRcclxuICAgICAgICBjb25zdCBpZCA9IGNsZWFuU3RyaW5nKGZ1bmQpO1xyXG5cclxuICAgICAgICBmdW5kT2JqZWN0LmdldEFwcHJvcHJpYXRpb25zKCkuZm9yRWFjaCggYXBwcm9wT2JqID0+IHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHRvdGFsIGZvciB0aGUgYXBwcm9wcmlhdGlvbiBpcyA+ICQwLCBhZGQgYW4gYWNjb3JkaW9uIGZvciBhbGwgdGhlIENDc1xyXG4gICAgICAgICAgICBpZiAoIGFwcHJvcE9iai50b3RhbCgpICE9IDAgKXtcclxuICAgICAgICAgICAgICAgIEl0ZW0uYWRkKGFwcHJvcE9iai5hY2NvdW50U3RyaW5nKCksIGAjc3RyaW5nXyR7aWR9X2NvbnRlbnQgLmFjY29yZGlvbi1ib2R5YCk7XHJcbiAgICAgICAgICAgICAgICBJdGVtLnVwZGF0ZUhlYWRlcihhcHByb3BPYmoubmFtZSgpLCBhcHByb3BPYmouYWNjb3VudFN0cmluZygpLCBhcHByb3BPYmoudG90YWwoKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGxGcm9tQXBwcm9wKGFwcHJvcE9iaik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSxcclxuICAgIGZpbGxGcm9tQXBwcm9wKGFwcHJvcE9iail7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdGFibGUgb2JqZWN0XHJcbiAgICAgICAgdGhpcy5pbml0KGFwcHJvcE9iai5hY2NvdW50U3RyaW5nKCkpO1xyXG4gICAgICAgIC8vIGFkZCBhIGNvbGxhcHNpYmxlIHJvdyBmb3IgZWFjaCBjb3N0IGNlbnRlclxyXG4gICAgICAgIGFwcHJvcE9iai5nZXRDb3N0Q2VudGVycygpLmZvckVhY2goIGNjT2JqID0+IHtcclxuICAgICAgICAgICAgaWYgKGNjT2JqLmdldFRvdGFsKCkgIT0gMCApe1xyXG4gICAgICAgICAgICAgICAgSXRlbS5hZGQoY2NPYmouYWNjb3VudFN0cmluZygpLCBgI3N0cmluZ18ke2FwcHJvcE9iai5hY2NvdW50U3RyaW5nKCl9X2NvbnRlbnQgLmFjY29yZGlvbi1ib2R5YCk7XHJcbiAgICAgICAgICAgICAgICBJdGVtLnVwZGF0ZUhlYWRlcihjY09iai5nZXROYW1lKCksIGNjT2JqLmFjY291bnRTdHJpbmcoKSwgY2NPYmouZ2V0VG90YWwoKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGxGcm9tQ0MoY2NPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBcclxuICAgIH0sXHJcbiAgICBmaWxsRnJvbUNDKGNjT2JqKXtcclxuICAgICAgICAvLyBpbml0aWFsaXplIGEgdGFibGUgYW5kIHN1bW1hcml6ZSB0aGUgbGluZSBpdGVtc1xyXG4gICAgICAgIHRoaXMuaW5pdChjY09iai5hY2NvdW50U3RyaW5nKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGNjT2JqLmFjY291bnRTdHJpbmcoKSwgJ1BlcnNvbm5lbCBFeHBlbmRpdHVyZXMnLCBjY09iai5nZXRQZXJzb25uZWxDb3N0KCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGNjT2JqLmFjY291bnRTdHJpbmcoKSwgJ092ZXJ0aW1lIEV4cGVuZGl0dXJlcycsIGNjT2JqLmdldE92ZXJ0aW1lQ29zdCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhjY09iai5hY2NvdW50U3RyaW5nKCksICdOb24tUGVyc29ubmVsIEV4cGVuZGl0dXJlcycsIGNjT2JqLmdldE5vblBlcnNvbm5lbENvc3QoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coY2NPYmouYWNjb3VudFN0cmluZygpLCAnUmV2ZW51ZXMnLCBjY09iai5nZXRSZXZlbnVlKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGNjT2JqLmFjY291bnRTdHJpbmcoKSwgJ1RvdGFsIEV4cGVuZGl0dXJlcycsIGNjT2JqLmdldFRvdGFsKCkpO1xyXG4gICAgfSxcclxuICAgIGZpbGxGcm9tSW5pdChwcm9ncmFtKSB7XHJcbiAgICAgICAgLy8gRmlsbCBvdXQgaW5mbyBmb3IgZWFjaCBzdXBwbGVtZW50YWwgaW5pdFxyXG4gICAgICAgIHRoaXMuaW5pdChwcm9ncmFtLmlkKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KHByb2dyYW0uaWQoKSwgJ0VzdGltYXRlZCBSZXZlbnVlJywgcHJvZ3JhbS5yZXZlbnVlKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KHByb2dyYW0uaWQoKSwgJ1BlcnNvbm5lbCBFeHBlbmRpdHVyZXMnLCBwcm9ncmFtLnBlcnNvbm5lbCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhwcm9ncmFtLmlkKCksICdOb24tUGVyc29ubmVsIE9wZXJhdGluZycsIHByb2dyYW0ub3BlcmF0aW5nKCkpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KHByb2dyYW0uaWQoKSwgJ05vbi1QZXJzb25uZWwgQ2FwaXRhbCcsIHByb2dyYW0uY2FwaXRhbCgpKTtcclxuICAgICAgICB0aGlzLmFkZFJvdyhwcm9ncmFtLmlkKCksICdUb3RhbCBFeHBlbmRpdHVyZXMnLCBwcm9ncmFtLnRvdGFsKCkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBJdGVtID0ge1xyXG4gICAgYWNjb3VudFN0cmluZyhmdW5kLCBhcHByb3AgPSAnJywgY2MgPSAnJykge1xyXG4gICAgICAgIHZhciBhY2NvdW50X3N0cmluZyA9IGNsZWFuU3RyaW5nKGZ1bmQpO1xyXG4gICAgICAgIGlmIChhcHByb3ApIHsgYWNjb3VudF9zdHJpbmcgKz0gYXBwcm9wIH07XHJcbiAgICAgICAgaWYgKGNjKSB7IGFjY291bnRfc3RyaW5nICs9IGNjIH07XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnRfc3RyaW5nO1xyXG4gICAgfSxcclxuICAgIGh0bWwoYWNjb3VudF9zdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiBgPGgyIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiIGlkPVwic3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9X2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY2NvcmRpb24tYnV0dG9uIGNvbGxhcHNlZFwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCIgZGF0YS1icy10YXJnZXQ9XCIjc3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9X2NvbnRlbnRcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPVwic3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbW91bnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInN0cmluZ18ke2FjY291bnRfc3RyaW5nfV9jb250ZW50XCIgY2xhc3M9XCJhY2NvcmRpb24tY29sbGFwc2UgY29sbGFwc2VcIiBhcmlhLWxhYmVsbGVkYnk9XCJzdHJpbmdfJHthY2NvdW50X3N0cmluZ31faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICB9LFxyXG4gICAgYWRkIDogZnVuY3Rpb24oYWNjb3VudF9zdHJpbmcsIGFjY29yZGlvbl9xdWVyeSkge1xyXG4gICAgICAgIC8vIGdldCBhY2NvcmRpb24gYW5kIGFkZCBhIG5ldyBpdGVtIHRvIGl0XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhY2NvcmRpb25fcXVlcnkpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGl0ZW1fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY2NvcmRpb24taXRlbScpO1xyXG4gICAgICAgIGl0ZW1fZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLmh0bWwoYWNjb3VudF9zdHJpbmcpO1xyXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChpdGVtX2VsZW1lbnQpO1xyXG4gICAgfSxcclxuICAgIEV4cGVuc2VUYWJsZSA6IEV4cGVuc2VUYWJsZSxcclxuICAgIHVwZGF0ZUhlYWRlciA6IGZ1bmN0aW9uKHRpdGxlLCBhY2NvdW50X3N0cmluZywgbmV3X2Ftb3VudCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcl9idG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjc3RyaW5nXyR7YWNjb3VudF9zdHJpbmd9X2hlYWRlciBidXR0b25gKTtcclxuICAgICAgICBoZWFkZXJfYnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4ubmFtZScpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICAgICAgaGVhZGVyX2J0bi5xdWVyeVNlbGVjdG9yKCdzcGFuLmFtb3VudCcpLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X2Ftb3VudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IEFkZEluaXRCdXR0b24gPSB7XHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tYWRkLWluaXQnKTtcclxuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB2aXNpdFBhZ2UoJ25ldy1pbml0cycpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBBY2NvcmRpb24gPSB7XHJcbiAgICBJdGVtIDogSXRlbSxcclxuICAgIEFkZEluaXRCdXR0b246IEFkZEluaXRCdXR0b24sXHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKXtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWNjb3JkaW9uLWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgLy8gcmVzZXQgdG8gZGVsZXRlIGNvbnRlbnRcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmFzZWxpbmUtYWNjb3JkaW9uIC5zdW1tYXJ5LWFjY29yZGlvbicpLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdXBwLWFjY29yZGlvbiAuc3VtbWFyeS1hY2NvcmRpb24nKS5pbm5lckhUTUwgPSAnJztcclxuICAgIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKXtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWNjb3JkaW9uLWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIGNyZWF0ZUJhc2VsaW5lKCl7XHJcbiAgICAgICAgdmFyIGZ1bmRzID0gRnVuZExvb2t1cFRhYmxlLmxpc3RGdW5kcygpO1xyXG4gICAgICAgIGZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgICAgIEl0ZW0uYWRkKGZ1bmQsICcjYmFzZWxpbmUtYWNjb3JkaW9uIC5zdW1tYXJ5LWFjY29yZGlvbicpO1xyXG4gICAgICAgICAgICBJdGVtLkV4cGVuc2VUYWJsZS5maWxsRnJvbUZ1bmQoZnVuZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bmRPYmplY3QgPSBuZXcgRnVuZChmdW5kKTtcclxuICAgICAgICAgICAgSXRlbS51cGRhdGVIZWFkZXIoYEZ1bmQgJHtGdW5kTG9va3VwVGFibGUuZ2V0TmFtZShmdW5kKX1gLCBmdW5kLCBmdW5kT2JqZWN0LmdldFRvdGFsKCkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb2xvci1jb2RlIEdGIGJhc2VsaW5lXHJcbiAgICAgICAgY29uc3QgR0YgPSBuZXcgRnVuZCgxMDAwKTtcclxuICAgICAgICAvLyB0ZXh0IHRvIGNvbG9yIGNvZGVcclxuICAgICAgICBsZXQgdG9wbGluZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdHJpbmdfMTAwMF9oZWFkZXIgLmFtb3VudCcpO1xyXG4gICAgICAgIGlmIChHRi5nZXRUb3RhbCgpIDw9IEJhc2VsaW5lLnRhcmdldCgpKXtcclxuICAgICAgICAgICAgdG9wbGluZS5zdHlsZS5jb2xvciA9ICdncmVlbic7XHJcbiAgICAgICAgICAgIHRvcGxpbmUuc3R5bGUud2VpZ2h0ID0gNDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRvcGxpbmUuc3R5bGUuY29sb3IgPSAncmVkJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlU3VwcCgpIHtcclxuICAgICAgICBjb25zdCBzdXBwID0gbmV3IFN1cHBsZW1lbnRhbDtcclxuICAgICAgICBzdXBwLmluaXRpYXRpdmVzLmZvckVhY2gocHJvZ3JhbSA9PiB7XHJcbiAgICAgICAgICAgIEl0ZW0uYWRkKHByb2dyYW0uaWQoKSwgJyNzdXBwLWFjY29yZGlvbiAuc3VtbWFyeS1hY2NvcmRpb24nKTtcclxuICAgICAgICAgICAgSXRlbS5FeHBlbnNlVGFibGUuZmlsbEZyb21Jbml0KHByb2dyYW0pO1xyXG4gICAgICAgICAgICBJdGVtLnVwZGF0ZUhlYWRlcihwcm9ncmFtLm5hbWUsIHByb2dyYW0uaWQoKSwgcHJvZ3JhbS50b3RhbCgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBidWlsZCgpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUJhc2VsaW5lKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdXBwKCk7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBlZGl0IGJ1dHRvbnNcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChyZWRpcmVjdEZvckVkaXQpO1xyXG4gICAgICAgIHRoaXMuQWRkSW5pdEJ1dHRvbi5pbml0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb247XHJcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maWxlX3VwbG9hZC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maWxlX3VwbG9hZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBmaWxlX3VwbG9hZC5qc1xyXG5pbXBvcnQgJy4vZmlsZV91cGxvYWQuY3NzJztcclxuaW1wb3J0IHsgcHJvY2Vzc1dvcmtib29rIH0gZnJvbSBcIi4uLy4uL3V0aWxzL1hMU1hfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZpbGVVcGxvYWQgPSB7XHJcbiAgICBpbml0IDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmRpc2FibGUoKTtcclxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWlucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHsgcmVhZFhMKGV2ZW50KSB9KTtcclxuICAgIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKXtcclxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWlucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRPYmplY3Quc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgfSxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IGlucHV0T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTtcclxuICAgICAgICBpbnB1dE9iamVjdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gcmVhZFhMKGV2ZW50KSB7XHJcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdOyAvLyByZWFkIHVwbG9hZGVkIGZpbGVcclxuICAgIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLXNwaW5uZXInKTsgLy8gZ2V0IHRoZSBzcGlubmVyIGVsZW1lbnRcclxuXHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXJcclxuICAgICAgICBzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAvLyByZWFkIGluIG5ldyBkYXRhXHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzV29ya2Jvb2soYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgb25jZSBwcm9jZXNzaW5nIGlzIGRvbmVcclxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTsgLy8gRW5hYmxlIHRoZSBuZXh0IGJ1dHRvbiBhZnRlciBwcm9jZXNzaW5nXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHdvcmtib29rOicsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBIaWRlIHRoZSBzcGlubmVyIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTsgLy8gRW5zdXJlIHRoZSBidXR0b24gaXMgcmUtZW5hYmxlZCBpbiBjYXNlIG9mIGFuIGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgZmlsZTonLCBlcnIpO1xyXG5cclxuICAgICAgICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBpbiBjYXNlIG9mIGFuIGVycm9yXHJcbiAgICAgICAgICAgIHNwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpOyAvLyBFbnN1cmUgdGhlIGJ1dHRvbiBpcyByZS1lbmFibGVkIGluIGNhc2Ugb2YgYW4gZXJyb3JcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7IC8vIFJlYWQgdGhlIGZpbGUgYXMgYW4gQXJyYXlCdWZmZXJcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsZVVwbG9hZDsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbW9kYWwuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbW9kYWwuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL21vZGFsLmNzcyc7XHJcblxyXG5mdW5jdGlvbiBjbGVhck1vZGFsKCkge1xyXG4gICAgdXBkYXRlTW9kYWxUaXRsZSgnJyk7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtYm9keScpLmlubmVySFRNTCA9ICcnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlTW9kYWwoKSB7XHJcbiAgICAkKCcjbWFpbi1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICQoJyNtYWluLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd01vZGFsSGFuZGxlcigpIHtcclxuICAgIHNob3dNb2RhbCgnbWFpbi1tb2RhbCcpO1xyXG59XHJcblxyXG5jb25zdCBTdWJtaXQgPSB7XHJcbiAgICBoYW5kbGVyOiBudWxsLFxyXG5cclxuICAgIGluaXQ6IGZ1bmN0aW9uKG9uU3VibWl0KSB7XHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1tb2RhbCcpO1xyXG5cclxuICAgICAgICAvLyBEZWluaXRpYWxpemUgZmlyc3QgdG8gYXZvaWQgbXVsdGlwbGUgYmluZGluZ3NcclxuICAgICAgICB0aGlzLmRlaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBvblN1Ym1pdChldmVudCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gQWRkaW5nIHRoZSBoYW5kbGVyIGFzIHRoZSBldmVudCBsaXN0ZW5lclxyXG4gICAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuaGFuZGxlcik7XHJcblxyXG4gICAgICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciB0byBlbmFibGUgY2xvc2UgeFxyXG4gICAgICAgIGNvbnN0IHggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcjbW9kYWwtY2xvc2UteCcpO1xyXG4gICAgICAgIHguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlTW9kYWwpO1xyXG4gICAgfSxcclxuXHJcbiAgICBkZWluaXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcclxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92aW5nIHRoZSBldmVudCBsaXN0ZW5lciBhbmQgY2xlYXIgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgbW9kYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgdGhpcy5oYW5kbGVyKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lciB0byBlbmFibGUgY2xvc2UgeFxyXG4gICAgICAgIGNvbnN0IHggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcjbW9kYWwtY2xvc2UteCcpO1xyXG4gICAgICAgIHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlTW9kYWwpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgTGluayA9IHtcclxuICAgIGFkZCA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbEhhbmRsZXIpO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZSA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbEhhbmRsZXIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcclxufVxyXG5cclxuY29uc3QgVGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbih0aXRsZSkge1xyXG4gICAgICAgIHVwZGF0ZU1vZGFsVGl0bGUodGl0bGUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE1vZGFsID0ge1xyXG4gICAgaGlkZTogaGlkZU1vZGFsLFxyXG4gICAgc2hvdzogc2hvd01vZGFsLFxyXG4gICAgY2xlYXI6IGNsZWFyTW9kYWwsXHJcbiAgICBUaXRsZTogVGl0bGUsXHJcbiAgICBMaW5rOiBMaW5rLFxyXG4gICAgU3VibWl0OiBTdWJtaXRcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGFsOyIsImltcG9ydCAnLi9ib2R5LmNzcyc7XHJcblxyXG5pbXBvcnQgV2VsY29tZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5qcydcclxuaW1wb3J0IEFjY29yZGlvbiBmcm9tICcuLi9hY2NvcmRpb24vYWNjb3JkaW9uLmpzJztcclxuaW1wb3J0IEZpbGVVcGxvYWQgZnJvbSAnLi4vZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuanMnO1xyXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vbW9kYWwvbW9kYWwuanMnO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tICcuLi9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XHJcbmltcG9ydCBQcm9tcHQgZnJvbSAnLi4vcHJvbXB0L3Byb21wdC5qcyc7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5qcyc7ICBcclxuXHJcbmZ1bmN0aW9uIHJlc2V0UGFnZSgpIHtcclxuICAgIC8vIGhpZGUgZXZlcnl0aGluZyBpbiB0aGUgYm9keVxyXG4gICAgV2VsY29tZS5oaWRlKCk7XHJcbiAgICBNb2RhbC5jbGVhcigpO1xyXG4gICAgTW9kYWwuaGlkZSgpO1xyXG4gICAgTmF2QnV0dG9ucy5oaWRlKCk7XHJcbiAgICBOYXZCdXR0b25zLlJldHVyblRvU3VtbWFyeS5oaWRlKCk7XHJcbiAgICBQcm9tcHQuaGlkZSgpO1xyXG4gICAgVGFibGUuaGlkZSgpO1xyXG4gICAgU2lkZWJhci5oaWRlKCk7XHJcbiAgICBBY2NvcmRpb24uaGlkZSgpO1xyXG4gICAgRmlsZVVwbG9hZC5oaWRlKCk7XHJcbiAgICBUb29sdGlwLmhpZGUoKTtcclxuXHJcbiAgICAvLyByZXNldCBmaWx0ZXIgZHJvcGRvd25zXHJcbiAgICBUYWJsZS5GaWx0ZXIuZGVsZXRlQWxsKCk7XHJcblxyXG4gICAgUHJvbXB0LkJ1dHRvbnMucmVzZXQoKTtcclxuICAgIC8vIGRpc2FibGUgc3VibWl0IGJ1dHRvblxyXG4gICAgTW9kYWwuU3VibWl0LmRlaW5pdCgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQm9keSA9IHtcclxuICAgIHJlc2V0IDogcmVzZXRQYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJvZHk7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2hlYWRlci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9oZWFkZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL2hlYWRlci5jc3MnO1xyXG5cclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gJy4uLy4uL21vZGVscy9jdXJyZW50X2Z1bmQnO1xyXG5pbXBvcnQgeyBGSVNDQUxfWUVBUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XHJcblxyXG5leHBvcnQgY29uc3QgVGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbih0aXRsZSl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG4gICAgfSxcclxuICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoYEZZJHtGSVNDQUxfWUVBUn0gQnVkZ2V0IFJlcXVlc3RgKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VidGl0bGUgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihzdWJ0aXRsZSl7XHJcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgZnVuZFxyXG4gICAgICAgIHZhciBmdW5kID0gQ3VycmVudEZ1bmQubmFtZSgpO1xyXG4gICAgICAgIGlmIChmdW5kKXtcclxuICAgICAgICAgICAgdmFyIHN1YnRpdGxlID0gYCR7c3VidGl0bGV9OiAke2Z1bmR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xyXG4gICAgfVxyXG59IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2Zvcm0uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBmdW5jdGlvbiB0byBhZGQgcXVlc3Rpb25zIHRvIGZvcm1zXHJcblxyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vZHJvcGRvd25cIjtcclxuXHJcbi8vIGlucHV0VHlwZSBpcyBmb3IgdmFsaWRhdGlvbiAoJ251bWJlcicgb3IgJ3RleHQnLCBldGMpXHJcbmZ1bmN0aW9uIGFwcGVuZEZvcm1FbGVtZW50KGxhYmVsLCBpbnB1dEVsLCBpbnB1dElkLCByZXF1aXJlZCkge1xyXG5cclxuICAgIC8vIGNoYW5nZSBpZiB3ZSB3YW50IGZvcm1zIGVsc2V3aGVyZVxyXG4gICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctZm9ybScpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBvdXRlciB3cmFwcGVyIGZvciBlbGVtZW50XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7ICBcclxuXHJcbiAgICAvLyBsYWJlbCBxdWVzdGlvblxyXG4gICAgY29uc3QgbGFiZWxFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICBsYWJlbEVsLnRleHRDb250ZW50ID0gbGFiZWw7XHJcblxyXG4gICAgLy8gbWFyayBhcyByZXF1aXJlZCBpZiBhcHBsaWNhYmxlXHJcbiAgICBpbnB1dEVsLnJlcXVpcmVkID0gcmVxdWlyZWQ7XHJcblxyXG4gICAgLy8gSWYgYW4gSUQgaXMgcHJvdmlkZWQsIHNldCBpdCBvbiB0aGUgZWxlbWVudFxyXG4gICAgaWYgKGlucHV0SWQpIHtcclxuICAgICAgICAvL2lucHV0RWwuaWQgPSBgaW5wdXQtJHtpbnB1dElkfWA7XHJcbiAgICAgICAgaW5wdXRFbC5pZCA9IGlucHV0SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIHZhbGlkYXRpb24gdGV4dC8gYSBwbGFjZSB0byBkaXNwbGF5IGVycm9yc1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICB2YWxpZGF0aW9uVGV4dC5pZCA9IGAke2lucHV0SWR9LXZhbGlkYXRpb25gO1xyXG4gICAgdmFsaWRhdGlvblRleHQuY2xhc3NMaXN0LmFkZCgnZXJyb3ItbWVzc2FnZScpO1xyXG4gICAgdmFsaWRhdGlvblRleHQuc3R5bGUuY29sb3IgPSAncmVkJztcclxuICBcclxuICAgIC8vIGFkZCBlbGVtZW50c1xyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChsYWJlbEVsKTtcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW5wdXRFbCk7XHJcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHZhbGlkYXRpb25UZXh0KTtcclxuICAgIGZvcm0uYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcbn0gXHJcblxyXG5leHBvcnQgY29uc3QgTmV3RmllbGQgPSB7XHJcbiAgICBzaG9ydFRleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIGlucHV0RWwudHlwZSA9ICd0ZXh0JztcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCwgcmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIGxvbmdUZXh0IDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudChsYWJlbCwgaW5wdXRFbCwgaW5wdXRJZCwgcmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIG51bWVyaWNJbnB1dCA6IGZ1bmN0aW9uKGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRFbC50eXBlID0gJ251bWJlcic7XHJcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQobGFiZWwsIGlucHV0RWwsIGlucHV0SWQscmVxdWlyZWQpO1xyXG4gICAgfSxcclxuICAgIGRyb3Bkb3duIDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIG9wdGlvbkFycmF5LCByZXF1aXJlZCA9IGZhbHNlKXtcclxuICAgICAgICB2YXIgaW5wdXRFbCA9IERyb3Bkb3duLmNyZWF0ZShvcHRpb25BcnJheSk7XHJcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQobGFiZWwsIGlucHV0RWwsIGlucHV0SWQsIHJlcXVpcmVkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTmV3RmllbGQ7IiwiZnVuY3Rpb24gYWRkU3VibWl0QnV0dG9uVG9Gb3JtKGZvcm1faWQpIHtcclxuICAgIC8vIEZpbmQgdGhlIGZvcm0gYnkgaXRzIElEXHJcbiAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybV9pZCk7XHJcbiAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lciBgZGl2YCBmb3IgdGhlIGJ1dHRvblxyXG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBidXR0b25Db250YWluZXIuaWQgPSAnc3VibWl0LWJ0bi1jb250YWluZXInO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIHN1Ym1pdCBpbnB1dFxyXG4gICAgY29uc3Qgc3VibWl0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgc3VibWl0SW5wdXQuY2xhc3NOYW1lID0gJ2J0biBidG4tc3VibWl0JzsgLy8gVXNlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB5b3VyIGRlc2lnblxyXG4gICAgc3VibWl0SW5wdXQudHlwZSA9ICdzdWJtaXQnO1xyXG4gICAgc3VibWl0SW5wdXQudmFsdWUgPSAnU3VibWl0JztcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHN1Ym1pdCBpbnB1dCB0byB0aGUgY29udGFpbmVyXHJcbiAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoc3VibWl0SW5wdXQpO1xyXG4gICAgXHJcbiAgICAvLyBBcHBlbmQgdGhlIGNvbnRhaW5lciB0byB0aGUgZm9ybVxyXG4gICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uID0ge1xyXG4gICAgYWRkIDogZnVuY3Rpb24oKSB7IGFkZFN1Ym1pdEJ1dHRvblRvRm9ybSgnbmV3LWZvcm0nKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Ym1pdEJ1dHRvbjsiLCJpbXBvcnQgJy4vZm9ybS5jc3MnO1xyXG5cclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcclxuaW1wb3J0IE5ld0ZpZWxkIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZmllbGRzLmpzXCI7XHJcbmltcG9ydCBTdWJtaXRCdXR0b24gZnJvbSBcIi4vc3ViY29tcG9uZW50cy9zdWJtaXQuanNcIjtcclxuXHJcbmZ1bmN0aW9uIGZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KSB7XHJcblxyXG4gICAgLy8gQXNzdW1pbmcgYGV2ZW50LnRhcmdldGAgaXMgdGhlIGZvcm0gaXRzZWxmXHJcbiAgICBjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIGlucHV0IHZhbHVlc1xyXG4gICAgbGV0IGZvcm1EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGZvcm0gZWxlbWVudFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBmb3JtLmVsZW1lbnRzW2ldO1xyXG4gICAgICBcclxuICAgICAgLy8gRXhjbHVkZSBlbGVtZW50cyB0aGF0IGFyZW4ndCBpbnB1dHMsIHRleHRhcmVhcywgb3Igc2VsZWN0XHJcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHxcclxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fFxyXG4gICAgICAgICAgZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xyXG4gICAgICAgIC8vIEV4Y2x1ZGUgaW5wdXQgdHlwZXMgdGhhdCBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIHN1Ym1pc3Npb24gKHN1Y2ggYXMgYHN1Ym1pdGApXHJcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ3N1Ym1pdCcgJiYgZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJykge1xyXG4gICAgICAgICAgZm9ybURhdGFbZWxlbWVudC5pZF0gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmb3JtLnJlc2V0KCk7XHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEZvcm0oZWxlbWVudF9pZCA9ICdtb2RhbC1ib2R5JywgZm9ybV9pZCA9ICduZXctZm9ybScpIHtcclxuICBcclxuICBjb25zdCB0YXJnZXRfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRfaWQpO1xyXG5cclxuICAvLyBjcmVhdGUgZm9ybVxyXG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XHJcbiAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2lkJywgZm9ybV9pZCk7XHJcblxyXG4gIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgbW9kYWwgYm9keVxyXG4gIHRhcmdldF9lbGVtLmFwcGVuZENoaWxkKGZvcm0pO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEZvcm0gPSB7XHJcbiAgbmV3IDogZnVuY3Rpb24ocGFyZW50X2VsZW1faWQpIHsgYWRkRm9ybShwYXJlbnRfZWxlbV9pZCwgJ25ldy1mb3JtJykgfSxcclxuICBmZXRjaEFsbFJlc3BvbnNlcyA6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBmZXRjaEFsbFJlc3BvbnNlcyhldmVudCkgfSxcclxuICBOZXdGaWVsZCA6IE5ld0ZpZWxkLFxyXG4gIERyb3Bkb3duIDogRHJvcGRvd24sXHJcbiAgU3VibWl0QnV0dG9uIDogU3VibWl0QnV0dG9uXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwiaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qc1wiO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tIFwiLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qc1wiO1xyXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcclxuaW1wb3J0IHsgU3VidGl0bGUsIFRpdGxlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qc1wiO1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qc1wiO1xyXG5pbXBvcnQgRmlsdGVyIGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvZmlsdGVycy5qc1wiO1xyXG5pbXBvcnQgeyBDdXJyZW50UGFnZSwgQWNjb3VudFN0cmluZywgRnVuZExvb2t1cFRhYmxlIH0gZnJvbSAnLi4vbW9kZWxzLydcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gcGFnZSBzdGF0ZSBpbiBsb2NhbCBzdG9yYWdlXHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJyc7XHJcblxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gZGlzcGxheVxyXG4gICAgICAgIHRoaXMubmF2QnV0dG9ucyA9IHRydWU7IFxyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIHRleHQgdG8gc2hvdyBpbiB0aGUgcHJvbXB0IGFyZWFcclxuICAgICAgICB0aGlzLnByb21wdCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIHN1YnRpdGxlIHRleHRcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJyc7XHJcblxyXG4gICAgICAgIC8vIHRhYmxlIG9iamVjdCBvZiBjbGFzcyBWaWV3VGFibGUgb3IgbnVsbFxyXG4gICAgICAgIHRoaXMudGFibGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIC8vIHVwZGF0ZSBwYWdlIHN0YXRlXHJcbiAgICAgICAgQ3VycmVudFBhZ2UudXBkYXRlKHRoaXMucGFnZV9zdGF0ZSk7XHJcblxyXG4gICAgICAgIC8vIHN0YXJ0IHdpdGggYSBibGFuayBwYWdlXHJcbiAgICAgICAgQm9keS5yZXNldCgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgZGVmYXVsdCB0aXRsZVxyXG4gICAgICAgIFRpdGxlLmRlZmF1bHQoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBkZWZhdWx0IHRvIHNob3dpbmcgbmF2YnV0dG9uc1xyXG4gICAgICAgIGlmICh0aGlzLm5hdkJ1dHRvbnMpIHsgXHJcbiAgICAgICAgICAgIC8vIGlmIGFsbCB0aGUgZnVuZHMgYXJlIGZpbGxlZCBvdXQsIGFzc3VtZSB5b3UgY2FtZSBmcm9tIHRoZSBzdW1tYXJ5IHBhZ2UgXHJcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIG9ubHkgc2hvdyByZXR1cm4gYnV0dG9uIGFuZCBub3QgbmF2IGJ1dHRvbnNcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuUGFnZXMgPSBbJ3JldmVudWUnLCAnbm9ucGVyc29ubmVsJywgJ292ZXJ0aW1lJywgJ3BlcnNvbm5lbCddO1xyXG4gICAgICAgICAgICBpZiAoIUZ1bmRMb29rdXBUYWJsZS5mdW5kc0xlZnQoKSAmJiByZXR1cm5QYWdlcy5pbmNsdWRlcyhDdXJyZW50UGFnZS5sb2FkKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBOYXZCdXR0b25zLlJldHVyblRvU3VtbWFyeS5zaG93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgICAgIE5hdkJ1dHRvbnMuc2hvdygpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZGVmYXVsdCB0byBzaG93aW5nIHNpZGViYXJcclxuICAgICAgICBpZiAodGhpcy5zaWRlYmFyKSB7IFNpZGViYXIuc2hvdygpIH07XHJcblxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgcHJvbXB0IHRleHQgYW5kIGJ1dHRvbnNcclxuICAgICAgICBpZiAodGhpcy5wcm9tcHQpIHsgUHJvbXB0LlRleHQudXBkYXRlKHRoaXMucHJvbXB0KSB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGFibGVcclxuICAgICAgICBpZiAodGhpcy50YWJsZSkgeyB0aGlzLnRhYmxlLmJ1aWxkKCk7IH1cclxuXHJcbiAgICAgICAgLy8gc2hvdyBwYWdlIHN1YnRpdGxlXHJcbiAgICAgICAgaWYgKHRoaXMuc3VidGl0bGUpIHsgU3VidGl0bGUudXBkYXRlKHRoaXMuc3VidGl0bGUpIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW51cCgpIHsgXHJcbiAgICAgICAgRmlsdGVyLnJlc2V0QWxsRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvLyBFbnN1cmUgbWV0aG9kcyByZXRhaW4gdGhlIGNvcnJlY3QgYHRoaXNgIGNvbnRleHRcclxuICAgICAgICB0aGlzLnN1Ym1pdE5ld1JvdyA9IHRoaXMuc3VibWl0TmV3Um93LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQgU3RyaW5nJywgY2xhc3NOYW1lOiAnYWNjb3VudC1zdHJpbmcnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdBcHByb3ByaWF0aW9uIE5hbWUnLCBjbGFzc05hbWU6ICdhcHByb3AtbmFtZScsIGhpZGU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0FwcHJvcHJpYXRpb24nLCBjbGFzc05hbWU6ICdhcHByb3AnLCBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdDb3N0IENlbnRlciBOYW1lJywgY2xhc3NOYW1lOiAnY2MtbmFtZScsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdDb3N0IENlbnRlcicsIGNsYXNzTmFtZTogJ2NjJywgIGhpZGU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0Z1bmQgTmFtZScsIGNsYXNzTmFtZTogJ2Z1bmQtbmFtZScsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGdW5kJywgY2xhc3NOYW1lOiAnZnVuZCcsICBoaWRlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdFZGl0JywgY2xhc3NOYW1lOiAnZWRpdCcgfSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gYWRkIGFuIGVkaXQgY29sdW1uXHJcbiAgICAgICAgdGhpcy5hZGRFZGl0ID0gdHJ1ZSA7XHJcblxyXG4gICAgICAgIC8vIG1lc3NhZ2UgdG8gc2hvdyBpZiB0aGVyZSdzIG5vIHNhdmVkIGRhdGFcclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSBudWxsO1xyXG4gICBcclxuICAgICAgICAvLyB0ZXh0IHRvIHNob3cgZm9yIG5ldyByb3cgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b25UZXh0ID0gbnVsbCA7XHJcblxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gc2hvdyBhcyBhIGRhdGF0YWJsZVxyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWZyZXNoRGF0YSgpIHtcclxuICAgICAgICBcclxuICAgICAgICAvLyBjaGVjayBmb3IgZGF0YVxyXG4gICAgICAgIGF3YWl0IFRhYmxlLkRhdGEubG9hZCgpO1xyXG5cclxuICAgICAgICAvLyBjcmVhdGUgYSBkYXRhdGFibGUgb2JqZWN0XHJcbiAgICAgICAgaWYodGhpcy5kYXRhVGFibGUpe3RoaXMuaW5pdERhdGFUYWJsZSgpfVxyXG5cclxuICAgICAgICAvLyBhZGQgYW4gZWRpdCBjb2x1bW4gaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkRWRpdCkgeyBcclxuICAgICAgICAgICAgVGFibGUuQ29sdW1ucy5hZGRBdEVuZChUYWJsZS5CdXR0b25zLmVkaXRfY29uZmlybV9idG5zLCAnRWRpdCcpOyBcclxuICAgICAgICAgICAgLy8gYWN0aXZhdGUgZWRpdCBidXR0b25zXHJcbiAgICAgICAgICAgIFRhYmxlLkJ1dHRvbnMuRWRpdC5pbml0KHRoaXMuYWN0aW9uT25FZGl0LCB0aGlzLnVwZGF0ZVRhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gYXNzaWduIHRoZSBjb3JyZWN0IGNsYXNzZXMgYmFzZWQgb24gdGhlIHRhYmxlIGNvbHVtbnNcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgLy8gQXBwbHkgYW55IHVwZGF0ZSBmdW5jdGlvbiB0byBtYWtlIHN1cmUgc2lkZWJhciBpcyB1cCB0byBkYXRlXHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJsZSgpO1xyXG4gICAgICAgIC8vIGFkZCBhbnkgbmV3bHkgY3JlYXRlZCBjYyBvciBhcHByb3AgdG8gdGhlIGZpbHRlcnNcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYnVpbGQoKSB7XHJcbiAgICAgICAgLy8gYnVpbGQgdGFibGUgZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCBpbml0aWFsaXplIGVkaXQgYnV0dG9uc1xyXG5cclxuICAgICAgICAvLyBhZGQgdGhlIGFkZCBuZXcgcm93IGJ1dHRvbiBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5hZGRCdXR0b25UZXh0KSB7IFxyXG4gICAgICAgICAgICB0aGlzLnNldFVwRm9ybSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRhdGFcclxuICAgICAgICBpZihhd2FpdCBUYWJsZS5EYXRhLmxvYWQoKSkgeyAgXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgZGF0YSwgdXBkYXRlIHRoZSB0YWJsZSBhbmQgYWRkIGZpbHRlcnMgIFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbHRlcnMoKTsgIFxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc2hvdyBhIG1lc3NhZ2UgaWYgdGhlcmUncyBubyBzYXZlZCB0YWJsZSBkYXRhIGZvciB0aGUgc2VsZWN0ZWQgZnVuZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub0RhdGFNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBQcm9tcHQuVGV4dC51cGRhdGUodGhpcy5ub0RhdGFNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRGaWx0ZXJzKCkge1xyXG4gICAgICAgIC8vIEFkZCBhbGwgcmVsZXZhbnQgZmlsdGVycyB0byB0YWJsZVxyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2FwcHJvcC1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdBcHByb3ByaWF0aW9uJywgJ2FwcHJvcC1uYW1lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2NjLW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci5hZGQoJ0Nvc3QgQ2VudGVyJywgJ2NjLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci5hZGQoJ09iamVjdCcsICdvYmplY3QtbmFtZScpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LWNhdGVnb3J5Jykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIuYWRkKCdPYmplY3QgQ2F0ZWdvcnknLCAnb2JqZWN0LWNhdGVnb3J5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUZpbHRlcnMoKSB7XHJcbiAgICAgICAgLy8gdXBkYXRlIGZpbHRlcnMgd2l0aCBhbnkgbmV3IHZhbHVlc1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLmNsYXNzTmFtZSA9PT0gJ2FwcHJvcC1uYW1lJykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIudXBkYXRlT3B0aW9ucygnYXBwcm9wLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnY2MtbmFtZScpKXtcclxuICAgICAgICAgICAgVGFibGUuRmlsdGVyLnVwZGF0ZU9wdGlvbnMoJ2NjLW5hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LW5hbWUnKSl7XHJcbiAgICAgICAgICAgIFRhYmxlLkZpbHRlci51cGRhdGVPcHRpb25zKCdvYmplY3QtbmFtZScpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4uY2xhc3NOYW1lID09PSAnb2JqZWN0LWNhdGVnb3J5Jykpe1xyXG4gICAgICAgICAgICBUYWJsZS5GaWx0ZXIudXBkYXRlT3B0aW9ucygnb2JqZWN0LWNhdGVnb3J5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXREYXRhVGFibGUoKSB7XHJcbiAgICAgICAgVGFibGUuYWRqdXN0V2lkdGgoJzEwMCUnKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIERhdGF0YWJsZXNcclxuICAgICAgICBpZiAoICEkLmZuLmRhdGFUYWJsZS5pc0RhdGFUYWJsZSgnI21haW4tdGFibGUnKSApIHtcclxuICAgICAgICAgICAgJCgnI21haW4tdGFibGUnKS5EYXRhVGFibGUoe1xyXG4gICAgICAgICAgICAgICAgcGFnaW5nOiBmYWxzZSwgLy8gRGlzYWJsZSBwYWdpbmF0aW9uXHJcbiAgICAgICAgICAgICAgICBpbmZvOiBmYWxzZSwgLy8gRGlzYWJsZSB0YWJsZSBpbmZvcm1hdGlvbiBkaXNwbGF5XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hpbmc6IGZhbHNlIC8vIERpc2FibGUgdGhlIHNlYXJjaCBiYXJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwbGFjZWhvbGRlciBmb3IgYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IHJldHVybiB9XHJcblxyXG4gICAgLy8gdXBkYXRlIGZ1bmN0aW9uIGZvciB0aGUgc2lkZWJhcjsgZGVmYXVsdCB0byBqdXN0IHNhdmluZyB0aGUgdGFibGVcclxuICAgIHVwZGF0ZVRhYmxlKCkgeyBUYWJsZS5zYXZlKCkgfVxyXG5cclxuICAgIC8vIGV4dHJhIHF1ZXN0aW9ucyBvZiB0aGUgZm9ybSB0byBhZGQgYSBuZXcgcm93XHJcbiAgICBhZGRDdXN0b21RdWVzdGlvbnMoKSB7IHJldHVybiB9O1xyXG5cclxuICAgIGFkZFZhbGlkYXRpb25MaXN0ZW5lcihpbnB1dElkLCBmaWVsZExhYmVsLCB2YWxpZGF0aW9uSWQsIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xyXG4gICAgICAgIGlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQudmFsdWUgPT09ICdBZGQgbmV3Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgbmV3IGZpZWxkIGFmdGVyIHRoZSBzZWxlY3RlZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dChgVHlwZSBuZXcgJHtmaWVsZExhYmVsfTpgLCBpbnB1dElkLnNsaWNlKDAsIC01KSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZC5zbGljZSgwLCAtNSkpOyAgLy8gUmVtb3ZlICctbmFtZScgc3VmZml4XHJcbiAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQucGFyZW50RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3SW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHZhbGlkYXRpb24gb24gdGhlIG5ldyBpbnB1dCBmaWVsZFxyXG4gICAgICAgICAgICAgICAgbmV3SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRpb25UZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmFsaWRhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoICE9PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSBgJHtmaWVsZExhYmVsfSBjb2RlcyBtdXN0IGJlIGV4YWN0bHkgJHtsZW5ndGh9IG51bWJlcnMuYDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKE51bWJlcihuZXdJbnB1dEVsZW1lbnQudmFsdWUpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9IGAke2ZpZWxkTGFiZWx9IGNvZGVzIG11c3QgYmUgbnVtZXJpYy5gO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXcgaW5wdXQgZmllbGQgaWYgJ0FkZCBuZXcnIGlzIG5vdCBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgbGV0IG5ld0lucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQuc2xpY2UoMCwgLTUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dEVsZW1lbnQucGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBNb2RpZmllZCBhZGRNb2RhbFZhbGlkYXRpb24gbWV0aG9kXHJcbiAgICBhZGRNb2RhbFZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgdGhpcy5hZGRWYWxpZGF0aW9uTGlzdGVuZXIoJ2FwcHJvcC1uYW1lJywgJ0FwcHJvcHJpYXRpb24nLCAnYXBwcm9wLXZhbGlkYXRpb24nLCA1KTtcclxuICAgICAgICB0aGlzLmFkZFZhbGlkYXRpb25MaXN0ZW5lcignY2MtbmFtZScsICdDb3N0IENlbnRlcicsICdjYy12YWxpZGF0aW9uJywgNik7XHJcbiAgICAgICAgLy90aGlzLmFkZFZhbGlkYXRpb25MaXN0ZW5lcignb2JqZWN0LW5hbWUnLCAnT2JqZWN0JywgJ29iai12YWxpZGF0aW9uJywgNyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXBGb3JtKCkge1xyXG4gICAgICAgIC8vIHNob3cgYWRkIGJ1dHRvblxyXG4gICAgICAgIFRhYmxlLkJ1dHRvbnMuQWRkUm93LnNob3coKTtcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy51cGRhdGVUZXh0KHRoaXMuYWRkQnV0dG9uVGV4dCk7XHJcblxyXG4gICAgICAgIC8vIHNldCB1cCBtb2RhbCBmb3IgZm9ybSB3aGVuIGFkZCBidXR0b24gaXMgcHJlc3NlZFxyXG4gICAgICAgIE1vZGFsLmNsZWFyKCk7XHJcbiAgICAgICAgTW9kYWwuTGluay5hZGQoJ2FkZC1idG4nKTtcclxuICAgICAgICBNb2RhbC5UaXRsZS51cGRhdGUodGhpcy5hZGRCdXR0b25UZXh0KTtcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIGZvcm1cclxuICAgICAgICBGb3JtLm5ldygnbW9kYWwtYm9keScpO1xyXG5cclxuICAgICAgICAvLyBhZGQgY3VzdG9tIHF1ZXN0aW9uc1xyXG4gICAgICAgIHRoaXMuYWRkQ3VzdG9tUXVlc3Rpb25zKCk7XHJcbiAgICAgICAgLy8gYW55IHZhbGlkYXRpb24gb3Igc3BlY2lhbCBmdW5jdGlvbnNcclxuICAgICAgICB0aGlzLmFkZE1vZGFsVmFsaWRhdGlvbigpO1xyXG4gICAgICAgIC8vIGFkZCBzdWJtaXQgYnV0dG9uXHJcbiAgICAgICAgRm9ybS5TdWJtaXRCdXR0b24uYWRkKCk7XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcclxuICAgICAgICBNb2RhbC5TdWJtaXQuaW5pdCh0aGlzLnN1Ym1pdE5ld1Jvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKSB7IFxyXG4gICAgICAgICAvLyByZXNldCBmaWx0ZXJzIGlmIHJlbGV2YW50IHRvIGVuc3VyZSB0aGF0IG5ldyBqb2Igc2hvd3MgdXBcclxuICAgICAgICAgVGFibGUuRmlsdGVyLnJlc2V0QWZ0ZXJOZXdSb3cocmVzcG9uc2VzKTtcclxuICAgICAgICAvLyBpZiBhIG5ldyBhcHByb3ByaWF0aW9uIHdhcyBlbnRlcmVkLCBmaXggaXRcclxuICAgICAgICBpZiAocmVzcG9uc2VzWydhcHByb3AnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snYXBwcm9wLW5hbWUnXSA9IGAke3Jlc3BvbnNlc1snYXBwcm9wJ119IC0gTmV3YDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIHNhbWUgZm9yIGNvc3QgY2VudGVyXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlc1snY2MnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snY2MtbmFtZSddID0gYCR7cmVzcG9uc2VzWydjYyddfSAtIE5ld2A7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gZ2V0IG51bWJlcnMgZnJvbSBhY2NvdW50IHN0cmluZyBuYW1lc1xyXG4gICAgICAgIGlmKHJlc3BvbnNlc1snZnVuZC1uYW1lJ10pe1xyXG4gICAgICAgICAgICByZXNwb25zZXNbJ2Z1bmQnXSA9IEFjY291bnRTdHJpbmcuZ2V0TnVtYmVyKHJlc3BvbnNlc1snZnVuZC1uYW1lJ10pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYocmVzcG9uc2VzWydhcHByb3AtbmFtZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uc2VzWydhcHByb3AnXSA9IEFjY291bnRTdHJpbmcuZ2V0TnVtYmVyKHJlc3BvbnNlc1snYXBwcm9wLW5hbWUnXSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihyZXNwb25zZXNbJ2NjLW5hbWUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snY2MnXSA9IEFjY291bnRTdHJpbmcuZ2V0TnVtYmVyKHJlc3BvbnNlc1snY2MtbmFtZSddKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKHJlc3BvbnNlc1snb2JqZWN0LW5hbWUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlc1snb2JqZWN0J10gPSBBY2NvdW50U3RyaW5nLmdldE51bWJlcihyZXNwb25zZXNbJ29iamVjdC1uYW1lJ10pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVzcG9uc2VzWydhY2NvdW50LXN0cmluZyddID0gXHJcbiAgICAgICAgICAgIEFjY291bnRTdHJpbmcuYnVpbGQocmVzcG9uc2VzWydhcHByb3AtbmFtZSddLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXNbJ2NjLW5hbWUnXSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzWydvYmplY3QtbmFtZSddLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXNbJ2Z1bmQnXSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdWJtaXROZXdSb3coZXZlbnQpIHtcclxuICAgICAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlcyA9IEZvcm0uZmV0Y2hBbGxSZXNwb25zZXMoZXZlbnQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGVkaXQgaW5wdXRzIGZyb20gbW9kYWxcclxuICAgICAgICByZXNwb25zZXMgPSB0aGlzLmVkaXRDb2x1bW5zKHJlc3BvbnNlcyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIGl0J3Mgbm90IGFuIGVtcHR5IHJlc3BvbnNlXHJcbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGFuZ2UgcGFnZSB2aWV3XHJcbiAgICAgICAgICAgIE1vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIGFkZCBkYXRhIHRvIHRhYmxlXHJcbiAgICAgICAgICAgIGF3YWl0IFRhYmxlLlJvd3MuYWRkKHJlc3BvbnNlcywgdGhpcy5jb2x1bW5zKTtcclxuICAgICAgICAgICAgVGFibGUuc2F2ZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gcmVidWlsZCB0YWJsZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBtYXJrIG5ldyByb3dcclxuICAgICAgICAgICAgVGFibGUuUm93cy5tYXJrTmV3Um93KCk7ICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsIlxyXG5pbXBvcnQgV2VsY29tZSBmcm9tICcuLi9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5qcyc7XHJcbmltcG9ydCB7IEZJU0NBTF9ZRUFSIH0gZnJvbSAnLi4vY29uc3RhbnRzL2J1ZGdldF9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJztcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSAnLi92aWV3X2xvZ2ljLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWxjb21lVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJ3dlbGNvbWUnO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnV2VsY29tZSc7XHJcbiAgICAgICAgdGhpcy5zaWRlYmFyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5uYXZCdXR0b25zID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgVGhpcyB0b29sIHdpbGwgaGVscCB5b3UgcHJlcGFyZSB5b3VyIGJ1ZGdldCByZXF1ZXN0IHN1Ym1pc3Npb24gZm9yIGZpc2NhbCB5ZWFyIFxyXG4gICAgICAgICAgICAyMCR7RklTQ0FMX1lFQVJ9LiBTdGFydCBieSB1cGxvYWRpbmcgdGhlIGRldGFpbCBzaGVldCBzZW50IHRvIHlvdSBieSB5b3VyIGJ1ZGdldCBhbmFseXN0LiBUaGlzXHJcbiAgICAgICAgICAgIHRvb2wgd2lsbCB1c2UgdGhlIGRhdGEgaW4gdGhhdCBzaGVldCB0byBwcmUtZmlsbCB5b3VyIHN1Ym1pc3Npb24gd2l0aCBsYXN0IHllYXIncyByZXF1ZXN0LlxyXG4gICAgICAgICAgICA8YnI+PGJyPlxyXG4gICAgICAgICAgICBUaGVuLCB5b3Ugd2lsbCBiZSBndWlkZWQgdGhyb3VnaCBlYWNoIGZ1bmQgdG8gbWFrZSBhbnkgYWRqdXN0bWVudHMgZnJvbSBsYXN0IHllYXIncyByZXF1ZXN0LiBcclxuICAgICAgICAgICAgQXMgeW91IFxyXG4gICAgICAgICAgICBtYWtlIHRoZXNlIGFkanVzdG1lbnRzLCB5b3Ugd2lsbCBzZWUgYSBzaWRlYmFyIHRyYWNraW5nIHlvdXIgdG90YWwgZXhwZW5kaXR1cmVzIGJ5IGZ1bmQgYW5kIHlvdXIgdGFyZ2V0XHJcbiAgICAgICAgICAgIGJhc2VsaW5lIGZvciB0aGUgZ2VuZXJhbCBmdW5kLiBcclxuICAgICAgICAgICAgPGJyPjxicj5cclxuICAgICAgICAgICAgT25jZSB5b3UgZ2V0IHRocm91Z2ggYWxsIGZ1bmRzIGFuZCBzZXQgeW91ciByZXF1ZXN0IGF0IG9yIGJlbG93IHRoZSBcclxuICAgICAgICAgICAgdGFyZ2V0LCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGRvd25sb2FkIGEgZmlsbGVkIHZlcnNpb24gb2YgdGhlIEV4Y2VsIGRldGFpbCBzaGVldC4gRG93bmxvYWRpbmcgXHJcbiAgICAgICAgICAgIHRoaXMgZmlsZSBpcyB0aGUgb25seSBwZXJtYW5lbnQgd2F5IHRvIHNhdmUgeW91ciBwcm9ncmVzcy5gXHJcbiAgICB9XHJcblxyXG4gICAgdmlzaXQoKSB7XHJcbiAgICAgICAgc3VwZXIudmlzaXQoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBzaG93IHdlbGNvbWUgc2VjdGlvblxyXG4gICAgICAgIFdlbGNvbWUuc2hvdygpO1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXplIGxpbmtzIGluIGJ1dHRvbnNcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC11cGxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHZpc2l0UGFnZSgndXBsb2FkJykpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLWluaXRpYXRpdmVzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB2aXNpdFBhZ2UoJ25ldy1pbml0cycpKTtcclxuICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1yZXZlbnVlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB2aXNpdFBhZ2UoJ2Jhc2VsaW5lLWxhbmRpbmcnKSk7XHJcbiAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtZmluaXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB2aXNpdFBhZ2UoJ3N1bW1hcnknKSk7XHJcblxyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2VsY29tZVZpZXc7XHJcbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnXHJcblxyXG5pbXBvcnQgRmlsZVVwbG9hZCBmcm9tIFwiLi4vY29tcG9uZW50cy9maWxlX3VwbG9hZC9maWxlX3VwbG9hZC5qc1wiO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tICcuLi9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBVcGxvYWRWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAndXBsb2FkJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBVcGxvYWQgdGhlIGJhc2VsaW5lIGRldGFpbCBzaGVldCBnaXZlbiBieSB5b3VyIGJ1ZGdldCBhbmFseXN0LmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdFeGNlbCBVcGxvYWQnO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcbiAgICAgICAgRmlsZVVwbG9hZC5zaG93KCk7XHJcbiAgICAgICAgRmlsZVVwbG9hZC5pbml0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVwbG9hZFZpZXc7IiwiaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcclxuaW1wb3J0IFRhYmxlIGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuaW1wb3J0IEN1cnJlbnRGdW5kIGZyb20gXCIuLi9tb2RlbHMvY3VycmVudF9mdW5kLmpzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRnVuZFZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdiYXNlbGluZS1sYW5kaW5nJztcclxuICAgICAgICB0aGlzLnByb21wdCA9IGBXZSB3aWxsIG5vdyBhc2sgeW91IGEgc2VyaWVzIG9mIHF1ZXN0aW9ucyBhYm91dCB5b3VyIEJBU0VMSU5FIGJ1ZGdldCByZXF1ZXN0LlxyXG4gICAgICAgICAgICBBdCB0aGUgZW5kLCB3ZSB3aWxsIGFzayB5b3UgYWJvdXQgYW55IG5ldyBpbml0aWF0aXZlcyAoaWUuIHN1cHBsZW1lbnRhbCByZXF1ZXN0cykuXHJcbiAgICAgICAgICAgIFNlbGVjdCBvbmUgb2YgeW91ciBmdW5kcyB0aGVuIGNsaWNrIGNvbnRpbnVlLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdCYXNlbGluZSBCdWRnZXQgUmVxdWVzdCc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBGdW5kVGFibGUoKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBmdW5kIHNlbGVjdGlvblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XHJcbiAgICAgICAgc3VwZXIudmlzaXQoKTtcclxuXHJcbiAgICAgICAgLy8gaGlkZSBiYWNrIGJ1dHRvbiB0byBhdm9pZCBjb25mdXNpb25cclxuICAgICAgICBOYXZCdXR0b25zLkxhc3QuaGlkZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbn1cclxuXHJcbmNsYXNzIEZ1bmRUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcmV2ZW51ZSBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0Z1bmQnLCBjbGFzc05hbWU6ICdmdW5kLW5hbWUnIH1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gZnVuZHMgZm91bmQuJ1xyXG4gICAgICAgIHRoaXMuYWRkRWRpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkKCl7XHJcbiAgICAgICAgLy8gbG9hZCBpbiBmdW5kIGRhdGFcclxuICAgICAgICBUYWJsZS5zaG93KCk7XHJcbiAgICAgICAgVGFibGUuRGF0YS5sb2FkRnVuZHMoKTtcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXModGhpcy5jb2x1bW5zKTtcclxuICAgICAgICBUYWJsZS5hZGp1c3RXaWR0aCgnMzAlJyk7XHJcblxyXG4gICAgICAgIC8vIGRpc2FibGUgbmV4dCBidXR0b24gdW50aWwgYSBmdW5kIGlzIHNlbGVjdGVkXHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmRpc2FibGUoKTtcclxuICAgICAgICBhbGxvd1Jvd1NlbGVjdGlvbigpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gYWxsb3dSb3dTZWxlY3Rpb24oKXtcclxuICAgIFxyXG4gICAgdmFyIHRhYmxlUm93cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0Ym9keSB0clwiKTtcclxuICAgIFxyXG4gICAgLy8gZW5hYmxlIGhpZ2hsaWdodCBvbiBob3ZlciBhbmQgb24gc2VsZWN0XHJcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcclxuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdEZ1bmQodGFibGVSb3dzLCB0aGlzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RGdW5kKHRhYmxlUm93cywgc2VsZWN0ZWRfcm93KXtcclxuXHJcbiAgICAvLyByZW1vdmUgc2VsZWN0ZWQgY2xhc3MgZnJvbSBhbnkgb3RoZXIgcm93c1xyXG4gICAgdGFibGVSb3dzLmZvckVhY2goZnVuY3Rpb24odGFibGVSb3cpIHtcclxuICAgICAgICB0YWJsZVJvdy5jbGFzc0xpc3QgPSAnJztcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGFkZCBzZWxlY3RlZCBjbGFzcyB0byBjbGlja2VkIHJvd1xyXG4gICAgc2VsZWN0ZWRfcm93LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gZ2V0IGZ1bmQgYW5kIHNhdmUgc2VsZWN0ZWQgZnVuZFxyXG4gICAgdmFyIGZ1bmQgPSBzZWxlY3RlZF9yb3cucXVlcnlTZWxlY3RvcignLmZ1bmQtbmFtZScpLnRleHRDb250ZW50O1xyXG4gICAgdmFyIGZ1bmROdW1iZXIgPSBwYXJzZUludChmdW5kKTtcclxuICAgIEN1cnJlbnRGdW5kLnVwZGF0ZShmdW5kTnVtYmVyKTtcclxuXHJcbiAgICAvLyBlbmFibGUgbmV4dCBzdGVwXHJcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmRWaWV3OyIsImltcG9ydCB7IFZpZXcsIFZpZXdUYWJsZSB9IGZyb20gJy4vdmlld19jbGFzcy5qcydcclxuXHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXZlbnVlVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAncmV2ZW51ZSc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgUmV2aWV3IHJldmVudWUgbGluZSBpdGVtcy4gUmV2ZW51ZSBlc3RpbWF0ZXMgYXJlIGZyb20gdGhlIFxyXG4gICAgICAgICAgICBTZXB0ZW1iZXIgUmV2ZW51ZSBFc3RpbWF0aW5nIENvbmZlcmVuY2UgYW5kIGNhbm5vdCBiZSBlZGl0ZWQgaGVyZS4gSWYgeW91IFxyXG4gICAgICAgICAgICBub3RpY2UgYW4gZXJyb3IgaW4gYW4gYWNjb3VudCBzdHJpbmcgb3IgZXN0aW1hdGUsIFxyXG4gICAgICAgICAgICBwbGVhc2Ugbm90ZSBpdCBpbiB0aGUgbm90ZXMgY29sdW1uIGJ5IGNsaWNraW5nIGVkaXQgXHJcbiAgICAgICAgICAgIGluIHRoZSByZWxldmFudCByb3cuYDtcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ1JldmVudWVzJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IFJldmVudWVUYWJsZShmaXNjYWxfeWVhcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJldmVudWVUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCByZXZlbnVlIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCBjbGFzc05hbWU6ICdyZWN1cnJpbmcnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ09iamVjdCBDYXRlZ29yeScsIGNsYXNzTmFtZTogJ29iamVjdC1jYXRlZ29yeSd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiBgRlkke2Zpc2NhbF95ZWFyfSBEZXBhcnRtZW50YWwgRXN0aW1hdGUgVG90YWxgLCBjbGFzc05hbWU6ICdyZXF1ZXN0JywgaXNDb3N0OiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBFc3RpbWF0ZSBOb3RlcycsIGNsYXNzTmFtZTogJ25vdGVzJ30sXHJcbiAgICAgICAgICAgIC8vIGhpZGRlblxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IE5hbWUnLCBjbGFzc05hbWU6ICdvYmplY3QtbmFtZScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0JywgY2xhc3NOYW1lOiAnb2JqZWN0JywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyByZXZlbnVlcyBmb3IgdGhpcyBmdW5kLidcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgLy8gb25seSBhbGxvdyBlZGl0cyBpbiB0aGUgbm90ZXMgYm94XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub3RlcycsIGZhbHNlLCAndGV4dGFyZWEnKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmV2ZW51ZVZpZXc7IiwiaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5cclxuaW1wb3J0IFRhYmxlIGZyb20gXCIuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCBGb3JtIGZyb20gXCIuLi9jb21wb25lbnRzL2Zvcm0vZm9ybS5qc1wiO1xyXG5cclxuaW1wb3J0IHsgU2VydmljZXMsIEZ1bmRMb29rdXBUYWJsZSB9IGZyb20gJy4uL21vZGVscy8nO1xyXG5pbXBvcnQgeyB1bmZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xyXG5pbXBvcnQgeyBFTVBMT1lFRV9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cy9idWRnZXRfY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IEdvbGRCb29rIGZyb20gJy4uL21vZGVscy9nb2xkX2Jvb2suanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBlcnNvbm5lbFZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihmaXNjYWxfeWVhcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlX3N0YXRlID0gJ3BlcnNvbm5lbCc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgXHJcbiAgICAgICAgICAgIFRoaXMgdGFibGUgZGlzcGxheXMgdGhlIG51bWJlciBvZiBGVEVzIGluIGVhY2ggam9iIGNvZGUgZm9yIGluIHlvdXIgZGVwYXJ0bWVudCdzIFxyXG4gICAgICAgICAgICBjdXJyZW50IChhbWVuZGVkKSBGWTI1IGJ1ZGdldC4gVG8gbWFrZSBlZGl0cyB0byB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucywgY2xpY2sgdGhlXHJcbiAgICAgICAgICAgIFwiRWRpdFwiIGJ1dHRvbiBvbiB0aGUgcm93IHlvdSB3b3VsZCBsaWtlIHRvIGVkaXQuIFRoZSBcIlRvdGFsIENvc3RcIiBjb2x1bW4gYW5kIHRoZSBcclxuICAgICAgICAgICAgc3VtbWFyeSBzaWRlYmFyIHdpbGwgYWxzbyB1cGRhdGUgdG8gcmVmbGVjdCBhbnkgZWRpdHMuYDtcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ1BlcnNvbm5lbCc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBQZXJzb25uZWxUYWJsZShmaXNjYWxfeWVhcik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5jbGFzcyBQZXJzb25uZWxUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuZmlzY2FsX3llYXIgPSBmaXNjYWxfeWVhcjtcclxuICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCBwZXJzb25uZWwgY29sdW1ucyB0byB0aGUgdGFibGVcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuY29uY2F0KFtcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0pvYiBUaXRsZScsIGNsYXNzTmFtZTogJ2pvYi1uYW1lJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnSm9iIENvZGUnLCBjbGFzc05hbWU6ICdqb2ItY29kZScgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0VtcGxveWVlIFR5cGUnLCBjbGFzc05hbWU6ICdlbXBsb3llZS10eXBlJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdTZXJ2aWNlJywgY2xhc3NOYW1lOiAnc2VydmljZScgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogYEZZJHt0aGlzLmZpc2NhbF95ZWFyfSBSZXF1ZXN0ZWQgRlRFYCwgY2xhc3NOYW1lOiAnYmFzZWxpbmUtZnRlcycgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogYEZZJHt0aGlzLmZpc2NhbF95ZWFyfSBQcm9qZWN0ZWQgQXZlcmFnZSBTYWxhcnkvV2FnZWAsIGNsYXNzTmFtZTogJ2F2Zy1zYWxhcnknLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1RvdGFsIFNhbC9XYWcgJiBCZW4gUmVxdWVzdCcsIGNsYXNzTmFtZTogJ3RvdGFsLWJhc2VsaW5lJywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdEZXBhcnRtZW50YWwgUmVxdWVzdCBOb3RlcycsIGNsYXNzTmFtZTogJ25vdGVzJ30sXHJcbiAgICAgICAgICAgIC8vIGhpZGRlbiBjb2x1bW5zXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdGcmluZ2UgQmVuZWZpdHMgUmF0ZScsIGNsYXNzTmFtZTogJ2ZyaW5nZScsIGhpZGU6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0dlbmVyYWwgSW5jcmVhc2UgUmF0ZScsIGNsYXNzTmFtZTogJ2dlbmVyYWwtaW5jcmVhc2UtcmF0ZScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU3RlcC9NZXJpdCBJbmNyZWFzZSBSYXRlJywgY2xhc3NOYW1lOiAnbWVyaXQtaW5jcmVhc2UtcmF0ZScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiBgQXZlcmFnZSBTYWxhcnkvV2FnZSBhcyBvZiA5LzEvMjAke3RoaXMuZmlzY2FsX3llYXItMn1gLCBjbGFzc05hbWU6ICdjdXJyZW50LXNhbGFyeScsIGlzQ29zdDogdHJ1ZSwgaGlkZTogdHJ1ZX1cclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgdGhpcy5ub0RhdGFNZXNzYWdlID0gJ05vIHBlcnNvbm5lbCBleHBlbmRpdHVyZXMgZm9yIHRoaXMgZnVuZC4nXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b25UZXh0ID0gJ0FkZCBuZXcgam9iJyA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrOiBtYWtlIGNlbGxzIGVkaXRhYmxlXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IFxyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnYmFzZWxpbmUtZnRlcycpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlU2VydmljZURyb3Bkb3duKFNlcnZpY2VzLmxpc3QoKSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub3RlcycsIGZhbHNlLCAndGV4dGFyZWEnKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVUYWJsZSgpe1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBmb3IgZWFjaCByb3dcclxuICAgICAgICBsZXQgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIC8vIGZldGNoIHZhbHVlcyBmb3IgY2FsY3VsYXRpb25zXHJcbiAgICAgICAgICAgIGxldCBhdmdfc2FsYXJ5ID0gVGFibGUuQ2VsbC5nZXRWYWx1ZShyb3dzW2ldLCAnYXZnLXNhbGFyeScpO1xyXG4gICAgICAgICAgICBsZXQgZnJpbmdlID0gcGFyc2VGbG9hdChUYWJsZS5DZWxsLmdldFRleHQocm93c1tpXSwgJ2ZyaW5nZScpKTtcclxuICAgICAgICAgICAgbGV0IGJhc2VsaW5lX2Z0ZXMgPSBUYWJsZS5DZWxsLmdldFRleHQocm93c1tpXSwgJ2Jhc2VsaW5lLWZ0ZXMnKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNhbGN1YXRlICNGVEVzIHggYXZlcmFnZSBzYWxhcnkgKyBDT0xBIGFkanVzdG1lbnRzICsgbWVyaXQgYWRqdXN0bWVudHMgKyBmcmluZ2VcclxuICAgICAgICAgICAgbGV0IHRvdGFsX2Jhc2VsaW5lX2Nvc3QgPSBhdmdfc2FsYXJ5ICogYmFzZWxpbmVfZnRlcyAqICgxICsgZnJpbmdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0b3RhbCBjb2x1bW5cclxuICAgICAgICAgICAgVGFibGUuQ2VsbC51cGRhdGVWYWx1ZShyb3dzW2ldLCAndG90YWwtYmFzZWxpbmUnLCB0b3RhbF9iYXNlbGluZV9jb3N0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNhdmUgdGhlIHRhYmxlIGFmdGVyIGFsbCB1cGRhdGVzIGFyZSBkb25lXHJcbiAgICAgICAgVGFibGUuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpe1xyXG4gICAgICAgIC8vIGZvcm0gcXVlc3Rpb25zIHRvIGFkZCBhIG5ldyBqb2JcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnSm9iIENvZGU6JywgJ2pvYi1jb2RlJywgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdKb2IgVGl0bGU6JywgJ2pvYi1uYW1lJywgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0VtcGxveWVlIFR5cGU6JywgJ2VtcGxveWVlLXR5cGUnLCBFTVBMT1lFRV9UWVBFUywgdHJ1ZSksXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignQXBwcm9wcmlhdGlvbjonLCAnYXBwcm9wLW5hbWUnLCBGdW5kTG9va3VwVGFibGUuZ2V0QXBwcm9wcygnQWRkIG5ldycpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdDb3N0IENlbnRlcjonLCAnY2MtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRDb3N0Q2VudGVycygnQWRkIG5ldycpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdTZXJ2aWNlJywgJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdOdW1iZXIgb2YgRlRFcyByZXF1ZXN0ZWQ6JywgJ2Jhc2VsaW5lLWZ0ZXMnLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dChgUHJvamVjdGVkIGF2ZXJhZ2Ugc2FsYXJ5IElOIEZJU0NBTCBZRUFSICR7dGhpcy5maXNjYWxfeWVhcn06YCwgJ2F2Zy1zYWxhcnknLCB0cnVlKTtcclxuICAgICAgICAvL0Zvcm0uTmV3RmllbGQuc2hvcnRUZXh0KGBFeHBlY3RlZCBmcmluZ2UgcmF0ZSAoYXMgYSBwZXJjZW50YWdlKWAsICdmcmluZ2UnLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRNb2RhbFZhbGlkYXRpb24oKXtcclxuXHJcbiAgICAgICAgc3VwZXIuYWRkTW9kYWxWYWxpZGF0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vIGxvY2sgdGhlIGpvYiBkZXNjcmlwdGlvbiBcclxuICAgICAgICBjb25zdCBqb2JEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItbmFtZScpO1xyXG4gICAgICAgIGpvYkRlc2NyaXB0aW9uLnJlYWRPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAvLyBnaXZlIGEgbWVzc2FnZSBpZiBhdHRlbXB0IHRvIGVkaXRcclxuICAgICAgICBjb25zdCBuYW1lVmFsaWRhdGlvblRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam9iLW5hbWUtdmFsaWRhdGlvbicpO1xyXG4gICAgICAgIGpvYkRlc2NyaXB0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIG5hbWVWYWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICdUaGlzIGZpZWxkIGlzIG5vdCBlZGl0YWJsZSBhbmQgd2lsbCBhdXRvLWZpbGwgZnJvbSB0aGUgam9iIGNvZGUgYWJvdmUuJztcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBoaWRlIG1lc3NhZ2Ugb24gYmx1clxyXG4gICAgICAgIGpvYkRlc2NyaXB0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbmFtZVZhbGlkYXRpb25UZXh0LnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gaGlkZSB0aGlzIGJveCB1bnRpbCBqb2IgY29kZSBlbnRlcmVkXHJcbiAgICAgICAgam9iRGVzY3JpcHRpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgLy8gY29uZmlybSB0aGF0IGVudGVyZWQgam9iIGNvZGUgaXMgaW4gdGhlIGdvbGQgYm9va1xyXG4gICAgICAgIGNvbnN0IGpvYkNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItY29kZScpO1xyXG4gICAgICAgIGpvYkNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBnZXQgZW50ZXJlZCBqb2IgY29kZVxyXG4gICAgICAgICAgICBjb25zdCBqb2JDb2RlID0gam9iQ29kZUlucHV0LnZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vIGdldCB2YWxpZGF0aW9uIHRleHQgZWxlbWVudFxyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqb2ItY29kZS12YWxpZGF0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmICghR29sZEJvb2suY29kZUV4aXN0cyhqb2JDb2RlKSl7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgam9iIGNvZGUgZG9lc24ndCBleGlzdCwgc2hvdyBhbiBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGV4dC50ZXh0Q29udGVudCA9ICdUaGlzIGpvYiBjb2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IEdvbGQgQm9vay4gUGxlYXNlIGVudGVyIGFub3RoZXIgY29kZS4nO1xyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIGFueSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgam9iIHRpdGxlIFxyXG4gICAgICAgICAgICAgICAgam9iRGVzY3JpcHRpb24udmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgZXhpc3QsIGNoYW5nZSB0aGUgam9iIHRpdGxlIGFjY29yZGluZ2x5XHJcbiAgICAgICAgICAgICAgICBqb2JEZXNjcmlwdGlvbi52YWx1ZSA9IEdvbGRCb29rLmdldFRpdGxlKGpvYkNvZGUpO1xyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIGFueSBlcnJvciBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRleHQudGV4dENvbnRlbnQgPSAnJztcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBzaG93IHRoZSBqb2IgdGl0bGVcclxuICAgICAgICAgICAgICAgIGpvYkRlc2NyaXB0aW9uLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRDb2x1bW5zKHJlc3BvbnNlcyl7XHJcbiAgICAgICAgLy8gRWRpdCByZXNwb25zZXMgdG8gZml0IGludG8gdGFibGVcclxuICAgICAgICByZXNwb25zZXMgPSBzdXBlci5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIC8vIGVkaXQgaW5wdXRzIGZyb20gbW9kYWxcclxuICAgICAgICByZXNwb25zZXNbJ2F2Zy1zYWxhcnknXSA9IHVuZm9ybWF0Q3VycmVuY3kocmVzcG9uc2VzWydhdmctc2FsYXJ5J10pO1xyXG4gICAgICAgIC8vIHVzZSBnb2xkIGJvb2sgdG8gbG9vayB1cCBpbmZvIGJhc2VkIG9uIGpvYiBjb2RlXHJcbiAgICAgICAgcmVzcG9uc2VzWydqb2ItbmFtZSddID0gR29sZEJvb2suZ2V0VGl0bGUocmVzcG9uc2VzWydqb2ItY29kZSddKTtcclxuICAgICAgICByZXNwb25zZXNbJ2ZyaW5nZSddID0gR29sZEJvb2suZ2V0RnJpbmdlUmF0ZShyZXNwb25zZXNbJ2pvYi1jb2RlJ10pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZXM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBlcnNvbm5lbFZpZXc7IiwiXHJcblxyXG5pbXBvcnQgeyBWaWV3LCBWaWV3VGFibGUgfSBmcm9tICcuL3ZpZXdfY2xhc3MuanMnXHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuaW1wb3J0IEZvcm0gZnJvbSAnLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanMnO1xyXG5pbXBvcnQgeyBGdW5kTG9va3VwVGFibGUsIFNlcnZpY2VzIH0gZnJvbSAnLi4vbW9kZWxzLyc7XHJcbmltcG9ydCB7IHVuZm9ybWF0Q3VycmVuY3kgfSBmcm9tICcuLi91dGlscy9jb21tb25fdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBPVF9PQkpFQ1RTIH0gZnJvbSAnLi4vY29uc3RhbnRzLyc7XHJcblxyXG5leHBvcnQgY2xhc3MgT3ZlcnRpbWVWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdvdmVydGltZSc7XHJcbiAgICAgICAgdGhpcy5wcm9tcHQgPSBgXHJcbiAgICAgICAgICAgIFBsZWFzZSBzZWUgeW91ciBiYXNlbGluZSBvdmVydGltZSAvIGhvbGlkYXkgcGF5IC8gc2hpZnQgcHJlbWl1bXMgaW4gdGhlIHRhYmxlIGJlbG93LlxyXG4gICAgICAgICAgICBNYWtlIGFueSBlZGl0cyBhbmQgY29udGludWUuYDtcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ092ZXJ0aW1lIEVzdGltYXRlcyc7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBPdmVydGltZVRhYmxlKGZpc2NhbF95ZWFyKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgT3ZlcnRpbWVUYWJsZSBleHRlbmRzIFZpZXdUYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCBPVCBjb2x1bW5zIHRvIHRoZSB0YWJsZVxyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZTogJ3NlcnZpY2UnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCBjbGFzc05hbWU6ICdyZWN1cnJpbmcnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBSZXF1ZXN0IE9UL1NQL0hvbCcsIGNsYXNzTmFtZTogJ09ULXBheScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiBgRlkke2Zpc2NhbF95ZWFyfSBUb3RhbCBPVC9TUC9Ib2wgKyBGSUNBIFJlcXVlc3RgLCBjbGFzc05hbWUgOiAndG90YWwnLCBpc0Nvc3Q6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IE5hbWUnLCBjbGFzc05hbWU6ICdvYmplY3QtbmFtZSd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVwYXJ0bWVudGFsIFJlcXVlc3QgTm90ZXMnLCBjbGFzc05hbWU6ICdub3Rlcyd9LFxyXG4gICAgICAgICAgICAvLyBoaWRkZW4gY29sdW1uc1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRklDQSBSYXRlJywgY2xhc3NOYW1lOiAnZmljYScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICB0aGlzLm5vRGF0YU1lc3NhZ2UgPSAnTm8gb3ZlcnRpbWUgZXhwZW5kaXR1cmVzIGZvciB0aGlzIGZ1bmQuJ1xyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uVGV4dCA9ICdBZGQgbmV3IGNvc3QgY2VudGVyJyA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWN0aW9uIG9uIHJvdyBlZGl0IGNsaWNrOiBtYWtlIGNlbGxzIGVkaXRhYmxlXHJcbiAgICBhY3Rpb25PbkVkaXQoKSB7IFxyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnT1QtcGF5JywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVTZXJ2aWNlRHJvcGRvd24oU2VydmljZXMubGlzdCgpKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdyZWN1cnJpbmcnLCBbJ09uZS1UaW1lJywgJ1JlY3VycmluZyddKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdvYmplY3QtbmFtZScsIE9UX09CSkVDVFMpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgnbm90ZXMnLCBmYWxzZSwgJ3RleHRhcmVhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVGFibGUoKXtcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xyXG4gICAgICAgIGxldCByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgICAgICAgbGV0IE9UX3NhbGFyeSA9IFRhYmxlLkNlbGwuZ2V0VmFsdWUocm93c1tpXSwgJ09ULXBheScpO1xyXG4gICAgICAgICAgICBsZXQgZmljYV9yYXRlID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdmaWNhJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgc2FsYXJ5IGFuZCB3YWdlcyBhbmQgZnJpbmdlIGJlbmVmaXRzIChGSUNBKVxyXG4gICAgICAgICAgICBsZXQgcm93X3RvdGFsID0gT1Rfc2FsYXJ5ICogKDEgKyBwYXJzZUZsb2F0KGZpY2FfcmF0ZSkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvdGFsXHJcbiAgICAgICAgICAgIFRhYmxlLkNlbGwudXBkYXRlVmFsdWUocm93c1tpXSwgJ3RvdGFsJywgcm93X3RvdGFsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNhdmUgdGhlIHRhYmxlIGFmdGVyIGFsbCB1cGRhdGVzIGFyZSBkb25lXHJcbiAgICAgICAgVGFibGUuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpe1xyXG4gICAgICAgIC8vIGZvcm0gcXVlc3Rpb25zIHRvIGFkZCBhIG5ldyBqb2JcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdBcHByb3ByaWF0aW9uOicsICdhcHByb3AtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRBcHByb3BzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Nvc3QgQ2VudGVyOicsICdjYy1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldENvc3RDZW50ZXJzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ09iamVjdCAoc2FsYXJ5IG9yIHdhZ2UpOicsICdvYmplY3QtbmFtZScsIE9UX09CSkVDVFMsIHRydWUpOyBcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdTZXJ2aWNlJywgJ3NlcnZpY2UnLCBTZXJ2aWNlcy5saXN0KCksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ1JlY3VycmluZyBvciBPbmUtVGltZScsICdyZWN1cnJpbmcnLCBbJ1JlY3VycmluZycsICdPbmUtVGltZSddLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnT3ZlcnRpbWUgYW1vdW50IHJlcXVlc3RlZDonLCAnT1QtcGF5JywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKXtcclxuICAgICAgICByZXNwb25zZXMgPSBzdXBlci5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIC8vIGVkaXQgaW5wdXRzIGZyb20gbW9kYWxcclxuICAgICAgICByZXNwb25zZXNbJ09ULXBheSddID0gdW5mb3JtYXRDdXJyZW5jeShyZXNwb25zZXNbJ09ULXBheSddKTtcclxuICAgICAgICByZXNwb25zZXNbJ2ZpY2EnXSA9IDAuMDc2NTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBPdmVydGltZVZpZXc7IiwiaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5pbXBvcnQgRm9ybSBmcm9tICcuLi9jb21wb25lbnRzL2Zvcm0vZm9ybS5qcyc7XHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBTZXJ2aWNlcyB9IGZyb20gJy4uL21vZGVscy8nO1xyXG5pbXBvcnQgeyB1bmZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgT0JKX0NBVEVHT1JJRVMgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOb25QZXJzb25uZWxWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZmlzY2FsX3llYXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICdub25wZXJzb25uZWwnO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFJldmlldyBhbmQgZWRpdCBub24tcGVyc29ubmVsIGxpbmUgaXRlbXMuIFRoZSBDUEEgbnVtYmVycyBhcmUgdGhlIFxyXG4gICAgICAgICAgICBDb250cmFjdCBhbmQgUHJvY3VyZW1lbnQgQWNjb3VudCBudW1iZXJzLiBDbGljayBvbiB0aGUgJ2RldGFpbCcgbGluayBmb3IgYSBDUEEgXHJcbiAgICAgICAgICAgIHRvIHNlZSB0aGUgY29udHJhY3QgZGV0YWlscy4gU29tZSBsaW5lIGl0ZW1zIHdvbid0IGhhdmUgYSBDUEEgbnVtYmVyLmA7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdOb24tUGVyc29ubmVsJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IE5vblBlcnNvbm5lbFRhYmxlKGZpc2NhbF95ZWFyKTtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgTm9uUGVyc29ubmVsVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGZpc2NhbF95ZWFyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgcGVyc29ubmVsIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHsgdGl0bGU6IGBGWSR7ZmlzY2FsX3llYXJ9IERlcGFydG1lbnRhbCBSZXF1ZXN0IFRvdGFsYCwgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZSA6ICdzZXJ2aWNlJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnUmVjdXJyaW5nIG9yIE9uZS1UaW1lJywgY2xhc3NOYW1lOiAncmVjdXJyaW5nJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdWZW5kb3IgTmFtZScsIGNsYXNzTmFtZTogJ3ZlbmRvcid9LFxyXG4gICAgICAgICAgICB7IHRpdGxlIDogJ0NQQSAjJywgY2xhc3NOYW1lIDogJ2NwYSd9LFxyXG4gICAgICAgICAgICAvLyBoaWRkZW4gY29sdW1uc1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRW5kIERhdGUnLCBjbGFzc05hbWU6ICdjb250cmFjdC1lbmQnLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0JQQS9DUEEgQW1vdW50IFJlbWFpbmluZycsIGNsYXNzTmFtZTogJ3JlbWFpbmluZycsIGlzQ29zdDogdHJ1ZSAsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0IE5hbWUnLCBjbGFzc05hbWU6ICdvYmplY3QtbmFtZScsIGhpZGU6IHRydWV9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnT2JqZWN0JywgY2xhc3NOYW1lOiAnb2JqZWN0JywgaGlkZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdPYmplY3QgQ2F0ZWdvcnknLCBjbGFzc05hbWU6ICdvYmplY3QtY2F0ZWdvcnknLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0JQQS9DUEEgRGVzY3JpcHRpb24nLCBjbGFzc05hbWU6ICdjcGEtZGVzY3JpcHRpb24nLCBoaWRlOiB0cnVlfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ0RlcGFydG1lbnRhbCBSZXF1ZXN0IE5vdGVzJywgY2xhc3NOYW1lOiAnbm90ZXMnfSwgXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9EYXRhTWVzc2FnZSA9ICdObyBub24tcGVyc29ubmVsIGV4cGVuZGl0dXJlcyBmb3IgdGhpcyBmdW5kLidcclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBub24tcGVyc29ubmVsIGl0ZW0nIDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXF1ZXN0JywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVTZXJ2aWNlRHJvcGRvd24oKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdyZWN1cnJpbmcnLCBbJ09uZS1UaW1lJywgJ1JlY3VycmluZyddKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vdGVzJywgZmFsc2UsICd0ZXh0YXJlYScpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEN1c3RvbVF1ZXN0aW9ucygpe1xyXG4gICAgICAgIC8vIGZvcm0gcXVlc3Rpb25zIHRvIGFkZCBhIG5ldyByb3dcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdBcHByb3ByaWF0aW9uOicsICdhcHByb3AtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5nZXRBcHByb3BzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Nvc3QgQ2VudGVyOicsICdjYy1uYW1lJywgRnVuZExvb2t1cFRhYmxlLmdldENvc3RDZW50ZXJzKCdBZGQgbmV3JyksIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ09iamVjdCBDYXRlZ29yeTonLCAnb2JqZWN0LWNhdGVnb3J5JywgT0JKX0NBVEVHT1JJRVMubGlzdCwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgZ2l2ZSBkcm9wZG93biBiYXNlZCBvbiBzZWxlY3RlZCBvYmogY2F0ZWdvcnlcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnT2JqZWN0IE51bWJlciAoaWYga25vd24pOicsICdvYmplY3QnLCBmYWxzZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bignU2VydmljZScsICdzZXJ2aWNlJywgU2VydmljZXMubGlzdCgpLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmxvbmdUZXh0KCdEZXNjcmliZSB5b3VyIG5ldyByZXF1ZXN0OicsICdjcGEtZGVzY3JpcHRpb24nLCB0cnVlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLmRyb3Bkb3duKCdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCAncmVjdXJyaW5nJywgWydSZWN1cnJpbmcnLCAnT25lLVRpbWUnXSwgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdBbW91bnQgcmVxdWVzdGVkOicsICdyZXF1ZXN0JywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdENvbHVtbnMocmVzcG9uc2VzKXtcclxuICAgICAgICByZXNwb25zZXMgPSBzdXBlci5lZGl0Q29sdW1ucyhyZXNwb25zZXMpO1xyXG4gICAgICAgIHJlc3BvbnNlc1snYXZnLXNhbGFyeSddID0gdW5mb3JtYXRDdXJyZW5jeShyZXNwb25zZXNbJ2F2Zy1zYWxhcnknXSk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydmcmluZ2UnXSA9IHBhcnNlRmxvYXQocmVzcG9uc2VzWydmcmluZ2UnXSkgLyAxMDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9uUGVyc29ubmVsVmlldzsiLCJcclxuaW1wb3J0IHsgVmlldywgVmlld1RhYmxlIH0gZnJvbSAnLi92aWV3X2NsYXNzLmpzJ1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcbmltcG9ydCBGdW5kTG9va3VwVGFibGUgZnJvbSAnLi4vbW9kZWxzL2Z1bmRfbG9va3VwX3RhYmxlLmpzJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIgfSBmcm9tICcuLi9jb25zdGFudHMvJztcclxuaW1wb3J0IEFjY291bnRTdHJpbmcgZnJvbSAnLi4vbW9kZWxzL2FjY291bnRfc3RyaW5nLmpzJztcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XHJcblxyXG5cclxuY29uc3QgZHJvcGRvd25PcHRpb25zID0gWydOL0EnLCAnT25lLVRpbWUnLCAnUmVjdXJyaW5nJ11cclxuXHJcbi8vIHNldCB1cCBwYWdlIGFuZCBpbml0aWFsaXplIGFsbCBidXR0b25zXHJcbmV4cG9ydCBjbGFzcyBJbml0aWF0aXZlc1ZpZXcgZXh0ZW5kcyBWaWV3IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFnZV9zdGF0ZSA9ICduZXctaW5pdHMnO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYFxyXG4gICAgICAgICAgICBUaGlzIGlzIHRoZSBwbGFjZSB0byBwcm9wb3NlIG5ldyBpbml0aWF0aXZlcyBmb3IgRlkke0ZJU0NBTF9ZRUFSfS5cclxuICAgICAgICAgICAgTmV3IGluaXRpYXRpdmUgc3VibWlzc2lvbnMgd2lsbCBjb3VudCBhcyBzdXBwbGVtZW50YWwgbGluZSBpdGVtcyBhbmQgd2lsbCBiZSB0aGUgc3RhcnRpbmcgXHJcbiAgICAgICAgICAgIHBvaW50IGZvciBhIGNvbnZlcnNhdGlvbiB3aXRoIGJvdGggT0IgYW5kIE9ERlMsIHdobyB3aWxsIGhlbHAgd2l0aCB0aGUgZGV0YWlscy5gO1xyXG4gICAgICAgIHRoaXMuc3VidGl0bGUgPSAnTmV3IEluaXRpYXRpdmVzJztcclxuICAgICAgICB0aGlzLnRhYmxlID0gbmV3IEluaXRpYXRpdmVzVGFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICAvLyByZW1vdmUgZnVuZCBzZWxlY3Rpb25cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZ1bmRcIiwgJycpO1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcblxyXG4gICAgICAgIC8vIGhpZGUgYmFjayBidXR0b24gdG8gYXZvaWQgY29uZnVzaW9uXHJcbiAgICAgICAgTmF2QnV0dG9ucy5MYXN0LmhpZGUoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmNsYXNzIEluaXRpYXRpdmVzVGFibGUgZXh0ZW5kcyBWaWV3VGFibGUge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIGNvbHVtbnMgdG8gdGhlIHRhYmxlXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRnVuZCcsIGNsYXNzTmFtZTogJ2Z1bmQnfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ1N1cHBsZW1lbnRhbCBJbml0aWF0aXZlJywgY2xhc3NOYW1lOiAnaW5pdC1uYW1lJyB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnVG90YWwgSW5pdGlhdGl2ZSBSZXF1ZXN0JywgY2xhc3NOYW1lOiAndG90YWwnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgLy8geyB0aXRsZTogJ1BlcnNvbm5lbCBGVEUnLCBjbGFzc05hbWU6ICdmdGVzJ30sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdQZXJzb25uZWwgU2FsYXJ5ICYgQmVuZWZpdHMnLCBjbGFzc05hbWU6ICdwZXJzb25uZWwnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgICAgICAgICAgeyB0aXRsZTogJ05vbi1QZXJzb25uZWwgT3BlcmF0aW5nJywgY2xhc3NOYW1lOiAnbm9ucGVyc29ubmVsJywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdOb24tUGVyc29ubmVsIENhcGl0YWwnLCBjbGFzc05hbWU6ICdub25wZXJzb25uZWwtY2FwaXRhbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRGVzY3JpcHRpb24gJiBKdXN0aWZpY2F0aW9uJywgY2xhc3NOYW1lOiAnbm90ZXMnIH0sXHJcbiAgICAgICAgICAgIHsgdGl0bGU6ICdSZWN1cnJpbmcgb3IgT25lLVRpbWUnLCBjbGFzc05hbWU6ICdyZXYtdHlwZSd9LFxyXG4gICAgICAgICAgICB7IHRpdGxlOiAnRWRpdCcsIGNsYXNzTmFtZTogJ2VkaXQnIH1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEJ1dHRvblRleHQgPSAnQWRkIG5ldyBpbml0aWF0aXZlJyA7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3VzdG9tUXVlc3Rpb25zKCl7XHJcblxyXG4gICAgICAgIC8vIGdlbmVyYWwgcXVlc3Rpb25zXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0luaXRpYXRpdmUgTmFtZTonLCAnaW5pdC1uYW1lJywgdHJ1ZSk7IFxyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoJ1doYXQgaXMgdGhlIGJ1c2luZXNzIGNhc2UgZm9yIHRoZSBJbml0aWF0aXZlPycsICdxMScsIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoYFdoeSBpcyB0aGUgaW5pdGlhdGl2ZSBuZWVkZWQ/IFdoYXQgaXMgdGhlIHZhbHVlLWFkZCB0byByZXNpZGVudHM/IFxyXG4gICAgICAgICAgICBXaGF0IGlzIHRoZSBEZXBhcnRtZW504oCZcyBwbGFuIGZvciBpbXBsZW1lbnRpbmcgdGhlIEluaXRpYXRpdmU/YCwgJ3EyJywgdHJ1ZSk7XHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dChgV2h5IGNhbuKAmXQgdGhlIEluaXRpYXRpdmUgYmUgZnVuZGVkIHdpdGggdGhlIERlcGFydG1lbnTigJlzIGJhc2VsaW5lIGJ1ZGdldD9gLCAncTMnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5kcm9wZG93bihgSXMgdGhpcyBpbml0aWF0aXZlIG9uZS10aW1lIG9yIHJlY3VycmluZz9gLCBcclxuICAgICAgICAgICAgJ3Jldi10eXBlJywgZHJvcGRvd25PcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gQWNjb3VudCBzdHJpbmcgaW5mb1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQuZHJvcGRvd24oJ0Z1bmQ6JywgJ2Z1bmQtbmFtZScsIEZ1bmRMb29rdXBUYWJsZS5saXN0RnVuZE5hbWVzKCdBZGQgbmV3JyksIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBOdW1iZXJzXHJcbiAgICAgICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ1doYXQgaXMgeW91ciBiYWxscGFyayBlc3RpbWF0ZSBvZiBUT1RBTCBBRERJVE9OQUwgZXhwZW5kaXR1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluaXRpYXRpdmU/JywgXHJcbiAgICAgICAgICAgICd0b3RhbCcsIHRydWUpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgcGVyc29ubmVsIGNvc3Q/JywgJ3BlcnNvbm5lbCcsIGZhbHNlKTtcclxuICAgICAgICBGb3JtLk5ld0ZpZWxkLm51bWVyaWNJbnB1dCgnRXN0aW1hdGUgb2YgQURESVRPTkFMIG5vbnBlcnNvbm5lbCBvcGVyYXRpbmcgY29zdD8nLCAnbm9ucGVyc29ubmVsJywgZmFsc2UpO1xyXG4gICAgICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgbm9ucGVyc29ubmVsIGNhcGl0YWwgY29zdHM/JywgJ25vbnBlcnNvbm5lbC1jYXBpdGFsJywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRDb2x1bW5zKHJlc3BvbnNlcykge1xyXG4gICAgICAgIHJlc3BvbnNlc1snZnVuZCddID0gQWNjb3VudFN0cmluZy5nZXROdW1iZXIocmVzcG9uc2VzWydmdW5kLW5hbWUnXSk7XHJcbiAgICAgICAgcmVzcG9uc2VzWydub3RlcyddID0gYCR7cmVzcG9uc2VzWydxMSddfSAke3Jlc3BvbnNlc1sncTInXX0gJHtyZXNwb25zZXNbJ3EzJ119YDtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VzO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZE1vZGFsVmFsaWRhdGlvbigpIHsgXHJcbiAgICAgICAgc3VwZXIuYWRkVmFsaWRhdGlvbkxpc3RlbmVyKCdmdW5kLW5hbWUnLCAnRnVuZCcsICdmdW5kLXZhbGlkYXRpb24nLCA0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY3Rpb24gb24gcm93IGVkaXQgY2xpY2s6IG1ha2UgY2VsbHMgZWRpdGFibGVcclxuICAgIGFjdGlvbk9uRWRpdCgpIHsgXHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCd0b3RhbCcsIHRydWUpO1xyXG4gICAgICAgIC8vIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgncmV2ZW51ZScsIHRydWUpO1xyXG4gICAgICAgIFRhYmxlLkNlbGwuY3JlYXRlVGV4dGJveCgncGVyc29ubmVsJywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub25wZXJzb25uZWwnLCB0cnVlKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ25vbnBlcnNvbm5lbC1jYXBpdGFsJywgdHJ1ZSk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdpbml0LW5hbWUnKTtcclxuICAgICAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdyZXYtdHlwZScsIGRyb3Bkb3duT3B0aW9ucyk7XHJcbiAgICAgICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdub3RlcycsIGZhbHNlLCAndGV4dGFyZWEnKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluaXRpYXRpdmVzVmlldzsiLCJpbXBvcnQgQ3VycmVudEZ1bmQgZnJvbSAnLi4vbW9kZWxzL2N1cnJlbnRfZnVuZC5qcyc7XHJcbmltcG9ydCBCYXNlbGluZSBmcm9tICcuLi9tb2RlbHMvYmFzZWxpbmUuanMnO1xyXG5pbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmpzXCI7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJztcclxuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXdfY2xhc3MuanNcIjtcclxuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCB7IGRvd25sb2FkWExTWCB9IGZyb20gXCIuLi91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnO1xyXG5pbXBvcnQgeyBkZWxheSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbl91dGlscy5qcyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVRvVGFyZ2V0KCl7XHJcbiAgICBjb25zdCBiYXNlbGluZSA9IG5ldyBCYXNlbGluZTtcclxuICAgIGlmIChiYXNlbGluZS5nZW5GdW5kVG90YWwoKSA8PSBCYXNlbGluZS50YXJnZXQoKSl7XHJcbiAgICAgICAgUHJvbXB0LlRleHQudXBkYXRlKGBZb3VyIEdlbmVyYWwgRnVuZCBidWRnZXQgaXMgYmVsb3cgeW91ciB0YXJnZXQhIFxyXG4gICAgICAgICAgICBFZGl0IGFueSBsaW5lIGl0ZW1zIGJlbG93IG9yIGNvbnRpbnVlIHRvIHRoZSBmaW5hbCBwYWdlLmApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFlvdXIgR2VuZXJhbCBGdW5kIGJ1ZGdldCBpcyBhYm92ZSB5b3VyIEdGIHRhcmdldCBvZiAke2Zvcm1hdEN1cnJlbmN5KEJhc2VsaW5lLnRhcmdldCgpKX0uIFxyXG4gICAgICAgICAgICBQbGVhc2UgZXhwYW5kIHRoZSBzdW1tYXJ5IHRhYmxlIGJlbG93IGFuZCBlZGl0IGxpbmUgaXRlbXMgdW50aWwgeW91IG1lZXQgeW91ciB0YXJnZXQuIFxyXG4gICAgICAgICAgICBXaGVuIHlvdSBtZWV0IHRoZSB0YXJnZXQsIHlvdSB3aWxsIGJlIGFibGUgdG8gY29udGludWUgdG8gdGhlIGZpbmFsIHBhZ2UuYCk7XHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmRpc2FibGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1bW1hcnlWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnc3VtbWFyeSc7XHJcbiAgICAgICAgdGhpcy5zdWJ0aXRsZSA9ICdTdW1tYXJ5JztcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2aXNpdCgpIHtcclxuICAgICAgICBzdXBlci52aXNpdCgpO1xyXG5cclxuICAgICAgICAvLyByZXNldCBmdW5kXHJcbiAgICAgICAgQ3VycmVudEZ1bmQucmVzZXQoKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdyBzdW1tYXJ5IGFjY29yZGlvblxyXG4gICAgICAgIEFjY29yZGlvbi5idWlsZCgpO1xyXG4gICAgICAgIEFjY29yZGlvbi5zaG93KCk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBwcm9tcHQgdGV4dCBkZXBlbmRpbmcgb24gdGFyZ2V0IG1hdGNoaW5nXHJcbiAgICAgICAgY29tcGFyZVRvVGFyZ2V0KCk7XHJcblxyXG4gICAgICAgIC8vIGZvcmNlIEV4Y2VsIGRvd25sb2FkIG9uIG5leHQgYnV0dG9uXHJcbiAgICAgICAgTmF2QnV0dG9ucy5OZXh0LmFkZEFjdGlvbihkb3dubG9hZFhMU1gpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjbGVhbnVwKCkge1xyXG4gICAgICAgIC8vIGRlbGV0ZSBldmVudCBsaXN0ZW5lcnNcclxuICAgICAgICAvLyBkZWxheSB0byBtYWtlIHN1cmUgZG93bmxvYWQgaGFwcGVucyBiZWZvcmUgZXZlbnQgbGlzdGVuZXIgaXMgcmVtb3ZlZFxyXG4gICAgICAgIGF3YWl0IGRlbGF5KDEwMClcclxuICAgICAgICBOYXZCdXR0b25zLk5leHQucmVtb3ZlQWN0aW9uKGRvd25sb2FkWExTWCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1bW1hcnlWaWV3OyIsImltcG9ydCBDdXJyZW50RnVuZCBmcm9tICcuLi9tb2RlbHMvY3VycmVudF9mdW5kLmpzJztcclxuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXdfY2xhc3MuanNcIjtcclxuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XHJcbmltcG9ydCB7IGRvd25sb2FkWExTWCB9IGZyb20gXCIuLi91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBXZWxjb21lVmlldyBmcm9tICcuLzAwX3dlbGNvbWUuanMnO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tICcuLi9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzJztcclxuXHJcbmZ1bmN0aW9uIHJldHVyblRvV2VsY29tZSgpIHtcclxuICAgIGNvbnN0IHdlbGNvbWUgPSBuZXcgV2VsY29tZVZpZXcoKTtcclxuICAgIHdlbGNvbWUudmlzaXQoKTtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBGaW5pc2hWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhZ2Vfc3RhdGUgPSAnZmluaXNoJztcclxuICAgICAgICB0aGlzLnN1YnRpdGxlID0gJ0ZpbmlzaCc7XHJcbiAgICAgICAgdGhpcy5zaWRlYmFyID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdG9kbyB0b2dnbGUgdG8gZmFsc2VcclxuICAgICAgICB0aGlzLm5hdkJ1dHRvbnMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucHJvbXB0ID0gYENvbmdyYXR1bGF0aW9ucyEgQSBjb3B5IG9mIHlvdXIgY29tcGxldGVkIEV4Y2VsIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZC5cclxuICAgICAgICAgICAgRG93bmxvYWQgYW5vdGhlciBjb3B5IGJlbG93LCBvciBzdGFydCBvdmVyIHdpdGggYSBuZXcgRXhjZWwgdXBsb2FkLiBQbGVhc2UgZW1haWwgdGhlIEV4Y2VsIGRvd25sb2FkIFxyXG4gICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSByZXN0IG9mIHlvdSBidWRnZXQgc3VibWlzc2lvbi5gO1xyXG4gICAgfVxyXG5cclxuICAgIHZpc2l0KCkge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0KCk7XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGZ1bmRcclxuICAgICAgICBDdXJyZW50RnVuZC5yZXNldCgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgcHJvbXB0IGJ1dHRvbnNcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC51cGRhdGVUZXh0KCdEb3dubG9hZCBjb21wbGV0ZWQgRXhjZWwnKTtcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1N0YXJ0IG92ZXIgd2l0aCBuZXcgRXhjZWwgZmlsZScpO1xyXG4gICAgICAgIC8vIGFkZCBidXR0b24gbGlua3NcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LmFkZEFjdGlvbihyZXR1cm5Ub1dlbGNvbWUpO1xyXG4gICAgICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihkb3dubG9hZFhMU1gpO1xyXG4gICAgICAgIFByb21wdC5zaG93KCk7XHJcblxyXG4gICAgICAgIC8vIGhpZGUgbmV4dCBidXR0b25cclxuICAgICAgICBOYXZCdXR0b25zLk5leHQuaGlkZSgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjbGVhbnVwKCkge1xyXG4gICAgICAgIC8vIGRlbGV0ZSBldmVudCBsaXN0ZW5lcnNcclxuICAgICAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnJlbW92ZUFjdGlvbihyZXR1cm5Ub1dlbGNvbWUpO1xyXG4gICAgICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnJlbW92ZUFjdGlvbihkb3dubG9hZFhMU1gpO1xyXG4gICAgICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmVuYWJsZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGaW5pc2hWaWV3OyIsImltcG9ydCBXZWxjb21lVmlldyBmcm9tICcuLzAwX3dlbGNvbWUuanMnO1xyXG5pbXBvcnQgVXBsb2FkVmlldyBmcm9tICcuLzAxX3VwbG9hZC5qcyc7XHJcbmltcG9ydCBGdW5kVmlldyBmcm9tICcuLzAyX2Jhc2VsaW5lX2xhbmRpbmcuanMnO1xyXG5pbXBvcnQgUmV2ZW51ZVZpZXcgZnJvbSAnLi8wM19yZXZlbnVlLmpzJztcclxuaW1wb3J0IFBlcnNvbm5lbFZpZXcgZnJvbSAnLi8wNF9wZXJzb25uZWwuanMnO1xyXG5pbXBvcnQgT3ZlcnRpbWVWaWV3IGZyb20gJy4vMDVfb3ZlcnRpbWUuanMnO1xyXG5pbXBvcnQgTm9uUGVyc29ubmVsVmlldyBmcm9tICcuLzA2X25vbnBlcnNvbm5lbC5qcyc7XHJcbmltcG9ydCBJbml0aWF0aXZlc1ZpZXcgZnJvbSAnLi8wN19uZXdfaW5pdGlhdGl2ZXMuanMnO1xyXG5pbXBvcnQgU3VtbWFyeVZpZXcgZnJvbSAnLi8wOF9zdW1tYXJ5LmpzJztcclxuaW1wb3J0IEZpbmlzaFZpZXcgZnJvbSAnLi8wOV9maW5pc2guanMnO1xyXG5cclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlLCBDdXJyZW50RnVuZCwgQ3VycmVudFBhZ2UgfSBmcm9tICcuLi9tb2RlbHMvJztcclxuaW1wb3J0IHsgRklTQ0FMX1lFQVIsIFBBR0VfTEFCRUxTIH0gZnJvbSAnLi4vY29uc3RhbnRzLyc7XHJcblxyXG4vLyBJbml0aWFsaXplIHBhZ2VzIGdsb2JhbGx5IG9uY2VcclxuY29uc3QgUEFHRVMgPSB7XHJcbiAgICAnd2VsY29tZSc6IG5ldyBXZWxjb21lVmlldygpLFxyXG4gICAgJ3VwbG9hZCc6IG5ldyBVcGxvYWRWaWV3KCksXHJcbiAgICAnYmFzZWxpbmUtbGFuZGluZyc6IG5ldyBGdW5kVmlldygpLFxyXG4gICAgJ3JldmVudWUnOiBuZXcgUmV2ZW51ZVZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ3BlcnNvbm5lbCc6IG5ldyBQZXJzb25uZWxWaWV3KEZJU0NBTF9ZRUFSKSxcclxuICAgICdvdmVydGltZSc6IG5ldyBPdmVydGltZVZpZXcoRklTQ0FMX1lFQVIpLFxyXG4gICAgJ25vbnBlcnNvbm5lbCc6IG5ldyBOb25QZXJzb25uZWxWaWV3KEZJU0NBTF9ZRUFSKSxcclxuICAgICduZXctaW5pdHMnOiBuZXcgSW5pdGlhdGl2ZXNWaWV3KCksXHJcbiAgICAnc3VtbWFyeSc6IG5ldyBTdW1tYXJ5VmlldygpLFxyXG4gICAgJ2ZpbmlzaCc6IG5ldyBGaW5pc2hWaWV3KClcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KSB7XHJcbiAgICB2YXIgcGFnZV9zdGF0ZSA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuXHJcbiAgICAvLyBQZXJmb3JtIGNsZWFudXAgZnJvbSB0aGUgY3VycmVudCBwYWdlXHJcbiAgICBpZiAoUEFHRVNbcGFnZV9zdGF0ZV0pIHtcclxuICAgICAgICBQQUdFU1twYWdlX3N0YXRlXS5jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFBBR0VTW25ld19wYWdlX2tleV0pIHtcclxuICAgICAgICBQQUdFU1tuZXdfcGFnZV9rZXldLnZpc2l0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIHBhZ2UgaW5pdGlhbGl6ZXIgZm91bmQgZm9yIHN0YXRlOiAke25ld19wYWdlX2tleX1gKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbmV4dFBhZ2VWYWx1ZSgpIHtcclxuICAgIHZhciBwYWdlX3N0YXRlID0gQ3VycmVudFBhZ2UubG9hZCgpO1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKFBBR0VTKTtcclxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGtleXMuaW5kZXhPZihwYWdlX3N0YXRlKTtcclxuXHJcbiAgICBpZiAoQ3VycmVudFBhZ2UubG9hZCgpID09ICdub25wZXJzb25uZWwnKSB7XHJcbiAgICAgICAgRnVuZExvb2t1cFRhYmxlLmVkaXRGdW5kKEN1cnJlbnRGdW5kLm51bWJlcigpKTtcclxuICAgICAgICBpZiAoRnVuZExvb2t1cFRhYmxlLmZ1bmRzTGVmdCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnYmFzZWxpbmUtbGFuZGluZyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCAmJiBjdXJyZW50SW5kZXggPCBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb25zdCBuZXh0S2V5ID0ga2V5c1tjdXJyZW50SW5kZXggKyAxXTtcclxuICAgICAgICByZXR1cm4gbmV4dEtleTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5leHRQYWdlKCkge1xyXG4gICAgdmlzaXRQYWdlKG5leHRQYWdlVmFsdWUoKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXh0UGFnZUxhYmVsKCkge1xyXG4gICAgcmV0dXJuIFBBR0VfTEFCRUxTW25leHRQYWdlVmFsdWUoKV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxhc3RQYWdlVmFsdWUoKSB7XHJcbiAgICB2YXIgcGFnZV9zdGF0ZSA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhQQUdFUyk7XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBrZXlzLmluZGV4T2YocGFnZV9zdGF0ZSk7XHJcbiAgICBcclxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkge1xyXG4gICAgICAgIHJldHVybiBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFzdFBhZ2UoKSB7XHJcbiAgICB2aXNpdFBhZ2UobGFzdFBhZ2VWYWx1ZSgpKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RQYWdlTGFiZWwoKSB7XHJcbiAgICByZXR1cm4gUEFHRV9MQUJFTFNbbGFzdFBhZ2VWYWx1ZSgpXTtcclxufSIsImltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi92aWV3cy92aWV3X2xvZ2ljXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQ3VycmVudFBhZ2UgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihwYWdlKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xyXG4gICAgfSxcclxuICAgIGxvYWQgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcclxuICAgIH0sXHJcbiAgICB2aXNpdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdmlzaXRQYWdlKHRoaXMubG9hZCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3VycmVudFBhZ2U7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsU3RvcmFnZVNpemUoKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiBsb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IGtleVNpemUgPSBrZXkubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVTaXplID0gbG9jYWxTdG9yYWdlW2tleV0ubGVuZ3RoICogMjsgLy8gZWFjaCBjaGFyYWN0ZXIgaXMgMiBieXRlc1xyXG4gICAgICAgICAgICB0b3RhbCArPSBrZXlTaXplICsgdmFsdWVTaXplO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0Qnl0ZXModG90YWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMgPSAyKSB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XHJcbiAgICBjb25zdCBrID0gMTAyNDtcclxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV07XHJcbn1cclxuIiwiLy8gSW1wb3J0IHN0eWxlc1xyXG5pbXBvcnQgJy4uL2Nzcy9jb21tb24uY3NzJztcclxuXHJcbi8vIEltcG9ydCBmdW5jdGlvbnNcclxuaW1wb3J0IEN1cnJlbnRQYWdlIGZyb20gJy4vbW9kZWxzL2N1cnJlbnRfcGFnZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBnZXRMb2NhbFN0b3JhZ2VTaXplIH0gZnJvbSAnLi91dGlscy9zdG9yYWdlX3V0aWxzLmpzJztcclxuXHJcbi8vIEluaXRpYWxpemUgb25seSBvbmNlIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZFxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgQ3VycmVudFBhZ2UudmlzaXQoKTtcclxuICAgIGNvbnNvbGUubG9nKCdMb2NhbCBTdG9yYWdlIFVzZWQ6JywgZ2V0TG9jYWxTdG9yYWdlU2l6ZSgpKTtcclxufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///424\n")},404:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\r\n /* colors */\r\n --orange: #FB6523;\r\n --yellow: #D99733;\r\n --blue: #43748E;\r\n --lightBlue: #b7c9e2;\r\n --darkGray: #373A37;\r\n --mediumGray: #D0D0D0;\r\n --lightGray: #F2F2F2;\r\n --white: #FBFDFB;\r\n --black: #212121;\r\n --green: #71BC78;\r\n --citygreen: #004445;\r\n --spiritgreen: #279989;\r\n --palegreen: #9FD5B3;\r\n --verypalegreen: #DFF5E3;\r\n --accentyellow: #feb70d;\r\n --nearblack: #18252a;\r\n /* fonts */\r\n font-family: \'Nunito\', sans-serif;\r\n font-size: 14px;\r\n /* spacing */\r\n --header-height : 105px;\r\n --sidebar-width: 300px;\r\n}\r\n\r\n/* Button styling */\r\n\r\n.btn {\r\n cursor: pointer;\r\n padding: 6px;\r\n margin-top: 5px;\r\n margin-right : 2px;\r\n margin-left: 2px;\r\n border-radius: 10px;\r\n background-color: gray;\r\n color: white; \r\n}\r\n\r\n/* Font application for all text */\r\nbody, button, input, textarea, select, .sidebar, table {\r\n font-family: var(--font-family), sans-serif;\r\n }\r\n\r\n#main-panel {\r\n /* display: flex; */\r\n /* flex-direction: column; */\r\n justify-content: center; /* This will center content vertically */\r\n min-height: calc(100vh - var(--header-height)) ; \r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n padding-top: 25px;\r\n padding-bottom: 25px;\r\n margin: 0;\r\n}\r\n\r\n/* Font awesome */\r\n\r\ni.fas.fa-check { \r\n font-size: 1.5em;\r\n color: var(--spiritgreen);\r\n margin-right: 10px;\r\n}\r\n`, "",{"version":3,"sources":["webpack://./src/css/common.css"],"names":[],"mappings":"AAAA;IACI,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,UAAU;IACV,iCAAiC;IACjC,eAAe;IACf,YAAY;IACZ,uBAAuB;IACvB,sBAAsB;AAC1B;;AAEA,mBAAmB;;AAEnB;IACI,eAAe;IACf,YAAY;IACZ,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,YAAY;AAChB;;AAEA,mCAAmC;AACnC;IACI,2CAA2C;EAC7C;;AAEF;IACI,mBAAmB;IACnB,4BAA4B;IAC5B,uBAAuB,EAAE,wCAAwC;IACjE,+CAA+C;IAC/C,oDAAoD;IACpD,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;AACb;;AAEA,iBAAiB;;AAEjB;IACI,gBAAgB;IAChB,yBAAyB;IACzB,kBAAkB;AACtB","sourcesContent":[":root {\\r\\n /* colors */\\r\\n --orange: #FB6523;\\r\\n --yellow: #D99733;\\r\\n --blue: #43748E;\\r\\n --lightBlue: #b7c9e2;\\r\\n --darkGray: #373A37;\\r\\n --mediumGray: #D0D0D0;\\r\\n --lightGray: #F2F2F2;\\r\\n --white: #FBFDFB;\\r\\n --black: #212121;\\r\\n --green: #71BC78;\\r\\n --citygreen: #004445;\\r\\n --spiritgreen: #279989;\\r\\n --palegreen: #9FD5B3;\\r\\n --verypalegreen: #DFF5E3;\\r\\n --accentyellow: #feb70d;\\r\\n --nearblack: #18252a;\\r\\n /* fonts */\\r\\n font-family: \'Nunito\', sans-serif;\\r\\n font-size: 14px;\\r\\n /* spacing */\\r\\n --header-height : 105px;\\r\\n --sidebar-width: 300px;\\r\\n}\\r\\n\\r\\n/* Button styling */\\r\\n\\r\\n.btn {\\r\\n cursor: pointer;\\r\\n padding: 6px;\\r\\n margin-top: 5px;\\r\\n margin-right : 2px;\\r\\n margin-left: 2px;\\r\\n border-radius: 10px;\\r\\n background-color: gray;\\r\\n color: white; \\r\\n}\\r\\n\\r\\n/* Font application for all text */\\r\\nbody, button, input, textarea, select, .sidebar, table {\\r\\n font-family: var(--font-family), sans-serif;\\r\\n }\\r\\n\\r\\n#main-panel {\\r\\n /* display: flex; */\\r\\n /* flex-direction: column; */\\r\\n justify-content: center; /* This will center content vertically */\\r\\n min-height: calc(100vh - var(--header-height)) ; \\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-top: 25px;\\r\\n padding-bottom: 25px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n/* Font awesome */\\r\\n\\r\\ni.fas.fa-check { \\r\\n font-size: 1.5em;\\r\\n color: var(--spiritgreen);\\r\\n margin-right: 10px;\\r\\n}\\r\\n"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/ZjdjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xyXG4gICAgLyogY29sb3JzICovXHJcbiAgICAtLW9yYW5nZTogI0ZCNjUyMztcclxuICAgIC0teWVsbG93OiAjRDk5NzMzO1xyXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xyXG4gICAgLS1saWdodEJsdWU6ICNiN2M5ZTI7XHJcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xyXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xyXG4gICAgLS1saWdodEdyYXk6ICNGMkYyRjI7XHJcbiAgICAtLXdoaXRlOiAjRkJGREZCO1xyXG4gICAgLS1ibGFjazogIzIxMjEyMTtcclxuICAgIC0tZ3JlZW46ICM3MUJDNzg7XHJcbiAgICAtLWNpdHlncmVlbjogIzAwNDQ0NTtcclxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XHJcbiAgICAtLXBhbGVncmVlbjogIzlGRDVCMztcclxuICAgIC0tdmVyeXBhbGVncmVlbjogI0RGRjVFMztcclxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xyXG4gICAgLS1uZWFyYmxhY2s6ICMxODI1MmE7XHJcbiAgICAvKiBmb250cyAqL1xyXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgLyogc3BhY2luZyAqL1xyXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XHJcbiAgICAtLXNpZGViYXItd2lkdGg6IDMwMHB4O1xyXG59XHJcblxyXG4vKiBCdXR0b24gc3R5bGluZyAqL1xyXG5cclxuLmJ0biB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwYWRkaW5nOiA2cHg7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgICBjb2xvcjogd2hpdGU7IFxyXG59XHJcblxyXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cclxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcclxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuI21haW4tcGFuZWwge1xyXG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cclxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cclxuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcclxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXHJcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG59XHJcblxyXG4vKiBGb250IGF3ZXNvbWUgKi9cclxuXHJcbmkuZmFzLmZhLWNoZWNrIHsgXHJcbiAgICBmb250LXNpemU6IDEuNWVtO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jc3MvY29tbW9uLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGlDQUFpQztJQUNqQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixZQUFZO0FBQ2hCOztBQUVBLG1DQUFtQztBQUNuQztJQUNJLDJDQUEyQztFQUM3Qzs7QUFFRjtJQUNJLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsdUJBQXVCLEVBQUUsd0NBQXdDO0lBQ2pFLCtDQUErQztJQUMvQyxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixTQUFTO0FBQ2I7O0FBRUEsaUJBQWlCOztBQUVqQjtJQUNJLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXHJcXG4gICAgLyogY29sb3JzICovXFxyXFxuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xcclxcbiAgICAtLXllbGxvdzogI0Q5OTczMztcXHJcXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xcclxcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcXHJcXG4gICAgLS1kYXJrR3JheTogIzM3M0EzNztcXHJcXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xcclxcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXHJcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXHJcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXHJcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXHJcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxyXFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxyXFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcclxcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxyXFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcclxcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXHJcXG4gICAgLyogZm9udHMgKi9cXHJcXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIC8qIHNwYWNpbmcgKi9cXHJcXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTA1cHg7XFxyXFxuICAgIC0tc2lkZWJhci13aWR0aDogMzAwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcGFkZGluZzogNnB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIG1hcmdpbi1yaWdodCA6IDJweDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gICAgY29sb3I6IHdoaXRlOyBcXHJcXG59XFxyXFxuXFxyXFxuLyogRm9udCBhcHBsaWNhdGlvbiBmb3IgYWxsIHRleHQgICovXFxyXFxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KSwgc2Fucy1zZXJpZjtcXHJcXG4gIH1cXHJcXG5cXHJcXG4jbWFpbi1wYW5lbCB7XFxyXFxuICAgIC8qIGRpc3BsYXk6IGZsZXg7ICovXFxyXFxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBUaGlzIHdpbGwgY2VudGVyIGNvbnRlbnQgdmVydGljYWxseSAqL1xcclxcbiAgICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gdmFyKC0taGVhZGVyLWhlaWdodCkpIDsgXFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMjVweDtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGb250IGF3ZXNvbWUgKi9cXHJcXG5cXHJcXG5pLmZhcy5mYS1jaGVjayB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///404\n')},995:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.summary-accordion {\r\n width: 70%;\r\n margin: auto;\r\n}\r\n\r\n.accordion-title {\r\n margin-left: 15%;\r\n font-weight: bold;\r\n /* font-size: 20px; */\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-top: 30px;\r\n}\r\n\r\n.accordion-button:active, .accordion-button:not(.collapsed) {\r\n background-color: var(--palegreen);\r\n color: var(--citygreen);\r\n /* font-size: 20px; */\r\n}\r\n\r\n.accordion-table { \r\n width: 100%;\r\n font-size: 1.2em;\r\n /* border-collapse: separate; This is required for rounded corners */\r\n}\r\n\r\n.accordion-table td:last-child {\r\n text-align: right;\r\n padding-right: 15px;\r\n padding-bottom: 5px\r\n}\r\n\r\n.accordion-table tr {\r\n border-bottom: 1px solid black;\r\n border-top: none;\r\n border-right: none;\r\n border-left: none;\r\n}\r\n\r\n.accordion-table tr:last-child {\r\n border-bottom: none;\r\n background-color: var(--mediumGray);\r\n height : 50px;\r\n}\r\n\r\nspan.amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: 60px;\r\n}\r\n\r\n.accordion-header button {\r\n font-size: 0.8em;\r\n}\r\n\r\n.btn-add-init {\r\n background-color: var(--spiritgreen);\r\n border-color: var(--citygreen);\r\n /* position: absolute; */\r\n right: 0;\r\n /* margin-left: 20px; */\r\n /* margin-right: calc(20vw + 15px); */\r\n margin-top: 15px;\r\n}\r\n\r\n#supp-title {\r\n margin-top: 20px;\r\n}\r\n\r\n.btn-add-init:hover {\r\n background-color: var(--palegreen);\r\n}\r\n.add-init-btn-div{\r\n text-align: center;\r\n}\r\n\r\nspan.top-line-amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: calc(15vw + 20px);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/accordion/accordion.css"],"names":[],"mappings":"AAAA;IACI,UAAU;IACV,YAAY;AAChB;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;IAClC,uBAAuB;IACvB,qBAAqB;AACzB;;AAEA;IACI,WAAW;IACX,gBAAgB;IAChB,oEAAoE;AACxE;;AAEA;IACI,iBAAiB;IACjB,mBAAmB;IACnB;AACJ;;AAEA;IACI,8BAA8B;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;IACnB,mCAAmC;IACnC,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,oCAAoC;IACpC,8BAA8B;IAC9B,wBAAwB;IACxB,QAAQ;IACR,uBAAuB;IACvB,qCAAqC;IACrC,gBAAgB;AACpB;;AAEA;GACG,gBAAgB;AACnB;;AAEA;IACI,kCAAkC;AACtC;AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,+BAA+B;AACnC","sourcesContent":[".summary-accordion {\\r\\n width: 70%;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.accordion-title {\\r\\n margin-left: 15%;\\r\\n font-weight: bold;\\r\\n /* font-size: 20px; */\\r\\n padding-bottom: 10px;\\r\\n padding-left: 15px;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.accordion-button:active, .accordion-button:not(.collapsed) {\\r\\n background-color: var(--palegreen);\\r\\n color: var(--citygreen);\\r\\n /* font-size: 20px; */\\r\\n}\\r\\n\\r\\n.accordion-table { \\r\\n width: 100%;\\r\\n font-size: 1.2em;\\r\\n /* border-collapse: separate; This is required for rounded corners */\\r\\n}\\r\\n\\r\\n.accordion-table td:last-child {\\r\\n text-align: right;\\r\\n padding-right: 15px;\\r\\n padding-bottom: 5px\\r\\n}\\r\\n\\r\\n.accordion-table tr {\\r\\n border-bottom: 1px solid black;\\r\\n border-top: none;\\r\\n border-right: none;\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.accordion-table tr:last-child {\\r\\n border-bottom: none;\\r\\n background-color: var(--mediumGray);\\r\\n height : 50px;\\r\\n}\\r\\n\\r\\nspan.amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: 60px;\\r\\n}\\r\\n\\r\\n.accordion-header button {\\r\\n font-size: 0.8em;\\r\\n}\\r\\n\\r\\n.btn-add-init {\\r\\n background-color: var(--spiritgreen);\\r\\n border-color: var(--citygreen);\\r\\n /* position: absolute; */\\r\\n right: 0;\\r\\n /* margin-left: 20px; */\\r\\n /* margin-right: calc(20vw + 15px); */\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n#supp-title {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n.btn-add-init:hover {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n.add-init-btn-div{\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nspan.top-line-amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: calc(15vw + 20px);\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3M/ZjBmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnN1bW1hcnktYWNjb3JkaW9uIHtcclxuICAgIHdpZHRoOiA3MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGl0bGUge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDE1JTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMzBweDtcclxufVxyXG5cclxuLmFjY29yZGlvbi1idXR0b246YWN0aXZlLCAuYWNjb3JkaW9uLWJ1dHRvbjpub3QoLmNvbGxhcHNlZCkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgLyogZm9udC1zaXplOiAyMHB4OyAqL1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLXRhYmxlIHsgXHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGZvbnQtc2l6ZTogMS4yZW07XHJcbiAgICAvKiBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBUaGlzIGlzIHJlcXVpcmVkIGZvciByb3VuZGVkIGNvcm5lcnMgKi9cclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ZDpsYXN0LWNoaWxkIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHhcclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ciB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XHJcbiAgICBib3JkZXItdG9wOiBub25lO1xyXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xyXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGFibGUgdHI6bGFzdC1jaGlsZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XHJcbiAgICBoZWlnaHQgOiA1MHB4O1xyXG59XHJcblxyXG5zcGFuLmFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xyXG4gICAgZm9udC1zaXplOiAwLjhlbTtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7ICovXHJcbiAgICByaWdodDogMDtcclxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xyXG4gICAgLyogbWFyZ2luLXJpZ2h0OiBjYWxjKDIwdncgKyAxNXB4KTsgKi9cclxuICAgIG1hcmdpbi10b3A6IDE1cHg7XHJcbn1cclxuXHJcbiNzdXBwLXRpdGxlIHtcclxuICAgbWFyZ2luLXRvcDogMjBweDtcclxufVxyXG5cclxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG59XHJcbi5hZGQtaW5pdC1idG4tZGl2e1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5zcGFuLnRvcC1saW5lLWFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDE1dncgKyAyMHB4KTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksa0NBQWtDO0lBQ2xDLHVCQUF1QjtJQUN2QixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG9FQUFvRTtBQUN4RTs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkI7QUFDSjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQixtQ0FBbUM7SUFDbkMsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyw4QkFBOEI7SUFDOUIsd0JBQXdCO0lBQ3hCLFFBQVE7SUFDUix1QkFBdUI7SUFDdkIscUNBQXFDO0lBQ3JDLGdCQUFnQjtBQUNwQjs7QUFFQTtHQUNHLGdCQUFnQjtBQUNuQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0QztBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsK0JBQStCO0FBQ25DXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5zdW1tYXJ5LWFjY29yZGlvbiB7XFxyXFxuICAgIHdpZHRoOiA3MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10aXRsZSB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAxNSU7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWJ1dHRvbjphY3RpdmUsIC5hY2NvcmRpb24tYnV0dG9uOm5vdCguY29sbGFwc2VkKSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbiAgICAvKiBmb250LXNpemU6IDIwcHg7ICovXFxyXFxufVxcclxcblxcclxcbi5hY2NvcmRpb24tdGFibGUgeyBcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMS4yZW07XFxyXFxuICAgIC8qIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IFRoaXMgaXMgcmVxdWlyZWQgZm9yIHJvdW5kZWQgY29ybmVycyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRkOmxhc3QtY2hpbGQge1xcclxcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDVweFxcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBib3JkZXItdG9wOiBub25lO1xcclxcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLXRhYmxlIHRyOmxhc3QtY2hpbGQge1xcclxcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcXHJcXG4gICAgaGVpZ2h0IDogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5hbW91bnQge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICByaWdodDogMDtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xcclxcbiAgICBmb250LXNpemU6IDAuOGVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWFkZC1pbml0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7XFxyXFxuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgKi9cXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIC8qIG1hcmdpbi1sZWZ0OiAyMHB4OyAqL1xcclxcbiAgICAvKiBtYXJnaW4tcmlnaHQ6IGNhbGMoMjB2dyArIDE1cHgpOyAqL1xcclxcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4jc3VwcC10aXRsZSB7XFxyXFxuICAgbWFyZ2luLXRvcDogMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1hZGQtaW5pdDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxyXFxufVxcclxcbi5hZGQtaW5pdC1idG4tZGl2e1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbnNwYW4udG9wLWxpbmUtYW1vdW50IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXZ3ICsgMjBweCk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///995\n')},9:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `body {\r\n background-color: var(--lightGray);\r\n margin: 0;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\r\\n background-color: var(--lightGray);\\r\\n margin: 0;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxuICAgIG1hcmdpbjogMDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n')},39:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#file-input {\r\n margin-left: 40%;\r\n}\r\n\r\n/* Spinner Styles */\r\n.spinner {\r\n display: inline-block;\r\n width: 150px;\r\n height: 150px;\r\n border: 20px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: var(--spiritgreen);\r\n animation: spin 1s ease-in-out infinite;\r\n position: fixed; /* Ensures it stays fixed relative to the viewport */\r\n top: 20%; /* Center vertically */\r\n left: 43%; /* Center horizontally */\r\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\r\n z-index: 9999; /* Ensures it appears in front of other elements */\r\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\r\n padding: 20px; /* Optional: extra padding for better visibility */\r\n }\r\n \r\n @keyframes spin {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }`, "",{"version":3,"sources":["webpack://./src/js/components/file_upload/file_upload.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB;;AAEA,mBAAmB;AACnB;IACI,qBAAqB;IACrB,YAAY;IACZ,aAAa;IACb,qCAAqC;IACrC,kBAAkB;IAClB,oCAAoC;IACpC,uCAAuC;IACvC,eAAe,EAAE,oDAAoD;IACrE,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAE,wBAAwB;IACnC,gCAAgC,EAAE,mCAAmC;IACrE,aAAa,EAAE,kDAAkD;IACjE,0CAA0C,EAAE,+BAA+B;IAC3E,aAAa,EAAE,kDAAkD;EACnE;;EAEA;IACE;MACE,uBAAuB;IACzB;IACA;MACE,yBAAyB;IAC3B;EACF","sourcesContent":["#file-input {\\r\\n margin-left: 40%;\\r\\n}\\r\\n\\r\\n/* Spinner Styles */\\r\\n.spinner {\\r\\n display: inline-block;\\r\\n width: 150px;\\r\\n height: 150px;\\r\\n border: 20px solid rgba(0, 0, 0, 0.1);\\r\\n border-radius: 50%;\\r\\n border-top-color: var(--spiritgreen);\\r\\n animation: spin 1s ease-in-out infinite;\\r\\n position: fixed; /* Ensures it stays fixed relative to the viewport */\\r\\n top: 20%; /* Center vertically */\\r\\n left: 43%; /* Center horizontally */\\r\\n transform: translate(-50%, -50%); /* Centralize the spinner exactly */\\r\\n z-index: 9999; /* Ensures it appears in front of other elements */\\r\\n background-color: rgba(255, 255, 255, 0.8); /* Optional: light background */\\r\\n padding: 20px; /* Optional: extra padding for better visibility */\\r\\n }\\r\\n \\r\\n @keyframes spin {\\r\\n 0% {\\r\\n transform: rotate(0deg);\\r\\n }\\r\\n 100% {\\r\\n transform: rotate(360deg);\\r\\n }\\r\\n }"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9jNTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjZmlsZS1pbnB1dCB7XHJcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xyXG59XHJcblxyXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xyXG4uc3Bpbm5lciB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMTUwcHg7XHJcbiAgICBoZWlnaHQ6IDE1MHB4O1xyXG4gICAgYm9yZGVyOiAyMHB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGFuaW1hdGlvbjogc3BpbiAxcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cclxuICAgIHRvcDogMjAlOyAvKiBDZW50ZXIgdmVydGljYWxseSAqL1xyXG4gICAgbGVmdDogNDMlOyAvKiBDZW50ZXIgaG9yaXpvbnRhbGx5ICovXHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXHJcbiAgICB6LWluZGV4OiA5OTk5OyAvKiBFbnN1cmVzIGl0IGFwcGVhcnMgaW4gZnJvbnQgb2Ygb3RoZXIgZWxlbWVudHMgKi9cclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgLyogT3B0aW9uYWw6IGxpZ2h0IGJhY2tncm91bmQgKi9cclxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xyXG4gIH1cclxuICBcclxuICBAa2V5ZnJhbWVzIHNwaW4ge1xyXG4gICAgMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcclxuICAgIH1cclxuICAgIDEwMCUge1xyXG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xyXG4gICAgfVxyXG4gIH1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQSxtQkFBbUI7QUFDbkI7SUFDSSxxQkFBcUI7SUFDckIsWUFBWTtJQUNaLGFBQWE7SUFDYixxQ0FBcUM7SUFDckMsa0JBQWtCO0lBQ2xCLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsZUFBZSxFQUFFLG9EQUFvRDtJQUNyRSxRQUFRLEVBQUUsc0JBQXNCO0lBQ2hDLFNBQVMsRUFBRSx3QkFBd0I7SUFDbkMsZ0NBQWdDLEVBQUUsbUNBQW1DO0lBQ3JFLGFBQWEsRUFBRSxrREFBa0Q7SUFDakUsMENBQTBDLEVBQUUsK0JBQStCO0lBQzNFLGFBQWEsRUFBRSxrREFBa0Q7RUFDbkU7O0VBRUE7SUFDRTtNQUNFLHVCQUF1QjtJQUN6QjtJQUNBO01BQ0UseUJBQXlCO0lBQzNCO0VBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI2ZpbGUtaW5wdXQge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBTcGlubmVyIFN0eWxlcyAqL1xcclxcbi5zcGlubmVyIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB3aWR0aDogMTUwcHg7XFxyXFxuICAgIGhlaWdodDogMTUwcHg7XFxyXFxuICAgIGJvcmRlcjogMjBweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBhbmltYXRpb246IHNwaW4gMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRW5zdXJlcyBpdCBzdGF5cyBmaXhlZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgKi9cXHJcXG4gICAgdG9wOiAyMCU7IC8qIENlbnRlciB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIGxlZnQ6IDQzJTsgLyogQ2VudGVyIGhvcml6b250YWxseSAqL1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgLyogQ2VudHJhbGl6ZSB0aGUgc3Bpbm5lciBleGFjdGx5ICovXFxyXFxuICAgIHotaW5kZXg6IDk5OTk7IC8qIEVuc3VyZXMgaXQgYXBwZWFycyBpbiBmcm9udCBvZiBvdGhlciBlbGVtZW50cyAqL1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7IC8qIE9wdGlvbmFsOiBsaWdodCBiYWNrZ3JvdW5kICovXFxyXFxuICAgIHBhZGRpbmc6IDIwcHg7IC8qIE9wdGlvbmFsOiBleHRyYSBwYWRkaW5nIGZvciBiZXR0ZXIgdmlzaWJpbGl0eSAqL1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICBAa2V5ZnJhbWVzIHNwaW4ge1xcclxcbiAgICAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxyXFxuICAgIH1cXHJcXG4gICAgMTAwJSB7XFxyXFxuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gICAgfVxcclxcbiAgfVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n')},109:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `textarea {height: 100px; width: 100%;}\r\n\r\ntextarea, input, select {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.btn-submit {\r\n margin-top: 20px;\r\n width: 60%;\r\n margin-left: 20%;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#new-form label {\r\n display: block; /* Ensure label is on its own line */\r\n margin-bottom: 0.25em; \r\n}\r\n\r\n#new-form select {\r\n min-width: 300px;\r\n}\r\n\r\n/* Thicker red border when focused */\r\ninput[readonly]:focus {\r\n border: 2px solid red;\r\n outline: none; /* Remove the default outline */\r\n}\r\n\r\n.error-message {\r\n color: red;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC;;AAEA;IACI,cAAc,EAAE,oCAAoC;IACpD,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;AACpB;;AAEA,oCAAoC;AACpC;IACI,qBAAqB;IACrB,aAAa,EAAE,+BAA+B;AAClD;;AAEA;IACI,UAAU;AACd","sourcesContent":["textarea {height: 100px; width: 100%;}\\r\\n\\r\\ntextarea, input, select {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.btn-submit {\\r\\n margin-top: 20px;\\r\\n width: 60%;\\r\\n margin-left: 20%;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#new-form label {\\r\\n display: block; /* Ensure label is on its own line */\\r\\n margin-bottom: 0.25em; \\r\\n}\\r\\n\\r\\n#new-form select {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n/* Thicker red border when focused */\\r\\ninput[readonly]:focus {\\r\\n border: 2px solid red;\\r\\n outline: none; /* Remove the default outline */\\r\\n}\\r\\n\\r\\n.error-message {\\r\\n color: red;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3M/ZTM4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgdGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cclxuXHJcbnRleHRhcmVhLCBpbnB1dCwgc2VsZWN0IHtcclxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcclxufVxyXG5cclxuLmJ0bi1zdWJtaXQge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG59XHJcblxyXG4jbmV3LWZvcm0gbGFiZWwge1xyXG4gICAgZGlzcGxheTogYmxvY2s7IC8qIEVuc3VyZSBsYWJlbCBpcyBvbiBpdHMgb3duIGxpbmUgKi9cclxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXHJcbn1cclxuXHJcbiNuZXctZm9ybSBzZWxlY3Qge1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxufVxyXG5cclxuLyogVGhpY2tlciByZWQgYm9yZGVyIHdoZW4gZm9jdXNlZCAqL1xyXG5pbnB1dFtyZWFkb25seV06Zm9jdXMge1xyXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xyXG4gICAgb3V0bGluZTogbm9uZTsgLyogUmVtb3ZlIHRoZSBkZWZhdWx0IG91dGxpbmUgKi9cclxufVxyXG5cclxuLmVycm9yLW1lc3NhZ2Uge1xyXG4gICAgY29sb3I6IHJlZDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxVQUFVLGFBQWEsRUFBRSxXQUFXLENBQUM7O0FBRXJDO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksY0FBYyxFQUFFLG9DQUFvQztJQUNwRCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUEsb0NBQW9DO0FBQ3BDO0lBQ0kscUJBQXFCO0lBQ3JCLGFBQWEsRUFBRSwrQkFBK0I7QUFDbEQ7O0FBRUE7SUFDSSxVQUFVO0FBQ2RcIixcInNvdXJjZXNDb250ZW50XCI6W1widGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cXHJcXG5cXHJcXG50ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdCB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1zdWJtaXQge1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICB3aWR0aDogNjAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBsYWJlbCB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBFbnN1cmUgbGFiZWwgaXMgb24gaXRzIG93biBsaW5lICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDAuMjVlbTsgXFxyXFxufVxcclxcblxcclxcbiNuZXctZm9ybSBzZWxlY3Qge1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUaGlja2VyIHJlZCBib3JkZXIgd2hlbiBmb2N1c2VkICovXFxyXFxuaW5wdXRbcmVhZG9ubHldOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyOiAycHggc29saWQgcmVkO1xcclxcbiAgICBvdXRsaW5lOiBub25lOyAvKiBSZW1vdmUgdGhlIGRlZmF1bHQgb3V0bGluZSAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZXJyb3ItbWVzc2FnZSB7XFxyXFxuICAgIGNvbG9yOiByZWQ7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n')},107:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\r\nh1 {\r\n text-align: center;\r\n font-size: 30px;\r\n}\r\n\r\nh2 {\r\n color: var(--darkGray);\r\n text-align: center;\r\n font-size: 20px;\r\n}\r\n\r\nheader {\r\n align-items: center;\r\n background-color: white;\r\n padding: 5px;\r\n border-bottom: 1px solid var(--citygreen); \r\n /* border: 1px solid var(--citygreen); */\r\n height: var(--header-height);\r\n /* width: calc(100vw - var(--sidebar-width)); */\r\n padding-left: 20px;\r\n}\r\n\r\n/* Logo styling */\r\n#logo {\r\n height: 50px; /* Or your desired size */\r\n margin-right: 20px; /* Optional: space between logo and title */\r\n margin-bottom: -50px;\r\n margin-top: 10px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,YAAY;IACZ,yCAAyC;IACzC,yCAAyC;IACzC,4BAA4B;IAC5B,+CAA+C;IAC/C,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,YAAY,EAAE,yBAAyB;IACvC,kBAAkB,EAAE,2CAA2C;IAC/D,oBAAoB;IACpB,gBAAgB;AACpB","sourcesContent":["\\r\\nh1 {\\r\\n text-align: center;\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\nh2 {\\r\\n color: var(--darkGray);\\r\\n text-align: center;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\nheader {\\r\\n align-items: center;\\r\\n background-color: white;\\r\\n padding: 5px;\\r\\n border-bottom: 1px solid var(--citygreen); \\r\\n /* border: 1px solid var(--citygreen); */\\r\\n height: var(--header-height);\\r\\n /* width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n/* Logo styling */\\r\\n#logo {\\r\\n height: 50px; /* Or your desired size */\\r\\n margin-right: 20px; /* Optional: space between logo and title */\\r\\n margin-bottom: -50px;\\r\\n margin-top: 10px;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmNzcz8yZjRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBcclxuaDEge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG59XHJcblxyXG5oZWFkZXIge1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgcGFkZGluZzogNXB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7IFxyXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXHJcbiAgICBoZWlnaHQ6IHZhcigtLWhlYWRlci1oZWlnaHQpO1xyXG4gICAgLyogd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICovXHJcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbn1cclxuXHJcbi8qIExvZ28gc3R5bGluZyAqL1xyXG4jbG9nbyB7XHJcbiAgICBoZWlnaHQ6IDUwcHg7IC8qIE9yIHlvdXIgZGVzaXJlZCBzaXplICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXHJcbiAgICBtYXJnaW4tYm90dG9tOiAtNTBweDtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1oseUNBQXlDO0lBQ3pDLHlDQUF5QztJQUN6Qyw0QkFBNEI7SUFDNUIsK0NBQStDO0lBQy9DLGtCQUFrQjtBQUN0Qjs7QUFFQSxpQkFBaUI7QUFDakI7SUFDSSxZQUFZLEVBQUUseUJBQXlCO0lBQ3ZDLGtCQUFrQixFQUFFLDJDQUEyQztJQUMvRCxvQkFBb0I7SUFDcEIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIlxcclxcbmgxIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDMwcHg7XFxyXFxufVxcclxcblxcclxcbmgyIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBmb250LXNpemU6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbmhlYWRlciB7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXHJcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxyXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxyXFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIExvZ28gc3R5bGluZyAqL1xcclxcbiNsb2dvIHtcXHJcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n')},95:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#job-name {\r\n margin-left: 5%;\r\n width: 95%;\r\n border: 0px;\r\n font-weight: bold;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/modal/modal.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,UAAU;IACV,WAAW;IACX,iBAAiB;AACrB","sourcesContent":["#job-name {\\r\\n margin-left: 5%;\\r\\n width: 95%;\\r\\n border: 0px;\\r\\n font-weight: bold;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL21vZGFsL21vZGFsLmNzcz82YWNkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjam9iLW5hbWUge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDUlO1xyXG4gICAgd2lkdGg6IDk1JTtcclxuICAgIGJvcmRlcjogMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL21vZGFsL21vZGFsLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsV0FBVztJQUNYLGlCQUFpQjtBQUNyQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjam9iLW5hbWUge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNSU7XFxyXFxuICAgIHdpZHRoOiA5NSU7XFxyXFxuICAgIGJvcmRlcjogMHB4O1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///95\n')},595:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#nav-btns {\r\n margin: 20px;\r\n text-align: center;\r\n margin-top: 5px;\r\n margin-bottom: 5px;\r\n /* position: absolute; or \'absolute\' depending on use-case */\r\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\r\n}\r\n\r\n#btn-next, #btn-last, #return-to-summary {\r\n background-color: var(--darkGray);\r\n}\r\n\r\n#btn-next:hover, #btn-last:hover, #return-to-summary:hover {\r\n background-color: var(--yellow);\r\n color: var(--darkGray);\r\n}\r\n\r\n/* Add style for when you cannot click the next button */\r\n#btn-next.disabled, #btn-last.disabled,\r\n#btn-next.disabled:hover, #btn-last.disabled:hover {\r\n background-color: gray;\r\n color: white;\r\n pointer-events: none;\r\n \r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,4DAA4D;IAC5D,yFAAyF;AAC7F;;AAEA;IACI,iCAAiC;AACrC;;AAEA;IACI,+BAA+B;IAC/B,sBAAsB;AAC1B;;AAEA,wDAAwD;AACxD;;IAEI,sBAAsB;IACtB,YAAY;IACZ,oBAAoB;;AAExB","sourcesContent":["#nav-btns {\\r\\n margin: 20px;\\r\\n text-align: center;\\r\\n margin-top: 5px;\\r\\n margin-bottom: 5px;\\r\\n /* position: absolute; or \'absolute\' depending on use-case */\\r\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\r\\n}\\r\\n\\r\\n#btn-next, #btn-last, #return-to-summary {\\r\\n background-color: var(--darkGray);\\r\\n}\\r\\n\\r\\n#btn-next:hover, #btn-last:hover, #return-to-summary:hover {\\r\\n background-color: var(--yellow);\\r\\n color: var(--darkGray);\\r\\n}\\r\\n\\r\\n/* Add style for when you cannot click the next button */\\r\\n#btn-next.disabled, #btn-last.disabled,\\r\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\r\\n background-color: gray;\\r\\n color: white;\\r\\n pointer-events: none;\\r\\n \\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzPzkwNWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYCNuYXYtYnRucyB7XHJcbiAgICBtYXJnaW46IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXHJcbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cclxufVxyXG5cclxuI2J0bi1uZXh0LCAjYnRuLWxhc3QsICNyZXR1cm4tdG8tc3VtbWFyeSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XHJcbn1cclxuXHJcbiNidG4tbmV4dDpob3ZlciwgI2J0bi1sYXN0OmhvdmVyLCAjcmV0dXJuLXRvLXN1bW1hcnk6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0teWVsbG93KTtcclxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XHJcbn1cclxuXHJcbi8qIEFkZCBzdHlsZSBmb3Igd2hlbiB5b3UgY2Fubm90IGNsaWNrIHRoZSBuZXh0IGJ1dHRvbiAqL1xyXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcclxuI2J0bi1uZXh0LmRpc2FibGVkOmhvdmVyLCAjYnRuLWxhc3QuZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gICAgXHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQiw0REFBNEQ7SUFDNUQseUZBQXlGO0FBQzdGOztBQUVBO0lBQ0ksaUNBQWlDO0FBQ3JDOztBQUVBO0lBQ0ksK0JBQStCO0lBQy9CLHNCQUFzQjtBQUMxQjs7QUFFQSx3REFBd0Q7QUFDeEQ7O0lBRUksc0JBQXNCO0lBQ3RCLFlBQVk7SUFDWixvQkFBb0I7O0FBRXhCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNuYXYtYnRucyB7XFxyXFxuICAgIG1hcmdpbjogMjBweDtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG4gICAgLyogcG9zaXRpb246IGFic29sdXRlOyBvciAnYWJzb2x1dGUnIGRlcGVuZGluZyBvbiB1c2UtY2FzZSAqL1xcclxcbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cXHJcXG59XFxyXFxuXFxyXFxuI2J0bi1uZXh0LCAjYnRuLWxhc3QsICNyZXR1cm4tdG8tc3VtbWFyeSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIsICNyZXR1cm4tdG8tc3VtbWFyeTpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXllbGxvdyk7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxyXFxufVxcclxcblxcclxcbi8qIEFkZCBzdHlsZSBmb3Igd2hlbiB5b3UgY2Fubm90IGNsaWNrIHRoZSBuZXh0IGJ1dHRvbiAqL1xcclxcbiNidG4tbmV4dC5kaXNhYmxlZCwgI2J0bi1sYXN0LmRpc2FibGVkLFxcclxcbiNidG4tbmV4dC5kaXNhYmxlZDpob3ZlciwgI2J0bi1sYXN0LmRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG4gICAgXFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///595\n')},225:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `div#prompt-div {\r\n display: none;\r\n width: 80%;\r\n margin: auto;\r\n text-align: center;\r\n}\r\n\r\nh3#prompt {\r\n text-align: center;\r\n font-size : 1.2em;\r\n}\r\n\r\n#option1, #option2 { \r\n font-size: 1.5em;\r\n border-color: var(--citygreen); \r\n border-width: 2px;\r\n background-color: var(--white);\r\n color: var(--citygreen);\r\n}\r\n\r\n#option1:hover, #option2:hover { \r\n background-color: var(--spiritgreen);\r\n color: white;\r\n}\r\n\r\n#option2.clicked, #option1.clicked {\r\n font-weight: bold;\r\n background-color: var(--spiritgreen);\r\n color: white;\r\n border-width: 3;\r\n}\r\n\r\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\r\n background-color: lightgray;\r\n color: gray;\r\n pointer-events: none;\r\n border-color: gray;\r\n}\r\n\r\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,UAAU;IACV,YAAY;IACZ,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;IACjB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,oCAAoC;IACpC,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,oCAAoC;IACpC,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI,2BAA2B;IAC3B,WAAW;IACX,oBAAoB;IACpB,kBAAkB;AACtB","sourcesContent":["div#prompt-div {\\r\\n display: none;\\r\\n width: 80%;\\r\\n margin: auto;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nh3#prompt {\\r\\n text-align: center;\\r\\n font-size : 1.2em;\\r\\n}\\r\\n\\r\\n#option1, #option2 { \\r\\n font-size: 1.5em;\\r\\n border-color: var(--citygreen); \\r\\n border-width: 2px;\\r\\n background-color: var(--white);\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n#option1:hover, #option2:hover { \\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n#option2.clicked, #option1.clicked {\\r\\n font-weight: bold;\\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n border-width: 3;\\r\\n}\\r\\n\\r\\n#option1.disabled, #option2.disabled, #option1.disabled:hover, #option2.disabled:hover {\\r\\n background-color: lightgray;\\r\\n color: gray;\\r\\n pointer-events: none;\\r\\n border-color: gray;\\r\\n}\\r\\n\\r\\n"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzP2U2OTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGRpdiNwcm9tcHQtZGl2IHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB3aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG5oMyNwcm9tcHQge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1zaXplIDogMS4yZW07XHJcbn1cclxuXHJcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxyXG4gICAgZm9udC1zaXplOiAxLjVlbTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTsgXHJcbiAgICBib3JkZXItd2lkdGg6IDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG59XHJcblxyXG4jb3B0aW9uMTpob3ZlciwgI29wdGlvbjI6aG92ZXIgeyBcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci13aWR0aDogMztcclxufVxyXG5cclxuI29wdGlvbjEuZGlzYWJsZWQsICNvcHRpb24yLmRpc2FibGVkLCAjb3B0aW9uMS5kaXNhYmxlZDpob3ZlciwgI29wdGlvbjIuZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xyXG4gICAgY29sb3I6IGdyYXk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcclxufVxyXG5cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixVQUFVO0lBQ1YsWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlCQUFpQjtJQUNqQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdiNwcm9tcHQtZGl2IHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmgzI3Byb21wdCB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC1zaXplIDogMS4yZW07XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxcclxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3JkZXItd2lkdGg6IDM7XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xLmRpc2FibGVkLCAjb3B0aW9uMi5kaXNhYmxlZCwgI29wdGlvbjEuZGlzYWJsZWQ6aG92ZXIsICNvcHRpb24yLmRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcclxcbiAgICBjb2xvcjogZ3JheTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///225\n')},263:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar-panel {\r\n background-color: lightgrey; \r\n /* min-height: 100vh; Full height of viewport */\r\n }\r\n\r\n#supp-total .stat {\r\n color: var(--yellow);\r\n}\r\n\r\n.stat {\r\n font-weight: bold;\r\n}\r\n\r\n#sidebar-panel {\r\n height: 100%; /* Full height of the viewport */\r\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\r\n z-index: 1; /* Stay on top */\r\n top: 0; /* Stay at the top */\r\n right: 0; /* Sidebar appears on the left */\r\n background-color: #FFFFFF; /* White background color */\r\n overflow-x: hidden; /* Disable horizontal scroll */\r\n padding: 20px;\r\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\r\n border-right: 2px solid #DDDDDD; /* Right border */\r\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\r\n /* margin-top: var(--header-height); */\r\n width: var(--sidebar-width);\r\n margin: 0px;\r\n }\r\n \r\n.sidebar a {\r\n padding: 10px 15px;\r\n text-decoration: none;\r\n font-size: 18px;\r\n color: #818181;\r\n display: block;\r\n transition: 0.3s;\r\n}\r\n\r\n#sidebar-title {\r\n color: var(--darkGray);\r\n font-weight: bold;\r\n border-bottom: 1px solid var(--citygreen);\r\n}\r\n\r\nhr {\r\n margin-top: -5px;\r\n margin-bottom: 8px;\r\n}\r\n\r\nh6 {\r\n font-weight: 600;\r\n}\r\n\r\n.section-header {\r\n background-color: var(--mediumGray);\r\n}\r\n\r\n.sidebar-stat-line {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between; /* Distribute space between children */\r\n padding: 2px;\r\n border-bottom: 1px solid #ddd;\r\n /* Ensures fade when indicating a change */\r\n transition: background-color 0.5s ease;\r\n}\r\n\r\n.edit-icon, .edit-supp {\r\n color: var(--spiritgreen);\r\n cursor: pointer;\r\n font-size: 16px; /* Adjust the size as needed */\r\n margin-left: 10px;\r\n}\r\n\r\n.edit-icon:hover .edit-supp:hover {\r\n color: var(--citygreen);\r\n}\r\n\r\n.stat-label {\r\n margin-right: auto; /* Push next elements to the right */\r\n}\r\n\r\n.stat {\r\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\r\n}\r\n\r\n.sidebar-stat-line.fund-total .stat {\r\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\r\n}\r\n\r\n#summary-btn-sidebar{\r\n margin-bottom: 10px;\r\n text-align: center;\r\n margin-left: 10%;\r\n width: 80%;\r\n background-color: var(--mediumGray);\r\n color: black;\r\n /* border: 1px black; */\r\n border-radius: 5px;\r\n border-width: 1px;\r\n border-color: black;\r\n}\r\n\r\n#summary-btn-sidebar:hover{\r\n background-color: var(--darkGray);\r\n color: white;\r\n}\r\n\r\n.arrow {\r\n position: absolute;\r\n width: 10px;\r\n height: 10px;\r\n background: var(--spiritgreen); /* Or any color you want */\r\n left: 5px; /* Adjust for desired position */\r\n margin-top: -5px;\r\n transition: top 0.3s ease; /* Smooth transition */\r\n}\r\n\r\n/* Optional: Add arrow tip styling */\r\n.arrow::after {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n right: -10px; /* Adjust as needed */\r\n border-width: 5px;\r\n border-style: solid;\r\n border-color: transparent transparent transparent var(--spiritgreen);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/sidebar/sidebar.css"],"names":[],"mappings":"AAAA;IACI,2BAA2B;IAC3B,+CAA+C;EACjD;;AAEF;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,4CAA4C;IAC7D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,gCAAgC;IAC1C,yBAAyB,EAAE,2BAA2B;IACtD,kBAAkB,EAAE,8BAA8B;IAClD,aAAa;IACb,wCAAwC,EAAE,8BAA8B;IACxE,+BAA+B,EAAE,iBAAiB;IAClD,+BAA+B,EAAE,gCAAgC;IACjE,sCAAsC;IACtC,2BAA2B;IAC3B,WAAW;EACb;;AAEF;IACI,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;AACpB;;AAEA;EACE,sBAAsB;EACtB,iBAAiB;EACjB,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B,EAAE,sCAAsC;EACtE,YAAY;EACZ,6BAA6B;EAC7B,0CAA0C;EAC1C,sCAAsC;AACxC;;AAEA;EACE,yBAAyB;EACzB,eAAe;EACf,eAAe,EAAE,8BAA8B;EAC/C,iBAAiB;AACnB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,kBAAkB,EAAE,oCAAoC;AAC1D;;AAEA;EACE,gBAAgB,EAAE,4DAA4D;AAChF;;AAEA;EACE,kBAAkB,EAAE,sDAAsD;AAC5E;;AAEA;EACE,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,UAAU;EACV,mCAAmC;EACnC,YAAY;EACZ,uBAAuB;EACvB,kBAAkB;EAClB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,iCAAiC;EACjC,YAAY;AACd;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,8BAA8B,EAAE,0BAA0B;EAC1D,SAAS,EAAE,gCAAgC;EAC3C,gBAAgB;EAChB,yBAAyB,EAAE,sBAAsB;AACnD;;AAEA,oCAAoC;AACpC;EACE,WAAW;EACX,kBAAkB;EAClB,MAAM;EACN,YAAY,EAAE,qBAAqB;EACnC,iBAAiB;EACjB,mBAAmB;EACnB,oEAAoE;AACtE","sourcesContent":["#sidebar-panel {\\r\\n background-color: lightgrey; \\r\\n /* min-height: 100vh; Full height of viewport */\\r\\n }\\r\\n\\r\\n#supp-total .stat {\\r\\n color: var(--yellow);\\r\\n}\\r\\n\\r\\n.stat {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n#sidebar-panel {\\r\\n height: 100%; /* Full height of the viewport */\\r\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\r\\n z-index: 1; /* Stay on top */\\r\\n top: 0; /* Stay at the top */\\r\\n right: 0; /* Sidebar appears on the left */\\r\\n background-color: #FFFFFF; /* White background color */\\r\\n overflow-x: hidden; /* Disable horizontal scroll */\\r\\n padding: 20px;\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\r\\n border-right: 2px solid #DDDDDD; /* Right border */\\r\\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\\r\\n /* margin-top: var(--header-height); */\\r\\n width: var(--sidebar-width);\\r\\n margin: 0px;\\r\\n }\\r\\n \\r\\n.sidebar a {\\r\\n padding: 10px 15px;\\r\\n text-decoration: none;\\r\\n font-size: 18px;\\r\\n color: #818181;\\r\\n display: block;\\r\\n transition: 0.3s;\\r\\n}\\r\\n\\r\\n#sidebar-title {\\r\\n color: var(--darkGray);\\r\\n font-weight: bold;\\r\\n border-bottom: 1px solid var(--citygreen);\\r\\n}\\r\\n\\r\\nhr {\\r\\n margin-top: -5px;\\r\\n margin-bottom: 8px;\\r\\n}\\r\\n\\r\\nh6 {\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.section-header {\\r\\n background-color: var(--mediumGray);\\r\\n}\\r\\n\\r\\n.sidebar-stat-line {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between; /* Distribute space between children */\\r\\n padding: 2px;\\r\\n border-bottom: 1px solid #ddd;\\r\\n /* Ensures fade when indicating a change */\\r\\n transition: background-color 0.5s ease;\\r\\n}\\r\\n\\r\\n.edit-icon, .edit-supp {\\r\\n color: var(--spiritgreen);\\r\\n cursor: pointer;\\r\\n font-size: 16px; /* Adjust the size as needed */\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.edit-icon:hover .edit-supp:hover {\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n.stat-label {\\r\\n margin-right: auto; /* Push next elements to the right */\\r\\n}\\r\\n\\r\\n.stat {\\r\\n margin-left: 5px; /* Optional: Add some space between currency and edit icon */\\r\\n}\\r\\n\\r\\n.sidebar-stat-line.fund-total .stat {\\r\\n margin-right: 05px; /* 25px lines up with lines above (with edit symbol) */\\r\\n}\\r\\n\\r\\n#summary-btn-sidebar{\\r\\n margin-bottom: 10px;\\r\\n text-align: center;\\r\\n margin-left: 10%;\\r\\n width: 80%;\\r\\n background-color: var(--mediumGray);\\r\\n color: black;\\r\\n /* border: 1px black; */\\r\\n border-radius: 5px;\\r\\n border-width: 1px;\\r\\n border-color: black;\\r\\n}\\r\\n\\r\\n#summary-btn-sidebar:hover{\\r\\n background-color: var(--darkGray);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.arrow {\\r\\n position: absolute;\\r\\n width: 10px;\\r\\n height: 10px;\\r\\n background: var(--spiritgreen); /* Or any color you want */\\r\\n left: 5px; /* Adjust for desired position */\\r\\n margin-top: -5px;\\r\\n transition: top 0.3s ease; /* Smooth transition */\\r\\n}\\r\\n\\r\\n/* Optional: Add arrow tip styling */\\r\\n.arrow::after {\\r\\n content: \'\';\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: -10px; /* Adjust as needed */\\r\\n border-width: 5px;\\r\\n border-style: solid;\\r\\n border-color: transparent transparent transparent var(--spiritgreen);\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY3NzPzNiMDMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYCNzaWRlYmFyLXBhbmVsIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTsgIFxyXG4gICAgLyogbWluLWhlaWdodDogMTAwdmg7IEZ1bGwgaGVpZ2h0IG9mIHZpZXdwb3J0ICovXHJcbiAgfVxyXG5cclxuI3N1cHAtdG90YWwgLnN0YXQge1xyXG4gICAgY29sb3I6IHZhcigtLXllbGxvdyk7XHJcbn1cclxuXHJcbi5zdGF0IHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4jc2lkZWJhci1wYW5lbCB7XHJcbiAgICBoZWlnaHQ6IDEwMCU7IC8qIEZ1bGwgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAqL1xyXG4gICAgcG9zaXRpb246IGZpeGVkOyAvKiBGaXhlZCBTaWRlYmFyIChzdGF5IGluIHBsYWNlIG9uIHNjcm9sbCkgKi9cclxuICAgIHotaW5kZXg6IDE7IC8qIFN0YXkgb24gdG9wICovXHJcbiAgICB0b3A6IDA7IC8qIFN0YXkgYXQgdGhlIHRvcCAqL1xyXG4gICAgcmlnaHQ6IDA7IC8qIFNpZGViYXIgYXBwZWFycyBvbiB0aGUgbGVmdCAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgLyogV2hpdGUgYmFja2dyb3VuZCBjb2xvciAqL1xyXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuOyAvKiBEaXNhYmxlIGhvcml6b250YWwgc2Nyb2xsICovXHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLyogQWRkIHNoYWRvdyBmb3Igc29tZSBkZXB0aCAqL1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0RERERERDsgLyogUmlnaHQgYm9yZGVyICovXHJcbiAgICBib3JkZXItcmFkaXVzOiAwcHggMHB4IDBweCAxNXB4OyAvKiBSb3VuZGVkIGNvcm5lcnMgb24gdGhlIGxlZnQgKi9cclxuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xyXG4gICAgd2lkdGg6IHZhcigtLXNpZGViYXItd2lkdGgpO1xyXG4gICAgbWFyZ2luOiAwcHg7XHJcbiAgfVxyXG4gIFxyXG4uc2lkZWJhciBhIHtcclxuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgIGNvbG9yOiAjODE4MTgxO1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xyXG59XHJcblxyXG4jc2lkZWJhci10aXRsZSB7XHJcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcclxuICBmb250LXdlaWdodDogYm9sZDtcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTtcclxufVxyXG5cclxuaHIge1xyXG4gIG1hcmdpbi10b3A6IC01cHg7XHJcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xyXG59XHJcblxyXG5oNiB7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxufVxyXG5cclxuLnNlY3Rpb24taGVhZGVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcclxufVxyXG5cclxuLnNpZGViYXItc3RhdC1saW5lIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyAvKiBEaXN0cmlidXRlIHNwYWNlIGJldHdlZW4gY2hpbGRyZW4gKi9cclxuICBwYWRkaW5nOiAycHg7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XHJcbiAgLyogRW5zdXJlcyBmYWRlIHdoZW4gaW5kaWNhdGluZyBhIGNoYW5nZSAqL1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlO1xyXG59XHJcblxyXG4uZWRpdC1pY29uLCAuZWRpdC1zdXBwIHtcclxuICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBmb250LXNpemU6IDE2cHg7IC8qIEFkanVzdCB0aGUgc2l6ZSBhcyBuZWVkZWQgKi9cclxuICBtYXJnaW4tbGVmdDogMTBweDtcclxufVxyXG5cclxuLmVkaXQtaWNvbjpob3ZlciAuZWRpdC1zdXBwOmhvdmVyIHtcclxuICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcclxufVxyXG5cclxuLnN0YXQtbGFiZWwge1xyXG4gIG1hcmdpbi1yaWdodDogYXV0bzsgLyogUHVzaCBuZXh0IGVsZW1lbnRzIHRvIHRoZSByaWdodCAqL1xyXG59XHJcblxyXG4uc3RhdCB7XHJcbiAgbWFyZ2luLWxlZnQ6IDVweDsgLyogT3B0aW9uYWw6IEFkZCBzb21lIHNwYWNlIGJldHdlZW4gY3VycmVuY3kgYW5kIGVkaXQgaWNvbiAqL1xyXG59XHJcblxyXG4uc2lkZWJhci1zdGF0LWxpbmUuZnVuZC10b3RhbCAuc3RhdCB7XHJcbiAgbWFyZ2luLXJpZ2h0OiAwNXB4OyAvKiAyNXB4IGxpbmVzIHVwIHdpdGggbGluZXMgYWJvdmUgKHdpdGggZWRpdCBzeW1ib2wpICovXHJcbn1cclxuXHJcbiNzdW1tYXJ5LWJ0bi1zaWRlYmFye1xyXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIG1hcmdpbi1sZWZ0OiAxMCU7XHJcbiAgd2lkdGg6IDgwJTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgLyogYm9yZGVyOiAxcHggYmxhY2s7ICovXHJcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gIGJvcmRlci13aWR0aDogMXB4O1xyXG4gIGJvcmRlci1jb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbiNzdW1tYXJ5LWJ0bi1zaWRlYmFyOmhvdmVye1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5hcnJvdyB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHdpZHRoOiAxMHB4O1xyXG4gIGhlaWdodDogMTBweDtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1zcGlyaXRncmVlbik7IC8qIE9yIGFueSBjb2xvciB5b3Ugd2FudCAqL1xyXG4gIGxlZnQ6IDVweDsgLyogQWRqdXN0IGZvciBkZXNpcmVkIHBvc2l0aW9uICovXHJcbiAgbWFyZ2luLXRvcDogLTVweDtcclxuICB0cmFuc2l0aW9uOiB0b3AgMC4zcyBlYXNlOyAvKiBTbW9vdGggdHJhbnNpdGlvbiAqL1xyXG59XHJcblxyXG4vKiBPcHRpb25hbDogQWRkIGFycm93IHRpcCBzdHlsaW5nICovXHJcbi5hcnJvdzo6YWZ0ZXIge1xyXG4gIGNvbnRlbnQ6ICcnO1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB0b3A6IDA7XHJcbiAgcmlnaHQ6IC0xMHB4OyAvKiBBZGp1c3QgYXMgbmVlZGVkICovXHJcbiAgYm9yZGVyLXdpZHRoOiA1cHg7XHJcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcclxuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLDJCQUEyQjtJQUMzQiwrQ0FBK0M7RUFDakQ7O0FBRUY7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGVBQWUsRUFBRSw0Q0FBNEM7SUFDN0QsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixNQUFNLEVBQUUsb0JBQW9CO0lBQzVCLFFBQVEsRUFBRSxnQ0FBZ0M7SUFDMUMseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGtCQUFrQixFQUFFLDhCQUE4QjtJQUNsRCxhQUFhO0lBQ2Isd0NBQXdDLEVBQUUsOEJBQThCO0lBQ3hFLCtCQUErQixFQUFFLGlCQUFpQjtJQUNsRCwrQkFBK0IsRUFBRSxnQ0FBZ0M7SUFDakUsc0NBQXNDO0lBQ3RDLDJCQUEyQjtJQUMzQixXQUFXO0VBQ2I7O0FBRUY7SUFDSSxrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtBQUNwQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixpQkFBaUI7RUFDakIseUNBQXlDO0FBQzNDOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLG1DQUFtQztBQUNyQzs7QUFFQTtFQUNFLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsOEJBQThCLEVBQUUsc0NBQXNDO0VBQ3RFLFlBQVk7RUFDWiw2QkFBNkI7RUFDN0IsMENBQTBDO0VBQzFDLHNDQUFzQztBQUN4Qzs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixlQUFlO0VBQ2YsZUFBZSxFQUFFLDhCQUE4QjtFQUMvQyxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxvQ0FBb0M7QUFDMUQ7O0FBRUE7RUFDRSxnQkFBZ0IsRUFBRSw0REFBNEQ7QUFDaEY7O0FBRUE7RUFDRSxrQkFBa0IsRUFBRSxzREFBc0Q7QUFDNUU7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixVQUFVO0VBQ1YsbUNBQW1DO0VBQ25DLFlBQVk7RUFDWix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxpQ0FBaUM7RUFDakMsWUFBWTtBQUNkOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxZQUFZO0VBQ1osOEJBQThCLEVBQUUsMEJBQTBCO0VBQzFELFNBQVMsRUFBRSxnQ0FBZ0M7RUFDM0MsZ0JBQWdCO0VBQ2hCLHlCQUF5QixFQUFFLHNCQUFzQjtBQUNuRDs7QUFFQSxvQ0FBb0M7QUFDcEM7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixZQUFZLEVBQUUscUJBQXFCO0VBQ25DLGlCQUFpQjtFQUNqQixtQkFBbUI7RUFDbkIsb0VBQW9FO0FBQ3RFXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNzaWRlYmFyLXBhbmVsIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXFxyXFxuICAgIC8qIG1pbi1oZWlnaHQ6IDEwMHZoOyBGdWxsIGhlaWdodCBvZiB2aWV3cG9ydCAqL1xcclxcbiAgfVxcclxcblxcclxcbiNzdXBwLXRvdGFsIC5zdGF0IHtcXHJcXG4gICAgY29sb3I6IHZhcigtLXllbGxvdyk7XFxyXFxufVxcclxcblxcclxcbi5zdGF0IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbiNzaWRlYmFyLXBhbmVsIHtcXHJcXG4gICAgaGVpZ2h0OiAxMDAlOyAvKiBGdWxsIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgKi9cXHJcXG4gICAgcG9zaXRpb246IGZpeGVkOyAvKiBGaXhlZCBTaWRlYmFyIChzdGF5IGluIHBsYWNlIG9uIHNjcm9sbCkgKi9cXHJcXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cXHJcXG4gICAgdG9wOiAwOyAvKiBTdGF5IGF0IHRoZSB0b3AgKi9cXHJcXG4gICAgcmlnaHQ6IDA7IC8qIFNpZGViYXIgYXBwZWFycyBvbiB0aGUgbGVmdCAqL1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXFxyXFxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjsgLyogRGlzYWJsZSBob3Jpem9udGFsIHNjcm9sbCAqL1xcclxcbiAgICBwYWRkaW5nOiAyMHB4O1xcclxcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXFxyXFxuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNEREREREQ7IC8qIFJpZ2h0IGJvcmRlciAqL1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAwcHggMHB4IDBweCAxNXB4OyAvKiBSb3VuZGVkIGNvcm5lcnMgb24gdGhlIGxlZnQgKi9cXHJcXG4gICAgLyogbWFyZ2luLXRvcDogdmFyKC0taGVhZGVyLWhlaWdodCk7ICovXFxyXFxuICAgIHdpZHRoOiB2YXIoLS1zaWRlYmFyLXdpZHRoKTtcXHJcXG4gICAgbWFyZ2luOiAwcHg7XFxyXFxuICB9XFxyXFxuICBcXHJcXG4uc2lkZWJhciBhIHtcXHJcXG4gICAgcGFkZGluZzogMTBweCAxNXB4O1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMThweDtcXHJcXG4gICAgY29sb3I6ICM4MTgxODE7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4jc2lkZWJhci10aXRsZSB7XFxyXFxuICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuaHIge1xcclxcbiAgbWFyZ2luLXRvcDogLTVweDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDhweDtcXHJcXG59XFxyXFxuXFxyXFxuaDYge1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnNlY3Rpb24taGVhZGVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lZGl1bUdyYXkpO1xcclxcbn1cXHJcXG5cXHJcXG4uc2lkZWJhci1zdGF0LWxpbmUge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IC8qIERpc3RyaWJ1dGUgc3BhY2UgYmV0d2VlbiBjaGlsZHJlbiAqL1xcclxcbiAgcGFkZGluZzogMnB4O1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XFxyXFxuICAvKiBFbnN1cmVzIGZhZGUgd2hlbiBpbmRpY2F0aW5nIGEgY2hhbmdlICovXFxyXFxuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbiwgLmVkaXQtc3VwcCB7XFxyXFxuICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgZm9udC1zaXplOiAxNnB4OyAvKiBBZGp1c3QgdGhlIHNpemUgYXMgbmVlZGVkICovXFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmVkaXQtaWNvbjpob3ZlciAuZWRpdC1zdXBwOmhvdmVyIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdC1sYWJlbCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87IC8qIFB1c2ggbmV4dCBlbGVtZW50cyB0byB0aGUgcmlnaHQgKi9cXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDVweDsgLyogT3B0aW9uYWw6IEFkZCBzb21lIHNwYWNlIGJldHdlZW4gY3VycmVuY3kgYW5kIGVkaXQgaWNvbiAqL1xcclxcbn1cXHJcXG5cXHJcXG4uc2lkZWJhci1zdGF0LWxpbmUuZnVuZC10b3RhbCAuc3RhdCB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDA1cHg7IC8qIDI1cHggbGluZXMgdXAgd2l0aCBsaW5lcyBhYm92ZSAod2l0aCBlZGl0IHN5bWJvbCkgKi9cXHJcXG59XFxyXFxuXFxyXFxuI3N1bW1hcnktYnRuLXNpZGViYXJ7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgbWFyZ2luLWxlZnQ6IDEwJTtcXHJcXG4gIHdpZHRoOiA4MCU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW1HcmF5KTtcXHJcXG4gIGNvbG9yOiBibGFjaztcXHJcXG4gIC8qIGJvcmRlcjogMXB4IGJsYWNrOyAqL1xcclxcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XFxyXFxuICBib3JkZXItY29sb3I6IGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4jc3VtbWFyeS1idG4tc2lkZWJhcjpob3ZlcntcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmFycm93IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMHB4O1xcclxcbiAgaGVpZ2h0OiAxMHB4O1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tc3Bpcml0Z3JlZW4pOyAvKiBPciBhbnkgY29sb3IgeW91IHdhbnQgKi9cXHJcXG4gIGxlZnQ6IDVweDsgLyogQWRqdXN0IGZvciBkZXNpcmVkIHBvc2l0aW9uICovXFxyXFxuICBtYXJnaW4tdG9wOiAtNXB4O1xcclxcbiAgdHJhbnNpdGlvbjogdG9wIDAuM3MgZWFzZTsgLyogU21vb3RoIHRyYW5zaXRpb24gKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogT3B0aW9uYWw6IEFkZCBhcnJvdyB0aXAgc3R5bGluZyAqL1xcclxcbi5hcnJvdzo6YWZ0ZXIge1xcclxcbiAgY29udGVudDogJyc7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogLTEwcHg7IC8qIEFkanVzdCBhcyBuZWVkZWQgKi9cXHJcXG4gIGJvcmRlci13aWR0aDogNXB4O1xcclxcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXHJcXG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///263\n')},279:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#main-table {\r\n font-size: 12px;\r\n /* calc(0.5vw + 0.5em); */\r\n margin: auto;\r\n width: 100%;\r\n}\r\n\r\n#main-table thead > tr > th {\r\n text-align: left;\r\n background-color: var(--darkGray);\r\n color: white;\r\n position: -webkit-sticky; /* For Safari */\r\n position: sticky;\r\n top: 0;\r\n padding-top: 5px;\r\n padding-bottom: 5px;\r\n padding-left: 5px;\r\n}\r\n\r\nth {\r\n background-color: var(--lightGray);\r\n}\r\n\r\ntr {\r\n border-width: 2px;\r\n background-color: white;\r\n /* Ensures fade when indicating a new row */\r\n transition: background-color 0.5s ease;\r\n}\r\n\r\n\r\ntr td {\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Default to hidden columns */\r\n\r\n#main-table tbody > tr > td {\r\n display : none;\r\n}\r\n#main-table thead > tr > th {\r\n display : none;\r\n}\r\n\r\n/* textbox width in table */\r\ninput {\r\n width: 100%;\r\n}\r\n\r\nselect {\r\n max-width: 100px;\r\n}\r\n\r\ndiv.table-container {\r\n overflow-x: auto; \r\n overflow-y: auto;\r\n margin-left: max(65px, 7vh);\r\n margin-right: max(65px, 7vh);\r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n /* margin: auto; */\r\n max-height: max(350px, 6vh);\r\n /* min-height: 350px; */\r\n\r\n}\r\n \r\n/* Buttons */\r\n\r\n/* Add new row button */\r\n.btn-add { \r\n background-color: var(--spiritgreen);\r\n margin-top: 20px;\r\n display: none;\r\n}\r\n\r\n.btn-delete {\r\n background-color: var(--orange);\r\n}\r\n\r\n#add-btn-div {\r\n display: flex;\r\n justify-content: center; /* Aligns horizontally */\r\n align-items: center; /* Aligns vertically */\r\n width: 100%;\r\n}\r\n\r\n.btn-edit {\r\n background-color: var(--spiritgreen);\r\n line-height: 1.1;\r\n}\r\n\r\n.active-editing, .selected {\r\n background-color: var(--palegreen);\r\n}\r\n\r\n.selected { \r\n font-weight: bold;\r\n}\r\n\r\n.btn-confirm {\r\n display: none;\r\n}\r\n\r\n.confirm-btn:hover {\r\n background-color: var(--green);\r\n}\r\n\r\n.hover-effect:hover {\r\n cursor: pointer;\r\n background-color: var(--verypalegreen); \r\n}\r\n\r\n/* Fund table */\r\n.fund-name > .viewed-fund {\r\n color: gray;\r\n}\r\n\r\n/* made edit column narrower */\r\nth.edit, td.edit {\r\n width: 20px;\r\n}\r\n\r\n/* Class for hidden rows on filter */\r\n.hidden {\r\n display: none;\r\n}\r\n\r\n/* Filter styling for the dropdown options */\r\n#filter-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 2px; /* Adjust the gap as needed */\r\n font-size: 11px;\r\n margin-left: 10%;\r\n margin-right: 10%;\r\n margin-bottom: 5px;\r\n}\r\n\r\n#filter-container div {\r\n display: flex;\r\n align-items: center;\r\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\r\n}\r\n\r\n#filter-container label {\r\n width: 200px; /* Adjust the width as needed */\r\n text-align: right;\r\n margin-right: 10px; /* Spacing between label and select */\r\n}\r\n\r\n/* Ensure all select boxes are wide enough to show text */\r\n.filter-dropdown {\r\n flex: 1;\r\n min-width: 200px; /* Adjust the min-width as needed */\r\n}\r\n\r\n/* Optional styling to make the select dropdown look better */\r\n.filter-dropdown {\r\n padding: 5px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n}\r\n\r\n/* Responsive adjustment: On smaller screens, stack elements vertically */\r\n@media (max-width: 800px) {\r\n #filter-container div {\r\n width: 100%;\r\n }\r\n\r\n #filter-container label {\r\n text-align: left;\r\n width: auto;\r\n margin-right: 0;\r\n margin-bottom: 5px;\r\n }\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,yBAAyB;IACzB,YAAY;IACZ,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,iCAAiC;IACjC,YAAY;IACZ,wBAAwB,EAAE,eAAe;IACzC,gBAAgB;IAChB,MAAM;IACN,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;IACvB,2CAA2C;IAC3C,sCAAsC;AAC1C;;;AAGA;IACI,8BAA8B;AAClC;;AAEA,8BAA8B;;AAE9B;IACI,cAAc;AAClB;AACA;IACI,cAAc;AAClB;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,4BAA4B;IAC5B,oDAAoD;IACpD,kBAAkB;IAClB,2BAA2B;IAC3B,uBAAuB;;AAE3B;;AAEA,YAAY;;AAEZ,uBAAuB;AACvB;IACI,oCAAoC;IACpC,gBAAgB;IAChB,aAAa;AACjB;;AAEA;IACI,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW;AACf;;AAEA;IACI,oCAAoC;IACpC,gBAAgB;AACpB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC;AAC1C;;AAEA,eAAe;AACf;IACI,WAAW;AACf;;AAEA,8BAA8B;AAC9B;IACI,WAAW;AACf;;AAEA,oCAAoC;AACpC;IACI,aAAa;AACjB;;AAEA,4CAA4C;AAC5C;IACI,aAAa;IACb,eAAe;IACf,QAAQ,EAAE,6BAA6B;IACvC,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB,EAAE,mDAAmD;AAChF;;AAEA;IACI,YAAY,EAAE,+BAA+B;IAC7C,iBAAiB;IACjB,kBAAkB,EAAE,qCAAqC;AAC7D;;AAEA,yDAAyD;AACzD;IACI,OAAO;IACP,gBAAgB,EAAE,mCAAmC;AACzD;;AAEA,6DAA6D;AAC7D;IACI,YAAY;IACZ,sBAAsB;IACtB,kBAAkB;AACtB;;AAEA,yEAAyE;AACzE;IACI;QACI,WAAW;IACf;;IAEA;QACI,gBAAgB;QAChB,WAAW;QACX,eAAe;QACf,kBAAkB;IACtB;AACJ","sourcesContent":["#main-table {\\r\\n font-size: 12px;\\r\\n /* calc(0.5vw + 0.5em); */\\r\\n margin: auto;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n#main-table thead > tr > th {\\r\\n text-align: left;\\r\\n background-color: var(--darkGray);\\r\\n color: white;\\r\\n position: -webkit-sticky; /* For Safari */\\r\\n position: sticky;\\r\\n top: 0;\\r\\n padding-top: 5px;\\r\\n padding-bottom: 5px;\\r\\n padding-left: 5px;\\r\\n}\\r\\n\\r\\nth {\\r\\n background-color: var(--lightGray);\\r\\n}\\r\\n\\r\\ntr {\\r\\n border-width: 2px;\\r\\n background-color: white;\\r\\n /* Ensures fade when indicating a new row */\\r\\n transition: background-color 0.5s ease;\\r\\n}\\r\\n\\r\\n\\r\\ntr td {\\r\\n border-bottom: 1px solid black;\\r\\n}\\r\\n\\r\\n/* Default to hidden columns */\\r\\n\\r\\n#main-table tbody > tr > td {\\r\\n display : none;\\r\\n}\\r\\n#main-table thead > tr > th {\\r\\n display : none;\\r\\n}\\r\\n\\r\\n/* textbox width in table */\\r\\ninput {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\nselect {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\ndiv.table-container {\\r\\n overflow-x: auto; \\r\\n overflow-y: auto;\\r\\n margin-left: max(65px, 7vh);\\r\\n margin-right: max(65px, 7vh);\\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n /* margin: auto; */\\r\\n max-height: max(350px, 6vh);\\r\\n /* min-height: 350px; */\\r\\n\\r\\n}\\r\\n \\r\\n/* Buttons */\\r\\n\\r\\n/* Add new row button */\\r\\n.btn-add { \\r\\n background-color: var(--spiritgreen);\\r\\n margin-top: 20px;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.btn-delete {\\r\\n background-color: var(--orange);\\r\\n}\\r\\n\\r\\n#add-btn-div {\\r\\n display: flex;\\r\\n justify-content: center; /* Aligns horizontally */\\r\\n align-items: center; /* Aligns vertically */\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.btn-edit {\\r\\n background-color: var(--spiritgreen);\\r\\n line-height: 1.1;\\r\\n}\\r\\n\\r\\n.active-editing, .selected {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n\\r\\n.selected { \\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.btn-confirm {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.confirm-btn:hover {\\r\\n background-color: var(--green);\\r\\n}\\r\\n\\r\\n.hover-effect:hover {\\r\\n cursor: pointer;\\r\\n background-color: var(--verypalegreen); \\r\\n}\\r\\n\\r\\n/* Fund table */\\r\\n.fund-name > .viewed-fund {\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n/* made edit column narrower */\\r\\nth.edit, td.edit {\\r\\n width: 20px;\\r\\n}\\r\\n\\r\\n/* Class for hidden rows on filter */\\r\\n.hidden {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* Filter styling for the dropdown options */\\r\\n#filter-container {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 2px; /* Adjust the gap as needed */\\r\\n font-size: 11px;\\r\\n margin-left: 10%;\\r\\n margin-right: 10%;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n#filter-container div {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n width: calc(50% - 10px); /* Adjust width to fit two items per row with gap */\\r\\n}\\r\\n\\r\\n#filter-container label {\\r\\n width: 200px; /* Adjust the width as needed */\\r\\n text-align: right;\\r\\n margin-right: 10px; /* Spacing between label and select */\\r\\n}\\r\\n\\r\\n/* Ensure all select boxes are wide enough to show text */\\r\\n.filter-dropdown {\\r\\n flex: 1;\\r\\n min-width: 200px; /* Adjust the min-width as needed */\\r\\n}\\r\\n\\r\\n/* Optional styling to make the select dropdown look better */\\r\\n.filter-dropdown {\\r\\n padding: 5px;\\r\\n border: 1px solid #ccc;\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n/* Responsive adjustment: On smaller screens, stack elements vertically */\\r\\n@media (max-width: 800px) {\\r\\n #filter-container div {\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n #filter-container label {\\r\\n text-align: left;\\r\\n width: auto;\\r\\n margin-right: 0;\\r\\n margin-bottom: 5px;\\r\\n }\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNzcz81MjM3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjbWFpbi10YWJsZSB7XHJcbiAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAvKiBjYWxjKDAuNXZ3ICsgMC41ZW0pOyAqL1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyAvKiBGb3IgU2FmYXJpICovXHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxufVxyXG5cclxudGgge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxufVxyXG5cclxudHIge1xyXG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIC8qIEVuc3VyZXMgZmFkZSB3aGVuIGluZGljYXRpbmcgYSBuZXcgcm93ICovXHJcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZTtcclxufVxyXG5cclxuXHJcbnRyIHRkIHtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcclxufVxyXG5cclxuLyogRGVmYXVsdCB0byBoaWRkZW4gY29sdW1ucyAqL1xyXG5cclxuI21haW4tdGFibGUgdGJvZHkgPiB0ciA+IHRkIHtcclxuICAgIGRpc3BsYXkgOiBub25lO1xyXG59XHJcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XHJcbiAgICBkaXNwbGF5IDogbm9uZTtcclxufVxyXG5cclxuLyogdGV4dGJveCB3aWR0aCBpbiB0YWJsZSAqL1xyXG5pbnB1dCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuc2VsZWN0IHtcclxuICAgIG1heC13aWR0aDogMTAwcHg7XHJcbn1cclxuXHJcbmRpdi50YWJsZS1jb250YWluZXIge1xyXG4gICAgb3ZlcmZsb3cteDogYXV0bzsgXHJcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgbWFyZ2luLWxlZnQ6IG1heCg2NXB4LCA3dmgpO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiBtYXgoNjVweCwgN3ZoKTtcclxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXHJcbiAgICAvKiBtYXJnaW46IGF1dG87ICovXHJcbiAgICBtYXgtaGVpZ2h0OiBtYXgoMzUwcHgsIDZ2aCk7XHJcbiAgICAvKiBtaW4taGVpZ2h0OiAzNTBweDsgKi9cclxuXHJcbn1cclxuICBcclxuLyogQnV0dG9ucyAqL1xyXG5cclxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXHJcbi5idG4tYWRkIHsgXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XHJcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmJ0bi1kZWxldGUge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tb3JhbmdlKTtcclxufVxyXG5cclxuI2FkZC1idG4tZGl2IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogQWxpZ25zIGhvcml6b250YWxseSAqL1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgLyogQWxpZ25zIHZlcnRpY2FsbHkgKi9cclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uYnRuLWVkaXQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG4gICAgbGluZS1oZWlnaHQ6IDEuMTtcclxufVxyXG5cclxuLmFjdGl2ZS1lZGl0aW5nLCAuc2VsZWN0ZWQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcclxufVxyXG5cclxuLnNlbGVjdGVkIHsgXHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmJ0bi1jb25maXJtIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5jb25maXJtLWJ0bjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ncmVlbik7XHJcbn1cclxuXHJcbi5ob3Zlci1lZmZlY3Q6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmVyeXBhbGVncmVlbik7IFxyXG59XHJcblxyXG4vKiBGdW5kIHRhYmxlICovXHJcbi5mdW5kLW5hbWUgPiAudmlld2VkLWZ1bmQge1xyXG4gICAgY29sb3I6IGdyYXk7XHJcbn1cclxuXHJcbi8qIG1hZGUgZWRpdCBjb2x1bW4gbmFycm93ZXIgKi9cclxudGguZWRpdCwgdGQuZWRpdCB7XHJcbiAgICB3aWR0aDogMjBweDtcclxufVxyXG5cclxuLyogQ2xhc3MgZm9yIGhpZGRlbiByb3dzIG9uIGZpbHRlciAqL1xyXG4uaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEZpbHRlciBzdHlsaW5nIGZvciB0aGUgZHJvcGRvd24gb3B0aW9ucyAqL1xyXG4jZmlsdGVyLWNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgZ2FwOiAycHg7IC8qIEFkanVzdCB0aGUgZ2FwIGFzIG5lZWRlZCAqL1xyXG4gICAgZm9udC1zaXplOiAxMXB4O1xyXG4gICAgbWFyZ2luLWxlZnQ6IDEwJTtcclxuICAgIG1hcmdpbi1yaWdodDogMTAlO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xyXG59XHJcblxyXG4jZmlsdGVyLWNvbnRhaW5lciBkaXYge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAxMHB4KTsgLyogQWRqdXN0IHdpZHRoIHRvIGZpdCB0d28gaXRlbXMgcGVyIHJvdyB3aXRoIGdhcCAqL1xyXG59XHJcblxyXG4jZmlsdGVyLWNvbnRhaW5lciBsYWJlbCB7XHJcbiAgICB3aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgd2lkdGggYXMgbmVlZGVkICovXHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG1hcmdpbi1yaWdodDogMTBweDsgLyogU3BhY2luZyBiZXR3ZWVuIGxhYmVsIGFuZCBzZWxlY3QgKi9cclxufVxyXG5cclxuLyogRW5zdXJlIGFsbCBzZWxlY3QgYm94ZXMgYXJlIHdpZGUgZW5vdWdoIHRvIHNob3cgdGV4dCAqL1xyXG4uZmlsdGVyLWRyb3Bkb3duIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBtaW4td2lkdGg6IDIwMHB4OyAvKiBBZGp1c3QgdGhlIG1pbi13aWR0aCBhcyBuZWVkZWQgKi9cclxufVxyXG5cclxuLyogT3B0aW9uYWwgc3R5bGluZyB0byBtYWtlIHRoZSBzZWxlY3QgZHJvcGRvd24gbG9vayBiZXR0ZXIgKi9cclxuLmZpbHRlci1kcm9wZG93biB7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG59XHJcblxyXG4vKiBSZXNwb25zaXZlIGFkanVzdG1lbnQ6IE9uIHNtYWxsZXIgc2NyZWVucywgc3RhY2sgZWxlbWVudHMgdmVydGljYWxseSAqL1xyXG5AbWVkaWEgKG1heC13aWR0aDogODAwcHgpIHtcclxuICAgICNmaWx0ZXItY29udGFpbmVyIGRpdiB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgI2ZpbHRlci1jb250YWluZXIgbGFiZWwge1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgd2lkdGg6IGF1dG87XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcclxuICAgIH1cclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlDQUFpQztJQUNqQyxZQUFZO0lBQ1osd0JBQXdCLEVBQUUsZUFBZTtJQUN6QyxnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksa0NBQWtDO0FBQ3RDOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QiwyQ0FBMkM7SUFDM0Msc0NBQXNDO0FBQzFDOzs7QUFHQTtJQUNJLDhCQUE4QjtBQUNsQzs7QUFFQSw4QkFBOEI7O0FBRTlCO0lBQ0ksY0FBYztBQUNsQjtBQUNBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQSwyQkFBMkI7QUFDM0I7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLDJCQUEyQjtJQUMzQiw0QkFBNEI7SUFDNUIsb0RBQW9EO0lBQ3BELGtCQUFrQjtJQUNsQiwyQkFBMkI7SUFDM0IsdUJBQXVCOztBQUUzQjs7QUFFQSxZQUFZOztBQUVaLHVCQUF1QjtBQUN2QjtJQUNJLG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFDaEIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLCtCQUErQjtBQUNuQzs7QUFFQTtJQUNJLGFBQWE7SUFDYix1QkFBdUIsRUFBRSx3QkFBd0I7SUFDakQsbUJBQW1CLEVBQUUsc0JBQXNCO0lBQzNDLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQ0FBa0M7QUFDdEM7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHNDQUFzQztBQUMxQzs7QUFFQSxlQUFlO0FBQ2Y7SUFDSSxXQUFXO0FBQ2Y7O0FBRUEsOEJBQThCO0FBQzlCO0lBQ0ksV0FBVztBQUNmOztBQUVBLG9DQUFvQztBQUNwQztJQUNJLGFBQWE7QUFDakI7O0FBRUEsNENBQTRDO0FBQzVDO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixRQUFRLEVBQUUsNkJBQTZCO0lBQ3ZDLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsdUJBQXVCLEVBQUUsbURBQW1EO0FBQ2hGOztBQUVBO0lBQ0ksWUFBWSxFQUFFLCtCQUErQjtJQUM3QyxpQkFBaUI7SUFDakIsa0JBQWtCLEVBQUUscUNBQXFDO0FBQzdEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLE9BQU87SUFDUCxnQkFBZ0IsRUFBRSxtQ0FBbUM7QUFDekQ7O0FBRUEsNkRBQTZEO0FBQzdEO0lBQ0ksWUFBWTtJQUNaLHNCQUFzQjtJQUN0QixrQkFBa0I7QUFDdEI7O0FBRUEseUVBQXlFO0FBQ3pFO0lBQ0k7UUFDSSxXQUFXO0lBQ2Y7O0lBRUE7UUFDSSxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLGVBQWU7UUFDZixrQkFBa0I7SUFDdEI7QUFDSlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjbWFpbi10YWJsZSB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gICAgLyogY2FsYygwLjV2dyArIDAuNWVtKTsgKi9cXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuI21haW4tdGFibGUgdGhlYWQgPiB0ciA+IHRoIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbiAgICBjb2xvcjogd2hpdGU7XFxyXFxuICAgIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsgLyogRm9yIFNhZmFyaSAqL1xcclxcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA1cHg7XFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG50aCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxyXFxufVxcclxcblxcclxcbnRyIHtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICAvKiBFbnN1cmVzIGZhZGUgd2hlbiBpbmRpY2F0aW5nIGEgbmV3IHJvdyAqL1xcclxcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxudHIgdGQge1xcclxcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XFxyXFxufVxcclxcblxcclxcbi8qIERlZmF1bHQgdG8gaGlkZGVuIGNvbHVtbnMgKi9cXHJcXG5cXHJcXG4jbWFpbi10YWJsZSB0Ym9keSA+IHRyID4gdGQge1xcclxcbiAgICBkaXNwbGF5IDogbm9uZTtcXHJcXG59XFxyXFxuI21haW4tdGFibGUgdGhlYWQgPiB0ciA+IHRoIHtcXHJcXG4gICAgZGlzcGxheSA6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIHRleHRib3ggd2lkdGggaW4gdGFibGUgKi9cXHJcXG5pbnB1dCB7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG5zZWxlY3Qge1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYudGFibGUtY29udGFpbmVyIHtcXHJcXG4gICAgb3ZlcmZsb3cteDogYXV0bzsgXFxyXFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBtYXgoNjVweCwgN3ZoKTtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBtYXgoNjVweCwgN3ZoKTtcXHJcXG4gICAgLyogbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAgKi9cXHJcXG4gICAgLyogbWFyZ2luOiBhdXRvOyAqL1xcclxcbiAgICBtYXgtaGVpZ2h0OiBtYXgoMzUwcHgsIDZ2aCk7XFxyXFxuICAgIC8qIG1pbi1oZWlnaHQ6IDM1MHB4OyAqL1xcclxcblxcclxcbn1cXHJcXG4gIFxcclxcbi8qIEJ1dHRvbnMgKi9cXHJcXG5cXHJcXG4vKiBBZGQgbmV3IHJvdyBidXR0b24gKi9cXHJcXG4uYnRuLWFkZCB7IFxcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIG1hcmdpbi10b3A6IDIwcHg7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5idG4tZGVsZXRlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tb3JhbmdlKTtcXHJcXG59XFxyXFxuXFxyXFxuI2FkZC1idG4tZGl2IHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIEFsaWducyBob3Jpem9udGFsbHkgKi9cXHJcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgLyogQWxpZ25zIHZlcnRpY2FsbHkgKi9cXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5idG4tZWRpdCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDEuMTtcXHJcXG59XFxyXFxuXFxyXFxuLmFjdGl2ZS1lZGl0aW5nLCAuc2VsZWN0ZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0ZWQgeyBcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5idG4tY29uZmlybSB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5jb25maXJtLWJ0bjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuLmhvdmVyLWVmZmVjdDpob3ZlciB7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmVyeXBhbGVncmVlbik7IFxcclxcbn1cXHJcXG5cXHJcXG4vKiBGdW5kIHRhYmxlICovXFxyXFxuLmZ1bmQtbmFtZSA+IC52aWV3ZWQtZnVuZCB7XFxyXFxuICAgIGNvbG9yOiBncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBtYWRlIGVkaXQgY29sdW1uIG5hcnJvd2VyICovXFxyXFxudGguZWRpdCwgdGQuZWRpdCB7XFxyXFxuICAgIHdpZHRoOiAyMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBDbGFzcyBmb3IgaGlkZGVuIHJvd3Mgb24gZmlsdGVyICovXFxyXFxuLmhpZGRlbiB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIEZpbHRlciBzdHlsaW5nIGZvciB0aGUgZHJvcGRvd24gb3B0aW9ucyAqL1xcclxcbiNmaWx0ZXItY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC13cmFwOiB3cmFwO1xcclxcbiAgICBnYXA6IDJweDsgLyogQWRqdXN0IHRoZSBnYXAgYXMgbmVlZGVkICovXFxyXFxuICAgIGZvbnQtc2l6ZTogMTFweDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDEwJTtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMCU7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuI2ZpbHRlci1jb250YWluZXIgZGl2IHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgd2lkdGg6IGNhbGMoNTAlIC0gMTBweCk7IC8qIEFkanVzdCB3aWR0aCB0byBmaXQgdHdvIGl0ZW1zIHBlciByb3cgd2l0aCBnYXAgKi9cXHJcXG59XFxyXFxuXFxyXFxuI2ZpbHRlci1jb250YWluZXIgbGFiZWwge1xcclxcbiAgICB3aWR0aDogMjAwcHg7IC8qIEFkanVzdCB0aGUgd2lkdGggYXMgbmVlZGVkICovXFxyXFxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7IC8qIFNwYWNpbmcgYmV0d2VlbiBsYWJlbCBhbmQgc2VsZWN0ICovXFxyXFxufVxcclxcblxcclxcbi8qIEVuc3VyZSBhbGwgc2VsZWN0IGJveGVzIGFyZSB3aWRlIGVub3VnaCB0byBzaG93IHRleHQgKi9cXHJcXG4uZmlsdGVyLWRyb3Bkb3duIHtcXHJcXG4gICAgZmxleDogMTtcXHJcXG4gICAgbWluLXdpZHRoOiAyMDBweDsgLyogQWRqdXN0IHRoZSBtaW4td2lkdGggYXMgbmVlZGVkICovXFxyXFxufVxcclxcblxcclxcbi8qIE9wdGlvbmFsIHN0eWxpbmcgdG8gbWFrZSB0aGUgc2VsZWN0IGRyb3Bkb3duIGxvb2sgYmV0dGVyICovXFxyXFxuLmZpbHRlci1kcm9wZG93biB7XFxyXFxuICAgIHBhZGRpbmc6IDVweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBSZXNwb25zaXZlIGFkanVzdG1lbnQ6IE9uIHNtYWxsZXIgc2NyZWVucywgc3RhY2sgZWxlbWVudHMgdmVydGljYWxseSAqL1xcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xcclxcbiAgICAjZmlsdGVyLWNvbnRhaW5lciBkaXYge1xcclxcbiAgICAgICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIH1cXHJcXG5cXHJcXG4gICAgI2ZpbHRlci1jb250YWluZXIgbGFiZWwge1xcclxcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcXHJcXG4gICAgICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xcclxcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcbiAgICB9XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///279\n')},843:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#tooltip {\r\n position: absolute;\r\n background-color: black;\r\n color: white;\r\n padding: 5px;\r\n border-radius: 3px;\r\n visibility: hidden;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n z-index: 1000;\r\n max-width: 300px;\r\n word-wrap: break-word;\r\n white-space: normal;\r\n}\r\n\r\n.tooltip-cell {\r\n /* color: blue; */\r\n /* text-decoration: underline; */\r\n cursor: pointer;\r\n}\r\n\r\n.tooltip-cell .info-icon {\r\n margin-left: 5px;\r\n color: var(--spiritgreen);\r\n font-size: 15px;\r\n}\r\n\r\n.tooltip-cell:hover {\r\n background-color: #f0f0f0; /* Change background on hover */\r\n}\r\n\r\n.detail {\r\n color: blue;\r\n color: var(--spiritgreen);\r\n text-decoration: underline;\r\n margin-left: 5px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/tooltip/tooltip.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,uBAAuB;IACvB,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;AACvB;;AAEA;IACI,iBAAiB;IACjB,gCAAgC;IAChC,eAAe;AACnB;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;AACnB;;AAEA;IACI,yBAAyB,EAAE,+BAA+B;AAC9D;;AAEA;IACI,WAAW;IACX,yBAAyB;IACzB,0BAA0B;IAC1B,gBAAgB;AACpB","sourcesContent":["#tooltip {\\r\\n position: absolute;\\r\\n background-color: black;\\r\\n color: white;\\r\\n padding: 5px;\\r\\n border-radius: 3px;\\r\\n visibility: hidden;\\r\\n white-space: nowrap;\\r\\n font-size: 14px;\\r\\n z-index: 1000;\\r\\n max-width: 300px;\\r\\n word-wrap: break-word;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.tooltip-cell {\\r\\n /* color: blue; */\\r\\n /* text-decoration: underline; */\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tooltip-cell .info-icon {\\r\\n margin-left: 5px;\\r\\n color: var(--spiritgreen);\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.tooltip-cell:hover {\\r\\n background-color: #f0f0f0; /* Change background on hover */\\r\\n}\\r\\n\\r\\n.detail {\\r\\n color: blue;\\r\\n color: var(--spiritgreen);\\r\\n text-decoration: underline;\\r\\n margin-left: 5px;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5jc3M/N2ZkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3Rvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgei1pbmRleDogMTAwMDtcclxuICAgIG1heC13aWR0aDogMzAwcHg7XHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG59XHJcblxyXG4udG9vbHRpcC1jZWxsIHtcclxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xyXG4gICAgLyogdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7ICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi50b29sdGlwLWNlbGwgLmluZm8taWNvbiB7XHJcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIGZvbnQtc2l6ZTogMTVweDtcclxufVxyXG5cclxuLnRvb2x0aXAtY2VsbDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xyXG59XHJcblxyXG4uZGV0YWlsIHtcclxuICAgIGNvbG9yOiBibHVlO1xyXG4gICAgY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCLEVBQUUsK0JBQStCO0FBQzlEOztBQUVBO0lBQ0ksV0FBVztJQUNYLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiN0b29sdGlwIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIHotaW5kZXg6IDEwMDA7XFxyXFxuICAgIG1heC13aWR0aDogMzAwcHg7XFxyXFxuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcXHJcXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvb2x0aXAtY2VsbCB7XFxyXFxuICAgIC8qIGNvbG9yOiBibHVlOyAqL1xcclxcbiAgICAvKiB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4udG9vbHRpcC1jZWxsIC5pbmZvLWljb24ge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgICBjb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBmb250LXNpemU6IDE1cHg7XFxyXFxufVxcclxcblxcclxcbi50b29sdGlwLWNlbGw6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOyAvKiBDaGFuZ2UgYmFja2dyb3VuZCBvbiBob3ZlciAqL1xcclxcbn1cXHJcXG5cXHJcXG4uZGV0YWlsIHtcXHJcXG4gICAgY29sb3I6IGJsdWU7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///843\n')},235:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\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_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Welcome page (index.html) */\r\n\r\n.step {\r\n width: 60%;\r\n height: 80px;\r\n font-size: 1.75em;\r\n margin-bottom: 0px; /* Adds spacing between buttons */\r\n margin-left: 20%;\r\n border-color: var(--citygreen);\r\n border-width: 2;\r\n color: var(--citygreen);\r\n background-color: white;\r\n}\r\n\r\n.step:hover {\r\n color: white;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#welcome-page {\r\n justify-content: center; \r\n align-items: center; \r\n padding-top: 20px;\r\n}\r\n.step.disabled {\r\n opacity: 50%;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/welcome/welcome.css"],"names":[],"mappings":"AAAA,8BAA8B;;AAE9B;IACI,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB,EAAE,iCAAiC;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,eAAe;IACf,uBAAuB;IACvB,uBAAuB;AAC3B;;AAEA;IACI,YAAY;IACZ,oCAAoC;AACxC;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;AACrB;AACA;IACI,YAAY;AAChB","sourcesContent":["/* Welcome page (index.html) */\\r\\n\\r\\n.step {\\r\\n width: 60%;\\r\\n height: 80px;\\r\\n font-size: 1.75em;\\r\\n margin-bottom: 0px; /* Adds spacing between buttons */\\r\\n margin-left: 20%;\\r\\n border-color: var(--citygreen);\\r\\n border-width: 2;\\r\\n color: var(--citygreen);\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.step:hover {\\r\\n color: white;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#welcome-page {\\r\\n justify-content: center; \\r\\n align-items: center; \\r\\n padding-top: 20px;\\r\\n}\\r\\n.step.disabled {\\r\\n opacity: 50%;\\r\\n}"],"sourceRoot":""}]);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cclxuXHJcbi5zdGVwIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBoZWlnaHQ6IDgwcHg7XHJcbiAgICBmb250LXNpemU6IDEuNzVlbTtcclxuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcclxuICAgIGJvcmRlci13aWR0aDogMjtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5zdGVwOmhvdmVyIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufVxyXG5cclxuI3dlbGNvbWUtcGFnZSB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG59XHJcbi5zdGVwLmRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDUwJTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSw4QkFBOEI7O0FBRTlCO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsa0JBQWtCLEVBQUUsaUNBQWlDO0lBQ3JELGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxZQUFZO0lBQ1osb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogV2VsY29tZSBwYWdlIChpbmRleC5odG1sKSAqL1xcclxcblxcclxcbi5zdGVwIHtcXHJcXG4gICAgd2lkdGg6IDYwJTtcXHJcXG4gICAgaGVpZ2h0OiA4MHB4O1xcclxcbiAgICBmb250LXNpemU6IDEuNzVlbTtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMHB4OyAvKiBBZGRzIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAyO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5zdGVwOmhvdmVyIHtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiN3ZWxjb21lLXBhZ2Uge1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IFxcclxcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcXHJcXG59XFxyXFxuLnN0ZXAuZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///235\n')},314:module=>{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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///314\n')},354:module=>{eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///354\n')},72:module=>{eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72\n')},659:module=>{eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///659\n')},540:module=>{eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcz9kZTZjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///540\n')},56:(module,__unused_webpack_exports,__webpack_require__)=>{eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n')},825:module=>{eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///825\n')},113:module=>{eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\n")}},__webpack_module_cache__={};function __webpack_require__(n){var c=__webpack_module_cache__[n];if(void 0!==c)return c.exports;var t=__webpack_module_cache__[n]={id:n,exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=n=>{var c=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(c,{a:c}),c},__webpack_require__.d=(n,c)=>{for(var t in c)__webpack_require__.o(c,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:c[t]})},__webpack_require__.o=(n,c)=>Object.prototype.hasOwnProperty.call(n,c),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(424)})(); \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 16786ec..a3e32ab 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -Budget Request Form


Baseline

Suplemental

\ No newline at end of file +Budget Request Form


Baseline

Suplemental

\ No newline at end of file