@datagrok/sequence-translator 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.js CHANGED
@@ -1849,10 +1849,10 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
1849
1849
 
1850
1850
  /***/ }),
1851
1851
 
1852
- /***/ "./src/ICDs.ts":
1853
- /*!*********************!*\
1854
- !*** ./src/ICDs.ts ***!
1855
- \*********************/
1852
+ /***/ "./src/autostart/ICDs.ts":
1853
+ /*!*******************************!*\
1854
+ !*** ./src/autostart/ICDs.ts ***!
1855
+ \*******************************/
1856
1856
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1857
1857
 
1858
1858
  "use strict";
@@ -1867,10 +1867,10 @@ NO DATA
1867
1867
 
1868
1868
  /***/ }),
1869
1869
 
1870
- /***/ "./src/IDPs.ts":
1871
- /*!*********************!*\
1872
- !*** ./src/IDPs.ts ***!
1873
- \*********************/
1870
+ /***/ "./src/autostart/IDPs.ts":
1871
+ /*!*******************************!*\
1872
+ !*** ./src/autostart/IDPs.ts ***!
1873
+ \*******************************/
1874
1874
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1875
1875
 
1876
1876
  "use strict";
@@ -1883,6 +1883,109 @@ NO DATA
1883
1883
  `;
1884
1884
 
1885
1885
 
1886
+ /***/ }),
1887
+
1888
+ /***/ "./src/autostart/calculations.ts":
1889
+ /*!***************************************!*\
1890
+ !*** ./src/autostart/calculations.ts ***!
1891
+ \***************************************/
1892
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1893
+
1894
+ "use strict";
1895
+ __webpack_require__.r(__webpack_exports__);
1896
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1897
+ /* harmony export */ "saltMass": () => (/* binding */ saltMass),
1898
+ /* harmony export */ "saltMolWeigth": () => (/* binding */ saltMolWeigth),
1899
+ /* harmony export */ "batchMolWeight": () => (/* binding */ batchMolWeight),
1900
+ /* harmony export */ "molecularWeight": () => (/* binding */ molecularWeight)
1901
+ /* harmony export */ });
1902
+ /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
1903
+ /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
1904
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
1905
+ /* harmony import */ var _structures_works_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../structures-works/map */ "./src/structures-works/map.ts");
1906
+
1907
+
1908
+
1909
+ function saltMass(saltNames, molWeightCol, equivalentsCol, i, saltCol) {
1910
+ const saltRowIndex = saltNames.indexOf(saltCol.get(i));
1911
+ return (saltRowIndex == -1 || molWeightCol.get(saltRowIndex) == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.FLOAT_NULL || equivalentsCol.get(i) == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.INT_NULL) ?
1912
+ datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.FLOAT_NULL :
1913
+ molWeightCol.get(saltRowIndex) * equivalentsCol.get(i);
1914
+ }
1915
+ function saltMolWeigth(saltNamesList, saltCol, molWeightCol, i) {
1916
+ const saltRowIndex = saltNamesList.indexOf(saltCol.get(i));
1917
+ return (saltRowIndex == -1) ? datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.FLOAT_NULL : molWeightCol.get(saltRowIndex);
1918
+ }
1919
+ function batchMolWeight(compoundMolWeightCol, saltMassCol, i) {
1920
+ return (compoundMolWeightCol.getString(i) == '' || saltMassCol.getString(i) == '') ?
1921
+ datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.FLOAT_NULL :
1922
+ compoundMolWeightCol.get(i) + saltMassCol.get(i);
1923
+ }
1924
+ function molecularWeight(sequence, weightsObj) {
1925
+ const codes = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.sortByStringLengthInDescendingOrder)(Object.keys(weightsObj)).concat(Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_2__.MODIFICATIONS));
1926
+ let weight = 0;
1927
+ let i = 0;
1928
+ while (i < sequence.length) {
1929
+ const matchedCode = codes.find((s) => s == sequence.slice(i, i + s.length));
1930
+ weight += weightsObj[sequence.slice(i, i + matchedCode.length)];
1931
+ i += matchedCode.length;
1932
+ }
1933
+ return weight - 61.97;
1934
+ }
1935
+
1936
+
1937
+ /***/ }),
1938
+
1939
+ /***/ "./src/autostart/constants.ts":
1940
+ /*!************************************!*\
1941
+ !*** ./src/autostart/constants.ts ***!
1942
+ \************************************/
1943
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1944
+
1945
+ "use strict";
1946
+ __webpack_require__.r(__webpack_exports__);
1947
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1948
+ /* harmony export */ "SEQUENCE_TYPES": () => (/* binding */ SEQUENCE_TYPES),
1949
+ /* harmony export */ "COL_NAMES": () => (/* binding */ COL_NAMES),
1950
+ /* harmony export */ "GENERATED_COL_NAMES": () => (/* binding */ GENERATED_COL_NAMES)
1951
+ /* harmony export */ });
1952
+ const SEQUENCE_TYPES = {
1953
+ SENSE_STRAND: 'SS',
1954
+ ANTISENSE_STRAND: 'AS',
1955
+ DUPLEX: 'Duplex',
1956
+ TRIPLEX: 'Triplex',
1957
+ DIMER: 'Dimer',
1958
+ };
1959
+ const COL_NAMES = {
1960
+ CHEMISTRY: 'Chemistry',
1961
+ NUMBER: 'Number',
1962
+ TYPE: 'Type',
1963
+ CHEMISTRY_NAME: 'Chemistry Name',
1964
+ INTERNAL_COMPOUND_ID: 'Internal compound ID',
1965
+ IDP: 'IDP',
1966
+ SEQUENCE: 'Sequence',
1967
+ COMPOUND_NAME: 'Compound Name',
1968
+ COMPOUND_COMMENTS: 'Compound Comments',
1969
+ SALT: 'Salt',
1970
+ EQUIVALENTS: 'Equivalents',
1971
+ PURITY: 'Purity',
1972
+ COMPOUND_MOL_WEIGHT: 'Cpd MW',
1973
+ SALT_MOL_WEIGHT: 'Salt MW',
1974
+ SALT_MASS: 'Salt mass',
1975
+ BATCH_MOL_WEIGHT: 'Batch MW',
1976
+ SOURCE: 'Source',
1977
+ ICD: 'ICD',
1978
+ OWNER: 'Owner',
1979
+ };
1980
+ const GENERATED_COL_NAMES = [
1981
+ COL_NAMES.COMPOUND_NAME,
1982
+ COL_NAMES.COMPOUND_COMMENTS,
1983
+ COL_NAMES.COMPOUND_MOL_WEIGHT,
1984
+ COL_NAMES.SALT_MASS,
1985
+ COL_NAMES.BATCH_MOL_WEIGHT,
1986
+ ];
1987
+
1988
+
1886
1989
  /***/ }),
1887
1990
 
1888
1991
  /***/ "./src/autostart/registration.ts":
@@ -1905,14 +2008,17 @@ __webpack_require__.r(__webpack_exports__);
1905
2008
  /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__);
1906
2009
  /* harmony import */ var _structures_works_converters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../structures-works/converters */ "./src/structures-works/converters.ts");
1907
2010
  /* harmony import */ var _structures_works_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../structures-works/map */ "./src/structures-works/map.ts");
1908
- /* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
1909
- /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
1910
- /* harmony import */ var _structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../structures-works/mol-transformations */ "./src/structures-works/mol-transformations.ts");
1911
- /* harmony import */ var _salts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../salts */ "./src/salts.ts");
1912
- /* harmony import */ var _users__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../users */ "./src/users.ts");
1913
- /* harmony import */ var _ICDs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ICDs */ "./src/ICDs.ts");
1914
- /* harmony import */ var _sources__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../sources */ "./src/sources.ts");
1915
- /* harmony import */ var _IDPs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../IDPs */ "./src/IDPs.ts");
2011
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants */ "./src/autostart/constants.ts");
2012
+ /* harmony import */ var _calculations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./calculations */ "./src/autostart/calculations.ts");
2013
+ /* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
2014
+ /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
2015
+ /* harmony import */ var _structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../structures-works/mol-transformations */ "./src/structures-works/mol-transformations.ts");
2016
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
2017
+ /* harmony import */ var _salts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./salts */ "./src/autostart/salts.ts");
2018
+ /* harmony import */ var _users__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./users */ "./src/autostart/users.ts");
2019
+ /* harmony import */ var _ICDs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ICDs */ "./src/autostart/ICDs.ts");
2020
+ /* harmony import */ var _sources__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./sources */ "./src/autostart/sources.ts");
2021
+ /* harmony import */ var _IDPs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./IDPs */ "./src/autostart/IDPs.ts");
1916
2022
  var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
1917
2023
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1918
2024
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -1935,88 +2041,61 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
1935
2041
 
1936
2042
 
1937
2043
 
1938
- function sortByStringLengthInDescendingOrder(array) {
1939
- return array.sort(function (a, b) { return b.length - a.length; });
1940
- }
1941
- function stringify(items) {
1942
- return '["' + items.join('", "') + '"]';
1943
- }
1944
- function saltMass(saltNames, molWeightCol, equivalentsCol, i, saltCol) {
1945
- const saltRowIndex = saltNames.indexOf(saltCol.get(i));
1946
- return (saltRowIndex == -1 || molWeightCol.get(saltRowIndex) == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL || equivalentsCol.get(i) == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.INT_NULL) ?
1947
- datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL :
1948
- molWeightCol.get(saltRowIndex) * equivalentsCol.get(i);
1949
- }
1950
- function saltMolWeigth(saltNamesList, saltCol, molWeightCol, i) {
1951
- const saltRowIndex = saltNamesList.indexOf(saltCol.get(i));
1952
- return (saltRowIndex == -1) ? datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL : molWeightCol.get(saltRowIndex);
1953
- }
1954
- function batchMolWeight(compoundMolWeightCol, saltMassCol, i) {
1955
- return (compoundMolWeightCol.getString(i) == '' || saltMassCol.getString(i) == '') ?
1956
- datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL :
1957
- compoundMolWeightCol.get(i) + saltMassCol.get(i);
1958
- }
1959
- function molecularWeight(sequence, weightsObj) {
1960
- const codes = sortByStringLengthInDescendingOrder(Object.keys(weightsObj)).concat(Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.MODIFICATIONS));
1961
- let weight = 0;
1962
- let i = 0;
1963
- while (i < sequence.length) {
1964
- const matchedCode = codes.find((s) => s == sequence.slice(i, i + s.length));
1965
- weight += weightsObj[sequence.slice(i, i + matchedCode.length)];
1966
- i += matchedCode.length;
1967
- }
1968
- return weight - 61.97;
1969
- }
2044
+
2045
+
2046
+
1970
2047
  function parseStrandsFromDuplexCell(s) {
1971
- return s.slice(3).split('\r\nAS ');
2048
+ const arr = s.slice(3).split('\r\nAS ');
2049
+ return { SS: arr[0], AS: arr[1] };
2050
+ }
2051
+ function parseStrandsFromTriplexOrDimerCell(s) {
2052
+ const arr1 = s.slice(3).split('\r\nAS1 ');
2053
+ const arr2 = arr1[1].split('\r\nAS2 ');
2054
+ return { SS: arr1[0], AS1: arr2[0], AS2: arr2[1] };
1972
2055
  }
1973
2056
  function saveTableAsSdFile(table) {
1974
2057
  return __awaiter(this, void 0, void 0, function* () {
1975
- if (!table.columns.contains('Compound Name')) {
1976
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning('File saved without columns \'' +
1977
- [_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_NAME, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_COMMENTS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CPD_MW,
1978
- _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.BATCH_MW].join('\', \''));
2058
+ if (_constants__WEBPACK_IMPORTED_MODULE_5__.GENERATED_COL_NAMES.some((colName) => !table.columns.contains(colName))) {
2059
+ const absentColNames = (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.differenceOfTwoArrays)(_constants__WEBPACK_IMPORTED_MODULE_5__.GENERATED_COL_NAMES, table.columns.names()).join(`', '`);
2060
+ datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning(`File saved without columns '${absentColNames}'`);
1979
2061
  }
1980
- const structureColumn = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SEQUENCE);
1981
- const typeColumn = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.TYPE);
2062
+ const sequenceCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SEQUENCE);
2063
+ const typeCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.TYPE);
1982
2064
  let result = '';
1983
2065
  for (let i = 0; i < table.rowCount; i++) {
1984
- const format = 'Janssen GCRS Codes'; //getFormat(structureColumn.get(i))!;
1985
- if (typeColumn.get(i) == 'Duplex') {
1986
- const array = parseStrandsFromDuplexCell(structureColumn.get(i));
1987
- const as = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(array[1], true, true, format) +
1988
- '\n' + `> <Sequence>\nAnti Sense\n\n`;
1989
- const ss = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(array[0], false, true, format) +
1990
- '\n' + `> <Sequence>\nSense Strand\n\n`;
1991
- result += (0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_7__.linkV3000)([ss, as], true, true) + '\n\n';
1992
- }
1993
- else if (typeColumn.get(i) == 'SS') {
1994
- const molSS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(structureColumn.get(i), false, true, format) +
1995
- '\n' + `> <Sequence>\nSense Strand\n\n`;
1996
- result += molSS;
2066
+ const format = _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.SYNTHESIZERS.GCRS; //getFormat(sequenceCol.get(i))!;
2067
+ if (typeCol.get(i) == _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.SENSE_STRAND)
2068
+ result += `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(sequenceCol.get(i), false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
2069
+ else if (typeCol.get(i) == _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.ANTISENSE_STRAND)
2070
+ result += `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(sequenceCol.get(i), true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
2071
+ else if (typeCol.get(i) == _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DUPLEX) {
2072
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
2073
+ const as = `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(obj.AS, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
2074
+ const ss = `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(obj.SS, false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
2075
+ result += `${(0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_9__.linkStrandsV3000)({ senseStrands: [ss], antiStrands: [as] }, true)}\n\n`;
1997
2076
  }
1998
- else if (typeColumn.get(i) == 'AS') {
1999
- const molAS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_6__.sequenceToMolV3000)(structureColumn.get(i), true, true, format) +
2000
- '\n' + `> <Sequence>\nAnti Sense\n\n`;
2001
- result += molAS;
2077
+ else if ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.TRIPLEX, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DIMER].includes(typeCol.get(i))) {
2078
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
2079
+ const as1 = `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(obj.AS1, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
2080
+ const as2 = `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(obj.AS2, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
2081
+ const ss = `${(0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_8__.sequenceToMolV3000)(obj.SS, false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
2082
+ result += `${(0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_9__.linkStrandsV3000)({ senseStrands: [ss], antiStrands: [as1, as2] }, true)}\n\n`;
2002
2083
  }
2003
2084
  for (const col of table.columns) {
2004
- if (col.name != _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SEQUENCE)
2085
+ if (col.name != _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SEQUENCE)
2005
2086
  result += `> <${col.name}>\n${col.get(i)}\n\n`;
2006
2087
  }
2007
2088
  result += '$$$$\n';
2008
2089
  }
2009
- const element = document.createElement('a');
2010
- element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
2011
- element.setAttribute('download', table.name + '.sdf');
2012
- element.click();
2090
+ (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.download)(`${table.name}.sdf`, encodeURIComponent(result));
2013
2091
  });
2014
2092
  }
2015
2093
  function autostartOligoSdFileSubscription() {
2016
2094
  datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onViewAdded.subscribe((v) => {
2017
- if (v.type == 'TableView') {
2018
- if (v.dataFrame.columns.contains(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.TYPE))
2095
+ if (v.type == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.VIEW_TYPE.TABLE_VIEW) {
2096
+ if (v.dataFrame.columns.contains(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.TYPE))
2019
2097
  oligoSdFile(v.dataFrame);
2098
+ // Should be removed after fixing bug https://github.com/datagrok-ai/public/issues/808
2020
2099
  datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onContextMenu.subscribe((args) => {
2021
2100
  const seqCol = args.args.context.table.currentCol; // /^[fsACGUacgu]{6,}$/
2022
2101
  if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Detector.sampleCategories(seqCol, (s) => /(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C){6,}$/.test(s))) {
@@ -2066,83 +2145,97 @@ function autostartOligoSdFileSubscription() {
2066
2145
  });
2067
2146
  }
2068
2147
  function oligoSdFile(table) {
2069
- const saltsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_salts__WEBPACK_IMPORTED_MODULE_8__.SALTS_CSV);
2070
- const usersDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_users__WEBPACK_IMPORTED_MODULE_9__.USERS_CSV);
2071
- const sourcesDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_sources__WEBPACK_IMPORTED_MODULE_11__.SOURCES);
2072
- const icdsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_ICDs__WEBPACK_IMPORTED_MODULE_10__.ICDS);
2073
- const idpsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_IDPs__WEBPACK_IMPORTED_MODULE_12__.IDPS);
2074
- const sequenceCol = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SEQUENCE);
2075
- const saltCol = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT);
2076
- const equivalentsCol = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.EQUIVALENTS);
2077
- const typeColumn = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.TYPE);
2078
- const chemistryNameCol = table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CHEMISTRY_NAME);
2148
+ const saltsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_salts__WEBPACK_IMPORTED_MODULE_11__.SALTS_CSV);
2149
+ const usersDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_users__WEBPACK_IMPORTED_MODULE_12__.USERS_CSV);
2150
+ const sourcesDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_sources__WEBPACK_IMPORTED_MODULE_14__.SOURCES);
2151
+ const icdsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_ICDs__WEBPACK_IMPORTED_MODULE_13__.ICDS);
2152
+ const idpsDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromCsv(_IDPs__WEBPACK_IMPORTED_MODULE_15__.IDPS);
2153
+ const sequenceCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SEQUENCE);
2154
+ const saltCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT);
2155
+ const equivalentsCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.EQUIVALENTS);
2156
+ const typeCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.TYPE);
2157
+ const chemistryNameCol = table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.CHEMISTRY_NAME);
2079
2158
  const molWeightCol = saltsDf.getCol('MOLWEIGHT');
2080
2159
  const saltNamesList = saltsDf.getCol('DISPLAY').toList();
2160
+ let newDf;
2161
+ let addColumnsPressed = false;
2081
2162
  function addColumns(t) {
2082
- if (t.columns.contains(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_NAME))
2163
+ if (_constants__WEBPACK_IMPORTED_MODULE_5__.GENERATED_COL_NAMES.some((colName) => t.columns.contains(colName)))
2083
2164
  return datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.error('Columns already exist');
2084
- for (let i = t.rowCount - 1; i > -1; i--) {
2085
- if (sequenceCol.get(i) == '')
2086
- t.rows.removeAt(i, 1, false);
2087
- }
2088
- t.columns.addNewString(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_NAME).init((i) => {
2089
- return (typeColumn.get(i) == 'Duplex') ? chemistryNameCol.get(i) : sequenceCol.get(i);
2165
+ t = (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.removeEmptyRows)(t, sequenceCol);
2166
+ t.columns.addNewString(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.COMPOUND_NAME).init((i) => {
2167
+ return ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DUPLEX, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DIMER, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) ?
2168
+ chemistryNameCol.get(i) :
2169
+ sequenceCol.get(i);
2090
2170
  });
2091
- t.columns.addNewString(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_COMMENTS).init((i) => {
2092
- if (typeColumn.get(i) == 'Duplex') {
2093
- const arr = parseStrandsFromDuplexCell(sequenceCol.get(i));
2094
- return chemistryNameCol.get(i) + '; duplex of SS: ' + arr[0] + ' and AS: ' + arr[1];
2171
+ t.columns.addNewString(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.COMPOUND_COMMENTS).init((i) => {
2172
+ if ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.SENSE_STRAND, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.ANTISENSE_STRAND].includes(typeCol.get(i)))
2173
+ return sequenceCol.get(i);
2174
+ else if (typeCol.get(i) == _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DUPLEX) {
2175
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
2176
+ return `${chemistryNameCol.get(i)}; duplex of SS: ${obj.SS} and AS: ${obj.AS}`;
2177
+ }
2178
+ else if ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DIMER, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) {
2179
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
2180
+ return `${chemistryNameCol.get(i)}; duplex of SS: ${obj.SS} and AS1: ${obj.AS1} and AS2: ${obj.AS2}`;
2095
2181
  }
2096
- return sequenceCol.get(i);
2097
2182
  });
2098
- const weightsObj = {};
2099
- for (const synthesizer of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.map)) {
2100
- for (const technology of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.map[synthesizer])) {
2101
- for (const code of Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.map[synthesizer][technology]))
2102
- weightsObj[code] = _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.map[synthesizer][technology][code].weight;
2183
+ t.columns.addNewFloat(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.COMPOUND_MOL_WEIGHT).init((i) => {
2184
+ if ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.SENSE_STRAND, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.ANTISENSE_STRAND].includes(typeCol.get(i))) {
2185
+ return ((0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.isValidSequence)(sequenceCol.get(i), null).indexOfFirstNotValidChar == -1) ?
2186
+ (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(sequenceCol.get(i), _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) :
2187
+ datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL;
2103
2188
  }
2104
- }
2105
- for (const [key, value] of Object.entries(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.MODIFICATIONS))
2106
- weightsObj[key] = value.molecularWeight;
2107
- t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CPD_MW).init((i) => {
2108
- if (typeColumn.get(i) == 'Duplex') {
2109
- const arr = parseStrandsFromDuplexCell(sequenceCol.get(i));
2110
- return ((0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_5__.isValidSequence)(arr[0], null).indexOfFirstNotValidChar == -1 &&
2111
- (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_5__.isValidSequence)(arr[1], null).indexOfFirstNotValidChar == -1) ?
2112
- molecularWeight(arr[0], weightsObj) + molecularWeight(arr[1], weightsObj) :
2189
+ else if (typeCol.get(i) == _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DUPLEX) {
2190
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
2191
+ return (Object.values(obj).every((seq) => (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.isValidSequence)(seq, null).indexOfFirstNotValidChar == -1)) ?
2192
+ (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(obj.SS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) + (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(obj.AS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) :
2193
+ datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL;
2194
+ }
2195
+ else if ([_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.DIMER, _constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) {
2196
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
2197
+ return (Object.values(obj).every((seq) => (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_7__.isValidSequence)(seq, null).indexOfFirstNotValidChar == -1)) ?
2198
+ (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(obj.SS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) + (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(obj.AS1, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) +
2199
+ (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.molecularWeight)(obj.AS2, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.weightsObj) :
2113
2200
  datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL;
2114
2201
  }
2115
- return ((0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_5__.isValidSequence)(sequenceCol.get(i), null).indexOfFirstNotValidChar == -1) ?
2116
- molecularWeight(sequenceCol.get(i), weightsObj) :
2117
- datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.FLOAT_NULL;
2118
2202
  });
2119
- t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS).init((i) => saltMass(saltNamesList, molWeightCol, equivalentsCol, i, saltCol));
2120
- t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MOL_WEIGHT).init((i) => saltMolWeigth(saltNamesList, saltCol, molWeightCol, i));
2121
- t.columns.addNewFloat(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.BATCH_MW).init((i) => batchMolWeight(t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CPD_MW), t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS), i));
2203
+ t.columns.addNewFloat(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MASS).init((i) => (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.saltMass)(saltNamesList, molWeightCol, equivalentsCol, i, saltCol));
2204
+ t.columns.addNewFloat(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MOL_WEIGHT).init((i) => (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.saltMolWeigth)(saltNamesList, saltCol, molWeightCol, i));
2205
+ const compoundMolWeightCol = t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.COMPOUND_MOL_WEIGHT);
2206
+ const saltMassCol = t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MASS);
2207
+ t.columns.addNewFloat(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.BATCH_MOL_WEIGHT).init((i) => (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.batchMolWeight)(compoundMolWeightCol, saltMassCol, i));
2208
+ datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.getTableView(table.name).grid.columns.setOrder(Object.values(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES));
2122
2209
  addColumnsPressed = true;
2123
2210
  return newDf = t;
2124
2211
  }
2125
- let newDf;
2126
- let addColumnsPressed = false;
2212
+ function updateCalculatedColumns(t, i) {
2213
+ const smValue = (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.saltMass)(saltNamesList, molWeightCol, equivalentsCol, i, saltCol);
2214
+ t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MASS).set(i, smValue, false);
2215
+ const smwValue = (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.saltMolWeigth)(saltNamesList, saltCol, molWeightCol, i);
2216
+ t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MOL_WEIGHT).set(i, smwValue, false);
2217
+ const bmw = (0,_calculations__WEBPACK_IMPORTED_MODULE_6__.batchMolWeight)(t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.COMPOUND_MOL_WEIGHT), t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MASS), i);
2218
+ t.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.BATCH_MOL_WEIGHT).set(i, bmw, false);
2219
+ }
2127
2220
  const d = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([
2128
2221
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.icons.edit(() => {
2129
2222
  d.innerHTML = '';
2130
- if (table.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.IDP).type != datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING)
2131
- table.changeColumnType(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.IDP, datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING);
2132
- d.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.link('Add Columns', () => {
2133
- addColumns(table);
2134
- view.grid.columns.setOrder(Object.values(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES));
2135
- }, 'Add columns: \'' + [_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_NAME, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.COMPOUND_COMMENTS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CPD_MW,
2136
- _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.BATCH_MW].join('\', \''), ''), datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.button('Save SD file', () => saveTableAsSdFile(addColumnsPressed ? newDf : table)));
2223
+ if (table.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.IDP).type != datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING)
2224
+ table.changeColumnType(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.IDP, datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.COLUMN_TYPE.STRING);
2225
+ d.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divH([
2226
+ datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.icons.add(() => addColumns(table), `Add columns: '${_constants__WEBPACK_IMPORTED_MODULE_5__.GENERATED_COL_NAMES.join(`', '`)}'`),
2227
+ datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.icons.save(() => saveTableAsSdFile(addColumnsPressed ? newDf : table), 'Save SD file'),
2228
+ ]));
2137
2229
  const view = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.getTableView(table.name);
2138
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.TYPE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, '["AS", "SS", "Duplex"]');
2139
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.OWNER).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringify(usersDf.columns.byIndex(0).toList()));
2140
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringify(saltsDf.columns.byIndex(0).toList()));
2141
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SOURCE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringify(sourcesDf.columns.byIndex(0).toList()));
2142
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.ICD).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringify(icdsDf.columns.byIndex(0).toList()));
2143
- view.dataFrame.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.IDP).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, stringify(idpsDf.columns.byIndex(0).toList()));
2230
+ view.grid.setOptions({ rowHeight: 45 });
2231
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.TYPE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(Object.values(_constants__WEBPACK_IMPORTED_MODULE_5__.SEQUENCE_TYPES)));
2232
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.OWNER).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(usersDf.columns.byIndex(0).toList()));
2233
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(saltsDf.columns.byIndex(0).toList()));
2234
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SOURCE).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(sourcesDf.columns.byIndex(0).toList()));
2235
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.ICD).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(icdsDf.columns.byIndex(0).toList()));
2236
+ view.dataFrame.getCol(_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.IDP).setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.CHOICES, (0,_helpers__WEBPACK_IMPORTED_MODULE_10__.stringify)(idpsDf.columns.byIndex(0).toList()));
2144
2237
  datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.events.onContextMenu.subscribe((args) => {
2145
- if ([_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.TYPE, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.OWNER, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SOURCE, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.ICD, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.IDP]
2238
+ if ([_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.TYPE, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.OWNER, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SOURCE, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.ICD, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.IDP]
2146
2239
  .includes(args.args.context.table.currentCol.name)) {
2147
2240
  args.args.menu.item('Fill Column With Value', () => {
2148
2241
  const v = args.args.context.table.currentCell.value;
@@ -2154,23 +2247,68 @@ function oligoSdFile(table) {
2154
2247
  });
2155
2248
  view.dataFrame.onDataChanged.subscribe(() => {
2156
2249
  const colName = view.dataFrame.currentCol.name;
2157
- if ([_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.EQUIVALENTS, _structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MOL_WEIGHT].includes(colName))
2250
+ if ([_constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.EQUIVALENTS, _constants__WEBPACK_IMPORTED_MODULE_5__.COL_NAMES.SALT_MOL_WEIGHT].includes(colName))
2158
2251
  updateCalculatedColumns(view.dataFrame, view.dataFrame.currentRowIdx);
2159
2252
  });
2160
- function updateCalculatedColumns(t, i) {
2161
- const smValue = saltMass(saltNamesList, molWeightCol, equivalentsCol, i, saltCol);
2162
- t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS).set(i, smValue, false);
2163
- const smwValue = saltMolWeigth(saltNamesList, saltCol, molWeightCol, i);
2164
- t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MOL_WEIGHT).set(i, smwValue, false);
2165
- const bmw = batchMolWeight(t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.CPD_MW), t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.SALT_MASS), i);
2166
- t.getCol(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.COL_NAMES.BATCH_MW).set(i, bmw, false);
2167
- }
2168
2253
  }),
2169
2254
  ]);
2170
2255
  datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.v.setRibbonPanels([[d]]);
2171
2256
  }
2172
2257
 
2173
2258
 
2259
+ /***/ }),
2260
+
2261
+ /***/ "./src/autostart/salts.ts":
2262
+ /*!********************************!*\
2263
+ !*** ./src/autostart/salts.ts ***!
2264
+ \********************************/
2265
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2266
+
2267
+ "use strict";
2268
+ __webpack_require__.r(__webpack_exports__);
2269
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2270
+ /* harmony export */ "SALTS_CSV": () => (/* binding */ SALTS_CSV)
2271
+ /* harmony export */ });
2272
+ const SALTS_CSV = `DISPLAY,MOLWEIGHT
2273
+ no Data Added,100`;
2274
+
2275
+
2276
+ /***/ }),
2277
+
2278
+ /***/ "./src/autostart/sources.ts":
2279
+ /*!**********************************!*\
2280
+ !*** ./src/autostart/sources.ts ***!
2281
+ \**********************************/
2282
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2283
+
2284
+ "use strict";
2285
+ __webpack_require__.r(__webpack_exports__);
2286
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2287
+ /* harmony export */ "SOURCES": () => (/* binding */ SOURCES)
2288
+ /* harmony export */ });
2289
+ const SOURCES = `DISPLAY
2290
+ NO DATA
2291
+ `;
2292
+
2293
+
2294
+ /***/ }),
2295
+
2296
+ /***/ "./src/autostart/users.ts":
2297
+ /*!********************************!*\
2298
+ !*** ./src/autostart/users.ts ***!
2299
+ \********************************/
2300
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2301
+
2302
+ "use strict";
2303
+ __webpack_require__.r(__webpack_exports__);
2304
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2305
+ /* harmony export */ "USERS_CSV": () => (/* binding */ USERS_CSV)
2306
+ /* harmony export */ });
2307
+ const USERS_CSV = `DISPLAY
2308
+ NO DATA
2309
+ `;
2310
+
2311
+
2174
2312
  /***/ }),
2175
2313
 
2176
2314
  /***/ "./src/axolabs/constants.ts":
@@ -2428,7 +2566,7 @@ function defineAxolabsPattern() {
2428
2566
  asBases[i] = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('', asBases[i].value, baseChoices, (v) => {
2429
2567
  if (!enumerateModifications.includes(v)) {
2430
2568
  enumerateModifications.push(v);
2431
- isEnumerateModificationsDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(v, true, (boolV) => {
2569
+ isEnumerateModificationsDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divText('', { style: { width: '25px' } }), datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(v, true, (boolV) => {
2432
2570
  if (boolV) {
2433
2571
  if (!enumerateModifications.includes(v))
2434
2572
  enumerateModifications.push(v);
@@ -2467,7 +2605,7 @@ function defineAxolabsPattern() {
2467
2605
  ssBases[i] = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('', ssBases[i].value, baseChoices, (v) => {
2468
2606
  if (!enumerateModifications.includes(v)) {
2469
2607
  enumerateModifications.push(v);
2470
- isEnumerateModificationsDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(v, true, (boolV) => {
2608
+ isEnumerateModificationsDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divText('', { style: { width: '25px' } }), datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(v, true, (boolV) => {
2471
2609
  if (boolV) {
2472
2610
  if (!enumerateModifications.includes(v))
2473
2611
  enumerateModifications.push(v);
@@ -2745,7 +2883,8 @@ function defineAxolabsPattern() {
2745
2883
  const loadPatternDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
2746
2884
  const asModificationDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
2747
2885
  const firstAsPtoDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
2748
- const isEnumerateModificationsDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divH([datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(defaultBase, true, (v) => {
2886
+ const isEnumerateModificationsDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.divH([
2887
+ datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput(defaultBase, true, (v) => {
2749
2888
  if (v) {
2750
2889
  if (!enumerateModifications.includes(defaultBase))
2751
2890
  enumerateModifications.push(defaultBase);
@@ -2757,7 +2896,8 @@ function defineAxolabsPattern() {
2757
2896
  }
2758
2897
  updateSvgScheme();
2759
2898
  updateOutputExamples();
2760
- }).root]);
2899
+ }).root,
2900
+ ]);
2761
2901
  let ssBases = Array(defaultSequenceLength).fill(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('', defaultBase, baseChoices));
2762
2902
  let asBases = Array(defaultSequenceLength).fill(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('', defaultBase, baseChoices));
2763
2903
  let ssPtoLinkages = Array(defaultSequenceLength).fill(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.boolInput('', defaultPto));
@@ -3109,12 +3249,8 @@ function getTextWidth(text, font) {
3109
3249
  // @ts-ignore
3110
3250
  return 2 * context.measureText(text).width;
3111
3251
  }
3112
- function getTextInsideCircle(bases, index, nucleotideCounter, numberOfNucleotides, enumerateModifications) {
3113
- return ((bases[index].slice(-3) == '(o)') || !enumerateModifications.includes(bases[index])) ?
3114
- '' :
3115
- (['A', 'G', 'C', 'U', 'T'].includes(bases[index])) ?
3116
- bases[index] :
3117
- ''; //String(numberOfNucleotides - nucleotideCounter);
3252
+ function getTextInsideCircle(bases, index) {
3253
+ return (bases[index].slice(-3) == '(o)' || !['A', 'G', 'C', 'U', 'T'].includes(bases[index])) ? '' : bases[index];
3118
3254
  }
3119
3255
  function getFontColorVisibleOnBackground(rgbString) {
3120
3256
  const rgbIntList = rgbString.match(/\d+/g).map((e) => Number(e));
@@ -3211,14 +3347,15 @@ function drawAxolabsPattern(patternName, asExists, ssBases, asBases, ssPtoStatus
3211
3347
  const xOfRightTexts = Math.max(xOfSsRightModifications, xOfAsRightModifications) +
3212
3348
  widthOfLeftModification + baseDiameter * (Math.max(ssRightOverhangs, asRightOverhangs));
3213
3349
  const yOfTitle = baseRadius;
3214
- const yOfNumbers = 2 * baseRadius;
3350
+ const yOfSsNumbers = 2 * baseRadius;
3351
+ const yOfAsNumbers = 8.5 * baseRadius;
3215
3352
  const yOfSsTexts = 4 * baseRadius;
3216
3353
  const yOfAsTexts = 7 * baseRadius;
3217
3354
  const yOfComment = asExists ? 11 * baseRadius : 8.5 * baseRadius;
3218
3355
  const yOfSsCircles = 3.5 * baseRadius;
3219
3356
  const yOfAsCircles = 6.5 * baseRadius;
3220
- const yOfCirclesInLegends = asExists ? 9 * baseRadius : 6 * baseRadius;
3221
- const yOfTextLegend = asExists ? 9.5 * baseRadius - 3 : yOfAsCircles - 3;
3357
+ const yOfCirclesInLegends = asExists ? 9.5 * baseRadius : 6 * baseRadius;
3358
+ const yOfTextLegend = asExists ? 10 * baseRadius - 3 : yOfAsCircles - 3;
3222
3359
  const image = svg.render(width, height);
3223
3360
  image.append(svg.text(ssLeftText, xOfLeftTexts, yOfSsTexts, baseFontSize, fontColor), asExists ? svg.text(asLeftText, xOfLeftTexts, yOfAsTexts, baseFontSize, fontColor) : '', svg.text(ssRightText, xOfRightTexts, yOfSsTexts, baseFontSize, fontColor), asExists ? svg.text(asRightText, xOfRightTexts, yOfAsTexts, baseFontSize, fontColor) : '', svg.text(ssFiveModification, xOfLeftModifications, yOfSsTexts, baseFontSize, modificationsColor), asExists ? svg.text(asThreeModification, xOfLeftModifications, yOfAsTexts, baseFontSize, modificationsColor) : '', svg.text(ssThreeModification, xOfSsRightModifications, yOfSsTexts, baseFontSize, modificationsColor), asExists ? svg.text(asFiveModification, xOfAsRightModifications, yOfAsTexts, baseFontSize, modificationsColor) : '', svg.text(comment, xOfLeftTexts, yOfComment, legendFontSize, fontColor), isPtoExist ? svg.star(baseRadius, yOfCirclesInLegends, psLinkageColor) : '', isPtoExist ? svg.text('ps linkage', 2 * baseRadius - 8, yOfTextLegend, legendFontSize, fontColor) : '');
3224
3361
  let numberOfSsNucleotides = 0;
@@ -3232,7 +3369,9 @@ function drawAxolabsPattern(patternName, asExists, ssBases, asBases, ssPtoStatus
3232
3369
  getShiftToAlignNumberInsideCircle(ssBases, ssBases.length - i, numberOfSsNucleotides - nucleotideCounter);
3233
3370
  if (ssBases[i].slice(-3) != '(o)')
3234
3371
  nucleotideCounter--;
3235
- image.append(svg.text(String(numberOfSsNucleotides - nucleotideCounter), xOfNumbers, yOfNumbers, legendFontSize, fontColor), svg.circle(getXOfBaseCircles(i, ssRightOverhangs), yOfSsCircles, baseRadius, getBaseColor(ssBases[i])), svg.text(getTextInsideCircle(ssBases, i, nucleotideCounter, numberOfSsNucleotides, enumerateModifications), xOfNumbers, yOfSsTexts, baseFontSize, getFontColorVisibleOnBackground(_constants__WEBPACK_IMPORTED_MODULE_0__.axolabsMap[ssBases[i]]['color'])), ssPtoStatuses[i] ?
3372
+ const n = (ssBases[i].slice(-3) != '(o)' && enumerateModifications.includes(ssBases[i])) ?
3373
+ String(numberOfSsNucleotides - nucleotideCounter) : '';
3374
+ image.append(svg.text(n, xOfNumbers, yOfSsNumbers, legendFontSize, fontColor), svg.circle(getXOfBaseCircles(i, ssRightOverhangs), yOfSsCircles, baseRadius, getBaseColor(ssBases[i])), svg.text(getTextInsideCircle(ssBases, i), xOfNumbers, yOfSsTexts, baseFontSize, getFontColorVisibleOnBackground(getBaseColor(ssBases[i]))), ssPtoStatuses[i] ?
3236
3375
  svg.star(getXOfBaseCircles(i, ssRightOverhangs) + baseRadius, yOfSsTexts + psLinkageRadius, psLinkageColor) :
3237
3376
  '');
3238
3377
  }
@@ -3249,8 +3388,11 @@ function drawAxolabsPattern(patternName, asExists, ssBases, asBases, ssPtoStatus
3249
3388
  for (let i = asBases.length - 1; i > -1; i--) {
3250
3389
  if (asBases[i].slice(-3) != '(o)')
3251
3390
  nucleotideCounter--;
3252
- image.append(svg.circle(getXOfBaseCircles(i, asRightOverhangs), yOfAsCircles, baseRadius, getBaseColor(asBases[i])), svg.text(getTextInsideCircle(asBases, i, numberOfAsNucleotides - nucleotideCounter - 1, numberOfAsNucleotides, enumerateModifications), getXOfBaseCircles(i, asRightOverhangs) +
3253
- getShiftToAlignNumberInsideCircle(asBases, i, nucleotideCounter + 1), yOfAsTexts, baseFontSize, getFontColorVisibleOnBackground(_constants__WEBPACK_IMPORTED_MODULE_0__.axolabsMap[asBases[i]]['color'])), asPtoStatuses[i] ? svg.star(getXOfBaseCircles(i, asRightOverhangs) +
3391
+ const xOfNumbers = getXOfBaseCircles(i, asRightOverhangs) +
3392
+ getShiftToAlignNumberInsideCircle(asBases, i, nucleotideCounter + 1);
3393
+ const n = (asBases[i].slice(-3) != '(o)' && enumerateModifications.includes(asBases[i])) ?
3394
+ String(nucleotideCounter + 1) : '';
3395
+ image.append(svg.text(n, xOfNumbers, yOfAsNumbers, legendFontSize, fontColor), svg.circle(getXOfBaseCircles(i, asRightOverhangs), yOfAsCircles, baseRadius, getBaseColor(asBases[i])), svg.text(getTextInsideCircle(asBases, i), getXOfBaseCircles(i, asRightOverhangs) + getShiftToAlignNumberInsideCircle(asBases, i, nucleotideCounter + 1), yOfAsTexts, baseFontSize, getFontColorVisibleOnBackground(getBaseColor(asBases[i]))), asPtoStatuses[i] ? svg.star(getXOfBaseCircles(i, asRightOverhangs) +
3254
3396
  baseRadius, yOfAsTexts + psLinkageRadius, psLinkageColor) : '');
3255
3397
  }
3256
3398
  image.append(asPtoStatuses[asBases.length] ?
@@ -3268,6 +3410,47 @@ function drawAxolabsPattern(patternName, asExists, ssBases, asBases, ssPtoStatus
3268
3410
  }
3269
3411
 
3270
3412
 
3413
+ /***/ }),
3414
+
3415
+ /***/ "./src/helpers.ts":
3416
+ /*!************************!*\
3417
+ !*** ./src/helpers.ts ***!
3418
+ \************************/
3419
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3420
+
3421
+ "use strict";
3422
+ __webpack_require__.r(__webpack_exports__);
3423
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3424
+ /* harmony export */ "sortByStringLengthInDescendingOrder": () => (/* binding */ sortByStringLengthInDescendingOrder),
3425
+ /* harmony export */ "stringify": () => (/* binding */ stringify),
3426
+ /* harmony export */ "download": () => (/* binding */ download),
3427
+ /* harmony export */ "removeEmptyRows": () => (/* binding */ removeEmptyRows),
3428
+ /* harmony export */ "differenceOfTwoArrays": () => (/* binding */ differenceOfTwoArrays)
3429
+ /* harmony export */ });
3430
+ function sortByStringLengthInDescendingOrder(array) {
3431
+ return array.sort(function (a, b) { return b.length - a.length; });
3432
+ }
3433
+ function stringify(items) {
3434
+ return '["' + items.join('", "') + '"]';
3435
+ }
3436
+ function download(name, href) {
3437
+ const element = document.createElement('a');
3438
+ element.setAttribute('href', 'data:text/plain;charset=utf-8,' + href);
3439
+ element.setAttribute('download', name);
3440
+ element.click();
3441
+ }
3442
+ function removeEmptyRows(t, colToCheck) {
3443
+ for (let i = t.rowCount - 1; i > -1; i--) {
3444
+ if (colToCheck.getString(i) == '')
3445
+ t.rows.removeAt(i, 1, false);
3446
+ }
3447
+ return t;
3448
+ }
3449
+ function differenceOfTwoArrays(a, b) {
3450
+ return a.filter((x) => !b.includes(x));
3451
+ }
3452
+
3453
+
3271
3454
  /***/ }),
3272
3455
 
3273
3456
  /***/ "./src/main/main-view.ts":
@@ -3292,6 +3475,8 @@ __webpack_require__.r(__webpack_exports__);
3292
3475
  /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
3293
3476
  /* harmony import */ var cash_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! cash-dom */ "./node_modules/cash-dom/dist/cash.js");
3294
3477
  /* harmony import */ var cash_dom__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(cash_dom__WEBPACK_IMPORTED_MODULE_6__);
3478
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
3479
+
3295
3480
 
3296
3481
 
3297
3482
 
@@ -3307,7 +3492,6 @@ function mainView() {
3307
3492
  moleculeSvgDiv.innerHTML = '';
3308
3493
  outputTableDiv.innerHTML = '';
3309
3494
  const pi = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TaskBarProgressIndicator.create('Rendering table and molecule...');
3310
- let errorsExist = false;
3311
3495
  try {
3312
3496
  sequence = sequence.replace(/\s/g, '');
3313
3497
  const output = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__.isValidSequence)(sequence, null);
@@ -3318,13 +3502,6 @@ function mainView() {
3318
3502
  const indexOfFirstNotValidChar = ('indexOfFirstNotValidChar' in outputSequenceObj) ?
3319
3503
  JSON.parse(outputSequenceObj.indexOfFirstNotValidChar).indexOfFirstNotValidChar :
3320
3504
  -1;
3321
- if ('indexOfFirstNotValidChar' in outputSequenceObj) {
3322
- const indexOfFirstNotValidChar = ('indexOfFirstNotValidChar' in outputSequenceObj) ?
3323
- JSON.parse(outputSequenceObj.indexOfFirstNotValidChar).indexOfFirstNotValidChar :
3324
- -1;
3325
- if (indexOfFirstNotValidChar != -1)
3326
- errorsExist = true;
3327
- }
3328
3505
  tableRows.push({
3329
3506
  'key': key,
3330
3507
  'value': ('indexOfFirstNotValidChar' in outputSequenceObj) ?
@@ -3337,20 +3514,6 @@ function mainView() {
3337
3514
  .then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(sequenceWasCopied)), tooltipSequence, ''),
3338
3515
  });
3339
3516
  }
3340
- if (errorsExist) {
3341
- const synthesizer = JSON.parse(outputSequenceObj.indexOfFirstNotValidChar).synthesizer.slice(0, -6);
3342
- asoGapmersGrid.onCellPrepare(function (gc) {
3343
- gc.style.backColor = (gc.gridColumn.name == synthesizer) ? 0xFFF00000 : 0xFFFFFFFF;
3344
- });
3345
- omeAndFluoroGrid.onCellPrepare(function (gc) {
3346
- gc.style.backColor = (gc.gridColumn.name == synthesizer) ? 0xFFF00000 : 0xFFFFFFFF;
3347
- });
3348
- switchInput.enabled = true;
3349
- }
3350
- else {
3351
- asoGapmersGrid.onCellPrepare(function (gc) { gc.style.backColor = 0xFFFFFFFF; });
3352
- omeAndFluoroGrid.onCellPrepare(function (gc) { gc.style.backColor = 0xFFFFFFFF; });
3353
- }
3354
3517
  outputTableDiv.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([
3355
3518
  datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.HtmlTable.create(tableRows, (item) => [item.key, item.value], ['Code', 'Sequence']).root,
3356
3519
  ]));
@@ -3388,7 +3551,7 @@ function mainView() {
3388
3551
  const inputSequenceField = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.textInput('', defaultInput, (sequence) => {
3389
3552
  updateTableAndMolecule(sequence, inputFormatChoiceInput.value);
3390
3553
  });
3391
- const asoDf = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromObjects([
3554
+ const asoGapmersGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromObjects([
3392
3555
  { 'Name': '2\'MOE-5Me-rU', 'BioSpring': '5', 'Janssen GCRS': 'moeT' },
3393
3556
  { 'Name': '2\'MOE-rA', 'BioSpring': '6', 'Janssen GCRS': 'moeA' },
3394
3557
  { 'Name': '2\'MOE-5Me-rC', 'BioSpring': '7', 'Janssen GCRS': 'moe5mC' },
@@ -3403,11 +3566,7 @@ function mainView() {
3403
3566
  { 'Name': 'rC', 'BioSpring': '', 'Janssen GCRS': 'rC' },
3404
3567
  { 'Name': 'rG', 'BioSpring': '', 'Janssen GCRS': 'rG' },
3405
3568
  { 'Name': 'rU', 'BioSpring': '', 'Janssen GCRS': 'rU' },
3406
- ]);
3407
- const asoGapmersGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(asoDf, { showRowHeader: false, showCellTooltip: false });
3408
- asoDf.onCurrentCellChanged.subscribe((_) => {
3409
- navigator.clipboard.writeText(asoDf.currentCell.value).then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info('Copied'));
3410
- });
3569
+ ]), { showRowHeader: false, showCellTooltip: false, allowEdit: false });
3411
3570
  const omeAndFluoroGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromObjects([
3412
3571
  { 'Name': '2\'-fluoro-U', 'BioSpring': '1', 'Axolabs': 'Uf', 'Janssen GCRS': 'fU' },
3413
3572
  { 'Name': '2\'-fluoro-A', 'BioSpring': '2', 'Axolabs': 'Af', 'Janssen GCRS': 'fA' },
@@ -3418,10 +3577,10 @@ function mainView() {
3418
3577
  { 'Name': '2\'OMe-rC', 'BioSpring': '7', 'Axolabs': 'c', 'Janssen GCRS': 'mC' },
3419
3578
  { 'Name': '2\'OMe-rG', 'BioSpring': '8', 'Axolabs': 'g', 'Janssen GCRS': 'mG' },
3420
3579
  { 'Name': 'ps linkage', 'BioSpring': '*', 'Axolabs': 's', 'Janssen GCRS': 'ps' },
3421
- ]), { showRowHeader: false, showCellTooltip: false });
3580
+ ]), { showRowHeader: false, showCellTooltip: false, allowEdit: false });
3422
3581
  const overhangModificationsGrid = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Viewer.grid(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.DataFrame.fromColumns([
3423
3582
  datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.fromStrings('Name', Object.keys(_structures_works_map__WEBPACK_IMPORTED_MODULE_4__.MODIFICATIONS)),
3424
- ]), { showRowHeader: false, showCellTooltip: false });
3583
+ ]), { showRowHeader: false, showCellTooltip: false, allowEdit: false });
3425
3584
  updateTableAndMolecule(defaultInput, inputFormatChoiceInput.value);
3426
3585
  const codesTablesDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.splitV([
3427
3586
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.box(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.h2('ASO Gapmers'), { style: { maxHeight: '40px' } }),
@@ -3443,23 +3602,24 @@ function mainView() {
3443
3602
  const switchInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.switchInput('Codes', false, (v) => (v) ?
3444
3603
  cash_dom__WEBPACK_IMPORTED_MODULE_6___default()(codesTablesDiv).show() :
3445
3604
  cash_dom__WEBPACK_IMPORTED_MODULE_6___default()(codesTablesDiv).hide());
3605
+ const downloadMolFileIcon = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('download', () => {
3606
+ const clearSequence = inputSequenceField.value.replace(/\s/g, '');
3607
+ const result = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_5__.sequenceToMolV3000)(clearSequence, false, false, inputFormatChoiceInput.value);
3608
+ (0,_helpers__WEBPACK_IMPORTED_MODULE_7__.download)(clearSequence + '.mol', encodeURIComponent(result));
3609
+ }, 'Save .mol file');
3610
+ const copySmilesIcon = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('copy', () => {
3611
+ navigator.clipboard.writeText((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_5__.sequenceToSmiles)(inputSequenceField.value.replace(/\s/g, ''), false, inputFormatChoiceInput.value)).then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(sequenceWasCopied));
3612
+ }, 'Copy SMILES');
3446
3613
  const topPanel = [
3447
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('download', () => {
3448
- const result = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_5__.sequenceToMolV3000)(inputSequenceField.value.replace(/\s/g, ''), false, false, inputFormatChoiceInput.value);
3449
- const element = document.createElement('a');
3450
- element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
3451
- element.setAttribute('download', inputSequenceField.value.replace(/\s/g, '') + '.mol');
3452
- element.click();
3453
- }, 'Save .mol file'),
3454
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.iconFA('copy', () => {
3455
- navigator.clipboard.writeText((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_5__.sequenceToSmiles)(inputSequenceField.value.replace(/\s/g, ''), false, inputFormatChoiceInput.value))
3456
- .then(() => datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(sequenceWasCopied));
3457
- }, 'Copy SMILES'),
3614
+ downloadMolFileIcon,
3615
+ copySmilesIcon,
3458
3616
  switchInput.root,
3459
3617
  ];
3460
3618
  const v = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.v;
3461
3619
  const tabControl = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.sidebar;
3462
- tabControl.onTabChanged.subscribe((_) => v.setRibbonPanels([(tabControl.currentPane.name == 'MAIN') ? topPanel : []]));
3620
+ tabControl.onTabChanged.subscribe((_) => {
3621
+ v.setRibbonPanels([(tabControl.currentPane.name == 'MAIN') ? topPanel : []]);
3622
+ });
3463
3623
  v.setRibbonPanels([topPanel]);
3464
3624
  return datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.box(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.splitH([
3465
3625
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.splitV([
@@ -3484,41 +3644,6 @@ function mainView() {
3484
3644
  }
3485
3645
 
3486
3646
 
3487
- /***/ }),
3488
-
3489
- /***/ "./src/salts.ts":
3490
- /*!**********************!*\
3491
- !*** ./src/salts.ts ***!
3492
- \**********************/
3493
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3494
-
3495
- "use strict";
3496
- __webpack_require__.r(__webpack_exports__);
3497
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3498
- /* harmony export */ "SALTS_CSV": () => (/* binding */ SALTS_CSV)
3499
- /* harmony export */ });
3500
- const SALTS_CSV = `DISPLAY,MOLWEIGHT
3501
- no Data Added,100`;
3502
-
3503
-
3504
- /***/ }),
3505
-
3506
- /***/ "./src/sources.ts":
3507
- /*!************************!*\
3508
- !*** ./src/sources.ts ***!
3509
- \************************/
3510
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3511
-
3512
- "use strict";
3513
- __webpack_require__.r(__webpack_exports__);
3514
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3515
- /* harmony export */ "SOURCES": () => (/* binding */ SOURCES)
3516
- /* harmony export */ });
3517
- const SOURCES = `DISPLAY
3518
- NO DATA
3519
- `;
3520
-
3521
-
3522
3647
  /***/ }),
3523
3648
 
3524
3649
  /***/ "./src/structures-works/converters.ts":
@@ -3872,12 +3997,14 @@ __webpack_require__.r(__webpack_exports__);
3872
3997
  /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
3873
3998
  /* harmony import */ var _sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
3874
3999
  /* harmony import */ var _mol_transformations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mol-transformations */ "./src/structures-works/mol-transformations.ts");
4000
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
4001
+
3875
4002
 
3876
4003
 
3877
4004
 
3878
4005
  function sequenceToMolV3000(sequence, inverted = false, oclRender = false, format) {
3879
4006
  const obj = getObjectWithCodesAndSmiles(sequence, format);
3880
- let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
4007
+ let codes = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.sortByStringLengthInDescendingOrder)(Object.keys(obj));
3881
4008
  let i = 0;
3882
4009
  const smilesCodes = [];
3883
4010
  const codesList = [];
@@ -3912,7 +4039,7 @@ function sequenceToMolV3000(sequence, inverted = false, oclRender = false, forma
3912
4039
  }
3913
4040
  function sequenceToSmiles(sequence, inverted = false, format) {
3914
4041
  const obj = getObjectWithCodesAndSmiles(sequence, format);
3915
- let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
4042
+ let codes = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.sortByStringLengthInDescendingOrder)(Object.keys(obj));
3916
4043
  let i = 0;
3917
4044
  let smiles = '';
3918
4045
  const codesList = [];
@@ -3974,9 +4101,6 @@ function getObjectWithCodesAndSmiles(sequence, format) {
3974
4101
  obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
3975
4102
  return obj;
3976
4103
  }
3977
- function sortByStringLengthInDescendingOrder(array) {
3978
- return array.sort(function (a, b) { return b.length - a.length; });
3979
- }
3980
4104
 
3981
4105
 
3982
4106
  /***/ }),
@@ -3993,16 +4117,18 @@ __webpack_require__.r(__webpack_exports__);
3993
4117
  /* harmony export */ "delimiter": () => (/* binding */ delimiter),
3994
4118
  /* harmony export */ "SYNTHESIZERS": () => (/* binding */ SYNTHESIZERS),
3995
4119
  /* harmony export */ "TECHNOLOGIES": () => (/* binding */ TECHNOLOGIES),
3996
- /* harmony export */ "COL_NAMES": () => (/* binding */ COL_NAMES),
3997
4120
  /* harmony export */ "MODIFICATIONS": () => (/* binding */ MODIFICATIONS),
3998
4121
  /* harmony export */ "stadardPhosphateLinkSmiles": () => (/* binding */ stadardPhosphateLinkSmiles),
3999
4122
  /* harmony export */ "map": () => (/* binding */ map),
4000
4123
  /* harmony export */ "lcmsToGcrs": () => (/* binding */ lcmsToGcrs),
4001
- /* harmony export */ "gcrsCodesWithoutSmiles": () => (/* binding */ gcrsCodesWithoutSmiles)
4124
+ /* harmony export */ "gcrsCodesWithoutSmiles": () => (/* binding */ gcrsCodesWithoutSmiles),
4125
+ /* harmony export */ "weightsObj": () => (/* binding */ weightsObj)
4002
4126
  /* harmony export */ });
4003
4127
  /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
4004
4128
  /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
4005
4129
  /* harmony import */ var _sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
4130
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
4131
+
4006
4132
 
4007
4133
 
4008
4134
  const delimiter = ';';
@@ -4020,29 +4146,6 @@ const TECHNOLOGIES = {
4020
4146
  ASO_GAPMERS: 'For ASO Gapmers',
4021
4147
  SI_RNA: 'For 2\'-OMe and 2\'-F modified siRNA',
4022
4148
  };
4023
- const COL_NAMES = {
4024
- CHEMISTRY: 'Chemistry',
4025
- NUMBER: 'Number',
4026
- TYPE: 'Type',
4027
- CHEMISTRY_NAME: 'Chemistry Name',
4028
- INTERNAL_COMPOUND_ID: 'Internal compound ID',
4029
- IDP: 'IDP',
4030
- SEQUENCE: 'Sequence',
4031
- COMPOUND_NAME: 'Compound Name',
4032
- COMPOUND_COMMENTS: 'Compound Comments',
4033
- SALT: 'Salt',
4034
- EQUIVALENTS: 'Equivalents',
4035
- PURITY: 'Purity',
4036
- CPD_MW: 'Cpd MW',
4037
- SALT_MOL_WEIGHT: 'Salt MW',
4038
- SALT_MASS: 'Salt mass',
4039
- BATCH_MW: 'Batch MW',
4040
- SOURCE: 'Source',
4041
- ICD: 'ICD',
4042
- OWNER: 'Owner',
4043
- };
4044
- // interface CODES {
4045
- // }
4046
4149
  const MODIFICATIONS = {
4047
4150
  '(invabasic)': {
4048
4151
  molecularWeight: 118.13,
@@ -4724,14 +4827,20 @@ fU, fU
4724
4827
  /J-AcCS/, J-AcCS
4725
4828
  /J-CbCS/, J-CbCS
4726
4829
  /J-MtCD/, J-MtCD`;
4727
- function differenceOfTwoArrays(a, b) {
4728
- return a.filter((x) => !b.includes(x));
4729
- }
4730
4830
  const codesWithSmiles = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.getAllCodesOfSynthesizer)(SYNTHESIZERS.GCRS);
4731
4831
  const allGcrsCodes = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromCsv(lcmsToGcrs).getCol('GCRS').toList();
4732
- const gcrsCodesWithoutSmiles = differenceOfTwoArrays(allGcrsCodes, codesWithSmiles);
4832
+ const gcrsCodesWithoutSmiles = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.differenceOfTwoArrays)(allGcrsCodes, codesWithSmiles);
4733
4833
  for (const e of gcrsCodesWithoutSmiles)
4734
- map[SYNTHESIZERS.GCRS]['Others'][e] = { 'SMILES': '' };
4834
+ map[SYNTHESIZERS.GCRS]['Others'][e] = { name: '', weight: 0, normalized: '', SMILES: '' };
4835
+ const weightsObj = {};
4836
+ for (const synthesizer of Object.keys(map)) {
4837
+ for (const technology of Object.keys(map[synthesizer])) {
4838
+ for (const code of Object.keys(map[synthesizer][technology]))
4839
+ weightsObj[code] = map[synthesizer][technology][code].weight;
4840
+ }
4841
+ }
4842
+ for (const [key, value] of Object.entries(MODIFICATIONS))
4843
+ weightsObj[key] = value.molecularWeight;
4735
4844
 
4736
4845
 
4737
4846
  /***/ }),
@@ -4746,6 +4855,7 @@ for (const e of gcrsCodesWithoutSmiles)
4746
4855
  __webpack_require__.r(__webpack_exports__);
4747
4856
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4748
4857
  /* harmony export */ "getNucleotidesMol": () => (/* binding */ getNucleotidesMol),
4858
+ /* harmony export */ "linkStrandsV3000": () => (/* binding */ linkStrandsV3000),
4749
4859
  /* harmony export */ "linkV3000": () => (/* binding */ linkV3000)
4750
4860
  /* harmony export */ });
4751
4861
  const PHOSHATE = `
@@ -5307,9 +5417,9 @@ function getNucleotidesMol(smilesCodes) {
5307
5417
  smilesCodes[i] == 'C(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)NC(=O)CCCC(=O)NCC(O)CO' ? molBlocks.push(GALNACPRIME) :
5308
5418
  molBlocks.push(rotateNucleotidesV3000(smilesCodes[i]));
5309
5419
  }
5310
- return linkV3000(molBlocks, false);
5420
+ return linkV3000(molBlocks);
5311
5421
  }
5312
- function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5422
+ function linkStrandsV3000(strands, useChirality = true) {
5313
5423
  let macroMolBlock = '\nDatagrok macromolecule handler\n\n';
5314
5424
  macroMolBlock += ' 0 0 0 0 0 0 999 V3000\n';
5315
5425
  macroMolBlock += 'M V30 BEGIN CTAB\n';
@@ -5320,16 +5430,27 @@ function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5320
5430
  let natom = 0;
5321
5431
  let nbond = 0;
5322
5432
  let xShift = 0;
5323
- if (twoChains && molBlocks.length > 1)
5324
- molBlocks[1] = invertNucleotidesV3000(molBlocks[1]);
5433
+ // if (twoChains && molBlocks.length > 1)
5434
+ // molBlocks[1] = invertNucleotidesV3000(molBlocks[1]);
5435
+ if (strands.antiStrands.length > 0) {
5436
+ for (let i = 0; i < strands.antiStrands.length; i++) {
5437
+ strands.antiStrands[i] = invertNucleotidesV3000(strands.antiStrands[i]);
5438
+ }
5439
+ }
5440
+ let inverted = false;
5441
+ let molBlocks = strands.senseStrands.concat(strands.antiStrands);
5325
5442
  for (let i = 0; i < molBlocks.length; i++) {
5443
+ if (i >= strands.senseStrands.length && inverted == false) {
5444
+ inverted = true;
5445
+ xShift = 0;
5446
+ }
5326
5447
  molBlocks[i] = molBlocks[i].replaceAll('(-\nM V30 ', '(')
5327
5448
  .replaceAll('-\nM V30 ', '').replaceAll(' )', ')');
5328
5449
  const numbers = extractAtomsBondsNumbersV3000(molBlocks[i]);
5329
5450
  const coordinates = extractAtomDataV3000(molBlocks[i]);
5330
- if (twoChains) {
5331
- const xShiftRight = Math.min(...coordinates.x);
5332
- const yShift = i == 0 ? Math.min(...coordinates.y) - 1 : Math.max(...coordinates.y) + 1;
5451
+ if (inverted) {
5452
+ const xShiftRight = Math.min(...coordinates.x) - xShift;
5453
+ const yShift = !inverted ? Math.min(...coordinates.y) - 1 : Math.max(...coordinates.y) + 10;
5333
5454
  for (let j = 0; j < coordinates.x.length; j++)
5334
5455
  coordinates.x[j] -= xShiftRight;
5335
5456
  for (let j = 0; j < coordinates.y.length; j++)
@@ -5340,7 +5461,131 @@ function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5340
5461
  let index = indexAtoms;
5341
5462
  let indexEnd = indexAtoms;
5342
5463
  for (let j = 0; j < numbers.natom; j++) {
5343
- if (coordinates.atomIndex[j] != 1 || i == 0 || twoChains) {
5464
+ // if (coordinates.atomIndex[j] != 1 || i == 0 || twoChains) {
5465
+ //rewrite atom number
5466
+ index = molBlocks[i].indexOf('V30', index) + 4;
5467
+ indexEnd = molBlocks[i].indexOf(' ', index);
5468
+ const atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
5469
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
5470
+ //rewrite coordinates
5471
+ index = molBlocks[i].indexOf(' ', index) + 1;
5472
+ index = molBlocks[i].indexOf(' ', index) + 1;
5473
+ indexEnd = molBlocks[i].indexOf(' ', index);
5474
+ const totalShift = true ? 0 : 0;
5475
+ let coordinate = true ?
5476
+ Math.round(10000 * coordinates.x[j]) / 10000 :
5477
+ 0;
5478
+ molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
5479
+ index = molBlocks[i].indexOf(' ', index) + 1;
5480
+ indexEnd = molBlocks[i].indexOf(' ', index);
5481
+ coordinate = true ?
5482
+ Math.round(10000 * coordinates.y[j]) / 10000 :
5483
+ 0;
5484
+ molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
5485
+ index = molBlocks[i].indexOf('\n', index) + 1;
5486
+ }
5487
+ const indexAtomsEnd = molBlocks[i].indexOf('M V30 END ATOM');
5488
+ atomBlock += molBlocks[i].substring(indexAtoms + 1, indexAtomsEnd);
5489
+ let indexBonds = molBlocks[i].indexOf('M V30 BEGIN BOND'); // V3000 index for bonds
5490
+ indexBonds = molBlocks[i].indexOf('\n', indexBonds);
5491
+ index = indexBonds;
5492
+ indexEnd = indexBonds;
5493
+ for (let j = 0; j < numbers.nbond; j++) {
5494
+ //rewrite bond number
5495
+ index = molBlocks[i].indexOf('V30', index) + 4;
5496
+ indexEnd = molBlocks[i].indexOf(' ', index);
5497
+ const bondNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + nbond;
5498
+ molBlocks[i] = molBlocks[i].slice(0, index) + bondNumber + molBlocks[i].slice(indexEnd);
5499
+ //rewrite atom pair in bond
5500
+ index = molBlocks[i].indexOf(' ', index) + 1;
5501
+ index = molBlocks[i].indexOf(' ', index) + 1;
5502
+ indexEnd = molBlocks[i].indexOf(' ', index);
5503
+ let atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
5504
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
5505
+ index = molBlocks[i].indexOf(' ', index) + 1;
5506
+ indexEnd = Math.min(molBlocks[i].indexOf('\n', index), molBlocks[i].indexOf(' ', index));
5507
+ atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
5508
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
5509
+ index = molBlocks[i].indexOf('\n', index) + 1;
5510
+ }
5511
+ const indexBondEnd = molBlocks[i].indexOf('M V30 END BOND');
5512
+ bondBlock += molBlocks[i].substring(indexBonds + 1, indexBondEnd);
5513
+ let indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=('); // V3000 index for collections
5514
+ while (indexCollection != -1) {
5515
+ indexCollection += 28;
5516
+ const collectionEnd = molBlocks[i].indexOf(')', indexCollection);
5517
+ const collectionEntries = molBlocks[i].substring(indexCollection, collectionEnd).split(' ').slice(1);
5518
+ collectionEntries.forEach((e) => {
5519
+ collection.push(parseInt(e) + natom);
5520
+ });
5521
+ indexCollection = collectionEnd;
5522
+ indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);
5523
+ }
5524
+ natom += true ? numbers.natom : 0;
5525
+ nbond += numbers.nbond;
5526
+ xShift += Math.max(...coordinates.x) + 1; //twoChains ? 0 : coordinates.x[numbers.natom - 1] - coordinates.x[0];
5527
+ }
5528
+ const entries = 4;
5529
+ const collNumber = Math.ceil(collection.length / entries);
5530
+ //if (oclRender) {
5531
+ // collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length;
5532
+ // for (let j = 0; j < collection.length; j++)
5533
+ // collectionBlock += ' ' + collection[j];
5534
+ // collectionBlock += ')\n';
5535
+ //} else {
5536
+ collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length + ' -\n';
5537
+ for (let i = 0; i < collNumber; i++) {
5538
+ collectionBlock += 'M V30 ';
5539
+ const entriesCurrent = i + 1 == collNumber ? collection.length - (collNumber - 1) * entries : entries;
5540
+ for (let j = 0; j < entriesCurrent; j++) {
5541
+ collectionBlock += (j + 1 == entriesCurrent) ?
5542
+ (i == collNumber - 1 ? collection[entries * i + j] + ')\n' : collection[entries * i + j] + ' -\n') :
5543
+ collection[entries * i + j] + ' ';
5544
+ }
5545
+ }
5546
+ //}
5547
+ //generate file
5548
+ true ? natom : 0;
5549
+ macroMolBlock += 'M V30 COUNTS ' + natom + ' ' + nbond + ' 0 0 0\n';
5550
+ macroMolBlock += 'M V30 BEGIN ATOM\n';
5551
+ macroMolBlock += atomBlock;
5552
+ macroMolBlock += 'M V30 END ATOM\n';
5553
+ macroMolBlock += 'M V30 BEGIN BOND\n';
5554
+ macroMolBlock += bondBlock;
5555
+ macroMolBlock += 'M V30 END BOND\n';
5556
+ if (useChirality) {
5557
+ macroMolBlock += 'M V30 BEGIN COLLECTION\n';
5558
+ macroMolBlock += collectionBlock;
5559
+ macroMolBlock += 'M V30 END COLLECTION\n';
5560
+ }
5561
+ else
5562
+ macroMolBlock = macroMolBlock.replace(/ CFG=\d/g, ' ');
5563
+ macroMolBlock += 'M V30 END CTAB\n';
5564
+ macroMolBlock += 'M END';
5565
+ return macroMolBlock;
5566
+ }
5567
+ function linkV3000(molBlocks, useChirality = true) {
5568
+ let macroMolBlock = '\nDatagrok macromolecule handler\n\n';
5569
+ macroMolBlock += ' 0 0 0 0 0 0 999 V3000\n';
5570
+ macroMolBlock += 'M V30 BEGIN CTAB\n';
5571
+ let atomBlock = '';
5572
+ let bondBlock = '';
5573
+ let collectionBlock = '';
5574
+ const collection = [];
5575
+ let natom = 0;
5576
+ let nbond = 0;
5577
+ let xShift = 0;
5578
+ for (let i = 0; i < molBlocks.length; i++) {
5579
+ molBlocks[i] = molBlocks[i].replaceAll('(-\nM V30 ', '(')
5580
+ .replaceAll('-\nM V30 ', '').replaceAll(' )', ')');
5581
+ const numbers = extractAtomsBondsNumbersV3000(molBlocks[i]);
5582
+ const coordinates = extractAtomDataV3000(molBlocks[i]);
5583
+ let indexAtoms = molBlocks[i].indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
5584
+ indexAtoms = molBlocks[i].indexOf('\n', indexAtoms);
5585
+ let index = indexAtoms;
5586
+ let indexEnd = indexAtoms;
5587
+ for (let j = 0; j < numbers.natom; j++) {
5588
+ if (coordinates.atomIndex[j] != 1 || i == 0) {
5344
5589
  //rewrite atom number
5345
5590
  index = molBlocks[i].indexOf('V30', index) + 4;
5346
5591
  indexEnd = molBlocks[i].indexOf(' ', index);
@@ -5350,15 +5595,12 @@ function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5350
5595
  index = molBlocks[i].indexOf(' ', index) + 1;
5351
5596
  index = molBlocks[i].indexOf(' ', index) + 1;
5352
5597
  indexEnd = molBlocks[i].indexOf(' ', index);
5353
- const totalShift = twoChains ? 0 : xShift - coordinates.x[0];
5354
- let coordinate = twoChains ?
5355
- Math.round(10000 * coordinates.x[j]) / 10000 :
5356
- Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + totalShift)) / 10000;
5598
+ const totalShift = xShift - coordinates.x[0];
5599
+ let coordinate = Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + totalShift)) / 10000;
5357
5600
  molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
5358
5601
  index = molBlocks[i].indexOf(' ', index) + 1;
5359
5602
  indexEnd = molBlocks[i].indexOf(' ', index);
5360
- coordinate = twoChains ?
5361
- Math.round(10000 * coordinates.y[j]) / 10000 :
5603
+ coordinate =
5362
5604
  Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)))) / 10000;
5363
5605
  molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
5364
5606
  index = molBlocks[i].indexOf('\n', index) + 1;
@@ -5406,9 +5648,9 @@ function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5406
5648
  indexCollection = collectionEnd;
5407
5649
  indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);
5408
5650
  }
5409
- natom += twoChains ? numbers.natom : numbers.natom - 1;
5651
+ natom += numbers.natom - 1;
5410
5652
  nbond += numbers.nbond;
5411
- xShift += twoChains ? 0 : coordinates.x[numbers.natom - 1] - coordinates.x[0];
5653
+ xShift += coordinates.x[numbers.natom - 1] - coordinates.x[0];
5412
5654
  }
5413
5655
  const entries = 4;
5414
5656
  const collNumber = Math.ceil(collection.length / entries);
@@ -5430,7 +5672,7 @@ function linkV3000(molBlocks, twoChains = false, useChirality = true) {
5430
5672
  }
5431
5673
  //}
5432
5674
  //generate file
5433
- twoChains ? natom : natom++;
5675
+ natom++;
5434
5676
  macroMolBlock += 'M V30 COUNTS ' + natom + ' ' + nbond + ' 0 0 0\n';
5435
5677
  macroMolBlock += 'M V30 BEGIN ATOM\n';
5436
5678
  macroMolBlock += atomBlock;
@@ -5619,48 +5861,62 @@ __webpack_require__.r(__webpack_exports__);
5619
5861
  /* harmony export */ });
5620
5862
  /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
5621
5863
  /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
5622
- /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
5623
- /* harmony import */ var _structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../structures-works/mol-transformations */ "./src/structures-works/mol-transformations.ts");
5624
- /* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
5864
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
5865
+ /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
5866
+ /* harmony import */ var _structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../structures-works/mol-transformations */ "./src/structures-works/mol-transformations.ts");
5867
+ /* harmony import */ var _structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../structures-works/sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
5868
+
5625
5869
 
5626
5870
 
5627
5871
 
5628
5872
 
5629
- function saveSdf(as, ss, oneEntity, useChirality, invertSS, invertAS) {
5630
- const formatAs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__.getFormat)(as);
5631
- const formatSs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_3__.getFormat)(ss);
5632
- const molSS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToMolV3000)(ss, invertSS, false, formatSs);
5633
- const molAS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToMolV3000)(as, invertAS, false, formatAs);
5873
+ function saveSdf(as, ss, oneEntity, useChirality, invertSS, invertAS, as2 = null, invertAS2) {
5874
+ const formatAs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_4__.getFormat)(as);
5875
+ const formatSs = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_4__.getFormat)(ss);
5876
+ let formatAs2 = null;
5877
+ let molAS2 = null;
5878
+ const molSS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_2__.sequenceToMolV3000)(ss, invertSS, false, formatSs);
5879
+ const molAS = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_2__.sequenceToMolV3000)(as, invertAS, false, formatAs);
5880
+ if (as2 != null && as2 != '') {
5881
+ formatAs2 = (0,_structures_works_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_4__.getFormat)(as2);
5882
+ molAS2 = (0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_2__.sequenceToMolV3000)(as2, invertAS2, false, formatAs2);
5883
+ }
5634
5884
  let result;
5635
- if (oneEntity)
5636
- result = (0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_2__.linkV3000)([molSS, molAS], true, useChirality) + '\n$$$$\n';
5885
+ if (oneEntity) {
5886
+ const antiStrands = molAS2 == null ? [molAS] : [molAS, molAS2];
5887
+ result = (0,_structures_works_mol_transformations__WEBPACK_IMPORTED_MODULE_3__.linkStrandsV3000)({ senseStrands: [molSS], antiStrands: antiStrands }, useChirality) + '\n$$$$\n';
5888
+ }
5637
5889
  else {
5638
5890
  result =
5639
5891
  molSS + '\n' +
5640
5892
  `> <Sequence>\nSense Strand\n$$$$\n` +
5641
5893
  molAS + '\n' +
5642
5894
  `> <Sequence>\nAnti Sense\n$$$$\n`;
5895
+ if (molAS2)
5896
+ result += molAS2 + '\n' +
5897
+ `> <Sequence>\nAnti Sense 2\n$$$$\n`;
5643
5898
  }
5644
- const element = document.createElement('a');
5645
- element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));
5646
- element.setAttribute('download', ss.replace(/\s/g, '') + '.sdf');
5647
- element.click();
5899
+ (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.download)(ss.replace(/\s/g, '') + '.sdf', encodeURIComponent(result));
5648
5900
  }
5649
5901
  function saveSenseAntiSense() {
5650
5902
  const moleculeSvgDiv = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.block([]);
5651
5903
  const ssInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.textInput('Sense Strand', '');
5652
5904
  const asInput = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.textInput('Anti Sense', '');
5905
+ const asInput2 = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.textInput('Anti Sense 2', '');
5653
5906
  const straight = "5 prime -> 3 prime";
5654
5907
  const inverse = "3 prime -> 5 prime";
5655
5908
  let ssInverse = false;
5656
5909
  let asInverse = false;
5910
+ let as2Inverse = false;
5657
5911
  const changeSense = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.choiceInput('SS direction', straight, [straight, inverse]);
5658
5912
  changeSense.onChanged(() => { ssInverse = changeSense.value == inverse; });
5659
5913
  const changeAntiSense = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.choiceInput('AS direction', straight, [straight, inverse]);
5660
5914
  changeAntiSense.onChanged(() => { asInverse = changeAntiSense.value == inverse; });
5915
+ const changeAntiSense2 = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.choiceInput('AS 2 direction', straight, [straight, inverse]);
5916
+ changeAntiSense2.onChanged(() => { asInverse = changeAntiSense.value == inverse; });
5661
5917
  const saveOption = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.switchInput('Save as one entity', true);
5662
5918
  const chirality = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.switchInput('Use chiral', true);
5663
- const saveBtn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.button('Save SDF', () => saveSdf(asInput.value, ssInput.value, saveOption.value, chirality.value, ssInverse, asInverse));
5919
+ const saveBtn = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.button('Save SDF', () => saveSdf(asInput.value, ssInput.value, saveOption.value, chirality.value, ssInverse, asInverse, asInput2.value, as2Inverse));
5664
5920
  const saveSection = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.panel([
5665
5921
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([
5666
5922
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([
@@ -5668,9 +5924,11 @@ function saveSenseAntiSense() {
5668
5924
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divV([
5669
5925
  ssInput,
5670
5926
  asInput,
5927
+ asInput2,
5671
5928
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([changeSense], { style: { width: '40' } }),
5672
5929
  changeSense,
5673
5930
  changeAntiSense,
5931
+ changeAntiSense2,
5674
5932
  saveOption,
5675
5933
  chirality,
5676
5934
  datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.buttonsInput([saveBtn]),
@@ -5701,7 +5959,9 @@ __webpack_require__.r(__webpack_exports__);
5701
5959
  /* harmony export */ "convertSequence": () => (/* binding */ convertSequence)
5702
5960
  /* harmony export */ });
5703
5961
  /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
5704
- /* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
5962
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/helpers.ts");
5963
+ /* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
5964
+
5705
5965
 
5706
5966
 
5707
5967
  const noTranslationTableAvailable = 'No translation table available';
@@ -5762,9 +6022,6 @@ function getFormat(sequence) {
5762
6022
  });
5763
6023
  return possibleSynthesizers[0];
5764
6024
  }
5765
- function sortByStringLengthInDescendingOrder(array) {
5766
- return array.sort(function (a, b) { return b.length - a.length; });
5767
- }
5768
6025
  function isValidSequence(sequence, format) {
5769
6026
  const possibleSynthesizers = format == null ?
5770
6027
  getListOfPossibleSynthesizersByFirstMatchedCode(sequence) :
@@ -5787,7 +6044,7 @@ function isValidSequence(sequence, format) {
5787
6044
  const firstUniqueCharacters = ['r', 'd'];
5788
6045
  const nucleotides = ['A', 'U', 'T', 'C', 'G'];
5789
6046
  possibleSynthesizers.forEach(function (synthesizer, i) {
5790
- const codes = sortByStringLengthInDescendingOrder(getAllCodesOfSynthesizer(synthesizer));
6047
+ const codes = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.sortByStringLengthInDescendingOrder)(getAllCodesOfSynthesizer(synthesizer));
5791
6048
  while (outputIndices[i] < sequence.length) {
5792
6049
  const matchedCode = codes.find((c) => c == sequence.slice(outputIndices[i], outputIndices[i] + c.length));
5793
6050
  if (matchedCode == null)
@@ -5869,7 +6126,7 @@ function getAllCodesOfSynthesizer(synthesizer) {
5869
6126
  function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
5870
6127
  let synthesizers = [];
5871
6128
  Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map).forEach((synthesizer) => {
5872
- let codes = sortByStringLengthInDescendingOrder(getAllCodesOfSynthesizer(synthesizer));
6129
+ let codes = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.sortByStringLengthInDescendingOrder)(getAllCodesOfSynthesizer(synthesizer));
5873
6130
  if (synthesizer == 'Janssen GCRS Codes')
5874
6131
  codes = codes.concat(_map__WEBPACK_IMPORTED_MODULE_0__.gcrsCodesWithoutSmiles);
5875
6132
  //TODO: get first non-dropdown code when there are two modifications
@@ -5908,28 +6165,28 @@ function convertSequence(sequence, output) {
5908
6165
  return {
5909
6166
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES,
5910
6167
  Nucleotides: sequence,
5911
- BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToBioSpring)(sequence),
5912
- GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToGcrs)(sequence),
6168
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.asoGapmersNucleotidesToBioSpring)(sequence),
6169
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.asoGapmersNucleotidesToGcrs)(sequence),
5913
6170
  };
5914
6171
  }
5915
6172
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING)) {
5916
6173
  // && output.technology!.includes(TECHNOLOGIES.ASO_GAPMERS)) {
5917
6174
  return {
5918
6175
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
5919
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToNucleotides)(sequence),
6176
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.asoGapmersBioSpringToNucleotides)(sequence),
5920
6177
  BioSpring: sequence,
5921
- GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToGcrs)(sequence),
6178
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.asoGapmersBioSpringToGcrs)(sequence),
5922
6179
  };
5923
6180
  }
5924
6181
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) { // && output.technology!.includes(TECHNOLOGIES.ASO_GAPMERS)) {
5925
6182
  return {
5926
6183
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
5927
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToNucleotides)(sequence),
5928
- BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToBioSpring)(sequence),
5929
- Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToAxolabs)(sequence),
5930
- Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
6184
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToNucleotides)(sequence),
6185
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaGcrsToBioSpring)(sequence),
6186
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaGcrsToAxolabs)(sequence),
6187
+ Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToMermade12)(sequence),
5931
6188
  GCRS: sequence,
5932
- LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
6189
+ LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToLcms)(sequence),
5933
6190
  };
5934
6191
  }
5935
6192
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES)) {
@@ -5937,47 +6194,47 @@ function convertSequence(sequence, output) {
5937
6194
  return {
5938
6195
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA,
5939
6196
  Nucleotides: sequence,
5940
- BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToBioSpringSenseStrand)(sequence),
5941
- Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToAxolabsSenseStrand)(sequence),
5942
- GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotidesToGcrs)(sequence),
6197
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaNucleotideToBioSpringSenseStrand)(sequence),
6198
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaNucleotideToAxolabsSenseStrand)(sequence),
6199
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaNucleotidesToGcrs)(sequence),
5943
6200
  };
5944
6201
  }
5945
6202
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING)) { // && output.technology!.includes(TECHNOLOGIES.SI_RNA)) {
5946
6203
  return {
5947
6204
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
5948
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToNucleotides)(sequence),
6205
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaBioSpringToNucleotides)(sequence),
5949
6206
  BioSpring: sequence,
5950
- Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToAxolabs)(sequence),
5951
- GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToGcrs)(sequence),
6207
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaBioSpringToAxolabs)(sequence),
6208
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaBioSpringToGcrs)(sequence),
5952
6209
  };
5953
6210
  }
5954
6211
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS)) {
5955
6212
  return {
5956
6213
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
5957
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToNucleotides)(sequence),
5958
- BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToBioSpring)(sequence),
6214
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaAxolabsToNucleotides)(sequence),
6215
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaAxolabsToBioSpring)(sequence),
5959
6216
  Axolabs: sequence,
5960
- GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToGcrs)(sequence),
6217
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaAxolabsToGcrs)(sequence),
5961
6218
  };
5962
6219
  }
5963
6220
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) { // && output.technology!.includes(TECHNOLOGIES.SI_RNA)) {
5964
6221
  return {
5965
6222
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
5966
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToNucleotides)(sequence),
5967
- BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToBioSpring)(sequence),
5968
- Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToAxolabs)(sequence),
5969
- MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
6223
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaGcrsToNucleotides)(sequence),
6224
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaGcrsToBioSpring)(sequence),
6225
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.siRnaGcrsToAxolabs)(sequence),
6226
+ MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToMermade12)(sequence),
5970
6227
  GCRS: sequence,
5971
- LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
6228
+ LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToLcms)(sequence),
5972
6229
  };
5973
6230
  }
5974
6231
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) {
5975
6232
  return {
5976
6233
  type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS,
5977
- Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToNucleotides)(sequence),
6234
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToNucleotides)(sequence),
5978
6235
  GCRS: sequence,
5979
- Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
5980
- LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToLcms)(sequence),
6236
+ Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToMermade12)(sequence),
6237
+ LCMS: (0,_converters__WEBPACK_IMPORTED_MODULE_2__.gcrsToLcms)(sequence),
5981
6238
  };
5982
6239
  }
5983
6240
  if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12)) {
@@ -5995,24 +6252,6 @@ function convertSequence(sequence, output) {
5995
6252
  }
5996
6253
 
5997
6254
 
5998
- /***/ }),
5999
-
6000
- /***/ "./src/users.ts":
6001
- /*!**********************!*\
6002
- !*** ./src/users.ts ***!
6003
- \**********************/
6004
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6005
-
6006
- "use strict";
6007
- __webpack_require__.r(__webpack_exports__);
6008
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6009
- /* harmony export */ "USERS_CSV": () => (/* binding */ USERS_CSV)
6010
- /* harmony export */ });
6011
- const USERS_CSV = `DISPLAY
6012
- NO DATA
6013
- `;
6014
-
6015
-
6016
6255
  /***/ }),
6017
6256
 
6018
6257
  /***/ "datagrok-api/dg":
@@ -6153,14 +6392,13 @@ function sequenceTranslator() {
6153
6392
  windows.showProperties = false;
6154
6393
  windows.showToolbox = false;
6155
6394
  windows.showHelp = false;
6156
- const v = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.newView('Sequence Translator', [
6157
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tabControl({
6158
- 'MAIN': (0,_main_main_view__WEBPACK_IMPORTED_MODULE_6__.mainView)(),
6159
- 'AXOLABS': (0,_axolabs_define_pattern__WEBPACK_IMPORTED_MODULE_4__.defineAxolabsPattern)(),
6160
- 'SDF': (0,_structures_works_save_sense_antisense__WEBPACK_IMPORTED_MODULE_5__.saveSenseAntiSense)(),
6161
- }),
6162
- ]);
6395
+ const v = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.newView('Sequence Translator', []);
6163
6396
  v.box = true;
6397
+ v.append(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tabControl({
6398
+ 'MAIN': (0,_main_main_view__WEBPACK_IMPORTED_MODULE_6__.mainView)(),
6399
+ 'AXOLABS': (0,_axolabs_define_pattern__WEBPACK_IMPORTED_MODULE_4__.defineAxolabsPattern)(),
6400
+ 'SDF': (0,_structures_works_save_sense_antisense__WEBPACK_IMPORTED_MODULE_5__.saveSenseAntiSense)(),
6401
+ }));
6164
6402
  }
6165
6403
  //tags: autostart
6166
6404
  (0,_autostart_registration__WEBPACK_IMPORTED_MODULE_3__.autostartOligoSdFileSubscription)();
@@ -6170,4 +6408,4 @@ function sequenceTranslator() {
6170
6408
  sequencetranslator = __webpack_exports__;
6171
6409
  /******/ })()
6172
6410
  ;
6173
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7O0FBRUEsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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Ozs7Ozs7Ozs7Ozs7QUN4R3NDO0FBQzRCO0FBQzNELG9CQUFvQjtBQUNwQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxvQkFBb0I7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtFQUF3QjtBQUNoRCxxQkFBcUIsOERBQW9CO0FBQ2xDO0FBQ1A7QUFDQSw0Q0FBNEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHRCNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwwQkFBMEI7QUFDdEQ7QUFDQSw0QkFBNEIsMEJBQTBCO0FBQ3REO0FBQ0E7QUFDQSxvRUFBb0U7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QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBZ0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvY2FzaC1kb20vZGlzdC9jYXNoLmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9zYXZlLXN2Zy1hcy1wbmcvbGliL3NhdmVTdmdBc1BuZy5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSUNEcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvSURQcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvYXV0b3N0YXJ0L3JlZ2lzdHJhdGlvbi50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvYXhvbGFicy9jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F4b2xhYnMvZGVmaW5lLXBhdHRlcm4udHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F4b2xhYnMvZHJhdy1zdmcudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL21haW4vbWFpbi12aWV3LnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zYWx0cy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc291cmNlcy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9jb252ZXJ0ZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbWFwLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2F2ZS1zZW5zZS1hbnRpc2Vuc2UudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3VzZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJER1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJncm9rXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcInVpXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9wYWNrYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIE1JVCBodHRwczovL2dpdGh1Yi5jb20vZmFiaW9zcGFtcGluYXRvL2Nhc2ggKi9cbihmdW5jdGlvbigpe1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBwcm9wTWFwID0ge1xuICAvKiBHRU5FUkFMICovXG4gIFwiY2xhc3NcIjogJ2NsYXNzTmFtZScsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG5cbiAgLyogTEFCRUwgKi9cbiAgXCJmb3JcIjogJ2h0bWxGb3InLFxuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcblxuICAvKiBUQUJMRSAqL1xuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcblxuICAvKiBJTUFHRSAqL1xuICB1c2VtYXA6ICd1c2VNYXAnXG59O1xuXG5mdW5jdGlvbiBhdHRlbXB0KGZuLCBhcmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYXJnKTtcbiAgfSBjYXRjaCAoX2EpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59XG5cbnZhciBkb2MgPSBkb2N1bWVudCxcbiAgICB3aW4gPSB3aW5kb3csXG4gICAgZG9jRWxlID0gZG9jLmRvY3VtZW50RWxlbWVudCxcbiAgICBjcmVhdGVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQuYmluZChkb2MpLFxuICAgIGRpdiA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIHRhYmxlID0gY3JlYXRlRWxlbWVudCgndGFibGUnKSxcbiAgICB0Ym9keSA9IGNyZWF0ZUVsZW1lbnQoJ3Rib2R5JyksXG4gICAgdHIgPSBjcmVhdGVFbGVtZW50KCd0cicpLFxuICAgIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxuICAgIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlLFxuICAgIGNvbmNhdCA9IEFycmF5UHJvdG90eXBlLmNvbmNhdCxcbiAgICBmaWx0ZXIgPSBBcnJheVByb3RvdHlwZS5maWx0ZXIsXG4gICAgaW5kZXhPZiA9IEFycmF5UHJvdG90eXBlLmluZGV4T2YsXG4gICAgbWFwID0gQXJyYXlQcm90b3R5cGUubWFwLFxuICAgIHB1c2ggPSBBcnJheVByb3RvdHlwZS5wdXNoLFxuICAgIHNsaWNlID0gQXJyYXlQcm90b3R5cGUuc2xpY2UsXG4gICAgc29tZSA9IEFycmF5UHJvdG90eXBlLnNvbWUsXG4gICAgc3BsaWNlID0gQXJyYXlQcm90b3R5cGUuc3BsaWNlO1xudmFyIGlkUmUgPSAvXiMoPzpbXFx3LV18XFxcXC58W15cXHgwMC1cXHhhMF0pKiQvLFxuICAgIGNsYXNzUmUgPSAvXlxcLig/OltcXHctXXxcXFxcLnxbXlxceDAwLVxceGEwXSkqJC8sXG4gICAgaHRtbFJlID0gLzwuKz4vLFxuICAgIHRhZ1JlID0gL15cXHcrJC87IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cbmZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgdmFyIGlzRnJhZ21lbnQgPSBpc0RvY3VtZW50RnJhZ21lbnQoY29udGV4dCk7XG4gIHJldHVybiAhc2VsZWN0b3IgfHwgIWlzRnJhZ21lbnQgJiYgIWlzRG9jdW1lbnQoY29udGV4dCkgJiYgIWlzRWxlbWVudChjb250ZXh0KSA/IFtdIDogIWlzRnJhZ21lbnQgJiYgY2xhc3NSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShzZWxlY3Rvci5zbGljZSgxKSkgOiAhaXNGcmFnbWVudCAmJiB0YWdSZS50ZXN0KHNlbGVjdG9yKSA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpIDogY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbn0gLy8gQHJlcXVpcmUgLi9maW5kLnRzXG4vLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbnZhciBDYXNoID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FzaChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgICBpZiAoaXNDYXNoKHNlbGVjdG9yKSkgcmV0dXJuIHNlbGVjdG9yO1xuICAgIHZhciBlbGVzID0gc2VsZWN0b3I7XG5cbiAgICBpZiAoaXNTdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgICB2YXIgY3R4ID0gKGlzQ2FzaChjb250ZXh0KSA/IGNvbnRleHRbMF0gOiBjb250ZXh0KSB8fCBkb2M7XG4gICAgICBlbGVzID0gaWRSZS50ZXN0KHNlbGVjdG9yKSAmJiAnZ2V0RWxlbWVudEJ5SWQnIGluIGN0eCA/IGN0eC5nZXRFbGVtZW50QnlJZChzZWxlY3Rvci5zbGljZSgxKSkgOiBodG1sUmUudGVzdChzZWxlY3RvcikgPyBwYXJzZUhUTUwoc2VsZWN0b3IpIDogZmluZChzZWxlY3RvciwgY3R4KTtcbiAgICAgIGlmICghZWxlcykgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KHNlbGVjdG9yKTsgLy9GSVhNRTogYGZuLnJlYWR5YCBpcyBub3QgaW5jbHVkZWQgaW4gYGNvcmVgLCBidXQgaXQncyBhY3R1YWxseSBhIGNvcmUgZnVuY3Rpb25hbGl0eVxuICAgIH1cblxuICAgIGlmIChlbGVzLm5vZGVUeXBlIHx8IGVsZXMgPT09IHdpbikgZWxlcyA9IFtlbGVzXTtcbiAgICB0aGlzLmxlbmd0aCA9IGVsZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGVsZXNbaV07XG4gICAgfVxuICB9XG5cbiAgQ2FzaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgQ2FzaChzZWxlY3RvciwgY29udGV4dCk7XG4gIH07XG5cbiAgcmV0dXJuIENhc2g7XG59KCk7XG5cbnZhciBmbiA9IENhc2gucHJvdG90eXBlLFxuICAgIGNhc2ggPSBmbi5pbml0O1xuY2FzaC5mbiA9IGNhc2gucHJvdG90eXBlID0gZm47IC8vIEVuc3VyaW5nIHRoYXQgYGNhc2ggKCkgaW5zdGFuY2VvZiBjYXNoYFxuXG5mbi5sZW5ndGggPSAwO1xuZm4uc3BsaWNlID0gc3BsaWNlOyAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBnZXRzIHByaW50ZWQgYXMgYXJyYXktbGlrZSBpbiBDaHJvbWUncyBkZXZ0b29sc1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBFbnN1cmluZyBhIGNhc2ggY29sbGVjdGlvbiBpcyBpdGVyYWJsZVxuICBmbltTeW1ib2xbJ2l0ZXJhdG9yJ11dID0gQXJyYXlQcm90b3R5cGVbU3ltYm9sWydpdGVyYXRvciddXTtcbn1cblxuZm4ubWFwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBjYXNoKGNvbmNhdC5hcHBseShbXSwgbWFwLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjYWxsYmFjay5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSkpKTtcbn07XG5cbmZuLnNsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGNhc2goc2xpY2UuY2FsbCh0aGlzLCBzdGFydCwgZW5kKSk7XG59OyAvLyBAcmVxdWlyZSAuL2Nhc2gudHNcblxuXG52YXIgZGFzaEFscGhhUmUgPSAvLShbYS16XSkvZztcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoZGFzaEFscGhhUmUsIGZ1bmN0aW9uIChtYXRjaCwgbGV0dGVyKSB7XG4gICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxuY2FzaC5ndWlkID0gMTsgLy8gQHJlcXVpcmUgLi9jYXNoLnRzXG5cbmZ1bmN0aW9uIG1hdGNoZXMoZWxlLCBzZWxlY3Rvcikge1xuICB2YXIgbWF0Y2hlcyA9IGVsZSAmJiAoZWxlWydtYXRjaGVzJ10gfHwgZWxlWyd3ZWJraXRNYXRjaGVzU2VsZWN0b3InXSB8fCBlbGVbJ21zTWF0Y2hlc1NlbGVjdG9yJ10pO1xuICByZXR1cm4gISFtYXRjaGVzICYmICEhc2VsZWN0b3IgJiYgbWF0Y2hlcy5jYWxsKGVsZSwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBpc0Nhc2goeCkge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIENhc2g7XG59XG5cbmZ1bmN0aW9uIGlzV2luZG93KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4ID09PSB4LndpbmRvdztcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudCh4KSB7XG4gIHJldHVybiAhIXggJiYgeC5ub2RlVHlwZSA9PT0gOTtcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudEZyYWdtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSAxMTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSAxO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh4KSB7XG4gIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbCh4KSB7XG4gIHJldHVybiB4ID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bWVyaWMoeCkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQoeCkpICYmIGlzRmluaXRlKHgpO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHgpIHtcbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB4ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih4KTtcbiAgcmV0dXJuIHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5jYXNoLmlzV2luZG93ID0gaXNXaW5kb3c7XG5jYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuY2FzaC5pc0FycmF5ID0gaXNBcnJheTtcbmNhc2guaXNOdW1lcmljID0gaXNOdW1lcmljO1xuY2FzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcblxuZm4uZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIGlmIChpc1VuZGVmaW5lZChpbmRleCkpIHJldHVybiBzbGljZS5jYWxsKHRoaXMpO1xuICBpbmRleCA9IE51bWJlcihpbmRleCk7XG4gIHJldHVybiB0aGlzW2luZGV4IDwgMCA/IGluZGV4ICsgdGhpcy5sZW5ndGggOiBpbmRleF07XG59O1xuXG5mbi5lcSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICByZXR1cm4gY2FzaCh0aGlzLmdldChpbmRleCkpO1xufTtcblxuZm4uZmlyc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVxKDApO1xufTtcblxuZm4ubGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZXEoLTEpO1xufTtcblxuZnVuY3Rpb24gZWFjaChhcnIsIGNhbGxiYWNrLCBfcmV2ZXJzZSkge1xuICBpZiAoX3JldmVyc2UpIHtcbiAgICB2YXIgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJbaV0sIGksIGFycltpXSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFycikpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltrZXldLCBrZXksIGFycltrZXldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2ldLCBpLCBhcnJbaV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5jYXNoLmVhY2ggPSBlYWNoO1xuXG5mbi5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBlYWNoKHRoaXMsIGNhbGxiYWNrKTtcbn07XG5cbmZuLnByb3AgPSBmdW5jdGlvbiAocHJvcCwgdmFsdWUpIHtcbiAgaWYgKCFwcm9wKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKHByb3ApKSB7XG4gICAgcHJvcCA9IHByb3BNYXBbcHJvcF0gfHwgcHJvcDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIHRoaXNbMF1bcHJvcF07XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBlbGVbcHJvcF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5wcm9wKGtleSwgcHJvcFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlUHJvcCA9IGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGRlbGV0ZSBlbGVbcHJvcE1hcFtwcm9wXSB8fCBwcm9wXTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBzb3VyY2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICB2YXIgZGVlcCA9IGlzQm9vbGVhbihzb3VyY2VzWzBdKSA/IHNvdXJjZXMuc2hpZnQoKSA6IGZhbHNlLFxuICAgICAgdGFyZ2V0ID0gc291cmNlcy5zaGlmdCgpLFxuICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIGlmICghdGFyZ2V0KSByZXR1cm4ge307XG4gIGlmICghbGVuZ3RoKSByZXR1cm4gZXh0ZW5kKGRlZXAsIGNhc2gsIHRhcmdldCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKGRlZXAgJiYgKGlzQXJyYXkoc291cmNlW2tleV0pIHx8IGlzUGxhaW5PYmplY3Qoc291cmNlW2tleV0pKSkge1xuICAgICAgICBpZiAoIXRhcmdldFtrZXldIHx8IHRhcmdldFtrZXldLmNvbnN0cnVjdG9yICE9PSBzb3VyY2Vba2V5XS5jb25zdHJ1Y3RvcikgdGFyZ2V0W2tleV0gPSBuZXcgc291cmNlW2tleV0uY29uc3RydWN0b3IoKTtcbiAgICAgICAgZXh0ZW5kKGRlZXAsIHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmNhc2guZXh0ZW5kID0gZXh0ZW5kO1xuXG5mbi5leHRlbmQgPSBmdW5jdGlvbiAocGx1Z2lucykge1xuICByZXR1cm4gZXh0ZW5kKGZuLCBwbHVnaW5zKTtcbn07IC8vIEByZXF1aXJlIC4vbWF0Y2hlcy50c1xuLy8gQHJlcXVpcmUgLi90eXBlX2NoZWNraW5nLnRzXG5cblxuZnVuY3Rpb24gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKGNvbXBhcmF0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBtYXRjaGVzKGVsZSwgY29tcGFyYXRvcik7XG4gIH0gOiBpc0Z1bmN0aW9uKGNvbXBhcmF0b3IpID8gY29tcGFyYXRvciA6IGlzQ2FzaChjb21wYXJhdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gY29tcGFyYXRvci5pcyhlbGUpO1xuICB9IDogIWNvbXBhcmF0b3IgPyBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IDogZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUgPT09IGNvbXBhcmF0b3I7XG4gIH07XG59XG5cbmZuLmZpbHRlciA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gY2FzaChmaWx0ZXIuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUuY2FsbChlbGUsIGksIGVsZSk7XG4gIH0pKTtcbn07IC8vIEByZXF1aXJlIGNvbGxlY3Rpb24vZmlsdGVyLnRzXG5cblxuZnVuY3Rpb24gZmlsdGVyZWQoY29sbGVjdGlvbiwgY29tcGFyYXRvcikge1xuICByZXR1cm4gIWNvbXBhcmF0b3IgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi5maWx0ZXIoY29tcGFyYXRvcik7XG59IC8vIEByZXF1aXJlIC4vdHlwZV9jaGVja2luZy50c1xuXG5cbnZhciBzcGxpdFZhbHVlc1JlID0gL1xcUysvZztcblxuZnVuY3Rpb24gZ2V0U3BsaXRWYWx1ZXMoc3RyKSB7XG4gIHJldHVybiBpc1N0cmluZyhzdHIpID8gc3RyLm1hdGNoKHNwbGl0VmFsdWVzUmUpIHx8IFtdIDogW107XG59XG5cbmZuLmhhc0NsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICByZXR1cm4gISFjbHMgJiYgc29tZS5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGVsZSkgJiYgZWxlLmNsYXNzTGlzdC5jb250YWlucyhjbHMpO1xuICB9KTtcbn07XG5cbmZuLnJlbW92ZUF0dHIgPSBmdW5jdGlvbiAoYXR0cikge1xuICB2YXIgYXR0cnMgPSBnZXRTcGxpdFZhbHVlcyhhdHRyKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVhY2goYXR0cnMsIGZ1bmN0aW9uIChpLCBhKSB7XG4gICAgICBlbGUucmVtb3ZlQXR0cmlidXRlKGEpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGF0dHIoYXR0ciwgdmFsdWUpIHtcbiAgaWYgKCFhdHRyKSByZXR1cm47XG5cbiAgaWYgKGlzU3RyaW5nKGF0dHIpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAoIXRoaXNbMF0gfHwgIWlzRWxlbWVudCh0aGlzWzBdKSkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlXzEgPSB0aGlzWzBdLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIHJldHVybiBpc051bGwodmFsdWVfMSkgPyB1bmRlZmluZWQgOiB2YWx1ZV8xO1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiB0aGlzO1xuICAgIGlmIChpc051bGwodmFsdWUpKSByZXR1cm4gdGhpcy5yZW1vdmVBdHRyKGF0dHIpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgZWxlLnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gYXR0cikge1xuICAgIHRoaXMuYXR0cihrZXksIGF0dHJba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZm4uYXR0ciA9IGF0dHI7XG5cbmZuLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gKGNscywgZm9yY2UpIHtcbiAgdmFyIGNsYXNzZXMgPSBnZXRTcGxpdFZhbHVlcyhjbHMpLFxuICAgICAgaXNGb3JjZSA9ICFpc1VuZGVmaW5lZChmb3JjZSk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlYWNoKGNsYXNzZXMsIGZ1bmN0aW9uIChpLCBjKSB7XG4gICAgICBpZiAoaXNGb3JjZSkge1xuICAgICAgICBmb3JjZSA/IGVsZS5jbGFzc0xpc3QuYWRkKGMpIDogZWxlLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuY2xhc3NMaXN0LnRvZ2dsZShjKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5mbi5hZGRDbGFzcyA9IGZ1bmN0aW9uIChjbHMpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCB0cnVlKTtcbn07XG5cbmZuLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xzLCBmYWxzZSk7XG4gIHJldHVybiB0aGlzLmF0dHIoJ2NsYXNzJywgJycpO1xufTtcblxuZnVuY3Rpb24gcGx1Y2soYXJyLCBwcm9wLCBkZWVwLCB1bnRpbCkge1xuICB2YXIgcGx1Y2tlZCA9IFtdLFxuICAgICAgaXNDYWxsYmFjayA9IGlzRnVuY3Rpb24ocHJvcCksXG4gICAgICBjb21wYXJlID0gdW50aWwgJiYgZ2V0Q29tcGFyZUZ1bmN0aW9uKHVudGlsKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaXNDYWxsYmFjaykge1xuICAgICAgdmFyIHZhbF8xID0gcHJvcChhcnJbaV0pO1xuICAgICAgaWYgKHZhbF8xLmxlbmd0aCkgcHVzaC5hcHBseShwbHVja2VkLCB2YWxfMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWxfMiA9IGFycltpXVtwcm9wXTtcblxuICAgICAgd2hpbGUgKHZhbF8yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHVudGlsICYmIGNvbXBhcmUoLTEsIHZhbF8yKSkgYnJlYWs7XG4gICAgICAgIHBsdWNrZWQucHVzaCh2YWxfMik7XG4gICAgICAgIHZhbF8yID0gZGVlcCA/IHZhbF8yW3Byb3BdIDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGx1Y2tlZDtcbn1cblxuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICByZXR1cm4gYXJyLmxlbmd0aCA+IDEgPyBmaWx0ZXIuY2FsbChhcnIsIGZ1bmN0aW9uIChpdGVtLCBpbmRleCwgc2VsZikge1xuICAgIHJldHVybiBpbmRleE9mLmNhbGwoc2VsZiwgaXRlbSkgPT09IGluZGV4O1xuICB9KSA6IGFycjtcbn1cblxuY2FzaC51bmlxdWUgPSB1bmlxdWU7XG5cbmZuLmFkZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gY2FzaCh1bmlxdWUodGhpcy5nZXQoKS5jb25jYXQoY2FzaChzZWxlY3RvciwgY29udGV4dCkuZ2V0KCkpKSk7XG59OyAvLyBAcmVxdWlyZSBjb3JlL3R5cGVfY2hlY2tpbmcudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlKGVsZSwgcHJvcCwgaXNWYXJpYWJsZSkge1xuICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gIHZhciBzdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZSwgbnVsbCk7XG4gIHJldHVybiBpc1ZhcmlhYmxlID8gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB8fCB1bmRlZmluZWQgOiBzdHlsZVtwcm9wXSB8fCBlbGUuc3R5bGVbcHJvcF07XG59IC8vIEByZXF1aXJlIC4vY29tcHV0ZV9zdHlsZS50c1xuXG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZUludChlbGUsIHByb3ApIHtcbiAgcmV0dXJuIHBhcnNlSW50KGNvbXB1dGVTdHlsZShlbGUsIHByb3ApLCAxMCkgfHwgMDtcbn1cblxudmFyIGNzc1ZhcmlhYmxlUmUgPSAvXi0tLzsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gaXNDU1NWYXJpYWJsZShwcm9wKSB7XG4gIHJldHVybiBjc3NWYXJpYWJsZVJlLnRlc3QocHJvcCk7XG59IC8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuLy8gQHJlcXVpcmUgY29yZS9jYXNoLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2VhY2gudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG5cbnZhciBwcmVmaXhlZFByb3BzID0ge30sXG4gICAgc3R5bGUgPSBkaXYuc3R5bGUsXG4gICAgdmVuZG9yc1ByZWZpeGVzID0gWyd3ZWJraXQnLCAnbW96JywgJ21zJ107XG5cbmZ1bmN0aW9uIGdldFByZWZpeGVkUHJvcChwcm9wLCBpc1ZhcmlhYmxlKSB7XG4gIGlmIChpc1ZhcmlhYmxlID09PSB2b2lkIDApIHtcbiAgICBpc1ZhcmlhYmxlID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgfVxuXG4gIGlmIChpc1ZhcmlhYmxlKSByZXR1cm4gcHJvcDtcblxuICBpZiAoIXByZWZpeGVkUHJvcHNbcHJvcF0pIHtcbiAgICB2YXIgcHJvcENDID0gY2FtZWxDYXNlKHByb3ApLFxuICAgICAgICBwcm9wVUMgPSBcIlwiICsgcHJvcENDWzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wQ0Muc2xpY2UoMSksXG4gICAgICAgIHByb3BzID0gKHByb3BDQyArIFwiIFwiICsgdmVuZG9yc1ByZWZpeGVzLmpvaW4ocHJvcFVDICsgXCIgXCIpICsgcHJvcFVDKS5zcGxpdCgnICcpO1xuICAgIGVhY2gocHJvcHMsIGZ1bmN0aW9uIChpLCBwKSB7XG4gICAgICBpZiAocCBpbiBzdHlsZSkge1xuICAgICAgICBwcmVmaXhlZFByb3BzW3Byb3BdID0gcDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHByZWZpeGVkUHJvcHNbcHJvcF07XG59XG5cbjsgLy8gQHJlcXVpcmUgY29yZS90eXBlX2NoZWNraW5nLnRzXG4vLyBAcmVxdWlyZSAuL2lzX2Nzc192YXJpYWJsZS50c1xuXG52YXIgbnVtZXJpY1Byb3BzID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wLCB2YWx1ZSwgaXNWYXJpYWJsZSkge1xuICBpZiAoaXNWYXJpYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgaXNWYXJpYWJsZSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gIH1cblxuICByZXR1cm4gIWlzVmFyaWFibGUgJiYgIW51bWVyaWNQcm9wc1twcm9wXSAmJiBpc051bWVyaWModmFsdWUpID8gdmFsdWUgKyBcInB4XCIgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY3NzKHByb3AsIHZhbHVlKSB7XG4gIGlmIChpc1N0cmluZyhwcm9wKSkge1xuICAgIHZhciBpc1ZhcmlhYmxlXzEgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICAgIHByb3AgPSBnZXRQcmVmaXhlZFByb3AocHJvcCwgaXNWYXJpYWJsZV8xKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGNvbXB1dGVTdHlsZSh0aGlzWzBdLCBwcm9wLCBpc1ZhcmlhYmxlXzEpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIHRoaXM7XG4gICAgdmFsdWUgPSBnZXRTdWZmaXhlZFZhbHVlKHByb3AsIHZhbHVlLCBpc1ZhcmlhYmxlXzEpO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaXNWYXJpYWJsZV8xKSB7XG4gICAgICAgIGVsZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wKSB7XG4gICAgdGhpcy5jc3Moa2V5LCBwcm9wW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbjtcbmZuLmNzcyA9IGNzczsgLy8gQG9wdGlvbmFsIC4vY3NzLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2F0dGVtcHQudHNcbi8vIEByZXF1aXJlIGNvcmUvY2FtZWxfY2FzZS50c1xuXG52YXIgSlNPTlN0cmluZ1JlID0gL15cXHMrfFxccyskLztcblxuZnVuY3Rpb24gZ2V0RGF0YShlbGUsIGtleSkge1xuICB2YXIgdmFsdWUgPSBlbGUuZGF0YXNldFtrZXldIHx8IGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXTtcbiAgaWYgKEpTT05TdHJpbmdSZS50ZXN0KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gYXR0ZW1wdChKU09OLnBhcnNlLCB2YWx1ZSk7XG59IC8vIEByZXF1aXJlIGNvcmUvYXR0ZW1wdC50c1xuLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG5cblxuZnVuY3Rpb24gc2V0RGF0YShlbGUsIGtleSwgdmFsdWUpIHtcbiAgdmFsdWUgPSBhdHRlbXB0KEpTT04uc3RyaW5naWZ5LCB2YWx1ZSk7XG4gIGVsZS5kYXRhc2V0W2NhbWVsQ2FzZShrZXkpXSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBkYXRhKG5hbWUsIHZhbHVlKSB7XG4gIGlmICghbmFtZSkge1xuICAgIGlmICghdGhpc1swXSkgcmV0dXJuO1xuICAgIHZhciBkYXRhcyA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXNbMF0uZGF0YXNldCkge1xuICAgICAgZGF0YXNba2V5XSA9IGdldERhdGEodGhpc1swXSwga2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXM7XG4gIH1cblxuICBpZiAoaXNTdHJpbmcobmFtZSkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzWzBdICYmIGdldERhdGEodGhpc1swXSwgbmFtZSk7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBzZXREYXRhKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICB0aGlzLmRhdGEoa2V5LCBuYW1lW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLmRhdGEgPSBkYXRhOyAvLyBAb3B0aW9uYWwgLi9kYXRhLnRzXG5cbmZ1bmN0aW9uIGdldERvY3VtZW50RGltZW5zaW9uKGRvYywgZGltZW5zaW9uKSB7XG4gIHZhciBkb2NFbGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICByZXR1cm4gTWF0aC5tYXgoZG9jLmJvZHlbXCJzY3JvbGxcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcInNjcm9sbFwiICsgZGltZW5zaW9uXSwgZG9jLmJvZHlbXCJvZmZzZXRcIiArIGRpbWVuc2lvbl0sIGRvY0VsZVtcIm9mZnNldFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wiY2xpZW50XCIgKyBkaW1lbnNpb25dKTtcbn0gLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZV9pbnQudHNcblxuXG5mdW5jdGlvbiBnZXRFeHRyYVNwYWNlKGVsZSwgeEF4aXMpIHtcbiAgcmV0dXJuIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykgKyBcIldpZHRoXCIpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnTGVmdCcgOiAnVG9wJykpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJwYWRkaW5nXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpKSArIGNvbXB1dGVTdHlsZUludChlbGUsIFwiYm9yZGVyXCIgKyAoeEF4aXMgPyAnUmlnaHQnIDogJ0JvdHRvbScpICsgXCJXaWR0aFwiKTtcbn1cblxuZWFjaChbdHJ1ZSwgZmFsc2VdLCBmdW5jdGlvbiAoaSwgb3V0ZXIpIHtcbiAgZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAoaSwgcHJvcCkge1xuICAgIHZhciBuYW1lID0gXCJcIiArIChvdXRlciA/ICdvdXRlcicgOiAnaW5uZXInKSArIHByb3A7XG5cbiAgICBmbltuYW1lXSA9IGZ1bmN0aW9uIChpbmNsdWRlTWFyZ2lucykge1xuICAgICAgaWYgKCF0aGlzWzBdKSByZXR1cm47XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiBvdXRlciA/IHRoaXNbMF1bXCJpbm5lclwiICsgcHJvcF0gOiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF1bXCJcIiArIChvdXRlciA/ICdvZmZzZXQnIDogJ2NsaWVudCcpICsgcHJvcF0gKyAoaW5jbHVkZU1hcmdpbnMgJiYgb3V0ZXIgPyBjb21wdXRlU3R5bGVJbnQodGhpc1swXSwgXCJtYXJnaW5cIiArIChpID8gJ1RvcCcgOiAnTGVmdCcpKSArIGNvbXB1dGVTdHlsZUludCh0aGlzWzBdLCBcIm1hcmdpblwiICsgKGkgPyAnQm90dG9tJyA6ICdSaWdodCcpKSA6IDApO1xuICAgIH07XG4gIH0pO1xufSk7XG5lYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChpbmRleCwgcHJvcCkge1xuICB2YXIgcHJvcExDID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xuXG4gIGZuW3Byb3BMQ10gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXRoaXNbMF0pIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzO1xuXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNXaW5kb3codGhpc1swXSkpIHJldHVybiB0aGlzWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiICsgcHJvcF07XG4gICAgICBpZiAoaXNEb2N1bWVudCh0aGlzWzBdKSkgcmV0dXJuIGdldERvY3VtZW50RGltZW5zaW9uKHRoaXNbMF0sIHByb3ApO1xuICAgICAgcmV0dXJuIHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbcHJvcExDXSAtIGdldEV4dHJhU3BhY2UodGhpc1swXSwgIWluZGV4KTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVOdW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgICAgdmFyIGJveFNpemluZyA9IGNvbXB1dGVTdHlsZShlbGUsICdib3hTaXppbmcnKTtcbiAgICAgIGVsZS5zdHlsZVtwcm9wTENdID0gZ2V0U3VmZml4ZWRWYWx1ZShwcm9wTEMsIHZhbHVlTnVtYmVyICsgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnID8gZ2V0RXh0cmFTcGFjZShlbGUsICFpbmRleCkgOiAwKSk7XG4gICAgfSk7XG4gIH07XG59KTsgLy8gQG9wdGlvbmFsIC4vaW5uZXJfb3V0ZXIudHNcbi8vIEBvcHRpb25hbCAuL25vcm1hbC50c1xuLy8gQHJlcXVpcmUgY3NzL2hlbHBlcnMvY29tcHV0ZV9zdHlsZS50c1xuXG52YXIgZGVmYXVsdERpc3BsYXkgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkodGFnTmFtZSkge1xuICBpZiAoZGVmYXVsdERpc3BsYXlbdGFnTmFtZV0pIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXTtcbiAgdmFyIGVsZSA9IGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gIGRvYy5ib2R5Lmluc2VydEJlZm9yZShlbGUsIG51bGwpO1xuICB2YXIgZGlzcGxheSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gIGRvYy5ib2R5LnJlbW92ZUNoaWxkKGVsZSk7XG4gIHJldHVybiBkZWZhdWx0RGlzcGxheVt0YWdOYW1lXSA9IGRpc3BsYXkgIT09ICdub25lJyA/IGRpc3BsYXkgOiAnYmxvY2snO1xufSAvLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlLnRzXG5cblxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlKSB7XG4gIHJldHVybiBjb21wdXRlU3R5bGUoZWxlLCAnZGlzcGxheScpID09PSAnbm9uZSc7XG59XG5cbnZhciBkaXNwbGF5UHJvcGVydHkgPSAnX19fY2QnO1xuXG5mbi50b2dnbGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIHZhciBzaG93ID0gaXNVbmRlZmluZWQoZm9yY2UpID8gaXNIaWRkZW4oZWxlKSA6IGZvcmNlO1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZWxlW2Rpc3BsYXlQcm9wZXJ0eV0gfHwgJyc7XG5cbiAgICAgIGlmIChpc0hpZGRlbihlbGUpKSB7XG4gICAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gZ2V0RGVmYXVsdERpc3BsYXkoZWxlLnRhZ05hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVbZGlzcGxheVByb3BlcnR5XSA9IGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5Jyk7XG4gICAgICBlbGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xufTtcblxuZm4uaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlKGZhbHNlKTtcbn07XG5cbmZuLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRvZ2dsZSh0cnVlKTtcbn07IC8vIEBvcHRpb25hbCAuL2hpZGUudHNcbi8vIEBvcHRpb25hbCAuL3Nob3cudHNcbi8vIEBvcHRpb25hbCAuL3RvZ2dsZS50c1xuXG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZXMobnMxLCBuczIpIHtcbiAgcmV0dXJuICFuczIgfHwgIXNvbWUuY2FsbChuczIsIGZ1bmN0aW9uIChucykge1xuICAgIHJldHVybiBuczEuaW5kZXhPZihucykgPCAwO1xuICB9KTtcbn1cblxudmFyIGV2ZW50c05hbWVzcGFjZSA9ICdfX19jZScsXG4gICAgZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvciA9ICcuJyxcbiAgICBldmVudHNGb2N1cyA9IHtcbiAgZm9jdXM6ICdmb2N1c2luJyxcbiAgYmx1cjogJ2ZvY3Vzb3V0J1xufSxcbiAgICBldmVudHNIb3ZlciA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn0sXG4gICAgZXZlbnRzTW91c2VSZSA9IC9eKG1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wfGNsaWNrfGRibGNsaWNrKS9pOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lKSB7XG4gIHJldHVybiBldmVudHNIb3ZlcltuYW1lXSB8fCBldmVudHNGb2N1c1tuYW1lXSB8fCBuYW1lO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50c0NhY2hlKGVsZSkge1xuICByZXR1cm4gZWxlW2V2ZW50c05hbWVzcGFjZV0gPSBlbGVbZXZlbnRzTmFtZXNwYWNlXSB8fCB7fTtcbn0gLy8gQHJlcXVpcmUgY29yZS9ndWlkLnRzXG4vLyBAcmVxdWlyZSBldmVudHMvaGVscGVycy9nZXRfZXZlbnRzX2NhY2hlLnRzXG5cblxuZnVuY3Rpb24gYWRkRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIGV2ZW50Q2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuICBldmVudENhY2hlW25hbWVdID0gZXZlbnRDYWNoZVtuYW1lXSB8fCBbXTtcbiAgZXZlbnRDYWNoZVtuYW1lXS5wdXNoKFtuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2tdKTtcbiAgZWxlLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgY2FsbGJhY2spO1xufSAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICB2YXIgcGFydHMgPSBldmVudE5hbWUuc3BsaXQoZXZlbnRzTmFtZXNwYWNlc1NlcGFyYXRvcik7XG4gIHJldHVybiBbcGFydHNbMF0sIHBhcnRzLnNsaWNlKDEpLnNvcnQoKV07IC8vIFtuYW1lLCBuYW1lc3BhY2VbXV1cbn0gLy8gQHJlcXVpcmUgLi9nZXRfZXZlbnRzX2NhY2hlLnRzXG4vLyBAcmVxdWlyZSAuL2hhc19uYW1lc3BhY2VzLnRzXG4vLyBAcmVxdWlyZSAuL3BhcnNlX2V2ZW50X25hbWUudHNcblxuXG5mdW5jdGlvbiByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgY2FjaGUgPSBnZXRFdmVudHNDYWNoZShlbGUpO1xuXG4gIGlmICghbmFtZSkge1xuICAgIGZvciAobmFtZSBpbiBjYWNoZSkge1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjYWNoZVtuYW1lXSkge1xuICAgIGNhY2hlW25hbWVdID0gY2FjaGVbbmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIG5zID0gX2FbMF0sXG4gICAgICAgICAgc2VsID0gX2FbMV0sXG4gICAgICAgICAgY2IgPSBfYVsyXTtcbiAgICAgIGlmIChjYWxsYmFjayAmJiBjYi5ndWlkICE9PSBjYWxsYmFjay5ndWlkIHx8ICFoYXNOYW1lc3BhY2VzKG5zLCBuYW1lc3BhY2VzKSB8fCBzZWxlY3RvciAmJiBzZWxlY3RvciAhPT0gc2VsKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGVsZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGNiKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mbi5vZmYgPSBmdW5jdGlvbiAoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50RnVsbE5hbWUpKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuICAgICAgcmVtb3ZlRXZlbnQoZWxlKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vZmYoa2V5LCBldmVudEZ1bGxOYW1lW2tleV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH1cblxuICAgIGVhY2goZ2V0U3BsaXRWYWx1ZXMoZXZlbnRGdWxsTmFtZSksIGZ1bmN0aW9uIChpLCBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCk7XG5cbiAgICAgIF90aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcbiAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIG9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgX29uZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICghaXNTdHJpbmcoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRGdWxsTmFtZSkge1xuICAgICAgdGhpcy5vbihrZXksIHNlbGVjdG9yLCBkYXRhLCBldmVudEZ1bGxOYW1lW2tleV0sIF9vbmUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoc2VsZWN0b3IpIHx8IGlzTnVsbChzZWxlY3RvcikpIHtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChkYXRhKSkge1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgICAgZGF0YSA9IHNlbGVjdG9yO1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgY2FsbGJhY2sgPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgZWFjaChnZXRTcGxpdFZhbHVlcyhldmVudEZ1bGxOYW1lKSwgZnVuY3Rpb24gKGksIGV2ZW50RnVsbE5hbWUpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudEZ1bGxOYW1lKSxcbiAgICAgICAgbmFtZU9yaWdpbmFsID0gX2FbMF0sXG4gICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgbmFtZSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCksXG4gICAgICAgIGlzRXZlbnRIb3ZlciA9IChuYW1lT3JpZ2luYWwgaW4gZXZlbnRzSG92ZXIpLFxuICAgICAgICBpc0V2ZW50Rm9jdXMgPSAobmFtZU9yaWdpbmFsIGluIGV2ZW50c0ZvY3VzKTtcblxuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuXG4gICAgX3RoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpICYmICFpc0RvY3VtZW50KGVsZSkgJiYgIWlzV2luZG93KGVsZSkpIHJldHVybjtcblxuICAgICAgdmFyIGZpbmFsQ2FsbGJhY2sgPSBmdW5jdGlvbiBmaW5hbENhbGxiYWNrKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRbXCJfX19pXCIgKyBldmVudC50eXBlXSkgcmV0dXJuIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyAvLyBJZ25vcmluZyBuYXRpdmUgZXZlbnQgaW4gZmF2b3Igb2YgdGhlIHVwY29taW5nIGN1c3RvbSBvbmVcblxuICAgICAgICBpZiAoZXZlbnQubmFtZXNwYWNlICYmICFoYXNOYW1lc3BhY2VzKG5hbWVzcGFjZXMsIGV2ZW50Lm5hbWVzcGFjZS5zcGxpdChldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKSkpIHJldHVybjtcbiAgICAgICAgaWYgKCFzZWxlY3RvciAmJiAoaXNFdmVudEZvY3VzICYmIChldmVudC50YXJnZXQgIT09IGVsZSB8fCBldmVudC5fX19vdCA9PT0gbmFtZSkgfHwgaXNFdmVudEhvdmVyICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZWxlLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkgcmV0dXJuO1xuICAgICAgICB2YXIgdGhpc0FyZyA9IGVsZTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgd2hpbGUgKCFtYXRjaGVzKHRhcmdldCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBlbGUpIHJldHVybjtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzQXJnID0gdGFyZ2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnY3VycmVudFRhcmdldCcsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc0FyZztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICdkZWxlZ2F0ZVRhcmdldCcsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2RhdGEnLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBldmVudCwgZXZlbnQuX19fdGQpO1xuXG4gICAgICAgIGlmIChfb25lKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnQoZWxlLCBuYW1lLCBuYW1lc3BhY2VzLCBzZWxlY3RvciwgZmluYWxDYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZmluYWxDYWxsYmFjay5ndWlkID0gY2FsbGJhY2suZ3VpZCA9IGNhbGxiYWNrLmd1aWQgfHwgY2FzaC5ndWlkKys7XG4gICAgICBhZGRFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBmaW5hbENhbGxiYWNrKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5vbiA9IG9uO1xuXG5mdW5jdGlvbiBvbmUoZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50RnVsbE5hbWUsIHNlbGVjdG9yLCBkYXRhLCBjYWxsYmFjaywgdHJ1ZSk7XG59XG5cbjtcbmZuLm9uZSA9IG9uZTtcblxuZm4ucmVhZHkgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoY2FsbGJhY2ssIDAsIGNhc2gpO1xuICB9O1xuXG4gIGlmIChkb2MucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgY2IoKTtcbiAgfSBlbHNlIHtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICBpZiAoaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgdmFyIF9hID0gcGFyc2VFdmVudE5hbWUoZXZlbnQpLFxuICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICBuYW1lXzEgPSBnZXRFdmVudE5hbWVCdWJibGluZyhuYW1lT3JpZ2luYWwpO1xuXG4gICAgaWYgKCFuYW1lXzEpIHJldHVybiB0aGlzO1xuICAgIHZhciB0eXBlID0gZXZlbnRzTW91c2VSZS50ZXN0KG5hbWVfMSkgPyAnTW91c2VFdmVudHMnIDogJ0hUTUxFdmVudHMnO1xuICAgIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KHR5cGUpO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lXzEsIHRydWUsIHRydWUpO1xuICAgIGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbihldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKTtcbiAgICBldmVudC5fX19vdCA9IG5hbWVPcmlnaW5hbDtcbiAgfVxuXG4gIGV2ZW50Ll9fX3RkID0gZGF0YTtcbiAgdmFyIGlzRXZlbnRGb2N1cyA9IChldmVudC5fX19vdCBpbiBldmVudHNGb2N1cyk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChpc0V2ZW50Rm9jdXMgJiYgaXNGdW5jdGlvbihlbGVbZXZlbnQuX19fb3RdKSkge1xuICAgICAgZWxlW1wiX19faVwiICsgZXZlbnQudHlwZV0gPSB0cnVlOyAvLyBFbnN1cmluZyB0aGUgbmF0aXZlIGV2ZW50IGlzIGlnbm9yZWRcblxuICAgICAgZWxlW2V2ZW50Ll9fX290XSgpO1xuXG4gICAgICBlbGVbXCJfX19pXCIgKyBldmVudC50eXBlXSA9IGZhbHNlOyAvLyBFbnN1cmluZyB0aGUgY3VzdG9tIGV2ZW50IGlzIG5vdCBpZ25vcmVkXG4gICAgfVxuXG4gICAgZWxlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9KTtcbn07IC8vIEBvcHRpb25hbCAuL29mZi50c1xuLy8gQG9wdGlvbmFsIC4vb24udHNcbi8vIEBvcHRpb25hbCAuL29uZS50c1xuLy8gQG9wdGlvbmFsIC4vcmVhZHkudHNcbi8vIEBvcHRpb25hbCAuL3RyaWdnZXIudHNcbi8vIEByZXF1aXJlIGNvcmUvcGx1Y2sudHNcbi8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gZ2V0VmFsdWUoZWxlKSB7XG4gIGlmIChlbGUubXVsdGlwbGUgJiYgZWxlLm9wdGlvbnMpIHJldHVybiBwbHVjayhmaWx0ZXIuY2FsbChlbGUub3B0aW9ucywgZnVuY3Rpb24gKG9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24uc2VsZWN0ZWQgJiYgIW9wdGlvbi5kaXNhYmxlZCAmJiAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQ7XG4gIH0pLCAndmFsdWUnKTtcbiAgcmV0dXJuIGVsZS52YWx1ZSB8fCAnJztcbn1cblxudmFyIHF1ZXJ5RW5jb2RlU3BhY2VSZSA9IC8lMjAvZyxcbiAgICBxdWVyeUVuY29kZUNSTEZSZSA9IC9cXHI/XFxuL2c7XG5cbmZ1bmN0aW9uIHF1ZXJ5RW5jb2RlKHByb3AsIHZhbHVlKSB7XG4gIHJldHVybiBcIiZcIiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9wKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlLnJlcGxhY2UocXVlcnlFbmNvZGVDUkxGUmUsICdcXHJcXG4nKSkucmVwbGFjZShxdWVyeUVuY29kZVNwYWNlUmUsICcrJyk7XG59XG5cbnZhciBza2lwcGFibGVSZSA9IC9maWxlfHJlc2V0fHN1Ym1pdHxidXR0b258aW1hZ2UvaSxcbiAgICBjaGVja2FibGVSZSA9IC9yYWRpb3xjaGVja2JveC9pO1xuXG5mbi5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9ICcnO1xuICB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGVhY2goZWxlLmVsZW1lbnRzIHx8IFtlbGVdLCBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoZWxlLmRpc2FibGVkIHx8ICFlbGUubmFtZSB8fCBlbGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyB8fCBza2lwcGFibGVSZS50ZXN0KGVsZS50eXBlKSB8fCBjaGVja2FibGVSZS50ZXN0KGVsZS50eXBlKSAmJiAhZWxlLmNoZWNrZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKGVsZSk7XG5cbiAgICAgIGlmICghaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgICAgZWFjaCh2YWx1ZXMsIGZ1bmN0aW9uIChpLCB2YWx1ZSkge1xuICAgICAgICAgIHF1ZXJ5ICs9IHF1ZXJ5RW5jb2RlKGVsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHF1ZXJ5LnNsaWNlKDEpO1xufTtcblxuZnVuY3Rpb24gdmFsKHZhbHVlKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXNbMF0gJiYgZ2V0VmFsdWUodGhpc1swXSk7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciBpc1NlbGVjdCA9IGVsZS5tdWx0aXBsZSAmJiBlbGUub3B0aW9ucztcblxuICAgIGlmIChpc1NlbGVjdCB8fCBjaGVja2FibGVSZS50ZXN0KGVsZS50eXBlKSkge1xuICAgICAgdmFyIGVsZVZhbHVlXzEgPSBpc0FycmF5KHZhbHVlKSA/IG1hcC5jYWxsKHZhbHVlLCBTdHJpbmcpIDogaXNOdWxsKHZhbHVlKSA/IFtdIDogW1N0cmluZyh2YWx1ZSldO1xuXG4gICAgICBpZiAoaXNTZWxlY3QpIHtcbiAgICAgICAgZWFjaChlbGUub3B0aW9ucywgZnVuY3Rpb24gKGksIG9wdGlvbikge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGVsZVZhbHVlXzEuaW5kZXhPZihvcHRpb24udmFsdWUpID49IDA7XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlLmNoZWNrZWQgPSBlbGVWYWx1ZV8xLmluZGV4T2YoZWxlLnZhbHVlKSA+PSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGUudmFsdWUgPSBpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgaXNOdWxsKHZhbHVlKSA/ICcnIDogdmFsdWU7XG4gICAgfVxuICB9KTtcbn1cblxuZm4udmFsID0gdmFsO1xuXG5mbi5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNsb25lTm9kZSh0cnVlKTtcbiAgfSk7XG59O1xuXG5mbi5kZXRhY2ggPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICBmaWx0ZXJlZCh0aGlzLCBjb21wYXJhdG9yKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoZWxlLnBhcmVudE5vZGUpIHtcbiAgICAgIGVsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgZnJhZ21lbnRSZSA9IC9eXFxzKjwoXFx3KylbXj5dKj4vLFxuICAgIHNpbmdsZVRhZ1JlID0gL148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT4pPyQvO1xudmFyIGNvbnRhaW5lcnMgPSB7XG4gICcqJzogZGl2LFxuICB0cjogdGJvZHksXG4gIHRkOiB0cixcbiAgdGg6IHRyLFxuICB0aGVhZDogdGFibGUsXG4gIHRib2R5OiB0YWJsZSxcbiAgdGZvb3Q6IHRhYmxlXG59OyAvL1RPRE86IENyZWF0ZSBlbGVtZW50cyBpbnNpZGUgYSBkb2N1bWVudCBmcmFnbWVudCwgaW4gb3JkZXIgdG8gcHJldmVudCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBmaXJpbmdcbi8vVE9ETzogRW5zdXJlIHRoZSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdGhlIGZyYWdtZW50IGFzIHRoZWlyIHBhcmVudCBpbnN0ZWFkIG9mIG51bGwsIHRoaXMgYWxzbyBlbnN1cmVzIHdlIGNhbiBkZWFsIHdpdGggZGV0YXRjaGVkIG5vZGVzIG1vcmUgcmVsaWFibHlcblxuZnVuY3Rpb24gcGFyc2VIVE1MKGh0bWwpIHtcbiAgaWYgKCFpc1N0cmluZyhodG1sKSkgcmV0dXJuIFtdO1xuICBpZiAoc2luZ2xlVGFnUmUudGVzdChodG1sKSkgcmV0dXJuIFtjcmVhdGVFbGVtZW50KFJlZ0V4cC4kMSldO1xuICB2YXIgZnJhZ21lbnQgPSBmcmFnbWVudFJlLnRlc3QoaHRtbCkgJiYgUmVnRXhwLiQxLFxuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyc1tmcmFnbWVudF0gfHwgY29udGFpbmVyc1snKiddO1xuICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGNhc2goY29udGFpbmVyLmNoaWxkTm9kZXMpLmRldGFjaCgpLmdldCgpO1xufVxuXG5jYXNoLnBhcnNlSFRNTCA9IHBhcnNlSFRNTDtcblxuZm4uZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHdoaWxlIChlbGUuZmlyc3RDaGlsZCkge1xuICAgICAgZWxlLnJlbW92ZUNoaWxkKGVsZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gaHRtbChodG1sKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5pbm5lckhUTUw7XG4gIGlmIChpc1VuZGVmaW5lZChodG1sKSkgcmV0dXJuIHRoaXM7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgICBlbGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgfSk7XG59XG5cbmZuLmh0bWwgPSBodG1sO1xuXG5mbi5yZW1vdmUgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICBmaWx0ZXJlZCh0aGlzLCBjb21wYXJhdG9yKS5kZXRhY2goKS5vZmYoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiB0ZXh0KHRleHQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHRleHQpKSByZXR1cm4gdGhpc1swXSA/IHRoaXNbMF0udGV4dENvbnRlbnQgOiAnJztcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH0pO1xufVxuXG47XG5mbi50ZXh0ID0gdGV4dDtcblxuZm4udW53cmFwID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChlbGUudGFnTmFtZSA9PT0gJ0JPRFknKSByZXR1cm47XG4gICAgdmFyICRlbGUgPSBjYXNoKGVsZSk7XG4gICAgJGVsZS5yZXBsYWNlV2l0aCgkZWxlLmNoaWxkcmVuKCkpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoIWVsZSkgcmV0dXJuO1xuICB2YXIgcmVjdCA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuICAgIGxlZnQ6IHJlY3QubGVmdCArIHdpbi5wYWdlWE9mZnNldFxuICB9O1xufTtcblxuZm4ub2Zmc2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGUub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBjb21wdXRlU3R5bGUob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2NFbGU7XG4gIH0pO1xufTtcblxuZm4ucG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoIWVsZSkgcmV0dXJuO1xuICB2YXIgaXNGaXhlZCA9IGNvbXB1dGVTdHlsZShlbGUsICdwb3NpdGlvbicpID09PSAnZml4ZWQnLFxuICAgICAgb2Zmc2V0ID0gaXNGaXhlZCA/IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHRoaXMub2Zmc2V0KCk7XG5cbiAgaWYgKCFpc0ZpeGVkKSB7XG4gICAgdmFyIGRvY18xID0gZWxlLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZS5vZmZzZXRQYXJlbnQgfHwgZG9jXzEuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgd2hpbGUgKChvZmZzZXRQYXJlbnQgPT09IGRvY18xLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2NfMS5kb2N1bWVudEVsZW1lbnQpICYmIGNvbXB1dGVTdHlsZShvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldFBhcmVudCAhPT0gZWxlICYmIGlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgcGFyZW50T2Zmc2V0ID0gY2FzaChvZmZzZXRQYXJlbnQpLm9mZnNldCgpO1xuICAgICAgb2Zmc2V0LnRvcCAtPSBwYXJlbnRPZmZzZXQudG9wICsgY29tcHV0ZVN0eWxlSW50KG9mZnNldFBhcmVudCwgJ2JvcmRlclRvcFdpZHRoJyk7XG4gICAgICBvZmZzZXQubGVmdCAtPSBwYXJlbnRPZmZzZXQubGVmdCArIGNvbXB1dGVTdHlsZUludChvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0V2lkdGgnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb2Zmc2V0LnRvcCAtIGNvbXB1dGVTdHlsZUludChlbGUsICdtYXJnaW5Ub3AnKSxcbiAgICBsZWZ0OiBvZmZzZXQubGVmdCAtIGNvbXB1dGVTdHlsZUludChlbGUsICdtYXJnaW5MZWZ0JylcbiAgfTtcbn07XG5cbmZuLmNoaWxkcmVuID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmNoaWxkcmVuO1xuICB9KSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLmNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUudGFnTmFtZSA9PT0gJ0lGUkFNRScgPyBbZWxlLmNvbnRlbnREb2N1bWVudF0gOiBlbGUudGFnTmFtZSA9PT0gJ1RFTVBMQVRFJyA/IGVsZS5jb250ZW50LmNoaWxkTm9kZXMgOiBlbGUuY2hpbGROb2RlcztcbiAgfSkpKTtcbn07XG5cbmZuLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZmluZChzZWxlY3RvciwgZWxlKTtcbiAgfSkpKTtcbn07IC8vIEByZXF1aXJlIGNvcmUvdmFyaWFibGVzLnRzXG4vLyBAcmVxdWlyZSBjb2xsZWN0aW9uL2ZpbHRlci50c1xuLy8gQHJlcXVpcmUgdHJhdmVyc2FsL2ZpbmQudHNcblxuXG52YXIgSFRNTENEQVRBUmUgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2csXG4gICAgc2NyaXB0VHlwZVJlID0gL14kfF5tb2R1bGUkfFxcLyhqYXZhfGVjbWEpc2NyaXB0L2ksXG4gICAgc2NyaXB0QXR0cmlidXRlcyA9IFsndHlwZScsICdzcmMnLCAnbm9uY2UnLCAnbm9Nb2R1bGUnXTtcblxuZnVuY3Rpb24gZXZhbFNjcmlwdHMobm9kZSwgZG9jKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2FzaChub2RlKTtcbiAgY29sbGVjdGlvbi5maWx0ZXIoJ3NjcmlwdCcpLmFkZChjb2xsZWN0aW9uLmZpbmQoJ3NjcmlwdCcpKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoc2NyaXB0VHlwZVJlLnRlc3QoZWxlLnR5cGUpICYmIGRvY0VsZS5jb250YWlucyhlbGUpKSB7XG4gICAgICAvLyBUaGUgc2NyaXB0IHR5cGUgaXMgc3VwcG9ydGVkIC8vIFRoZSBlbGVtZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBET00gLy8gVXNpbmcgYGRvY3VtZW50RWxlbWVudGAgZm9yIGJyb2FkZXIgYnJvd3NlciBzdXBwb3J0XG4gICAgICB2YXIgc2NyaXB0XzEgPSBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdF8xLnRleHQgPSBlbGUudGV4dENvbnRlbnQucmVwbGFjZShIVE1MQ0RBVEFSZSwgJycpO1xuICAgICAgZWFjaChzY3JpcHRBdHRyaWJ1dGVzLCBmdW5jdGlvbiAoaSwgYXR0cikge1xuICAgICAgICBpZiAoZWxlW2F0dHJdKSBzY3JpcHRfMVthdHRyXSA9IGVsZVthdHRyXTtcbiAgICAgIH0pO1xuICAgICAgZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKHNjcmlwdF8xLCBudWxsKTtcbiAgICAgIGRvYy5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdF8xKTtcbiAgICB9XG4gIH0pO1xufSAvLyBAcmVxdWlyZSAuL2V2YWxfc2NyaXB0cy50c1xuXG5cbmZ1bmN0aW9uIGluc2VydEVsZW1lbnQoYW5jaG9yLCB0YXJnZXQsIGxlZnQsIGluc2lkZSwgZXZhbHVhdGUpIHtcbiAgaWYgKGluc2lkZSkge1xuICAgIC8vIHByZXBlbmQvYXBwZW5kXG4gICAgYW5jaG9yLmluc2VydEJlZm9yZSh0YXJnZXQsIGxlZnQgPyBhbmNob3IuZmlyc3RDaGlsZCA6IG51bGwpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJlZm9yZS9hZnRlclxuICAgIGlmIChhbmNob3Iubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgYW5jaG9yLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRhcmdldCwgYW5jaG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5jaG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhcmdldCwgbGVmdCA/IGFuY2hvciA6IGFuY2hvci5uZXh0U2libGluZyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV2YWx1YXRlKSB7XG4gICAgZXZhbFNjcmlwdHModGFyZ2V0LCBhbmNob3Iub3duZXJEb2N1bWVudCk7XG4gIH1cbn0gLy8gQHJlcXVpcmUgLi9pbnNlcnRfZWxlbWVudC50c1xuXG5cbmZ1bmN0aW9uIGluc2VydFNlbGVjdG9ycyhzZWxlY3RvcnMsIGFuY2hvcnMsIGludmVyc2UsIGxlZnQsIGluc2lkZSwgcmV2ZXJzZUxvb3AxLCByZXZlcnNlTG9vcDIsIHJldmVyc2VMb29wMykge1xuICBlYWNoKHNlbGVjdG9ycywgZnVuY3Rpb24gKHNpLCBzZWxlY3Rvcikge1xuICAgIGVhY2goY2FzaChzZWxlY3RvciksIGZ1bmN0aW9uICh0aSwgdGFyZ2V0KSB7XG4gICAgICBlYWNoKGNhc2goYW5jaG9ycyksIGZ1bmN0aW9uIChhaSwgYW5jaG9yKSB7XG4gICAgICAgIHZhciBhbmNob3JGaW5hbCA9IGludmVyc2UgPyB0YXJnZXQgOiBhbmNob3IsXG4gICAgICAgICAgICB0YXJnZXRGaW5hbCA9IGludmVyc2UgPyBhbmNob3IgOiB0YXJnZXQsXG4gICAgICAgICAgICBpbmRleEZpbmFsID0gaW52ZXJzZSA/IHRpIDogYWk7XG4gICAgICAgIGluc2VydEVsZW1lbnQoYW5jaG9yRmluYWwsICFpbmRleEZpbmFsID8gdGFyZ2V0RmluYWwgOiB0YXJnZXRGaW5hbC5jbG9uZU5vZGUodHJ1ZSksIGxlZnQsIGluc2lkZSwgIWluZGV4RmluYWwpO1xuICAgICAgfSwgcmV2ZXJzZUxvb3AzKTtcbiAgICB9LCByZXZlcnNlTG9vcDIpO1xuICB9LCByZXZlcnNlTG9vcDEpO1xuICByZXR1cm4gYW5jaG9ycztcbn1cblxuZm4uYWZ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLmFwcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5hcHBlbmRUbyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uYmVmb3JlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5wcmVwZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xufTtcblxuZm4ucHJlcGVuZFRvID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4ucmVwbGFjZVdpdGggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuYmVmb3JlKHNlbGVjdG9yKS5yZW1vdmUoKTtcbn07XG5cbmZuLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgY2FzaChzZWxlY3RvcikucmVwbGFjZVdpdGgodGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZm4ud3JhcEFsbCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgc3RydWN0dXJlID0gY2FzaChzZWxlY3RvciksXG4gICAgICB3cmFwcGVyID0gc3RydWN0dXJlWzBdO1xuXG4gIHdoaWxlICh3cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHdyYXBwZXIgPSB3cmFwcGVyLmZpcnN0RWxlbWVudENoaWxkO1xuICB9XG5cbiAgdGhpcy5maXJzdCgpLmJlZm9yZShzdHJ1Y3R1cmUpO1xuICByZXR1cm4gdGhpcy5hcHBlbmRUbyh3cmFwcGVyKTtcbn07XG5cbmZuLndyYXAgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIHdyYXBwZXIgPSBjYXNoKHNlbGVjdG9yKVswXTtcbiAgICBjYXNoKGVsZSkud3JhcEFsbCghaSA/IHdyYXBwZXIgOiB3cmFwcGVyLmNsb25lTm9kZSh0cnVlKSk7XG4gIH0pO1xufTtcblxuZm4ud3JhcElubmVyID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHZhciAkZWxlID0gY2FzaChlbGUpLFxuICAgICAgICBjb250ZW50cyA9ICRlbGUuY29udGVudHMoKTtcbiAgICBjb250ZW50cy5sZW5ndGggPyBjb250ZW50cy53cmFwQWxsKHNlbGVjdG9yKSA6ICRlbGUuYXBwZW5kKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG5mbi5oYXMgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIGNvbXBhcmF0b3IgPSBpc1N0cmluZyhzZWxlY3RvcikgPyBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGZpbmQoc2VsZWN0b3IsIGVsZSkubGVuZ3RoO1xuICB9IDogZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUuY29udGFpbnMoc2VsZWN0b3IpO1xuICB9O1xuICByZXR1cm4gdGhpcy5maWx0ZXIoY29tcGFyYXRvcik7XG59O1xuXG5mbi5pcyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gc29tZS5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICByZXR1cm4gY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSk7XG59O1xuXG5mbi5uZXh0ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF9hbGwsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ25leHRFbGVtZW50U2libGluZycsIF9hbGwsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5uZXh0QWxsID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMubmV4dChjb21wYXJhdG9yLCB0cnVlKTtcbn07XG5cbmZuLm5leHRVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5uZXh0KGNvbXBhcmF0b3IsIHRydWUsIHVudGlsKTtcbn07XG5cbmZuLm5vdCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBjb21wYXJlID0gZ2V0Q29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpO1xuICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiAoIWlzU3RyaW5nKGNvbXBhcmF0b3IpIHx8IGlzRWxlbWVudChlbGUpKSAmJiAhY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSk7XG59O1xuXG5mbi5wYXJlbnQgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3BhcmVudE5vZGUnKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLmluZGV4ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBjaGlsZCA9IHNlbGVjdG9yID8gY2FzaChzZWxlY3RvcilbMF0gOiB0aGlzWzBdLFxuICAgICAgY29sbGVjdGlvbiA9IHNlbGVjdG9yID8gdGhpcyA6IGNhc2goY2hpbGQpLnBhcmVudCgpLmNoaWxkcmVuKCk7XG4gIHJldHVybiBpbmRleE9mLmNhbGwoY29sbGVjdGlvbiwgY2hpbGQpO1xufTtcblxuZm4uY2xvc2VzdCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHZhciBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyKGNvbXBhcmF0b3IpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoKSByZXR1cm4gZmlsdGVyZWQ7XG4gIHZhciAkcGFyZW50ID0gdGhpcy5wYXJlbnQoKTtcbiAgaWYgKCEkcGFyZW50Lmxlbmd0aCkgcmV0dXJuIGZpbHRlcmVkO1xuICByZXR1cm4gJHBhcmVudC5jbG9zZXN0KGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucGFyZW50cyA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwYXJlbnRFbGVtZW50JywgdHJ1ZSwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLnBhcmVudHNVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wYXJlbnRzKGNvbXBhcmF0b3IsIHVudGlsKTtcbn07XG5cbmZuLnByZXYgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX2FsbCwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncHJldmlvdXNFbGVtZW50U2libGluZycsIF9hbGwsIF91bnRpbCkpKSwgY29tcGFyYXRvcik7XG59O1xuXG5mbi5wcmV2QWxsID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIHRoaXMucHJldihjb21wYXJhdG9yLCB0cnVlKTtcbn07XG5cbmZuLnByZXZVbnRpbCA9IGZ1bmN0aW9uICh1bnRpbCwgY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wcmV2KGNvbXBhcmF0b3IsIHRydWUsIHVudGlsKTtcbn07XG5cbmZuLnNpYmxpbmdzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gY2FzaChlbGUpLnBhcmVudCgpLmNoaWxkcmVuKCkubm90KGVsZSk7XG4gIH0pKSksIGNvbXBhcmF0b3IpO1xufTsgLy8gQG9wdGlvbmFsIC4vY2hpbGRyZW4udHNcbi8vIEBvcHRpb25hbCAuL2Nsb3Nlc3QudHNcbi8vIEBvcHRpb25hbCAuL2NvbnRlbnRzLnRzXG4vLyBAb3B0aW9uYWwgLi9maW5kLnRzXG4vLyBAb3B0aW9uYWwgLi9oYXMudHNcbi8vIEBvcHRpb25hbCAuL2lzLnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0LnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0X2FsbC50c1xuLy8gQG9wdGlvbmFsIC4vbmV4dF91bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vbm90LnRzXG4vLyBAb3B0aW9uYWwgLi9wYXJlbnQudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudHMudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudHNfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL3ByZXYudHNcbi8vIEBvcHRpb25hbCAuL3ByZXZfYWxsLnRzXG4vLyBAb3B0aW9uYWwgLi9wcmV2X3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9zaWJsaW5ncy50c1xuLy8gQG9wdGlvbmFsIGF0dHJpYnV0ZXMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBjb2xsZWN0aW9uL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgY3NzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZGF0YS9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGRpbWVuc2lvbnMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBlZmZlY3RzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZXZlbnRzL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZm9ybXMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBtYW5pcHVsYXRpb24vaW5kZXgudHNcbi8vIEBvcHRpb25hbCBvZmZzZXQvaW5kZXgudHNcbi8vIEBvcHRpb25hbCB0cmF2ZXJzYWwvaW5kZXgudHNcbi8vIEByZXF1aXJlIGNvcmUvaW5kZXgudHNcbi8vIEBwcmlvcml0eSAtMTAwXG4vLyBAcmVxdWlyZSAuL2Nhc2gudHNcbi8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBOb2RlLmpzXG4gIG1vZHVsZS5leHBvcnRzID0gY2FzaDtcbn0gZWxzZSB7XG4gIC8vIEJyb3dzZXJcbiAgd2luWydjYXNoJ10gPSB3aW5bJyQnXSA9IGNhc2g7XG59XG59KSgpOyIsIid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG91dCQgPSB0eXBlb2YgZXhwb3J0cyAhPSAndW5kZWZpbmVkJyAmJiBleHBvcnRzIHx8IHR5cGVvZiBkZWZpbmUgIT0gJ3VuZGVmaW5lZCcgJiYge30gfHwgdGhpcyB8fCB3aW5kb3c7XG4gIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgZGVmaW5lKCdzYXZlLXN2Zy1hcy1wbmcnLCBbXSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvdXQkO1xuICB9KTtcbiAgb3V0JC5kZWZhdWx0ID0gb3V0JDtcblxuICB2YXIgeG1sTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nO1xuICB2YXIgeGh0bWxOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgdmFyIHN2Z05zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgdmFyIGRvY3R5cGUgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyBcIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGRcIiBbPCFFTlRJVFkgbmJzcCBcIiYjMTYwO1wiPl0+JztcbiAgdmFyIHVybFJlZ2V4ID0gL3VybFxcKFtcIiddPyguKz8pW1wiJ10/XFwpLztcbiAgdmFyIGZvbnRGb3JtYXRzID0ge1xuICAgIHdvZmYyOiAnZm9udC93b2ZmMicsXG4gICAgd29mZjogJ2ZvbnQvd29mZicsXG4gICAgb3RmOiAnYXBwbGljYXRpb24veC1mb250LW9wZW50eXBlJyxcbiAgICB0dGY6ICdhcHBsaWNhdGlvbi94LWZvbnQtdHRmJyxcbiAgICBlb3Q6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gICAgc2ZudDogJ2FwcGxpY2F0aW9uL2ZvbnQtc2ZudCcsXG4gICAgc3ZnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgfTtcblxuICB2YXIgaXNFbGVtZW50ID0gZnVuY3Rpb24gaXNFbGVtZW50KG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBvYmogaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICB9O1xuICB2YXIgcmVxdWlyZURvbU5vZGUgPSBmdW5jdGlvbiByZXF1aXJlRG9tTm9kZShlbCkge1xuICAgIGlmICghaXNFbGVtZW50KGVsKSkgdGhyb3cgbmV3IEVycm9yKCdhbiBIVE1MRWxlbWVudCBvciBTVkdFbGVtZW50IGlzIHJlcXVpcmVkOyBnb3QgJyArIGVsKTtcbiAgfTtcbiAgdmFyIHJlcXVpcmVEb21Ob2RlUHJvbWlzZSA9IGZ1bmN0aW9uIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAoaXNFbGVtZW50KGVsKSkgcmVzb2x2ZShlbCk7ZWxzZSByZWplY3QobmV3IEVycm9yKCdhbiBIVE1MRWxlbWVudCBvciBTVkdFbGVtZW50IGlzIHJlcXVpcmVkOyBnb3QgJyArIGVsKSk7XG4gICAgfSk7XG4gIH07XG4gIHZhciBpc0V4dGVybmFsID0gZnVuY3Rpb24gaXNFeHRlcm5hbCh1cmwpIHtcbiAgICByZXR1cm4gdXJsICYmIHVybC5sYXN0SW5kZXhPZignaHR0cCcsIDApID09PSAwICYmIHVybC5sYXN0SW5kZXhPZih3aW5kb3cubG9jYXRpb24uaG9zdCkgPT09IC0xO1xuICB9O1xuXG4gIHZhciBnZXRGb250TWltZVR5cGVGcm9tVXJsID0gZnVuY3Rpb24gZ2V0Rm9udE1pbWVUeXBlRnJvbVVybChmb250VXJsKSB7XG4gICAgdmFyIGZvcm1hdHMgPSBPYmplY3Qua2V5cyhmb250Rm9ybWF0cykuZmlsdGVyKGZ1bmN0aW9uIChleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmb250VXJsLmluZGV4T2YoJy4nICsgZXh0ZW5zaW9uKSA+IDA7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmb250Rm9ybWF0c1tleHRlbnNpb25dO1xuICAgIH0pO1xuICAgIGlmIChmb3JtYXRzKSByZXR1cm4gZm9ybWF0c1swXTtcbiAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGZvbnQgZm9ybWF0IGZvciAnICsgZm9udFVybCArICcuIEZvbnRzIG1heSBub3QgYmUgd29ya2luZyBjb3JyZWN0bHkuJyk7XG4gICAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICB9O1xuXG4gIHZhciBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXIpIHtcbiAgICB2YXIgYmluYXJ5ID0gJyc7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1yZXR1cm4gd2luZG93LmJ0b2EoYmluYXJ5KTtcbiAgfTtcblxuICB2YXIgZ2V0RGltZW5zaW9uID0gZnVuY3Rpb24gZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgZGltKSB7XG4gICAgdmFyIHYgPSBlbC52aWV3Qm94ICYmIGVsLnZpZXdCb3guYmFzZVZhbCAmJiBlbC52aWV3Qm94LmJhc2VWYWxbZGltXSB8fCBjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKSAhPT0gbnVsbCAmJiAhY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkubWF0Y2goLyUkLykgJiYgcGFyc2VJbnQoY2xvbmUuZ2V0QXR0cmlidXRlKGRpbSkpIHx8IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbV0gfHwgcGFyc2VJbnQoY2xvbmUuc3R5bGVbZGltXSkgfHwgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLmdldFByb3BlcnR5VmFsdWUoZGltKSk7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsIHx8IGlzTmFOKHBhcnNlRmxvYXQodikpID8gMCA6IHY7XG4gIH07XG5cbiAgdmFyIGdldERpbWVuc2lvbnMgPSBmdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsLCBjbG9uZSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmIChlbC50YWdOYW1lID09PSAnc3ZnJykgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3aWR0aCB8fCBnZXREaW1lbnNpb24oZWwsIGNsb25lLCAnd2lkdGgnKSxcbiAgICAgIGhlaWdodDogaGVpZ2h0IHx8IGdldERpbWVuc2lvbihlbCwgY2xvbmUsICdoZWlnaHQnKVxuICAgIH07ZWxzZSBpZiAoZWwuZ2V0QkJveCkge1xuICAgICAgdmFyIF9lbCRnZXRCQm94ID0gZWwuZ2V0QkJveCgpLFxuICAgICAgICAgIHggPSBfZWwkZ2V0QkJveC54LFxuICAgICAgICAgIHkgPSBfZWwkZ2V0QkJveC55LFxuICAgICAgICAgIF93aWR0aCA9IF9lbCRnZXRCQm94LndpZHRoLFxuICAgICAgICAgIF9oZWlnaHQgPSBfZWwkZ2V0QkJveC5oZWlnaHQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB4ICsgX3dpZHRoLFxuICAgICAgICBoZWlnaHQ6IHkgKyBfaGVpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmVFbmNvZGUgPSBmdW5jdGlvbiByZUVuY29kZShkYXRhKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoZGF0YSkucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBwMSkge1xuICAgICAgdmFyIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCcweCcgKyBwMSk7XG4gICAgICByZXR1cm4gYyA9PT0gJyUnID8gJyUyNScgOiBjO1xuICAgIH0pKTtcbiAgfTtcblxuICB2YXIgdXJpVG9CbG9iID0gZnVuY3Rpb24gdXJpVG9CbG9iKHVyaSkge1xuICAgIHZhciBieXRlU3RyaW5nID0gd2luZG93LmF0b2IodXJpLnNwbGl0KCcsJylbMV0pO1xuICAgIHZhciBtaW1lU3RyaW5nID0gdXJpLnNwbGl0KCcsJylbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdO1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIHZhciBpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbnRBcnJheVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IG1pbWVTdHJpbmcgfSk7XG4gIH07XG5cbiAgdmFyIHF1ZXJ5ID0gZnVuY3Rpb24gcXVlcnkoZWwsIHNlbGVjdG9yKSB7XG4gICAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgfHwgZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIENTUyBzZWxlY3RvciBcIicgKyBzZWxlY3RvciArICdcIicsIGVycik7XG4gICAgfVxuICB9O1xuXG4gIHZhciBkZXRlY3RDc3NGb250ID0gZnVuY3Rpb24gZGV0ZWN0Q3NzRm9udChydWxlLCBocmVmKSB7XG4gICAgLy8gTWF0Y2ggQ1NTIGZvbnQtZmFjZSBydWxlcyB0byBleHRlcm5hbCBsaW5rcy5cbiAgICAvLyBAZm9udC1mYWNlIHtcbiAgICAvLyAgIHNyYzogbG9jYWwoJ0FiZWwnKSwgdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9hYmVsL3Y2L1V6Ti1pZWpSMVZvWFUyT2MtN0xzYnZlc1pXMnhPUS14c05xTzQ3bTU1REEud29mZjIpO1xuICAgIC8vIH1cbiAgICB2YXIgbWF0Y2ggPSBydWxlLmNzc1RleHQubWF0Y2godXJsUmVnZXgpO1xuICAgIHZhciB1cmwgPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICBpZiAoIXVybCB8fCB1cmwubWF0Y2goL15kYXRhOi8pIHx8IHVybCA9PT0gJ2Fib3V0OmJsYW5rJykgcmV0dXJuO1xuICAgIHZhciBmdWxsVXJsID0gdXJsLnN0YXJ0c1dpdGgoJy4uLycpID8gaHJlZiArICcvLi4vJyArIHVybCA6IHVybC5zdGFydHNXaXRoKCcuLycpID8gaHJlZiArICcvLicgKyB1cmwgOiB1cmw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJ1bGUuY3NzVGV4dCxcbiAgICAgIGZvcm1hdDogZ2V0Rm9udE1pbWVUeXBlRnJvbVVybChmdWxsVXJsKSxcbiAgICAgIHVybDogZnVsbFVybFxuICAgIH07XG4gIH07XG5cbiAgdmFyIGlubGluZUltYWdlcyA9IGZ1bmN0aW9uIGlubGluZUltYWdlcyhlbCkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltYWdlJykpLm1hcChmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgIHZhciBocmVmID0gaW1hZ2UuZ2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicpIHx8IGltYWdlLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgaWYgKCFocmVmKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgaWYgKGlzRXh0ZXJuYWwoaHJlZikpIHtcbiAgICAgICAgaHJlZiArPSAoaHJlZi5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArICd0PScgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnNyYyA9IGhyZWY7XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCAnICsgaHJlZikpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsICdocmVmJywgY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJykpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH07XG5cbiAgdmFyIGNhY2hlZEZvbnRzID0ge307XG4gIHZhciBpbmxpbmVGb250cyA9IGZ1bmN0aW9uIGlubGluZUZvbnRzKGZvbnRzKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZvbnRzLm1hcChmdW5jdGlvbiAoZm9udCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKGNhY2hlZEZvbnRzW2ZvbnQudXJsXSkgcmV0dXJuIHJlc29sdmUoY2FjaGVkRm9udHNbZm9udC51cmxdKTtcblxuICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFRPRE86IGl0IG1heSBhbHNvIGJlIHdvcnRoIGl0IHRvIHdhaXQgdW50aWwgZm9udHMgYXJlIGZ1bGx5IGxvYWRlZCBiZWZvcmVcbiAgICAgICAgICAvLyBhdHRlbXB0aW5nIHRvIHJhc3Rlcml6ZSB0aGVtLiAoZS5nLiB1c2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZvbnRGYWNlU2V0KVxuICAgICAgICAgIHZhciBmb250SW5CYXNlNjQgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KHJlcS5yZXNwb25zZSk7XG4gICAgICAgICAgdmFyIGZvbnRVcmkgPSBmb250LnRleHQucmVwbGFjZSh1cmxSZWdleCwgJ3VybChcImRhdGE6JyArIGZvbnQuZm9ybWF0ICsgJztiYXNlNjQsJyArIGZvbnRJbkJhc2U2NCArICdcIiknKSArICdcXG4nO1xuICAgICAgICAgIGNhY2hlZEZvbnRzW2ZvbnQudXJsXSA9IGZvbnRVcmk7XG4gICAgICAgICAgcmVzb2x2ZShmb250VXJpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBmb250IGZyb206ICcgKyBmb250LnVybCwgZSk7XG4gICAgICAgICAgY2FjaGVkRm9udHNbZm9udC51cmxdID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Fib3J0ZWQgbG9hZGluZyBmb250IGZyb206ICcgKyBmb250LnVybCwgZSk7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vcGVuKCdHRVQnLCBmb250LnVybCk7XG4gICAgICAgIHJlcS5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICByZXEuc2VuZCgpO1xuICAgICAgfSk7XG4gICAgfSkpLnRoZW4oZnVuY3Rpb24gKGZvbnRDc3MpIHtcbiAgICAgIHJldHVybiBmb250Q3NzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBjYWNoZWRSdWxlcyA9IG51bGw7XG4gIHZhciBzdHlsZVNoZWV0UnVsZXMgPSBmdW5jdGlvbiBzdHlsZVNoZWV0UnVsZXMoKSB7XG4gICAgaWYgKGNhY2hlZFJ1bGVzKSByZXR1cm4gY2FjaGVkUnVsZXM7XG4gICAgcmV0dXJuIGNhY2hlZFJ1bGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5zdHlsZVNoZWV0cykubWFwKGZ1bmN0aW9uIChzaGVldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgcnVsZXM6IHNoZWV0LmNzc1J1bGVzLCBocmVmOiBzaGVldC5ocmVmIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU3R5bGVzaGVldCBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgc2hlZXQuaHJlZiwgZSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgaW5saW5lQ3NzID0gZnVuY3Rpb24gaW5saW5lQ3NzKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIF9yZWYgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBzZWxlY3RvclJlbWFwID0gX3JlZi5zZWxlY3RvclJlbWFwLFxuICAgICAgICBtb2RpZnlTdHlsZSA9IF9yZWYubW9kaWZ5U3R5bGUsXG4gICAgICAgIG1vZGlmeUNzcyA9IF9yZWYubW9kaWZ5Q3NzLFxuICAgICAgICBmb250cyA9IF9yZWYuZm9udHMsXG4gICAgICAgIGV4Y2x1ZGVVbnVzZWRDc3MgPSBfcmVmLmV4Y2x1ZGVVbnVzZWRDc3M7XG5cbiAgICB2YXIgZ2VuZXJhdGVDc3MgPSBtb2RpZnlDc3MgfHwgZnVuY3Rpb24gKHNlbGVjdG9yLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgc2VsID0gc2VsZWN0b3JSZW1hcCA/IHNlbGVjdG9yUmVtYXAoc2VsZWN0b3IpIDogc2VsZWN0b3I7XG4gICAgICB2YXIgcHJvcHMgPSBtb2RpZnlTdHlsZSA/IG1vZGlmeVN0eWxlKHByb3BlcnRpZXMpIDogcHJvcGVydGllcztcbiAgICAgIHJldHVybiBzZWwgKyAneycgKyBwcm9wcyArICd9XFxuJztcbiAgICB9O1xuICAgIHZhciBjc3MgPSBbXTtcbiAgICB2YXIgZGV0ZWN0Rm9udHMgPSB0eXBlb2YgZm9udHMgPT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBmb250TGlzdCA9IGZvbnRzIHx8IFtdO1xuICAgIHN0eWxlU2hlZXRSdWxlcygpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgcnVsZXMgPSBfcmVmMi5ydWxlcyxcbiAgICAgICAgICBocmVmID0gX3JlZjIuaHJlZjtcblxuICAgICAgaWYgKCFydWxlcykgcmV0dXJuO1xuICAgICAgQXJyYXkuZnJvbShydWxlcykuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUuc3R5bGUgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAocXVlcnkoZWwsIHJ1bGUuc2VsZWN0b3JUZXh0KSkgY3NzLnB1c2goZ2VuZXJhdGVDc3MocnVsZS5zZWxlY3RvclRleHQsIHJ1bGUuc3R5bGUuY3NzVGV4dCkpO2Vsc2UgaWYgKGRldGVjdEZvbnRzICYmIHJ1bGUuY3NzVGV4dC5tYXRjaCgvXkBmb250LWZhY2UvKSkge1xuICAgICAgICAgICAgdmFyIGZvbnQgPSBkZXRlY3RDc3NGb250KHJ1bGUsIGhyZWYpO1xuICAgICAgICAgICAgaWYgKGZvbnQpIGZvbnRMaXN0LnB1c2goZm9udCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghZXhjbHVkZVVudXNlZENzcykge1xuICAgICAgICAgICAgY3NzLnB1c2gocnVsZS5jc3NUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlubGluZUZvbnRzKGZvbnRMaXN0KS50aGVuKGZ1bmN0aW9uIChmb250Q3NzKSB7XG4gICAgICByZXR1cm4gY3NzLmpvaW4oJ1xcbicpICsgZm9udENzcztcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZG93bmxvYWRPcHRpb25zID0gZnVuY3Rpb24gZG93bmxvYWRPcHRpb25zKCkge1xuICAgIGlmICghbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IgJiYgISgnZG93bmxvYWQnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSkpIHtcbiAgICAgIHJldHVybiB7IHBvcHVwOiB3aW5kb3cub3BlbigpIH07XG4gICAgfVxuICB9O1xuXG4gIG91dCQucHJlcGFyZVN2ZyA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcblxuICAgIHZhciBfcmVmMyA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIF9yZWYzJGxlZnQgPSBfcmVmMy5sZWZ0LFxuICAgICAgICBsZWZ0ID0gX3JlZjMkbGVmdCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYzJGxlZnQsXG4gICAgICAgIF9yZWYzJHRvcCA9IF9yZWYzLnRvcCxcbiAgICAgICAgdG9wID0gX3JlZjMkdG9wID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjMkdG9wLFxuICAgICAgICB3ID0gX3JlZjMud2lkdGgsXG4gICAgICAgIGggPSBfcmVmMy5oZWlnaHQsXG4gICAgICAgIF9yZWYzJHNjYWxlID0gX3JlZjMuc2NhbGUsXG4gICAgICAgIHNjYWxlID0gX3JlZjMkc2NhbGUgPT09IHVuZGVmaW5lZCA/IDEgOiBfcmVmMyRzY2FsZSxcbiAgICAgICAgX3JlZjMkcmVzcG9uc2l2ZSA9IF9yZWYzLnJlc3BvbnNpdmUsXG4gICAgICAgIHJlc3BvbnNpdmUgPSBfcmVmMyRyZXNwb25zaXZlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYzJHJlc3BvbnNpdmUsXG4gICAgICAgIF9yZWYzJGV4Y2x1ZGVDc3MgPSBfcmVmMy5leGNsdWRlQ3NzLFxuICAgICAgICBleGNsdWRlQ3NzID0gX3JlZjMkZXhjbHVkZUNzcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmMyRleGNsdWRlQ3NzO1xuXG4gICAgcmV0dXJuIGlubGluZUltYWdlcyhlbCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjbG9uZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAob3B0aW9ucyB8fCB7fSkuYmFja2dyb3VuZENvbG9yIHx8IGVsLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgdmFyIF9nZXREaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyhlbCwgY2xvbmUsIHcsIGgpLFxuICAgICAgICAgIHdpZHRoID0gX2dldERpbWVuc2lvbnMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldERpbWVuc2lvbnMuaGVpZ2h0O1xuXG4gICAgICBpZiAoZWwudGFnTmFtZSAhPT0gJ3N2ZycpIHtcbiAgICAgICAgaWYgKGVsLmdldEJCb3gpIHtcbiAgICAgICAgICBpZiAoY2xvbmUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGNsb25lLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykucmVwbGFjZSgvdHJhbnNsYXRlXFwoLio/XFwpLywgJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgc3ZnLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgICBjbG9uZSA9IHN2ZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdHRlbXB0ZWQgdG8gcmVuZGVyIG5vbi1TVkcgZWxlbWVudCcsIGVsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd2ZXJzaW9uJywgJzEuMScpO1xuICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0uam9pbignICcpKTtcbiAgICAgIGlmICghY2xvbmUuZ2V0QXR0cmlidXRlKCd4bWxucycpKSBjbG9uZS5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zJywgc3ZnTnMpO1xuICAgICAgaWYgKCFjbG9uZS5nZXRBdHRyaWJ1dGUoJ3htbG5zOnhsaW5rJykpIGNsb25lLnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnM6eGxpbmsnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycpO1xuXG4gICAgICBpZiAocmVzcG9uc2l2ZSkge1xuICAgICAgICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICAgIGNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWluWU1pbiBtZWV0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGggKiBzY2FsZSk7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0ICogc2NhbGUpO1xuICAgICAgfVxuXG4gICAgICBBcnJheS5mcm9tKGNsb25lLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZvcmVpZ25PYmplY3QgPiAqJykpLmZvckVhY2goZnVuY3Rpb24gKGZvcmVpZ25PYmplY3QpIHtcbiAgICAgICAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGVOUyh4bWxOcywgJ3htbG5zJywgZm9yZWlnbk9iamVjdC50YWdOYW1lID09PSAnc3ZnJyA/IHN2Z05zIDogeGh0bWxOcyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV4Y2x1ZGVDc3MpIHtcbiAgICAgICAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG91dGVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgICAgdmFyIHNyYyA9IG91dGVyLmlubmVySFRNTDtcbiAgICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHNyYywgd2lkdGgsIGhlaWdodCk7ZWxzZSByZXR1cm4geyBzcmM6IHNyYywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlubGluZUNzcyhlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoY3NzKSB7XG4gICAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTtcbiAgICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnPCFbQ0RBVEFbXFxuJyArIGNzcyArICdcXG5dXT4nO1xuXG4gICAgICAgICAgdmFyIGRlZnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZWZzJyk7XG4gICAgICAgICAgZGVmcy5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgICAgY2xvbmUuaW5zZXJ0QmVmb3JlKGRlZnMsIGNsb25lLmZpcnN0Q2hpbGQpO1xuXG4gICAgICAgICAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICAgIHZhciBzcmMgPSBvdXRlci5pbm5lckhUTUwucmVwbGFjZSgvTlNcXGQrOmhyZWYvZ2ksICd4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4bGluazpocmVmJyk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUoc3JjLCB3aWR0aCwgaGVpZ2h0KTtlbHNlIHJldHVybiB7IHNyYzogc3JjLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc3ZnQXNEYXRhVXJpID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuICAgIHJldHVybiBvdXQkLnByZXBhcmVTdmcoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICB2YXIgc3JjID0gX3JlZjQuc3JjLFxuICAgICAgICAgIHdpZHRoID0gX3JlZjQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZjQuaGVpZ2h0O1xuXG4gICAgICB2YXIgc3ZnWG1sID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIHdpbmRvdy5idG9hKHJlRW5jb2RlKGRvY3R5cGUgKyBzcmMpKTtcbiAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb25lKHN2Z1htbCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3ZnWG1sO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc3ZnQXNQbmdVcmkgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG5cbiAgICB2YXIgX3JlZjUgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmNSRlbmNvZGVyVHlwZSA9IF9yZWY1LmVuY29kZXJUeXBlLFxuICAgICAgICBlbmNvZGVyVHlwZSA9IF9yZWY1JGVuY29kZXJUeXBlID09PSB1bmRlZmluZWQgPyAnaW1hZ2UvcG5nJyA6IF9yZWY1JGVuY29kZXJUeXBlLFxuICAgICAgICBfcmVmNSRlbmNvZGVyT3B0aW9ucyA9IF9yZWY1LmVuY29kZXJPcHRpb25zLFxuICAgICAgICBlbmNvZGVyT3B0aW9ucyA9IF9yZWY1JGVuY29kZXJPcHRpb25zID09PSB1bmRlZmluZWQgPyAwLjggOiBfcmVmNSRlbmNvZGVyT3B0aW9ucyxcbiAgICAgICAgY2FudmcgPSBfcmVmNS5jYW52ZztcblxuICAgIHZhciBjb252ZXJ0VG9QbmcgPSBmdW5jdGlvbiBjb252ZXJ0VG9QbmcoX3JlZjYpIHtcbiAgICAgIHZhciBzcmMgPSBfcmVmNi5zcmMsXG4gICAgICAgICAgd2lkdGggPSBfcmVmNi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmNi5oZWlnaHQ7XG5cbiAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICB2YXIgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG5cbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gY2FudmFzLndpZHRoICsgJ3B4JztcbiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuXG4gICAgICBpZiAoY2FudmcpIGNhbnZnKGNhbnZhcywgc3JjKTtlbHNlIGNvbnRleHQuZHJhd0ltYWdlKHNyYywgMCwgMCk7XG5cbiAgICAgIHZhciBwbmcgPSB2b2lkIDA7XG4gICAgICB0cnkge1xuICAgICAgICBwbmcgPSBjYW52YXMudG9EYXRhVVJMKGVuY29kZXJUeXBlLCBlbmNvZGVyT3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgU2VjdXJpdHlFcnJvciAhPT0gJ3VuZGVmaW5lZCcgJiYgZSBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgfHwgZS5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZW5kZXJlZCBTVkcgaW1hZ2VzIGNhbm5vdCBiZSBkb3dubG9hZGVkIGluIHRoaXMgYnJvd3Nlci4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSBkb25lKHBuZywgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG5nKTtcbiAgICB9O1xuXG4gICAgaWYgKGNhbnZnKSByZXR1cm4gb3V0JC5wcmVwYXJlU3ZnKGVsLCBvcHRpb25zKS50aGVuKGNvbnZlcnRUb1BuZyk7ZWxzZSByZXR1cm4gb3V0JC5zdmdBc0RhdGFVcmkoZWwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjb252ZXJ0VG9Qbmcoe1xuICAgICAgICAgICAgc3JjOiBpbWFnZSxcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlamVjdCgnVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIGRhdGEgVVJJIGFzIGFuIGltYWdlIG9uIHRoZSBmb2xsb3dpbmcgU1ZHXFxuJyArIHdpbmRvdy5hdG9iKHVyaS5zbGljZSgyNikpICsgJ09wZW4gdGhlIGZvbGxvd2luZyBsaW5rIHRvIHNlZSBicm93c2VyXFwncyBkaWFnbm9zaXNcXG4nICsgdXJpKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5kb3dubG9hZCA9IGZ1bmN0aW9uIChuYW1lLCB1cmksIG9wdGlvbnMpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHVyaVRvQmxvYih1cmkpLCBuYW1lKTtlbHNlIHtcbiAgICAgIHZhciBzYXZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGlmICgnZG93bmxvYWQnIGluIHNhdmVMaW5rKSB7XG4gICAgICAgIHNhdmVMaW5rLmRvd25sb2FkID0gbmFtZTtcbiAgICAgICAgc2F2ZUxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzYXZlTGluayk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGJsb2IgPSB1cmlUb0Jsb2IodXJpKTtcbiAgICAgICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICBzYXZlTGluay5ocmVmID0gdXJsO1xuICAgICAgICAgIHNhdmVMaW5rLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3Igd2hpbGUgZ2V0dGluZyBvYmplY3QgVVJMLiBGYWxsaW5nIGJhY2sgdG8gc3RyaW5nIFVSTC4nKTtcbiAgICAgICAgICBzYXZlTGluay5ocmVmID0gdXJpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVMaW5rLmNsaWNrKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2F2ZUxpbmspO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMucG9wdXApIHtcbiAgICAgICAgb3B0aW9ucy5wb3B1cC5kb2N1bWVudC50aXRsZSA9IG5hbWU7XG4gICAgICAgIG9wdGlvbnMucG9wdXAubG9jYXRpb24ucmVwbGFjZSh1cmkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdXQkLnNhdmVTdmcgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZG93bmxvYWRPcHRzID0gZG93bmxvYWRPcHRpb25zKCk7IC8vIGRvbid0IGlubGluZSwgY2FuJ3QgYmUgYXN5bmNcbiAgICByZXR1cm4gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKS50aGVuKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIG91dCQuc3ZnQXNEYXRhVXJpKGVsLCBvcHRpb25zIHx8IHt9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBvdXQkLmRvd25sb2FkKG5hbWUsIHVyaSwgZG93bmxvYWRPcHRzKTtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLnNhdmVTdmdBc1BuZyA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBkb3dubG9hZE9wdHMgPSBkb3dubG9hZE9wdGlvbnMoKTsgLy8gZG9uJ3QgaW5saW5lLCBjYW4ndCBiZSBhc3luY1xuICAgIHJldHVybiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpLnRoZW4oZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gb3V0JC5zdmdBc1BuZ1VyaShlbCwgb3B0aW9ucyB8fCB7fSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gb3V0JC5kb3dubG9hZChuYW1lLCB1cmksIGRvd25sb2FkT3B0cyk7XG4gICAgfSk7XG4gIH07XG59KSgpOyIsImV4cG9ydCBjb25zdCBJQ0RTID0gYERJU1BMQVlcbk5PIERBVEFcbmA7XG4iLCJleHBvcnQgY29uc3QgSURQUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvR2NycywgZ2Nyc1RvTnVjbGVvdGlkZXMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMsIGdjcnNUb01lcm1hZGUxMiwgc2lSbmFOdWNsZW90aWRlc1RvR2NycyB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvY29udmVydGVycyc7XG5pbXBvcnQgeyBtYXAsIENPTF9OQU1FUywgTU9ESUZJQ0FUSU9OUyB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvbWFwJztcbmltcG9ydCB7IGlzVmFsaWRTZXF1ZW5jZSB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuaW1wb3J0IHsgc2VxdWVuY2VUb01vbFYzMDAwIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9mcm9tLW1vbm9tZXJzJztcbmltcG9ydCB7IGxpbmtWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5pbXBvcnQgeyBTQUxUU19DU1YgfSBmcm9tICcuLi9zYWx0cyc7XG5pbXBvcnQgeyBVU0VSU19DU1YgfSBmcm9tICcuLi91c2Vycyc7XG5pbXBvcnQgeyBJQ0RTIH0gZnJvbSAnLi4vSUNEcyc7XG5pbXBvcnQgeyBTT1VSQ0VTIH0gZnJvbSAnLi4vc291cmNlcyc7XG5pbXBvcnQgeyBJRFBTIH0gZnJvbSAnLi4vSURQcyc7XG5mdW5jdGlvbiBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihhcnJheSkge1xuICAgIHJldHVybiBhcnJheS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoOyB9KTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShpdGVtcykge1xuICAgIHJldHVybiAnW1wiJyArIGl0ZW1zLmpvaW4oJ1wiLCBcIicpICsgJ1wiXSc7XG59XG5mdW5jdGlvbiBzYWx0TWFzcyhzYWx0TmFtZXMsIG1vbFdlaWdodENvbCwgZXF1aXZhbGVudHNDb2wsIGksIHNhbHRDb2wpIHtcbiAgICBjb25zdCBzYWx0Um93SW5kZXggPSBzYWx0TmFtZXMuaW5kZXhPZihzYWx0Q29sLmdldChpKSk7XG4gICAgcmV0dXJuIChzYWx0Um93SW5kZXggPT0gLTEgfHwgbW9sV2VpZ2h0Q29sLmdldChzYWx0Um93SW5kZXgpID09IERHLkZMT0FUX05VTEwgfHwgZXF1aXZhbGVudHNDb2wuZ2V0KGkpID09IERHLklOVF9OVUxMKSA/XG4gICAgICAgIERHLkZMT0FUX05VTEwgOlxuICAgICAgICBtb2xXZWlnaHRDb2wuZ2V0KHNhbHRSb3dJbmRleCkgKiBlcXVpdmFsZW50c0NvbC5nZXQoaSk7XG59XG5mdW5jdGlvbiBzYWx0TW9sV2VpZ3RoKHNhbHROYW1lc0xpc3QsIHNhbHRDb2wsIG1vbFdlaWdodENvbCwgaSkge1xuICAgIGNvbnN0IHNhbHRSb3dJbmRleCA9IHNhbHROYW1lc0xpc3QuaW5kZXhPZihzYWx0Q29sLmdldChpKSk7XG4gICAgcmV0dXJuIChzYWx0Um93SW5kZXggPT0gLTEpID8gREcuRkxPQVRfTlVMTCA6IG1vbFdlaWdodENvbC5nZXQoc2FsdFJvd0luZGV4KTtcbn1cbmZ1bmN0aW9uIGJhdGNoTW9sV2VpZ2h0KGNvbXBvdW5kTW9sV2VpZ2h0Q29sLCBzYWx0TWFzc0NvbCwgaSkge1xuICAgIHJldHVybiAoY29tcG91bmRNb2xXZWlnaHRDb2wuZ2V0U3RyaW5nKGkpID09ICcnIHx8IHNhbHRNYXNzQ29sLmdldFN0cmluZyhpKSA9PSAnJykgP1xuICAgICAgICBERy5GTE9BVF9OVUxMIDpcbiAgICAgICAgY29tcG91bmRNb2xXZWlnaHRDb2wuZ2V0KGkpICsgc2FsdE1hc3NDb2wuZ2V0KGkpO1xufVxuZnVuY3Rpb24gbW9sZWN1bGFyV2VpZ2h0KHNlcXVlbmNlLCB3ZWlnaHRzT2JqKSB7XG4gICAgY29uc3QgY29kZXMgPSBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihPYmplY3Qua2V5cyh3ZWlnaHRzT2JqKSkuY29uY2F0KE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpKTtcbiAgICBsZXQgd2VpZ2h0ID0gMDtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICB3ZWlnaHQgKz0gd2VpZ2h0c09ialtzZXF1ZW5jZS5zbGljZShpLCBpICsgbWF0Y2hlZENvZGUubGVuZ3RoKV07XG4gICAgICAgIGkgKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gd2VpZ2h0IC0gNjEuOTc7XG59XG5mdW5jdGlvbiBwYXJzZVN0cmFuZHNGcm9tRHVwbGV4Q2VsbChzKSB7XG4gICAgcmV0dXJuIHMuc2xpY2UoMykuc3BsaXQoJ1xcclxcbkFTICcpO1xufVxuZnVuY3Rpb24gc2F2ZVRhYmxlQXNTZEZpbGUodGFibGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRhYmxlLmNvbHVtbnMuY29udGFpbnMoJ0NvbXBvdW5kIE5hbWUnKSkge1xuICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdGaWxlIHNhdmVkIHdpdGhvdXQgY29sdW1ucyBcXCcnICtcbiAgICAgICAgICAgICAgICBbQ09MX05BTUVTLkNPTVBPVU5EX05BTUUsIENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUywgQ09MX05BTUVTLkNQRF9NVyxcbiAgICAgICAgICAgICAgICAgICAgQ09MX05BTUVTLlNBTFRfTUFTUywgQ09MX05BTUVTLkJBVENIX01XXS5qb2luKCdcXCcsIFxcJycpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmVDb2x1bW4gPSB0YWJsZS5nZXRDb2woQ09MX05BTUVTLlNFUVVFTkNFKTtcbiAgICAgICAgY29uc3QgdHlwZUNvbHVtbiA9IHRhYmxlLmdldENvbChDT0xfTkFNRVMuVFlQRSk7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSAnSmFuc3NlbiBHQ1JTIENvZGVzJzsgLy9nZXRGb3JtYXQoc3RydWN0dXJlQ29sdW1uLmdldChpKSkhO1xuICAgICAgICAgICAgaWYgKHR5cGVDb2x1bW4uZ2V0KGkpID09ICdEdXBsZXgnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBwYXJzZVN0cmFuZHNGcm9tRHVwbGV4Q2VsbChzdHJ1Y3R1cmVDb2x1bW4uZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChhcnJheVsxXSwgdHJ1ZSwgdHJ1ZSwgZm9ybWF0KSArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICsgYD4gPFNlcXVlbmNlPlxcbkFudGkgU2Vuc2VcXG5cXG5gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNzID0gc2VxdWVuY2VUb01vbFYzMDAwKGFycmF5WzBdLCBmYWxzZSwgdHJ1ZSwgZm9ybWF0KSArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICsgYD4gPFNlcXVlbmNlPlxcblNlbnNlIFN0cmFuZFxcblxcbmA7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmtWMzAwMChbc3MsIGFzXSwgdHJ1ZSwgdHJ1ZSkgKyAnXFxuXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2x1bW4uZ2V0KGkpID09ICdTUycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2xTUyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChzdHJ1Y3R1cmVDb2x1bW4uZ2V0KGkpLCBmYWxzZSwgdHJ1ZSwgZm9ybWF0KSArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICsgYD4gPFNlcXVlbmNlPlxcblNlbnNlIFN0cmFuZFxcblxcbmA7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IG1vbFNTO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbHVtbi5nZXQoaSkgPT0gJ0FTJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbEFTID0gc2VxdWVuY2VUb01vbFYzMDAwKHN0cnVjdHVyZUNvbHVtbi5nZXQoaSksIHRydWUsIHRydWUsIGZvcm1hdCkgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArIGA+IDxTZXF1ZW5jZT5cXG5BbnRpIFNlbnNlXFxuXFxuYDtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbW9sQVM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0YWJsZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5uYW1lICE9IENPTF9OQU1FUy5TRVFVRU5DRSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGA+IDwke2NvbC5uYW1lfT5cXG4ke2NvbC5nZXQoaSl9XFxuXFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSAnJCQkJFxcbic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgdGFibGUubmFtZSArICcuc2RmJyk7XG4gICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbigpIHtcbiAgICBncm9rLmV2ZW50cy5vblZpZXdBZGRlZC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgaWYgKHYudHlwZSA9PSAnVGFibGVWaWV3Jykge1xuICAgICAgICAgICAgaWYgKHYuZGF0YUZyYW1lLmNvbHVtbnMuY29udGFpbnMoQ09MX05BTUVTLlRZUEUpKVxuICAgICAgICAgICAgICAgIG9saWdvU2RGaWxlKHYuZGF0YUZyYW1lKTtcbiAgICAgICAgICAgIGdyb2suZXZlbnRzLm9uQ29udGV4dE1lbnUuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VxQ29sID0gYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENvbDsgLy8gL15bZnNBQ0dVYWNndV17Nix9JC9cbiAgICAgICAgICAgICAgICBpZiAoREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8Qyl7Nix9JC8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCByYXcgbnVjbGVvdGlkZXMgdG8gR0NSUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byBHQ1JTJykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmfHN8QXxDfEd8VXxhfGN8Z3x1KXs2LH0kLy50ZXN0KHMpKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MubWVudS5pdGVtKCdDb252ZXJ0IEF4b2xhYnMgdG8gR0NSUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byBHQ1JTJykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaVJuYUF4b2xhYnNUb0djcnMoc2VxQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IC8vIC9eW2ZtcHNBQ0dVXXs2LH0kL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmfG18cHN8QXxDfEd8VSl7Nix9JC8udGVzdChzKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvXig/PS4qbW9lKSg/PS4qNW1DKSg/PS4qcHMpezYsfS8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBHQ1JTIHRvIHJhdycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byByYXcnKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdjcnNUb051Y2xlb3RpZGVzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MubWVudS5pdGVtKCdDb252ZXJ0IEdDUlMgdG8gTU0xMicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byBNTTEyJykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnY3JzVG9NZXJtYWRlMTIoc2VxQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IC8vIC9eWyo1Njc4OUFUR0NdezYsfSQvXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKERHLkRldGVjdG9yLnNhbXBsZUNhdGVnb3JpZXMoc2VxQ29sLCAocykgPT4gLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFxcKnw1fDZ8N3w4fDl8QXxUfEd8Qyl7Nix9JC8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBCaW9zcHJpbmcgdG8gR0NSUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcUNvbCA9IGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycyhzZXFDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgLy8gL15bKjEtOF17Nix9JC9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8XFwqfDF8MnwzfDR8NXw2fDd8OCl7Nix9JC8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBCaW9zcHJpbmcgdG8gR0NSUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmNvbHVtbnMuYWRkTmV3U3RyaW5nKHNlcUNvbC5uYW1lICsgJyB0byBHQ1JTJykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaVJuYUJpb1NwcmluZ1RvR2NycyhzZXFDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9saWdvU2RGaWxlKHRhYmxlKSB7XG4gICAgY29uc3Qgc2FsdHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFNBTFRTX0NTVik7XG4gICAgY29uc3QgdXNlcnNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFVTRVJTX0NTVik7XG4gICAgY29uc3Qgc291cmNlc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoU09VUkNFUyk7XG4gICAgY29uc3QgaWNkc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoSUNEUyk7XG4gICAgY29uc3QgaWRwc0RmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoSURQUyk7XG4gICAgY29uc3Qgc2VxdWVuY2VDb2wgPSB0YWJsZS5nZXRDb2woQ09MX05BTUVTLlNFUVVFTkNFKTtcbiAgICBjb25zdCBzYWx0Q29sID0gdGFibGUuZ2V0Q29sKENPTF9OQU1FUy5TQUxUKTtcbiAgICBjb25zdCBlcXVpdmFsZW50c0NvbCA9IHRhYmxlLmdldENvbChDT0xfTkFNRVMuRVFVSVZBTEVOVFMpO1xuICAgIGNvbnN0IHR5cGVDb2x1bW4gPSB0YWJsZS5nZXRDb2woQ09MX05BTUVTLlRZUEUpO1xuICAgIGNvbnN0IGNoZW1pc3RyeU5hbWVDb2wgPSB0YWJsZS5nZXRDb2woQ09MX05BTUVTLkNIRU1JU1RSWV9OQU1FKTtcbiAgICBjb25zdCBtb2xXZWlnaHRDb2wgPSBzYWx0c0RmLmdldENvbCgnTU9MV0VJR0hUJyk7XG4gICAgY29uc3Qgc2FsdE5hbWVzTGlzdCA9IHNhbHRzRGYuZ2V0Q29sKCdESVNQTEFZJykudG9MaXN0KCk7XG4gICAgZnVuY3Rpb24gYWRkQ29sdW1ucyh0KSB7XG4gICAgICAgIGlmICh0LmNvbHVtbnMuY29udGFpbnMoQ09MX05BTUVTLkNPTVBPVU5EX05BTUUpKVxuICAgICAgICAgICAgcmV0dXJuIGdyb2suc2hlbGwuZXJyb3IoJ0NvbHVtbnMgYWxyZWFkeSBleGlzdCcpO1xuICAgICAgICBmb3IgKGxldCBpID0gdC5yb3dDb3VudCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoc2VxdWVuY2VDb2wuZ2V0KGkpID09ICcnKVxuICAgICAgICAgICAgICAgIHQucm93cy5yZW1vdmVBdChpLCAxLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld1N0cmluZyhDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSkuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlQ29sdW1uLmdldChpKSA9PSAnRHVwbGV4JykgPyBjaGVtaXN0cnlOYW1lQ29sLmdldChpKSA6IHNlcXVlbmNlQ29sLmdldChpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdTdHJpbmcoQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZUNvbHVtbi5nZXQoaSkgPT0gJ0R1cGxleCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBwYXJzZVN0cmFuZHNGcm9tRHVwbGV4Q2VsbChzZXF1ZW5jZUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGVtaXN0cnlOYW1lQ29sLmdldChpKSArICc7IGR1cGxleCBvZiBTUzogJyArIGFyclswXSArICcgYW5kIEFTOiAnICsgYXJyWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlQ29sLmdldChpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHdlaWdodHNPYmogPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBzeW50aGVzaXplciBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgICAgIHdlaWdodHNPYmpbY29kZV0gPSBtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldW2NvZGVdLndlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhNT0RJRklDQVRJT05TKSlcbiAgICAgICAgICAgIHdlaWdodHNPYmpba2V5XSA9IHZhbHVlLm1vbGVjdWxhcldlaWdodDtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5DUERfTVcpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlQ29sdW1uLmdldChpKSA9PSAnRHVwbGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IHBhcnNlU3RyYW5kc0Zyb21EdXBsZXhDZWxsKHNlcXVlbmNlQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChpc1ZhbGlkU2VxdWVuY2UoYXJyWzBdLCBudWxsKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZFNlcXVlbmNlKGFyclsxXSwgbnVsbCkuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID09IC0xKSA/XG4gICAgICAgICAgICAgICAgICAgIG1vbGVjdWxhcldlaWdodChhcnJbMF0sIHdlaWdodHNPYmopICsgbW9sZWN1bGFyV2VpZ2h0KGFyclsxXSwgd2VpZ2h0c09iaikgOlxuICAgICAgICAgICAgICAgICAgICBERy5GTE9BVF9OVUxMO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2VDb2wuZ2V0KGkpLCBudWxsKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPT0gLTEpID9cbiAgICAgICAgICAgICAgICBtb2xlY3VsYXJXZWlnaHQoc2VxdWVuY2VDb2wuZ2V0KGkpLCB3ZWlnaHRzT2JqKSA6XG4gICAgICAgICAgICAgICAgREcuRkxPQVRfTlVMTDtcbiAgICAgICAgfSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdGbG9hdChDT0xfTkFNRVMuU0FMVF9NQVNTKS5pbml0KChpKSA9PiBzYWx0TWFzcyhzYWx0TmFtZXNMaXN0LCBtb2xXZWlnaHRDb2wsIGVxdWl2YWxlbnRzQ29sLCBpLCBzYWx0Q29sKSk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdGbG9hdChDT0xfTkFNRVMuU0FMVF9NT0xfV0VJR0hUKS5pbml0KChpKSA9PiBzYWx0TW9sV2VpZ3RoKHNhbHROYW1lc0xpc3QsIHNhbHRDb2wsIG1vbFdlaWdodENvbCwgaSkpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3RmxvYXQoQ09MX05BTUVTLkJBVENIX01XKS5pbml0KChpKSA9PiBiYXRjaE1vbFdlaWdodCh0LmdldENvbChDT0xfTkFNRVMuQ1BEX01XKSwgdC5nZXRDb2woQ09MX05BTUVTLlNBTFRfTUFTUyksIGkpKTtcbiAgICAgICAgYWRkQ29sdW1uc1ByZXNzZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3RGYgPSB0O1xuICAgIH1cbiAgICBsZXQgbmV3RGY7XG4gICAgbGV0IGFkZENvbHVtbnNQcmVzc2VkID0gZmFsc2U7XG4gICAgY29uc3QgZCA9IHVpLmRpdihbXG4gICAgICAgIHVpLmljb25zLmVkaXQoKCkgPT4ge1xuICAgICAgICAgICAgZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIGlmICh0YWJsZS5nZXRDb2woQ09MX05BTUVTLklEUCkudHlwZSAhPSBERy5DT0xVTU5fVFlQRS5TVFJJTkcpXG4gICAgICAgICAgICAgICAgdGFibGUuY2hhbmdlQ29sdW1uVHlwZShDT0xfTkFNRVMuSURQLCBERy5DT0xVTU5fVFlQRS5TVFJJTkcpO1xuICAgICAgICAgICAgZC5hcHBlbmQodWkubGluaygnQWRkIENvbHVtbnMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkQ29sdW1ucyh0YWJsZSk7XG4gICAgICAgICAgICAgICAgdmlldy5ncmlkLmNvbHVtbnMuc2V0T3JkZXIoT2JqZWN0LnZhbHVlcyhDT0xfTkFNRVMpKTtcbiAgICAgICAgICAgIH0sICdBZGQgY29sdW1uczogXFwnJyArIFtDT0xfTkFNRVMuQ09NUE9VTkRfTkFNRSwgQ09MX05BTUVTLkNPTVBPVU5EX0NPTU1FTlRTLCBDT0xfTkFNRVMuQ1BEX01XLFxuICAgICAgICAgICAgICAgIENPTF9OQU1FUy5TQUxUX01BU1MsIENPTF9OQU1FUy5CQVRDSF9NV10uam9pbignXFwnLCBcXCcnKSwgJycpLCB1aS5idXR0b24oJ1NhdmUgU0QgZmlsZScsICgpID0+IHNhdmVUYWJsZUFzU2RGaWxlKGFkZENvbHVtbnNQcmVzc2VkID8gbmV3RGYgOiB0YWJsZSkpKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuVFlQRSkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgJ1tcIkFTXCIsIFwiU1NcIiwgXCJEdXBsZXhcIl0nKTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuT1dORVIpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeSh1c2Vyc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy5kYXRhRnJhbWUuZ2V0Q29sKENPTF9OQU1FUy5TQUxUKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnkoc2FsdHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuU09VUkNFKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnkoc291cmNlc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy5kYXRhRnJhbWUuZ2V0Q29sKENPTF9OQU1FUy5JQ0QpLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeShpY2RzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LmRhdGFGcmFtZS5nZXRDb2woQ09MX05BTUVTLklEUCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5KGlkcHNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIGdyb2suZXZlbnRzLm9uQ29udGV4dE1lbnUuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFtDT0xfTkFNRVMuVFlQRSwgQ09MX05BTUVTLk9XTkVSLCBDT0xfTkFNRVMuU0FMVCwgQ09MX05BTUVTLlNPVVJDRSwgQ09MX05BTUVTLklDRCwgQ09MX05BTUVTLklEUF1cbiAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGVzKGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2wubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnRmlsbCBDb2x1bW4gV2l0aCBWYWx1ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q2VsbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDZWxsLmNvbHVtbi5pbml0KHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3LmRhdGFGcmFtZS5yb3dDb3VudDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGN1bGF0ZWRDb2x1bW5zKHZpZXcuZGF0YUZyYW1lLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3LmRhdGFGcmFtZS5vbkRhdGFDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sTmFtZSA9IHZpZXcuZGF0YUZyYW1lLmN1cnJlbnRDb2wubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoW0NPTF9OQU1FUy5TQUxULCBDT0xfTkFNRVMuRVFVSVZBTEVOVFMsIENPTF9OQU1FUy5TQUxUX01PTF9XRUlHSFRdLmluY2x1ZGVzKGNvbE5hbWUpKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDYWxjdWxhdGVkQ29sdW1ucyh2aWV3LmRhdGFGcmFtZSwgdmlldy5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhbGN1bGF0ZWRDb2x1bW5zKHQsIGkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzbVZhbHVlID0gc2FsdE1hc3Moc2FsdE5hbWVzTGlzdCwgbW9sV2VpZ2h0Q29sLCBlcXVpdmFsZW50c0NvbCwgaSwgc2FsdENvbCk7XG4gICAgICAgICAgICAgICAgdC5nZXRDb2woQ09MX05BTUVTLlNBTFRfTUFTUykuc2V0KGksIHNtVmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzbXdWYWx1ZSA9IHNhbHRNb2xXZWlndGgoc2FsdE5hbWVzTGlzdCwgc2FsdENvbCwgbW9sV2VpZ2h0Q29sLCBpKTtcbiAgICAgICAgICAgICAgICB0LmdldENvbChDT0xfTkFNRVMuU0FMVF9NT0xfV0VJR0hUKS5zZXQoaSwgc213VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibXcgPSBiYXRjaE1vbFdlaWdodCh0LmdldENvbChDT0xfTkFNRVMuQ1BEX01XKSwgdC5nZXRDb2woQ09MX05BTUVTLlNBTFRfTUFTUyksIGkpO1xuICAgICAgICAgICAgICAgIHQuZ2V0Q29sKENPTF9OQU1FUy5CQVRDSF9NVykuc2V0KGksIGJtdywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICBdKTtcbiAgICBncm9rLnNoZWxsLnYuc2V0UmliYm9uUGFuZWxzKFtbZF1dKTtcbn1cbiIsImNvbnN0IHJuYUNvbG9yID0gJ3JnYigyNTUsMjMwLDE1MyknO1xuY29uc3QgaW52QWJhc2ljQ29sb3IgPSAncmdiKDIwMywxMTksMjExKSc7XG5leHBvcnQgY29uc3QgYXhvbGFic01hcCA9IHtcbiAgICAnUk5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1JOQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQScsICdDJywgJ0cnLCAnVSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnRE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ROQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnZEEnLCAnZEMnLCAnZEcnLCAnZFQnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTk3LDIyNCwxODApJyxcbiAgICB9LFxuICAgIFwiMlxcXCItRmx1b3JvXCI6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLUZsdW9ybyBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQWYnLCAnQ2YnLCAnR2YnLCAnVWYnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNjgsMTE0LDE5NiknLFxuICAgIH0sXG4gICAgXCIyXFxcIi1PLU1ldGh5bFwiOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1ldGh5bCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnYScsICdjJywgJ2cnLCAndSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNjYsMTY2LDE2NiknLFxuICAgIH0sXG4gICAgXCIyXFxcIi1PLU1PRVwiOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1PRSBudWNsZW90aWRlcyAoaW5jbHVkaW5nIDUtTWV0aHlsIEMpJyxcbiAgICAgICAgc3ltYm9sczogWydBbScsICdDbScsICdHbScsICdUbSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxMTIsNDgsMTYwKScsXG4gICAgfSxcbiAgICAnR05BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0dseWNvbCBudWNsZWljIGFjaWQnLFxuICAgICAgICBzeW1ib2xzOiBbJyhHTkEtQSknLCAnKEdOQS1DKScsICcoR05BLUcpJywgJyhHTkEtVCknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnTE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0xvY2tlZCBudWNsZWljIGFjaWQgKGluY2x1ZGluZyA1LU1ldGh5bCBDKScsXG4gICAgICAgIHN5bWJvbHM6IFsnQWInLCAnQ2InLCAnR2InLCAnVGInXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNTQsMjI5LDIzOCknLFxuICAgIH0sXG4gICAgJ1VOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdVbmxvY2tlZCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQW8nLCAnQ28nLCAnR28nLCAnVW8nXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdBZGVuaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydhJywgJ2EnLCAnYScsICdhJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdDJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0N5dG9zaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydjJywgJ2MnLCAnYycsICdjJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdHJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0d1YW5pbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2cnLCAnZycsICdnJywgJ2cnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ1UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnVXJhY2lsJyxcbiAgICAgICAgc3ltYm9sczogWyd1JywgJ3UnLCAndScsICd1J10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdYLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1gnLCAnWCcsICdYJywgJ1gnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTA4LDAsMCknLFxuICAgIH0sXG4gICAgJ1ktTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWScsICdZJywgJ1knLCAnWSddLFxuICAgICAgICBjb2xvcjogJ3JnYigyMTAsMTQ2LDE0NiknLFxuICAgIH0sXG4gICAgJ1otTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWicsICdaJywgJ1onLCAnWiddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNTUsMTA4LDEzMiknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkJyxcbiAgICAgICAgc3ltYm9sczogWycoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKSddLFxuICAgICAgICBjb2xvcjogaW52QWJhc2ljQ29sb3IsXG4gICAgfSxcbiAgICBcIjVcXFwiLXZpbnlscHNcIjoge1xuICAgICAgICBmdWxsTmFtZTogJzVcXCctdmlueWxwaG9zcGhvbmF0ZS0yXFwnLU9NZS11cmlkaW5lJyxcbiAgICAgICAgc3ltYm9sczogWycodmludSknLCAnKHZpbnUpJywgJyh2aW51KScsICcodmludSknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMCwwLDEzOSknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyhvKSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJ10sXG4gICAgICAgIGNvbG9yOiBpbnZBYmFzaWNDb2xvcixcbiAgICB9LFxuICAgIFwiMlxcXCItT01lLVUobylcIjoge1xuICAgICAgICBmdWxsTmFtZTogJ051Y2xlb3RpZGUgVXJpZGluZSB3aXRoIDJcXCdPLU1ldGh5bCBwcm90ZWN0aW9uIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJ21VJywgJ21VJywgJ21VJywgJ21VJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDY1LDIzMyw4MCknLFxuICAgIH0sXG59O1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgc3ZnIGZyb20gJ3NhdmUtc3ZnLWFzLXBuZyc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgeyBkcmF3QXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RyYXctc3ZnJztcbmltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5jb25zdCBiYXNlQ2hvaWNlcyA9IE9iamVjdC5rZXlzKGF4b2xhYnNNYXApO1xuY29uc3QgZGVmYXVsdEJhc2UgPSBiYXNlQ2hvaWNlc1swXTtcbmNvbnN0IGRlZmF1bHRQdG8gPSB0cnVlO1xuY29uc3QgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoID0gMjM7XG5jb25zdCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCA9IDM1O1xuY29uc3QgdXNlclN0b3JhZ2VLZXkgPSAnU2VxdWVuY2VUcmFuc2xhdG9yJztcbmNvbnN0IGV4YW1wbGVNaW5XaWR0aCA9ICc0MDBweCc7XG5mdW5jdGlvbiBnZW5lcmF0ZUV4YW1wbGUoc2VxdWVuY2VMZW5ndGgsIHNlcXVlbmNlQmFzaXMpIHtcbiAgICBjb25zdCB1bmlxdWVTeW1ib2xzID0gYXhvbGFic01hcFtzZXF1ZW5jZUJhc2lzXS5zeW1ib2xzLmpvaW4oJycpO1xuICAgIHJldHVybiB1bmlxdWVTeW1ib2xzLnJlcGVhdChNYXRoLmZsb29yKHNlcXVlbmNlTGVuZ3RoIC8gNCkpICsgdW5pcXVlU3ltYm9scy5zbGljZSgwLCBzZXF1ZW5jZUxlbmd0aCAlIDQpO1xufVxuZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMoZGF0YSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpLmZpbHRlcigodmFsdWUpID0+IGRhdGEuaW5kZXhPZih2YWx1ZSkgIT09IGRhdGEubGFzdEluZGV4T2YodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4ocGF0dGVybk5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4geWllbGQgZ3Jvay5kYXBpLnVzZXJzLmN1cnJlbnQoKS50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBsYXN0TmFtZV0gPSBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gKHVzZXIuZmlyc3ROYW1lICE9IGZpcnN0TmFtZSB8fCB1c2VyLmxhc3ROYW1lICE9IGxhc3ROYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRTaG9ydE5hbWUocGF0dGVybk5hbWUpIHtcbiAgICBsZXQgZmlyc3QgPSBwYXR0ZXJuTmFtZS5sZW5ndGggKyAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm5OYW1lLnNsaWNlKDAsIGZpcnN0IC0gMSk7XG59XG5mdW5jdGlvbiBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSkge1xuICAgIGxldCBmaXJzdCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBbJycsICcnXSA6IHBhdHRlcm5OYW1lLnNsaWNlKGZpcnN0ICsgOSwgcGF0dGVybk5hbWUubGVuZ3RoIC0gMSkuc3BsaXQoJyAnKS5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZVNlcXVlbmNlKHNlcXVlbmNlLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGxldCBtYWluU2VxdWVuY2UgPSBzZXF1ZW5jZS5yZXBsYWNlKC9bQVVHQ10vZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICBjb25zdCBpbmRleE9mU3ltYm9sID0gYXhvbGFic01hcFsnUk5BJ11bJ3N5bWJvbHMnXS5pbmRleE9mKHgpO1xuICAgICAgICBsZXQgc3ltYm9sID0gYXhvbGFic01hcFtiYXNlc1tpXS52YWx1ZV1bJ3N5bWJvbHMnXVtpbmRleE9mU3ltYm9sXTtcbiAgICAgICAgaWYgKGJhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJykge1xuICAgICAgICAgICAgaWYgKGkgPCBzZXF1ZW5jZS5sZW5ndGggLyAyICYmIGJhc2VzW2kgKyAxXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgc3ltYm9sID0gc3ltYm9sICsgeCArICdmJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGkgPiBzZXF1ZW5jZS5sZW5ndGggLyAyICYmIGJhc2VzW2kgLSAxXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgc3ltYm9sID0geCArICdmJyArIHN5bWJvbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHB0b0xpbmthZ2VzW2ldLnZhbHVlKSA/IHN5bWJvbCArICdzJyA6IHN5bWJvbDtcbiAgICB9KTtcbiAgICBpZiAobWFpblNlcXVlbmNlLnNsaWNlKDAsIDUpLnNwbGl0KCdtVScpLmxlbmd0aCA9PSAzKVxuICAgICAgICBtYWluU2VxdWVuY2UgPSAnKHV1KScgKyBtYWluU2VxdWVuY2Uuc2xpY2UoNCk7XG4gICAgaWYgKG1haW5TZXF1ZW5jZS5zbGljZShtYWluU2VxdWVuY2UubGVuZ3RoIC0gNykuc3BsaXQoJ21VJykubGVuZ3RoID09IDMpXG4gICAgICAgIG1haW5TZXF1ZW5jZSA9IG1haW5TZXF1ZW5jZS5zbGljZSgwLCBtYWluU2VxdWVuY2UubGVuZ3RoIC0gNCkgKyAnKHV1KSc7XG4gICAgcmV0dXJuIHN0YXJ0TW9kaWZpY2F0aW9uLnZhbHVlICsgKGZpcnN0UHRvRXhpc3QgPyAncycgOiAnJykgKyBtYWluU2VxdWVuY2UgKyBlbmRNb2RpZmljYXRpb24udmFsdWU7XG59XG5mdW5jdGlvbiBhZGRDb2x1bW5XaXRoSWRzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgcGF0dGVybk5hbWUpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnSUQgJyArIHBhdHRlcm5OYW1lO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBncm9rLnNoZWxsLnRhYmxlKHRhYmxlTmFtZSkuY29sdW1ucztcbiAgICBpZiAoY29sdW1ucy5jb250YWlucyhuYW1lT2ZOZXdDb2x1bW4pKVxuICAgICAgICBjb2x1bW5zLnJlbW92ZShuYW1lT2ZOZXdDb2x1bW4pO1xuICAgIGNvbnN0IGNvbHVtbldpdGhJZHMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiB7XG4gICAgICAgIHJldHVybiAoY29sdW1uV2l0aElkcy5nZXRTdHJpbmcoaSkgPT0gJycpID8gJycgOiBjb2x1bW5XaXRoSWRzLmdldChpKSArICdfJyArIHBhdHRlcm5OYW1lO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVOYW1lLCBjb2x1bW5OYW1lLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnQXhvbGFicyAnICsgY29sdW1uTmFtZTtcbiAgICBjb25zdCBjb2x1bW5zID0gZ3Jvay5zaGVsbC50YWJsZSh0YWJsZU5hbWUpLmNvbHVtbnM7XG4gICAgaWYgKGNvbHVtbnMuY29udGFpbnMobmFtZU9mTmV3Q29sdW1uKSlcbiAgICAgICAgY29sdW1ucy5yZW1vdmUobmFtZU9mTmV3Q29sdW1uKTtcbiAgICBjb25zdCBjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMuZ2V0U3RyaW5nKGkpID09ICcnID9cbiAgICAgICAgICAgICcnIDpcbiAgICAgICAgICAgIHRyYW5zbGF0ZVNlcXVlbmNlKGNvbHVtbldpdGhJbnB1dFNlcXVlbmNlcy5nZXRTdHJpbmcoaSksIGJhc2VzLCBwdG9MaW5rYWdlcywgc3RhcnRNb2RpZmljYXRpb24sIGVuZE1vZGlmaWNhdGlvbiwgZmlyc3RQdG9FeGlzdCk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXhvbGFic1BhdHRlcm4oKSB7XG4gICAgY29uc3QgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyA9IFtkZWZhdWx0QmFzZV07XG4gICAgbGV0IG1heGltYWxTc0xlbmd0aCA9IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aDtcbiAgICBsZXQgbWF4aW1hbEFzTGVuZ3RoID0gZGVmYXVsdFNlcXVlbmNlTGVuZ3RoO1xuICAgIGZ1bmN0aW9uIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCkge1xuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBhc1B0b0xpbmthZ2VzID0gYXNQdG9MaW5rYWdlcy5jb25jYXQoQXJyYXkobWF4aW1hbEFzTGVuZ3RoIC0gYXNCYXNlcy5sZW5ndGgpLmZpbGwoZnVsbHlQdG8pKTtcbiAgICAgICAgYXNCYXNlcyA9IGFzQmFzZXMuY29uY2F0KEFycmF5KG1heGltYWxBc0xlbmd0aCAtIGFzQmFzZXMubGVuZ3RoKS5maWxsKHNlcXVlbmNlQmFzZSkpO1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzTGVuZ3RoLnZhbHVlOyBpKyspIHtcbiAgICAgICAgICAgIGFzUHRvTGlua2FnZXNbaV0gPSB1aS5ib29sSW5wdXQoJycsIGFzUHRvTGlua2FnZXNbaV0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhc0Jhc2VzW2ldID0gdWkuY2hvaWNlSW5wdXQoJycsIGFzQmFzZXNbaV0udmFsdWUsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0Rpdi5hcHBlbmQodWkuYm9vbElucHV0KHYsIHRydWUsIChib29sVikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvb2xWKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZih2LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnJvb3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVBc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlcisrO1xuICAgICAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcy5hcHBlbmQodWkuZGl2SChbXG4gICAgICAgICAgICAgICAgdWkuZGl2KFt1aS5sYWJlbChhc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJyA/ICcnIDogU3RyaW5nKG51Y2xlb3RpZGVDb3VudGVyKSldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jazc1KFthc0Jhc2VzW2ldXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2KFthc1B0b0xpbmthZ2VzW2ldXSksXG4gICAgICAgICAgICBdLCB7IHN0eWxlOiB7IGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCkge1xuICAgICAgICBzc01vZGlmaWNhdGlvbkl0ZW1zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBzc1B0b0xpbmthZ2VzID0gc3NQdG9MaW5rYWdlcy5jb25jYXQoQXJyYXkobWF4aW1hbFNzTGVuZ3RoIC0gc3NCYXNlcy5sZW5ndGgpLmZpbGwoZnVsbHlQdG8pKTtcbiAgICAgICAgc3NCYXNlcyA9IHNzQmFzZXMuY29uY2F0KEFycmF5KG1heGltYWxTc0xlbmd0aCAtIHNzQmFzZXMubGVuZ3RoKS5maWxsKHNlcXVlbmNlQmFzZSkpO1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzTGVuZ3RoLnZhbHVlOyBpKyspIHtcbiAgICAgICAgICAgIHNzUHRvTGlua2FnZXNbaV0gPSB1aS5ib29sSW5wdXQoJycsIHNzUHRvTGlua2FnZXNbaV0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzc0Jhc2VzW2ldID0gdWkuY2hvaWNlSW5wdXQoJycsIHNzQmFzZXNbaV0udmFsdWUsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0Rpdi5hcHBlbmQodWkuYm9vbElucHV0KHYsIHRydWUsIChib29sVikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvb2xWKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZih2LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnJvb3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVTc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlQ291bnRlcisrO1xuICAgICAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcy5hcHBlbmQodWkuZGl2SChbXG4gICAgICAgICAgICAgICAgdWkuZGl2KFt1aS5sYWJlbChzc0Jhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJyA/ICcnIDogU3RyaW5nKG51Y2xlb3RpZGVDb3VudGVyKSldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jazc1KFtzc0Jhc2VzW2ldXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2KFtzc1B0b0xpbmthZ2VzW2ldXSksXG4gICAgICAgICAgICBdLCB7IHN0eWxlOiB7IGFsaWduSXRlbXM6ICdjZW50ZXInIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSB7XG4gICAgICAgIGlmIChzc0xlbmd0aC52YWx1ZSA8IG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoICYmIGFzTGVuZ3RoLnZhbHVlIDwgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzc0xlbmd0aC52YWx1ZSA+IG1heGltYWxTc0xlbmd0aClcbiAgICAgICAgICAgICAgICBtYXhpbWFsU3NMZW5ndGggPSBzc0xlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChhc0xlbmd0aC52YWx1ZSA+IG1heGltYWxBc0xlbmd0aClcbiAgICAgICAgICAgICAgICBtYXhpbWFsQXNMZW5ndGggPSBhc0xlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICB1cGRhdGVBc01vZGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICB1cGRhdGVJbnB1dEV4YW1wbGVzKCk7XG4gICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdWkuZGlhbG9nKCdTZXF1ZW5jZSBsZW5ndGggaXMgb3V0IG9mIHJhbmdlJylcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1NlcXVlbmNlIGxlbmd0aCBzaG91bGQgYmUgbGVzcyB0aGFuICcgK1xuICAgICAgICAgICAgICAgIG1heGltYWxWYWxpZFNlcXVlbmNlTGVuZ3RoLnRvU3RyaW5nKCkgKyAnIGR1ZSB0byBVSSBjb25zdHJhaW5zLicpKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUGxlYXNlIGNoYW5nZSBzZXF1ZW5jZSBsZW5ndGggaW4gb3JkZXIgdG8gZGVmaW5lIG5ldyBwYXR0ZXJuLicpKVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlUHRvKG5ld1B0b1ZhbHVlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NQdG9MaW5rYWdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNzUHRvTGlua2FnZXNbaV0udmFsdWUgPSBuZXdQdG9WYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc1B0b0xpbmthZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgYXNQdG9MaW5rYWdlc1tpXS52YWx1ZSA9IG5ld1B0b1ZhbHVlO1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQmFzZXMobmV3QmFzaXNWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzc0Jhc2VzW2ldLnZhbHVlID0gbmV3QmFzaXNWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0Jhc2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgYXNCYXNlc1tpXS52YWx1ZSA9IG5ld0Jhc2lzVmFsdWU7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVJbnB1dEV4YW1wbGVzKCkge1xuICAgICAgICBpZiAoaW5wdXRTc0NvbHVtbi52YWx1ZSA9PSAnJylcbiAgICAgICAgICAgIHNzSW5wdXRFeGFtcGxlLnZhbHVlID0gZ2VuZXJhdGVFeGFtcGxlKHNzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpO1xuICAgICAgICBpZiAoY3JlYXRlQXNTdHJhbmQudmFsdWUgJiYgaW5wdXRBc0NvbHVtbi52YWx1ZSA9PSAnJylcbiAgICAgICAgICAgIGFzSW5wdXRFeGFtcGxlLnZhbHVlID0gZ2VuZXJhdGVFeGFtcGxlKGFzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPdXRwdXRFeGFtcGxlcygpIHtcbiAgICAgICAgc3NPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzRml2ZU1vZGlmaWNhdGlvbiwgc3NUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSkge1xuICAgICAgICAgICAgYXNPdXRwdXRFeGFtcGxlLnZhbHVlID0gdHJhbnNsYXRlU2VxdWVuY2UoYXNJbnB1dEV4YW1wbGUudmFsdWUsIGFzQmFzZXMsIGFzUHRvTGlua2FnZXMsIGFzRml2ZU1vZGlmaWNhdGlvbiwgYXNUaHJlZU1vZGlmaWNhdGlvbiwgZmlyc3RBc1B0by52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlU3ZnU2NoZW1lKCkge1xuICAgICAgICBzdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHN2Z0Rpdi5hcHBlbmQodWkuc3BhbihbXG4gICAgICAgICAgICBkcmF3QXhvbGFic1BhdHRlcm4oZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSksIGNyZWF0ZUFzU3RyYW5kLnZhbHVlLCBzc0Jhc2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBhc0Jhc2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLCBbZmlyc3RTc1B0by52YWx1ZV0uY29uY2F0KHNzUHRvTGlua2FnZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBbZmlyc3RBc1B0by52YWx1ZV0uY29uY2F0KGFzUHRvTGlua2FnZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLCBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLCBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsIGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSwgY29tbWVudC52YWx1ZSwgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyksXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGV0ZWN0RGVmYXVsdEJhc2lzKGFycmF5KSB7XG4gICAgICAgIGNvbnN0IG1vZGVNYXAgPSB7fTtcbiAgICAgICAgbGV0IG1heEVsID0gYXJyYXlbMF07XG4gICAgICAgIGxldCBtYXhDb3VudCA9IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gYXJyYXlbaV07XG4gICAgICAgICAgICBpZiAobW9kZU1hcFtlbF0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICBtb2RlTWFwW2VsXSA9IDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9kZU1hcFtlbF0rKztcbiAgICAgICAgICAgIGlmIChtb2RlTWFwW2VsXSA+IG1heENvdW50KSB7XG4gICAgICAgICAgICAgICAgbWF4RWwgPSBlbDtcbiAgICAgICAgICAgICAgICBtYXhDb3VudCA9IG1vZGVNYXBbZWxdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXhFbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkobmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdMb2FkaW5nIHBhdHRlcm4uLi4nKTtcbiAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSkudGhlbigoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGVudGl0aWVzW25ld05hbWVdKTtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUJhc2UudmFsdWUgPSBkZXRlY3REZWZhdWx0QmFzaXMob2JqWydhc0Jhc2VzJ10uY29uY2F0KG9ialsnc3NCYXNlcyddKSk7XG4gICAgICAgICAgICAgICAgY3JlYXRlQXNTdHJhbmQudmFsdWUgPSAob2JqWydhc0Jhc2VzJ10ubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gbmV3TmFtZTtcbiAgICAgICAgICAgICAgICBzc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ3NzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc3NCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ3NzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBhc0Jhc2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpbJ2FzQmFzZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYXNCYXNlcy5wdXNoKHVpLmNob2ljZUlucHV0KCcnLCBvYmpbJ2FzQmFzZXMnXVtpXSwgYmFzZUNob2ljZXMpKTtcbiAgICAgICAgICAgICAgICBmaXJzdFNzUHRvLnZhbHVlID0gb2JqWydzc1B0b0xpbmthZ2VzJ11bMF07XG4gICAgICAgICAgICAgICAgc3NQdG9MaW5rYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2JqWydzc1B0b0xpbmthZ2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHNzUHRvTGlua2FnZXMucHVzaCh1aS5ib29sSW5wdXQoJycsIG9ialsnc3NQdG9MaW5rYWdlcyddW2ldKSk7XG4gICAgICAgICAgICAgICAgZmlyc3RBc1B0by52YWx1ZSA9IG9ialsnYXNQdG9MaW5rYWdlcyddWzBdO1xuICAgICAgICAgICAgICAgIGFzUHRvTGlua2FnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9ialsnYXNQdG9MaW5rYWdlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBhc1B0b0xpbmthZ2VzLnB1c2godWkuYm9vbElucHV0KCcnLCBvYmpbJ2FzUHRvTGlua2FnZXMnXVtpXSkpO1xuICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnZhbHVlID0gb2JqWydzc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gb2JqWydhc0Jhc2VzJ10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ3NzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGFzVGhyZWVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzVGhyZWVNb2RpZmljYXRpb24nXTtcbiAgICAgICAgICAgICAgICBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUgPSBvYmpbJ2FzRml2ZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQudmFsdWUgPSBvYmpbJ2NvbW1lbnQnXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGkuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSkge1xuICAgICAgICBjb25zdCBjb2wgPSB0YWJsZXMudmFsdWUuZ2V0Q29sKGNvbE5hbWUpO1xuICAgICAgICBsZXQgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbC5nZXQoaSAtIDEpLmxlbmd0aCAhPSBjb2wuZ2V0KGkpLmxlbmd0aCAmJiBjb2wuZ2V0KGkpLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFsbExlbmd0aHNBcmVUaGVTYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coJ1NlcXVlbmNlcyBsZW5ndGhzIG1pc21hdGNoJyk7XG4gICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnVGhlIHNlcXVlbmNlIGxlbmd0aCBzaG91bGQgbWF0Y2ggdGhlIG51bWJlciBvZiBSYXcgc2VxdWVuY2VzIGluIHRoZSBpbnB1dCBmaWxlJykpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdcXCdBREQgQ09MVU1OXFwnIHRvIHNlZSBzZXF1ZW5jZXMgbGVuZ3RocycpKVxuICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ0FERCBDT0xVTU4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGFibGVzLnZhbHVlLmNvbHVtbnMuYWRkTmV3SW50KCdTZXF1ZW5jZXMgbGVuZ3RocyBpbiAnICsgY29sTmFtZSkuaW5pdCgoaikgPT4gY29sLmdldChqKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnQ29sdW1uIHdpdGggbGVuZ3RocyBhZGRlZCB0byBcXCcnICsgdGFibGVzLnZhbHVlLm5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wuZ2V0KDApICE9IHNzTGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gdWkuZGlhbG9nKCdMZW5ndGggd2FzIHVwZGF0ZWQgYnkgdmFsdWUgdG8gZnJvbSBpbXBvcnRlZCBmaWxlJyk7XG4gICAgICAgICAgICBkLmFkZCh1aS5kaXZUZXh0KCdMYXRlc3QgbW9kaWZpY2F0aW9ucyBtYXkgbm90IHRha2UgZWZmZWN0IGR1cmluZyB0cmFuc2xhdGlvbicpKVxuICAgICAgICAgICAgICAgIC5vbk9LKCgpID0+IGdyb2suc2hlbGwuaW5mbygnTGVuZ3RocyBjaGFuZ2VkJykpLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsTGVuZ3Roc0FyZVRoZVNhbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBncm9rLmRhcGkudXNlcnMuY3VycmVudCgpLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyAoY3JlYXRlZCBieSAnICsgdXNlci5maXJzdE5hbWUgKyAnICcgKyB1c2VyLmxhc3ROYW1lICsgJyknO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyVXNlck5hbWUgPSB5aWVsZCBnZXRDdXJyZW50VXNlck5hbWUoKTtcbiAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IChzYXZlQXMuc3RyaW5nVmFsdWUuaW5jbHVkZXMoJyhjcmVhdGVkIGJ5ICcpKSA/XG4gICAgICAgICAgICAgICAgZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSkgKyBjdXJyVXNlck5hbWUgOlxuICAgICAgICAgICAgICAgIHNhdmVBcy5zdHJpbmdWYWx1ZSArIGN1cnJVc2VyTmFtZTtcbiAgICAgICAgICAgIHJldHVybiBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnBvc3RWYWx1ZSh1c2VyU3RvcmFnZUtleSwgc2F2ZUFzLnZhbHVlLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgJ3NzQmFzZXMnOiBzc0Jhc2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICdhc0Jhc2VzJzogYXNCYXNlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAnc3NQdG9MaW5rYWdlcyc6IFtmaXJzdFNzUHRvLnZhbHVlXS5jb25jYXQoc3NQdG9MaW5rYWdlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksXG4gICAgICAgICAgICAgICAgJ2FzUHRvTGlua2FnZXMnOiBbZmlyc3RBc1B0by52YWx1ZV0uY29uY2F0KGFzUHRvTGlua2FnZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICdzc1RocmVlTW9kaWZpY2F0aW9uJzogc3NUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnc3NGaXZlTW9kaWZpY2F0aW9uJzogc3NGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdhc1RocmVlTW9kaWZpY2F0aW9uJzogYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAnYXNGaXZlTW9kaWZpY2F0aW9uJzogYXNGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdjb21tZW50JzogY29tbWVudC52YWx1ZSxcbiAgICAgICAgICAgIH0pLCBmYWxzZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIHNhdmVBcy52YWx1ZSArICdcXCcgd2FzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCEnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQYXR0ZXJuc0xpc3QoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLmdldCh1c2VyU3RvcmFnZUtleSwgZmFsc2UpLnRoZW4oKGVudGl0aWVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHN0TXkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsc3RPdGhlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBkaXNwbGF5IHNob3J0IG5hbWUsIGJ1dCB1c2UgbG9uZyBmb3IgcXVlcnlpbmcgdXNlcmRhdGFTdG9yYWdlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnQgb2YgT2JqZWN0LmtleXMoZW50aXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKGVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBsc3RPdGhlcnMucHVzaChlbnQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsc3RNeS5wdXNoKGVudCk7IC8vZ2V0U2hvcnROYW1lKGVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbG9hZFBhdHRlcm4gPSB1aS5jaG9pY2VJbnB1dCgnTG9hZCBQYXR0ZXJuJywgJycsIGxzdE15LCAodikgPT4gcGFyc2VQYXR0ZXJuQW5kVXBkYXRlVWkodikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15T3JPdGhlcnNQYXR0ZXJuTGlzdCA9IHVpLmNob2ljZUlucHV0KCcnLCAnTWluZScsIFsnTWluZScsICdPdGhlcnMnXSwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB2ID09ICdNaW5lJyA/IGxzdE15IDogbHN0T3RoZXJzO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybiA9IHVpLmNob2ljZUlucHV0KCdMb2FkIFBhdHRlcm4nLCAnJywgY3VycmVudExpc3QsICh2KSA9PiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaSh2KSk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKG15T3JPdGhlcnNQYXR0ZXJuTGlzdC5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKGxvYWRQYXR0ZXJuLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5pbnB1dC5zdHlsZS5tYXhXaWR0aCA9ICcxMDBweCc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnNldFRvb2x0aXAoJ0FwcGx5IEV4aXN0aW5nIFBhdHRlcm4nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmFwcGVuZChsb2FkUGF0dGVybi5yb290KTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ3RyYXNoLWFsdCcsICgpID0+IHsgfSksICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhdHRlcm4udmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDaG9vc2UgcGF0dGVybiB0byBkZWxldGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5aWVsZCBpc0N1cnJlbnRVc2VyQ3JlYXRlZFRoaXNQYXR0ZXJuKHNhdmVBcy52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2Fubm90IGRlbGV0ZSBwYXR0ZXJuLCBjcmVhdGVkIGJ5IG90aGVyIHVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIGxvYWRQYXR0ZXJuLnZhbHVlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgbG9hZFBhdHRlcm4udmFsdWUgKyAnXFwnIGRlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZChteU9yT3RoZXJzUGF0dGVybkxpc3QuaW5wdXQpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKGxvYWRQYXR0ZXJuLmlucHV0KTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uaW5wdXQuc3R5bGUubWF4V2lkdGggPSAnMTAwcHgnO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnNldFRvb2x0aXAoJ0FwcGx5IEV4aXN0aW5nIFBhdHRlcm4nKTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5hcHBlbmQobG9hZFBhdHRlcm4ucm9vdCk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgndHJhc2gtYWx0JywgKCkgPT4geyB9KSwgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRQYXR0ZXJuLnZhbHVlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDaG9vc2UgcGF0dGVybiB0byBkZWxldGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oc2F2ZUFzLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nhbm5vdCBkZWxldGUgcGF0dGVybiwgY3JlYXRlZCBieSBvdGhlciB1c2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgbG9hZFBhdHRlcm4udmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gXFwnJyArIGxvYWRQYXR0ZXJuLnZhbHVlICsgJ1xcJyBkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNhdmVQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKVxuICAgICAgICAgICAgICAgIC50aGVuKChlbnRpdGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdGllcykuaW5jbHVkZXMoc2F2ZUFzLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coJ1BhdHRlcm4gYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgJChkaWFsb2cuZ2V0QnV0dG9uKCdPSycpKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdQYXR0ZXJuIG5hbWUgXFwnJyArIHNhdmVBcy52YWx1ZSArICdcXCcgYWxyZWFkeSBleGlzdHMuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1JlcGxhY2UgcGF0dGVybj8nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ1lFUycsICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBzYXZlQXMudmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTc0NvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRBc0NvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRJZENvbHVtbkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3Qgc3NNb2RpZmljYXRpb25JdGVtcyA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25JdGVtcyA9IHVpLmRpdihbXSk7XG4gICAgY29uc3Qgc3ZnRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc0V4YW1wbGVEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFwcEF4b2xhYnNEZXNjcmlwdGlvbiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgbG9hZFBhdHRlcm5EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzTW9kaWZpY2F0aW9uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBmaXJzdEFzUHRvRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYgPSB1aS5kaXZIKFt1aS5ib29sSW5wdXQoZGVmYXVsdEJhc2UsIHRydWUsICh2KSA9PiB7XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyhkZWZhdWx0QmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaChkZWZhdWx0QmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZihkZWZhdWx0QmFzZSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgfSkucm9vdF0pO1xuICAgIGxldCBzc0Jhc2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmNob2ljZUlucHV0KCcnLCBkZWZhdWx0QmFzZSwgYmFzZUNob2ljZXMpKTtcbiAgICBsZXQgYXNCYXNlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5jaG9pY2VJbnB1dCgnJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzKSk7XG4gICAgbGV0IHNzUHRvTGlua2FnZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuYm9vbElucHV0KCcnLCBkZWZhdWx0UHRvKSk7XG4gICAgbGV0IGFzUHRvTGlua2FnZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuYm9vbElucHV0KCcnLCBkZWZhdWx0UHRvKSk7XG4gICAgY29uc3Qgc3NMZW5ndGggPSB1aS5pbnRJbnB1dCgnU1MgTGVuZ3RoJywgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoLCAoKSA9PiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkpO1xuICAgIHNzTGVuZ3RoLnNldFRvb2x0aXAoJ0xlbmd0aCBvZiBzZW5zZSBzdHJhbmQsIGluY2x1ZGluZyBvdmVyaGFuZ3MnKTtcbiAgICBjb25zdCBhc0xlbmd0aCA9IHVpLmludElucHV0KCdBUyBMZW5ndGgnLCBkZWZhdWx0U2VxdWVuY2VMZW5ndGgsICgpID0+IHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKSk7XG4gICAgYXNMZW5ndGguc2V0VG9vbHRpcCgnTGVuZ3RoIG9mIHNlbnNlIHN0cmFuZCwgaW5jbHVkaW5nIG92ZXJoYW5ncycpO1xuICAgIGNvbnN0IGFzTGVuZ3RoRGl2ID0gdWkuZGl2KFthc0xlbmd0aC5yb290XSk7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGFsbExlbmd0aHNBcmVUaGVTYW1lID0gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKTtcbiAgICAgICAgY29uc3QgZmlyc3RTZXF1ZW5jZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSkuZ2V0KDApO1xuICAgICAgICBpZiAoYWxsTGVuZ3Roc0FyZVRoZVNhbWUgJiYgZmlyc3RTZXF1ZW5jZS5sZW5ndGggIT0gc3NMZW5ndGgudmFsdWUpXG4gICAgICAgICAgICBzc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTGVuZ3Roc0FyZVRoZVNhbWUgPSBjaGVja1doZXRoZXJBbGxWYWx1ZXNJbkNvbHVtbkhhdmVUaGVTYW1lTGVuZ3RoKGNvbE5hbWUpO1xuICAgICAgICBjb25zdCBmaXJzdFNlcXVlbmNlID0gdGFibGVzLnZhbHVlLmdldENvbChjb2xOYW1lKS5nZXQoMCk7XG4gICAgICAgIGlmIChhbGxMZW5ndGhzQXJlVGhlU2FtZSAmJiBmaXJzdFNlcXVlbmNlLmxlbmd0aCAhPSBhc0xlbmd0aC52YWx1ZSlcbiAgICAgICAgICAgIGFzTGVuZ3RoLnZhbHVlID0gdGFibGVzLnZhbHVlLmdldENvbChjb2xOYW1lKS5nZXQoMCkubGVuZ3RoO1xuICAgICAgICBhc0lucHV0RXhhbXBsZS52YWx1ZSA9IGZpcnN0U2VxdWVuY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWRzQ29sdW1uKGNvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGFibGVzLnZhbHVlLmdldENvbChjb2xOYW1lKTtcbiAgICAgICAgaWYgKGNvbC50eXBlICE9IERHLlRZUEUuSU5UKVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC5lcnJvcignQ29sdW1uIHNob3VsZCBjb250YWluIGludGVnZXJzIG9ubHknKTtcbiAgICAgICAgZWxzZSBpZiAoY29sLmNhdGVnb3JpZXMuZmlsdGVyKChlKSA9PiBlICE9ICcnKS5sZW5ndGggPCBjb2wudG9MaXN0KCkuZmlsdGVyKChlKSA9PiBlICE9ICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBmaW5kRHVwbGljYXRlcyhjb2wuZ2V0UmF3RGF0YSgpKTtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnTm9uLXVuaXF1ZSBJRHMnKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUHJlc3MgXFwnT0tcXCcgdG8gc2VsZWN0IHJvd3Mgd2l0aCBub24tdW5pcXVlIHZhbHVlcycpKVxuICAgICAgICAgICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0YWJsZXMudmFsdWUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbml0KChpKSA9PiBkdXBsaWNhdGVzLmluZGV4T2YoY29sLmdldChpKSkgPiAtMSk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUm93cyBhcmUgc2VsZWN0ZWQgaW4gdGFibGUgXFwnJyArIHRhYmxlcy52YWx1ZS5uYW1lICsgJ1xcJycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlcyA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlcycsIGdyb2suc2hlbGwudGFibGVzWzBdLCBncm9rLnNoZWxsLnRhYmxlcywgKHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICAgICAgc3NWYXIgPSBjb2xOYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRTc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRTc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRBc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdBUyBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICAgICAgYXNWYXIgPSBjb2xOYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgaW5wdXRBc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRBc0NvbHVtbi5yb290KTtcbiAgICAgICAgY29uc3QgaW5wdXRJZENvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdJRCBDb2x1bW4nLCAnJywgdC5jb2x1bW5zLm5hbWVzKCksIChjb2xOYW1lKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKTtcbiAgICAgICAgICAgIGlkVmFyID0gY29sTmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0SWRDb2x1bW5EaXYuYXBwZW5kKGlucHV0SWRDb2x1bW4ucm9vdCk7XG4gICAgfSk7XG4gICAgbGV0IHNzVmFyID0gJyc7XG4gICAgY29uc3QgaW5wdXRTc0NvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdTUyBDb2x1bW4nLCAnJywgW10sIChjb2xOYW1lKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlU3NDb2x1bW4oY29sTmFtZSk7XG4gICAgICAgIHNzVmFyID0gY29sTmFtZTtcbiAgICB9KTtcbiAgICBpbnB1dFNzQ29sdW1uRGl2LmFwcGVuZChpbnB1dFNzQ29sdW1uLnJvb3QpO1xuICAgIGxldCBhc1ZhciA9ICcnO1xuICAgIGNvbnN0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIFtdLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICBhc1ZhciA9IGNvbE5hbWU7XG4gICAgfSk7XG4gICAgaW5wdXRBc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRBc0NvbHVtbi5yb290KTtcbiAgICBsZXQgaWRWYXIgPSAnJztcbiAgICBjb25zdCBpbnB1dElkQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0lEIENvbHVtbicsICcnLCBbXSwgKGNvbE5hbWUpID0+IHtcbiAgICAgICAgdmFsaWRhdGVJZHNDb2x1bW4oY29sTmFtZSk7XG4gICAgICAgIGlkVmFyID0gY29sTmFtZTtcbiAgICB9KTtcbiAgICBpbnB1dElkQ29sdW1uRGl2LmFwcGVuZChpbnB1dElkQ29sdW1uLnJvb3QpO1xuICAgIHVwZGF0ZVBhdHRlcm5zTGlzdCgpO1xuICAgIGNvbnN0IHNlcXVlbmNlQmFzZSA9IHVpLmNob2ljZUlucHV0KCdTZXF1ZW5jZSBCYXNpcycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgdXBkYXRlQmFzZXModik7XG4gICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZnVsbHlQdG8gPSB1aS5ib29sSW5wdXQoJ0Z1bGx5IFBUTycsIGRlZmF1bHRQdG8sICh2KSA9PiB7XG4gICAgICAgIGZpcnN0U3NQdG8udmFsdWUgPSB2O1xuICAgICAgICBmaXJzdEFzUHRvLnZhbHVlID0gdjtcbiAgICAgICAgdXBkYXRlUHRvKHYpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0U3NQdG8gPSB1aS5ib29sSW5wdXQoJ0ZpcnN0IFNTIFBUTycsIGZ1bGx5UHRvLnZhbHVlLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgZmlyc3RTc1B0by5zZXRUb29sdGlwKCdwcyBsaW5rYWdlIGJlZm9yZSBmaXJzdCBudWNsZW90aWRlIG9mIHNlbnNlIHN0cmFuZCcpO1xuICAgIGNvbnN0IGZpcnN0QXNQdG8gPSB1aS5ib29sSW5wdXQoJ0ZpcnN0IEFTIFBUTycsIGZ1bGx5UHRvLnZhbHVlLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgZmlyc3RBc1B0by5zZXRUb29sdGlwKCdwcyBsaW5rYWdlIGJlZm9yZSBmaXJzdCBudWNsZW90aWRlIG9mIGFudGlzZW5zZSBzdHJhbmQnKTtcbiAgICBmaXJzdEFzUHRvRGl2LmFwcGVuZChmaXJzdEFzUHRvLnJvb3QpO1xuICAgIGNvbnN0IGNyZWF0ZUFzU3RyYW5kID0gdWkuYm9vbElucHV0KCdDcmVhdGUgQVMgU3RyYW5kJywgdHJ1ZSwgKHYpID0+IHtcbiAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLmhpZGRlbiA9ICghdik7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNMZW5ndGhEaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNNb2RpZmljYXRpb25EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgYXNFeGFtcGxlRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGZpcnN0QXNQdG9EaXYuaGlkZGVuID0gKCF2KTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfSk7XG4gICAgY3JlYXRlQXNTdHJhbmQuc2V0VG9vbHRpcCgnQ3JlYXRlIGFudGlzZW5zZSBzdHJhbmQgc2VjdGlvbnMgb24gU1ZHIGFuZCB0YWJsZSB0byB0aGUgcmlnaHQnKTtcbiAgICBjb25zdCBzYXZlQXMgPSB1aS50ZXh0SW5wdXQoJ1NhdmUgQXMnLCAnUGF0dGVybiBOYW1lJywgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIHNhdmVBcy5zZXRUb29sdGlwKCdOYW1lIE9mIE5ldyBQYXR0ZXJuJyk7XG4gICAgY29uc3Qgc3NUaHJlZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdTUyAzXFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIHNzVGhyZWVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBTUyAzXFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IHNzRml2ZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdTUyA1XFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIHNzRml2ZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIFNTIDVcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgY29uc3QgYXNUaHJlZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdBUyAzXFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGFzVGhyZWVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBBUyAzXFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IGFzRml2ZU1vZGlmaWNhdGlvbiA9IHVpLnN0cmluZ0lucHV0KCdBUyA1XFwnIE1vZGlmaWNhdGlvbicsICcnLCAoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGFzRml2ZU1vZGlmaWNhdGlvbi5zZXRUb29sdGlwKCdBZGRpdGlvbmFsIEFTIDVcXCcgTW9kaWZpY2F0aW9uJyk7XG4gICAgYXNNb2RpZmljYXRpb25EaXYuYXBwZW5kKGFzVGhyZWVNb2RpZmljYXRpb24ucm9vdCk7XG4gICAgYXNNb2RpZmljYXRpb25EaXYuYXBwZW5kKGFzRml2ZU1vZGlmaWNhdGlvbi5yb290KTtcbiAgICBjb25zdCBjb21tZW50ID0gdWkudGV4dElucHV0KCdDb21tZW50JywgJycsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBjb25zdCBzYXZlUGF0dGVybkJ1dHRvbiA9IHVpLmJ1dHRvbignU2F2ZScsICgpID0+IHtcbiAgICAgICAgaWYgKHNhdmVBcy52YWx1ZSAhPSAnJylcbiAgICAgICAgICAgIHNhdmVQYXR0ZXJuKCkudGhlbigocikgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIHNhdmVkJykpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB1aS5zdHJpbmdJbnB1dCgnRW50ZXIgTmFtZScsICcnKTtcbiAgICAgICAgICAgIHVpLmRpYWxvZygnUGF0dGVybiBOYW1lJylcbiAgICAgICAgICAgICAgICAuYWRkKG5hbWUucm9vdClcbiAgICAgICAgICAgICAgICAub25PSygoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gbmFtZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBzYXZlUGF0dGVybigpLnRoZW4oKHIpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBzYXZlZCcpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnZlcnRTZXF1ZW5jZUJ1dHRvbiA9IHVpLmJ1dHRvbignQ29udmVydCBTZXF1ZW5jZXMnLCAoKSA9PiB7XG4gICAgICAgIGlmIChzc1ZhciA9PSAnJyB8fCAoY3JlYXRlQXNTdHJhbmQudmFsdWUgJiYgYXNWYXIgPT0gJycpKVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdQbGVhc2Ugc2VsZWN0IHRhYmxlIGFuZCBjb2x1bW5zIG9uIHdoaWNoIHRvIGFwcGx5IHBhdHRlcm4nKTtcbiAgICAgICAgZWxzZSBpZiAoc3NMZW5ndGgudmFsdWUgIT0gc3NJbnB1dEV4YW1wbGUudmFsdWUubGVuZ3RoIHx8IGFzTGVuZ3RoLnZhbHVlICE9IGFzSW5wdXRFeGFtcGxlLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdWkuZGlhbG9nKCdMZW5ndGggTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdMZW5ndGggb2Ygc2VxdWVuY2VzIGluIGNvbHVtbnMgZG9lc25cXCd0IG1hdGNoIGVudGVyZWQgbGVuZ3RoLiBVcGRhdGUgbGVuZ3RoIHZhbHVlPycpKVxuICAgICAgICAgICAgICAgIC5hZGRCdXR0b24oJ1lFUycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woaW5wdXRTc0NvbHVtbi52YWx1ZSkuZ2V0U3RyaW5nKDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woaW5wdXRBc0NvbHVtbi52YWx1ZSkuZ2V0U3RyaW5nKDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpZFZhciAhPSAnJylcbiAgICAgICAgICAgICAgICBhZGRDb2x1bW5XaXRoSWRzKHRhYmxlcy52YWx1ZS5uYW1lLCBpZFZhciwgZ2V0U2hvcnROYW1lKHNhdmVBcy52YWx1ZSkpO1xuICAgICAgICAgICAgYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVzLnZhbHVlLm5hbWUsIHNzVmFyLCBzc0Jhc2VzLCBzc1B0b0xpbmthZ2VzLCBzc0ZpdmVNb2RpZmljYXRpb24sIHNzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVzLnZhbHVlLm5hbWUsIGFzVmFyLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0QXNQdG8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3Jvay5zaGVsbC52ID0gZ3Jvay5zaGVsbC5nZXRUYWJsZVZpZXcodGFibGVzLnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCgoY3JlYXRlQXNTdHJhbmQudmFsdWUpID8gJ0NvbHVtbnMgd2VyZScgOiAnQ29sdW1uIHdhcycpICtcbiAgICAgICAgICAgICAgICAnIGFkZGVkIHRvIHRhYmxlIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzc0lucHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnU2Vuc2UgU3RyYW5kJywgZ2VuZXJhdGVFeGFtcGxlKHNzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpKTtcbiAgICBjb25zdCBzc091dHB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJyAnLCB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKSk7XG4gICAgc3NJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIHNzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuZGlzYWJsZWQgPSAndHJ1ZSc7XG4gICAgc3NPdXRwdXRFeGFtcGxlLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ2NvcHknLCAoKSA9PiB7IH0pLCAoKSA9PiB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzc091dHB1dEV4YW1wbGUudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdTZXF1ZW5jZSB3YXMgY29waWVkIHRvIGNsaXBib2FyZCcpKTtcbiAgICAgICAgfSksXG4gICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgY29uc3QgYXNJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ0FudGlzZW5zZSBTdHJhbmQnLCBnZW5lcmF0ZUV4YW1wbGUoYXNMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSkpO1xuICAgIGNvbnN0IGFzT3V0cHV0RXhhbXBsZSA9IHVpLnRleHRJbnB1dCgnICcsIHRyYW5zbGF0ZVNlcXVlbmNlKGFzSW5wdXRFeGFtcGxlLnZhbHVlLCBhc0Jhc2VzLCBhc1B0b0xpbmthZ2VzLCBhc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGZpcnN0U3NQdG8udmFsdWUpKTtcbiAgICBhc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgYXNJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUubWluV2lkdGggPSBleGFtcGxlTWluV2lkdGg7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5kaXNhYmxlZCA9ICd0cnVlJztcbiAgICBhc091dHB1dEV4YW1wbGUucm9vdC5hcHBlbmQodWkuZGl2KFtcbiAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgnY29weScsICgpID0+IHsgfSksICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGFzT3V0cHV0RXhhbXBsZS52YWx1ZSkudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oJ1NlcXVlbmNlIHdhcyBjb3BpZWQgdG8gY2xpcGJvYXJkJykpO1xuICAgICAgICB9KSxcbiAgICBdLCAndWktaW5wdXQtb3B0aW9ucycpKTtcbiAgICBhc0V4YW1wbGVEaXYuYXBwZW5kKGFzSW5wdXRFeGFtcGxlLnJvb3QpO1xuICAgIGFzRXhhbXBsZURpdi5hcHBlbmQoYXNPdXRwdXRFeGFtcGxlLnJvb3QpO1xuICAgIHVwZGF0ZVVpRm9yTmV3U2VxdWVuY2VMZW5ndGgoKTtcbiAgICBjb25zdCBleGFtcGxlU2VjdGlvbiA9IHVpLmRpdihbXG4gICAgICAgIHVpLmgxKCdFeGFtcGxlJyksXG4gICAgICAgIHNzSW5wdXRFeGFtcGxlLnJvb3QsXG4gICAgICAgIHNzT3V0cHV0RXhhbXBsZS5yb290LFxuICAgICAgICBhc0V4YW1wbGVEaXYsXG4gICAgXSwgJ3VpLWZvcm0nKTtcbiAgICBjb25zdCBpbnB1dHNTZWN0aW9uID0gdWkuZGl2KFtcbiAgICAgICAgdWkuaDEoJ0lucHV0cycpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHRhYmxlcy5yb290LFxuICAgICAgICAgICAgaW5wdXRTc0NvbHVtbkRpdixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgaW5wdXRBc0NvbHVtbkRpdixcbiAgICAgICAgICAgIGlucHV0SWRDb2x1bW5EaXYsXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5idXR0b25zSW5wdXQoW1xuICAgICAgICAgICAgY29udmVydFNlcXVlbmNlQnV0dG9uLFxuICAgICAgICBdKSxcbiAgICBdLCAndWktZm9ybScpO1xuICAgIGNvbnN0IGRvd25sb2FkQnV0dG9uID0gdWkuYnV0dG9uKCdEb3dubG9hZCcsICgpID0+IHN2Zy5zYXZlU3ZnQXNQbmcoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215U3ZnJyksIHNhdmVBcy52YWx1ZSwgeyBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScgfSkpO1xuICAgIGNvbnN0IG1haW5TZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5ibG9jayhbXG4gICAgICAgICAgICBzdmdEaXYsXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgb3ZlcmZsb3dYOiAnc2Nyb2xsJyB9IH0pLFxuICAgICAgICBkb3dubG9hZEJ1dHRvbixcbiAgICAgICAgaXNFbnVtZXJhdGVNb2RpZmljYXRpb25zRGl2LFxuICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuaDEoJ1BhdHRlcm4nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmljb25GQSgncXVlc3Rpb24tY2lyY2xlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24uYXBwZW5kKGluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgcGFkZGluZzogJzJweCcgfSB9KSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzTGVuZ3RoLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc0xlbmd0aERpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlQmFzZS5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXMucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm5CdXR0b24sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFzU3RyYW5kLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxseVB0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTc1B0by5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBc1B0b0RpdixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzRml2ZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3NUaHJlZU1vZGlmaWNhdGlvbi5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNNb2RpZmljYXRpb25EaXYsXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBpbnB1dHNTZWN0aW9uLFxuICAgICAgICAgICAgZXhhbXBsZVNlY3Rpb24sXG4gICAgICAgIF0sIHsgc3R5bGU6IHsgZmxleFdyYXA6ICd3cmFwJyB9IH0pLFxuICAgIF0pO1xuICAgIGNvbnN0IHNzTW9kaWZpY2F0aW9uU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuaDEoJ1NlbnNlIFN0cmFuZCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnIycpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICB1aS5ibG9jazc1KFt1aS5kaXZUZXh0KCdNb2RpZmljYXRpb24nKV0pLFxuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCdQVE8nKV0sIHsgc3R5bGU6IHsgcGFkZGluZ1JpZ2h0OiAnOHB4JyB9IH0pLFxuICAgICAgICBdKSxcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcyxcbiAgICBdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmgxKCdBbnRpc2Vuc2UgU3RyYW5kJyksXG4gICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCcjJyldLCB7IHN0eWxlOiB7IHdpZHRoOiAnMjBweCcgfSB9KSxcbiAgICAgICAgICAgIHVpLmJsb2NrNzUoW3VpLmRpdlRleHQoJ01vZGlmaWNhdGlvbicpXSksXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJ1BUTycpXSwgeyBzdHlsZTogeyBwYWRkaW5nUmlnaHQ6ICc4cHgnIH0gfSksXG4gICAgICAgIF0pLFxuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLFxuICAgIF0pO1xuICAgIGNvbnN0IGluZm8gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnXFxuIEhvdyB0byBkZWZpbmUgbmV3IHBhdHRlcm46JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBDaG9vc2UgdGFibGUgYW5kIGNvbHVtbnMgd2l0aCBzZW5zZSBhbmQgYW50aXNlbnNlIHN0cmFuZHMnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMi4gQ2hvb3NlIGxlbmd0aHMgb2YgYm90aCBzdHJhbmRzIGJ5IGVkaXRpbmcgY2hlY2tib3hlcyBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCczLiBDaG9vc2UgYmFzaXMgYW5kIFBUTyBzdGF0dXMgZm9yIGVhY2ggbnVjbGVvdGlkZScpLFxuICAgICAgICB1aS5kaXZUZXh0KCc0LiBTZXQgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGZvciBzZXF1ZW5jZSBlZGdlcycpLFxuICAgICAgICB1aS5kaXZUZXh0KCc1LiBQcmVzcyBcXCdDb252ZXJ0IFNlcXVlbmNlc1xcJyBidXR0b24nKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnVGhpcyB3aWxsIGFkZCB0aGUgcmVzdWx0IGNvbHVtbihzKSB0byB0aGUgcmlnaHQgb2YgdGhlIHRhYmxlJyksXG4gICAgXSwgJ0NyZWF0ZSBhbmQgYXBwbHkgQXhvbGFicyB0cmFuc2xhdGlvbiBwYXR0ZXJucy4nKTtcbiAgICByZXR1cm4gdWkuc3BsaXRIKFtcbiAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgIGFwcEF4b2xhYnNEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1haW5TZWN0aW9uLFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuYm94KHVpLmRpdkgoW1xuICAgICAgICAgICAgc3NNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICAgICAgYXNNb2RpZmljYXRpb25TZWN0aW9uLFxuICAgICAgICBdKSwgeyBzdHlsZTogeyBtYXhXaWR0aDogJzM2MHB4JyB9IH0pLFxuICAgIF0pO1xufVxuIiwiaW1wb3J0IHsgYXhvbGFic01hcCB9IGZyb20gJy4vY29uc3RhbnRzJztcbi8vIGh0dHBzOi8vdXhkZXNpZ24uY2Mvc3Rhci1yYXRpbmctbWFrZS1zdmctZ3JlYXQtYWdhaW4tZDRjZTQ3MzEzNDdlXG5mdW5jdGlvbiBnZXRQb2ludHNUb0RyYXdTdGFyKGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICBjb25zdCBpbm5lckNpcmNsZVBvaW50cyA9IDU7IC8vIGEgNSBwb2ludCBzdGFyXG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSAxNSAvIGlubmVyQ2lyY2xlUG9pbnRzO1xuICAgIGNvbnN0IGlubmVyT3V0ZXJSYWRpdXNSYXRpbyA9IDI7IC8vIG91dHRlciBjaXJjbGUgaXMgeDIgdGhlIGlubmVyXG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBpbm5lclJhZGl1cyAqIGlubmVyT3V0ZXJSYWRpdXNSYXRpbztcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEkgLyBpbm5lckNpcmNsZVBvaW50cztcbiAgICBjb25zdCBhbmdsZU9mZnNldFRvQ2VudGVyU3RhciA9IDYwO1xuICAgIGNvbnN0IHRvdGFsTnVtYmVyT2ZQb2ludHMgPSBpbm5lckNpcmNsZVBvaW50cyAqIDI7IC8vIDEwIGluIGEgNS1wb2ludHMgc3RhclxuICAgIGxldCBwb2ludHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsTnVtYmVyT2ZQb2ludHM7IGkrKykge1xuICAgICAgICBjb25zdCByID0gKGkgJSAyID09IDApID8gb3V0ZXJSYWRpdXMgOiBpbm5lclJhZGl1cztcbiAgICAgICAgY29uc3QgY3VycmVudFggPSBjZW50ZXJYICsgTWF0aC5jb3MoaSAqIGFuZ2xlICsgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIpICogcjtcbiAgICAgICAgY29uc3QgY3VycmVudFkgPSBjZW50ZXJZICsgTWF0aC5zaW4oaSAqIGFuZ2xlICsgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIpICogcjtcbiAgICAgICAgcG9pbnRzICs9IGN1cnJlbnRYICsgJywnICsgY3VycmVudFkgKyAnICc7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG59XG5mdW5jdGlvbiBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKG1vZGlmaWNhdGlvbnMpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBtb2RpZmljYXRpb25zLmxlbmd0aCAmJiBtb2RpZmljYXRpb25zW2ldLnNsaWNlKC0zKSA9PSAnKG8pJylcbiAgICAgICAgaSsrO1xuICAgIHJldHVybiAoaSA9PSBtb2RpZmljYXRpb25zLmxlbmd0aCAtIDEpID8gMCA6IGk7XG59XG5mdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb250ZXh0LmZvbnQgPSBTdHJpbmcoZm9udCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAyICogY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcbn1cbmZ1bmN0aW9uIGdldFRleHRJbnNpZGVDaXJjbGUoYmFzZXMsIGluZGV4LCBudWNsZW90aWRlQ291bnRlciwgbnVtYmVyT2ZOdWNsZW90aWRlcywgZW51bWVyYXRlTW9kaWZpY2F0aW9ucykge1xuICAgIHJldHVybiAoKGJhc2VzW2luZGV4XS5zbGljZSgtMykgPT0gJyhvKScpIHx8ICFlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluY2x1ZGVzKGJhc2VzW2luZGV4XSkpID9cbiAgICAgICAgJycgOlxuICAgICAgICAoWydBJywgJ0cnLCAnQycsICdVJywgJ1QnXS5pbmNsdWRlcyhiYXNlc1tpbmRleF0pKSA/XG4gICAgICAgICAgICBiYXNlc1tpbmRleF0gOlxuICAgICAgICAgICAgJyc7IC8vU3RyaW5nKG51bWJlck9mTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlcik7XG59XG5mdW5jdGlvbiBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKHJnYlN0cmluZykge1xuICAgIGNvbnN0IHJnYkludExpc3QgPSByZ2JTdHJpbmcubWF0Y2goL1xcZCsvZykubWFwKChlKSA9PiBOdW1iZXIoZSkpO1xuICAgIHJldHVybiAocmdiSW50TGlzdFswXSAqIDAuMjk5ICsgcmdiSW50TGlzdFsxXSAqIDAuNTg3ICsgcmdiSW50TGlzdFsyXSAqIDAuMTE0KSA+IDE4NiA/ICcjMzMzMzMnIDogJyNmZmZmZmYnO1xufVxuZnVuY3Rpb24gZ2V0QmFzZUNvbG9yKGJhc2UpIHtcbiAgICByZXR1cm4gYXhvbGFic01hcFtiYXNlXVsnY29sb3InXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QXhvbGFic1BhdHRlcm4ocGF0dGVybk5hbWUsIGFzRXhpc3RzLCBzc0Jhc2VzLCBhc0Jhc2VzLCBzc1B0b1N0YXR1c2VzLCBhc1B0b1N0YXR1c2VzLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBzc0ZpdmVNb2RpZmljYXRpb24sIGFzVGhyZWVNb2RpZmljYXRpb24sIGFzRml2ZU1vZGlmaWNhdGlvbiwgY29tbWVudCwgZW51bWVyYXRlTW9kaWZpY2F0aW9ucykge1xuICAgIGZ1bmN0aW9uIGdldEVxdWlkaXN0YW50WEZvckxlZ2VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoaW5kZXggKyBzdGFydEZyb20pICogd2lkdGggLyAodW5pcXVlQmFzZXMubGVuZ3RoICsgc3RhcnRGcm9tKSArIGxlZ2VuZFJhZGl1cyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFhPZkJhc2VDaXJjbGVzKGluZGV4LCByaWdodE92ZXJoYW5ncykge1xuICAgICAgICByZXR1cm4gd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uICtcbiAgICAgICAgICAgIChyZXN1bHRpbmdOdW1iZXJPZk51Y2xlb3RpZGVzSW5TdHJhbmRzIC0gaW5kZXggKyByaWdodE92ZXJoYW5ncyArIDEpICogYmFzZURpYW1ldGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoYmFzZXMsIGdlbmVyYWxJbmRleCwgbnVjbGVvdGlkZUluZGV4KSB7XG4gICAgICAgIHJldHVybiAobnVjbGVvdGlkZUluZGV4IDwgMTAgfHwgWydBJywgJ0cnLCAnQycsICdVJywgJ1QnXS5cbiAgICAgICAgICAgIGluY2x1ZGVzKGJhc2VzW2dlbmVyYWxJbmRleF0pKSA/IHNoaWZ0VG9BbGlnbk9uZURpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlIDogc2hpZnRUb0FsaWduVHdvRGlnaXROdW1iZXJJbnNpZGVDaXJjbGU7XG4gICAgfVxuICAgIGNvbnN0IHN2ZyA9IHtcbiAgICAgICAgeG1sbnM6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3N2ZycpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ215U3ZnJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBTdHJpbmcod2lkdGgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBTdHJpbmcoaGVpZ2h0KSk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2lyY2xlOiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCBjb2xvcikge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY3gnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2N5JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdyJywgU3RyaW5nKHJhZGl1cykpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dDogZnVuY3Rpb24gKHRleHQsIHgsIHksIGZvbnRTaXplLCBjb2xvcikge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAndGV4dCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoeSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc2l6ZScsIFN0cmluZyhmb250U2l6ZSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtd2VpZ2h0JywgJ25vcm1hbCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtZmFtaWx5JywgJ0FyaWFsJyk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgICAgIGUuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICBzdGFyOiBmdW5jdGlvbiAoeCwgeSwgZmlsbCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLnhtbG5zLCAncG9seWdvbicpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGdldFBvaW50c1RvRHJhd1N0YXIoeCwgeSkpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBmaWxsKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgc3NCYXNlcyA9IHNzQmFzZXMucmV2ZXJzZSgpO1xuICAgIHNzUHRvU3RhdHVzZXMgPSBzc1B0b1N0YXR1c2VzLnJldmVyc2UoKTtcbiAgICBjb25zdCBiYXNlUmFkaXVzID0gMTU7XG4gICAgY29uc3Qgc2hpZnRUb0FsaWduVHdvRGlnaXROdW1iZXJJbnNpZGVDaXJjbGUgPSAtMTA7XG4gICAgY29uc3Qgc2hpZnRUb0FsaWduT25lRGlnaXROdW1iZXJJbnNpZGVDaXJjbGUgPSAtNTtcbiAgICBjb25zdCBsZWdlbmRSYWRpdXMgPSA2O1xuICAgIGNvbnN0IHBzTGlua2FnZVJhZGl1cyA9IDU7XG4gICAgY29uc3QgYmFzZUZvbnRTaXplID0gMTc7XG4gICAgY29uc3QgbGVnZW5kRm9udFNpemUgPSAxNDtcbiAgICBjb25zdCBwc0xpbmthZ2VDb2xvciA9ICdyZWQnO1xuICAgIGNvbnN0IGZvbnRDb2xvciA9ICd2YXIoLS1ncmV5LTYpJztcbiAgICBjb25zdCB0aXRsZUZvbnRDb2xvciA9ICdibGFjayc7XG4gICAgY29uc3QgbW9kaWZpY2F0aW9uc0NvbG9yID0gJ3JlZCc7XG4gICAgY29uc3Qgc3NMZWZ0VGV4dCA9ICdTUzogNVxcJyc7XG4gICAgY29uc3QgYXNMZWZ0VGV4dCA9ICdBUzogM1xcJyc7XG4gICAgY29uc3Qgc3NSaWdodFRleHQgPSAnM1xcJyc7XG4gICAgY29uc3QgYXNSaWdodFRleHQgPSAnNVxcJyc7XG4gICAgY29uc3Qgc3NSaWdodE92ZXJoYW5ncyA9IGNvdW50T3ZlcmhhbmdzT25UaGVSaWdodEVkZ2Uoc3NCYXNlcyk7XG4gICAgY29uc3QgYXNSaWdodE92ZXJoYW5ncyA9IGNvdW50T3ZlcmhhbmdzT25UaGVSaWdodEVkZ2UoYXNCYXNlcyk7XG4gICAgY29uc3QgcmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyA9IE1hdGgubWF4KHNzQmFzZXMubGVuZ3RoIC0gc3NSaWdodE92ZXJoYW5ncywgYXNCYXNlcy5sZW5ndGggLSBhc1JpZ2h0T3ZlcmhhbmdzKTtcbiAgICBjb25zdCBiYXNlRGlhbWV0ZXIgPSAyICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB3aWR0aE9mQmFzZXMgPSBiYXNlRGlhbWV0ZXIgKiAocmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyArIE1hdGgubWF4KHNzUmlnaHRPdmVyaGFuZ3MsIGFzUmlnaHRPdmVyaGFuZ3MpKTtcbiAgICBjb25zdCB3aWR0aE9mTGVmdE1vZGlmaWNhdGlvbiA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc1RocmVlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNGaXZlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aE9mUmlnaHRNb2RpZmljYXRpb24gPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NGaXZlTW9kaWZpY2F0aW9uLCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNUaHJlZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZkxlZnRUZXh0ID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzTGVmdFRleHQsIGJhc2VGb250U2l6ZSksIGdldFRleHRXaWR0aChhc0xlZnRUZXh0LCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aE9mUmlnaHRUZXh0ID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzUmlnaHRUZXh0LCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNSaWdodFRleHQsIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoID0gd2lkdGhPZkxlZnRUZXh0ICsgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gKyB3aWR0aE9mQmFzZXMgK1xuICAgICAgICB3aWR0aE9mUmlnaHRNb2RpZmljYXRpb24gKyB3aWR0aE9mUmlnaHRUZXh0ICsgYmFzZURpYW1ldGVyO1xuICAgIGNvbnN0IGhlaWdodCA9IGFzRXhpc3RzID8gMTEgKiBiYXNlUmFkaXVzIDogOSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeE9mVGl0bGUgPSBiYXNlUmFkaXVzOyAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gNCksXG4gICAgY29uc3QgdW5pcXVlQmFzZXMgPSBhc0V4aXN0cyA/IFsuLi5uZXcgU2V0KHNzQmFzZXMuY29uY2F0KGFzQmFzZXMpKV0gOiBbLi4ubmV3IFNldChzc0Jhc2VzKV07XG4gICAgY29uc3QgaXNQdG9FeGlzdCA9IGFzRXhpc3RzID8gWy4uLm5ldyBTZXQoc3NQdG9TdGF0dXNlcy5jb25jYXQoYXNQdG9TdGF0dXNlcykpXS5pbmNsdWRlcyh0cnVlKSA6XG4gICAgICAgIFsuLi5uZXcgU2V0KHNzUHRvU3RhdHVzZXMpXS5pbmNsdWRlcyh0cnVlKTtcbiAgICBjb25zdCBzdGFydEZyb20gPSBpc1B0b0V4aXN0ID8gMSA6IDA7XG4gICAgY29uc3QgeE9mTGVmdFRleHRzID0gMDtcbiAgICBjb25zdCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucyA9IHhPZkxlZnRUZXh0cyArIHdpZHRoT2ZMZWZ0VGV4dCAtIDU7XG4gICAgY29uc3QgeE9mU3NSaWdodE1vZGlmaWNhdGlvbnMgPSBzc1JpZ2h0T3ZlcmhhbmdzICogYmFzZURpYW1ldGVyICsgZ2V0WE9mQmFzZUNpcmNsZXMoLTAuNSwgMCk7XG4gICAgY29uc3QgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMgPSBhc1JpZ2h0T3ZlcmhhbmdzICogYmFzZURpYW1ldGVyICsgZ2V0WE9mQmFzZUNpcmNsZXMoLTAuNSwgMCk7XG4gICAgY29uc3QgeE9mUmlnaHRUZXh0cyA9IE1hdGgubWF4KHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucykgK1xuICAgICAgICB3aWR0aE9mTGVmdE1vZGlmaWNhdGlvbiArIGJhc2VEaWFtZXRlciAqIChNYXRoLm1heChzc1JpZ2h0T3ZlcmhhbmdzLCBhc1JpZ2h0T3ZlcmhhbmdzKSk7XG4gICAgY29uc3QgeU9mVGl0bGUgPSBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZk51bWJlcnMgPSAyICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc1RleHRzID0gNCAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQXNUZXh0cyA9IDcgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNvbW1lbnQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDguNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mU3NDaXJjbGVzID0gMy41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc0NpcmNsZXMgPSA2LjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkNpcmNsZXNJbkxlZ2VuZHMgPSBhc0V4aXN0cyA/IDkgKiBiYXNlUmFkaXVzIDogNiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mVGV4dExlZ2VuZCA9IGFzRXhpc3RzID8gOS41ICogYmFzZVJhZGl1cyAtIDMgOiB5T2ZBc0NpcmNsZXMgLSAzO1xuICAgIGNvbnN0IGltYWdlID0gc3ZnLnJlbmRlcih3aWR0aCwgaGVpZ2h0KTtcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQoc3NMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NSaWdodFRleHQsIHhPZlJpZ2h0VGV4dHMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1JpZ2h0VGV4dCwgeE9mUmlnaHRUZXh0cywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpIDogJycsIHN2Zy50ZXh0KHNzRml2ZU1vZGlmaWNhdGlvbiwgeE9mTGVmdE1vZGlmaWNhdGlvbnMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1RocmVlTW9kaWZpY2F0aW9uLCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KHNzVGhyZWVNb2RpZmljYXRpb24sIHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNGaXZlTW9kaWZpY2F0aW9uLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KGNvbW1lbnQsIHhPZkxlZnRUZXh0cywgeU9mQ29tbWVudCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIGlzUHRvRXhpc3QgPyBzdmcuc3RhcihiYXNlUmFkaXVzLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBwc0xpbmthZ2VDb2xvcikgOiAnJywgaXNQdG9FeGlzdCA/IHN2Zy50ZXh0KCdwcyBsaW5rYWdlJywgMiAqIGJhc2VSYWRpdXMgLSA4LCB5T2ZUZXh0TGVnZW5kLCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZTc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZTc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mU3NOdWNsZW90aWRlcztcbiAgICBmb3IgKGxldCBpID0gc3NCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICBjb25zdCB4T2ZOdW1iZXJzID0gZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKHNzQmFzZXMsIHNzQmFzZXMubGVuZ3RoIC0gaSwgbnVtYmVyT2ZTc051Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIpO1xuICAgICAgICBpZiAoc3NCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQoU3RyaW5nKG51bWJlck9mU3NOdWNsZW90aWRlcyAtIG51Y2xlb3RpZGVDb3VudGVyKSwgeE9mTnVtYmVycywgeU9mTnVtYmVycywgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncyksIHlPZlNzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKHNzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShzc0Jhc2VzLCBpLCBudWNsZW90aWRlQ291bnRlciwgbnVtYmVyT2ZTc051Y2xlb3RpZGVzLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSwgeE9mTnVtYmVycywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGF4b2xhYnNNYXBbc3NCYXNlc1tpXV1bJ2NvbG9yJ10pKSwgc3NQdG9TdGF0dXNlc1tpXSA/XG4gICAgICAgICAgICBzdmcuc3RhcihnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBzc1JpZ2h0T3ZlcmhhbmdzKSArIGJhc2VSYWRpdXMsIHlPZlNzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6XG4gICAgICAgICAgICAnJyk7XG4gICAgfVxuICAgIGltYWdlLmFwcGVuZChzc1B0b1N0YXR1c2VzW3NzQmFzZXMubGVuZ3RoXSA/XG4gICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKHNzQmFzZXMubGVuZ3RoLCBzc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZTc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgbGV0IG51bWJlck9mQXNOdWNsZW90aWRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc0Jhc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhc0Jhc2VzW2ldLnNsaWNlKC0zKSAhPSAnKG8pJylcbiAgICAgICAgICAgIG51bWJlck9mQXNOdWNsZW90aWRlcysrO1xuICAgIH1cbiAgICBpZiAoYXNFeGlzdHMpIHtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gbnVtYmVyT2ZBc051Y2xlb3RpZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gYXNCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICAgICAgaWYgKGFzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyLS07XG4gICAgICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBhc1JpZ2h0T3ZlcmhhbmdzKSwgeU9mQXNDaXJjbGVzLCBiYXNlUmFkaXVzLCBnZXRCYXNlQ29sb3IoYXNCYXNlc1tpXSkpLCBzdmcudGV4dChnZXRUZXh0SW5zaWRlQ2lyY2xlKGFzQmFzZXMsIGksIG51bWJlck9mQXNOdWNsZW90aWRlcyAtIG51Y2xlb3RpZGVDb3VudGVyIC0gMSwgbnVtYmVyT2ZBc051Y2xlb3RpZGVzLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSwgZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGdldFNoaWZ0VG9BbGlnbk51bWJlckluc2lkZUNpcmNsZShhc0Jhc2VzLCBpLCBudWNsZW90aWRlQ291bnRlciArIDEpLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGdldEZvbnRDb2xvclZpc2libGVPbkJhY2tncm91bmQoYXhvbGFic01hcFthc0Jhc2VzW2ldXVsnY29sb3InXSkpLCBhc1B0b1N0YXR1c2VzW2ldID8gc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZkFzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpbWFnZS5hcHBlbmQoYXNQdG9TdGF0dXNlc1thc0Jhc2VzLmxlbmd0aF0gP1xuICAgICAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoYXNCYXNlcy5sZW5ndGgsIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZBc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlID0gcGF0dGVybk5hbWUgKyAnIGZvciAnICtcbiAgICAgICAgU3RyaW5nKG51bWJlck9mU3NOdWNsZW90aWRlcykgKyAoYXNFeGlzdHMgPyAnLycgKyBTdHJpbmcobnVtYmVyT2ZBc051Y2xlb3RpZGVzKSA6ICcnKSArICdtZXInO1xuICAgIGltYWdlLmFwcGVuZChzdmcudGV4dCh0aXRsZSwgeE9mVGl0bGUsIHlPZlRpdGxlLCBiYXNlRm9udFNpemUsIHRpdGxlRm9udENvbG9yKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmlxdWVCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSksIHlPZkNpcmNsZXNJbkxlZ2VuZHMsIGxlZ2VuZFJhZGl1cywgZ2V0QmFzZUNvbG9yKHVuaXF1ZUJhc2VzW2ldKSksIHN2Zy50ZXh0KHVuaXF1ZUJhc2VzW2ldLCBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSkgK1xuICAgICAgICAgICAgbGVnZW5kUmFkaXVzICsgNCwgeU9mVGV4dExlZ2VuZCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvcikpO1xuICAgIH1cbiAgICByZXR1cm4gaW1hZ2U7XG59XG4iLCJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgY29udmVydFNlcXVlbmNlLCB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLCBpc1ZhbGlkU2VxdWVuY2UgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IG1hcCwgTU9ESUZJQ0FUSU9OUyB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvbWFwJztcbmltcG9ydCB7IHNlcXVlbmNlVG9TbWlsZXMsIHNlcXVlbmNlVG9Nb2xWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5jb25zdCBkZWZhdWx0SW5wdXQgPSAnZkFtQ21HbUFtQ3BzbVUnO1xuY29uc3Qgc2VxdWVuY2VXYXNDb3BpZWQgPSAnQ29waWVkJztcbmNvbnN0IHRvb2x0aXBTZXF1ZW5jZSA9ICdDb3B5IHNlcXVlbmNlJztcbmV4cG9ydCBmdW5jdGlvbiBtYWluVmlldygpIHtcbiAgICBmdW5jdGlvbiB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlLCBpbnB1dEZvcm1hdCkge1xuICAgICAgICBtb2xlY3VsZVN2Z0Rpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgb3V0cHV0VGFibGVEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IHBpID0gREcuVGFza0JhclByb2dyZXNzSW5kaWNhdG9yLmNyZWF0ZSgnUmVuZGVyaW5nIHRhYmxlIGFuZCBtb2xlY3VsZS4uLicpO1xuICAgICAgICBsZXQgZXJyb3JzRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNlcXVlbmNlID0gc2VxdWVuY2UucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGlzVmFsaWRTZXF1ZW5jZShzZXF1ZW5jZSwgbnVsbCk7XG4gICAgICAgICAgICBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlID0gb3V0cHV0LnN5bnRoZXNpemVyWzBdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2VxdWVuY2VPYmogPSBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVJvd3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG91dHB1dFNlcXVlbmNlT2JqKS5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9ICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikgP1xuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyIDpcbiAgICAgICAgICAgICAgICAgICAgLTE7XG4gICAgICAgICAgICAgICAgaWYgKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9ICgnaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyJyBpbiBvdXRwdXRTZXF1ZW5jZU9iaikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA6XG4gICAgICAgICAgICAgICAgICAgICAgICAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFibGVSb3dzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAna2V5Jzoga2V5LFxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdlRleHQoc2VxdWVuY2Uuc2xpY2UoMCwgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKSwgeyBzdHlsZTogeyBjb2xvcjogJ2dyZXknIH0gfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkudG9vbHRpcC5iaW5kKHVpLmRpdlRleHQoc2VxdWVuY2Uuc2xpY2UoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKSwgeyBzdHlsZTogeyBjb2xvcjogJ3JlZCcgfSB9KSwgJ0V4cGVjdGVkIGZvcm1hdDogJyArIEpTT04ucGFyc2Uob3V0cHV0U2VxdWVuY2VPYmouaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyKS5zeW50aGVzaXplciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuIFNlZSB0YWJsZXMgd2l0aCB2YWxpZCBjb2RlcyBvbiB0aGUgcmlnaHQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pIDogLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5saW5rKG91dHB1dFNlcXVlbmNlT2JqW2tleV0sICgpID0+IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KG91dHB1dFNlcXVlbmNlT2JqW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKHNlcXVlbmNlV2FzQ29waWVkKSksIHRvb2x0aXBTZXF1ZW5jZSwgJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yc0V4aXN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ludGhlc2l6ZXIgPSBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuc3ludGhlc2l6ZXIuc2xpY2UoMCwgLTYpO1xuICAgICAgICAgICAgICAgIGFzb0dhcG1lcnNHcmlkLm9uQ2VsbFByZXBhcmUoZnVuY3Rpb24gKGdjKSB7XG4gICAgICAgICAgICAgICAgICAgIGdjLnN0eWxlLmJhY2tDb2xvciA9IChnYy5ncmlkQ29sdW1uLm5hbWUgPT0gc3ludGhlc2l6ZXIpID8gMHhGRkYwMDAwMCA6IDB4RkZGRkZGRkY7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb21lQW5kRmx1b3JvR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykge1xuICAgICAgICAgICAgICAgICAgICBnYy5zdHlsZS5iYWNrQ29sb3IgPSAoZ2MuZ3JpZENvbHVtbi5uYW1lID09IHN5bnRoZXNpemVyKSA/IDB4RkZGMDAwMDAgOiAweEZGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN3aXRjaElucHV0LmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNvR2FwbWVyc0dyaWQub25DZWxsUHJlcGFyZShmdW5jdGlvbiAoZ2MpIHsgZ2Muc3R5bGUuYmFja0NvbG9yID0gMHhGRkZGRkZGRjsgfSk7XG4gICAgICAgICAgICAgICAgb21lQW5kRmx1b3JvR3JpZC5vbkNlbGxQcmVwYXJlKGZ1bmN0aW9uIChnYykgeyBnYy5zdHlsZS5iYWNrQ29sb3IgPSAweEZGRkZGRkZGOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFRhYmxlRGl2LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgIERHLkh0bWxUYWJsZS5jcmVhdGUodGFibGVSb3dzLCAoaXRlbSkgPT4gW2l0ZW0ua2V5LCBpdGVtLnZhbHVlXSwgWydDb2RlJywgJ1NlcXVlbmNlJ10pLnJvb3QsXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBpZiAob3V0cHV0U2VxdWVuY2VPYmoudHlwZSAhPSB1bmRlZmluZWRJbnB1dFNlcXVlbmNlICYmIG91dHB1dFNlcXVlbmNlT2JqLkVycm9yICE9IHVuZGVmaW5lZElucHV0U2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSB1aS5jYW52YXMoMzAwLCAxNzApO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudiA9IHVpLmNhbnZhcygkKHdpbmRvdykud2lkdGgoKSwgJCh3aW5kb3cpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9sID0gc2VxdWVuY2VUb01vbFYzMDAwKGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpLCBmYWxzZSwgdHJ1ZSwgb3V0cHV0LnN5bnRoZXNpemVyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudiwgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB1aS5kaWFsb2coJ01vbGVjdWxlOiAnICsgaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjYW52KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dNb2RhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKGNhbnZhcykub24oJ21vdXNlb3ZlcicsICgpID0+ICQoY2FudmFzKS5jc3MoJ2N1cnNvcicsICd6b29tLWluJykpO1xuICAgICAgICAgICAgICAgICQoY2FudmFzKS5vbignbW91c2VvdXQnLCAoKSA9PiAkKGNhbnZhcykuY3NzKCdjdXJzb3InLCAnZGVmYXVsdCcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlLCBvdXRwdXQuc3ludGhlc2l6ZXJbMF0pO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudmFzLCBPQ0wuTW9sZWN1bGUuZnJvbU1vbGZpbGUobW9sKSwgeyBzdXBwcmVzc0NoaXJhbFRleHQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuYXBwZW5kKGNhbnZhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBwaS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnSW5wdXQgZm9ybWF0OiAnLCAnSmFuc3NlbiBHQ1JTIENvZGVzJywgT2JqZWN0LmtleXMobWFwKSk7XG4gICAgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC5vbklucHV0KChmb3JtYXQpID0+IHtcbiAgICAgICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZm9ybWF0KTtcbiAgICB9KTtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBvdXRwdXRUYWJsZURpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRTZXF1ZW5jZUZpZWxkID0gdWkudGV4dElucHV0KCcnLCBkZWZhdWx0SW5wdXQsIChzZXF1ZW5jZSkgPT4ge1xuICAgICAgICB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBhc29EZiA9IERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS01TWUtclUnLCAnQmlvU3ByaW5nJzogJzUnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZVQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdKYW5zc2VuIEdDUlMnOiAnbW9lQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsICdCaW9TcHJpbmcnOiAnNycsICdKYW5zc2VuIEdDUlMnOiAnbW9lNW1DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtckcnLCAnQmlvU3ByaW5nJzogJzgnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnNS1NZXRoeWwtZEMnLCAnQmlvU3ByaW5nJzogJzknLCAnSmFuc3NlbiBHQ1JTJzogJzVtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdwcyBsaW5rYWdlJywgJ0Jpb1NwcmluZyc6ICcqJywgJ0phbnNzZW4gR0NSUyc6ICdwcycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkQScsICdCaW9TcHJpbmcnOiAnQScsICdKYW5zc2VuIEdDUlMnOiAnQSwgZEEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEMnLCAnQmlvU3ByaW5nJzogJ0MnLCAnSmFuc3NlbiBHQ1JTJzogJ0MsIGRDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RHJywgJ0Jpb1NwcmluZyc6ICdHJywgJ0phbnNzZW4gR0NSUyc6ICdHLCBkRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkVCcsICdCaW9TcHJpbmcnOiAnVCcsICdKYW5zc2VuIEdDUlMnOiAnVCwgZFQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckEnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckMnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckcnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnclUnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnclUnIH0sXG4gICAgXSk7XG4gICAgY29uc3QgYXNvR2FwbWVyc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChhc29EZiwgeyBzaG93Um93SGVhZGVyOiBmYWxzZSwgc2hvd0NlbGxUb29sdGlwOiBmYWxzZSB9KTtcbiAgICBhc29EZi5vbkN1cnJlbnRDZWxsQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYXNvRGYuY3VycmVudENlbGwudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdDb3BpZWQnKSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb21lQW5kRmx1b3JvR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tVScsICdCaW9TcHJpbmcnOiAnMScsICdBeG9sYWJzJzogJ1VmJywgJ0phbnNzZW4gR0NSUyc6ICdmVScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1BJywgJ0Jpb1NwcmluZyc6ICcyJywgJ0F4b2xhYnMnOiAnQWYnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUMnLCAnQmlvU3ByaW5nJzogJzMnLCAnQXhvbGFicyc6ICdDZicsICdKYW5zc2VuIEdDUlMnOiAnZkMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tRycsICdCaW9TcHJpbmcnOiAnNCcsICdBeG9sYWJzJzogJ0dmJywgJ0phbnNzZW4gR0NSUyc6ICdmRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJVJywgJ0Jpb1NwcmluZyc6ICc1JywgJ0F4b2xhYnMnOiAndScsICdKYW5zc2VuIEdDUlMnOiAnbVUnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdBeG9sYWJzJzogJ2EnLCAnSmFuc3NlbiBHQ1JTJzogJ21BJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckMnLCAnQmlvU3ByaW5nJzogJzcnLCAnQXhvbGFicyc6ICdjJywgJ0phbnNzZW4gR0NSUyc6ICdtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJHJywgJ0Jpb1NwcmluZyc6ICc4JywgJ0F4b2xhYnMnOiAnZycsICdKYW5zc2VuIEdDUlMnOiAnbUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAncHMgbGlua2FnZScsICdCaW9TcHJpbmcnOiAnKicsICdBeG9sYWJzJzogJ3MnLCAnSmFuc3NlbiBHQ1JTJzogJ3BzJyB9LFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlIH0pO1xuICAgIGNvbnN0IG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChERy5EYXRhRnJhbWUuZnJvbUNvbHVtbnMoW1xuICAgICAgICBERy5Db2x1bW4uZnJvbVN0cmluZ3MoJ05hbWUnLCBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSksXG4gICAgXSksIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UgfSk7XG4gICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShkZWZhdWx0SW5wdXQsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IGNvZGVzVGFibGVzRGl2ID0gdWkuc3BsaXRWKFtcbiAgICAgICAgdWkuYm94KHVpLmgyKCdBU08gR2FwbWVycycpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIGFzb0dhcG1lcnNHcmlkLnJvb3QsXG4gICAgICAgIHVpLmJveCh1aS5oMignMlxcJy1PTWUgYW5kIDJcXCctRiBzaVJOQScpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIG9tZUFuZEZsdW9yb0dyaWQucm9vdCxcbiAgICAgICAgdWkuYm94KHVpLmgyKCdPdmVyaGFuZyBtb2RpZmljYXRpb25zJyksIHsgc3R5bGU6IHsgbWF4SGVpZ2h0OiAnNDBweCcgfSB9KSxcbiAgICAgICAgb3ZlcmhhbmdNb2RpZmljYXRpb25zR3JpZC5yb290LFxuICAgIF0sIHsgc3R5bGU6IHsgbWF4V2lkdGg6ICczNTBweCcgfSB9KTtcbiAgICBjb25zdCBhcHBNYWluRGVzY3JpcHRpb24gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnSG93IHRvIGNvbnZlcnQgb25lIHNlcXVlbmNlOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnUGFzdGUgc2VxdWVuY2UgaW50byB0aGUgdGV4dCBmaWVsZCBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCdcXG4gSG93IHRvIGNvbnZlcnQgbWFueSBzZXF1ZW5jZXM6JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBEcmFnICYgZHJvcCBhbiBFeGNlbCBvciBDU1YgZmlsZSB3aXRoIHNlcXVlbmNlcyBpbnRvIERhdGFncm9rJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIFJpZ2h0LWNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyLCB0aGVuIHNlZSB0aGUgXFwnQ29udmVydFxcJyBtZW51JyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDb252ZXJ0IG9saWdvbnVjbGVvdGlkZSBzZXF1ZW5jZXMgYmV0d2VlbiBOdWNsZW90aWRlcywgQmlvU3ByaW5nLCBBeG9sYWJzLCBNZXJtYWRlIDEyIGFuZCBHQ1JTIHJlcHJlc2VudGF0aW9ucy4nKTtcbiAgICAkKGNvZGVzVGFibGVzRGl2KS5oaWRlKCk7XG4gICAgY29uc3Qgc3dpdGNoSW5wdXQgPSB1aS5zd2l0Y2hJbnB1dCgnQ29kZXMnLCBmYWxzZSwgKHYpID0+ICh2KSA/XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLnNob3coKSA6XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLmhpZGUoKSk7XG4gICAgY29uc3QgdG9wUGFuZWwgPSBbXG4gICAgICAgIHVpLmljb25GQSgnZG93bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBmYWxzZSwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5tb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfSwgJ1NhdmUgLm1vbCBmaWxlJyksXG4gICAgICAgIHVpLmljb25GQSgnY29weScsICgpID0+IHtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHNlcXVlbmNlVG9TbWlsZXMoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBncm9rLnNoZWxsLmluZm8oc2VxdWVuY2VXYXNDb3BpZWQpKTtcbiAgICAgICAgfSwgJ0NvcHkgU01JTEVTJyksXG4gICAgICAgIHN3aXRjaElucHV0LnJvb3QsXG4gICAgXTtcbiAgICBjb25zdCB2ID0gZ3Jvay5zaGVsbC52O1xuICAgIGNvbnN0IHRhYkNvbnRyb2wgPSBncm9rLnNoZWxsLnNpZGViYXI7XG4gICAgdGFiQ29udHJvbC5vblRhYkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB2LnNldFJpYmJvblBhbmVscyhbKHRhYkNvbnRyb2wuY3VycmVudFBhbmUubmFtZSA9PSAnTUFJTicpID8gdG9wUGFuZWwgOiBbXV0pKTtcbiAgICB2LnNldFJpYmJvblBhbmVscyhbdG9wUGFuZWxdKTtcbiAgICByZXR1cm4gdWkuYm94KHVpLnNwbGl0SChbXG4gICAgICAgIHVpLnNwbGl0VihbXG4gICAgICAgICAgICB1aS5wYW5lbChbXG4gICAgICAgICAgICAgICAgYXBwTWFpbkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdJbnB1dCBzZXF1ZW5jZScpLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTZXF1ZW5jZUZpZWxkLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dC1iYXNlJyksXG4gICAgICAgICAgICAgICAgXSwgJ2lucHV0U2VxdWVuY2UnKSxcbiAgICAgICAgICAgICAgICB1aS5kaXYoW2lucHV0Rm9ybWF0Q2hvaWNlSW5wdXRdLCB7IHN0eWxlOiB7IHBhZGRpbmc6ICc1cHggMCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jayhbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdPdXRwdXQnKSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGFibGVEaXYsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgICAgICAgICBdLCAnc2VxdWVuY2UnKSxcbiAgICAgICAgXSksXG4gICAgICAgIGNvZGVzVGFibGVzRGl2LFxuICAgIF0sIHsgc3R5bGU6IHsgaGVpZ2h0OiAnMTAwJScsIHdpZHRoOiAnMTAwJScgfSB9KSk7XG59XG4iLCJleHBvcnQgY29uc3QgU0FMVFNfQ1NWID0gYERJU1BMQVksTU9MV0VJR0hUXG5ubyBEYXRhIEFkZGVkLDEwMGA7XG4iLCJleHBvcnQgY29uc3QgU09VUkNFUyA9IGBESVNQTEFZXG5OTyBEQVRBXG5gO1xuIiwiaW1wb3J0IHsgbGNtc1RvR2NycyB9IGZyb20gJy4vbWFwJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBkZWxpbWl0ZXIgfSBmcm9tICcuL21hcCc7XG4vL25hbWU6IGdjcnNUb0xjbXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBMQ01TfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb0xjbXMoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBkZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGxjbXNUb0djcnMpO1xuICAgIGNvbnN0IGFycjEgPSBkZi5nZXRDb2woJ0dDUlMnKS50b0xpc3QoKTtcbiAgICBjb25zdCBhcnIyID0gZGYuZ2V0Q29sKCdMQ01TJykudG9MaXN0KCk7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgYXJyMS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4gb2JqW2VsZW1lbnRdID0gYXJyMltpbmRleF0pO1xuICAgIG9ialtkZWxpbWl0ZXJdID0gZGVsaW1pdGVyO1xuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgYXJyMVtpXSA9IGFycjFbaV0ucmVwbGFjZSgnKCcsICdcXFxcKCcpO1xuICAgIC8vICAgYXJyMVtpXSA9IGFycjFbaV0ucmVwbGFjZSgnKScsICdcXFxcKScpO1xuICAgIC8vIH1cbiAgICAvLyBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKCcoJyArIGFycjEuam9pbignfCcpICsgJyknLCAnZycpO1xuICAgIC8vIGxldCByMSA9IHNlcXVlbmNlLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbihjb2RlKSB7cmV0dXJuIG9ialtjb2RlXTt9KTtcbiAgICBjb25zdCBjb2RlcyA9IGFycjEuY29uY2F0KGRlbGltaXRlcikuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCByMSA9ICcnO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgoYykgPT4gYyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgYy5sZW5ndGgpKTtcbiAgICAgICAgcjEgKz0gb2JqW3NlcXVlbmNlLnNsaWNlKGksIGkgKyBtYXRjaGVkQ29kZS5sZW5ndGgpXTtcbiAgICAgICAgaSArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgfVxuICAgIHdoaWxlIChyMS5pbmRleE9mKCcvLycpICE9IC0xKVxuICAgICAgICByMSA9IHIxLnJlcGxhY2UoJy8vJywgJy8nKTtcbiAgICByZXR1cm4gcjE7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yRWRnZXMgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJzUqJywgJ0EnOiAnNionLCAnQyc6ICc3KicsICdHJzogJzgqJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdUKicsICdBJzogJ0EqJywgJ0MnOiAnOSonLCAnRyc6ICdHKidcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gKGNvdW50ID4gNCAmJiBjb3VudCA8IDE1KSA/IG9iakZvckNlbnRlclt4XSA6IG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAyICogY291bnQgKyAxKTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnbW9lVW5wcycsXG4gICAgICAgICdBJzogJ21vZUFucHMnLCAnQyc6ICdtb2U1bUNucHMnLCAnRyc6ICdtb2VHbnBzJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQyc6ICc1bUNwcycsICdBJzogJ0FwcycsICdUJzogJ1RwcycsICdHJzogJ0dwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxUfEN8RykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgNSlcbiAgICAgICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpGb3JFZGdlc1t4XS5zbGljZSgwLCAtMykgKyAncHMnIDogb2JqRm9yRWRnZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA8IDE1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSAxNCkgPyBvYmpGb3JDZW50ZXJbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpGb3JDZW50ZXJbeF07XG4gICAgICAgIHJldHVybiBvYmpGb3JFZGdlc1t4XTtcbiAgICB9KS5zbGljZSgwLCAobnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhpbnZhYmFzaWMpJykgfHwgbnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhHYWxOQWMtMi1KTkopJykpID9cbiAgICAgICAgbnVjbGVvdGlkZXMubGVuZ3RoIDogLTMpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJyonOiAnJywgJzUnOiAnVCcsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICc5JzogJ0MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFxcKnw1fDZ8N3w4fDkpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzUqJzogJ21vZVVucHMnLCAnNionOiAnbW9lQW5wcycsICc3Kic6ICdtb2U1bUNucHMnLCAnOConOiAnbW9lR25wcycsICc5Kic6ICc1bUNwcycsICdBKic6ICdBcHMnLCAnVConOiAnVHBzJyxcbiAgICAgICAgJ0cqJzogJ0dwcycsICdDKic6ICdDcHMnLCAnNSc6ICdtb2VVJywgJzYnOiAnbW9lQScsICc3JzogJ21vZTVtQycsICc4JzogJ21vZUcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDVcXCp8NlxcKnw3XFwqfDhcXCp8OVxcKnxBXFwqfFRcXCp8R1xcKnxDXFwqfDV8Nnw3fDgpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTMpICsgJ3BzJyA6IChjb3VudCA9PSAxNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnMScsICdmQSc6ICcyJywgJ2ZDJzogJzMnLCAnZkcnOiAnNCcsICdtVSc6ICc1JywgJ21BJzogJzYnLCAnbUMnOiAnNycsICdtRyc6ICc4JyxcbiAgICAgICAgJ21vZVQnOiAnNScsICdtb2VBJzogJzYnLCAnbW9lNW1DJzogJzcnLCAnbW9lRyc6ICc4JywgJ21vZVUnOiAnNScsICc1bUMnOiAnOScsICducHMnOiAnKicsICdwcyc6ICcqJywgJ1UnOiAnVCcsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8bW9lVHxtb2VBfG1vZTVtQ3xtb2VHfG1vZVV8NW1DfG5wc3xwc3xVKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtb2UnOiAnJywgJzVtJzogJycsICduJzogJycsICdwcyc6ICcnLCAnVSc6ICdUJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtb2V8NW18bnxwc3xVKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ1UnLCAnMic6ICdBJywgJzMnOiAnQycsICc0JzogJ0cnLCAnNSc6ICdVJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJyonOiAnJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdVZicsICcyJzogJ0FmJywgJzMnOiAnQ2YnLCAnNCc6ICdHZicsICc1JzogJ3UnLCAnNic6ICdhJywgJzcnOiAnYycsICc4JzogJ2cnLCAnKic6ICdzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnZlUnLCAnMic6ICdmQScsICczJzogJ2ZDJywgJzQnOiAnZkcnLCAnNSc6ICdtVScsICc2JzogJ21BJywgJzcnOiAnbUMnLCAnOCc6ICdtRycsICcqJzogJ3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXwxfDJ8M3w0fDV8Nnw3fDh8XFwqKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJ2ZVJywgJ0FmJzogJ2ZBJywgJ0NmJzogJ2ZDJywgJ0dmJzogJ2ZHJywgJ3UnOiAnbVUnLCAnYSc6ICdtQScsICdjJzogJ21DJywgJ2cnOiAnbUcnLCAncyc6ICdwcycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnMScsICdBZic6ICcyJywgJ0NmJzogJzMnLCAnR2YnOiAnNCcsICd1JzogJzUnLCAnYSc6ICc2JywgJ2MnOiAnNycsICdnJzogJzgnLCAncyc6ICcqJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJ1UnLCAnQWYnOiAnQScsICdDZic6ICdDJywgJ0dmJzogJ0cnLCAndSc6ICdVJywgJ2EnOiAnQScsICdjJzogJ0MnLCAnZyc6ICdHJywgJ3MnOiAnJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICdVJywgJ2ZBJzogJ0EnLCAnZkMnOiAnQycsICdmRyc6ICdHJywgJ21VJzogJ1UnLCAnbUEnOiAnQScsICdtQyc6ICdDJywgJ21HJzogJ0cnLCAncHMnOiAnJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICcxJywgJ2ZBJzogJzInLCAnZkMnOiAnMycsICdmRyc6ICc0JywgJ21VJzogJzUnLCAnbUEnOiAnNicsICdtQyc6ICc3JywgJ21HJzogJzgnLCAncHMnOiAnKicsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb0F4b2xhYnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9BeG9sYWJzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnVWYnLCAnZkEnOiAnQWYnLCAnZkMnOiAnQ2YnLCAnZkcnOiAnR2YnLCAnbVUnOiAndScsICdtQSc6ICdhJywgJ21DJzogJ2MnLCAnbUcnOiAnZycsICdwcyc6ICdzJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnNionLCAnVSc6ICc1KicsICdHJzogJzgqJywgJ0MnOiAnNyonIH07XG4gICAgY29uc3Qgb2JqRm9yUmlnaHRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICcqNicsICdVJzogJyo1JywgJ0cnOiAnKjgnLCAnQyc6ICcqNycgfTtcbiAgICBjb25zdCBvYmpGb3JPZGRJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICc2JywgJ1UnOiAnNScsICdHJzogJzgnLCAnQyc6ICc3JyB9O1xuICAgIGNvbnN0IG9iakZvckV2ZW5JbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICcyJywgJ1UnOiAnMScsICdHJzogJzQnLCAnQyc6ICczJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPiBudWNsZW90aWRlcy5sZW5ndGggLSAzKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclJpZ2h0RWRnZVt4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCAlIDIgPT0gMCkgPyBvYmpGb3JFdmVuSW5kaWNlc1t4XSA6IG9iakZvck9kZEluZGljZXNbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdtQXBzJywgJ1UnOiAnbVVwcycsICdHJzogJ21HcHMnLCAnQyc6ICdtQ3BzJyB9O1xuICAgIGNvbnN0IG9iakZvclJpZ2h0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAncHNtQScsICdVJzogJ3BzbVUnLCAnRyc6ICdwc21HJywgJ0MnOiAncHNtQycgfTtcbiAgICBjb25zdCBvYmpGb3JFdmVuSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnZkEnLCAnVSc6ICdmVScsICdHJzogJ2ZHJywgJ0MnOiAnZkMnIH07XG4gICAgY29uc3Qgb2JqRm9yT2RkSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnbUEnLCAnVSc6ICdtVScsICdHJzogJ21HJywgJ0MnOiAnbUMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA+IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDMpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yUmlnaHRFZGdlW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ICUgMiA9PSAwKSA/IG9iakZvckV2ZW5JbmRpY2VzW3hdIDogb2JqRm9yT2RkSW5kaWNlc1t4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzU2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzU2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnYXMnLCAnVSc6ICd1cycsICdHJzogJ2dzJywgJ0MnOiAnY3MnIH07XG4gICAgY29uc3Qgb2JqRm9yU29tZUluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmJywgJ1UnOiAnVWYnLCAnRyc6ICdHZicsICdDJzogJ0NmJyB9O1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnYScsICdVJzogJ3UnLCAnRyc6ICdnJywgJ0MnOiAnYycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IDYgfHwgKGNvdW50ID4gNyAmJiBjb3VudCA8IDExKSlcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JTb21lSW5kaWNlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICByZXR1cm4gJ2EnO1xuICAgICAgICByZXR1cm4gb2JqW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNBbnRpc2Vuc2VTdHJhbmRcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzQW50aXNlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yU21hbGxMaW5rYWdlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnYXMnLCAnVSc6ICd1cycsICdHJzogJ2dzJywgJ0MnOiAnY3MnIH07XG4gICAgY29uc3Qgb2JqRm9yQmlnTGlua2FnZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmcycsICdVJzogJ1VmcycsICdHJzogJ0dmcycsICdDJzogJ0NmcycgfTtcbiAgICBjb25zdCBvYmpGb3JTb21lSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWYnLCAnVSc6ICdVZicsICdHJzogJ0dmJywgJ0MnOiAnQ2YnIH07XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdhJywgJ1UnOiAndScsICdHJzogJ2cnLCAnQyc6ICdjJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPiAxOSAmJiBjb3VudCA8IDIyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclNtYWxsTGlua2FnZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuICd1cyc7XG4gICAgICAgIGlmIChjb3VudCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckJpZ0xpbmthZ2VzW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ID09IDUgfHwgY291bnQgPT0gNyB8fCBjb3VudCA9PSA4IHx8IGNvdW50ID09IDEzIHx8IGNvdW50ID09IDE1KSA/IG9iakZvclNvbWVJbmRpY2VzW3hdIDogb2JqW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBnY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21BcHMnOiAnQScsICdtVXBzJzogJ1UnLCAnbUdwcyc6ICdHJywgJ21DcHMnOiAnQycsICdmQXBzJzogJ0EnLCAnZlVwcyc6ICdVJywgJ2ZHcHMnOiAnRycsICdmQ3BzJzogJ0MnLFxuICAgICAgICAnZlUnOiAnVScsICdmQSc6ICdBJywgJ2ZDJzogJ0MnLCAnZkcnOiAnRycsICdtVSc6ICdVJywgJ21BJzogJ0EnLCAnbUMnOiAnQycsICdtRyc6ICdHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtQXBzfG1VcHN8bUdwc3xtQ3BzfGZBcHN8ZlVwc3xmR3BzfGZDcHN8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUcpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBnY3JzVG9NZXJtYWRlMTJcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBNZXJtYWRlIDEyIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTWVybWFkZTEyKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbUFwcyc6ICdlJywgJ21VcHMnOiAnaCcsICdtR3BzJzogJ2cnLCAnbUNwcyc6ICdmJywgJ2ZBcHMnOiAnaScsICdmVXBzJzogJ2wnLCAnZkdwcyc6ICdrJywgJ2ZDcHMnOiAnaicsICdmVSc6ICdMJyxcbiAgICAgICAgJ2ZBJzogJ0knLCAnZkMnOiAnSicsICdmRyc6ICdLJywgJ21VJzogJ0gnLCAnbUEnOiAnRScsICdtQyc6ICdGJywgJ21HJzogJ0cnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1BcHN8bVVwc3xtR3BzfG1DcHN8ZkFwc3xmVXBzfGZHcHN8ZkNwc3xmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtRykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4iLCJpbXBvcnQgeyBtYXAsIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzLCBTWU5USEVTSVpFUlMsIFRFQ0hOT0xPR0lFUywgTU9ESUZJQ0FUSU9OUywgZGVsaW1pdGVyIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgaXNWYWxpZFNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBnZXROdWNsZW90aWRlc01vbCB9IGZyb20gJy4vbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb01vbFYzMDAwKHNlcXVlbmNlLCBpbnZlcnRlZCA9IGZhbHNlLCBvY2xSZW5kZXIgPSBmYWxzZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpO1xuICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKG9iaikpO1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBzbWlsZXNDb2RlcyA9IFtdO1xuICAgIGNvbnN0IGNvZGVzTGlzdCA9IFtdO1xuICAgIGNvbnN0IGxpbmtzID0gWydzJywgJ3BzJywgJyonXTtcbiAgICBjb25zdCBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkgPSBbJ2UnLCAnaCcsIC8qJ2cnLCovICdmJywgJ2knLCAnbCcsICdrJywgJ2onXTtcbiAgICBjb25zdCBkcm9wZG93bnMgPSBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKTtcbiAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChkcm9wZG93bnMpLmNvbmNhdChkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICBpICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICBpbnZlcnRlZCA/IGNvZGVzTGlzdC51bnNoaWZ0KGNvZGUpIDogY29kZXNMaXN0LnB1c2goY29kZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSkge1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaCgoaSA+PSBjb2Rlc0xpc3QubGVuZ3RoIC8gMikgP1xuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5yaWdodCA6IE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5sZWZ0KTtcbiAgICAgICAgICAgIGlmICghKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlVG9TbWlsZXMoc2VxdWVuY2UsIGludmVydGVkID0gZmFsc2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSwgZm9ybWF0KTtcbiAgICBsZXQgY29kZXMgPSBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihPYmplY3Qua2V5cyhvYmopKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHNtaWxlcyA9ICcnO1xuICAgIGNvbnN0IGNvZGVzTGlzdCA9IFtdO1xuICAgIGNvbnN0IGxpbmtzID0gWydzJywgJ3BzJywgJyonXTtcbiAgICBjb25zdCBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkgPSBbJ2UnLCAnaCcsIC8qJ2cnLCovICdmJywgJ2knLCAnbCcsICdrJywgJ2onXTtcbiAgICBjb25zdCBkcm9wZG93bnMgPSBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKTtcbiAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChkcm9wZG93bnMpLmNvbmNhdChkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICBpICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICBpbnZlcnRlZCA/IGNvZGVzTGlzdC51bnNoaWZ0KGNvZGUpIDogY29kZXNMaXN0LnB1c2goY29kZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSkge1xuICAgICAgICAgICAgc21pbGVzICs9IChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0ICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgOlxuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5sZWZ0ICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzICs9IG9ialtjb2Rlc0xpc3RbaV1dO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNtaWxlcyArPSBvYmpbY29kZXNMaXN0W2ldXSArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNtaWxlcyA9IHNtaWxlcy5yZXBsYWNlKC9PTy9nLCAnTycpO1xuICAgIHJldHVybiAoKGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pICYmXG4gICAgICAgIGNvZGVzTGlzdC5sZW5ndGggPiAxICYmXG4gICAgICAgICFpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAyXSkpIHx8XG4gICAgICAgIGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSB8fFxuICAgICAgICBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkpID9cbiAgICAgICAgc21pbGVzIDpcbiAgICAgICAgc21pbGVzLnNsaWNlKDAsIHNtaWxlcy5sZW5ndGggLSBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcy5sZW5ndGggKyAxKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ludGhlc2l6ZXIgb2YgT2JqZWN0LmtleXMobWFwKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgICAgICAgICBvYmpbY29kZV0gPSBtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldW2NvZGVdLlNNSUxFUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtmb3JtYXRdKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtmb3JtYXRdW3RlY2hub2xvZ3ldKSlcbiAgICAgICAgICAgICAgICBvYmpbY29kZV0gPSBtYXBbZm9ybWF0XVt0ZWNobm9sb2d5XVtjb2RlXS5TTUlMRVM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb2JqW2RlbGltaXRlcl0gPSAnJztcbiAgICAvLyBUT0RPOiBjcmVhdGUgb2JqZWN0IGJhc2VkIGZyb20gc3ludGhlc2l6ZXIgdHlwZSB0byBhdm9pZCBrZXkoY29kZXMpIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuTUVSTUFERV8xMikpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5NRVJNQURFXzEyXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICBlbHNlIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGdldEFsbENvZGVzT2ZTeW50aGVzaXplciB9IGZyb20gJy4vc2VxdWVuY2UtY29kZXMtdG9vbHMnO1xuZXhwb3J0IGNvbnN0IGRlbGltaXRlciA9ICc7JztcbmV4cG9ydCBjb25zdCBTWU5USEVTSVpFUlMgPSB7XG4gICAgUkFXX05VQ0xFT1RJREVTOiAnUmF3IE51Y2xlb3RpZGVzJyxcbiAgICBCSU9TUFJJTkc6ICdCaW9TcHJpbmcgQ29kZXMnLFxuICAgIEdDUlM6ICdKYW5zc2VuIEdDUlMgQ29kZXMnLFxuICAgIEFYT0xBQlM6ICdBeG9sYWJzIENvZGVzJyxcbiAgICBNRVJNQURFXzEyOiAnTWVybWFkZSAxMicsXG4gICAgTENNUzogJ0xDTVMnLFxufTtcbmV4cG9ydCBjb25zdCBURUNITk9MT0dJRVMgPSB7XG4gICAgRE5BOiAnRE5BJyxcbiAgICBSTkE6ICdSTkEnLFxuICAgIEFTT19HQVBNRVJTOiAnRm9yIEFTTyBHYXBtZXJzJyxcbiAgICBTSV9STkE6ICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQScsXG59O1xuZXhwb3J0IGNvbnN0IENPTF9OQU1FUyA9IHtcbiAgICBDSEVNSVNUUlk6ICdDaGVtaXN0cnknLFxuICAgIE5VTUJFUjogJ051bWJlcicsXG4gICAgVFlQRTogJ1R5cGUnLFxuICAgIENIRU1JU1RSWV9OQU1FOiAnQ2hlbWlzdHJ5IE5hbWUnLFxuICAgIElOVEVSTkFMX0NPTVBPVU5EX0lEOiAnSW50ZXJuYWwgY29tcG91bmQgSUQnLFxuICAgIElEUDogJ0lEUCcsXG4gICAgU0VRVUVOQ0U6ICdTZXF1ZW5jZScsXG4gICAgQ09NUE9VTkRfTkFNRTogJ0NvbXBvdW5kIE5hbWUnLFxuICAgIENPTVBPVU5EX0NPTU1FTlRTOiAnQ29tcG91bmQgQ29tbWVudHMnLFxuICAgIFNBTFQ6ICdTYWx0JyxcbiAgICBFUVVJVkFMRU5UUzogJ0VxdWl2YWxlbnRzJyxcbiAgICBQVVJJVFk6ICdQdXJpdHknLFxuICAgIENQRF9NVzogJ0NwZCBNVycsXG4gICAgU0FMVF9NT0xfV0VJR0hUOiAnU2FsdCBNVycsXG4gICAgU0FMVF9NQVNTOiAnU2FsdCBtYXNzJyxcbiAgICBCQVRDSF9NVzogJ0JhdGNoIE1XJyxcbiAgICBTT1VSQ0U6ICdTb3VyY2UnLFxuICAgIElDRDogJ0lDRCcsXG4gICAgT1dORVI6ICdPd25lcicsXG59O1xuLy8gaW50ZXJmYWNlIENPREVTIHtcbi8vIH1cbmV4cG9ydCBjb25zdCBNT0RJRklDQVRJT05TID0ge1xuICAgICcoaW52YWJhc2ljKSc6IHtcbiAgICAgICAgbW9sZWN1bGFyV2VpZ2h0OiAxMTguMTMsXG4gICAgICAgIGxlZnQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgICAgICByaWdodDogJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycsXG4gICAgfSxcbiAgICAnKEdhbE5BYy0yLUpOSiknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTI3My4zLFxuICAgICAgICBsZWZ0OiAnQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKU5DKD1PKUNDQ0MoPU8pTkNDKE8pQ08nLFxuICAgICAgICByaWdodDogJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyxcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyA9ICdPUCg9TykoTylPJztcbmV4cG9ydCBjb25zdCBtYXAgPSB7XG4gICAgJ1JhdyBOdWNsZW90aWRlcyc6IHtcbiAgICAgICAgJ0ROQSc6IHtcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ1JOQSc6IHtcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdCaW9TcHJpbmcgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgQVNPIEdhcG1lcnMnOiB7XG4gICAgICAgICAgICAnNSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3OC4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc2Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzODcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc4Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiA0MDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJzEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzInOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnMyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc4Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdBeG9sYWJzIENvZGVzJzoge1xuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnVWYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0FmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0NmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAndSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdnJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnSmFuc3NlbiBHQ1JTIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJ21vZVQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZTVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcoNW0pbW9lQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2VHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiA0MDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNW1DJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcoNW0pQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncHMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0FkZW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZFQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA1LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0NS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3JVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnZlUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdmRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbVUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21BJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnT3RoZXJzJzoge30sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgLy8gJ0xDTVMnOiB7XG4gICAgLy8gICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG59O1xuZXhwb3J0IGNvbnN0IGxjbXNUb0djcnMgPSBgTENNUywgR0NSU1xuQSwgQVxuQywgQ1xuLzVtQy8sICg1bSlDXG5HLCBHXG5ULCBUXG5yQSwgckFcbnJDLCByQ1xuckcsIHJHXG5yVSwgclVcbm1BLCBtQVxubUMsIG1DXG4vNW1tQy8sICg1bSltQ1xubUcsIG1HXG5tVSwgbVVcbmZBLCBmQVxuZkMsIGZDXG4vNW1mQy8sICg1bSlmQ1xuZkcsIGZHXG5mVSwgZlVcbi9hZkEvLCBhZkFcbi9hZkMvLCBhZkNcbi9hZkcvLCBhZkdcbi9hZlUvLCBhZlVcbitBLCBsbmEgQVxuK0MsIGxuYSBDXG4rRywgbG5hIEdcbitULCBsbmEgVFxuL21vZUEvLCBtb2VBXG4vbW9lQy8sIG1vZUNcbi81bW1vZUMvLCAoNW0pbW9lQ1xuL21vZUcvLCBtb2VHXG4vbW9lVC8sIG1vZVRcbi9tb2VVLywgbW9lVVxuL3hBLywgQW5wXG4veEMvLCBDbnBcbi94NW1DLywgKDVtKUNucFxuL3hHLywgR25wXG4veFQvLCBUbnBcbi94ckEvLCByQW5wXG4veHJDLywgckNucFxuL3hyRy8sIHJHbnBcbi94clUvLCByVW5wXG4veG1BLywgbUFucFxuL3htQy8sIG1DbnBcbi94NW1tQy8sICg1bSltQ25wXG4veG1HLywgbUducFxuL3htVS8sIG1VbnBcbi94ZkEvLCBmQW5wXG4veGZDLywgZkNucFxuL3hmRy8sIGZHbnBcbi94ZlQvLCBmVG5wXG4veGZVLywgZlVucFxuL3hhZkEvLCBhZkFucFxuL3hhZkMvLCBhZkNucFxuL3hhZkcvLCBhZkducFxuL3hhZlUvLCBhZlVucFxuL3hlQS8sIGVBbnBcbi94ZUMvLCBlQ25wXG4veGVHLywgZUducFxuL3hlVS8sIGVVbnBcbi94bW9lQS8sIG1vZUFucFxuL3htb2VDLywgbW9lQ25wXG4veDVtbW9lQy8sICg1bSltb2VDbnBcbi94bW9lRy8sIG1vZUducFxuL3htb2VVLywgbW9lVW5wXG4vVU5BLUEvLCAoVU5BLUEpXG4vVU5BLUMvLCAoVU5BLUMpXG4vVU5BLUcvLCAoVU5BLUcpXG4vVU5BLVQvLCAoVU5BLVQpXG4vVU5BLVUvLCAoVU5BLVUpXG4vR05BLUEvLCAoR05BLUEpXG4vR05BLUMvLCAoR05BLUMpXG4vR05BLUcvLCAoR05BLUcpXG4vR05BLVQvLCAoR05BLVQpXG4vR05BLVUvLCAoR05BLVUpXG4vNUNob2xURUcvLCAoNS1DaG9sVEVHKVxuLzNDaG9sVEVHLywgKFRFR0Nob2wtMylcbi9Ub2NvLywgVG9jb1xuL1BhbG0vLCBQYWxtXG4vR2FsTkFjLywgR2FsTkFjXG4vR2FsTkFjMi8sIEdhbE5BYzJcbi9HYWxOQWMzLywgR2FsTkFjM1xuL0dhbE5BYzYvLCBHYWxOQWM2XG4vR2FsTkFjNy8sIEdhbE5BYzdcbi9HYWxOQWM5LywgR2FsTkFjOVxuL0dhbE5BYzE0LywgR2FsTkFjMTRcbi9OQUczNy8sIE5BRzM3XG4vSEVHLywgKEhFRylcbi9URUcvLCAoVEVHKVxuL0FtbUM2LywgKE5IQzYpXG4vQW1tQzcvLCAoTkhDNylcbi9BbW1DMTIvLCAoTkhDMTIpXG4vaW52QWIvLCAoaW52YWJhc2ljKVxuL2ludmRULywgKGludmRUKVxuL1ZQbVUvLCAodmludSlcbiosIHBzXG4vMi1DMTZVLywgMi1DMTZVIFxuLzItQzE4dzlVLywgMi1DMTh3OVVcbi9KRGktUGFsbS8sIEpEaS1QYWxtXG4vSjItQ09OQzE2VS8sIEoyLUNPTkMxNlVcbi9KMi1DM05DMTZVLywgSjItQzNOQzE2VVxuL0otQzE1QWRhLywgSi1DMTVBZGFcbi9KLTJDMTVBZGFVLywgSi0yQzE1QWRhVVxuL0otQzE2TkM2LywgSi1DMTZOQzZcbi9SMi1DNk5ILVUvLCBSMi1DNk5ILVVcbi9KLU0xLywgSi1NMVxuL0otQjEvLCBKLUIxXG4vSi1CMi8sIEotQjJcbi9KLU0yLywgSi1NMlxuLzItQzE2Qy8sIDItQzE2Q1xuLzItQzE2QS8sIDItQzE2QVxuLzItQzE2Ry8sIDItQzE2R1xuL1IyLUM2TkgtRy8sIFIyLUM2TkgtR1xuL1IyLUM2TkgtQy8sIFIyLUM2TkgtQ1xuL0oyLUNPTkMxNkEvLCBKMi1DT05DMTZBXG4vSjItQ09OQzE2Qy8sIEoyLUNPTkMxNkNcbi9KMi1DT05DMTZHLywgSjItQ09OQzE2R1xuL0oyLUMxNUFkYUMvLCBKMi1DMTVBZGFDXG4vSjItTTJVLywgSjItTTJVXG4vSjItQjJVLywgSjItQjJVXG4vSjItQzNOQzE2Qy8sIEoyLUMzTkMxNkNcbi9KMi1DM05DMTZHLywgSjItQzNOQzE2R1xuL1IyLUM2TkgtQS8sIFIyLUM2TkgtQVxuL0oyLUMxNUFkYUEvLCBKMi1DMTVBZGFBXG4vSjItQzNOQzE2QS8sIEoyLUMzTkMxNkFcbi9KLUM1LVNFUi0xLywgSi1DNS1TRVItMVxuL0otQzE2LVNFUi0xLywgSi1DMTYtU0VSLTFcbi9KLUEyLywgSi1BMlxuL0otQTEvLCBKLUExXG4vSjItQzE1QWRhRy8sIEoyLUMxNUFkYUdcbi9KLUMxNk5Bc3AvLCBKLUMxNk5Bc3Bcbi9KMi1DMTZOQzZVLywgSjItQzE2TkM2VVxuL0otQzUtUkVCTy0xLywgSi1DNS1SRUJPLTFcbi9KLUMxNi1SRUJPLTEvLCBKLUMxNi1SRUJPLTFcbi9KLUMxNi1JTkQtMS8sIEotQzE2LUlORC0xXG4vSi1DNS1JTkQtMS8sIEotQzUtSU5ELTFcbi9KLTFDMTVBZGEtMk1hbi8sIEotMUMxNUFkYS0yTWFuXG4vSkctMUMxNUFkYS0yM0RpTWFuLywgSkctMUMxNUFkYS0yLDNEaU1hblxuL0otVHJpTWFuUEMvLCBKLVRyaU1hblBDXG4vSi10cmlNYW5QTy8sIEotdHJpTWFuUE9cbi9KLUE0LywgSi1BNFxuL0otQXJhLTEvLCBKLUFyYS0xXG4vSi1BcmEtMi8sIEotQXJhLTJcbi9KLUFjQ1MvLCBKLUFjQ1Ncbi9KLUNiQ1MvLCBKLUNiQ1Ncbi9KLU10Q0QvLCBKLU10Q0RgO1xuZnVuY3Rpb24gZGlmZmVyZW5jZU9mVHdvQXJyYXlzKGEsIGIpIHtcbiAgICByZXR1cm4gYS5maWx0ZXIoKHgpID0+ICFiLmluY2x1ZGVzKHgpKTtcbn1cbmNvbnN0IGNvZGVzV2l0aFNtaWxlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihTWU5USEVTSVpFUlMuR0NSUyk7XG5jb25zdCBhbGxHY3JzQ29kZXMgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihsY21zVG9HY3JzKS5nZXRDb2woJ0dDUlMnKS50b0xpc3QoKTtcbmV4cG9ydCBjb25zdCBnY3JzQ29kZXNXaXRob3V0U21pbGVzID0gZGlmZmVyZW5jZU9mVHdvQXJyYXlzKGFsbEdjcnNDb2RlcywgY29kZXNXaXRoU21pbGVzKTtcbmZvciAoY29uc3QgZSBvZiBnY3JzQ29kZXNXaXRob3V0U21pbGVzKVxuICAgIG1hcFtTWU5USEVTSVpFUlMuR0NSU11bJ090aGVycyddW2VdID0geyAnU01JTEVTJzogJycgfTtcbiIsImNvbnN0IFBIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgTyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IFRISU9QSE9TSEFURSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDUgNCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gLTEuNSAwIDAgMFxuTSAgVjMwIDIgUCAwIDAgMCAwXG5NICBWMzAgMyBPIDAgMSAwIDBcbk0gIFYzMCA0IFMgMCAtMSAwIDBcbk0gIFYzMCA1IE8gMS41IDAgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDEgMlxuTSAgVjMwIDIgMiAyIDNcbk0gIFYzMCAzIDEgMiA0XG5NICBWMzAgNCAxIDIgNVxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIEVORGA7XG5jb25zdCBJTlZBQkFTSUMgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA4IDggMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIDEuMDkzNCAtMi4xNjM2IDAgMFxuTSAgVjMwIDIgQyAxLjgzNjUgLTEuNDk0NSAwIDAgQ0ZHPTJcbk0gIFYzMCAzIEMgMi44MTQ3IC0xLjcwMjQgMCAwXG5NICBWMzAgNCBDIDMuMzE0NyAtMC44MzY0IDAgMFxuTSAgVjMwIDUgTyAyLjY0NTUgLTAuMDkzMiAwIDBcbk0gIFYzMCA2IEMgMS43MzIgLTAuNSAwIDAgQ0ZHPTFcbk0gIFYzMCA3IEMgMC44NjYgMCAwIDBcbk0gIFYzMCA4IE8gMC44NjYgMSAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMiAxIENGRz0xXG5NICBWMzAgMiAxIDIgM1xuTSAgVjMwIDMgMSAzIDRcbk0gIFYzMCA0IDEgNCA1XG5NICBWMzAgNSAxIDYgNVxuTSAgVjMwIDYgMSAyIDZcbk0gIFYzMCA3IDEgNiA3IENGRz0zXG5NICBWMzAgOCAxIDcgOFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KDIgMiA2KVxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5jb25zdCBHQUxOQUMgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbjAgIDAgIDAgICAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDExMSAxMTMgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0yMC43MzEzIC0wLjcwMjcgMCAwXG5NICBWMzAgMiBDIC0xOS4zOTc2IDAuMDY3MyAwIDBcbk0gIFYzMCAzIEMgLTE4LjA2MzggLTAuNzAyNyAwIDBcbk0gIFYzMCA0IEMgLTE2LjczMDMgMC4wNjczIDAgMFxuTSAgVjMwIDUgTiAtMTUuMzk2NSAtMC43MDI3IDAgMFxuTSAgVjMwIDYgQyAtMTQuMDYyOCAwLjA2NzMgMCAwXG5NICBWMzAgNyBDIC0xMi43MjkzIC0wLjcwMjcgMCAwXG5NICBWMzAgOCBDIC0xMS4zOTU1IDAuMDY3MyAwIDBcbk0gIFYzMCA5IEMgLTEwLjA2MiAtMC43MDI3IDAgMFxuTSAgVjMwIDEwIEMgLTguNzI4MyAwLjA2NzMgMCAwXG5NICBWMzAgMTEgTiAtNy4zOTQ3IC0wLjcwMjcgMCAwXG5NICBWMzAgMTIgTyAtMTguMDYzOCAtMi4yNDI3IDAgMFxuTSAgVjMwIDEzIE8gLTE0LjA2MjggMS42MDczIDAgMFxuTSAgVjMwIDE0IE8gLTguNzI4MyAxLjYwNzMgMCAwXG5NICBWMzAgMTUgQyAtNS44NTQ3IC0wLjcwMjcgMCAwXG5NICBWMzAgMTYgQyAtNS44NTQ3IDAuODM3MyAwIDBcbk0gIFYzMCAxNyBDIC01Ljg1NDcgLTIuMjQyNyAwIDBcbk0gIFYzMCAxOCBDIC0zLjQ4NDggLTMuMDEyNyAwIDBcbk0gIFYzMCAxOSBDIC0yLjQ1NDQgLTQuMTU3IDAgMFxuTSAgVjMwIDIwIEMgLTAuOTQ4IC0zLjgzNjggMCAwXG5NICBWMzAgMjEgTiAwLjA4MjQgLTQuOTgxMyAwIDBcbk0gIFYzMCAyMiBDIDEuNTg4OCAtNC42NjEyIDAgMFxuTSAgVjMwIDIzIEMgMi42MTkyIC01LjgwNTYgMCAwXG5NICBWMzAgMjQgQyA0LjEyNTYgLTUuNDg1NSAwIDBcbk0gIFYzMCAyNSBOIDUuMTU2IC02LjYyOTcgMCAwXG5NICBWMzAgMjYgQyA2LjY2MjQgLTYuMzA5NiAwIDBcbk0gIFYzMCAyNyBDIDcuNjkyOCAtNy40NTQxIDAgMFxuTSAgVjMwIDI4IEMgOS4xOTkyIC03LjEzMzkgMCAwXG5NICBWMzAgMjkgQyAxMC4yMjk2IC04LjI3ODQgMCAwXG5NICBWMzAgMzAgQyAxMS43MzYgLTcuOTU4MyAwIDBcbk0gIFYzMCAzMSBPIDEyLjc2NjQgLTkuMTAyNyAwIDBcbk0gIFYzMCAzMiBPIC0wLjQ3MjIgLTIuMzcyMyAwIDBcbk0gIFYzMCAzMyBPIDcuMTM4MiAtNC44NDUgMCAwXG5NICBWMzAgMzQgQyAxNC4yNzI4IC04Ljc4MjQgMCAwXG5NICBWMzAgMzUgQyAxNS4zMDMyIC05LjkyNjcgMCAwXG5NICBWMzAgMzYgQyAxNi44MDk4IC05LjYwNjUgMCAwXG5NICBWMzAgMzcgQyAxNy4yODU2IC04LjE0MjEgMCAwXG5NICBWMzAgMzggQyAxNi4yNTUyIC02Ljk5NzUgMCAwXG5NICBWMzAgMzkgTyAxNC43NDg2IC03LjMxNzggMCAwXG5NICBWMzAgNDAgQyAxNi43MzEyIC01LjUzMjkgMCAwXG5NICBWMzAgNDEgTyAxOC43OTE4IC03LjgyMTggMCAwXG5NICBWMzAgNDIgTyAxNy44NDA0IC0xMC43NTEgMCAwXG5NICBWMzAgNDMgTiAxNC44Mjc0IC0xMS4zOTE0IDAgMFxuTSAgVjMwIDQ0IEMgMTUuNzMyNSAtMTIuNjM3MiAwIDBcbk0gIFYzMCA0NSBDIDE1LjI1NjcgLTE0LjEwMTggMCAwXG5NICBWMzAgNDYgTyAxNy4yNTM3IC0xMi4zOTYzIDAgMFxuTSAgVjMwIDQ3IE8gMTguMjYyOCAtNS4zNzIgMCAwXG5NICBWMzAgNDggTyAtNC45NDk0IC0zLjQ4ODUgMCAwXG5NICBWMzAgNDkgQyAtNC41MjEgMC4wNjczIDAgMFxuTSAgVjMwIDUwIEMgLTEuOTQxNCAwLjIwMjYgMCAwXG5NICBWMzAgNTEgQyAtMC42MDc3IC0wLjU2NzQgMCAwXG5NICBWMzAgNTIgQyAwLjcyNiAwLjIwMjYgMCAwXG5NICBWMzAgNTMgTiAyLjA1OTYgLTAuNTY3NCAwIDBcbk0gIFYzMCA1NCBDIDMuMzkzMyAwLjIwMjYgMCAwXG5NICBWMzAgNTUgQyA0LjcyNzEgLTAuNTY3NCAwIDBcbk0gIFYzMCA1NiBDIDYuMDYwNiAwLjIwMjYgMCAwXG5NICBWMzAgNTcgTiA3LjM5NDMgLTAuNTY3NCAwIDBcbk0gIFYzMCA1OCBDIDguNzI4MSAwLjIwMjYgMCAwXG5NICBWMzAgNTkgQyAxMC4wNjE4IC0wLjU2NzQgMCAwXG5NICBWMzAgNjAgQyAxMS4zOTUzIDAuMjAyNiAwIDBcbk0gIFYzMCA2MSBDIDE0LjA2MjggMC4yMDI2IDAgMFxuTSAgVjMwIDYyIE8gMTUuMzk2NCAtMC41Njc0IDAgMFxuTSAgVjMwIDYzIE8gMC43MjYgMS43NDI2IDAgMFxuTSAgVjMwIDY0IE8gOC43MjgxIDEuNzQyNiAwIDBcbk0gIFYzMCA2NSBDIDE2LjczMDEgMC4yMDI2IDAgMFxuTSAgVjMwIDY2IEMgMTguMDYzOCAtMC41Njc2IDAgMFxuTSAgVjMwIDY3IEMgMTkuMzk3NiAwLjIwMjYgMCAwXG5NICBWMzAgNjggQyAxOS4zOTc0IDEuNzQyNiAwIDBcbk0gIFYzMCA2OSBDIDE4LjA2MzggMi41MTI2IDAgMFxuTSAgVjMwIDcwIE8gMTYuNzMwMSAxLjc0MjYgMCAwXG5NICBWMzAgNzEgQyAxOC4wNjQgNC4wNTI2IDAgMFxuTSAgVjMwIDcyIE8gMjAuNzMxMSAyLjUxMjYgMCAwXG5NICBWMzAgNzMgTyAyMC43MzEzIC0wLjU2NzQgMCAwXG5NICBWMzAgNzQgTiAxOC4wNjM4IC0yLjEwNzYgMCAwXG5NICBWMzAgNzUgQyAxOS4zMDk2IC0zLjAxMjcgMCAwXG5NICBWMzAgNzYgQyAxOS4zMDk2IC00LjU1MjcgMCAwXG5NICBWMzAgNzcgTyAyMC42ODE4IC0yLjMxMzUgMCAwXG5NICBWMzAgNzggTyAxOS40NzA5IDQuNjc5MSAwIDBcbk0gIFYzMCA3OSBPIC0zLjE4NzIgLTAuNzAyNyAwIDBcbk0gIFYzMCA4MCBDIDEyLjcyOTEgLTAuNTY3NCAwIDBcbk0gIFYzMCA4MSBDIC0zLjkxOSAzLjIyNzcgMCAwXG5NICBWMzAgODIgQyAtMi40MTI2IDIuOTA3NiAwIDBcbk0gIFYzMCA4MyBDIC0xLjM4MjIgNC4wNTE5IDAgMFxuTSAgVjMwIDg0IE4gMC4xMjQyIDMuNzMxNyAwIDBcbk0gIFYzMCA4NSBDIDEuMTU0NiA0Ljg3NjIgMCAwXG5NICBWMzAgODYgQyAyLjY2MSA0LjU1NjEgMCAwXG5NICBWMzAgODcgQyAzLjY5MTQgNS43MDA1IDAgMFxuTSAgVjMwIDg4IE4gNS4xOTc4IDUuMzgwNCAwIDBcbk0gIFYzMCA4OSBDIDYuMjI4MiA2LjUyNDggMCAwXG5NICBWMzAgOTAgQyA3LjczNDYgNi4yMDQ1IDAgMFxuTSAgVjMwIDkxIEMgOC43NjUgNy4zNDkgMCAwXG5NICBWMzAgOTIgQyAxMC4yNzE0IDcuMDI4OCAwIDBcbk0gIFYzMCA5MyBDIDExLjMwMTggOC4xNzMzIDAgMFxuTSAgVjMwIDk0IE8gMTIuODA4MiA3Ljg1MzIgMCAwXG5NICBWMzAgOTUgTyAtMS44NTggNS41MTY3IDAgMFxuTSAgVjMwIDk2IE8gNS43NTI0IDcuOTg5NCAwIDBcbk0gIFYzMCA5NyBDIDEzLjgzODYgOC45OTc2IDAgMFxuTSAgVjMwIDk4IEMgMTUuMzQ1IDguNjc3MyAwIDBcbk0gIFYzMCA5OSBDIDE2LjM3NTYgOS44MjE5IDAgMFxuTSAgVjMwIDEwMCBDIDE1Ljg5OTYgMTEuMjg2MyAwIDBcbk0gIFYzMCAxMDEgQyAxNC4zOTM0IDExLjYwNjggMCAwXG5NICBWMzAgMTAyIE8gMTMuMzYyOCAxMC40NjIyIDAgMFxuTSAgVjMwIDEwMyBDIDEzLjkxNzYgMTMuMDcxNCAwIDBcbk0gIFYzMCAxMDQgTyAxNi45MyAxMi40MzA4IDAgMFxuTSAgVjMwIDEwNSBPIDE3Ljg4MiA5LjUwMTggMCAwXG5NICBWMzAgMTA2IE4gMTUuODIwOCA3LjIxMjcgMCAwXG5NICBWMzAgMTA3IEMgMTcuMjg1NiA2LjczNjcgMCAwXG5NICBWMzAgMTA4IEMgMTcuNzYxNCA1LjI3MjEgMCAwXG5NICBWMzAgMTA5IE8gMTguMzc0NCA3LjgyNTcgMCAwXG5NICBWMzAgMTEwIE8gMTUuMDYyIDE0LjEwMTggMCAwXG5NICBWMzAgMTExIE8gLTQuODI0MSAxLjk4MTcgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDIgM1xuTSAgVjMwIDIgMSAzIDRcbk0gIFYzMCAzIDEgNiA3XG5NICBWMzAgNCAxIDcgOFxuTSAgVjMwIDUgMSA4IDlcbk0gIFYzMCA2IDEgOSAxMFxuTSAgVjMwIDcgMSAxIDJcbk0gIFYzMCA4IDEgMyAxMlxuTSAgVjMwIDkgMSA0IDVcbk0gIFYzMCAxMCAxIDUgNlxuTSAgVjMwIDExIDIgNiAxM1xuTSAgVjMwIDEyIDEgMTAgMTFcbk0gIFYzMCAxMyAxIDExIDE1XG5NICBWMzAgMTQgMSAxNSAxNlxuTSAgVjMwIDE1IDEgMTUgMTdcbk0gIFYzMCAxNiAyIDEwIDE0XG5NICBWMzAgMTcgMSAxOCAxOVxuTSAgVjMwIDE4IDEgMTkgMjBcbk0gIFYzMCAxOSAxIDIyIDIzXG5NICBWMzAgMjAgMSAyMyAyNFxuTSAgVjMwIDIxIDEgMjYgMjdcbk0gIFYzMCAyMiAxIDI3IDI4XG5NICBWMzAgMjMgMSAyOCAyOVxuTSAgVjMwIDI0IDEgMjkgMzBcbk0gIFYzMCAyNSAyIDI2IDMzXG5NICBWMzAgMjYgMiAyMCAzMlxuTSAgVjMwIDI3IDEgMjAgMjFcbk0gIFYzMCAyOCAxIDIxIDIyXG5NICBWMzAgMjkgMSAyNCAyNVxuTSAgVjMwIDMwIDEgMjUgMjZcbk0gIFYzMCAzMSAxIDMwIDMxXG5NICBWMzAgMzIgMSAzMSAzNFxuTSAgVjMwIDMzIDEgMzUgMzZcbk0gIFYzMCAzNCAxIDM2IDM3XG5NICBWMzAgMzUgMSAzNyAzOFxuTSAgVjMwIDM2IDEgMzQgMzVcbk0gIFYzMCAzNyAxIDM4IDM5XG5NICBWMzAgMzggMSAzNCAzOVxuTSAgVjMwIDM5IDEgMzggNDBcbk0gIFYzMCA0MCAxIDM1IDQzXG5NICBWMzAgNDEgMSA0MyA0NFxuTSAgVjMwIDQyIDEgNDQgNDVcbk0gIFYzMCA0MyAyIDQ0IDQ2XG5NICBWMzAgNDQgMSAzNiA0MlxuTSAgVjMwIDQ1IDEgMzcgNDFcbk0gIFYzMCA0NiAxIDQwIDQ3XG5NICBWMzAgNDcgMSAxOCA0OFxuTSAgVjMwIDQ4IDEgMTUgNDlcbk0gIFYzMCA0OSAxIDUwIDUxXG5NICBWMzAgNTAgMSA1MSA1MlxuTSAgVjMwIDUxIDEgNTQgNTVcbk0gIFYzMCA1MiAxIDU1IDU2XG5NICBWMzAgNTMgMSA1OCA1OVxuTSAgVjMwIDU0IDEgNTkgNjBcbk0gIFYzMCA1NSAyIDU4IDY0XG5NICBWMzAgNTYgMiA1MiA2M1xuTSAgVjMwIDU3IDEgNTIgNTNcbk0gIFYzMCA1OCAxIDUzIDU0XG5NICBWMzAgNTkgMSA1NiA1N1xuTSAgVjMwIDYwIDEgNTcgNThcbk0gIFYzMCA2MSAxIDYxIDYyXG5NICBWMzAgNjIgMSA2MiA2NVxuTSAgVjMwIDYzIDEgNjYgNjdcbk0gIFYzMCA2NCAxIDY3IDY4XG5NICBWMzAgNjUgMSA2OCA2OVxuTSAgVjMwIDY2IDEgNjUgNjZcbk0gIFYzMCA2NyAxIDY5IDcwXG5NICBWMzAgNjggMSA2NSA3MFxuTSAgVjMwIDY5IDEgNjkgNzFcbk0gIFYzMCA3MCAxIDY2IDc0XG5NICBWMzAgNzEgMSA3NCA3NVxuTSAgVjMwIDcyIDEgNzUgNzZcbk0gIFYzMCA3MyAyIDc1IDc3XG5NICBWMzAgNzQgMSA2NyA3M1xuTSAgVjMwIDc1IDEgNjggNzJcbk0gIFYzMCA3NiAxIDcxIDc4XG5NICBWMzAgNzcgMSA1MCA3OVxuTSAgVjMwIDc4IDEgNDkgNzlcbk0gIFYzMCA3OSAxIDYwIDgwXG5NICBWMzAgODAgMSA4MCA2MVxuTSAgVjMwIDgxIDEgODEgODJcbk0gIFYzMCA4MiAxIDgyIDgzXG5NICBWMzAgODMgMSA4NSA4NlxuTSAgVjMwIDg0IDEgODYgODdcbk0gIFYzMCA4NSAxIDg5IDkwXG5NICBWMzAgODYgMSA5MCA5MVxuTSAgVjMwIDg3IDEgOTEgOTJcbk0gIFYzMCA4OCAxIDkyIDkzXG5NICBWMzAgODkgMiA4OSA5NlxuTSAgVjMwIDkwIDIgODMgOTVcbk0gIFYzMCA5MSAxIDgzIDg0XG5NICBWMzAgOTIgMSA4NCA4NVxuTSAgVjMwIDkzIDEgODcgODhcbk0gIFYzMCA5NCAxIDg4IDg5XG5NICBWMzAgOTUgMSA5MyA5NFxuTSAgVjMwIDk2IDEgOTQgOTdcbk0gIFYzMCA5NyAxIDk4IDk5XG5NICBWMzAgOTggMSA5OSAxMDBcbk0gIFYzMCA5OSAxIDEwMCAxMDFcbk0gIFYzMCAxMDAgMSA5NyA5OFxuTSAgVjMwIDEwMSAxIDEwMSAxMDJcbk0gIFYzMCAxMDIgMSA5NyAxMDJcbk0gIFYzMCAxMDMgMSAxMDEgMTAzXG5NICBWMzAgMTA0IDEgOTggMTA2XG5NICBWMzAgMTA1IDEgMTA2IDEwN1xuTSAgVjMwIDEwNiAxIDEwNyAxMDhcbk0gIFYzMCAxMDcgMiAxMDcgMTA5XG5NICBWMzAgMTA4IDEgOTkgMTA1XG5NICBWMzAgMTA5IDEgMTAwIDEwNFxuTSAgVjMwIDExMCAxIDEwMyAxMTBcbk0gIFYzMCAxMTEgMSA4MSAxMTFcbk0gIFYzMCAxMTIgMSAxNiAxMTFcbk0gIFYzMCAxMTMgMSAxNyA0OFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5jb25zdCBHQUxOQUNQUklNRSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlcyAgICAgICAgICBcblxuMCAgMCAgMCAgICAgMCAgMCAgICAgICAgICAgIDk5OSBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgMTExIDExMyAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMjAuNzMxMyAwLjcwMjcgMCAwXG5NICBWMzAgMiBDIDE5LjM5NzYgLTAuMDY3MyAwIDBcbk0gIFYzMCAzIEMgMTguMDYzOCAwLjcwMjcgMCAwXG5NICBWMzAgNCBDIDE2LjczMDMgLTAuMDY3MyAwIDBcbk0gIFYzMCA1IE4gMTUuMzk2NSAwLjcwMjcgMCAwXG5NICBWMzAgNiBDIDE0LjA2MjggLTAuMDY3MyAwIDBcbk0gIFYzMCA3IEMgMTIuNzI5MyAwLjcwMjcgMCAwXG5NICBWMzAgOCBDIDExLjM5NTUgLTAuMDY3MyAwIDBcbk0gIFYzMCA5IEMgMTAuMDYyIDAuNzAyNyAwIDBcbk0gIFYzMCAxMCBDIDguNzI4MyAtMC4wNjczIDAgMFxuTSAgVjMwIDExIE4gNy4zOTQ3IDAuNzAyNyAwIDBcbk0gIFYzMCAxMiBPIDE4LjA2MzggMi4yNDI3IDAgMFxuTSAgVjMwIDEzIE8gMTQuMDYyOCAtMS42MDczIDAgMFxuTSAgVjMwIDE0IE8gOC43MjgzIC0xLjYwNzMgMCAwXG5NICBWMzAgMTUgQyA1Ljg1NDcgMC43MDI3IDAgMFxuTSAgVjMwIDE2IEMgNS44NTQ3IC0wLjgzNzMgMCAwXG5NICBWMzAgMTcgQyA1Ljg1NDcgMi4yNDI3IDAgMFxuTSAgVjMwIDE4IEMgMy40ODQ4IDMuMDEyNyAwIDBcbk0gIFYzMCAxOSBDIDIuNDU0NCA0LjE1NyAwIDBcbk0gIFYzMCAyMCBDIDAuOTQ4IDMuODM2OCAwIDBcbk0gIFYzMCAyMSBOIC0wLjA4MjQgNC45ODEzIDAgMFxuTSAgVjMwIDIyIEMgLTEuNTg4OCA0LjY2MTIgMCAwXG5NICBWMzAgMjMgQyAtMi42MTkyIDUuODA1NiAwIDBcbk0gIFYzMCAyNCBDIC00LjEyNTYgNS40ODU1IDAgMFxuTSAgVjMwIDI1IE4gLTUuMTU2IDYuNjI5NyAwIDBcbk0gIFYzMCAyNiBDIC02LjY2MjQgNi4zMDk2IDAgMFxuTSAgVjMwIDI3IEMgLTcuNjkyOCA3LjQ1NDEgMCAwXG5NICBWMzAgMjggQyAtOS4xOTkyIDcuMTMzOSAwIDBcbk0gIFYzMCAyOSBDIC0xMC4yMjk2IDguMjc4NCAwIDBcbk0gIFYzMCAzMCBDIC0xMS43MzYgNy45NTgzIDAgMFxuTSAgVjMwIDMxIE8gLTEyLjc2NjQgOS4xMDI3IDAgMFxuTSAgVjMwIDMyIE8gMC40NzIyIDIuMzcyMyAwIDBcbk0gIFYzMCAzMyBPIC03LjEzODIgNC44NDUgMCAwXG5NICBWMzAgMzQgQyAtMTQuMjcyOCA4Ljc4MjQgMCAwXG5NICBWMzAgMzUgQyAtMTUuMzAzMiA5LjkyNjcgMCAwXG5NICBWMzAgMzYgQyAtMTYuODA5OCA5LjYwNjUgMCAwXG5NICBWMzAgMzcgQyAtMTcuMjg1NiA4LjE0MjEgMCAwXG5NICBWMzAgMzggQyAtMTYuMjU1MiA2Ljk5NzUgMCAwXG5NICBWMzAgMzkgTyAtMTQuNzQ4NiA3LjMxNzggMCAwXG5NICBWMzAgNDAgQyAtMTYuNzMxMiA1LjUzMjkgMCAwXG5NICBWMzAgNDEgTyAtMTguNzkxOCA3LjgyMTggMCAwXG5NICBWMzAgNDIgTyAtMTcuODQwNCAxMC43NTEgMCAwXG5NICBWMzAgNDMgTiAtMTQuODI3NCAxMS4zOTE0IDAgMFxuTSAgVjMwIDQ0IEMgLTE1LjczMjUgMTIuNjM3MiAwIDBcbk0gIFYzMCA0NSBDIC0xNS4yNTY3IDE0LjEwMTggMCAwXG5NICBWMzAgNDYgTyAtMTcuMjUzNyAxMi4zOTYzIDAgMFxuTSAgVjMwIDQ3IE8gLTE4LjI2MjggNS4zNzIgMCAwXG5NICBWMzAgNDggTyA0Ljk0OTQgMy40ODg1IDAgMFxuTSAgVjMwIDQ5IEMgNC41MjEgLTAuMDY3MyAwIDBcbk0gIFYzMCA1MCBDIDEuOTQxNCAtMC4yMDI2IDAgMFxuTSAgVjMwIDUxIEMgMC42MDc3IDAuNTY3NCAwIDBcbk0gIFYzMCA1MiBDIC0wLjcyNiAtMC4yMDI2IDAgMFxuTSAgVjMwIDUzIE4gLTIuMDU5NiAwLjU2NzQgMCAwXG5NICBWMzAgNTQgQyAtMy4zOTMzIC0wLjIwMjYgMCAwXG5NICBWMzAgNTUgQyAtNC43MjcxIDAuNTY3NCAwIDBcbk0gIFYzMCA1NiBDIC02LjA2MDYgLTAuMjAyNiAwIDBcbk0gIFYzMCA1NyBOIC03LjM5NDMgMC41Njc0IDAgMFxuTSAgVjMwIDU4IEMgLTguNzI4MSAtMC4yMDI2IDAgMFxuTSAgVjMwIDU5IEMgLTEwLjA2MTggMC41Njc0IDAgMFxuTSAgVjMwIDYwIEMgLTExLjM5NTMgLTAuMjAyNiAwIDBcbk0gIFYzMCA2MSBDIC0xNC4wNjI4IC0wLjIwMjYgMCAwXG5NICBWMzAgNjIgTyAtMTUuMzk2NCAwLjU2NzQgMCAwXG5NICBWMzAgNjMgTyAtMC43MjYgLTEuNzQyNiAwIDBcbk0gIFYzMCA2NCBPIC04LjcyODEgLTEuNzQyNiAwIDBcbk0gIFYzMCA2NSBDIC0xNi43MzAxIC0wLjIwMjYgMCAwXG5NICBWMzAgNjYgQyAtMTguMDYzOCAwLjU2NzYgMCAwXG5NICBWMzAgNjcgQyAtMTkuMzk3NiAtMC4yMDI2IDAgMFxuTSAgVjMwIDY4IEMgLTE5LjM5NzQgLTEuNzQyNiAwIDBcbk0gIFYzMCA2OSBDIC0xOC4wNjM4IC0yLjUxMjYgMCAwXG5NICBWMzAgNzAgTyAtMTYuNzMwMSAtMS43NDI2IDAgMFxuTSAgVjMwIDcxIEMgLTE4LjA2NCAtNC4wNTI2IDAgMFxuTSAgVjMwIDcyIE8gLTIwLjczMTEgLTIuNTEyNiAwIDBcbk0gIFYzMCA3MyBPIC0yMC43MzEzIDAuNTY3NCAwIDBcbk0gIFYzMCA3NCBOIC0xOC4wNjM4IDIuMTA3NiAwIDBcbk0gIFYzMCA3NSBDIC0xOS4zMDk2IDMuMDEyNyAwIDBcbk0gIFYzMCA3NiBDIC0xOS4zMDk2IDQuNTUyNyAwIDBcbk0gIFYzMCA3NyBPIC0yMC42ODE4IDIuMzEzNSAwIDBcbk0gIFYzMCA3OCBPIC0xOS40NzA5IC00LjY3OTEgMCAwXG5NICBWMzAgNzkgTyAzLjE4NzIgMC43MDI3IDAgMFxuTSAgVjMwIDgwIEMgLTEyLjcyOTEgMC41Njc0IDAgMFxuTSAgVjMwIDgxIEMgMy45MTkgLTMuMjI3NyAwIDBcbk0gIFYzMCA4MiBDIDIuNDEyNiAtMi45MDc2IDAgMFxuTSAgVjMwIDgzIEMgMS4zODIyIC00LjA1MTkgMCAwXG5NICBWMzAgODQgTiAtMC4xMjQyIC0zLjczMTcgMCAwXG5NICBWMzAgODUgQyAtMS4xNTQ2IC00Ljg3NjIgMCAwXG5NICBWMzAgODYgQyAtMi42NjEgLTQuNTU2MSAwIDBcbk0gIFYzMCA4NyBDIC0zLjY5MTQgLTUuNzAwNSAwIDBcbk0gIFYzMCA4OCBOIC01LjE5NzggLTUuMzgwNCAwIDBcbk0gIFYzMCA4OSBDIC02LjIyODIgLTYuNTI0OCAwIDBcbk0gIFYzMCA5MCBDIC03LjczNDYgLTYuMjA0NSAwIDBcbk0gIFYzMCA5MSBDIC04Ljc2NSAtNy4zNDkgMCAwXG5NICBWMzAgOTIgQyAtMTAuMjcxNCAtNy4wMjg4IDAgMFxuTSAgVjMwIDkzIEMgLTExLjMwMTggLTguMTczMyAwIDBcbk0gIFYzMCA5NCBPIC0xMi44MDgyIC03Ljg1MzIgMCAwXG5NICBWMzAgOTUgTyAxLjg1OCAtNS41MTY3IDAgMFxuTSAgVjMwIDk2IE8gLTUuNzUyNCAtNy45ODk0IDAgMFxuTSAgVjMwIDk3IEMgLTEzLjgzODYgLTguOTk3NiAwIDBcbk0gIFYzMCA5OCBDIC0xNS4zNDUgLTguNjc3MyAwIDBcbk0gIFYzMCA5OSBDIC0xNi4zNzU2IC05LjgyMTkgMCAwXG5NICBWMzAgMTAwIEMgLTE1Ljg5OTYgLTExLjI4NjMgMCAwXG5NICBWMzAgMTAxIEMgLTE0LjM5MzQgLTExLjYwNjggMCAwXG5NICBWMzAgMTAyIE8gLTEzLjM2MjggLTEwLjQ2MjIgMCAwXG5NICBWMzAgMTAzIEMgLTEzLjkxNzYgLTEzLjA3MTQgMCAwXG5NICBWMzAgMTA0IE8gLTE2LjkzIC0xMi40MzA4IDAgMFxuTSAgVjMwIDEwNSBPIC0xNy44ODIgLTkuNTAxOCAwIDBcbk0gIFYzMCAxMDYgTiAtMTUuODIwOCAtNy4yMTI3IDAgMFxuTSAgVjMwIDEwNyBDIC0xNy4yODU2IC02LjczNjcgMCAwXG5NICBWMzAgMTA4IEMgLTE3Ljc2MTQgLTUuMjcyMSAwIDBcbk0gIFYzMCAxMDkgTyAtMTguMzc0NCAtNy44MjU3IDAgMFxuTSAgVjMwIDExMCBPIC0xNS4wNjIgLTE0LjEwMTggMCAwXG5NICBWMzAgMTExIE8gNC44MjQxIC0xLjk4MTcgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDIgM1xuTSAgVjMwIDIgMSAzIDRcbk0gIFYzMCAzIDEgNiA3XG5NICBWMzAgNCAxIDcgOFxuTSAgVjMwIDUgMSA4IDlcbk0gIFYzMCA2IDEgOSAxMFxuTSAgVjMwIDcgMSAxIDJcbk0gIFYzMCA4IDEgMyAxMlxuTSAgVjMwIDkgMSA0IDVcbk0gIFYzMCAxMCAxIDUgNlxuTSAgVjMwIDExIDIgNiAxM1xuTSAgVjMwIDEyIDEgMTAgMTFcbk0gIFYzMCAxMyAxIDExIDE1XG5NICBWMzAgMTQgMSAxNSAxNlxuTSAgVjMwIDE1IDEgMTUgMTdcbk0gIFYzMCAxNiAyIDEwIDE0XG5NICBWMzAgMTcgMSAxOCAxOVxuTSAgVjMwIDE4IDEgMTkgMjBcbk0gIFYzMCAxOSAxIDIyIDIzXG5NICBWMzAgMjAgMSAyMyAyNFxuTSAgVjMwIDIxIDEgMjYgMjdcbk0gIFYzMCAyMiAxIDI3IDI4XG5NICBWMzAgMjMgMSAyOCAyOVxuTSAgVjMwIDI0IDEgMjkgMzBcbk0gIFYzMCAyNSAyIDI2IDMzXG5NICBWMzAgMjYgMiAyMCAzMlxuTSAgVjMwIDI3IDEgMjAgMjFcbk0gIFYzMCAyOCAxIDIxIDIyXG5NICBWMzAgMjkgMSAyNCAyNVxuTSAgVjMwIDMwIDEgMjUgMjZcbk0gIFYzMCAzMSAxIDMwIDMxXG5NICBWMzAgMzIgMSAzMSAzNFxuTSAgVjMwIDMzIDEgMzUgMzZcbk0gIFYzMCAzNCAxIDM2IDM3XG5NICBWMzAgMzUgMSAzNyAzOFxuTSAgVjMwIDM2IDEgMzQgMzVcbk0gIFYzMCAzNyAxIDM4IDM5XG5NICBWMzAgMzggMSAzNCAzOVxuTSAgVjMwIDM5IDEgMzggNDBcbk0gIFYzMCA0MCAxIDM1IDQzXG5NICBWMzAgNDEgMSA0MyA0NFxuTSAgVjMwIDQyIDEgNDQgNDVcbk0gIFYzMCA0MyAyIDQ0IDQ2XG5NICBWMzAgNDQgMSAzNiA0MlxuTSAgVjMwIDQ1IDEgMzcgNDFcbk0gIFYzMCA0NiAxIDQwIDQ3XG5NICBWMzAgNDcgMSAxOCA0OFxuTSAgVjMwIDQ4IDEgMTUgNDlcbk0gIFYzMCA0OSAxIDUwIDUxXG5NICBWMzAgNTAgMSA1MSA1MlxuTSAgVjMwIDUxIDEgNTQgNTVcbk0gIFYzMCA1MiAxIDU1IDU2XG5NICBWMzAgNTMgMSA1OCA1OVxuTSAgVjMwIDU0IDEgNTkgNjBcbk0gIFYzMCA1NSAyIDU4IDY0XG5NICBWMzAgNTYgMiA1MiA2M1xuTSAgVjMwIDU3IDEgNTIgNTNcbk0gIFYzMCA1OCAxIDUzIDU0XG5NICBWMzAgNTkgMSA1NiA1N1xuTSAgVjMwIDYwIDEgNTcgNThcbk0gIFYzMCA2MSAxIDYxIDYyXG5NICBWMzAgNjIgMSA2MiA2NVxuTSAgVjMwIDYzIDEgNjYgNjdcbk0gIFYzMCA2NCAxIDY3IDY4XG5NICBWMzAgNjUgMSA2OCA2OVxuTSAgVjMwIDY2IDEgNjUgNjZcbk0gIFYzMCA2NyAxIDY5IDcwXG5NICBWMzAgNjggMSA2NSA3MFxuTSAgVjMwIDY5IDEgNjkgNzFcbk0gIFYzMCA3MCAxIDY2IDc0XG5NICBWMzAgNzEgMSA3NCA3NVxuTSAgVjMwIDcyIDEgNzUgNzZcbk0gIFYzMCA3MyAyIDc1IDc3XG5NICBWMzAgNzQgMSA2NyA3M1xuTSAgVjMwIDc1IDEgNjggNzJcbk0gIFYzMCA3NiAxIDcxIDc4XG5NICBWMzAgNzcgMSA1MCA3OVxuTSAgVjMwIDc4IDEgNDkgNzlcbk0gIFYzMCA3OSAxIDYwIDgwXG5NICBWMzAgODAgMSA4MCA2MVxuTSAgVjMwIDgxIDEgODEgODJcbk0gIFYzMCA4MiAxIDgyIDgzXG5NICBWMzAgODMgMSA4NSA4NlxuTSAgVjMwIDg0IDEgODYgODdcbk0gIFYzMCA4NSAxIDg5IDkwXG5NICBWMzAgODYgMSA5MCA5MVxuTSAgVjMwIDg3IDEgOTEgOTJcbk0gIFYzMCA4OCAxIDkyIDkzXG5NICBWMzAgODkgMiA4OSA5NlxuTSAgVjMwIDkwIDIgODMgOTVcbk0gIFYzMCA5MSAxIDgzIDg0XG5NICBWMzAgOTIgMSA4NCA4NVxuTSAgVjMwIDkzIDEgODcgODhcbk0gIFYzMCA5NCAxIDg4IDg5XG5NICBWMzAgOTUgMSA5MyA5NFxuTSAgVjMwIDk2IDEgOTQgOTdcbk0gIFYzMCA5NyAxIDk4IDk5XG5NICBWMzAgOTggMSA5OSAxMDBcbk0gIFYzMCA5OSAxIDEwMCAxMDFcbk0gIFYzMCAxMDAgMSA5NyA5OFxuTSAgVjMwIDEwMSAxIDEwMSAxMDJcbk0gIFYzMCAxMDIgMSA5NyAxMDJcbk0gIFYzMCAxMDMgMSAxMDEgMTAzXG5NICBWMzAgMTA0IDEgOTggMTA2XG5NICBWMzAgMTA1IDEgMTA2IDEwN1xuTSAgVjMwIDEwNiAxIDEwNyAxMDhcbk0gIFYzMCAxMDcgMiAxMDcgMTA5XG5NICBWMzAgMTA4IDEgOTkgMTA1XG5NICBWMzAgMTA5IDEgMTAwIDEwNFxuTSAgVjMwIDExMCAxIDEwMyAxMTBcbk0gIFYzMCAxMTEgMSA4MSAxMTFcbk0gIFYzMCAxMTIgMSAxNiAxMTFcbk0gIFYzMCAxMTMgMSAxNyA0OFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyA/IG1vbEJsb2Nrcy5wdXNoKEdBTE5BQykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQykoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQykoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyA/IG1vbEJsb2Nrcy5wdXNoKEdBTE5BQ1BSSU1FKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2NrcywgZmFsc2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtWMzAwMChtb2xCbG9ja3MsIHR3b0NoYWlucyA9IGZhbHNlLCB1c2VDaGlyYWxpdHkgPSB0cnVlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCB4U2hpZnQgPSAwO1xuICAgIGlmICh0d29DaGFpbnMgJiYgbW9sQmxvY2tzLmxlbmd0aCA+IDEpXG4gICAgICAgIG1vbEJsb2Nrc1sxXSA9IGludmVydE51Y2xlb3RpZGVzVjMwMDAobW9sQmxvY2tzWzFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbEJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0ucmVwbGFjZUFsbCgnKC1cXG5NICBWMzAgJywgJygnKVxuICAgICAgICAgICAgLnJlcGxhY2VBbGwoJy1cXG5NICBWMzAgJywgJycpLnJlcGxhY2VBbGwoJyApJywgJyknKTtcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tc0JvbmRzTnVtYmVyc1YzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZXh0cmFjdEF0b21EYXRhVjMwMDAobW9sQmxvY2tzW2ldKTtcbiAgICAgICAgaWYgKHR3b0NoYWlucykge1xuICAgICAgICAgICAgY29uc3QgeFNoaWZ0UmlnaHQgPSBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KTtcbiAgICAgICAgICAgIGNvbnN0IHlTaGlmdCA9IGkgPT0gMCA/IE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLnkpIC0gMSA6IE1hdGgubWF4KC4uLmNvb3JkaW5hdGVzLnkpICsgMTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29vcmRpbmF0ZXMueC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy54W2pdIC09IHhTaGlmdFJpZ2h0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlcy55Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnlbal0gLT0geVNoaWZ0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgICAgICBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4QXRvbXMpO1xuICAgICAgICBsZXQgaW5kZXggPSBpbmRleEF0b21zO1xuICAgICAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmF0b207IGorKykge1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmF0b21JbmRleFtqXSAhPSAxIHx8IGkgPT0gMCB8fCB0d29DaGFpbnMpIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0gdHdvQ2hhaW5zID8gMCA6IHhTaGlmdCAtIGNvb3JkaW5hdGVzLnhbMF07XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGUgPSB0d29DaGFpbnMgP1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKDEwMDAwICogY29vcmRpbmF0ZXMueFtqXSkgLyAxMDAwMCA6XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9IHR3b0NoYWlucyA/XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiBjb29yZGluYXRlcy55W2pdKSAvIDEwMDAwIDpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIChwYXJzZUZsb2F0KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkpKSAvIDEwMDAwO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBjb29yZGluYXRlICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwJywgaW5kZXgpIC0gMTtcbiAgICAgICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4QXRvbXNFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBBVE9NJyk7XG4gICAgICAgIGF0b21CbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4QXRvbXMgKyAxLCBpbmRleEF0b21zRW5kKTtcbiAgICAgICAgbGV0IGluZGV4Qm9uZHMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEJFR0lOIEJPTkQnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGJvbmRzXG4gICAgICAgIGluZGV4Qm9uZHMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXhCb25kcyk7XG4gICAgICAgIGluZGV4ID0gaW5kZXhCb25kcztcbiAgICAgICAgaW5kZXhFbmQgPSBpbmRleEJvbmRzO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmJvbmQ7IGorKykge1xuICAgICAgICAgICAgLy9yZXdyaXRlIGJvbmQgbnVtYmVyXG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGJvbmROdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmJvbmQ7XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYm9uZE51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBwYWlyIGluIGJvbmRcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgbGV0IGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gTWF0aC5taW4obW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSwgbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkpO1xuICAgICAgICAgICAgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhCb25kRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBFTkQgQk9ORCcpO1xuICAgICAgICBib25kQmxvY2sgKz0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleEJvbmRzICsgMSwgaW5kZXhCb25kRW5kKTtcbiAgICAgICAgbGV0IGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyk7IC8vIFYzMDAwIGluZGV4IGZvciBjb2xsZWN0aW9uc1xuICAgICAgICB3aGlsZSAoaW5kZXhDb2xsZWN0aW9uICE9IC0xKSB7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gKz0gMjg7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyknLCBpbmRleENvbGxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Q29sbGVjdGlvbiwgY29sbGVjdGlvbkVuZCkuc3BsaXQoJyAnKS5zbGljZSgxKTtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25FbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2gocGFyc2VJbnQoZSkgKyBuYXRvbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IGNvbGxlY3Rpb25FbmQ7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbmF0b20gKz0gdHdvQ2hhaW5zID8gbnVtYmVycy5uYXRvbSA6IG51bWJlcnMubmF0b20gLSAxO1xuICAgICAgICBuYm9uZCArPSBudW1iZXJzLm5ib25kO1xuICAgICAgICB4U2hpZnQgKz0gdHdvQ2hhaW5zID8gMCA6IGNvb3JkaW5hdGVzLnhbbnVtYmVycy5uYXRvbSAtIDFdIC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IDQ7XG4gICAgY29uc3QgY29sbE51bWJlciA9IE1hdGguY2VpbChjb2xsZWN0aW9uLmxlbmd0aCAvIGVudHJpZXMpO1xuICAgIC8vaWYgKG9jbFJlbmRlcikge1xuICAgIC8vIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAvLyBmb3IgKGxldCBqID0gMDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspXG4gICAgLy8gICBjb2xsZWN0aW9uQmxvY2sgKz0gJyAnICsgY29sbGVjdGlvbltqXTtcbiAgICAvLyBjb2xsZWN0aW9uQmxvY2sgKz0gJylcXG4nO1xuICAgIC8vfSBlbHNlIHtcbiAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnICsgY29sbGVjdGlvbi5sZW5ndGggKyAnIC1cXG4nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwICc7XG4gICAgICAgIGNvbnN0IGVudHJpZXNDdXJyZW50ID0gaSArIDEgPT0gY29sbE51bWJlciA/IGNvbGxlY3Rpb24ubGVuZ3RoIC0gKGNvbGxOdW1iZXIgLSAxKSAqIGVudHJpZXMgOiBlbnRyaWVzO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVudHJpZXNDdXJyZW50OyBqKyspIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAoaiArIDEgPT0gZW50cmllc0N1cnJlbnQpID9cbiAgICAgICAgICAgICAgICAoaSA9PSBjb2xsTnVtYmVyIC0gMSA/IGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcpXFxuJyA6IGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcgLVxcbicpIDpcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnICc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy99XG4gICAgLy9nZW5lcmF0ZSBmaWxlXG4gICAgdHdvQ2hhaW5zID8gbmF0b20gOiBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBpZiAodXNlQ2hpcmFsaXR5KSB7XG4gICAgICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXFxuJztcbiAgICAgICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTlxcbic7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgbWFjcm9Nb2xCbG9jayA9IG1hY3JvTW9sQmxvY2sucmVwbGFjZSgvIENGRz1cXGQvZywgJyAnKTtcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORCc7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IGluZGV4Rml2ZVByaW1lID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4LmluZGV4T2YoMSk7XG4gICAgY29uc3QgaW5kZXhUaHJlZVByaW1lID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4LmluZGV4T2YobmF0b20pO1xuICAgIC8vZml4IDUgcHJpbWUgaWYgaW5hZGVxdWF0ZVxuICAgIGlmIChuYXRvbSA+IDgpXG4gICAgICAgIGZpeDVQcmltZShjb29yZGluYXRlcywgaW5kZXhGaXZlUHJpbWUsIGluZGV4VGhyZWVQcmltZSk7XG4gICAgY29uc3QgeENlbnRlciA9IChjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdICsgY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0pIC8gMjtcbiAgICAvL3BsYWNlIHRvIGNlbnRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb29yZGluYXRlcy54W2ldIC09IHhDZW50ZXI7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gLT0geUNlbnRlcjtcbiAgICB9XG4gICAgbGV0IGFuZ2xlID0gMDtcbiAgICBpZiAoY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgLyAyIDogMyAqIE1hdGguUEkgLyAyO1xuICAgIGVsc2UgaWYgKGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID09IDApXG4gICAgICAgIGFuZ2xlID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPiBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gPyBNYXRoLlBJIDogMDtcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVyaXZhdGl2ZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC8gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV07XG4gICAgICAgIGFuZ2xlID0gZGVyaXZhdGl2ZSA+IDAgPyBNYXRoLlBJIC0gTWF0aC5hdGFuKGRlcml2YXRpdmUpIDogTWF0aC5hdGFuKGRlcml2YXRpdmUpO1xuICAgIH1cbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb25zdCB4QWRkID0gY29vcmRpbmF0ZXMueFtpXTtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQgKiBjb3MgLSBjb29yZGluYXRlcy55W2ldICogc2luO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldID0geEFkZCAqIHNpbiArIGNvb3JkaW5hdGVzLnlbaV0gKiBjb3M7XG4gICAgfVxuICAgIC8vcGxhY2UgdG8gcmlnaHRcbiAgICBjb25zdCB4U2hpZnQgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspXG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geFNoaWZ0O1xuICAgIC8vcmV3cml0ZSBtb2xCbG9ja1xuICAgIGxldCBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpO1xuICAgIGxldCBpbmRleEVuZCA9IGluZGV4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4RW5kKTtcbiAgICAgICAgbW9sQmxvY2sgPSBtb2xCbG9jay5zbGljZSgwLCBpbmRleCkgK1xuICAgICAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArICcgJyArIGNvb3JkaW5hdGVzLnlbaV0gK1xuICAgICAgICAgICAgbW9sQmxvY2suc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgfVxuICAgIHJldHVybiBtb2xCbG9jaztcbn1cbmZ1bmN0aW9uIGludmVydE51Y2xlb3RpZGVzVjMwMDAobW9sZWN1bGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgeENlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy54KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLngpKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy55KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLnkpKSAvIDI7XG4gICAgLy9wbGFjZSB0byBjZW50ZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gICAgfVxuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5QSTtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb25zdCB4QWRkID0gY29vcmRpbmF0ZXMueFtpXTtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQgKiBjb3MgLSBjb29yZGluYXRlcy55W2ldICogc2luO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldID0geEFkZCAqIHNpbiArIGNvb3JkaW5hdGVzLnlbaV0gKiBjb3M7XG4gICAgfVxuICAgIC8vcGxhY2UgYmFja1xuICAgIGNvbnN0IHlTaGlmdCA9IE1hdGgubWF4KC4uLmNvb3JkaW5hdGVzLnkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb29yZGluYXRlcy54W2ldICs9IHhDZW50ZXI7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gLT0geVNoaWZ0O1xuICAgIH1cbiAgICAvL3Jld3JpdGUgbW9sQmxvY2tcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleEVuZCk7XG4gICAgICAgIG1vbEJsb2NrID0gbW9sQmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgICAgICAgIG1vbEJsb2NrLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbW9sQmxvY2s7XG59XG5mdW5jdGlvbiBmaXg1UHJpbWUoY29vcmRpbmF0ZXMsIGluZGV4Rml2ZVByaW1lLCBpbmRleFRocmVlUHJpbWUpIHtcbiAgICBjb25zdCBpbmRleEZpdmVQcmltZU5laWdoYm91ciA9IGluZGV4Rml2ZVByaW1lICsgMTtcbiAgICBjb25zdCB4U2hpZnQgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCB5U2hpZnQgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCBiYXNlM1ByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlM1ByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSAtIHlTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdIC0geFNoaWZ0O1xuICAgIGNvbnN0IGJhc2U1UHJpbWVZID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVggPSBiYXNlNVByaW1lWCAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMykgLSBiYXNlNVByaW1lWSAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVkgPSBiYXNlNVByaW1lWCAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMykgKyBiYXNlNVByaW1lWSAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3QgZHggPSBiYXNlNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5ID0gYmFzZTVQcmltZVkgLSBiYXNlM1ByaW1lWTtcbiAgICBjb25zdCBkeFJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5Um90YXRlZCA9IHJvdGF0ZWQ1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgaWYgKE1hdGguc3FydChkeVJvdGF0ZWQgKiBkeVJvdGF0ZWQgKyBkeFJvdGF0ZWQgKiBkeFJvdGF0ZWQpID49IE1hdGguc3FydChkeSAqIGR5ICsgZHggKiBkeCkpIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWCArIHhTaGlmdDtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWSArIHlTaGlmdDtcbiAgICB9XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jaykge1xuICAgIG1vbEJsb2NrID0gbW9sQmxvY2sucmVwbGFjZUFsbCgnXFxyJywgJycpOyAvL2VxdWFsaXplIG9sZCBhbmQgbmV3IHNkZiBzdGFuZGFyZHNcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdDT1VOVFMnKSArIDc7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBhbmQgYm9uZHMgbnVtYmVyXG4gICAgbGV0IGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICBjb25zdCBhdG9tc051bWJlciA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYm9uZHNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgcmV0dXJuIHsgbmF0b206IGF0b21zTnVtYmVyLCBuYm9uZDogYm9uZHNOdW1iZXIgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKSB7XG4gICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tc0JvbmRzTnVtYmVyc1YzMDAwKG1vbEJsb2NrKTtcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBjb25zdCBpbmRleGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgdHlwZXMgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBjb25zdCB4ID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeSA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5uYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICBpbmRleGVzW2ldID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB0eXBlc1tpXSA9IG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB4W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gaW5kZXhFbmQgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgIHlbaV0gPSBwYXJzZUZsb2F0KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4geyBhdG9tSW5kZXg6IGluZGV4ZXMsIGF0b21UeXBlOiB0eXBlcywgeDogeCwgeTogeSB9O1xufVxuIiwiaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCB7IHNlcXVlbmNlVG9Nb2xWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBsaW5rVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMnO1xuaW1wb3J0IHsgZ2V0Rm9ybWF0IH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNkZihhcywgc3MsIG9uZUVudGl0eSwgdXNlQ2hpcmFsaXR5LCBpbnZlcnRTUywgaW52ZXJ0QVMpIHtcbiAgICBjb25zdCBmb3JtYXRBcyA9IGdldEZvcm1hdChhcyk7XG4gICAgY29uc3QgZm9ybWF0U3MgPSBnZXRGb3JtYXQoc3MpO1xuICAgIGNvbnN0IG1vbFNTID0gc2VxdWVuY2VUb01vbFYzMDAwKHNzLCBpbnZlcnRTUywgZmFsc2UsIGZvcm1hdFNzKTtcbiAgICBjb25zdCBtb2xBUyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChhcywgaW52ZXJ0QVMsIGZhbHNlLCBmb3JtYXRBcyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAob25lRW50aXR5KVxuICAgICAgICByZXN1bHQgPSBsaW5rVjMwMDAoW21vbFNTLCBtb2xBU10sIHRydWUsIHVzZUNoaXJhbGl0eSkgKyAnXFxuJCQkJFxcbic7XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICBtb2xTUyArICdcXG4nICtcbiAgICAgICAgICAgICAgICBgPiA8U2VxdWVuY2U+XFxuU2Vuc2UgU3RyYW5kXFxuJCQkJFxcbmAgK1xuICAgICAgICAgICAgICAgIG1vbEFTICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIGA+IDxTZXF1ZW5jZT5cXG5BbnRpIFNlbnNlXFxuJCQkJFxcbmA7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBzcy5yZXBsYWNlKC9cXHMvZywgJycpICsgJy5zZGYnKTtcbiAgICBlbGVtZW50LmNsaWNrKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNlbnNlQW50aVNlbnNlKCkge1xuICAgIGNvbnN0IG1vbGVjdWxlU3ZnRGl2ID0gdWkuYmxvY2soW10pO1xuICAgIGNvbnN0IHNzSW5wdXQgPSB1aS50ZXh0SW5wdXQoJ1NlbnNlIFN0cmFuZCcsICcnKTtcbiAgICBjb25zdCBhc0lucHV0ID0gdWkudGV4dElucHV0KCdBbnRpIFNlbnNlJywgJycpO1xuICAgIGNvbnN0IHN0cmFpZ2h0ID0gXCI1IHByaW1lIC0+IDMgcHJpbWVcIjtcbiAgICBjb25zdCBpbnZlcnNlID0gXCIzIHByaW1lIC0+IDUgcHJpbWVcIjtcbiAgICBsZXQgc3NJbnZlcnNlID0gZmFsc2U7XG4gICAgbGV0IGFzSW52ZXJzZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZVNlbnNlID0gdWkuY2hvaWNlSW5wdXQoJ1NTIGRpcmVjdGlvbicsIHN0cmFpZ2h0LCBbc3RyYWlnaHQsIGludmVyc2VdKTtcbiAgICBjaGFuZ2VTZW5zZS5vbkNoYW5nZWQoKCkgPT4geyBzc0ludmVyc2UgPSBjaGFuZ2VTZW5zZS52YWx1ZSA9PSBpbnZlcnNlOyB9KTtcbiAgICBjb25zdCBjaGFuZ2VBbnRpU2Vuc2UgPSB1aS5jaG9pY2VJbnB1dCgnQVMgZGlyZWN0aW9uJywgc3RyYWlnaHQsIFtzdHJhaWdodCwgaW52ZXJzZV0pO1xuICAgIGNoYW5nZUFudGlTZW5zZS5vbkNoYW5nZWQoKCkgPT4geyBhc0ludmVyc2UgPSBjaGFuZ2VBbnRpU2Vuc2UudmFsdWUgPT0gaW52ZXJzZTsgfSk7XG4gICAgY29uc3Qgc2F2ZU9wdGlvbiA9IHVpLnN3aXRjaElucHV0KCdTYXZlIGFzIG9uZSBlbnRpdHknLCB0cnVlKTtcbiAgICBjb25zdCBjaGlyYWxpdHkgPSB1aS5zd2l0Y2hJbnB1dCgnVXNlIGNoaXJhbCcsIHRydWUpO1xuICAgIGNvbnN0IHNhdmVCdG4gPSB1aS5idXR0b24oJ1NhdmUgU0RGJywgKCkgPT4gc2F2ZVNkZihhc0lucHV0LnZhbHVlLCBzc0lucHV0LnZhbHVlLCBzYXZlT3B0aW9uLnZhbHVlLCBjaGlyYWxpdHkudmFsdWUsIHNzSW52ZXJzZSwgYXNJbnZlcnNlKSk7XG4gICAgY29uc3Qgc2F2ZVNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgIHVpLmRpdkgoW3VpLmgxKCdJbnB1dHMnKV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdlYoW1xuICAgICAgICAgICAgICAgICAgICBzc0lucHV0LFxuICAgICAgICAgICAgICAgICAgICBhc0lucHV0LFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW2NoYW5nZVNlbnNlXSwgeyBzdHlsZTogeyB3aWR0aDogJzQwJyB9IH0pLFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTZW5zZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlQW50aVNlbnNlLFxuICAgICAgICAgICAgICAgICAgICBzYXZlT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjaGlyYWxpdHksXG4gICAgICAgICAgICAgICAgICAgIHVpLmJ1dHRvbnNJbnB1dChbc2F2ZUJ0bl0pLFxuICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICBtb2xlY3VsZVN2Z0RpdixcbiAgICBdKTtcbiAgICByZXR1cm4gc2F2ZVNlY3Rpb247XG59XG4iLCJpbXBvcnQgeyBtYXAsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TLCBkZWxpbWl0ZXIsIGdjcnNDb2Rlc1dpdGhvdXRTbWlsZXMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZywgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycywgZ2Nyc1RvTWVybWFkZTEyLCBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZCwgc2lSbmFOdWNsZW90aWRlc1RvR2Nycywgc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicywgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMsIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nLCBzaVJuYUF4b2xhYnNUb0djcnMsIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMsIHNpUm5hR2Nyc1RvQmlvU3ByaW5nLCBzaVJuYUdjcnNUb0F4b2xhYnMsIGdjcnNUb051Y2xlb3RpZGVzLCBnY3JzVG9MY21zIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmNvbnN0IG5vVHJhbnNsYXRpb25UYWJsZUF2YWlsYWJsZSA9ICdObyB0cmFuc2xhdGlvbiB0YWJsZSBhdmFpbGFibGUnO1xuZXhwb3J0IGNvbnN0IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgPSAnVHlwZSBvZiBpbnB1dCBzZXF1ZW5jZSBpcyB1bmRlZmluZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdChzZXF1ZW5jZSkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpO1xuICAgIGlmIChwb3NzaWJsZVN5bnRoZXNpemVycy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG91dHB1dEluZGV4ID0gMDtcbiAgICBjb25zdCBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMgPSBbJ3InLCAnZCddO1xuICAgIGNvbnN0IG51Y2xlb3RpZGVzID0gWydBJywgJ1UnLCAnVCcsICdDJywgJ0cnXTtcbiAgICBwb3NzaWJsZVN5bnRoZXNpemVycy5mb3JFYWNoKChzeW50aGVzaXplcikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcik7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSlcbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdO1xuICAgIGNvbnN0IHBvc3NpYmxlVGVjaG5vbG9naWVzID0gZ2V0TGlzdE9mUG9zc2libGVUZWNobm9sb2dpZXNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UsIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdKTtcbiAgICBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG59XG5mdW5jdGlvbiBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihhcnJheSkge1xuICAgIHJldHVybiBhcnJheS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoOyB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZm9ybWF0ID09IG51bGwgP1xuICAgICAgICBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkgOlxuICAgICAgICBbZm9ybWF0XTtcbiAgICAvLyBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgIC8vICAgY29uc3Qgc3ludGhlc2l6ZXIgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHN5bnRoZXNpemVyIGZyb20gbGlzdDogJywgcG9zc2libGVTeW50aGVzaXplcnNbMF0sXG4gICAgLy8gIHBvc3NpYmxlU3ludGhlc2l6ZXJzKTtcbiAgICAvLyAgIHVpLmRpYWxvZygnQ2hvb3NlIFN5bnRoZXNpemVyJylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbc3ludGhlc2l6ZXIucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVTeW50aGVzaXplcnMgPSBbc3ludGhlc2l6ZXIudmFsdWVdKVxuICAgIC8vICAgICAub25DYW5jZWwoKCkgPT4ge1xuICAgIC8vICAgICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXTtcbiAgICAvLyAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vICAgICB9KVxuICAgIC8vICAgICAuc2hvdygpO1xuICAgIC8vIH0gZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4geyBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IDAsIHN5bnRoZXNpemVyOiBudWxsIH07IC8vLCB0ZWNobm9sb2d5OiBudWxsfTtcbiAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gQXJyYXkocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goZnVuY3Rpb24gKHN5bnRoZXNpemVyLCBpKSB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRpY2VzW2ldIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kaWNlc1tpXSwgb3V0cHV0SW5kaWNlc1tpXSArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tpXSA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRpY2VzW2ldXSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kaWNlc1tpXSAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGljZXNbaV0gKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRpY2VzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW2ldKys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzW2ldICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dEluZGV4ID0gTWF0aC5tYXgoLi4ub3V0cHV0SW5kaWNlcyk7XG4gICAgY29uc3Qgc3ludGhlc2l6ZXIgPSBwb3NzaWJsZVN5bnRoZXNpemVyc1tvdXRwdXRJbmRpY2VzLmluZGV4T2Yob3V0cHV0SW5kZXgpXTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgICAgICBzeW50aGVzaXplcjogW3N5bnRoZXNpemVyXSxcbiAgICAgICAgICAgIC8vIHRlY2hub2xvZ3k6IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbnN0IHBvc3NpYmxlVGVjaG5vbG9naWVzID1cbiAgICAvLyAgIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1tvdXRwdXRJbmRleF0pO1xuICAgIC8vIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPiAxKSB7XG4gICAgLy8gICBjb25zdCB0ZWNobm9sb2d5ID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSB0ZWNobm9sb2d5IGZyb20gbGlzdDogJywgcG9zc2libGVUZWNobm9sb2dpZXNbMF0sXG4gICAgLy8gcG9zc2libGVUZWNobm9sb2dpZXMpO1xuICAgIC8vICAgdWkuZGlhbG9nKCdDaG9vc2UgVGVjaG5vbG9neScpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3RlY2hub2xvZ3kucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVUZWNobm9sb2dpZXMgPSBbdGVjaG5vbG9neS52YWx1ZV0pXG4gICAgLy8gICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgLy8gICAgICAgcG9zc2libGVUZWNobm9sb2dpZXMgPSBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dO1xuICAgIC8vICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5zaG93KCk7XG4gICAgLy8gfSBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAvLyBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgLy8gICByZXR1cm4ge2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IFtwb3NzaWJsZVN5bnRoZXNpemVyc1szXV0sIHRlY2hub2xvZ3k6IG51bGx9O1xuICAgIC8vIG91dHB1dEluZGV4ID0gMDtcbiAgICAvLyBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5OiBzdHJpbmcpID0+IHtcbiAgICAvLyAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgLy8gICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAvLyAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgLy8gICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgIC8vICAgICAgIGJyZWFrO1xuICAgIC8vICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAvLyAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAvLyAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgLy8gICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pXG4gICAgLy8gICAgICkgYnJlYWs7XG4gICAgLy8gICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgIC8vICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgIC8vICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSlcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgIHN5bnRoZXNpemVyOiBbc3ludGhlc2l6ZXJdLFxuICAgICAgICAvLyB0ZWNobm9sb2d5OiBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKSB7XG4gICAgbGV0IGNvZGVzID0gW107XG4gICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKVxuICAgICAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKSk7XG4gICAgcmV0dXJuIGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSkuY29uY2F0KGRlbGltaXRlcik7XG59XG5mdW5jdGlvbiBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkge1xuICAgIGxldCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikpO1xuICAgICAgICBpZiAoc3ludGhlc2l6ZXIgPT0gJ0phbnNzZW4gR0NSUyBDb2RlcycpXG4gICAgICAgICAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChnY3JzQ29kZXNXaXRob3V0U21pbGVzKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChnY3JzQ29kZXNXaXRob3V0U21pbGVzLnNvbWUoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgcy5sZW5ndGgpKSlcbiAgICAgICAgICAgIHN5bnRoZXNpemVycyA9IFsnSmFuc3NlbiBHQ1JTIENvZGVzJ107XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpKSB7IC8vJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5ETkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpKSB7XG4gICAgICAgIC8vICYmIG91dHB1dC50ZWNobm9sb2d5IS5pbmNsdWRlcyhURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQklPU1BSSU5HICsgJyAnICsgVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykpIHsgLy8gJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTICsgJyAnICsgVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFHY3JzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFHY3JzVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUykpIHtcbiAgICAgICAgLy8gJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICsgJyAnICsgVEVDSE5PTE9HSUVTLlJOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQklPU1BSSU5HKSkgeyAvLyAmJiBvdXRwdXQudGVjaG5vbG9neSEuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlNJX1JOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgR0NSUzogc2lSbmFCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5BWE9MQUJTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkFYT0xBQlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQXhvbGFic1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpKSB7IC8vICYmIG91dHB1dC50ZWNobm9sb2d5IS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBnY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIExDTVM6IGdjcnNUb0xjbXMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBVU0VSU19DU1YgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIm1vZHVsZS5leHBvcnRzID0gdWk7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBhdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbiB9IGZyb20gJy4vYXV0b3N0YXJ0L3JlZ2lzdHJhdGlvbic7XG5pbXBvcnQgeyBkZWZpbmVBeG9sYWJzUGF0dGVybiB9IGZyb20gJy4vYXhvbGFicy9kZWZpbmUtcGF0dGVybic7XG5pbXBvcnQgeyBzYXZlU2Vuc2VBbnRpU2Vuc2UgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3Mvc2F2ZS1zZW5zZS1hbnRpc2Vuc2UnO1xuaW1wb3J0IHsgbWFpblZpZXcgfSBmcm9tICcuL21haW4vbWFpbi12aWV3JztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG4vL25hbWU6IFNlcXVlbmNlIFRyYW5zbGF0b3Jcbi8vdGFnczogYXBwXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUcmFuc2xhdG9yKCkge1xuICAgIGNvbnN0IHdpbmRvd3MgPSBncm9rLnNoZWxsLndpbmRvd3M7XG4gICAgd2luZG93cy5zaG93UHJvcGVydGllcyA9IGZhbHNlO1xuICAgIHdpbmRvd3Muc2hvd1Rvb2xib3ggPSBmYWxzZTtcbiAgICB3aW5kb3dzLnNob3dIZWxwID0gZmFsc2U7XG4gICAgY29uc3QgdiA9IGdyb2suc2hlbGwubmV3VmlldygnU2VxdWVuY2UgVHJhbnNsYXRvcicsIFtcbiAgICAgICAgdWkudGFiQ29udHJvbCh7XG4gICAgICAgICAgICAnTUFJTic6IG1haW5WaWV3KCksXG4gICAgICAgICAgICAnQVhPTEFCUyc6IGRlZmluZUF4b2xhYnNQYXR0ZXJuKCksXG4gICAgICAgICAgICAnU0RGJzogc2F2ZVNlbnNlQW50aVNlbnNlKCksXG4gICAgICAgIH0pLFxuICAgIF0pO1xuICAgIHYuYm94ID0gdHJ1ZTtcbn1cbi8vdGFnczogYXV0b3N0YXJ0XG5hdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbigpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
6411
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7O0FBRUEsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Qsb0JBQW9CO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwrRUFBd0I7QUFDaEQscUJBQXFCLDhEQUFvQjtBQUNsQywrQkFBK0IsK0RBQXFCO0FBQzNEO0FBQ0EsNENBQTRDO0FBQ3JDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHNCQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQ0FB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aUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOMEM7QUFDSjtBQUNBO0FBQ3NDO0FBQ1o7QUFDYTtBQUNqQztBQUNyQyxxQkFBcUIsb0RBQVU7QUFDdEM7QUFDQTtBQUNPO0FBQ1Asb0JBQW9CLDREQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxjQUFjLDREQUFrQjtBQUNoQztBQUNBLGFBQWEsdURBQWE7QUFDMUIsZ0JBQWdCLHlEQUFRO0FBQ3hCLG1CQUFtQiw2RUFBb0I7QUFDdkMsZUFBZSwwRkFBa0I7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQSx5RkFBZ0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvY2FzaC1kb20vZGlzdC9jYXNoLmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9zYXZlLXN2Zy1hcy1wbmcvbGliL3NhdmVTdmdBc1BuZy5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvYXV0b3N0YXJ0L0lDRHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F1dG9zdGFydC9JRFBzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9hdXRvc3RhcnQvY2FsY3VsYXRpb25zLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9hdXRvc3RhcnQvY29uc3RhbnRzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9hdXRvc3RhcnQvcmVnaXN0cmF0aW9uLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9hdXRvc3RhcnQvc2FsdHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F1dG9zdGFydC9zb3VyY2VzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9hdXRvc3RhcnQvdXNlcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL2F4b2xhYnMvY29uc3RhbnRzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9heG9sYWJzL2RlZmluZS1wYXR0ZXJuLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9heG9sYWJzL2RyYXctc3ZnLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9tYWluL21haW4tdmlldy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9jb252ZXJ0ZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbWFwLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2F2ZS1zZW5zZS1hbnRpc2Vuc2UudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcIkRHXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcImdyb2tcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwidWlcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3BhY2thZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogTUlUIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWJpb3NwYW1waW5hdG8vY2FzaCAqL1xuKGZ1bmN0aW9uKCl7XG5cInVzZSBzdHJpY3RcIjtcblxudmFyIHByb3BNYXAgPSB7XG4gIC8qIEdFTkVSQUwgKi9cbiAgXCJjbGFzc1wiOiAnY2xhc3NOYW1lJyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcblxuICAvKiBMQUJFTCAqL1xuICBcImZvclwiOiAnaHRtbEZvcicsXG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuXG4gIC8qIFRBQkxFICovXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuXG4gIC8qIElNQUdFICovXG4gIHVzZW1hcDogJ3VzZU1hcCdcbn07XG5cbmZ1bmN0aW9uIGF0dGVtcHQoZm4sIGFyZykge1xuICB0cnkge1xuICAgIHJldHVybiBmbihhcmcpO1xuICB9IGNhdGNoIChfYSkge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn1cblxudmFyIGRvYyA9IGRvY3VtZW50LFxuICAgIHdpbiA9IHdpbmRvdyxcbiAgICBkb2NFbGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudC5iaW5kKGRvYyksXG4gICAgZGl2ID0gY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgdGFibGUgPSBjcmVhdGVFbGVtZW50KCd0YWJsZScpLFxuICAgIHRib2R5ID0gY3JlYXRlRWxlbWVudCgndGJvZHknKSxcbiAgICB0ciA9IGNyZWF0ZUVsZW1lbnQoJ3RyJyksXG4gICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXksXG4gICAgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGUsXG4gICAgY29uY2F0ID0gQXJyYXlQcm90b3R5cGUuY29uY2F0LFxuICAgIGZpbHRlciA9IEFycmF5UHJvdG90eXBlLmZpbHRlcixcbiAgICBpbmRleE9mID0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZixcbiAgICBtYXAgPSBBcnJheVByb3RvdHlwZS5tYXAsXG4gICAgcHVzaCA9IEFycmF5UHJvdG90eXBlLnB1c2gsXG4gICAgc2xpY2UgPSBBcnJheVByb3RvdHlwZS5zbGljZSxcbiAgICBzb21lID0gQXJyYXlQcm90b3R5cGUuc29tZSxcbiAgICBzcGxpY2UgPSBBcnJheVByb3RvdHlwZS5zcGxpY2U7XG52YXIgaWRSZSA9IC9eIyg/OltcXHctXXxcXFxcLnxbXlxceDAwLVxceGEwXSkqJC8sXG4gICAgY2xhc3NSZSA9IC9eXFwuKD86W1xcdy1dfFxcXFwufFteXFx4MDAtXFx4YTBdKSokLyxcbiAgICBodG1sUmUgPSAvPC4rPi8sXG4gICAgdGFnUmUgPSAvXlxcdyskLzsgLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuZnVuY3Rpb24gZmluZChzZWxlY3RvciwgY29udGV4dCkge1xuICB2YXIgaXNGcmFnbWVudCA9IGlzRG9jdW1lbnRGcmFnbWVudChjb250ZXh0KTtcbiAgcmV0dXJuICFzZWxlY3RvciB8fCAhaXNGcmFnbWVudCAmJiAhaXNEb2N1bWVudChjb250ZXh0KSAmJiAhaXNFbGVtZW50KGNvbnRleHQpID8gW10gOiAhaXNGcmFnbWVudCAmJiBjbGFzc1JlLnRlc3Qoc2VsZWN0b3IpID8gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHNlbGVjdG9yLnNsaWNlKDEpKSA6ICFpc0ZyYWdtZW50ICYmIHRhZ1JlLnRlc3Qoc2VsZWN0b3IpID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3RvcikgOiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xufSAvLyBAcmVxdWlyZSAuL2ZpbmQudHNcbi8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxudmFyIENhc2ggPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYXNoKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICAgIGlmIChpc0Nhc2goc2VsZWN0b3IpKSByZXR1cm4gc2VsZWN0b3I7XG4gICAgdmFyIGVsZXMgPSBzZWxlY3RvcjtcblxuICAgIGlmIChpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICAgIHZhciBjdHggPSAoaXNDYXNoKGNvbnRleHQpID8gY29udGV4dFswXSA6IGNvbnRleHQpIHx8IGRvYztcbiAgICAgIGVsZXMgPSBpZFJlLnRlc3Qoc2VsZWN0b3IpICYmICdnZXRFbGVtZW50QnlJZCcgaW4gY3R4ID8gY3R4LmdldEVsZW1lbnRCeUlkKHNlbGVjdG9yLnNsaWNlKDEpKSA6IGh0bWxSZS50ZXN0KHNlbGVjdG9yKSA/IHBhcnNlSFRNTChzZWxlY3RvcikgOiBmaW5kKHNlbGVjdG9yLCBjdHgpO1xuICAgICAgaWYgKCFlbGVzKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoc2VsZWN0b3IpOyAvL0ZJWE1FOiBgZm4ucmVhZHlgIGlzIG5vdCBpbmNsdWRlZCBpbiBgY29yZWAsIGJ1dCBpdCdzIGFjdHVhbGx5IGEgY29yZSBmdW5jdGlvbmFsaXR5XG4gICAgfVxuXG4gICAgaWYgKGVsZXMubm9kZVR5cGUgfHwgZWxlcyA9PT0gd2luKSBlbGVzID0gW2VsZXNdO1xuICAgIHRoaXMubGVuZ3RoID0gZWxlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gZWxlc1tpXTtcbiAgICB9XG4gIH1cblxuICBDYXNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBDYXNoKHNlbGVjdG9yLCBjb250ZXh0KTtcbiAgfTtcblxuICByZXR1cm4gQ2FzaDtcbn0oKTtcblxudmFyIGZuID0gQ2FzaC5wcm90b3R5cGUsXG4gICAgY2FzaCA9IGZuLmluaXQ7XG5jYXNoLmZuID0gY2FzaC5wcm90b3R5cGUgPSBmbjsgLy8gRW5zdXJpbmcgdGhhdCBgY2FzaCAoKSBpbnN0YW5jZW9mIGNhc2hgXG5cbmZuLmxlbmd0aCA9IDA7XG5mbi5zcGxpY2UgPSBzcGxpY2U7IC8vIEVuc3VyaW5nIGEgY2FzaCBjb2xsZWN0aW9uIGdldHMgcHJpbnRlZCBhcyBhcnJheS1saWtlIGluIENocm9tZSdzIGRldnRvb2xzXG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIEVuc3VyaW5nIGEgY2FzaCBjb2xsZWN0aW9uIGlzIGl0ZXJhYmxlXG4gIGZuW1N5bWJvbFsnaXRlcmF0b3InXV0gPSBBcnJheVByb3RvdHlwZVtTeW1ib2xbJ2l0ZXJhdG9yJ11dO1xufVxuXG5mbi5tYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNhc2goY29uY2F0LmFwcGx5KFtdLCBtYXAuY2FsbCh0aGlzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KSkpO1xufTtcblxuZm4uc2xpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gY2FzaChzbGljZS5jYWxsKHRoaXMsIHN0YXJ0LCBlbmQpKTtcbn07IC8vIEByZXF1aXJlIC4vY2FzaC50c1xuXG5cbnZhciBkYXNoQWxwaGFSZSA9IC8tKFthLXpdKS9nO1xuXG5mdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShkYXNoQWxwaGFSZSwgZnVuY3Rpb24gKG1hdGNoLCBsZXR0ZXIpIHtcbiAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG5jYXNoLmd1aWQgPSAxOyAvLyBAcmVxdWlyZSAuL2Nhc2gudHNcblxuZnVuY3Rpb24gbWF0Y2hlcyhlbGUsIHNlbGVjdG9yKSB7XG4gIHZhciBtYXRjaGVzID0gZWxlICYmIChlbGVbJ21hdGNoZXMnXSB8fCBlbGVbJ3dlYmtpdE1hdGNoZXNTZWxlY3RvciddIHx8IGVsZVsnbXNNYXRjaGVzU2VsZWN0b3InXSk7XG4gIHJldHVybiAhIW1hdGNoZXMgJiYgISFzZWxlY3RvciAmJiBtYXRjaGVzLmNhbGwoZWxlLCBzZWxlY3Rvcik7XG59XG5cbmZ1bmN0aW9uIGlzQ2FzaCh4KSB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgQ2FzaDtcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3coeCkge1xuICByZXR1cm4gISF4ICYmIHggPT09IHgud2luZG93O1xufVxuXG5mdW5jdGlvbiBpc0RvY3VtZW50KHgpIHtcbiAgcmV0dXJuICEheCAmJiB4Lm5vZGVUeXBlID09PSA5O1xufVxuXG5mdW5jdGlvbiBpc0RvY3VtZW50RnJhZ21lbnQoeCkge1xuICByZXR1cm4gISF4ICYmIHgubm9kZVR5cGUgPT09IDExO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoeCkge1xuICByZXR1cm4gISF4ICYmIHgubm9kZVR5cGUgPT09IDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHgpIHtcbiAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVtZXJpYyh4KSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh4KSkgJiYgaXNGaW5pdGUoeCk7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QoeCkge1xuICBpZiAodHlwZW9mIHggIT09ICdvYmplY3QnIHx8IHggPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpO1xuICByZXR1cm4gcHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbmNhc2guaXNXaW5kb3cgPSBpc1dpbmRvdztcbmNhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5jYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuY2FzaC5pc051bWVyaWMgPSBpc051bWVyaWM7XG5jYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuXG5mbi5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGluZGV4KSkgcmV0dXJuIHNsaWNlLmNhbGwodGhpcyk7XG4gIGluZGV4ID0gTnVtYmVyKGluZGV4KTtcbiAgcmV0dXJuIHRoaXNbaW5kZXggPCAwID8gaW5kZXggKyB0aGlzLmxlbmd0aCA6IGluZGV4XTtcbn07XG5cbmZuLmVxID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIHJldHVybiBjYXNoKHRoaXMuZ2V0KGluZGV4KSk7XG59O1xuXG5mbi5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZXEoMCk7XG59O1xuXG5mbi5sYXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lcSgtMSk7XG59O1xuXG5mdW5jdGlvbiBlYWNoKGFyciwgY2FsbGJhY2ssIF9yZXZlcnNlKSB7XG4gIGlmIChfcmV2ZXJzZSkge1xuICAgIHZhciBpID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChjYWxsYmFjay5jYWxsKGFycltpXSwgaSwgYXJyW2ldKSA9PT0gZmFsc2UpIHJldHVybiBhcnI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoYXJyKSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoYXJyW2tleV0sIGtleSwgYXJyW2tleV0pID09PSBmYWxzZSkgcmV0dXJuIGFycjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2FsbGJhY2suY2FsbChhcnJbaV0sIGksIGFycltpXSkgPT09IGZhbHNlKSByZXR1cm4gYXJyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbmNhc2guZWFjaCA9IGVhY2g7XG5cbmZuLmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGVhY2godGhpcywgY2FsbGJhY2spO1xufTtcblxuZm4ucHJvcCA9IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkge1xuICBpZiAoIXByb3ApIHJldHVybjtcblxuICBpZiAoaXNTdHJpbmcocHJvcCkpIHtcbiAgICBwcm9wID0gcHJvcE1hcFtwcm9wXSB8fCBwcm9wO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXVtwcm9wXTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGVsZVtwcm9wXSA9IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3ApIHtcbiAgICB0aGlzLnByb3Aoa2V5LCBwcm9wW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5yZW1vdmVQcm9wID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgZGVsZXRlIGVsZVtwcm9wTWFwW3Byb3BdIHx8IHByb3BdO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgdmFyIHNvdXJjZXMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBkZWVwID0gaXNCb29sZWFuKHNvdXJjZXNbMF0pID8gc291cmNlcy5zaGlmdCgpIDogZmFsc2UsXG4gICAgICB0YXJnZXQgPSBzb3VyY2VzLnNoaWZ0KCksXG4gICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiB7fTtcbiAgaWYgKCFsZW5ndGgpIHJldHVybiBleHRlbmQoZGVlcCwgY2FzaCwgdGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoZGVlcCAmJiAoaXNBcnJheShzb3VyY2Vba2V5XSkgfHwgaXNQbGFpbk9iamVjdChzb3VyY2Vba2V5XSkpKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0gfHwgdGFyZ2V0W2tleV0uY29uc3RydWN0b3IgIT09IHNvdXJjZVtrZXldLmNvbnN0cnVjdG9yKSB0YXJnZXRba2V5XSA9IG5ldyBzb3VyY2Vba2V5XS5jb25zdHJ1Y3RvcigpO1xuICAgICAgICBleHRlbmQoZGVlcCwgdGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuY2FzaC5leHRlbmQgPSBleHRlbmQ7XG5cbmZuLmV4dGVuZCA9IGZ1bmN0aW9uIChwbHVnaW5zKSB7XG4gIHJldHVybiBleHRlbmQoZm4sIHBsdWdpbnMpO1xufTsgLy8gQHJlcXVpcmUgLi9tYXRjaGVzLnRzXG4vLyBAcmVxdWlyZSAuL3R5cGVfY2hlY2tpbmcudHNcblxuXG5mdW5jdGlvbiBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcikge1xuICByZXR1cm4gaXNTdHJpbmcoY29tcGFyYXRvcikgPyBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMoZWxlLCBjb21wYXJhdG9yKTtcbiAgfSA6IGlzRnVuY3Rpb24oY29tcGFyYXRvcikgPyBjb21wYXJhdG9yIDogaXNDYXNoKGNvbXBhcmF0b3IpID8gZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBjb21wYXJhdG9yLmlzKGVsZSk7XG4gIH0gOiAhY29tcGFyYXRvciA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gOiBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZSA9PT0gY29tcGFyYXRvcjtcbiAgfTtcbn1cblxuZm4uZmlsdGVyID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiBjYXNoKGZpbHRlci5jYWxsKHRoaXMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICByZXR1cm4gY29tcGFyZS5jYWxsKGVsZSwgaSwgZWxlKTtcbiAgfSkpO1xufTsgLy8gQHJlcXVpcmUgY29sbGVjdGlvbi9maWx0ZXIudHNcblxuXG5mdW5jdGlvbiBmaWx0ZXJlZChjb2xsZWN0aW9uLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiAhY29tcGFyYXRvciA/IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9uLmZpbHRlcihjb21wYXJhdG9yKTtcbn0gLy8gQHJlcXVpcmUgLi90eXBlX2NoZWNraW5nLnRzXG5cblxudmFyIHNwbGl0VmFsdWVzUmUgPSAvXFxTKy9nO1xuXG5mdW5jdGlvbiBnZXRTcGxpdFZhbHVlcyhzdHIpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHN0cikgPyBzdHIubWF0Y2goc3BsaXRWYWx1ZXNSZSkgfHwgW10gOiBbXTtcbn1cblxuZm4uaGFzQ2xhc3MgPSBmdW5jdGlvbiAoY2xzKSB7XG4gIHJldHVybiAhIWNscyAmJiBzb21lLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoZWxlKSAmJiBlbGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNscyk7XG4gIH0pO1xufTtcblxuZm4ucmVtb3ZlQXR0ciA9IGZ1bmN0aW9uIChhdHRyKSB7XG4gIHZhciBhdHRycyA9IGdldFNwbGl0VmFsdWVzKGF0dHIpO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWFjaChhdHRycywgZnVuY3Rpb24gKGksIGEpIHtcbiAgICAgIGVsZS5yZW1vdmVBdHRyaWJ1dGUoYSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gYXR0cihhdHRyLCB2YWx1ZSkge1xuICBpZiAoIWF0dHIpIHJldHVybjtcblxuICBpZiAoaXNTdHJpbmcoYXR0cikpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGlmICghdGhpc1swXSB8fCAhaXNFbGVtZW50KHRoaXNbMF0pKSByZXR1cm47XG4gICAgICB2YXIgdmFsdWVfMSA9IHRoaXNbMF0uZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgcmV0dXJuIGlzTnVsbCh2YWx1ZV8xKSA/IHVuZGVmaW5lZCA6IHZhbHVlXzE7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKGlzTnVsbCh2YWx1ZSkpIHJldHVybiB0aGlzLnJlbW92ZUF0dHIoYXR0cik7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgICBlbGUuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBhdHRyKSB7XG4gICAgdGhpcy5hdHRyKGtleSwgYXR0cltrZXldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mbi5hdHRyID0gYXR0cjtcblxuZm4udG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiAoY2xzLCBmb3JjZSkge1xuICB2YXIgY2xhc3NlcyA9IGdldFNwbGl0VmFsdWVzKGNscyksXG4gICAgICBpc0ZvcmNlID0gIWlzVW5kZWZpbmVkKGZvcmNlKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVhY2goY2xhc3NlcywgZnVuY3Rpb24gKGksIGMpIHtcbiAgICAgIGlmIChpc0ZvcmNlKSB7XG4gICAgICAgIGZvcmNlID8gZWxlLmNsYXNzTGlzdC5hZGQoYykgOiBlbGUuY2xhc3NMaXN0LnJlbW92ZShjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5jbGFzc0xpc3QudG9nZ2xlKGMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmZuLmFkZENsYXNzID0gZnVuY3Rpb24gKGNscykge1xuICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbHMsIHRydWUpO1xufTtcblxuZm4ucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoY2xzKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbHMsIGZhbHNlKTtcbiAgcmV0dXJuIHRoaXMuYXR0cignY2xhc3MnLCAnJyk7XG59O1xuXG5mdW5jdGlvbiBwbHVjayhhcnIsIHByb3AsIGRlZXAsIHVudGlsKSB7XG4gIHZhciBwbHVja2VkID0gW10sXG4gICAgICBpc0NhbGxiYWNrID0gaXNGdW5jdGlvbihwcm9wKSxcbiAgICAgIGNvbXBhcmUgPSB1bnRpbCAmJiBnZXRDb21wYXJlRnVuY3Rpb24odW50aWwpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChpc0NhbGxiYWNrKSB7XG4gICAgICB2YXIgdmFsXzEgPSBwcm9wKGFycltpXSk7XG4gICAgICBpZiAodmFsXzEubGVuZ3RoKSBwdXNoLmFwcGx5KHBsdWNrZWQsIHZhbF8xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZhbF8yID0gYXJyW2ldW3Byb3BdO1xuXG4gICAgICB3aGlsZSAodmFsXzIgIT0gbnVsbCkge1xuICAgICAgICBpZiAodW50aWwgJiYgY29tcGFyZSgtMSwgdmFsXzIpKSBicmVhaztcbiAgICAgICAgcGx1Y2tlZC5wdXNoKHZhbF8yKTtcbiAgICAgICAgdmFsXzIgPSBkZWVwID8gdmFsXzJbcHJvcF0gOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwbHVja2VkO1xufVxuXG5mdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gIHJldHVybiBhcnIubGVuZ3RoID4gMSA/IGZpbHRlci5jYWxsKGFyciwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4LCBzZWxmKSB7XG4gICAgcmV0dXJuIGluZGV4T2YuY2FsbChzZWxmLCBpdGVtKSA9PT0gaW5kZXg7XG4gIH0pIDogYXJyO1xufVxuXG5jYXNoLnVuaXF1ZSA9IHVuaXF1ZTtcblxuZm4uYWRkID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZSh0aGlzLmdldCgpLmNvbmNhdChjYXNoKHNlbGVjdG9yLCBjb250ZXh0KS5nZXQoKSkpKTtcbn07IC8vIEByZXF1aXJlIGNvcmUvdHlwZV9jaGVja2luZy50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZWxlLCBwcm9wLCBpc1ZhcmlhYmxlKSB7XG4gIGlmICghaXNFbGVtZW50KGVsZSkpIHJldHVybjtcbiAgdmFyIHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlLCBudWxsKTtcbiAgcmV0dXJuIGlzVmFyaWFibGUgPyBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApIHx8IHVuZGVmaW5lZCA6IHN0eWxlW3Byb3BdIHx8IGVsZS5zdHlsZVtwcm9wXTtcbn0gLy8gQHJlcXVpcmUgLi9jb21wdXRlX3N0eWxlLnRzXG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlSW50KGVsZSwgcHJvcCkge1xuICByZXR1cm4gcGFyc2VJbnQoY29tcHV0ZVN0eWxlKGVsZSwgcHJvcCksIDEwKSB8fCAwO1xufVxuXG52YXIgY3NzVmFyaWFibGVSZSA9IC9eLS0vOyAvLyBAcmVxdWlyZSAuL3ZhcmlhYmxlcy50c1xuXG5mdW5jdGlvbiBpc0NTU1ZhcmlhYmxlKHByb3ApIHtcbiAgcmV0dXJuIGNzc1ZhcmlhYmxlUmUudGVzdChwcm9wKTtcbn0gLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG4vLyBAcmVxdWlyZSBjb3JlL2Nhc2gudHNcbi8vIEByZXF1aXJlIGNvcmUvZWFjaC50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcbi8vIEByZXF1aXJlIC4vaXNfY3NzX3ZhcmlhYmxlLnRzXG5cblxudmFyIHByZWZpeGVkUHJvcHMgPSB7fSxcbiAgICBzdHlsZSA9IGRpdi5zdHlsZSxcbiAgICB2ZW5kb3JzUHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdtb3onLCAnbXMnXTtcblxuZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wKHByb3AsIGlzVmFyaWFibGUpIHtcbiAgaWYgKGlzVmFyaWFibGUgPT09IHZvaWQgMCkge1xuICAgIGlzVmFyaWFibGUgPSBpc0NTU1ZhcmlhYmxlKHByb3ApO1xuICB9XG5cbiAgaWYgKGlzVmFyaWFibGUpIHJldHVybiBwcm9wO1xuXG4gIGlmICghcHJlZml4ZWRQcm9wc1twcm9wXSkge1xuICAgIHZhciBwcm9wQ0MgPSBjYW1lbENhc2UocHJvcCksXG4gICAgICAgIHByb3BVQyA9IFwiXCIgKyBwcm9wQ0NbMF0udG9VcHBlckNhc2UoKSArIHByb3BDQy5zbGljZSgxKSxcbiAgICAgICAgcHJvcHMgPSAocHJvcENDICsgXCIgXCIgKyB2ZW5kb3JzUHJlZml4ZXMuam9pbihwcm9wVUMgKyBcIiBcIikgKyBwcm9wVUMpLnNwbGl0KCcgJyk7XG4gICAgZWFjaChwcm9wcywgZnVuY3Rpb24gKGksIHApIHtcbiAgICAgIGlmIChwIGluIHN0eWxlKSB7XG4gICAgICAgIHByZWZpeGVkUHJvcHNbcHJvcF0gPSBwO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJlZml4ZWRQcm9wc1twcm9wXTtcbn1cblxuOyAvLyBAcmVxdWlyZSBjb3JlL3R5cGVfY2hlY2tpbmcudHNcbi8vIEByZXF1aXJlIC4vaXNfY3NzX3ZhcmlhYmxlLnRzXG5cbnZhciBudW1lcmljUHJvcHMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRTdWZmaXhlZFZhbHVlKHByb3AsIHZhbHVlLCBpc1ZhcmlhYmxlKSB7XG4gIGlmIChpc1ZhcmlhYmxlID09PSB2b2lkIDApIHtcbiAgICBpc1ZhcmlhYmxlID0gaXNDU1NWYXJpYWJsZShwcm9wKTtcbiAgfVxuXG4gIHJldHVybiAhaXNWYXJpYWJsZSAmJiAhbnVtZXJpY1Byb3BzW3Byb3BdICYmIGlzTnVtZXJpYyh2YWx1ZSkgPyB2YWx1ZSArIFwicHhcIiA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjc3MocHJvcCwgdmFsdWUpIHtcbiAgaWYgKGlzU3RyaW5nKHByb3ApKSB7XG4gICAgdmFyIGlzVmFyaWFibGVfMSA9IGlzQ1NTVmFyaWFibGUocHJvcCk7XG4gICAgcHJvcCA9IGdldFByZWZpeGVkUHJvcChwcm9wLCBpc1ZhcmlhYmxlXzEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgY29tcHV0ZVN0eWxlKHRoaXNbMF0sIHByb3AsIGlzVmFyaWFibGVfMSk7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gdGhpcztcbiAgICB2YWx1ZSA9IGdldFN1ZmZpeGVkVmFsdWUocHJvcCwgdmFsdWUsIGlzVmFyaWFibGVfMSk7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG5cbiAgICAgIGlmIChpc1ZhcmlhYmxlXzEpIHtcbiAgICAgICAgZWxlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZS5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3ApIHtcbiAgICB0aGlzLmNzcyhrZXksIHByb3Bba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuO1xuZm4uY3NzID0gY3NzOyAvLyBAb3B0aW9uYWwgLi9jc3MudHNcbi8vIEByZXF1aXJlIGNvcmUvYXR0ZW1wdC50c1xuLy8gQHJlcXVpcmUgY29yZS9jYW1lbF9jYXNlLnRzXG5cbnZhciBKU09OU3RyaW5nUmUgPSAvXlxccyt8XFxzKyQvO1xuXG5mdW5jdGlvbiBnZXREYXRhKGVsZSwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGVsZS5kYXRhc2V0W2tleV0gfHwgZWxlLmRhdGFzZXRbY2FtZWxDYXNlKGtleSldO1xuICBpZiAoSlNPTlN0cmluZ1JlLnRlc3QodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiBhdHRlbXB0KEpTT04ucGFyc2UsIHZhbHVlKTtcbn0gLy8gQHJlcXVpcmUgY29yZS9hdHRlbXB0LnRzXG4vLyBAcmVxdWlyZSBjb3JlL2NhbWVsX2Nhc2UudHNcblxuXG5mdW5jdGlvbiBzZXREYXRhKGVsZSwga2V5LCB2YWx1ZSkge1xuICB2YWx1ZSA9IGF0dGVtcHQoSlNPTi5zdHJpbmdpZnksIHZhbHVlKTtcbiAgZWxlLmRhdGFzZXRbY2FtZWxDYXNlKGtleSldID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGRhdGEobmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgaWYgKCF0aGlzWzBdKSByZXR1cm47XG4gICAgdmFyIGRhdGFzID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpc1swXS5kYXRhc2V0KSB7XG4gICAgICBkYXRhc1trZXldID0gZ2V0RGF0YSh0aGlzWzBdLCBrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhcztcbiAgfVxuXG4gIGlmIChpc1N0cmluZyhuYW1lKSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXNbMF0gJiYgZ2V0RGF0YSh0aGlzWzBdLCBuYW1lKTtcbiAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIHNldERhdGEoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgIHRoaXMuZGF0YShrZXksIG5hbWVba2V5XSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZm4uZGF0YSA9IGRhdGE7IC8vIEBvcHRpb25hbCAuL2RhdGEudHNcblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnREaW1lbnNpb24oZG9jLCBkaW1lbnNpb24pIHtcbiAgdmFyIGRvY0VsZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIHJldHVybiBNYXRoLm1heChkb2MuYm9keVtcInNjcm9sbFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wic2Nyb2xsXCIgKyBkaW1lbnNpb25dLCBkb2MuYm9keVtcIm9mZnNldFwiICsgZGltZW5zaW9uXSwgZG9jRWxlW1wib2Zmc2V0XCIgKyBkaW1lbnNpb25dLCBkb2NFbGVbXCJjbGllbnRcIiArIGRpbWVuc2lvbl0pO1xufSAvLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlX2ludC50c1xuXG5cbmZ1bmN0aW9uIGdldEV4dHJhU3BhY2UoZWxlLCB4QXhpcykge1xuICByZXR1cm4gY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJib3JkZXJcIiArICh4QXhpcyA/ICdMZWZ0JyA6ICdUb3AnKSArIFwiV2lkdGhcIikgKyBjb21wdXRlU3R5bGVJbnQoZWxlLCBcInBhZGRpbmdcIiArICh4QXhpcyA/ICdMZWZ0JyA6ICdUb3AnKSkgKyBjb21wdXRlU3R5bGVJbnQoZWxlLCBcInBhZGRpbmdcIiArICh4QXhpcyA/ICdSaWdodCcgOiAnQm90dG9tJykpICsgY29tcHV0ZVN0eWxlSW50KGVsZSwgXCJib3JkZXJcIiArICh4QXhpcyA/ICdSaWdodCcgOiAnQm90dG9tJykgKyBcIldpZHRoXCIpO1xufVxuXG5lYWNoKFt0cnVlLCBmYWxzZV0sIGZ1bmN0aW9uIChpLCBvdXRlcikge1xuICBlYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChpLCBwcm9wKSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiICsgKG91dGVyID8gJ291dGVyJyA6ICdpbm5lcicpICsgcHJvcDtcblxuICAgIGZuW25hbWVdID0gZnVuY3Rpb24gKGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgICBpZiAoIXRoaXNbMF0pIHJldHVybjtcbiAgICAgIGlmIChpc1dpbmRvdyh0aGlzWzBdKSkgcmV0dXJuIG91dGVyID8gdGhpc1swXVtcImlubmVyXCIgKyBwcm9wXSA6IHRoaXNbMF0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIgKyBwcm9wXTtcbiAgICAgIGlmIChpc0RvY3VtZW50KHRoaXNbMF0pKSByZXR1cm4gZ2V0RG9jdW1lbnREaW1lbnNpb24odGhpc1swXSwgcHJvcCk7XG4gICAgICByZXR1cm4gdGhpc1swXVtcIlwiICsgKG91dGVyID8gJ29mZnNldCcgOiAnY2xpZW50JykgKyBwcm9wXSArIChpbmNsdWRlTWFyZ2lucyAmJiBvdXRlciA/IGNvbXB1dGVTdHlsZUludCh0aGlzWzBdLCBcIm1hcmdpblwiICsgKGkgPyAnVG9wJyA6ICdMZWZ0JykpICsgY29tcHV0ZVN0eWxlSW50KHRoaXNbMF0sIFwibWFyZ2luXCIgKyAoaSA/ICdCb3R0b20nIDogJ1JpZ2h0JykpIDogMCk7XG4gICAgfTtcbiAgfSk7XG59KTtcbmVhY2goWydXaWR0aCcsICdIZWlnaHQnXSwgZnVuY3Rpb24gKGluZGV4LCBwcm9wKSB7XG4gIHZhciBwcm9wTEMgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm5bcHJvcExDXSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICghdGhpc1swXSkgcmV0dXJuIGlzVW5kZWZpbmVkKHZhbHVlKSA/IHVuZGVmaW5lZCA6IHRoaXM7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc1dpbmRvdyh0aGlzWzBdKSkgcmV0dXJuIHRoaXNbMF0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIgKyBwcm9wXTtcbiAgICAgIGlmIChpc0RvY3VtZW50KHRoaXNbMF0pKSByZXR1cm4gZ2V0RG9jdW1lbnREaW1lbnNpb24odGhpc1swXSwgcHJvcCk7XG4gICAgICByZXR1cm4gdGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtwcm9wTENdIC0gZ2V0RXh0cmFTcGFjZSh0aGlzWzBdLCAhaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgICB2YXIgYm94U2l6aW5nID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2JveFNpemluZycpO1xuICAgICAgZWxlLnN0eWxlW3Byb3BMQ10gPSBnZXRTdWZmaXhlZFZhbHVlKHByb3BMQywgdmFsdWVOdW1iZXIgKyAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcgPyBnZXRFeHRyYVNwYWNlKGVsZSwgIWluZGV4KSA6IDApKTtcbiAgICB9KTtcbiAgfTtcbn0pOyAvLyBAb3B0aW9uYWwgLi9pbm5lcl9vdXRlci50c1xuLy8gQG9wdGlvbmFsIC4vbm9ybWFsLnRzXG4vLyBAcmVxdWlyZSBjc3MvaGVscGVycy9jb21wdXRlX3N0eWxlLnRzXG5cbnZhciBkZWZhdWx0RGlzcGxheSA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSh0YWdOYW1lKSB7XG4gIGlmIChkZWZhdWx0RGlzcGxheVt0YWdOYW1lXSkgcmV0dXJuIGRlZmF1bHREaXNwbGF5W3RhZ05hbWVdO1xuICB2YXIgZWxlID0gY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgZG9jLmJvZHkuaW5zZXJ0QmVmb3JlKGVsZSwgbnVsbCk7XG4gIHZhciBkaXNwbGF5ID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2Rpc3BsYXknKTtcbiAgZG9jLmJvZHkucmVtb3ZlQ2hpbGQoZWxlKTtcbiAgcmV0dXJuIGRlZmF1bHREaXNwbGF5W3RhZ05hbWVdID0gZGlzcGxheSAhPT0gJ25vbmUnID8gZGlzcGxheSA6ICdibG9jayc7XG59IC8vIEByZXF1aXJlIGNzcy9oZWxwZXJzL2NvbXB1dGVfc3R5bGUudHNcblxuXG5mdW5jdGlvbiBpc0hpZGRlbihlbGUpIHtcbiAgcmV0dXJuIGNvbXB1dGVTdHlsZShlbGUsICdkaXNwbGF5JykgPT09ICdub25lJztcbn1cblxudmFyIGRpc3BsYXlQcm9wZXJ0eSA9ICdfX19jZCc7XG5cbmZuLnRvZ2dsZSA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgdmFyIHNob3cgPSBpc1VuZGVmaW5lZChmb3JjZSkgPyBpc0hpZGRlbihlbGUpIDogZm9yY2U7XG5cbiAgICBpZiAoc2hvdykge1xuICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSBlbGVbZGlzcGxheVByb3BlcnR5XSB8fCAnJztcblxuICAgICAgaWYgKGlzSGlkZGVuKGVsZSkpIHtcbiAgICAgICAgZWxlLnN0eWxlLmRpc3BsYXkgPSBnZXREZWZhdWx0RGlzcGxheShlbGUudGFnTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZVtkaXNwbGF5UHJvcGVydHldID0gY29tcHV0ZVN0eWxlKGVsZSwgJ2Rpc3BsYXknKTtcbiAgICAgIGVsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mbi5oaWRlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy50b2dnbGUoZmFsc2UpO1xufTtcblxuZm4uc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9nZ2xlKHRydWUpO1xufTsgLy8gQG9wdGlvbmFsIC4vaGlkZS50c1xuLy8gQG9wdGlvbmFsIC4vc2hvdy50c1xuLy8gQG9wdGlvbmFsIC4vdG9nZ2xlLnRzXG5cblxuZnVuY3Rpb24gaGFzTmFtZXNwYWNlcyhuczEsIG5zMikge1xuICByZXR1cm4gIW5zMiB8fCAhc29tZS5jYWxsKG5zMiwgZnVuY3Rpb24gKG5zKSB7XG4gICAgcmV0dXJuIG5zMS5pbmRleE9mKG5zKSA8IDA7XG4gIH0pO1xufVxuXG52YXIgZXZlbnRzTmFtZXNwYWNlID0gJ19fX2NlJyxcbiAgICBldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yID0gJy4nLFxuICAgIGV2ZW50c0ZvY3VzID0ge1xuICBmb2N1czogJ2ZvY3VzaW4nLFxuICBibHVyOiAnZm9jdXNvdXQnXG59LFxuICAgIGV2ZW50c0hvdmVyID0ge1xuICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgbW91c2VsZWF2ZTogJ21vdXNlb3V0J1xufSxcbiAgICBldmVudHNNb3VzZVJlID0gL14obW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3B8Y2xpY2t8ZGJsY2xpY2spL2k7IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cbmZ1bmN0aW9uIGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWUpIHtcbiAgcmV0dXJuIGV2ZW50c0hvdmVyW25hbWVdIHx8IGV2ZW50c0ZvY3VzW25hbWVdIHx8IG5hbWU7XG59IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRzQ2FjaGUoZWxlKSB7XG4gIHJldHVybiBlbGVbZXZlbnRzTmFtZXNwYWNlXSA9IGVsZVtldmVudHNOYW1lc3BhY2VdIHx8IHt9O1xufSAvLyBAcmVxdWlyZSBjb3JlL2d1aWQudHNcbi8vIEByZXF1aXJlIGV2ZW50cy9oZWxwZXJzL2dldF9ldmVudHNfY2FjaGUudHNcblxuXG5mdW5jdGlvbiBhZGRFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICB2YXIgZXZlbnRDYWNoZSA9IGdldEV2ZW50c0NhY2hlKGVsZSk7XG4gIGV2ZW50Q2FjaGVbbmFtZV0gPSBldmVudENhY2hlW25hbWVdIHx8IFtdO1xuICBldmVudENhY2hlW25hbWVdLnB1c2goW25hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFja10pO1xuICBlbGUuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBjYWxsYmFjayk7XG59IC8vIEByZXF1aXJlIC4vdmFyaWFibGVzLnRzXG5cblxuZnVuY3Rpb24gcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIHZhciBwYXJ0cyA9IGV2ZW50TmFtZS5zcGxpdChldmVudHNOYW1lc3BhY2VzU2VwYXJhdG9yKTtcbiAgcmV0dXJuIFtwYXJ0c1swXSwgcGFydHMuc2xpY2UoMSkuc29ydCgpXTsgLy8gW25hbWUsIG5hbWVzcGFjZVtdXVxufSAvLyBAcmVxdWlyZSAuL2dldF9ldmVudHNfY2FjaGUudHNcbi8vIEByZXF1aXJlIC4vaGFzX25hbWVzcGFjZXMudHNcbi8vIEByZXF1aXJlIC4vcGFyc2VfZXZlbnRfbmFtZS50c1xuXG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZSA9IGdldEV2ZW50c0NhY2hlKGVsZSk7XG5cbiAgaWYgKCFuYW1lKSB7XG4gICAgZm9yIChuYW1lIGluIGNhY2hlKSB7XG4gICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNhY2hlW25hbWVdKSB7XG4gICAgY2FjaGVbbmFtZV0gPSBjYWNoZVtuYW1lXS5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgbnMgPSBfYVswXSxcbiAgICAgICAgICBzZWwgPSBfYVsxXSxcbiAgICAgICAgICBjYiA9IF9hWzJdO1xuICAgICAgaWYgKGNhbGxiYWNrICYmIGNiLmd1aWQgIT09IGNhbGxiYWNrLmd1aWQgfHwgIWhhc05hbWVzcGFjZXMobnMsIG5hbWVzcGFjZXMpIHx8IHNlbGVjdG9yICYmIHNlbGVjdG9yICE9PSBzZWwpIHJldHVybiB0cnVlO1xuICAgICAgZWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgY2IpO1xuICAgIH0pO1xuICB9XG59XG5cbmZuLm9mZiA9IGZ1bmN0aW9uIChldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAoaXNVbmRlZmluZWQoZXZlbnRGdWxsTmFtZSkpIHtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlKSAmJiAhaXNEb2N1bWVudChlbGUpICYmICFpc1dpbmRvdyhlbGUpKSByZXR1cm47XG4gICAgICByZW1vdmVFdmVudChlbGUpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCFpc1N0cmluZyhldmVudEZ1bGxOYW1lKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB0aGlzLm9mZihrZXksIGV2ZW50RnVsbE5hbWVba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yID0gJyc7XG4gICAgfVxuXG4gICAgZWFjaChnZXRTcGxpdFZhbHVlcyhldmVudEZ1bGxOYW1lKSwgZnVuY3Rpb24gKGksIGV2ZW50RnVsbE5hbWUpIHtcbiAgICAgIHZhciBfYSA9IHBhcnNlRXZlbnROYW1lKGV2ZW50RnVsbE5hbWUpLFxuICAgICAgICAgIG5hbWVPcmlnaW5hbCA9IF9hWzBdLFxuICAgICAgICAgIG5hbWVzcGFjZXMgPSBfYVsxXSxcbiAgICAgICAgICBuYW1lID0gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZU9yaWdpbmFsKTtcblxuICAgICAgX3RoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuICAgICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gb24oZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrLCBfb25lKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKCFpc1N0cmluZyhldmVudEZ1bGxOYW1lKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBldmVudEZ1bGxOYW1lKSB7XG4gICAgICB0aGlzLm9uKGtleSwgc2VsZWN0b3IsIGRhdGEsIGV2ZW50RnVsbE5hbWVba2V5XSwgX29uZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIWlzU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmIChpc1VuZGVmaW5lZChzZWxlY3RvcikgfHwgaXNOdWxsKHNlbGVjdG9yKSkge1xuICAgICAgc2VsZWN0b3IgPSAnJztcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICBkYXRhID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IGRhdGE7XG4gICAgICBkYXRhID0gc2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICBjYWxsYmFjayA9IGRhdGE7XG4gICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuICBlYWNoKGdldFNwbGl0VmFsdWVzKGV2ZW50RnVsbE5hbWUpLCBmdW5jdGlvbiAoaSwgZXZlbnRGdWxsTmFtZSkge1xuICAgIHZhciBfYSA9IHBhcnNlRXZlbnROYW1lKGV2ZW50RnVsbE5hbWUpLFxuICAgICAgICBuYW1lT3JpZ2luYWwgPSBfYVswXSxcbiAgICAgICAgbmFtZXNwYWNlcyA9IF9hWzFdLFxuICAgICAgICBuYW1lID0gZ2V0RXZlbnROYW1lQnViYmxpbmcobmFtZU9yaWdpbmFsKSxcbiAgICAgICAgaXNFdmVudEhvdmVyID0gKG5hbWVPcmlnaW5hbCBpbiBldmVudHNIb3ZlciksXG4gICAgICAgIGlzRXZlbnRGb2N1cyA9IChuYW1lT3JpZ2luYWwgaW4gZXZlbnRzRm9jdXMpO1xuXG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICBfdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmICghaXNFbGVtZW50KGVsZSkgJiYgIWlzRG9jdW1lbnQoZWxlKSAmJiAhaXNXaW5kb3coZWxlKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZmluYWxDYWxsYmFjayA9IGZ1bmN0aW9uIGZpbmFsQ2FsbGJhY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldFtcIl9fX2lcIiArIGV2ZW50LnR5cGVdKSByZXR1cm4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIElnbm9yaW5nIG5hdGl2ZSBldmVudCBpbiBmYXZvciBvZiB0aGUgdXBjb21pbmcgY3VzdG9tIG9uZVxuXG4gICAgICAgIGlmIChldmVudC5uYW1lc3BhY2UgJiYgIWhhc05hbWVzcGFjZXMobmFtZXNwYWNlcywgZXZlbnQubmFtZXNwYWNlLnNwbGl0KGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXNlbGVjdG9yICYmIChpc0V2ZW50Rm9jdXMgJiYgKGV2ZW50LnRhcmdldCAhPT0gZWxlIHx8IGV2ZW50Ll9fX290ID09PSBuYW1lKSB8fCBpc0V2ZW50SG92ZXIgJiYgZXZlbnQucmVsYXRlZFRhcmdldCAmJiBlbGUuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSByZXR1cm47XG4gICAgICAgIHZhciB0aGlzQXJnID0gZWxlO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB3aGlsZSAoIW1hdGNoZXModGFyZ2V0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGVsZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNBcmcgPSB0YXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICdjdXJyZW50VGFyZ2V0Jywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzQXJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2RlbGVnYXRlVGFyZ2V0Jywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnZGF0YScsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGV2ZW50LCBldmVudC5fX190ZCk7XG5cbiAgICAgICAgaWYgKF9vbmUpIHtcbiAgICAgICAgICByZW1vdmVFdmVudChlbGUsIG5hbWUsIG5hbWVzcGFjZXMsIHNlbGVjdG9yLCBmaW5hbENhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmaW5hbENhbGxiYWNrLmd1aWQgPSBjYWxsYmFjay5ndWlkID0gY2FsbGJhY2suZ3VpZCB8fCBjYXNoLmd1aWQrKztcbiAgICAgIGFkZEV2ZW50KGVsZSwgbmFtZSwgbmFtZXNwYWNlcywgc2VsZWN0b3IsIGZpbmFsQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZuLm9uID0gb247XG5cbmZ1bmN0aW9uIG9uZShldmVudEZ1bGxOYW1lLCBzZWxlY3RvciwgZGF0YSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMub24oZXZlbnRGdWxsTmFtZSwgc2VsZWN0b3IsIGRhdGEsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuO1xuZm4ub25lID0gb25lO1xuXG5mbi5yZWFkeSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChjYWxsYmFjaywgMCwgY2FzaCk7XG4gIH07XG5cbiAgaWYgKGRvYy5yZWFkeVN0YXRlICE9PSAnbG9hZGluZycpIHtcbiAgICBjYigpO1xuICB9IGVsc2Uge1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGlmIChpc1N0cmluZyhldmVudCkpIHtcbiAgICB2YXIgX2EgPSBwYXJzZUV2ZW50TmFtZShldmVudCksXG4gICAgICAgIG5hbWVPcmlnaW5hbCA9IF9hWzBdLFxuICAgICAgICBuYW1lc3BhY2VzID0gX2FbMV0sXG4gICAgICAgIG5hbWVfMSA9IGdldEV2ZW50TmFtZUJ1YmJsaW5nKG5hbWVPcmlnaW5hbCk7XG5cbiAgICBpZiAoIW5hbWVfMSkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHR5cGUgPSBldmVudHNNb3VzZVJlLnRlc3QobmFtZV8xKSA/ICdNb3VzZUV2ZW50cycgOiAnSFRNTEV2ZW50cyc7XG4gICAgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQodHlwZSk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWVfMSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKGV2ZW50c05hbWVzcGFjZXNTZXBhcmF0b3IpO1xuICAgIGV2ZW50Ll9fX290ID0gbmFtZU9yaWdpbmFsO1xuICB9XG5cbiAgZXZlbnQuX19fdGQgPSBkYXRhO1xuICB2YXIgaXNFdmVudEZvY3VzID0gKGV2ZW50Ll9fX290IGluIGV2ZW50c0ZvY3VzKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGlzRXZlbnRGb2N1cyAmJiBpc0Z1bmN0aW9uKGVsZVtldmVudC5fX19vdF0pKSB7XG4gICAgICBlbGVbXCJfX19pXCIgKyBldmVudC50eXBlXSA9IHRydWU7IC8vIEVuc3VyaW5nIHRoZSBuYXRpdmUgZXZlbnQgaXMgaWdub3JlZFxuXG4gICAgICBlbGVbZXZlbnQuX19fb3RdKCk7XG5cbiAgICAgIGVsZVtcIl9fX2lcIiArIGV2ZW50LnR5cGVdID0gZmFsc2U7IC8vIEVuc3VyaW5nIHRoZSBjdXN0b20gZXZlbnQgaXMgbm90IGlnbm9yZWRcbiAgICB9XG5cbiAgICBlbGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0pO1xufTsgLy8gQG9wdGlvbmFsIC4vb2ZmLnRzXG4vLyBAb3B0aW9uYWwgLi9vbi50c1xuLy8gQG9wdGlvbmFsIC4vb25lLnRzXG4vLyBAb3B0aW9uYWwgLi9yZWFkeS50c1xuLy8gQG9wdGlvbmFsIC4vdHJpZ2dlci50c1xuLy8gQHJlcXVpcmUgY29yZS9wbHVjay50c1xuLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcblxuXG5mdW5jdGlvbiBnZXRWYWx1ZShlbGUpIHtcbiAgaWYgKGVsZS5tdWx0aXBsZSAmJiBlbGUub3B0aW9ucykgcmV0dXJuIHBsdWNrKGZpbHRlci5jYWxsKGVsZS5vcHRpb25zLCBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5zZWxlY3RlZCAmJiAhb3B0aW9uLmRpc2FibGVkICYmICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZDtcbiAgfSksICd2YWx1ZScpO1xuICByZXR1cm4gZWxlLnZhbHVlIHx8ICcnO1xufVxuXG52YXIgcXVlcnlFbmNvZGVTcGFjZVJlID0gLyUyMC9nLFxuICAgIHF1ZXJ5RW5jb2RlQ1JMRlJlID0gL1xccj9cXG4vZztcblxuZnVuY3Rpb24gcXVlcnlFbmNvZGUocHJvcCwgdmFsdWUpIHtcbiAgcmV0dXJuIFwiJlwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZShxdWVyeUVuY29kZUNSTEZSZSwgJ1xcclxcbicpKS5yZXBsYWNlKHF1ZXJ5RW5jb2RlU3BhY2VSZSwgJysnKTtcbn1cblxudmFyIHNraXBwYWJsZVJlID0gL2ZpbGV8cmVzZXR8c3VibWl0fGJ1dHRvbnxpbWFnZS9pLFxuICAgIGNoZWNrYWJsZVJlID0gL3JhZGlvfGNoZWNrYm94L2k7XG5cbmZuLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHF1ZXJ5ID0gJyc7XG4gIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgZWFjaChlbGUuZWxlbWVudHMgfHwgW2VsZV0sIGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICAgIGlmIChlbGUuZGlzYWJsZWQgfHwgIWVsZS5uYW1lIHx8IGVsZS50YWdOYW1lID09PSAnRklFTERTRVQnIHx8IHNraXBwYWJsZVJlLnRlc3QoZWxlLnR5cGUpIHx8IGNoZWNrYWJsZVJlLnRlc3QoZWxlLnR5cGUpICYmICFlbGUuY2hlY2tlZCkgcmV0dXJuO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoZWxlKTtcblxuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICBlYWNoKHZhbHVlcywgZnVuY3Rpb24gKGksIHZhbHVlKSB7XG4gICAgICAgICAgcXVlcnkgKz0gcXVlcnlFbmNvZGUoZWxlLm5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVlcnkuc2xpY2UoMSk7XG59O1xuXG5mdW5jdGlvbiB2YWwodmFsdWUpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpc1swXSAmJiBnZXRWYWx1ZSh0aGlzWzBdKTtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIGlzU2VsZWN0ID0gZWxlLm11bHRpcGxlICYmIGVsZS5vcHRpb25zO1xuXG4gICAgaWYgKGlzU2VsZWN0IHx8IGNoZWNrYWJsZVJlLnRlc3QoZWxlLnR5cGUpKSB7XG4gICAgICB2YXIgZWxlVmFsdWVfMSA9IGlzQXJyYXkodmFsdWUpID8gbWFwLmNhbGwodmFsdWUsIFN0cmluZykgOiBpc051bGwodmFsdWUpID8gW10gOiBbU3RyaW5nKHZhbHVlKV07XG5cbiAgICAgIGlmIChpc1NlbGVjdCkge1xuICAgICAgICBlYWNoKGVsZS5vcHRpb25zLCBmdW5jdGlvbiAoaSwgb3B0aW9uKSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZWxlVmFsdWVfMS5pbmRleE9mKG9wdGlvbi52YWx1ZSkgPj0gMDtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGUuY2hlY2tlZCA9IGVsZVZhbHVlXzEuaW5kZXhPZihlbGUudmFsdWUpID49IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZS52YWx1ZSA9IGlzVW5kZWZpbmVkKHZhbHVlKSB8fCBpc051bGwodmFsdWUpID8gJycgOiB2YWx1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mbi52YWwgPSB2YWw7XG5cbmZuLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIHJldHVybiBlbGUuY2xvbmVOb2RlKHRydWUpO1xuICB9KTtcbn07XG5cbmZuLmRldGFjaCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIGZpbHRlcmVkKHRoaXMsIGNvbXBhcmF0b3IpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChlbGUucGFyZW50Tm9kZSkge1xuICAgICAgZWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBmcmFnbWVudFJlID0gL15cXHMqPChcXHcrKVtePl0qPi8sXG4gICAgc2luZ2xlVGFnUmUgPSAvXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPik/JC87XG52YXIgY29udGFpbmVycyA9IHtcbiAgJyonOiBkaXYsXG4gIHRyOiB0Ym9keSxcbiAgdGQ6IHRyLFxuICB0aDogdHIsXG4gIHRoZWFkOiB0YWJsZSxcbiAgdGJvZHk6IHRhYmxlLFxuICB0Zm9vdDogdGFibGVcbn07IC8vVE9ETzogQ3JlYXRlIGVsZW1lbnRzIGluc2lkZSBhIGRvY3VtZW50IGZyYWdtZW50LCBpbiBvcmRlciB0byBwcmV2ZW50IGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGZpcmluZ1xuLy9UT0RPOiBFbnN1cmUgdGhlIGNyZWF0ZWQgZWxlbWVudHMgaGF2ZSB0aGUgZnJhZ21lbnQgYXMgdGhlaXIgcGFyZW50IGluc3RlYWQgb2YgbnVsbCwgdGhpcyBhbHNvIGVuc3VyZXMgd2UgY2FuIGRlYWwgd2l0aCBkZXRhdGNoZWQgbm9kZXMgbW9yZSByZWxpYWJseVxuXG5mdW5jdGlvbiBwYXJzZUhUTUwoaHRtbCkge1xuICBpZiAoIWlzU3RyaW5nKGh0bWwpKSByZXR1cm4gW107XG4gIGlmIChzaW5nbGVUYWdSZS50ZXN0KGh0bWwpKSByZXR1cm4gW2NyZWF0ZUVsZW1lbnQoUmVnRXhwLiQxKV07XG4gIHZhciBmcmFnbWVudCA9IGZyYWdtZW50UmUudGVzdChodG1sKSAmJiBSZWdFeHAuJDEsXG4gICAgICBjb250YWluZXIgPSBjb250YWluZXJzW2ZyYWdtZW50XSB8fCBjb250YWluZXJzWycqJ107XG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICByZXR1cm4gY2FzaChjb250YWluZXIuY2hpbGROb2RlcykuZGV0YWNoKCkuZ2V0KCk7XG59XG5cbmNhc2gucGFyc2VIVE1MID0gcGFyc2VIVE1MO1xuXG5mbi5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgd2hpbGUgKGVsZS5maXJzdENoaWxkKSB7XG4gICAgICBlbGUucmVtb3ZlQ2hpbGQoZWxlLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBodG1sKGh0bWwpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLmlubmVySFRNTDtcbiAgaWYgKGlzVW5kZWZpbmVkKGh0bWwpKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlKSkgcmV0dXJuO1xuICAgIGVsZS5pbm5lckhUTUwgPSBodG1sO1xuICB9KTtcbn1cblxuZm4uaHRtbCA9IGh0bWw7XG5cbmZuLnJlbW92ZSA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIGZpbHRlcmVkKHRoaXMsIGNvbXBhcmF0b3IpLmRldGFjaCgpLm9mZigpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHRleHQodGV4dCkge1xuICBpZiAoaXNVbmRlZmluZWQodGV4dCkpIHJldHVybiB0aGlzWzBdID8gdGhpc1swXS50ZXh0Q29udGVudCA6ICcnO1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGUpKSByZXR1cm47XG4gICAgZWxlLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfSk7XG59XG5cbjtcbmZuLnRleHQgPSB0ZXh0O1xuXG5mbi51bndyYXAgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgaWYgKGVsZS50YWdOYW1lID09PSAnQk9EWScpIHJldHVybjtcbiAgICB2YXIgJGVsZSA9IGNhc2goZWxlKTtcbiAgICAkZWxlLnJlcGxhY2VXaXRoKCRlbGUuY2hpbGRyZW4oKSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZuLm9mZnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmICghZWxlKSByZXR1cm47XG4gIHZhciByZWN0ID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG4gICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG4gIH07XG59O1xuXG5mbi5vZmZzZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZS5vZmZzZXRQYXJlbnQ7XG5cbiAgICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGNvbXB1dGVTdHlsZShvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY0VsZTtcbiAgfSk7XG59O1xuXG5mbi5wb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmICghZWxlKSByZXR1cm47XG4gIHZhciBpc0ZpeGVkID0gY29tcHV0ZVN0eWxlKGVsZSwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcsXG4gICAgICBvZmZzZXQgPSBpc0ZpeGVkID8gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogdGhpcy5vZmZzZXQoKTtcblxuICBpZiAoIWlzRml4ZWQpIHtcbiAgICB2YXIgZG9jXzEgPSBlbGUub3duZXJEb2N1bWVudDtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlLm9mZnNldFBhcmVudCB8fCBkb2NfMS5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoKG9mZnNldFBhcmVudCA9PT0gZG9jXzEuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvY18xLmRvY3VtZW50RWxlbWVudCkgJiYgY29tcHV0ZVN0eWxlKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ICE9PSBlbGUgJiYgaXNFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBwYXJlbnRPZmZzZXQgPSBjYXNoKG9mZnNldFBhcmVudCkub2Zmc2V0KCk7XG4gICAgICBvZmZzZXQudG9wIC09IHBhcmVudE9mZnNldC50b3AgKyBjb21wdXRlU3R5bGVJbnQob2Zmc2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnKTtcbiAgICAgIG9mZnNldC5sZWZ0IC09IHBhcmVudE9mZnNldC5sZWZ0ICsgY29tcHV0ZVN0eWxlSW50KG9mZnNldFBhcmVudCwgJ2JvcmRlckxlZnRXaWR0aCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvZmZzZXQudG9wIC0gY29tcHV0ZVN0eWxlSW50KGVsZSwgJ21hcmdpblRvcCcpLFxuICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gY29tcHV0ZVN0eWxlSW50KGVsZSwgJ21hcmdpbkxlZnQnKVxuICB9O1xufTtcblxuZm4uY2hpbGRyZW4gPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBlbGUuY2hpbGRyZW47XG4gIH0pKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4uY29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS50YWdOYW1lID09PSAnSUZSQU1FJyA/IFtlbGUuY29udGVudERvY3VtZW50XSA6IGVsZS50YWdOYW1lID09PSAnVEVNUExBVEUnID8gZWxlLmNvbnRlbnQuY2hpbGROb2RlcyA6IGVsZS5jaGlsZE5vZGVzO1xuICB9KSkpO1xufTtcblxuZm4uZmluZCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBmaW5kKHNlbGVjdG9yLCBlbGUpO1xuICB9KSkpO1xufTsgLy8gQHJlcXVpcmUgY29yZS92YXJpYWJsZXMudHNcbi8vIEByZXF1aXJlIGNvbGxlY3Rpb24vZmlsdGVyLnRzXG4vLyBAcmVxdWlyZSB0cmF2ZXJzYWwvZmluZC50c1xuXG5cbnZhciBIVE1MQ0RBVEFSZSA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZyxcbiAgICBzY3JpcHRUeXBlUmUgPSAvXiR8Xm1vZHVsZSR8XFwvKGphdmF8ZWNtYSlzY3JpcHQvaSxcbiAgICBzY3JpcHRBdHRyaWJ1dGVzID0gWyd0eXBlJywgJ3NyYycsICdub25jZScsICdub01vZHVsZSddO1xuXG5mdW5jdGlvbiBldmFsU2NyaXB0cyhub2RlLCBkb2MpIHtcbiAgdmFyIGNvbGxlY3Rpb24gPSBjYXNoKG5vZGUpO1xuICBjb2xsZWN0aW9uLmZpbHRlcignc2NyaXB0JykuYWRkKGNvbGxlY3Rpb24uZmluZCgnc2NyaXB0JykpLmVhY2goZnVuY3Rpb24gKGksIGVsZSkge1xuICAgIGlmIChzY3JpcHRUeXBlUmUudGVzdChlbGUudHlwZSkgJiYgZG9jRWxlLmNvbnRhaW5zKGVsZSkpIHtcbiAgICAgIC8vIFRoZSBzY3JpcHQgdHlwZSBpcyBzdXBwb3J0ZWQgLy8gVGhlIGVsZW1lbnQgaXMgYXR0YWNoZWQgdG8gdGhlIERPTSAvLyBVc2luZyBgZG9jdW1lbnRFbGVtZW50YCBmb3IgYnJvYWRlciBicm93c2VyIHN1cHBvcnRcbiAgICAgIHZhciBzY3JpcHRfMSA9IGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0XzEudGV4dCA9IGVsZS50ZXh0Q29udGVudC5yZXBsYWNlKEhUTUxDREFUQVJlLCAnJyk7XG4gICAgICBlYWNoKHNjcmlwdEF0dHJpYnV0ZXMsIGZ1bmN0aW9uIChpLCBhdHRyKSB7XG4gICAgICAgIGlmIChlbGVbYXR0cl0pIHNjcmlwdF8xW2F0dHJdID0gZWxlW2F0dHJdO1xuICAgICAgfSk7XG4gICAgICBkb2MuaGVhZC5pbnNlcnRCZWZvcmUoc2NyaXB0XzEsIG51bGwpO1xuICAgICAgZG9jLmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0XzEpO1xuICAgIH1cbiAgfSk7XG59IC8vIEByZXF1aXJlIC4vZXZhbF9zY3JpcHRzLnRzXG5cblxuZnVuY3Rpb24gaW5zZXJ0RWxlbWVudChhbmNob3IsIHRhcmdldCwgbGVmdCwgaW5zaWRlLCBldmFsdWF0ZSkge1xuICBpZiAoaW5zaWRlKSB7XG4gICAgLy8gcHJlcGVuZC9hcHBlbmRcbiAgICBhbmNob3IuaW5zZXJ0QmVmb3JlKHRhcmdldCwgbGVmdCA/IGFuY2hvci5maXJzdENoaWxkIDogbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYmVmb3JlL2FmdGVyXG4gICAgaWYgKGFuY2hvci5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICBhbmNob3IucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGFyZ2V0LCBhbmNob3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmNob3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFyZ2V0LCBsZWZ0ID8gYW5jaG9yIDogYW5jaG9yLm5leHRTaWJsaW5nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXZhbHVhdGUpIHtcbiAgICBldmFsU2NyaXB0cyh0YXJnZXQsIGFuY2hvci5vd25lckRvY3VtZW50KTtcbiAgfVxufSAvLyBAcmVxdWlyZSAuL2luc2VydF9lbGVtZW50LnRzXG5cblxuZnVuY3Rpb24gaW5zZXJ0U2VsZWN0b3JzKHNlbGVjdG9ycywgYW5jaG9ycywgaW52ZXJzZSwgbGVmdCwgaW5zaWRlLCByZXZlcnNlTG9vcDEsIHJldmVyc2VMb29wMiwgcmV2ZXJzZUxvb3AzKSB7XG4gIGVhY2goc2VsZWN0b3JzLCBmdW5jdGlvbiAoc2ksIHNlbGVjdG9yKSB7XG4gICAgZWFjaChjYXNoKHNlbGVjdG9yKSwgZnVuY3Rpb24gKHRpLCB0YXJnZXQpIHtcbiAgICAgIGVhY2goY2FzaChhbmNob3JzKSwgZnVuY3Rpb24gKGFpLCBhbmNob3IpIHtcbiAgICAgICAgdmFyIGFuY2hvckZpbmFsID0gaW52ZXJzZSA/IHRhcmdldCA6IGFuY2hvcixcbiAgICAgICAgICAgIHRhcmdldEZpbmFsID0gaW52ZXJzZSA/IGFuY2hvciA6IHRhcmdldCxcbiAgICAgICAgICAgIGluZGV4RmluYWwgPSBpbnZlcnNlID8gdGkgOiBhaTtcbiAgICAgICAgaW5zZXJ0RWxlbWVudChhbmNob3JGaW5hbCwgIWluZGV4RmluYWwgPyB0YXJnZXRGaW5hbCA6IHRhcmdldEZpbmFsLmNsb25lTm9kZSh0cnVlKSwgbGVmdCwgaW5zaWRlLCAhaW5kZXhGaW5hbCk7XG4gICAgICB9LCByZXZlcnNlTG9vcDMpO1xuICAgIH0sIHJldmVyc2VMb29wMik7XG4gIH0sIHJldmVyc2VMb29wMSk7XG4gIHJldHVybiBhbmNob3JzO1xufVxuXG5mbi5hZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpO1xufTtcblxuZm4uYXBwZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbn07XG5cbmZuLmFwcGVuZFRvID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5iZWZvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gaW5zZXJ0U2VsZWN0b3JzKGFyZ3VtZW50cywgdGhpcywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xufTtcblxuZm4uaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCB0cnVlLCB0cnVlKTtcbn07XG5cbmZuLnByZXBlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpbnNlcnRTZWxlY3RvcnMoYXJndW1lbnRzLCB0aGlzLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5mbi5wcmVwZW5kVG8gPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGluc2VydFNlbGVjdG9ycyhhcmd1bWVudHMsIHRoaXMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG59O1xuXG5mbi5yZXBsYWNlV2l0aCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5iZWZvcmUoc2VsZWN0b3IpLnJlbW92ZSgpO1xufTtcblxuZm4ucmVwbGFjZUFsbCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICBjYXNoKHNlbGVjdG9yKS5yZXBsYWNlV2l0aCh0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi53cmFwQWxsID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHZhciBzdHJ1Y3R1cmUgPSBjYXNoKHNlbGVjdG9yKSxcbiAgICAgIHdyYXBwZXIgPSBzdHJ1Y3R1cmVbMF07XG5cbiAgd2hpbGUgKHdyYXBwZXIuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgd3JhcHBlciA9IHdyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIH1cblxuICB0aGlzLmZpcnN0KCkuYmVmb3JlKHN0cnVjdHVyZSk7XG4gIHJldHVybiB0aGlzLmFwcGVuZFRvKHdyYXBwZXIpO1xufTtcblxuZm4ud3JhcCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICB2YXIgd3JhcHBlciA9IGNhc2goc2VsZWN0b3IpWzBdO1xuICAgIGNhc2goZWxlKS53cmFwQWxsKCFpID8gd3JhcHBlciA6IHdyYXBwZXIuY2xvbmVOb2RlKHRydWUpKTtcbiAgfSk7XG59O1xuXG5mbi53cmFwSW5uZXIgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgdmFyICRlbGUgPSBjYXNoKGVsZSksXG4gICAgICAgIGNvbnRlbnRzID0gJGVsZS5jb250ZW50cygpO1xuICAgIGNvbnRlbnRzLmxlbmd0aCA/IGNvbnRlbnRzLndyYXBBbGwoc2VsZWN0b3IpIDogJGVsZS5hcHBlbmQoc2VsZWN0b3IpO1xuICB9KTtcbn07XG5cbmZuLmhhcyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgY29tcGFyYXRvciA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IGZ1bmN0aW9uIChpLCBlbGUpIHtcbiAgICByZXR1cm4gZmluZChzZWxlY3RvciwgZWxlKS5sZW5ndGg7XG4gIH0gOiBmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jb250YWlucyhzZWxlY3Rvcik7XG4gIH07XG4gIHJldHVybiB0aGlzLmZpbHRlcihjb21wYXJhdG9yKTtcbn07XG5cbmZuLmlzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiBzb21lLmNhbGwodGhpcywgZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIHJldHVybiBjb21wYXJlLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KTtcbn07XG5cbmZuLm5leHQgPSBmdW5jdGlvbiAoY29tcGFyYXRvciwgX2FsbCwgX3VudGlsKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAnbmV4dEVsZW1lbnRTaWJsaW5nJywgX2FsbCwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLm5leHRBbGwgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5uZXh0KGNvbXBhcmF0b3IsIHRydWUpO1xufTtcblxuZm4ubmV4dFVudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLm5leHQoY29tcGFyYXRvciwgdHJ1ZSwgdW50aWwpO1xufTtcblxuZm4ubm90ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGNvbXBhcmUgPSBnZXRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcik7XG4gIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAoaSwgZWxlKSB7XG4gICAgcmV0dXJuICghaXNTdHJpbmcoY29tcGFyYXRvcikgfHwgaXNFbGVtZW50KGVsZSkpICYmICFjb21wYXJlLmNhbGwoZWxlLCBpLCBlbGUpO1xuICB9KTtcbn07XG5cbmZuLnBhcmVudCA9IGZ1bmN0aW9uIChjb21wYXJhdG9yKSB7XG4gIHJldHVybiBmaWx0ZXJlZChjYXNoKHVuaXF1ZShwbHVjayh0aGlzLCAncGFyZW50Tm9kZScpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4uaW5kZXggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgdmFyIGNoaWxkID0gc2VsZWN0b3IgPyBjYXNoKHNlbGVjdG9yKVswXSA6IHRoaXNbMF0sXG4gICAgICBjb2xsZWN0aW9uID0gc2VsZWN0b3IgPyB0aGlzIDogY2FzaChjaGlsZCkucGFyZW50KCkuY2hpbGRyZW4oKTtcbiAgcmV0dXJuIGluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBjaGlsZCk7XG59O1xuXG5mbi5jbG9zZXN0ID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IpIHtcbiAgdmFyIGZpbHRlcmVkID0gdGhpcy5maWx0ZXIoY29tcGFyYXRvcik7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGgpIHJldHVybiBmaWx0ZXJlZDtcbiAgdmFyICRwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICBpZiAoISRwYXJlbnQubGVuZ3RoKSByZXR1cm4gZmlsdGVyZWQ7XG4gIHJldHVybiAkcGFyZW50LmNsb3Nlc3QoY29tcGFyYXRvcik7XG59O1xuXG5mbi5wYXJlbnRzID0gZnVuY3Rpb24gKGNvbXBhcmF0b3IsIF91bnRpbCkge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgJ3BhcmVudEVsZW1lbnQnLCB0cnVlLCBfdW50aWwpKSksIGNvbXBhcmF0b3IpO1xufTtcblxuZm4ucGFyZW50c1VudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudHMoY29tcGFyYXRvciwgdW50aWwpO1xufTtcblxuZm4ucHJldiA9IGZ1bmN0aW9uIChjb21wYXJhdG9yLCBfYWxsLCBfdW50aWwpIHtcbiAgcmV0dXJuIGZpbHRlcmVkKGNhc2godW5pcXVlKHBsdWNrKHRoaXMsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywgX2FsbCwgX3VudGlsKSkpLCBjb21wYXJhdG9yKTtcbn07XG5cbmZuLnByZXZBbGwgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gdGhpcy5wcmV2KGNvbXBhcmF0b3IsIHRydWUpO1xufTtcblxuZm4ucHJldlVudGlsID0gZnVuY3Rpb24gKHVudGlsLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiB0aGlzLnByZXYoY29tcGFyYXRvciwgdHJ1ZSwgdW50aWwpO1xufTtcblxuZm4uc2libGluZ3MgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICByZXR1cm4gZmlsdGVyZWQoY2FzaCh1bmlxdWUocGx1Y2sodGhpcywgZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiBjYXNoKGVsZSkucGFyZW50KCkuY2hpbGRyZW4oKS5ub3QoZWxlKTtcbiAgfSkpKSwgY29tcGFyYXRvcik7XG59OyAvLyBAb3B0aW9uYWwgLi9jaGlsZHJlbi50c1xuLy8gQG9wdGlvbmFsIC4vY2xvc2VzdC50c1xuLy8gQG9wdGlvbmFsIC4vY29udGVudHMudHNcbi8vIEBvcHRpb25hbCAuL2ZpbmQudHNcbi8vIEBvcHRpb25hbCAuL2hhcy50c1xuLy8gQG9wdGlvbmFsIC4vaXMudHNcbi8vIEBvcHRpb25hbCAuL25leHQudHNcbi8vIEBvcHRpb25hbCAuL25leHRfYWxsLnRzXG4vLyBAb3B0aW9uYWwgLi9uZXh0X3VudGlsLnRzXG4vLyBAb3B0aW9uYWwgLi9ub3QudHNcbi8vIEBvcHRpb25hbCAuL3BhcmVudC50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50cy50c1xuLy8gQG9wdGlvbmFsIC4vcGFyZW50c191bnRpbC50c1xuLy8gQG9wdGlvbmFsIC4vcHJldi50c1xuLy8gQG9wdGlvbmFsIC4vcHJldl9hbGwudHNcbi8vIEBvcHRpb25hbCAuL3ByZXZfdW50aWwudHNcbi8vIEBvcHRpb25hbCAuL3NpYmxpbmdzLnRzXG4vLyBAb3B0aW9uYWwgYXR0cmlidXRlcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGNvbGxlY3Rpb24vaW5kZXgudHNcbi8vIEBvcHRpb25hbCBjc3MvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBkYXRhL2luZGV4LnRzXG4vLyBAb3B0aW9uYWwgZGltZW5zaW9ucy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIGVmZmVjdHMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBldmVudHMvaW5kZXgudHNcbi8vIEBvcHRpb25hbCBmb3Jtcy9pbmRleC50c1xuLy8gQG9wdGlvbmFsIG1hbmlwdWxhdGlvbi9pbmRleC50c1xuLy8gQG9wdGlvbmFsIG9mZnNldC9pbmRleC50c1xuLy8gQG9wdGlvbmFsIHRyYXZlcnNhbC9pbmRleC50c1xuLy8gQHJlcXVpcmUgY29yZS9pbmRleC50c1xuLy8gQHByaW9yaXR5IC0xMDBcbi8vIEByZXF1aXJlIC4vY2FzaC50c1xuLy8gQHJlcXVpcmUgLi92YXJpYWJsZXMudHNcblxuXG5pZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIE5vZGUuanNcbiAgbW9kdWxlLmV4cG9ydHMgPSBjYXNoO1xufSBlbHNlIHtcbiAgLy8gQnJvd3NlclxuICB3aW5bJ2Nhc2gnXSA9IHdpblsnJCddID0gY2FzaDtcbn1cbn0pKCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3V0JCA9IHR5cGVvZiBleHBvcnRzICE9ICd1bmRlZmluZWQnICYmIGV4cG9ydHMgfHwgdHlwZW9mIGRlZmluZSAhPSAndW5kZWZpbmVkJyAmJiB7fSB8fCB0aGlzIHx8IHdpbmRvdztcbiAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnKSBkZWZpbmUoJ3NhdmUtc3ZnLWFzLXBuZycsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG91dCQ7XG4gIH0pO1xuICBvdXQkLmRlZmF1bHQgPSBvdXQkO1xuXG4gIHZhciB4bWxOcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyc7XG4gIHZhciB4aHRtbE5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICB2YXIgc3ZnTnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICB2YXIgZG9jdHlwZSA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCI/PjwhRE9DVFlQRSBzdmcgUFVCTElDIFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZFwiIFs8IUVOVElUWSBuYnNwIFwiJiMxNjA7XCI+XT4nO1xuICB2YXIgdXJsUmVnZXggPSAvdXJsXFwoW1wiJ10/KC4rPylbXCInXT9cXCkvO1xuICB2YXIgZm9udEZvcm1hdHMgPSB7XG4gICAgd29mZjI6ICdmb250L3dvZmYyJyxcbiAgICB3b2ZmOiAnZm9udC93b2ZmJyxcbiAgICBvdGY6ICdhcHBsaWNhdGlvbi94LWZvbnQtb3BlbnR5cGUnLFxuICAgIHR0ZjogJ2FwcGxpY2F0aW9uL3gtZm9udC10dGYnLFxuICAgIGVvdDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICBzZm50OiAnYXBwbGljYXRpb24vZm9udC1zZm50JyxcbiAgICBzdmc6ICdpbWFnZS9zdmcreG1sJ1xuICB9O1xuXG4gIHZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiBpc0VsZW1lbnQob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG9iaiBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG4gIH07XG4gIHZhciByZXF1aXJlRG9tTm9kZSA9IGZ1bmN0aW9uIHJlcXVpcmVEb21Ob2RlKGVsKSB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWwpKSB0aHJvdyBuZXcgRXJyb3IoJ2FuIEhUTUxFbGVtZW50IG9yIFNWR0VsZW1lbnQgaXMgcmVxdWlyZWQ7IGdvdCAnICsgZWwpO1xuICB9O1xuICB2YXIgcmVxdWlyZURvbU5vZGVQcm9taXNlID0gZnVuY3Rpb24gcmVxdWlyZURvbU5vZGVQcm9taXNlKGVsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQoZWwpKSByZXNvbHZlKGVsKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2FuIEhUTUxFbGVtZW50IG9yIFNWR0VsZW1lbnQgaXMgcmVxdWlyZWQ7IGdvdCAnICsgZWwpKTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIGlzRXh0ZXJuYWwgPSBmdW5jdGlvbiBpc0V4dGVybmFsKHVybCkge1xuICAgIHJldHVybiB1cmwgJiYgdXJsLmxhc3RJbmRleE9mKCdodHRwJywgMCkgPT09IDAgJiYgdXJsLmxhc3RJbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0KSA9PT0gLTE7XG4gIH07XG5cbiAgdmFyIGdldEZvbnRNaW1lVHlwZUZyb21VcmwgPSBmdW5jdGlvbiBnZXRGb250TWltZVR5cGVGcm9tVXJsKGZvbnRVcmwpIHtcbiAgICB2YXIgZm9ybWF0cyA9IE9iamVjdC5rZXlzKGZvbnRGb3JtYXRzKS5maWx0ZXIoZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGZvbnRVcmwuaW5kZXhPZignLicgKyBleHRlbnNpb24pID4gMDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGZvbnRGb3JtYXRzW2V4dGVuc2lvbl07XG4gICAgfSk7XG4gICAgaWYgKGZvcm1hdHMpIHJldHVybiBmb3JtYXRzWzBdO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gZm9udCBmb3JtYXQgZm9yICcgKyBmb250VXJsICsgJy4gRm9udHMgbWF5IG5vdCBiZSB3b3JraW5nIGNvcnJlY3RseS4nKTtcbiAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIH07XG5cbiAgdmFyIGFycmF5QnVmZmVyVG9CYXNlNjQgPSBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcikge1xuICAgIHZhciBiaW5hcnkgPSAnJztcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfXJldHVybiB3aW5kb3cuYnRvYShiaW5hcnkpO1xuICB9O1xuXG4gIHZhciBnZXREaW1lbnNpb24gPSBmdW5jdGlvbiBnZXREaW1lbnNpb24oZWwsIGNsb25lLCBkaW0pIHtcbiAgICB2YXIgdiA9IGVsLnZpZXdCb3ggJiYgZWwudmlld0JveC5iYXNlVmFsICYmIGVsLnZpZXdCb3guYmFzZVZhbFtkaW1dIHx8IGNsb25lLmdldEF0dHJpYnV0ZShkaW0pICE9PSBudWxsICYmICFjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKS5tYXRjaCgvJSQvKSAmJiBwYXJzZUludChjbG9uZS5nZXRBdHRyaWJ1dGUoZGltKSkgfHwgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltXSB8fCBwYXJzZUludChjbG9uZS5zdHlsZVtkaW1dKSB8fCBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShkaW0pKTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnIHx8IHYgPT09IG51bGwgfHwgaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyAwIDogdjtcbiAgfTtcblxuICB2YXIgZ2V0RGltZW5zaW9ucyA9IGZ1bmN0aW9uIGdldERpbWVuc2lvbnMoZWwsIGNsb25lLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKGVsLnRhZ05hbWUgPT09ICdzdmcnKSByZXR1cm4ge1xuICAgICAgd2lkdGg6IHdpZHRoIHx8IGdldERpbWVuc2lvbihlbCwgY2xvbmUsICd3aWR0aCcpLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgfHwgZ2V0RGltZW5zaW9uKGVsLCBjbG9uZSwgJ2hlaWdodCcpXG4gICAgfTtlbHNlIGlmIChlbC5nZXRCQm94KSB7XG4gICAgICB2YXIgX2VsJGdldEJCb3ggPSBlbC5nZXRCQm94KCksXG4gICAgICAgICAgeCA9IF9lbCRnZXRCQm94LngsXG4gICAgICAgICAgeSA9IF9lbCRnZXRCQm94LnksXG4gICAgICAgICAgX3dpZHRoID0gX2VsJGdldEJCb3gud2lkdGgsXG4gICAgICAgICAgX2hlaWdodCA9IF9lbCRnZXRCQm94LmhlaWdodDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IHggKyBfd2lkdGgsXG4gICAgICAgIGhlaWdodDogeSArIF9oZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHZhciByZUVuY29kZSA9IGZ1bmN0aW9uIHJlRW5jb2RlKGRhdGEpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZVVSSUNvbXBvbmVudChkYXRhKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHAxKSB7XG4gICAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHAxKTtcbiAgICAgIHJldHVybiBjID09PSAnJScgPyAnJTI1JyA6IGM7XG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciB1cmlUb0Jsb2IgPSBmdW5jdGlvbiB1cmlUb0Jsb2IodXJpKSB7XG4gICAgdmFyIGJ5dGVTdHJpbmcgPSB3aW5kb3cuYXRvYih1cmkuc3BsaXQoJywnKVsxXSk7XG4gICAgdmFyIG1pbWVTdHJpbmcgPSB1cmkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gICAgdmFyIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogbWltZVN0cmluZyB9KTtcbiAgfTtcblxuICB2YXIgcXVlcnkgPSBmdW5jdGlvbiBxdWVyeShlbCwgc2VsZWN0b3IpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSB8fCBlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgQ1NTIHNlbGVjdG9yIFwiJyArIHNlbGVjdG9yICsgJ1wiJywgZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRldGVjdENzc0ZvbnQgPSBmdW5jdGlvbiBkZXRlY3RDc3NGb250KHJ1bGUsIGhyZWYpIHtcbiAgICAvLyBNYXRjaCBDU1MgZm9udC1mYWNlIHJ1bGVzIHRvIGV4dGVybmFsIGxpbmtzLlxuICAgIC8vIEBmb250LWZhY2Uge1xuICAgIC8vICAgc3JjOiBsb2NhbCgnQWJlbCcpLCB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2FiZWwvdjYvVXpOLWllalIxVm9YVTJPYy03THNidmVzWlcyeE9RLXhzTnFPNDdtNTVEQS53b2ZmMik7XG4gICAgLy8gfVxuICAgIHZhciBtYXRjaCA9IHJ1bGUuY3NzVGV4dC5tYXRjaCh1cmxSZWdleCk7XG4gICAgdmFyIHVybCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgIGlmICghdXJsIHx8IHVybC5tYXRjaCgvXmRhdGE6LykgfHwgdXJsID09PSAnYWJvdXQ6YmxhbmsnKSByZXR1cm47XG4gICAgdmFyIGZ1bGxVcmwgPSB1cmwuc3RhcnRzV2l0aCgnLi4vJykgPyBocmVmICsgJy8uLi8nICsgdXJsIDogdXJsLnN0YXJ0c1dpdGgoJy4vJykgPyBocmVmICsgJy8uJyArIHVybCA6IHVybDtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcnVsZS5jc3NUZXh0LFxuICAgICAgZm9ybWF0OiBnZXRGb250TWltZVR5cGVGcm9tVXJsKGZ1bGxVcmwpLFxuICAgICAgdXJsOiBmdWxsVXJsXG4gICAgfTtcbiAgfTtcblxuICB2YXIgaW5saW5lSW1hZ2VzID0gZnVuY3Rpb24gaW5saW5lSW1hZ2VzKGVsKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbCgnaW1hZ2UnKSkubWFwKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgdmFyIGhyZWYgPSBpbWFnZS5nZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsICdocmVmJykgfHwgaW1hZ2UuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICBpZiAoIWhyZWYpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICBpZiAoaXNFeHRlcm5hbChocmVmKSkge1xuICAgICAgICBocmVmICs9IChocmVmLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ3Q9JyArIG5ldyBEYXRlKCkudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICBpbWcuc3JjID0gaHJlZjtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkICcgKyBocmVmKSk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ2hyZWYnLCBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkRm9udHMgPSB7fTtcbiAgdmFyIGlubGluZUZvbnRzID0gZnVuY3Rpb24gaW5saW5lRm9udHMoZm9udHMpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZm9udHMubWFwKGZ1bmN0aW9uIChmb250KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoY2FjaGVkRm9udHNbZm9udC51cmxdKSByZXR1cm4gcmVzb2x2ZShjYWNoZWRGb250c1tmb250LnVybF0pO1xuXG4gICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gVE9ETzogaXQgbWF5IGFsc28gYmUgd29ydGggaXQgdG8gd2FpdCB1bnRpbCBmb250cyBhcmUgZnVsbHkgbG9hZGVkIGJlZm9yZVxuICAgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gcmFzdGVyaXplIHRoZW0uIChlLmcuIHVzZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRm9udEZhY2VTZXQpXG4gICAgICAgICAgdmFyIGZvbnRJbkJhc2U2NCA9IGFycmF5QnVmZmVyVG9CYXNlNjQocmVxLnJlc3BvbnNlKTtcbiAgICAgICAgICB2YXIgZm9udFVyaSA9IGZvbnQudGV4dC5yZXBsYWNlKHVybFJlZ2V4LCAndXJsKFwiZGF0YTonICsgZm9udC5mb3JtYXQgKyAnO2Jhc2U2NCwnICsgZm9udEluQmFzZTY0ICsgJ1wiKScpICsgJ1xcbic7XG4gICAgICAgICAgY2FjaGVkRm9udHNbZm9udC51cmxdID0gZm9udFVyaTtcbiAgICAgICAgICByZXNvbHZlKGZvbnRVcmkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIGZvbnQgZnJvbTogJyArIGZvbnQudXJsLCBlKTtcbiAgICAgICAgICBjYWNoZWRGb250c1tmb250LnVybF0gPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQWJvcnRlZCBsb2FkaW5nIGZvbnQgZnJvbTogJyArIGZvbnQudXJsLCBlKTtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIGZvbnQudXJsKTtcbiAgICAgICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIHJlcS5zZW5kKCk7XG4gICAgICB9KTtcbiAgICB9KSkudGhlbihmdW5jdGlvbiAoZm9udENzcykge1xuICAgICAgcmV0dXJuIGZvbnRDc3MuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSkuam9pbignJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNhY2hlZFJ1bGVzID0gbnVsbDtcbiAgdmFyIHN0eWxlU2hlZXRSdWxlcyA9IGZ1bmN0aW9uIHN0eWxlU2hlZXRSdWxlcygpIHtcbiAgICBpZiAoY2FjaGVkUnVsZXMpIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICByZXR1cm4gY2FjaGVkUnVsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnN0eWxlU2hlZXRzKS5tYXAoZnVuY3Rpb24gKHNoZWV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBydWxlczogc2hlZXQuY3NzUnVsZXMsIGhyZWY6IHNoZWV0LmhyZWYgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTdHlsZXNoZWV0IGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICcgKyBzaGVldC5ocmVmLCBlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBpbmxpbmVDc3MgPSBmdW5jdGlvbiBpbmxpbmVDc3MoZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIHNlbGVjdG9yUmVtYXAgPSBfcmVmLnNlbGVjdG9yUmVtYXAsXG4gICAgICAgIG1vZGlmeVN0eWxlID0gX3JlZi5tb2RpZnlTdHlsZSxcbiAgICAgICAgbW9kaWZ5Q3NzID0gX3JlZi5tb2RpZnlDc3MsXG4gICAgICAgIGZvbnRzID0gX3JlZi5mb250cyxcbiAgICAgICAgZXhjbHVkZVVudXNlZENzcyA9IF9yZWYuZXhjbHVkZVVudXNlZENzcztcblxuICAgIHZhciBnZW5lcmF0ZUNzcyA9IG1vZGlmeUNzcyB8fCBmdW5jdGlvbiAoc2VsZWN0b3IsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciBzZWwgPSBzZWxlY3RvclJlbWFwID8gc2VsZWN0b3JSZW1hcChzZWxlY3RvcikgOiBzZWxlY3RvcjtcbiAgICAgIHZhciBwcm9wcyA9IG1vZGlmeVN0eWxlID8gbW9kaWZ5U3R5bGUocHJvcGVydGllcykgOiBwcm9wZXJ0aWVzO1xuICAgICAgcmV0dXJuIHNlbCArICd7JyArIHByb3BzICsgJ31cXG4nO1xuICAgIH07XG4gICAgdmFyIGNzcyA9IFtdO1xuICAgIHZhciBkZXRlY3RGb250cyA9IHR5cGVvZiBmb250cyA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIGZvbnRMaXN0ID0gZm9udHMgfHwgW107XG4gICAgc3R5bGVTaGVldFJ1bGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBydWxlcyA9IF9yZWYyLnJ1bGVzLFxuICAgICAgICAgIGhyZWYgPSBfcmVmMi5ocmVmO1xuXG4gICAgICBpZiAoIXJ1bGVzKSByZXR1cm47XG4gICAgICBBcnJheS5mcm9tKHJ1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS5zdHlsZSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChxdWVyeShlbCwgcnVsZS5zZWxlY3RvclRleHQpKSBjc3MucHVzaChnZW5lcmF0ZUNzcyhydWxlLnNlbGVjdG9yVGV4dCwgcnVsZS5zdHlsZS5jc3NUZXh0KSk7ZWxzZSBpZiAoZGV0ZWN0Rm9udHMgJiYgcnVsZS5jc3NUZXh0Lm1hdGNoKC9eQGZvbnQtZmFjZS8pKSB7XG4gICAgICAgICAgICB2YXIgZm9udCA9IGRldGVjdENzc0ZvbnQocnVsZSwgaHJlZik7XG4gICAgICAgICAgICBpZiAoZm9udCkgZm9udExpc3QucHVzaChmb250KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFleGNsdWRlVW51c2VkQ3NzKSB7XG4gICAgICAgICAgICBjc3MucHVzaChydWxlLmNzc1RleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5saW5lRm9udHMoZm9udExpc3QpLnRoZW4oZnVuY3Rpb24gKGZvbnRDc3MpIHtcbiAgICAgIHJldHVybiBjc3Muam9pbignXFxuJykgKyBmb250Q3NzO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBkb3dubG9hZE9wdGlvbnMgPSBmdW5jdGlvbiBkb3dubG9hZE9wdGlvbnMoKSB7XG4gICAgaWYgKCFuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYiAmJiAhKCdkb3dubG9hZCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKSkge1xuICAgICAgcmV0dXJuIHsgcG9wdXA6IHdpbmRvdy5vcGVuKCkgfTtcbiAgICB9XG4gIH07XG5cbiAgb3V0JC5wcmVwYXJlU3ZnID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zLCBkb25lKSB7XG4gICAgcmVxdWlyZURvbU5vZGUoZWwpO1xuXG4gICAgdmFyIF9yZWYzID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgICAgX3JlZjMkbGVmdCA9IF9yZWYzLmxlZnQsXG4gICAgICAgIGxlZnQgPSBfcmVmMyRsZWZ0ID09PSB1bmRlZmluZWQgPyAwIDogX3JlZjMkbGVmdCxcbiAgICAgICAgX3JlZjMkdG9wID0gX3JlZjMudG9wLFxuICAgICAgICB0b3AgPSBfcmVmMyR0b3AgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmMyR0b3AsXG4gICAgICAgIHcgPSBfcmVmMy53aWR0aCxcbiAgICAgICAgaCA9IF9yZWYzLmhlaWdodCxcbiAgICAgICAgX3JlZjMkc2NhbGUgPSBfcmVmMy5zY2FsZSxcbiAgICAgICAgc2NhbGUgPSBfcmVmMyRzY2FsZSA9PT0gdW5kZWZpbmVkID8gMSA6IF9yZWYzJHNjYWxlLFxuICAgICAgICBfcmVmMyRyZXNwb25zaXZlID0gX3JlZjMucmVzcG9uc2l2ZSxcbiAgICAgICAgcmVzcG9uc2l2ZSA9IF9yZWYzJHJlc3BvbnNpdmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjMkcmVzcG9uc2l2ZSxcbiAgICAgICAgX3JlZjMkZXhjbHVkZUNzcyA9IF9yZWYzLmV4Y2x1ZGVDc3MsXG4gICAgICAgIGV4Y2x1ZGVDc3MgPSBfcmVmMyRleGNsdWRlQ3NzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYzJGV4Y2x1ZGVDc3M7XG5cbiAgICByZXR1cm4gaW5saW5lSW1hZ2VzKGVsKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGNsb25lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IChvcHRpb25zIHx8IHt9KS5iYWNrZ3JvdW5kQ29sb3IgfHwgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgICB2YXIgX2dldERpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKGVsLCBjbG9uZSwgdywgaCksXG4gICAgICAgICAgd2lkdGggPSBfZ2V0RGltZW5zaW9ucy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfZ2V0RGltZW5zaW9ucy5oZWlnaHQ7XG5cbiAgICAgIGlmIChlbC50YWdOYW1lICE9PSAnc3ZnJykge1xuICAgICAgICBpZiAoZWwuZ2V0QkJveCkge1xuICAgICAgICAgIGlmIChjbG9uZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgY2xvbmUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKC90cmFuc2xhdGVcXCguKj9cXCkvLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICAgIGNsb25lID0gc3ZnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byByZW5kZXIgbm9uLVNWRyBlbGVtZW50JywgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ZlcnNpb24nLCAnMS4xJyk7XG4gICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XS5qb2luKCcgJykpO1xuICAgICAgaWYgKCFjbG9uZS5nZXRBdHRyaWJ1dGUoJ3htbG5zJykpIGNsb25lLnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnMnLCBzdmdOcyk7XG4gICAgICBpZiAoIWNsb25lLmdldEF0dHJpYnV0ZSgneG1sbnM6eGxpbmsnKSkgY2xvbmUuc2V0QXR0cmlidXRlTlMoeG1sTnMsICd4bWxuczp4bGluaycsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyk7XG5cbiAgICAgIGlmIChyZXNwb25zaXZlKSB7XG4gICAgICAgIGNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICAgICAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaW5ZTWluIG1lZXQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aCAqIHNjYWxlKTtcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQgKiBzY2FsZSk7XG4gICAgICB9XG5cbiAgICAgIEFycmF5LmZyb20oY2xvbmUucXVlcnlTZWxlY3RvckFsbCgnZm9yZWlnbk9iamVjdCA+IConKSkuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbk9iamVjdCkge1xuICAgICAgICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZU5TKHhtbE5zLCAneG1sbnMnLCBmb3JlaWduT2JqZWN0LnRhZ05hbWUgPT09ICdzdmcnID8gc3ZnTnMgOiB4aHRtbE5zKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXhjbHVkZUNzcykge1xuICAgICAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgICAgICB2YXIgc3JjID0gb3V0ZXIuaW5uZXJIVE1MO1xuICAgICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUoc3JjLCB3aWR0aCwgaGVpZ2h0KTtlbHNlIHJldHVybiB7IHNyYzogc3JjLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5saW5lQ3NzKGVsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9ICc8IVtDREFUQVtcXG4nICsgY3NzICsgJ1xcbl1dPic7XG5cbiAgICAgICAgICB2YXIgZGVmcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RlZnMnKTtcbiAgICAgICAgICBkZWZzLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgICBjbG9uZS5pbnNlcnRCZWZvcmUoZGVmcywgY2xvbmUuZmlyc3RDaGlsZCk7XG5cbiAgICAgICAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgICAgICAgdmFyIHNyYyA9IG91dGVyLmlubmVySFRNTC5yZXBsYWNlKC9OU1xcZCs6aHJlZi9naSwgJ3htbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHhsaW5rOmhyZWYnKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJykgZG9uZShzcmMsIHdpZHRoLCBoZWlnaHQpO2Vsc2UgcmV0dXJuIHsgc3JjOiBzcmMsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zdmdBc0RhdGFVcmkgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMsIGRvbmUpIHtcbiAgICByZXF1aXJlRG9tTm9kZShlbCk7XG4gICAgcmV0dXJuIG91dCQucHJlcGFyZVN2ZyhlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgIHZhciBzcmMgPSBfcmVmNC5zcmMsXG4gICAgICAgICAgd2lkdGggPSBfcmVmNC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmNC5oZWlnaHQ7XG5cbiAgICAgIHZhciBzdmdYbWwgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EocmVFbmNvZGUoZG9jdHlwZSArIHNyYykpO1xuICAgICAgaWYgKHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRvbmUoc3ZnWG1sLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdmdYbWw7XG4gICAgfSk7XG4gIH07XG5cbiAgb3V0JC5zdmdBc1BuZ1VyaSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucywgZG9uZSkge1xuICAgIHJlcXVpcmVEb21Ob2RlKGVsKTtcblxuICAgIHZhciBfcmVmNSA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgIF9yZWY1JGVuY29kZXJUeXBlID0gX3JlZjUuZW5jb2RlclR5cGUsXG4gICAgICAgIGVuY29kZXJUeXBlID0gX3JlZjUkZW5jb2RlclR5cGUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZS9wbmcnIDogX3JlZjUkZW5jb2RlclR5cGUsXG4gICAgICAgIF9yZWY1JGVuY29kZXJPcHRpb25zID0gX3JlZjUuZW5jb2Rlck9wdGlvbnMsXG4gICAgICAgIGVuY29kZXJPcHRpb25zID0gX3JlZjUkZW5jb2Rlck9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IDAuOCA6IF9yZWY1JGVuY29kZXJPcHRpb25zLFxuICAgICAgICBjYW52ZyA9IF9yZWY1LmNhbnZnO1xuXG4gICAgdmFyIGNvbnZlcnRUb1BuZyA9IGZ1bmN0aW9uIGNvbnZlcnRUb1BuZyhfcmVmNikge1xuICAgICAgdmFyIHNyYyA9IF9yZWY2LnNyYyxcbiAgICAgICAgICB3aWR0aCA9IF9yZWY2LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWY2LmhlaWdodDtcblxuICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIHZhciBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG4gICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBjYW52YXMud2lkdGggKyAncHgnO1xuICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGNhbnZhcy5oZWlnaHQgKyAncHgnO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0ocGl4ZWxSYXRpbywgMCwgMCwgcGl4ZWxSYXRpbywgMCwgMCk7XG5cbiAgICAgIGlmIChjYW52ZykgY2FudmcoY2FudmFzLCBzcmMpO2Vsc2UgY29udGV4dC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcblxuICAgICAgdmFyIHBuZyA9IHZvaWQgMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBuZyA9IGNhbnZhcy50b0RhdGFVUkwoZW5jb2RlclR5cGUsIGVuY29kZXJPcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBTZWN1cml0eUVycm9yICE9PSAndW5kZWZpbmVkJyAmJiBlIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvciB8fCBlLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmVkIFNWRyBpbWFnZXMgY2Fubm90IGJlIGRvd25sb2FkZWQgaW4gdGhpcyBicm93c2VyLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIGRvbmUocG5nLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwbmcpO1xuICAgIH07XG5cbiAgICBpZiAoY2FudmcpIHJldHVybiBvdXQkLnByZXBhcmVTdmcoZWwsIG9wdGlvbnMpLnRoZW4oY29udmVydFRvUG5nKTtlbHNlIHJldHVybiBvdXQkLnN2Z0FzRGF0YVVyaShlbCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAodXJpKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvbnZlcnRUb1BuZyh7XG4gICAgICAgICAgICBzcmM6IGltYWdlLFxuICAgICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZS5oZWlnaHRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVqZWN0KCdUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgZGF0YSBVUkkgYXMgYW4gaW1hZ2Ugb24gdGhlIGZvbGxvd2luZyBTVkdcXG4nICsgd2luZG93LmF0b2IodXJpLnNsaWNlKDI2KSkgKyAnT3BlbiB0aGUgZm9sbG93aW5nIGxpbmsgdG8gc2VlIGJyb3dzZXJcXCdzIGRpYWdub3Npc1xcbicgKyB1cmkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWFnZS5zcmMgPSB1cmk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBvdXQkLmRvd25sb2FkID0gZnVuY3Rpb24gKG5hbWUsIHVyaSwgb3B0aW9ucykge1xuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IodXJpVG9CbG9iKHVyaSksIG5hbWUpO2Vsc2Uge1xuICAgICAgdmFyIHNhdmVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgaWYgKCdkb3dubG9hZCcgaW4gc2F2ZUxpbmspIHtcbiAgICAgICAgc2F2ZUxpbmsuZG93bmxvYWQgPSBuYW1lO1xuICAgICAgICBzYXZlTGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhdmVMaW5rKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgYmxvYiA9IHVyaVRvQmxvYih1cmkpO1xuICAgICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgIHNhdmVMaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgICAgc2F2ZUxpbmsub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciB3aGlsZSBnZXR0aW5nIG9iamVjdCBVUkwuIEZhbGxpbmcgYmFjayB0byBzdHJpbmcgVVJMLicpO1xuICAgICAgICAgIHNhdmVMaW5rLmhyZWYgPSB1cmk7XG4gICAgICAgIH1cbiAgICAgICAgc2F2ZUxpbmsuY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzYXZlTGluayk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wb3B1cCkge1xuICAgICAgICBvcHRpb25zLnBvcHVwLmRvY3VtZW50LnRpdGxlID0gbmFtZTtcbiAgICAgICAgb3B0aW9ucy5wb3B1cC5sb2NhdGlvbi5yZXBsYWNlKHVyaSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG91dCQuc2F2ZVN2ZyA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBkb3dubG9hZE9wdHMgPSBkb3dubG9hZE9wdGlvbnMoKTsgLy8gZG9uJ3QgaW5saW5lLCBjYW4ndCBiZSBhc3luY1xuICAgIHJldHVybiByZXF1aXJlRG9tTm9kZVByb21pc2UoZWwpLnRoZW4oZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gb3V0JC5zdmdBc0RhdGFVcmkoZWwsIG9wdGlvbnMgfHwge30pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVyaSkge1xuICAgICAgcmV0dXJuIG91dCQuZG93bmxvYWQobmFtZSwgdXJpLCBkb3dubG9hZE9wdHMpO1xuICAgIH0pO1xuICB9O1xuXG4gIG91dCQuc2F2ZVN2Z0FzUG5nID0gZnVuY3Rpb24gKGVsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIGRvd25sb2FkT3B0cyA9IGRvd25sb2FkT3B0aW9ucygpOyAvLyBkb24ndCBpbmxpbmUsIGNhbid0IGJlIGFzeW5jXG4gICAgcmV0dXJuIHJlcXVpcmVEb21Ob2RlUHJvbWlzZShlbCkudGhlbihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBvdXQkLnN2Z0FzUG5nVXJpKGVsLCBvcHRpb25zIHx8IHt9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgIHJldHVybiBvdXQkLmRvd25sb2FkKG5hbWUsIHVyaSwgZG93bmxvYWRPcHRzKTtcbiAgICB9KTtcbiAgfTtcbn0pKCk7IiwiZXhwb3J0IGNvbnN0IElDRFMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImV4cG9ydCBjb25zdCBJRFBTID0gYERJU1BMQVlcbk5PIERBVEFcbmA7XG4iLCJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IE1PRElGSUNBVElPTlMgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL21hcCc7XG5leHBvcnQgZnVuY3Rpb24gc2FsdE1hc3Moc2FsdE5hbWVzLCBtb2xXZWlnaHRDb2wsIGVxdWl2YWxlbnRzQ29sLCBpLCBzYWx0Q29sKSB7XG4gICAgY29uc3Qgc2FsdFJvd0luZGV4ID0gc2FsdE5hbWVzLmluZGV4T2Yoc2FsdENvbC5nZXQoaSkpO1xuICAgIHJldHVybiAoc2FsdFJvd0luZGV4ID09IC0xIHx8IG1vbFdlaWdodENvbC5nZXQoc2FsdFJvd0luZGV4KSA9PSBERy5GTE9BVF9OVUxMIHx8IGVxdWl2YWxlbnRzQ29sLmdldChpKSA9PSBERy5JTlRfTlVMTCkgP1xuICAgICAgICBERy5GTE9BVF9OVUxMIDpcbiAgICAgICAgbW9sV2VpZ2h0Q29sLmdldChzYWx0Um93SW5kZXgpICogZXF1aXZhbGVudHNDb2wuZ2V0KGkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhbHRNb2xXZWlndGgoc2FsdE5hbWVzTGlzdCwgc2FsdENvbCwgbW9sV2VpZ2h0Q29sLCBpKSB7XG4gICAgY29uc3Qgc2FsdFJvd0luZGV4ID0gc2FsdE5hbWVzTGlzdC5pbmRleE9mKHNhbHRDb2wuZ2V0KGkpKTtcbiAgICByZXR1cm4gKHNhbHRSb3dJbmRleCA9PSAtMSkgPyBERy5GTE9BVF9OVUxMIDogbW9sV2VpZ2h0Q29sLmdldChzYWx0Um93SW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTW9sV2VpZ2h0KGNvbXBvdW5kTW9sV2VpZ2h0Q29sLCBzYWx0TWFzc0NvbCwgaSkge1xuICAgIHJldHVybiAoY29tcG91bmRNb2xXZWlnaHRDb2wuZ2V0U3RyaW5nKGkpID09ICcnIHx8IHNhbHRNYXNzQ29sLmdldFN0cmluZyhpKSA9PSAnJykgP1xuICAgICAgICBERy5GTE9BVF9OVUxMIDpcbiAgICAgICAgY29tcG91bmRNb2xXZWlnaHRDb2wuZ2V0KGkpICsgc2FsdE1hc3NDb2wuZ2V0KGkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1vbGVjdWxhcldlaWdodChzZXF1ZW5jZSwgd2VpZ2h0c09iaikge1xuICAgIGNvbnN0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMod2VpZ2h0c09iaikpLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSk7XG4gICAgbGV0IHdlaWdodCA9IDA7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgd2VpZ2h0ICs9IHdlaWdodHNPYmpbc2VxdWVuY2Uuc2xpY2UoaSwgaSArIG1hdGNoZWRDb2RlLmxlbmd0aCldO1xuICAgICAgICBpICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodCAtIDYxLjk3O1xufVxuIiwiZXhwb3J0IGNvbnN0IFNFUVVFTkNFX1RZUEVTID0ge1xuICAgIFNFTlNFX1NUUkFORDogJ1NTJyxcbiAgICBBTlRJU0VOU0VfU1RSQU5EOiAnQVMnLFxuICAgIERVUExFWDogJ0R1cGxleCcsXG4gICAgVFJJUExFWDogJ1RyaXBsZXgnLFxuICAgIERJTUVSOiAnRGltZXInLFxufTtcbmV4cG9ydCBjb25zdCBDT0xfTkFNRVMgPSB7XG4gICAgQ0hFTUlTVFJZOiAnQ2hlbWlzdHJ5JyxcbiAgICBOVU1CRVI6ICdOdW1iZXInLFxuICAgIFRZUEU6ICdUeXBlJyxcbiAgICBDSEVNSVNUUllfTkFNRTogJ0NoZW1pc3RyeSBOYW1lJyxcbiAgICBJTlRFUk5BTF9DT01QT1VORF9JRDogJ0ludGVybmFsIGNvbXBvdW5kIElEJyxcbiAgICBJRFA6ICdJRFAnLFxuICAgIFNFUVVFTkNFOiAnU2VxdWVuY2UnLFxuICAgIENPTVBPVU5EX05BTUU6ICdDb21wb3VuZCBOYW1lJyxcbiAgICBDT01QT1VORF9DT01NRU5UUzogJ0NvbXBvdW5kIENvbW1lbnRzJyxcbiAgICBTQUxUOiAnU2FsdCcsXG4gICAgRVFVSVZBTEVOVFM6ICdFcXVpdmFsZW50cycsXG4gICAgUFVSSVRZOiAnUHVyaXR5JyxcbiAgICBDT01QT1VORF9NT0xfV0VJR0hUOiAnQ3BkIE1XJyxcbiAgICBTQUxUX01PTF9XRUlHSFQ6ICdTYWx0IE1XJyxcbiAgICBTQUxUX01BU1M6ICdTYWx0IG1hc3MnLFxuICAgIEJBVENIX01PTF9XRUlHSFQ6ICdCYXRjaCBNVycsXG4gICAgU09VUkNFOiAnU291cmNlJyxcbiAgICBJQ0Q6ICdJQ0QnLFxuICAgIE9XTkVSOiAnT3duZXInLFxufTtcbmV4cG9ydCBjb25zdCBHRU5FUkFURURfQ09MX05BTUVTID0gW1xuICAgIENPTF9OQU1FUy5DT01QT1VORF9OQU1FLFxuICAgIENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUyxcbiAgICBDT0xfTkFNRVMuQ09NUE9VTkRfTU9MX1dFSUdIVCxcbiAgICBDT0xfTkFNRVMuU0FMVF9NQVNTLFxuICAgIENPTF9OQU1FUy5CQVRDSF9NT0xfV0VJR0hULFxuXTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IHNpUm5hQmlvU3ByaW5nVG9HY3JzLCBzaVJuYUF4b2xhYnNUb0djcnMsIGdjcnNUb051Y2xlb3RpZGVzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzLCBnY3JzVG9NZXJtYWRlMTIsIHNpUm5hTnVjbGVvdGlkZXNUb0djcnMgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2NvbnZlcnRlcnMnO1xuaW1wb3J0IHsgd2VpZ2h0c09iaiwgU1lOVEhFU0laRVJTIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9tYXAnO1xuaW1wb3J0IHsgU0VRVUVOQ0VfVFlQRVMsIENPTF9OQU1FUywgR0VORVJBVEVEX0NPTF9OQU1FUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IHNhbHRNYXNzLCBzYWx0TW9sV2VpZ3RoLCBtb2xlY3VsYXJXZWlnaHQsIGJhdGNoTW9sV2VpZ2h0IH0gZnJvbSAnLi9jYWxjdWxhdGlvbnMnO1xuaW1wb3J0IHsgaXNWYWxpZFNlcXVlbmNlIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0IHsgbGlua1N0cmFuZHNWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5pbXBvcnQgeyBzdHJpbmdpZnksIGRvd25sb2FkLCByZW1vdmVFbXB0eVJvd3MsIGRpZmZlcmVuY2VPZlR3b0FycmF5cyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgU0FMVFNfQ1NWIH0gZnJvbSAnLi9zYWx0cyc7XG5pbXBvcnQgeyBVU0VSU19DU1YgfSBmcm9tICcuL3VzZXJzJztcbmltcG9ydCB7IElDRFMgfSBmcm9tICcuL0lDRHMnO1xuaW1wb3J0IHsgU09VUkNFUyB9IGZyb20gJy4vc291cmNlcyc7XG5pbXBvcnQgeyBJRFBTIH0gZnJvbSAnLi9JRFBzJztcbmZ1bmN0aW9uIHBhcnNlU3RyYW5kc0Zyb21EdXBsZXhDZWxsKHMpIHtcbiAgICBjb25zdCBhcnIgPSBzLnNsaWNlKDMpLnNwbGl0KCdcXHJcXG5BUyAnKTtcbiAgICByZXR1cm4geyBTUzogYXJyWzBdLCBBUzogYXJyWzFdIH07XG59XG5mdW5jdGlvbiBwYXJzZVN0cmFuZHNGcm9tVHJpcGxleE9yRGltZXJDZWxsKHMpIHtcbiAgICBjb25zdCBhcnIxID0gcy5zbGljZSgzKS5zcGxpdCgnXFxyXFxuQVMxICcpO1xuICAgIGNvbnN0IGFycjIgPSBhcnIxWzFdLnNwbGl0KCdcXHJcXG5BUzIgJyk7XG4gICAgcmV0dXJuIHsgU1M6IGFycjFbMF0sIEFTMTogYXJyMlswXSwgQVMyOiBhcnIyWzFdIH07XG59XG5mdW5jdGlvbiBzYXZlVGFibGVBc1NkRmlsZSh0YWJsZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmIChHRU5FUkFURURfQ09MX05BTUVTLnNvbWUoKGNvbE5hbWUpID0+ICF0YWJsZS5jb2x1bW5zLmNvbnRhaW5zKGNvbE5hbWUpKSkge1xuICAgICAgICAgICAgY29uc3QgYWJzZW50Q29sTmFtZXMgPSBkaWZmZXJlbmNlT2ZUd29BcnJheXMoR0VORVJBVEVEX0NPTF9OQU1FUywgdGFibGUuY29sdW1ucy5uYW1lcygpKS5qb2luKGAnLCAnYCk7XG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoYEZpbGUgc2F2ZWQgd2l0aG91dCBjb2x1bW5zICcke2Fic2VudENvbE5hbWVzfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXF1ZW5jZUNvbCA9IHRhYmxlLmdldENvbChDT0xfTkFNRVMuU0VRVUVOQ0UpO1xuICAgICAgICBjb25zdCB0eXBlQ29sID0gdGFibGUuZ2V0Q29sKENPTF9OQU1FUy5UWVBFKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IFNZTlRIRVNJWkVSUy5HQ1JTOyAvL2dldEZvcm1hdChzZXF1ZW5jZUNvbC5nZXQoaSkpITtcbiAgICAgICAgICAgIGlmICh0eXBlQ29sLmdldChpKSA9PSBTRVFVRU5DRV9UWVBFUy5TRU5TRV9TVFJBTkQpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGAke3NlcXVlbmNlVG9Nb2xWMzAwMChzZXF1ZW5jZUNvbC5nZXQoaSksIGZhbHNlLCB0cnVlLCBmb3JtYXQpfVxcbj4gPFNlcXVlbmNlPlxcblNlbnNlIFN0cmFuZFxcblxcbmA7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlQ29sLmdldChpKSA9PSBTRVFVRU5DRV9UWVBFUy5BTlRJU0VOU0VfU1RSQU5EKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJHtzZXF1ZW5jZVRvTW9sVjMwMDAoc2VxdWVuY2VDb2wuZ2V0KGkpLCB0cnVlLCB0cnVlLCBmb3JtYXQpfVxcbj4gPFNlcXVlbmNlPlxcbkFudGkgU2Vuc2VcXG5cXG5gO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbC5nZXQoaSkgPT0gU0VRVUVOQ0VfVFlQRVMuRFVQTEVYKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VTdHJhbmRzRnJvbUR1cGxleENlbGwoc2VxdWVuY2VDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcyA9IGAke3NlcXVlbmNlVG9Nb2xWMzAwMChvYmouQVMsIHRydWUsIHRydWUsIGZvcm1hdCl9XFxuPiA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbmA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3MgPSBgJHtzZXF1ZW5jZVRvTW9sVjMwMDAob2JqLlNTLCBmYWxzZSwgdHJ1ZSwgZm9ybWF0KX1cXG4+IDxTZXF1ZW5jZT5cXG5TZW5zZSBTdHJhbmRcXG5cXG5gO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJHtsaW5rU3RyYW5kc1YzMDAwKHsgc2Vuc2VTdHJhbmRzOiBbc3NdLCBhbnRpU3RyYW5kczogW2FzXSB9LCB0cnVlKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoW1NFUVVFTkNFX1RZUEVTLlRSSVBMRVgsIFNFUVVFTkNFX1RZUEVTLkRJTUVSXS5pbmNsdWRlcyh0eXBlQ29sLmdldChpKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBwYXJzZVN0cmFuZHNGcm9tVHJpcGxleE9yRGltZXJDZWxsKHNlcXVlbmNlQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXMxID0gYCR7c2VxdWVuY2VUb01vbFYzMDAwKG9iai5BUzEsIHRydWUsIHRydWUsIGZvcm1hdCl9XFxuPiA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbmA7XG4gICAgICAgICAgICAgICAgY29uc3QgYXMyID0gYCR7c2VxdWVuY2VUb01vbFYzMDAwKG9iai5BUzIsIHRydWUsIHRydWUsIGZvcm1hdCl9XFxuPiA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcblxcbmA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3MgPSBgJHtzZXF1ZW5jZVRvTW9sVjMwMDAob2JqLlNTLCBmYWxzZSwgdHJ1ZSwgZm9ybWF0KX1cXG4+IDxTZXF1ZW5jZT5cXG5TZW5zZSBTdHJhbmRcXG5cXG5gO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJHtsaW5rU3RyYW5kc1YzMDAwKHsgc2Vuc2VTdHJhbmRzOiBbc3NdLCBhbnRpU3RyYW5kczogW2FzMSwgYXMyXSB9LCB0cnVlKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGFibGUuY29sdW1ucykge1xuICAgICAgICAgICAgICAgIGlmIChjb2wubmFtZSAhPSBDT0xfTkFNRVMuU0VRVUVOQ0UpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgPiA8JHtjb2wubmFtZX0+XFxuJHtjb2wuZ2V0KGkpfVxcblxcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gJyQkJCRcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGRvd25sb2FkKGAke3RhYmxlLm5hbWV9LnNkZmAsIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbigpIHtcbiAgICBncm9rLmV2ZW50cy5vblZpZXdBZGRlZC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgaWYgKHYudHlwZSA9PSBERy5WSUVXX1RZUEUuVEFCTEVfVklFVykge1xuICAgICAgICAgICAgaWYgKHYuZGF0YUZyYW1lLmNvbHVtbnMuY29udGFpbnMoQ09MX05BTUVTLlRZUEUpKVxuICAgICAgICAgICAgICAgIG9saWdvU2RGaWxlKHYuZGF0YUZyYW1lKTtcbiAgICAgICAgICAgIC8vIFNob3VsZCBiZSByZW1vdmVkIGFmdGVyIGZpeGluZyBidWcgaHR0cHM6Ly9naXRodWIuY29tL2RhdGFncm9rLWFpL3B1YmxpYy9pc3N1ZXMvODA4XG4gICAgICAgICAgICBncm9rLmV2ZW50cy5vbkNvbnRleHRNZW51LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcUNvbCA9IGFyZ3MuYXJncy5jb250ZXh0LnRhYmxlLmN1cnJlbnRDb2w7IC8vIC9eW2ZzQUNHVWFjZ3VdezYsfSQvXG4gICAgICAgICAgICAgICAgaWYgKERHLkRldGVjdG9yLnNhbXBsZUNhdGVnb3JpZXMoc2VxQ29sLCAocykgPT4gLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpezYsfSQvLnRlc3QocykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgcmF3IG51Y2xlb3RpZGVzIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lSbmFOdWNsZW90aWRlc1RvR2NycyhzZXFDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZnxzfEF8Q3xHfFV8YXxjfGd8dSl7Nix9JC8udGVzdChzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBBeG9sYWJzIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lSbmFBeG9sYWJzVG9HY3JzKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyAvLyAvXltmbXBzQUNHVV17Nix9JC9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzKSA9PiAvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZnxtfHBzfEF8Q3xHfFUpezYsfSQvLnRlc3QocykpIHx8XG4gICAgICAgICAgICAgICAgICAgIERHLkRldGVjdG9yLnNhbXBsZUNhdGVnb3JpZXMoc2VxQ29sLCAocykgPT4gL14oPz0uKm1vZSkoPz0uKjVtQykoPz0uKnBzKXs2LH0vLnRlc3QocykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgR0NSUyB0byByYXcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gcmF3JykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnY3JzVG9OdWNsZW90aWRlcyhzZXFDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLm1lbnUuaXRlbSgnQ29udmVydCBHQ1JTIHRvIE1NMTInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gTU0xMicpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2Nyc1RvTWVybWFkZTEyKHNlcUNvbC5nZXQoaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyAvLyAvXlsqNTY3ODlBVEdDXXs2LH0kL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHMpID0+IC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxcXCp8NXw2fDd8OHw5fEF8VHxHfEMpezYsfSQvLnRlc3QocykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgQmlvc3ByaW5nIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXFDb2wgPSBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q29sO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hcmdzLmNvbnRleHQudGFibGUuY29sdW1ucy5hZGROZXdTdHJpbmcoc2VxQ29sLm5hbWUgKyAnIHRvIEdDUlMnKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IC8vIC9eWyoxLThdezYsfSQvXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKERHLkRldGVjdG9yLnNhbXBsZUNhdGVnb3JpZXMoc2VxQ29sLCAocykgPT4gLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFxcKnwxfDJ8M3w0fDV8Nnw3fDgpezYsfSQvLnRlc3QocykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0NvbnZlcnQgQmlvc3ByaW5nIHRvIEdDUlMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jb2x1bW5zLmFkZE5ld1N0cmluZyhzZXFDb2wubmFtZSArICcgdG8gR0NSUycpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lSbmFCaW9TcHJpbmdUb0djcnMoc2VxQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvbGlnb1NkRmlsZSh0YWJsZSkge1xuICAgIGNvbnN0IHNhbHRzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihTQUxUU19DU1YpO1xuICAgIGNvbnN0IHVzZXJzRGYgPSBERy5EYXRhRnJhbWUuZnJvbUNzdihVU0VSU19DU1YpO1xuICAgIGNvbnN0IHNvdXJjZXNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KFNPVVJDRVMpO1xuICAgIGNvbnN0IGljZHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KElDRFMpO1xuICAgIGNvbnN0IGlkcHNEZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KElEUFMpO1xuICAgIGNvbnN0IHNlcXVlbmNlQ29sID0gdGFibGUuZ2V0Q29sKENPTF9OQU1FUy5TRVFVRU5DRSk7XG4gICAgY29uc3Qgc2FsdENvbCA9IHRhYmxlLmdldENvbChDT0xfTkFNRVMuU0FMVCk7XG4gICAgY29uc3QgZXF1aXZhbGVudHNDb2wgPSB0YWJsZS5nZXRDb2woQ09MX05BTUVTLkVRVUlWQUxFTlRTKTtcbiAgICBjb25zdCB0eXBlQ29sID0gdGFibGUuZ2V0Q29sKENPTF9OQU1FUy5UWVBFKTtcbiAgICBjb25zdCBjaGVtaXN0cnlOYW1lQ29sID0gdGFibGUuZ2V0Q29sKENPTF9OQU1FUy5DSEVNSVNUUllfTkFNRSk7XG4gICAgY29uc3QgbW9sV2VpZ2h0Q29sID0gc2FsdHNEZi5nZXRDb2woJ01PTFdFSUdIVCcpO1xuICAgIGNvbnN0IHNhbHROYW1lc0xpc3QgPSBzYWx0c0RmLmdldENvbCgnRElTUExBWScpLnRvTGlzdCgpO1xuICAgIGxldCBuZXdEZjtcbiAgICBsZXQgYWRkQ29sdW1uc1ByZXNzZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBhZGRDb2x1bW5zKHQpIHtcbiAgICAgICAgaWYgKEdFTkVSQVRFRF9DT0xfTkFNRVMuc29tZSgoY29sTmFtZSkgPT4gdC5jb2x1bW5zLmNvbnRhaW5zKGNvbE5hbWUpKSlcbiAgICAgICAgICAgIHJldHVybiBncm9rLnNoZWxsLmVycm9yKCdDb2x1bW5zIGFscmVhZHkgZXhpc3QnKTtcbiAgICAgICAgdCA9IHJlbW92ZUVtcHR5Um93cyh0LCBzZXF1ZW5jZUNvbCk7XG4gICAgICAgIHQuY29sdW1ucy5hZGROZXdTdHJpbmcoQ09MX05BTUVTLkNPTVBPVU5EX05BTUUpLmluaXQoKGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoW1NFUVVFTkNFX1RZUEVTLkRVUExFWCwgU0VRVUVOQ0VfVFlQRVMuRElNRVIsIFNFUVVFTkNFX1RZUEVTLlRSSVBMRVhdLmluY2x1ZGVzKHR5cGVDb2wuZ2V0KGkpKSkgP1xuICAgICAgICAgICAgICAgIGNoZW1pc3RyeU5hbWVDb2wuZ2V0KGkpIDpcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUNvbC5nZXQoaSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3U3RyaW5nKENPTF9OQU1FUy5DT01QT1VORF9DT01NRU5UUykuaW5pdCgoaSkgPT4ge1xuICAgICAgICAgICAgaWYgKFtTRVFVRU5DRV9UWVBFUy5TRU5TRV9TVFJBTkQsIFNFUVVFTkNFX1RZUEVTLkFOVElTRU5TRV9TVFJBTkRdLmluY2x1ZGVzKHR5cGVDb2wuZ2V0KGkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VDb2wuZ2V0KGkpO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbC5nZXQoaSkgPT0gU0VRVUVOQ0VfVFlQRVMuRFVQTEVYKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VTdHJhbmRzRnJvbUR1cGxleENlbGwoc2VxdWVuY2VDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7Y2hlbWlzdHJ5TmFtZUNvbC5nZXQoaSl9OyBkdXBsZXggb2YgU1M6ICR7b2JqLlNTfSBhbmQgQVM6ICR7b2JqLkFTfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChbU0VRVUVOQ0VfVFlQRVMuRElNRVIsIFNFUVVFTkNFX1RZUEVTLlRSSVBMRVhdLmluY2x1ZGVzKHR5cGVDb2wuZ2V0KGkpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IHBhcnNlU3RyYW5kc0Zyb21UcmlwbGV4T3JEaW1lckNlbGwoc2VxdWVuY2VDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7Y2hlbWlzdHJ5TmFtZUNvbC5nZXQoaSl9OyBkdXBsZXggb2YgU1M6ICR7b2JqLlNTfSBhbmQgQVMxOiAke29iai5BUzF9IGFuZCBBUzI6ICR7b2JqLkFTMn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5DT01QT1VORF9NT0xfV0VJR0hUKS5pbml0KChpKSA9PiB7XG4gICAgICAgICAgICBpZiAoW1NFUVVFTkNFX1RZUEVTLlNFTlNFX1NUUkFORCwgU0VRVUVOQ0VfVFlQRVMuQU5USVNFTlNFX1NUUkFORF0uaW5jbHVkZXModHlwZUNvbC5nZXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2VDb2wuZ2V0KGkpLCBudWxsKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPT0gLTEpID9cbiAgICAgICAgICAgICAgICAgICAgbW9sZWN1bGFyV2VpZ2h0KHNlcXVlbmNlQ29sLmdldChpKSwgd2VpZ2h0c09iaikgOlxuICAgICAgICAgICAgICAgICAgICBERy5GTE9BVF9OVUxMO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbC5nZXQoaSkgPT0gU0VRVUVOQ0VfVFlQRVMuRFVQTEVYKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gcGFyc2VTdHJhbmRzRnJvbUR1cGxleENlbGwoc2VxdWVuY2VDb2wuZ2V0KGkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKE9iamVjdC52YWx1ZXMob2JqKS5ldmVyeSgoc2VxKSA9PiBpc1ZhbGlkU2VxdWVuY2Uoc2VxLCBudWxsKS5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPT0gLTEpKSA/XG4gICAgICAgICAgICAgICAgICAgIG1vbGVjdWxhcldlaWdodChvYmouU1MsIHdlaWdodHNPYmopICsgbW9sZWN1bGFyV2VpZ2h0KG9iai5BUywgd2VpZ2h0c09iaikgOlxuICAgICAgICAgICAgICAgICAgICBERy5GTE9BVF9OVUxMO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoW1NFUVVFTkNFX1RZUEVTLkRJTUVSLCBTRVFVRU5DRV9UWVBFUy5UUklQTEVYXS5pbmNsdWRlcyh0eXBlQ29sLmdldChpKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBwYXJzZVN0cmFuZHNGcm9tVHJpcGxleE9yRGltZXJDZWxsKHNlcXVlbmNlQ29sLmdldChpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChPYmplY3QudmFsdWVzKG9iaikuZXZlcnkoKHNlcSkgPT4gaXNWYWxpZFNlcXVlbmNlKHNlcSwgbnVsbCkuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID09IC0xKSkgP1xuICAgICAgICAgICAgICAgICAgICBtb2xlY3VsYXJXZWlnaHQob2JqLlNTLCB3ZWlnaHRzT2JqKSArIG1vbGVjdWxhcldlaWdodChvYmouQVMxLCB3ZWlnaHRzT2JqKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2xlY3VsYXJXZWlnaHQob2JqLkFTMiwgd2VpZ2h0c09iaikgOlxuICAgICAgICAgICAgICAgICAgICBERy5GTE9BVF9OVUxMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5TQUxUX01BU1MpLmluaXQoKGkpID0+IHNhbHRNYXNzKHNhbHROYW1lc0xpc3QsIG1vbFdlaWdodENvbCwgZXF1aXZhbGVudHNDb2wsIGksIHNhbHRDb2wpKTtcbiAgICAgICAgdC5jb2x1bW5zLmFkZE5ld0Zsb2F0KENPTF9OQU1FUy5TQUxUX01PTF9XRUlHSFQpLmluaXQoKGkpID0+IHNhbHRNb2xXZWlndGgoc2FsdE5hbWVzTGlzdCwgc2FsdENvbCwgbW9sV2VpZ2h0Q29sLCBpKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvdW5kTW9sV2VpZ2h0Q29sID0gdC5nZXRDb2woQ09MX05BTUVTLkNPTVBPVU5EX01PTF9XRUlHSFQpO1xuICAgICAgICBjb25zdCBzYWx0TWFzc0NvbCA9IHQuZ2V0Q29sKENPTF9OQU1FUy5TQUxUX01BU1MpO1xuICAgICAgICB0LmNvbHVtbnMuYWRkTmV3RmxvYXQoQ09MX05BTUVTLkJBVENIX01PTF9XRUlHSFQpLmluaXQoKGkpID0+IGJhdGNoTW9sV2VpZ2h0KGNvbXBvdW5kTW9sV2VpZ2h0Q29sLCBzYWx0TWFzc0NvbCwgaSkpO1xuICAgICAgICBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZS5uYW1lKS5ncmlkLmNvbHVtbnMuc2V0T3JkZXIoT2JqZWN0LnZhbHVlcyhDT0xfTkFNRVMpKTtcbiAgICAgICAgYWRkQ29sdW1uc1ByZXNzZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3RGYgPSB0O1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVDYWxjdWxhdGVkQ29sdW1ucyh0LCBpKSB7XG4gICAgICAgIGNvbnN0IHNtVmFsdWUgPSBzYWx0TWFzcyhzYWx0TmFtZXNMaXN0LCBtb2xXZWlnaHRDb2wsIGVxdWl2YWxlbnRzQ29sLCBpLCBzYWx0Q29sKTtcbiAgICAgICAgdC5nZXRDb2woQ09MX05BTUVTLlNBTFRfTUFTUykuc2V0KGksIHNtVmFsdWUsIGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc213VmFsdWUgPSBzYWx0TW9sV2VpZ3RoKHNhbHROYW1lc0xpc3QsIHNhbHRDb2wsIG1vbFdlaWdodENvbCwgaSk7XG4gICAgICAgIHQuZ2V0Q29sKENPTF9OQU1FUy5TQUxUX01PTF9XRUlHSFQpLnNldChpLCBzbXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBibXcgPSBiYXRjaE1vbFdlaWdodCh0LmdldENvbChDT0xfTkFNRVMuQ09NUE9VTkRfTU9MX1dFSUdIVCksIHQuZ2V0Q29sKENPTF9OQU1FUy5TQUxUX01BU1MpLCBpKTtcbiAgICAgICAgdC5nZXRDb2woQ09MX05BTUVTLkJBVENIX01PTF9XRUlHSFQpLnNldChpLCBibXcsIGZhbHNlKTtcbiAgICB9XG4gICAgY29uc3QgZCA9IHVpLmRpdihbXG4gICAgICAgIHVpLmljb25zLmVkaXQoKCkgPT4ge1xuICAgICAgICAgICAgZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIGlmICh0YWJsZS5nZXRDb2woQ09MX05BTUVTLklEUCkudHlwZSAhPSBERy5DT0xVTU5fVFlQRS5TVFJJTkcpXG4gICAgICAgICAgICAgICAgdGFibGUuY2hhbmdlQ29sdW1uVHlwZShDT0xfTkFNRVMuSURQLCBERy5DT0xVTU5fVFlQRS5TVFJJTkcpO1xuICAgICAgICAgICAgZC5hcHBlbmQodWkuZGl2SChbXG4gICAgICAgICAgICAgICAgdWkuaWNvbnMuYWRkKCgpID0+IGFkZENvbHVtbnModGFibGUpLCBgQWRkIGNvbHVtbnM6ICcke0dFTkVSQVRFRF9DT0xfTkFNRVMuam9pbihgJywgJ2ApfSdgKSxcbiAgICAgICAgICAgICAgICB1aS5pY29ucy5zYXZlKCgpID0+IHNhdmVUYWJsZUFzU2RGaWxlKGFkZENvbHVtbnNQcmVzc2VkID8gbmV3RGYgOiB0YWJsZSksICdTYXZlIFNEIGZpbGUnKSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZpZXcuZ3JpZC5zZXRPcHRpb25zKHsgcm93SGVpZ2h0OiA0NSB9KTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuVFlQRSkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5KE9iamVjdC52YWx1ZXMoU0VRVUVOQ0VfVFlQRVMpKSk7XG4gICAgICAgICAgICB2aWV3LmRhdGFGcmFtZS5nZXRDb2woQ09MX05BTUVTLk9XTkVSKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnkodXNlcnNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuU0FMVCkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5KHNhbHRzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICB2aWV3LmRhdGFGcmFtZS5nZXRDb2woQ09MX05BTUVTLlNPVVJDRSkuc2V0VGFnKERHLlRBR1MuQ0hPSUNFUywgc3RyaW5naWZ5KHNvdXJjZXNEZi5jb2x1bW5zLmJ5SW5kZXgoMCkudG9MaXN0KCkpKTtcbiAgICAgICAgICAgIHZpZXcuZGF0YUZyYW1lLmdldENvbChDT0xfTkFNRVMuSUNEKS5zZXRUYWcoREcuVEFHUy5DSE9JQ0VTLCBzdHJpbmdpZnkoaWNkc0RmLmNvbHVtbnMuYnlJbmRleCgwKS50b0xpc3QoKSkpO1xuICAgICAgICAgICAgdmlldy5kYXRhRnJhbWUuZ2V0Q29sKENPTF9OQU1FUy5JRFApLnNldFRhZyhERy5UQUdTLkNIT0lDRVMsIHN0cmluZ2lmeShpZHBzRGYuY29sdW1ucy5ieUluZGV4KDApLnRvTGlzdCgpKSk7XG4gICAgICAgICAgICBncm9rLmV2ZW50cy5vbkNvbnRleHRNZW51LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChbQ09MX05BTUVTLlRZUEUsIENPTF9OQU1FUy5PV05FUiwgQ09MX05BTUVTLlNBTFQsIENPTF9OQU1FUy5TT1VSQ0UsIENPTF9OQU1FUy5JQ0QsIENPTF9OQU1FUy5JRFBdXG4gICAgICAgICAgICAgICAgICAgIC5pbmNsdWRlcyhhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q29sLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuYXJncy5tZW51Lml0ZW0oJ0ZpbGwgQ29sdW1uIFdpdGggVmFsdWUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gYXJncy5hcmdzLmNvbnRleHQudGFibGUuY3VycmVudENlbGwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFyZ3MuY29udGV4dC50YWJsZS5jdXJyZW50Q2VsbC5jb2x1bW4uaW5pdCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlldy5kYXRhRnJhbWUucm93Q291bnQ7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDYWxjdWxhdGVkQ29sdW1ucyh2aWV3LmRhdGFGcmFtZSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmlldy5kYXRhRnJhbWUub25EYXRhQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbE5hbWUgPSB2aWV3LmRhdGFGcmFtZS5jdXJyZW50Q29sLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKFtDT0xfTkFNRVMuU0FMVCwgQ09MX05BTUVTLkVRVUlWQUxFTlRTLCBDT0xfTkFNRVMuU0FMVF9NT0xfV0VJR0hUXS5pbmNsdWRlcyhjb2xOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FsY3VsYXRlZENvbHVtbnModmlldy5kYXRhRnJhbWUsIHZpZXcuZGF0YUZyYW1lLmN1cnJlbnRSb3dJZHgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgIF0pO1xuICAgIGdyb2suc2hlbGwudi5zZXRSaWJib25QYW5lbHMoW1tkXV0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNBTFRTX0NTViA9IGBESVNQTEFZLE1PTFdFSUdIVFxubm8gRGF0YSBBZGRlZCwxMDBgO1xuIiwiZXhwb3J0IGNvbnN0IFNPVVJDRVMgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImV4cG9ydCBjb25zdCBVU0VSU19DU1YgPSBgRElTUExBWVxuTk8gREFUQVxuYDtcbiIsImNvbnN0IHJuYUNvbG9yID0gJ3JnYigyNTUsMjMwLDE1MyknO1xuY29uc3QgaW52QWJhc2ljQ29sb3IgPSAncmdiKDIwMywxMTksMjExKSc7XG5leHBvcnQgY29uc3QgYXhvbGFic01hcCA9IHtcbiAgICAnUk5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ1JOQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQScsICdDJywgJ0cnLCAnVSddLFxuICAgICAgICBjb2xvcjogcm5hQ29sb3IsXG4gICAgfSxcbiAgICAnRE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0ROQSBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnZEEnLCAnZEMnLCAnZEcnLCAnZFQnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTk3LDIyNCwxODApJyxcbiAgICB9LFxuICAgIFwiMlxcXCItRmx1b3JvXCI6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcyXFwnLUZsdW9ybyBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQWYnLCAnQ2YnLCAnR2YnLCAnVWYnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNjgsMTE0LDE5NiknLFxuICAgIH0sXG4gICAgXCIyXFxcIi1PLU1ldGh5bFwiOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1ldGh5bCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnYScsICdjJywgJ2cnLCAndSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNjYsMTY2LDE2NiknLFxuICAgIH0sXG4gICAgXCIyXFxcIi1PLU1PRVwiOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnMlxcJy1PLU1PRSBudWNsZW90aWRlcyAoaW5jbHVkaW5nIDUtTWV0aHlsIEMpJyxcbiAgICAgICAgc3ltYm9sczogWydBbScsICdDbScsICdHbScsICdUbSddLFxuICAgICAgICBjb2xvcjogJ3JnYigxMTIsNDgsMTYwKScsXG4gICAgfSxcbiAgICAnR05BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0dseWNvbCBudWNsZWljIGFjaWQnLFxuICAgICAgICBzeW1ib2xzOiBbJyhHTkEtQSknLCAnKEdOQS1DKScsICcoR05BLUcpJywgJyhHTkEtVCknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnTE5BJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0xvY2tlZCBudWNsZWljIGFjaWQgKGluY2x1ZGluZyA1LU1ldGh5bCBDKScsXG4gICAgICAgIHN5bWJvbHM6IFsnQWInLCAnQ2InLCAnR2InLCAnVGInXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoNTQsMjI5LDIzOCknLFxuICAgIH0sXG4gICAgJ1VOQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdVbmxvY2tlZCBudWNsZW90aWRlcycsXG4gICAgICAgIHN5bWJvbHM6IFsnQW8nLCAnQ28nLCAnR28nLCAnVW8nXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMjU1LDE5MiwwKScsXG4gICAgfSxcbiAgICAnQSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdBZGVuaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydhJywgJ2EnLCAnYScsICdhJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdDJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0N5dG9zaW5lJyxcbiAgICAgICAgc3ltYm9sczogWydjJywgJ2MnLCAnYycsICdjJ10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdHJzoge1xuICAgICAgICBmdWxsTmFtZTogJ0d1YW5pbmUnLFxuICAgICAgICBzeW1ib2xzOiBbJ2cnLCAnZycsICdnJywgJ2cnXSxcbiAgICAgICAgY29sb3I6IHJuYUNvbG9yLFxuICAgIH0sXG4gICAgJ1UnOiB7XG4gICAgICAgIGZ1bGxOYW1lOiAnVXJhY2lsJyxcbiAgICAgICAgc3ltYm9sczogWyd1JywgJ3UnLCAndScsICd1J10sXG4gICAgICAgIGNvbG9yOiBybmFDb2xvcixcbiAgICB9LFxuICAgICdYLU5ldyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICcnLFxuICAgICAgICBzeW1ib2xzOiBbJ1gnLCAnWCcsICdYJywgJ1gnXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMTA4LDAsMCknLFxuICAgIH0sXG4gICAgJ1ktTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWScsICdZJywgJ1knLCAnWSddLFxuICAgICAgICBjb2xvcjogJ3JnYigyMTAsMTQ2LDE0NiknLFxuICAgIH0sXG4gICAgJ1otTmV3Jzoge1xuICAgICAgICBmdWxsTmFtZTogJycsXG4gICAgICAgIHN5bWJvbHM6IFsnWicsICdaJywgJ1onLCAnWiddLFxuICAgICAgICBjb2xvcjogJ3JnYigxNTUsMTA4LDEzMiknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkJyxcbiAgICAgICAgc3ltYm9sczogWycoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKScsICcoaW52YWJhc2ljKSddLFxuICAgICAgICBjb2xvcjogaW52QWJhc2ljQ29sb3IsXG4gICAgfSxcbiAgICBcIjVcXFwiLXZpbnlscHNcIjoge1xuICAgICAgICBmdWxsTmFtZTogJzVcXCctdmlueWxwaG9zcGhvbmF0ZS0yXFwnLU9NZS11cmlkaW5lJyxcbiAgICAgICAgc3ltYm9sczogWycodmludSknLCAnKHZpbnUpJywgJyh2aW51KScsICcodmludSknXSxcbiAgICAgICAgY29sb3I6ICdyZ2IoMCwwLDEzOSknLFxuICAgIH0sXG4gICAgJ0ludkFiYXNpYyhvKSc6IHtcbiAgICAgICAgZnVsbE5hbWU6ICdJbnZlcnRlZCBhYmFzaWMgY2FwcGVkIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJywgJyhpbnZhYmFzaWMpJ10sXG4gICAgICAgIGNvbG9yOiBpbnZBYmFzaWNDb2xvcixcbiAgICB9LFxuICAgIFwiMlxcXCItT01lLVUobylcIjoge1xuICAgICAgICBmdWxsTmFtZTogJ051Y2xlb3RpZGUgVXJpZGluZSB3aXRoIDJcXCdPLU1ldGh5bCBwcm90ZWN0aW9uIChvdmVyaGFuZyknLFxuICAgICAgICBzeW1ib2xzOiBbJ21VJywgJ21VJywgJ21VJywgJ21VJ10sXG4gICAgICAgIGNvbG9yOiAncmdiKDY1LDIzMyw4MCknLFxuICAgIH0sXG59O1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgc3ZnIGZyb20gJ3NhdmUtc3ZnLWFzLXBuZyc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgeyBkcmF3QXhvbGFic1BhdHRlcm4gfSBmcm9tICcuL2RyYXctc3ZnJztcbmltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5jb25zdCBiYXNlQ2hvaWNlcyA9IE9iamVjdC5rZXlzKGF4b2xhYnNNYXApO1xuY29uc3QgZGVmYXVsdEJhc2UgPSBiYXNlQ2hvaWNlc1swXTtcbmNvbnN0IGRlZmF1bHRQdG8gPSB0cnVlO1xuY29uc3QgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoID0gMjM7XG5jb25zdCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCA9IDM1O1xuY29uc3QgdXNlclN0b3JhZ2VLZXkgPSAnU2VxdWVuY2VUcmFuc2xhdG9yJztcbmNvbnN0IGV4YW1wbGVNaW5XaWR0aCA9ICc0MDBweCc7XG5mdW5jdGlvbiBnZW5lcmF0ZUV4YW1wbGUoc2VxdWVuY2VMZW5ndGgsIHNlcXVlbmNlQmFzaXMpIHtcbiAgICBjb25zdCB1bmlxdWVTeW1ib2xzID0gYXhvbGFic01hcFtzZXF1ZW5jZUJhc2lzXS5zeW1ib2xzLmpvaW4oJycpO1xuICAgIHJldHVybiB1bmlxdWVTeW1ib2xzLnJlcGVhdChNYXRoLmZsb29yKHNlcXVlbmNlTGVuZ3RoIC8gNCkpICsgdW5pcXVlU3ltYm9scy5zbGljZSgwLCBzZXF1ZW5jZUxlbmd0aCAlIDQpO1xufVxuZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMoZGF0YSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpLmZpbHRlcigodmFsdWUpID0+IGRhdGEuaW5kZXhPZih2YWx1ZSkgIT09IGRhdGEubGFzdEluZGV4T2YodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4ocGF0dGVybk5hbWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4geWllbGQgZ3Jvay5kYXBpLnVzZXJzLmN1cnJlbnQoKS50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBsYXN0TmFtZV0gPSBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gKHVzZXIuZmlyc3ROYW1lICE9IGZpcnN0TmFtZSB8fCB1c2VyLmxhc3ROYW1lICE9IGxhc3ROYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRTaG9ydE5hbWUocGF0dGVybk5hbWUpIHtcbiAgICBsZXQgZmlyc3QgPSBwYXR0ZXJuTmFtZS5sZW5ndGggKyAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm5OYW1lLnNsaWNlKDAsIGZpcnN0IC0gMSk7XG59XG5mdW5jdGlvbiBnZXRVc2VyTmFtZShwYXR0ZXJuTmFtZSkge1xuICAgIGxldCBmaXJzdCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybk5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5OYW1lW2ldID09ICcoJykge1xuICAgICAgICAgICAgZmlyc3QgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBbJycsICcnXSA6IHBhdHRlcm5OYW1lLnNsaWNlKGZpcnN0ICsgOSwgcGF0dGVybk5hbWUubGVuZ3RoIC0gMSkuc3BsaXQoJyAnKS5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZVNlcXVlbmNlKHNlcXVlbmNlLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGxldCBtYWluU2VxdWVuY2UgPSBzZXF1ZW5jZS5yZXBsYWNlKC9bQVVHQ10vZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICBjb25zdCBpbmRleE9mU3ltYm9sID0gYXhvbGFic01hcFsnUk5BJ11bJ3N5bWJvbHMnXS5pbmRleE9mKHgpO1xuICAgICAgICBsZXQgc3ltYm9sID0gYXhvbGFic01hcFtiYXNlc1tpXS52YWx1ZV1bJ3N5bWJvbHMnXVtpbmRleE9mU3ltYm9sXTtcbiAgICAgICAgaWYgKGJhc2VzW2ldLnZhbHVlLnNsaWNlKC0zKSA9PSAnKG8pJykge1xuICAgICAgICAgICAgaWYgKGkgPCBzZXF1ZW5jZS5sZW5ndGggLyAyICYmIGJhc2VzW2kgKyAxXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgc3ltYm9sID0gc3ltYm9sICsgeCArICdmJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGkgPiBzZXF1ZW5jZS5sZW5ndGggLyAyICYmIGJhc2VzW2kgLSAxXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgc3ltYm9sID0geCArICdmJyArIHN5bWJvbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHB0b0xpbmthZ2VzW2ldLnZhbHVlKSA/IHN5bWJvbCArICdzJyA6IHN5bWJvbDtcbiAgICB9KTtcbiAgICBpZiAobWFpblNlcXVlbmNlLnNsaWNlKDAsIDUpLnNwbGl0KCdtVScpLmxlbmd0aCA9PSAzKVxuICAgICAgICBtYWluU2VxdWVuY2UgPSAnKHV1KScgKyBtYWluU2VxdWVuY2Uuc2xpY2UoNCk7XG4gICAgaWYgKG1haW5TZXF1ZW5jZS5zbGljZShtYWluU2VxdWVuY2UubGVuZ3RoIC0gNykuc3BsaXQoJ21VJykubGVuZ3RoID09IDMpXG4gICAgICAgIG1haW5TZXF1ZW5jZSA9IG1haW5TZXF1ZW5jZS5zbGljZSgwLCBtYWluU2VxdWVuY2UubGVuZ3RoIC0gNCkgKyAnKHV1KSc7XG4gICAgcmV0dXJuIHN0YXJ0TW9kaWZpY2F0aW9uLnZhbHVlICsgKGZpcnN0UHRvRXhpc3QgPyAncycgOiAnJykgKyBtYWluU2VxdWVuY2UgKyBlbmRNb2RpZmljYXRpb24udmFsdWU7XG59XG5mdW5jdGlvbiBhZGRDb2x1bW5XaXRoSWRzKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgcGF0dGVybk5hbWUpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnSUQgJyArIHBhdHRlcm5OYW1lO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBncm9rLnNoZWxsLnRhYmxlKHRhYmxlTmFtZSkuY29sdW1ucztcbiAgICBpZiAoY29sdW1ucy5jb250YWlucyhuYW1lT2ZOZXdDb2x1bW4pKVxuICAgICAgICBjb2x1bW5zLnJlbW92ZShuYW1lT2ZOZXdDb2x1bW4pO1xuICAgIGNvbnN0IGNvbHVtbldpdGhJZHMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiB7XG4gICAgICAgIHJldHVybiAoY29sdW1uV2l0aElkcy5nZXRTdHJpbmcoaSkgPT0gJycpID8gJycgOiBjb2x1bW5XaXRoSWRzLmdldChpKSArICdfJyArIHBhdHRlcm5OYW1lO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uV2l0aFRyYW5zbGF0ZWRTZXF1ZW5jZXModGFibGVOYW1lLCBjb2x1bW5OYW1lLCBiYXNlcywgcHRvTGlua2FnZXMsIHN0YXJ0TW9kaWZpY2F0aW9uLCBlbmRNb2RpZmljYXRpb24sIGZpcnN0UHRvRXhpc3QpIHtcbiAgICBjb25zdCBuYW1lT2ZOZXdDb2x1bW4gPSAnQXhvbGFicyAnICsgY29sdW1uTmFtZTtcbiAgICBjb25zdCBjb2x1bW5zID0gZ3Jvay5zaGVsbC50YWJsZSh0YWJsZU5hbWUpLmNvbHVtbnM7XG4gICAgaWYgKGNvbHVtbnMuY29udGFpbnMobmFtZU9mTmV3Q29sdW1uKSlcbiAgICAgICAgY29sdW1ucy5yZW1vdmUobmFtZU9mTmV3Q29sdW1uKTtcbiAgICBjb25zdCBjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMgPSBjb2x1bW5zLmJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gY29sdW1ucy5hZGROZXdTdHJpbmcobmFtZU9mTmV3Q29sdW1uKS5pbml0KChpKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2x1bW5XaXRoSW5wdXRTZXF1ZW5jZXMuZ2V0U3RyaW5nKGkpID09ICcnID9cbiAgICAgICAgICAgICcnIDpcbiAgICAgICAgICAgIHRyYW5zbGF0ZVNlcXVlbmNlKGNvbHVtbldpdGhJbnB1dFNlcXVlbmNlcy5nZXRTdHJpbmcoaSksIGJhc2VzLCBwdG9MaW5rYWdlcywgc3RhcnRNb2RpZmljYXRpb24sIGVuZE1vZGlmaWNhdGlvbiwgZmlyc3RQdG9FeGlzdCk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXhvbGFic1BhdHRlcm4oKSB7XG4gICAgY29uc3QgZW51bWVyYXRlTW9kaWZpY2F0aW9ucyA9IFtkZWZhdWx0QmFzZV07XG4gICAgbGV0IG1heGltYWxTc0xlbmd0aCA9IGRlZmF1bHRTZXF1ZW5jZUxlbmd0aDtcbiAgICBsZXQgbWF4aW1hbEFzTGVuZ3RoID0gZGVmYXVsdFNlcXVlbmNlTGVuZ3RoO1xuICAgIGZ1bmN0aW9uIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCkge1xuICAgICAgICBhc01vZGlmaWNhdGlvbkl0ZW1zLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBhc1B0b0xpbmthZ2VzID0gYXNQdG9MaW5rYWdlcy5jb25jYXQoQXJyYXkobWF4aW1hbEFzTGVuZ3RoIC0gYXNCYXNlcy5sZW5ndGgpLmZpbGwoZnVsbHlQdG8pKTtcbiAgICAgICAgYXNCYXNlcyA9IGFzQmFzZXMuY29uY2F0KEFycmF5KG1heGltYWxBc0xlbmd0aCAtIGFzQmFzZXMubGVuZ3RoKS5maWxsKHNlcXVlbmNlQmFzZSkpO1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzTGVuZ3RoLnZhbHVlOyBpKyspIHtcbiAgICAgICAgICAgIGFzUHRvTGlua2FnZXNbaV0gPSB1aS5ib29sSW5wdXQoJycsIGFzUHRvTGlua2FnZXNbaV0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhc0Jhc2VzW2ldID0gdWkuY2hvaWNlSW5wdXQoJycsIGFzQmFzZXNbaV0udmFsdWUsIGJhc2VDaG9pY2VzLCAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0Rpdi5hcHBlbmQodWkuZGl2VGV4dCgnJywgeyBzdHlsZTogeyB3aWR0aDogJzI1cHgnIH0gfSksIHVpLmJvb2xJbnB1dCh2LCB0cnVlLCAoYm9vbFYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib29sVikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtZXJhdGVNb2RpZmljYXRpb25zLmluZGV4T2YodiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5yb290KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlQXNNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXIrKztcbiAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uSXRlbXMuYXBwZW5kKHVpLmRpdkgoW1xuICAgICAgICAgICAgICAgIHVpLmRpdihbdWkubGFiZWwoYXNCYXNlc1tpXS52YWx1ZS5zbGljZSgtMykgPT0gJyhvKScgPyAnJyA6IFN0cmluZyhudWNsZW90aWRlQ291bnRlcikpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICAgICAgdWkuYmxvY2s3NShbYXNCYXNlc1tpXV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbYXNQdG9MaW5rYWdlc1tpXV0pLFxuICAgICAgICAgICAgXSwgeyBzdHlsZTogeyBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTc01vZGlmaWNhdGlvbigpIHtcbiAgICAgICAgc3NNb2RpZmljYXRpb25JdGVtcy5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgc3NQdG9MaW5rYWdlcyA9IHNzUHRvTGlua2FnZXMuY29uY2F0KEFycmF5KG1heGltYWxTc0xlbmd0aCAtIHNzQmFzZXMubGVuZ3RoKS5maWxsKGZ1bGx5UHRvKSk7XG4gICAgICAgIHNzQmFzZXMgPSBzc0Jhc2VzLmNvbmNhdChBcnJheShtYXhpbWFsU3NMZW5ndGggLSBzc0Jhc2VzLmxlbmd0aCkuZmlsbChzZXF1ZW5jZUJhc2UpKTtcbiAgICAgICAgbGV0IG51Y2xlb3RpZGVDb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc0xlbmd0aC52YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICBzc1B0b0xpbmthZ2VzW2ldID0gdWkuYm9vbElucHV0KCcnLCBzc1B0b0xpbmthZ2VzW2ldLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3NCYXNlc1tpXSA9IHVpLmNob2ljZUlucHV0KCcnLCBzc0Jhc2VzW2ldLnZhbHVlLCBiYXNlQ2hvaWNlcywgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICBpc0VudW1lcmF0ZU1vZGlmaWNhdGlvbnNEaXYuYXBwZW5kKHVpLmRpdlRleHQoJycsIHsgc3R5bGU6IHsgd2lkdGg6ICcyNXB4JyB9IH0pLCB1aS5ib29sSW5wdXQodiwgdHJ1ZSwgKGJvb2xWKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbFYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXModikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmRleE9mKHYsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVNb2RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkucm9vdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZVNzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVDb3VudGVyKys7XG4gICAgICAgICAgICBzc01vZGlmaWNhdGlvbkl0ZW1zLmFwcGVuZCh1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICB1aS5kaXYoW3VpLmxhYmVsKHNzQmFzZXNbaV0udmFsdWUuc2xpY2UoLTMpID09ICcobyknID8gJycgOiBTdHJpbmcobnVjbGVvdGlkZUNvdW50ZXIpKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgICAgIHVpLmJsb2NrNzUoW3NzQmFzZXNbaV1dKSxcbiAgICAgICAgICAgICAgICB1aS5kaXYoW3NzUHRvTGlua2FnZXNbaV1dKSxcbiAgICAgICAgICAgIF0sIHsgc3R5bGU6IHsgYWxpZ25JdGVtczogJ2NlbnRlcicgfSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpIHtcbiAgICAgICAgaWYgKHNzTGVuZ3RoLnZhbHVlIDwgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGggJiYgYXNMZW5ndGgudmFsdWUgPCBtYXhpbWFsVmFsaWRTZXF1ZW5jZUxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNzTGVuZ3RoLnZhbHVlID4gbWF4aW1hbFNzTGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1heGltYWxTc0xlbmd0aCA9IHNzTGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGFzTGVuZ3RoLnZhbHVlID4gbWF4aW1hbEFzTGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1heGltYWxBc0xlbmd0aCA9IGFzTGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgdXBkYXRlU3NNb2RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIHVwZGF0ZUFzTW9kaWZpY2F0aW9uKCk7XG4gICAgICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZUlucHV0RXhhbXBsZXMoKTtcbiAgICAgICAgICAgIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ1NlcXVlbmNlIGxlbmd0aCBpcyBvdXQgb2YgcmFuZ2UnKVxuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnU2VxdWVuY2UgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gJyArXG4gICAgICAgICAgICAgICAgbWF4aW1hbFZhbGlkU2VxdWVuY2VMZW5ndGgudG9TdHJpbmcoKSArICcgZHVlIHRvIFVJIGNvbnN0cmFpbnMuJykpXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdQbGVhc2UgY2hhbmdlIHNlcXVlbmNlIGxlbmd0aCBpbiBvcmRlciB0byBkZWZpbmUgbmV3IHBhdHRlcm4uJykpXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQdG8obmV3UHRvVmFsdWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzc1B0b0xpbmthZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc3NQdG9MaW5rYWdlc1tpXS52YWx1ZSA9IG5ld1B0b1ZhbHVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzUHRvTGlua2FnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBhc1B0b0xpbmthZ2VzW2ldLnZhbHVlID0gbmV3UHRvVmFsdWU7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVCYXNlcyhuZXdCYXNpc1ZhbHVlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3NCYXNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNzQmFzZXNbaV0udmFsdWUgPSBuZXdCYXNpc1ZhbHVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzQmFzZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBhc0Jhc2VzW2ldLnZhbHVlID0gbmV3QmFzaXNWYWx1ZTtcbiAgICAgICAgdXBkYXRlU3ZnU2NoZW1lKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUlucHV0RXhhbXBsZXMoKSB7XG4gICAgICAgIGlmIChpbnB1dFNzQ29sdW1uLnZhbHVlID09ICcnKVxuICAgICAgICAgICAgc3NJbnB1dEV4YW1wbGUudmFsdWUgPSBnZW5lcmF0ZUV4YW1wbGUoc3NMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSk7XG4gICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSAmJiBpbnB1dEFzQ29sdW1uLnZhbHVlID09ICcnKVxuICAgICAgICAgICAgYXNJbnB1dEV4YW1wbGUudmFsdWUgPSBnZW5lcmF0ZUV4YW1wbGUoYXNMZW5ndGgudmFsdWUsIHNlcXVlbmNlQmFzZS52YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU91dHB1dEV4YW1wbGVzKCkge1xuICAgICAgICBzc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShzc0lucHV0RXhhbXBsZS52YWx1ZSwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICAgICAgaWYgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSB7XG4gICAgICAgICAgICBhc091dHB1dEV4YW1wbGUudmFsdWUgPSB0cmFuc2xhdGVTZXF1ZW5jZShhc0lucHV0RXhhbXBsZS52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdEFzUHRvLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTdmdTY2hlbWUoKSB7XG4gICAgICAgIHN2Z0Rpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgc3ZnRGl2LmFwcGVuZCh1aS5zcGFuKFtcbiAgICAgICAgICAgIGRyYXdBeG9sYWJzUGF0dGVybihnZXRTaG9ydE5hbWUoc2F2ZUFzLnZhbHVlKSwgY3JlYXRlQXNTdHJhbmQudmFsdWUsIHNzQmFzZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksIGFzQmFzZXMuc2xpY2UoMCwgYXNMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksIFtmaXJzdFNzUHRvLnZhbHVlXS5jb25jYXQoc3NQdG9MaW5rYWdlcy5zbGljZSgwLCBzc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksIFtmaXJzdEFzUHRvLnZhbHVlXS5jb25jYXQoYXNQdG9MaW5rYWdlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksIHNzVGhyZWVNb2RpZmljYXRpb24udmFsdWUsIHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSwgYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSwgYXNGaXZlTW9kaWZpY2F0aW9uLnZhbHVlLCBjb21tZW50LnZhbHVlLCBlbnVtZXJhdGVNb2RpZmljYXRpb25zKSxcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXRlY3REZWZhdWx0QmFzaXMoYXJyYXkpIHtcbiAgICAgICAgY29uc3QgbW9kZU1hcCA9IHt9O1xuICAgICAgICBsZXQgbWF4RWwgPSBhcnJheVswXTtcbiAgICAgICAgbGV0IG1heENvdW50ID0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChtb2RlTWFwW2VsXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIG1vZGVNYXBbZWxdID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtb2RlTWFwW2VsXSsrO1xuICAgICAgICAgICAgaWYgKG1vZGVNYXBbZWxdID4gbWF4Q291bnQpIHtcbiAgICAgICAgICAgICAgICBtYXhFbCA9IGVsO1xuICAgICAgICAgICAgICAgIG1heENvdW50ID0gbW9kZU1hcFtlbF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heEVsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaShuZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBwaSA9IERHLlRhc2tCYXJQcm9ncmVzc0luZGljYXRvci5jcmVhdGUoJ0xvYWRpbmcgcGF0dGVybi4uLicpO1xuICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXQodXNlclN0b3JhZ2VLZXksIGZhbHNlKS50aGVuKChlbnRpdGllcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZW50aXRpZXNbbmV3TmFtZV0pO1xuICAgICAgICAgICAgICAgIHNlcXVlbmNlQmFzZS52YWx1ZSA9IGRldGVjdERlZmF1bHRCYXNpcyhvYmpbJ2FzQmFzZXMnXS5jb25jYXQob2JqWydzc0Jhc2VzJ10pKTtcbiAgICAgICAgICAgICAgICBjcmVhdGVBc1N0cmFuZC52YWx1ZSA9IChvYmpbJ2FzQmFzZXMnXS5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgICAgICBzYXZlQXMudmFsdWUgPSBuZXdOYW1lO1xuICAgICAgICAgICAgICAgIHNzQmFzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ialsnc3NCYXNlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBzc0Jhc2VzLnB1c2godWkuY2hvaWNlSW5wdXQoJycsIG9ialsnc3NCYXNlcyddW2ldLCBiYXNlQ2hvaWNlcykpO1xuICAgICAgICAgICAgICAgIGFzQmFzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ialsnYXNCYXNlcyddLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBhc0Jhc2VzLnB1c2godWkuY2hvaWNlSW5wdXQoJycsIG9ialsnYXNCYXNlcyddW2ldLCBiYXNlQ2hvaWNlcykpO1xuICAgICAgICAgICAgICAgIGZpcnN0U3NQdG8udmFsdWUgPSBvYmpbJ3NzUHRvTGlua2FnZXMnXVswXTtcbiAgICAgICAgICAgICAgICBzc1B0b0xpbmthZ2VzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvYmpbJ3NzUHRvTGlua2FnZXMnXS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgc3NQdG9MaW5rYWdlcy5wdXNoKHVpLmJvb2xJbnB1dCgnJywgb2JqWydzc1B0b0xpbmthZ2VzJ11baV0pKTtcbiAgICAgICAgICAgICAgICBmaXJzdEFzUHRvLnZhbHVlID0gb2JqWydhc1B0b0xpbmthZ2VzJ11bMF07XG4gICAgICAgICAgICAgICAgYXNQdG9MaW5rYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2JqWydhc1B0b0xpbmthZ2VzJ10ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGFzUHRvTGlua2FnZXMucHVzaCh1aS5ib29sSW5wdXQoJycsIG9ialsnYXNQdG9MaW5rYWdlcyddW2ldKSk7XG4gICAgICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSBvYmpbJ3NzQmFzZXMnXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSBvYmpbJ2FzQmFzZXMnXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgc3NUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnc3NUaHJlZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIHNzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnc3NGaXZlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgYXNUaHJlZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnYXNUaHJlZU1vZGlmaWNhdGlvbiddO1xuICAgICAgICAgICAgICAgIGFzRml2ZU1vZGlmaWNhdGlvbi52YWx1ZSA9IG9ialsnYXNGaXZlTW9kaWZpY2F0aW9uJ107XG4gICAgICAgICAgICAgICAgY29tbWVudC52YWx1ZSA9IG9ialsnY29tbWVudCddO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwaS5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSk7XG4gICAgICAgIGxldCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29sLmdldChpIC0gMSkubGVuZ3RoICE9IGNvbC5nZXQoaSkubGVuZ3RoICYmIGNvbC5nZXQoaSkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYWxsTGVuZ3Roc0FyZVRoZVNhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnU2VxdWVuY2VzIGxlbmd0aHMgbWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICQoZGlhbG9nLmdldEJ1dHRvbignT0snKSkuaGlkZSgpO1xuICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgLmFkZCh1aS5kaXZUZXh0KCdUaGUgc2VxdWVuY2UgbGVuZ3RoIHNob3VsZCBtYXRjaCB0aGUgbnVtYmVyIG9mIFJhdyBzZXF1ZW5jZXMgaW4gdGhlIGlucHV0IGZpbGUnKSlcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1xcJ0FERCBDT0xVTU5cXCcgdG8gc2VlIHNlcXVlbmNlcyBsZW5ndGhzJykpXG4gICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignQUREIENPTFVNTicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YWJsZXMudmFsdWUuY29sdW1ucy5hZGROZXdJbnQoJ1NlcXVlbmNlcyBsZW5ndGhzIGluICcgKyBjb2xOYW1lKS5pbml0KChqKSA9PiBjb2wuZ2V0KGopLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKCdDb2x1bW4gd2l0aCBsZW5ndGhzIGFkZGVkIHRvIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLnYgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyh0YWJsZXMudmFsdWUubmFtZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbC5nZXQoMCkgIT0gc3NMZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB1aS5kaWFsb2coJ0xlbmd0aCB3YXMgdXBkYXRlZCBieSB2YWx1ZSB0byBmcm9tIGltcG9ydGVkIGZpbGUnKTtcbiAgICAgICAgICAgIGQuYWRkKHVpLmRpdlRleHQoJ0xhdGVzdCBtb2RpZmljYXRpb25zIG1heSBub3QgdGFrZSBlZmZlY3QgZHVyaW5nIHRyYW5zbGF0aW9uJykpXG4gICAgICAgICAgICAgICAgLm9uT0soKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdMZW5ndGhzIGNoYW5nZWQnKSkuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxMZW5ndGhzQXJlVGhlU2FtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJOYW1lKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGdyb2suZGFwaS51c2Vycy5jdXJyZW50KCkudGhlbigodXNlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIChjcmVhdGVkIGJ5ICcgKyB1c2VyLmZpcnN0TmFtZSArICcgJyArIHVzZXIubGFzdE5hbWUgKyAnKSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvc3RQYXR0ZXJuVG9Vc2VyU3RvcmFnZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJVc2VyTmFtZSA9IHlpZWxkIGdldEN1cnJlbnRVc2VyTmFtZSgpO1xuICAgICAgICAgICAgc2F2ZUFzLnZhbHVlID0gKHNhdmVBcy5zdHJpbmdWYWx1ZS5pbmNsdWRlcygnKGNyZWF0ZWQgYnkgJykpID9cbiAgICAgICAgICAgICAgICBnZXRTaG9ydE5hbWUoc2F2ZUFzLnZhbHVlKSArIGN1cnJVc2VyTmFtZSA6XG4gICAgICAgICAgICAgICAgc2F2ZUFzLnN0cmluZ1ZhbHVlICsgY3VyclVzZXJOYW1lO1xuICAgICAgICAgICAgcmV0dXJuIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucG9zdFZhbHVlKHVzZXJTdG9yYWdlS2V5LCBzYXZlQXMudmFsdWUsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAnc3NCYXNlcyc6IHNzQmFzZXMuc2xpY2UoMCwgc3NMZW5ndGgudmFsdWUpLm1hcCgoZSkgPT4gZS52YWx1ZSksXG4gICAgICAgICAgICAgICAgJ2FzQmFzZXMnOiBhc0Jhc2VzLnNsaWNlKDAsIGFzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICdzc1B0b0xpbmthZ2VzJzogW2ZpcnN0U3NQdG8udmFsdWVdLmNvbmNhdChzc1B0b0xpbmthZ2VzLnNsaWNlKDAsIHNzTGVuZ3RoLnZhbHVlKS5tYXAoKGUpID0+IGUudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAnYXNQdG9MaW5rYWdlcyc6IFtmaXJzdEFzUHRvLnZhbHVlXS5jb25jYXQoYXNQdG9MaW5rYWdlcy5zbGljZSgwLCBhc0xlbmd0aC52YWx1ZSkubWFwKChlKSA9PiBlLnZhbHVlKSksXG4gICAgICAgICAgICAgICAgJ3NzVGhyZWVNb2RpZmljYXRpb24nOiBzc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdzc0ZpdmVNb2RpZmljYXRpb24nOiBzc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2FzVGhyZWVNb2RpZmljYXRpb24nOiBhc1RocmVlTW9kaWZpY2F0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICdhc0ZpdmVNb2RpZmljYXRpb24nOiBhc0ZpdmVNb2RpZmljYXRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgJ2NvbW1lbnQnOiBjb21tZW50LnZhbHVlLFxuICAgICAgICAgICAgfSksIGZhbHNlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgc2F2ZUFzLnZhbHVlICsgJ1xcJyB3YXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIScpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBhdHRlcm5zTGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UuZ2V0KHVzZXJTdG9yYWdlS2V5LCBmYWxzZSkudGhlbigoZW50aXRpZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsc3RNeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxzdE90aGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGRpc3BsYXkgc2hvcnQgbmFtZSwgYnV0IHVzZSBsb25nIGZvciBxdWVyeWluZyB1c2VyZGF0YVN0b3JhZ2VcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudCBvZiBPYmplY3Qua2V5cyhlbnRpdGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdE90aGVycy5wdXNoKGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdE15LnB1c2goZW50KTsgLy9nZXRTaG9ydE5hbWUoZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBsb2FkUGF0dGVybiA9IHVpLmNob2ljZUlucHV0KCdMb2FkIFBhdHRlcm4nLCAnJywgbHN0TXksICh2KSA9PiBwYXJzZVBhdHRlcm5BbmRVcGRhdGVVaSh2KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlPck90aGVyc1BhdHRlcm5MaXN0ID0gdWkuY2hvaWNlSW5wdXQoJycsICdNaW5lJywgWydNaW5lJywgJ090aGVycyddLCAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IHYgPT0gJ01pbmUnID8gbHN0TXkgOiBsc3RPdGhlcnM7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuID0gdWkuY2hvaWNlSW5wdXQoJ0xvYWQgUGF0dGVybicsICcnLCBjdXJyZW50TGlzdCwgKHYpID0+IHBhcnNlUGF0dGVybkFuZFVwZGF0ZVVpKHYpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobXlPck90aGVyc1BhdHRlcm5MaXN0LmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobG9hZFBhdHRlcm4uaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLmlucHV0LnN0eWxlLm1heFdpZHRoID0gJzEwMHB4JztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uc2V0VG9vbHRpcCgnQXBwbHkgRXhpc3RpbmcgUGF0dGVybicpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybkRpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgbG9hZFBhdHRlcm5EaXYuYXBwZW5kKGxvYWRQYXR0ZXJuLnJvb3QpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuYnV0dG9uKHVpLmljb25GQSgndHJhc2gtYWx0JywgKCkgPT4geyB9KSwgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGF0dGVybi52YWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nob29zZSBwYXR0ZXJuIHRvIGRlbGV0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHlpZWxkIGlzQ3VycmVudFVzZXJDcmVhdGVkVGhpc1BhdHRlcm4oc2F2ZUFzLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdDYW5ub3QgZGVsZXRlIHBhdHRlcm4sIGNyZWF0ZWQgYnkgb3RoZXIgdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLnJlbW92ZSh1c2VyU3RvcmFnZUtleSwgbG9hZFBhdHRlcm4udmFsdWUsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdQYXR0ZXJuIFxcJycgKyBsb2FkUGF0dGVybi52YWx1ZSArICdcXCcgZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuLnJvb3QuYXBwZW5kKG15T3JPdGhlcnNQYXR0ZXJuTGlzdC5pbnB1dCk7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4ucm9vdC5hcHBlbmQobG9hZFBhdHRlcm4uaW5wdXQpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5pbnB1dC5zdHlsZS5tYXhXaWR0aCA9ICcxMDBweCc7XG4gICAgICAgICAgICAgICAgbG9hZFBhdHRlcm4uc2V0VG9vbHRpcCgnQXBwbHkgRXhpc3RpbmcgUGF0dGVybicpO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LmFwcGVuZChsb2FkUGF0dGVybi5yb290KTtcbiAgICAgICAgICAgICAgICBsb2FkUGF0dGVybi5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCd0cmFzaC1hbHQnLCAoKSA9PiB7IH0pLCAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhdHRlcm4udmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0Nob29zZSBwYXR0ZXJuIHRvIGRlbGV0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeWllbGQgaXNDdXJyZW50VXNlckNyZWF0ZWRUaGlzUGF0dGVybihzYXZlQXMudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnQ2Fubm90IGRlbGV0ZSBwYXR0ZXJuLCBjcmVhdGVkIGJ5IG90aGVyIHVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucmVtb3ZlKHVzZXJTdG9yYWdlS2V5LCBsb2FkUGF0dGVybi52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBcXCcnICsgbG9hZFBhdHRlcm4udmFsdWUgKyAnXFwnIGRlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2F2ZVBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCBncm9rLmRhcGkudXNlckRhdGFTdG9yYWdlLmdldCh1c2VyU3RvcmFnZUtleSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGVudGl0aWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGVudGl0aWVzKS5pbmNsdWRlcyhzYXZlQXMudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnUGF0dGVybiBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1BhdHRlcm4gbmFtZSBcXCcnICsgc2F2ZUFzLnZhbHVlICsgJ1xcJyBhbHJlYWR5IGV4aXN0cy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnUmVwbGFjZSBwYXR0ZXJuPycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEJ1dHRvbignWUVTJywgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5yZW1vdmUodXNlclN0b3JhZ2VLZXksIHNhdmVBcy52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdFBhdHRlcm5Ub1VzZXJTdG9yYWdlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwb3N0UGF0dGVyblRvVXNlclN0b3JhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWllbGQgdXBkYXRlUGF0dGVybnNMaXN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFNzQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpbnB1dEFzQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBpbnB1dElkQ29sdW1uRGl2ID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBzc01vZGlmaWNhdGlvbkl0ZW1zID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBhc01vZGlmaWNhdGlvbkl0ZW1zID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBzdmdEaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGFzRXhhbXBsZURpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXBwQXhvbGFic0Rlc2NyaXB0aW9uID0gdWkuZGl2KFtdKTtcbiAgICBjb25zdCBsb2FkUGF0dGVybkRpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGZpcnN0QXNQdG9EaXYgPSB1aS5kaXYoW10pO1xuICAgIGNvbnN0IGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0RpdiA9IHVpLmRpdkgoW1xuICAgICAgICB1aS5ib29sSW5wdXQoZGVmYXVsdEJhc2UsIHRydWUsICh2KSA9PiB7XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGlmICghZW51bWVyYXRlTW9kaWZpY2F0aW9ucy5pbmNsdWRlcyhkZWZhdWx0QmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMucHVzaChkZWZhdWx0QmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5kZXhPZihkZWZhdWx0QmFzZSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgICAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICAgICAgfSkucm9vdCxcbiAgICBdKTtcbiAgICBsZXQgc3NCYXNlcyA9IEFycmF5KGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCkuZmlsbCh1aS5jaG9pY2VJbnB1dCgnJywgZGVmYXVsdEJhc2UsIGJhc2VDaG9pY2VzKSk7XG4gICAgbGV0IGFzQmFzZXMgPSBBcnJheShkZWZhdWx0U2VxdWVuY2VMZW5ndGgpLmZpbGwodWkuY2hvaWNlSW5wdXQoJycsIGRlZmF1bHRCYXNlLCBiYXNlQ2hvaWNlcykpO1xuICAgIGxldCBzc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGxldCBhc1B0b0xpbmthZ2VzID0gQXJyYXkoZGVmYXVsdFNlcXVlbmNlTGVuZ3RoKS5maWxsKHVpLmJvb2xJbnB1dCgnJywgZGVmYXVsdFB0bykpO1xuICAgIGNvbnN0IHNzTGVuZ3RoID0gdWkuaW50SW5wdXQoJ1NTIExlbmd0aCcsIGRlZmF1bHRTZXF1ZW5jZUxlbmd0aCwgKCkgPT4gdXBkYXRlVWlGb3JOZXdTZXF1ZW5jZUxlbmd0aCgpKTtcbiAgICBzc0xlbmd0aC5zZXRUb29sdGlwKCdMZW5ndGggb2Ygc2Vuc2Ugc3RyYW5kLCBpbmNsdWRpbmcgb3ZlcmhhbmdzJyk7XG4gICAgY29uc3QgYXNMZW5ndGggPSB1aS5pbnRJbnB1dCgnQVMgTGVuZ3RoJywgZGVmYXVsdFNlcXVlbmNlTGVuZ3RoLCAoKSA9PiB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCkpO1xuICAgIGFzTGVuZ3RoLnNldFRvb2x0aXAoJ0xlbmd0aCBvZiBzZW5zZSBzdHJhbmQsIGluY2x1ZGluZyBvdmVyaGFuZ3MnKTtcbiAgICBjb25zdCBhc0xlbmd0aERpdiA9IHVpLmRpdihbYXNMZW5ndGgucm9vdF0pO1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3NDb2x1bW4oY29sTmFtZSkge1xuICAgICAgICBjb25zdCBhbGxMZW5ndGhzQXJlVGhlU2FtZSA9IGNoZWNrV2hldGhlckFsbFZhbHVlc0luQ29sdW1uSGF2ZVRoZVNhbWVMZW5ndGgoY29sTmFtZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0U2VxdWVuY2UgPSB0YWJsZXMudmFsdWUuZ2V0Q29sKGNvbE5hbWUpLmdldCgwKTtcbiAgICAgICAgaWYgKGFsbExlbmd0aHNBcmVUaGVTYW1lICYmIGZpcnN0U2VxdWVuY2UubGVuZ3RoICE9IHNzTGVuZ3RoLnZhbHVlKVxuICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuZ2V0Q29sKGNvbE5hbWUpLmdldCgwKS5sZW5ndGg7XG4gICAgICAgIHNzSW5wdXRFeGFtcGxlLnZhbHVlID0gZmlyc3RTZXF1ZW5jZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVBc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGFsbExlbmd0aHNBcmVUaGVTYW1lID0gY2hlY2tXaGV0aGVyQWxsVmFsdWVzSW5Db2x1bW5IYXZlVGhlU2FtZUxlbmd0aChjb2xOYW1lKTtcbiAgICAgICAgY29uc3QgZmlyc3RTZXF1ZW5jZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSkuZ2V0KDApO1xuICAgICAgICBpZiAoYWxsTGVuZ3Roc0FyZVRoZVNhbWUgJiYgZmlyc3RTZXF1ZW5jZS5sZW5ndGggIT0gYXNMZW5ndGgudmFsdWUpXG4gICAgICAgICAgICBhc0xlbmd0aC52YWx1ZSA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSkuZ2V0KDApLmxlbmd0aDtcbiAgICAgICAgYXNJbnB1dEV4YW1wbGUudmFsdWUgPSBmaXJzdFNlcXVlbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkc0NvbHVtbihjb2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRhYmxlcy52YWx1ZS5nZXRDb2woY29sTmFtZSk7XG4gICAgICAgIGlmIChjb2wudHlwZSAhPSBERy5UWVBFLklOVClcbiAgICAgICAgICAgIGdyb2suc2hlbGwuZXJyb3IoJ0NvbHVtbiBzaG91bGQgY29udGFpbiBpbnRlZ2VycyBvbmx5Jyk7XG4gICAgICAgIGVsc2UgaWYgKGNvbC5jYXRlZ29yaWVzLmZpbHRlcigoZSkgPT4gZSAhPSAnJykubGVuZ3RoIDwgY29sLnRvTGlzdCgpLmZpbHRlcigoZSkgPT4gZSAhPSAnJykubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gZmluZER1cGxpY2F0ZXMoY29sLmdldFJhd0RhdGEoKSk7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ05vbi11bmlxdWUgSURzJylcbiAgICAgICAgICAgICAgICAuYWRkKHVpLmRpdlRleHQoJ1ByZXNzIFxcJ09LXFwnIHRvIHNlbGVjdCByb3dzIHdpdGggbm9uLXVuaXF1ZSB2YWx1ZXMnKSlcbiAgICAgICAgICAgICAgICAub25PSygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGFibGVzLnZhbHVlLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaW5pdCgoaSkgPT4gZHVwbGljYXRlcy5pbmRleE9mKGNvbC5nZXQoaSkpID4gLTEpO1xuICAgICAgICAgICAgICAgIGdyb2suc2hlbGwudiA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlcy52YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBncm9rLnNoZWxsLmluZm8oJ1Jvd3MgYXJlIHNlbGVjdGVkIGluIHRhYmxlIFxcJycgKyB0YWJsZXMudmFsdWUubmFtZSArICdcXCcnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSB1aS50YWJsZUlucHV0KCdUYWJsZXMnLCBncm9rLnNoZWxsLnRhYmxlc1swXSwgZ3Jvay5zaGVsbC50YWJsZXMsICh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0U3NDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnU1MgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVTc0NvbHVtbihjb2xOYW1lKTtcbiAgICAgICAgICAgIHNzVmFyID0gY29sTmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlucHV0U3NDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0U3NDb2x1bW5EaXYuYXBwZW5kKGlucHV0U3NDb2x1bW4ucm9vdCk7XG4gICAgICAgIGNvbnN0IGlucHV0QXNDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnQVMgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVBc0NvbHVtbihjb2xOYW1lKTtcbiAgICAgICAgICAgIGFzVmFyID0gY29sTmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlucHV0QXNDb2x1bW5EaXYuYXBwZW5kKGlucHV0QXNDb2x1bW4ucm9vdCk7XG4gICAgICAgIGNvbnN0IGlucHV0SWRDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnSUQgQ29sdW1uJywgJycsIHQuY29sdW1ucy5uYW1lcygpLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVJZHNDb2x1bW4oY29sTmFtZSk7XG4gICAgICAgICAgICBpZFZhciA9IGNvbE5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpbnB1dElkQ29sdW1uRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBpbnB1dElkQ29sdW1uRGl2LmFwcGVuZChpbnB1dElkQ29sdW1uLnJvb3QpO1xuICAgIH0pO1xuICAgIGxldCBzc1ZhciA9ICcnO1xuICAgIGNvbnN0IGlucHV0U3NDb2x1bW4gPSB1aS5jaG9pY2VJbnB1dCgnU1MgQ29sdW1uJywgJycsIFtdLCAoY29sTmFtZSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZVNzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICBzc1ZhciA9IGNvbE5hbWU7XG4gICAgfSk7XG4gICAgaW5wdXRTc0NvbHVtbkRpdi5hcHBlbmQoaW5wdXRTc0NvbHVtbi5yb290KTtcbiAgICBsZXQgYXNWYXIgPSAnJztcbiAgICBjb25zdCBpbnB1dEFzQ29sdW1uID0gdWkuY2hvaWNlSW5wdXQoJ0FTIENvbHVtbicsICcnLCBbXSwgKGNvbE5hbWUpID0+IHtcbiAgICAgICAgdmFsaWRhdGVBc0NvbHVtbihjb2xOYW1lKTtcbiAgICAgICAgYXNWYXIgPSBjb2xOYW1lO1xuICAgIH0pO1xuICAgIGlucHV0QXNDb2x1bW5EaXYuYXBwZW5kKGlucHV0QXNDb2x1bW4ucm9vdCk7XG4gICAgbGV0IGlkVmFyID0gJyc7XG4gICAgY29uc3QgaW5wdXRJZENvbHVtbiA9IHVpLmNob2ljZUlucHV0KCdJRCBDb2x1bW4nLCAnJywgW10sIChjb2xOYW1lKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlSWRzQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgICBpZFZhciA9IGNvbE5hbWU7XG4gICAgfSk7XG4gICAgaW5wdXRJZENvbHVtbkRpdi5hcHBlbmQoaW5wdXRJZENvbHVtbi5yb290KTtcbiAgICB1cGRhdGVQYXR0ZXJuc0xpc3QoKTtcbiAgICBjb25zdCBzZXF1ZW5jZUJhc2UgPSB1aS5jaG9pY2VJbnB1dCgnU2VxdWVuY2UgQmFzaXMnLCBkZWZhdWx0QmFzZSwgYmFzZUNob2ljZXMsICh2KSA9PiB7XG4gICAgICAgIHVwZGF0ZUJhc2VzKHYpO1xuICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IGZ1bGx5UHRvID0gdWkuYm9vbElucHV0KCdGdWxseSBQVE8nLCBkZWZhdWx0UHRvLCAodikgPT4ge1xuICAgICAgICBmaXJzdFNzUHRvLnZhbHVlID0gdjtcbiAgICAgICAgZmlyc3RBc1B0by52YWx1ZSA9IHY7XG4gICAgICAgIHVwZGF0ZVB0byh2KTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBmaXJzdFNzUHRvID0gdWkuYm9vbElucHV0KCdGaXJzdCBTUyBQVE8nLCBmdWxseVB0by52YWx1ZSwgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIGZpcnN0U3NQdG8uc2V0VG9vbHRpcCgncHMgbGlua2FnZSBiZWZvcmUgZmlyc3QgbnVjbGVvdGlkZSBvZiBzZW5zZSBzdHJhbmQnKTtcbiAgICBjb25zdCBmaXJzdEFzUHRvID0gdWkuYm9vbElucHV0KCdGaXJzdCBBUyBQVE8nLCBmdWxseVB0by52YWx1ZSwgKCkgPT4gdXBkYXRlU3ZnU2NoZW1lKCkpO1xuICAgIGZpcnN0QXNQdG8uc2V0VG9vbHRpcCgncHMgbGlua2FnZSBiZWZvcmUgZmlyc3QgbnVjbGVvdGlkZSBvZiBhbnRpc2Vuc2Ugc3RyYW5kJyk7XG4gICAgZmlyc3RBc1B0b0Rpdi5hcHBlbmQoZmlyc3RBc1B0by5yb290KTtcbiAgICBjb25zdCBjcmVhdGVBc1N0cmFuZCA9IHVpLmJvb2xJbnB1dCgnQ3JlYXRlIEFTIFN0cmFuZCcsIHRydWUsICh2KSA9PiB7XG4gICAgICAgIGFzTW9kaWZpY2F0aW9uU2VjdGlvbi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBpbnB1dEFzQ29sdW1uRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzTGVuZ3RoRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzTW9kaWZpY2F0aW9uRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIGFzRXhhbXBsZURpdi5oaWRkZW4gPSAoIXYpO1xuICAgICAgICBmaXJzdEFzUHRvRGl2LmhpZGRlbiA9ICghdik7XG4gICAgICAgIHVwZGF0ZVN2Z1NjaGVtZSgpO1xuICAgIH0pO1xuICAgIGNyZWF0ZUFzU3RyYW5kLnNldFRvb2x0aXAoJ0NyZWF0ZSBhbnRpc2Vuc2Ugc3RyYW5kIHNlY3Rpb25zIG9uIFNWRyBhbmQgdGFibGUgdG8gdGhlIHJpZ2h0Jyk7XG4gICAgY29uc3Qgc2F2ZUFzID0gdWkudGV4dElucHV0KCdTYXZlIEFzJywgJ1BhdHRlcm4gTmFtZScsICgpID0+IHVwZGF0ZVN2Z1NjaGVtZSgpKTtcbiAgICBzYXZlQXMuc2V0VG9vbHRpcCgnTmFtZSBPZiBOZXcgUGF0dGVybicpO1xuICAgIGNvbnN0IHNzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgU1MgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBzc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnU1MgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBzc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBTUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGNvbnN0IGFzVGhyZWVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgM1xcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc1RocmVlTW9kaWZpY2F0aW9uLnNldFRvb2x0aXAoJ0FkZGl0aW9uYWwgQVMgM1xcJyBNb2RpZmljYXRpb24nKTtcbiAgICBjb25zdCBhc0ZpdmVNb2RpZmljYXRpb24gPSB1aS5zdHJpbmdJbnB1dCgnQVMgNVxcJyBNb2RpZmljYXRpb24nLCAnJywgKCkgPT4ge1xuICAgICAgICB1cGRhdGVTdmdTY2hlbWUoKTtcbiAgICAgICAgdXBkYXRlT3V0cHV0RXhhbXBsZXMoKTtcbiAgICB9KTtcbiAgICBhc0ZpdmVNb2RpZmljYXRpb24uc2V0VG9vbHRpcCgnQWRkaXRpb25hbCBBUyA1XFwnIE1vZGlmaWNhdGlvbicpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc1RocmVlTW9kaWZpY2F0aW9uLnJvb3QpO1xuICAgIGFzTW9kaWZpY2F0aW9uRGl2LmFwcGVuZChhc0ZpdmVNb2RpZmljYXRpb24ucm9vdCk7XG4gICAgY29uc3QgY29tbWVudCA9IHVpLnRleHRJbnB1dCgnQ29tbWVudCcsICcnLCAoKSA9PiB1cGRhdGVTdmdTY2hlbWUoKSk7XG4gICAgY29uc3Qgc2F2ZVBhdHRlcm5CdXR0b24gPSB1aS5idXR0b24oJ1NhdmUnLCAoKSA9PiB7XG4gICAgICAgIGlmIChzYXZlQXMudmFsdWUgIT0gJycpXG4gICAgICAgICAgICBzYXZlUGF0dGVybigpLnRoZW4oKHIpID0+IGdyb2suc2hlbGwuaW5mbygnUGF0dGVybiBzYXZlZCcpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdWkuc3RyaW5nSW5wdXQoJ0VudGVyIE5hbWUnLCAnJyk7XG4gICAgICAgICAgICB1aS5kaWFsb2coJ1BhdHRlcm4gTmFtZScpXG4gICAgICAgICAgICAgICAgLmFkZChuYW1lLnJvb3QpXG4gICAgICAgICAgICAgICAgLm9uT0soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNhdmVBcy52YWx1ZSA9IG5hbWUudmFsdWU7XG4gICAgICAgICAgICAgICAgc2F2ZVBhdHRlcm4oKS50aGVuKChyKSA9PiBncm9rLnNoZWxsLmluZm8oJ1BhdHRlcm4gc2F2ZWQnKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0U2VxdWVuY2VCdXR0b24gPSB1aS5idXR0b24oJ0NvbnZlcnQgU2VxdWVuY2VzJywgKCkgPT4ge1xuICAgICAgICBpZiAoc3NWYXIgPT0gJycgfHwgKGNyZWF0ZUFzU3RyYW5kLnZhbHVlICYmIGFzVmFyID09ICcnKSlcbiAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygnUGxlYXNlIHNlbGVjdCB0YWJsZSBhbmQgY29sdW1ucyBvbiB3aGljaCB0byBhcHBseSBwYXR0ZXJuJyk7XG4gICAgICAgIGVsc2UgaWYgKHNzTGVuZ3RoLnZhbHVlICE9IHNzSW5wdXRFeGFtcGxlLnZhbHVlLmxlbmd0aCB8fCBhc0xlbmd0aC52YWx1ZSAhPSBhc0lucHV0RXhhbXBsZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHVpLmRpYWxvZygnTGVuZ3RoIE1pc21hdGNoJyk7XG4gICAgICAgICAgICAkKGRpYWxvZy5nZXRCdXR0b24oJ09LJykpLmhpZGUoKTtcbiAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgIC5hZGQodWkuZGl2VGV4dCgnTGVuZ3RoIG9mIHNlcXVlbmNlcyBpbiBjb2x1bW5zIGRvZXNuXFwndCBtYXRjaCBlbnRlcmVkIGxlbmd0aC4gVXBkYXRlIGxlbmd0aCB2YWx1ZT8nKSlcbiAgICAgICAgICAgICAgICAuYWRkQnV0dG9uKCdZRVMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3NMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuZ2V0Q29sKGlucHV0U3NDb2x1bW4udmFsdWUpLmdldFN0cmluZygwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYXNMZW5ndGgudmFsdWUgPSB0YWJsZXMudmFsdWUuZ2V0Q29sKGlucHV0QXNDb2x1bW4udmFsdWUpLmdldFN0cmluZygwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaWRWYXIgIT0gJycpXG4gICAgICAgICAgICAgICAgYWRkQ29sdW1uV2l0aElkcyh0YWJsZXMudmFsdWUubmFtZSwgaWRWYXIsIGdldFNob3J0TmFtZShzYXZlQXMudmFsdWUpKTtcbiAgICAgICAgICAgIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlcy52YWx1ZS5uYW1lLCBzc1Zhciwgc3NCYXNlcywgc3NQdG9MaW5rYWdlcywgc3NGaXZlTW9kaWZpY2F0aW9uLCBzc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVBc1N0cmFuZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZENvbHVtbldpdGhUcmFuc2xhdGVkU2VxdWVuY2VzKHRhYmxlcy52YWx1ZS5uYW1lLCBhc1ZhciwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdEFzUHRvLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb2suc2hlbGwudiA9IGdyb2suc2hlbGwuZ2V0VGFibGVWaWV3KHRhYmxlcy52YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgIGdyb2suc2hlbGwuaW5mbygoKGNyZWF0ZUFzU3RyYW5kLnZhbHVlKSA/ICdDb2x1bW5zIHdlcmUnIDogJ0NvbHVtbiB3YXMnKSArXG4gICAgICAgICAgICAgICAgJyBhZGRlZCB0byB0YWJsZSBcXCcnICsgdGFibGVzLnZhbHVlLm5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICB1cGRhdGVPdXRwdXRFeGFtcGxlcygpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3NJbnB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJ1NlbnNlIFN0cmFuZCcsIGdlbmVyYXRlRXhhbXBsZShzc0xlbmd0aC52YWx1ZSwgc2VxdWVuY2VCYXNlLnZhbHVlKSk7XG4gICAgY29uc3Qgc3NPdXRwdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCcgJywgdHJhbnNsYXRlU2VxdWVuY2Uoc3NJbnB1dEV4YW1wbGUudmFsdWUsIHNzQmFzZXMsIHNzUHRvTGlua2FnZXMsIHNzVGhyZWVNb2RpZmljYXRpb24sIHNzRml2ZU1vZGlmaWNhdGlvbiwgZmlyc3RTc1B0by52YWx1ZSkpO1xuICAgIHNzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLnJlc2l6ZSA9ICdub25lJztcbiAgICBzc0lucHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICBzc091dHB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5taW5XaWR0aCA9IGV4YW1wbGVNaW5XaWR0aDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc3NPdXRwdXRFeGFtcGxlLmlucHV0LmRpc2FibGVkID0gJ3RydWUnO1xuICAgIHNzT3V0cHV0RXhhbXBsZS5yb290LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICB1aS5idXR0b24odWkuaWNvbkZBKCdjb3B5JywgKCkgPT4geyB9KSwgKCkgPT4ge1xuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3NPdXRwdXRFeGFtcGxlLnZhbHVlKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbygnU2VxdWVuY2Ugd2FzIGNvcGllZCB0byBjbGlwYm9hcmQnKSk7XG4gICAgICAgIH0pLFxuICAgIF0sICd1aS1pbnB1dC1vcHRpb25zJykpO1xuICAgIGNvbnN0IGFzSW5wdXRFeGFtcGxlID0gdWkudGV4dElucHV0KCdBbnRpc2Vuc2UgU3RyYW5kJywgZ2VuZXJhdGVFeGFtcGxlKGFzTGVuZ3RoLnZhbHVlLCBzZXF1ZW5jZUJhc2UudmFsdWUpKTtcbiAgICBjb25zdCBhc091dHB1dEV4YW1wbGUgPSB1aS50ZXh0SW5wdXQoJyAnLCB0cmFuc2xhdGVTZXF1ZW5jZShhc0lucHV0RXhhbXBsZS52YWx1ZSwgYXNCYXNlcywgYXNQdG9MaW5rYWdlcywgYXNGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBmaXJzdFNzUHRvLnZhbHVlKSk7XG4gICAgYXNJbnB1dEV4YW1wbGUuaW5wdXQuc3R5bGUucmVzaXplID0gJ25vbmUnO1xuICAgIGFzSW5wdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIGFzT3V0cHV0RXhhbXBsZS5pbnB1dC5zdHlsZS5yZXNpemUgPSAnbm9uZSc7XG4gICAgYXNPdXRwdXRFeGFtcGxlLmlucHV0LnN0eWxlLm1pbldpZHRoID0gZXhhbXBsZU1pbldpZHRoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhc091dHB1dEV4YW1wbGUuaW5wdXQuZGlzYWJsZWQgPSAndHJ1ZSc7XG4gICAgYXNPdXRwdXRFeGFtcGxlLnJvb3QuYXBwZW5kKHVpLmRpdihbXG4gICAgICAgIHVpLmJ1dHRvbih1aS5pY29uRkEoJ2NvcHknLCAoKSA9PiB7IH0pLCAoKSA9PiB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChhc091dHB1dEV4YW1wbGUudmFsdWUpLnRoZW4oKCkgPT4gZ3Jvay5zaGVsbC5pbmZvKCdTZXF1ZW5jZSB3YXMgY29waWVkIHRvIGNsaXBib2FyZCcpKTtcbiAgICAgICAgfSksXG4gICAgXSwgJ3VpLWlucHV0LW9wdGlvbnMnKSk7XG4gICAgYXNFeGFtcGxlRGl2LmFwcGVuZChhc0lucHV0RXhhbXBsZS5yb290KTtcbiAgICBhc0V4YW1wbGVEaXYuYXBwZW5kKGFzT3V0cHV0RXhhbXBsZS5yb290KTtcbiAgICB1cGRhdGVVaUZvck5ld1NlcXVlbmNlTGVuZ3RoKCk7XG4gICAgY29uc3QgZXhhbXBsZVNlY3Rpb24gPSB1aS5kaXYoW1xuICAgICAgICB1aS5oMSgnRXhhbXBsZScpLFxuICAgICAgICBzc0lucHV0RXhhbXBsZS5yb290LFxuICAgICAgICBzc091dHB1dEV4YW1wbGUucm9vdCxcbiAgICAgICAgYXNFeGFtcGxlRGl2LFxuICAgIF0sICd1aS1mb3JtJyk7XG4gICAgY29uc3QgaW5wdXRzU2VjdGlvbiA9IHVpLmRpdihbXG4gICAgICAgIHVpLmgxKCdJbnB1dHMnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICB0YWJsZXMucm9vdCxcbiAgICAgICAgICAgIGlucHV0U3NDb2x1bW5EaXYsXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIGlucHV0QXNDb2x1bW5EaXYsXG4gICAgICAgICAgICBpbnB1dElkQ29sdW1uRGl2LFxuICAgICAgICBdKSxcbiAgICAgICAgdWkuYnV0dG9uc0lucHV0KFtcbiAgICAgICAgICAgIGNvbnZlcnRTZXF1ZW5jZUJ1dHRvbixcbiAgICAgICAgXSksXG4gICAgXSwgJ3VpLWZvcm0nKTtcbiAgICBjb25zdCBkb3dubG9hZEJ1dHRvbiA9IHVpLmJ1dHRvbignRG93bmxvYWQnLCAoKSA9PiBzdmcuc2F2ZVN2Z0FzUG5nKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteVN2ZycpLCBzYXZlQXMudmFsdWUsIHsgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnIH0pKTtcbiAgICBjb25zdCBtYWluU2VjdGlvbiA9IHVpLnBhbmVsKFtcbiAgICAgICAgdWkuYmxvY2soW1xuICAgICAgICAgICAgc3ZnRGl2LFxuICAgICAgICBdLCB7IHN0eWxlOiB7IG92ZXJmbG93WDogJ3Njcm9sbCcgfSB9KSxcbiAgICAgICAgZG93bmxvYWRCdXR0b24sXG4gICAgICAgIGlzRW51bWVyYXRlTW9kaWZpY2F0aW9uc0RpdixcbiAgICAgICAgdWkuZGl2KFtcbiAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdQYXR0ZXJuJyksXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5pY29uRkEoJ3F1ZXN0aW9uLWNpcmNsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24uaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQXhvbGFic0Rlc2NyaXB0aW9uLmFwcGVuZChpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdLCB7IHN0eWxlOiB7IHBhZGRpbmc6ICcycHgnIH0gfSksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICBzc0xlbmd0aC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNMZW5ndGhEaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUJhc2Uucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRQYXR0ZXJuRGl2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUFzLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5idXR0b25zSW5wdXQoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVQYXR0ZXJuQnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVBc1N0cmFuZC5yb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlQdG8ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3NQdG8ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QXNQdG9EaXYsXG4gICAgICAgICAgICAgICAgICAgICAgICBzc0ZpdmVNb2RpZmljYXRpb24ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNzVGhyZWVNb2RpZmljYXRpb24ucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uRGl2LFxuICAgICAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgICAgIF0sICd1aS1mb3JtJyksXG4gICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgaW5wdXRzU2VjdGlvbixcbiAgICAgICAgICAgIGV4YW1wbGVTZWN0aW9uLFxuICAgICAgICBdLCB7IHN0eWxlOiB7IGZsZXhXcmFwOiAnd3JhcCcgfSB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBzc01vZGlmaWNhdGlvblNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmgxKCdTZW5zZSBTdHJhbmQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgICB1aS5kaXYoW3VpLmRpdlRleHQoJyMnKV0sIHsgc3R5bGU6IHsgd2lkdGg6ICcyMHB4JyB9IH0pLFxuICAgICAgICAgICAgdWkuYmxvY2s3NShbdWkuZGl2VGV4dCgnTW9kaWZpY2F0aW9uJyldKSxcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnUFRPJyldLCB7IHN0eWxlOiB7IHBhZGRpbmdSaWdodDogJzhweCcgfSB9KSxcbiAgICAgICAgXSksXG4gICAgICAgIHNzTW9kaWZpY2F0aW9uSXRlbXMsXG4gICAgXSk7XG4gICAgY29uc3QgYXNNb2RpZmljYXRpb25TZWN0aW9uID0gdWkucGFuZWwoW1xuICAgICAgICB1aS5oMSgnQW50aXNlbnNlIFN0cmFuZCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgIHVpLmRpdihbdWkuZGl2VGV4dCgnIycpXSwgeyBzdHlsZTogeyB3aWR0aDogJzIwcHgnIH0gfSksXG4gICAgICAgICAgICB1aS5ibG9jazc1KFt1aS5kaXZUZXh0KCdNb2RpZmljYXRpb24nKV0pLFxuICAgICAgICAgICAgdWkuZGl2KFt1aS5kaXZUZXh0KCdQVE8nKV0sIHsgc3R5bGU6IHsgcGFkZGluZ1JpZ2h0OiAnOHB4JyB9IH0pLFxuICAgICAgICBdKSxcbiAgICAgICAgYXNNb2RpZmljYXRpb25JdGVtcyxcbiAgICBdKTtcbiAgICBjb25zdCBpbmZvID0gdWkuaW5mbyhbXG4gICAgICAgIHVpLmRpdlRleHQoJ1xcbiBIb3cgdG8gZGVmaW5lIG5ldyBwYXR0ZXJuOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMS4gQ2hvb3NlIHRhYmxlIGFuZCBjb2x1bW5zIHdpdGggc2Vuc2UgYW5kIGFudGlzZW5zZSBzdHJhbmRzJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIENob29zZSBsZW5ndGhzIG9mIGJvdGggc3RyYW5kcyBieSBlZGl0aW5nIGNoZWNrYm94ZXMgYmVsb3cnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnMy4gQ2hvb3NlIGJhc2lzIGFuZCBQVE8gc3RhdHVzIGZvciBlYWNoIG51Y2xlb3RpZGUnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnNC4gU2V0IGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBmb3Igc2VxdWVuY2UgZWRnZXMnKSxcbiAgICAgICAgdWkuZGl2VGV4dCgnNS4gUHJlc3MgXFwnQ29udmVydCBTZXF1ZW5jZXNcXCcgYnV0dG9uJyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4ocykgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDcmVhdGUgYW5kIGFwcGx5IEF4b2xhYnMgdHJhbnNsYXRpb24gcGF0dGVybnMuJyk7XG4gICAgcmV0dXJuIHVpLnNwbGl0SChbXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICBhcHBBeG9sYWJzRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBtYWluU2VjdGlvbixcbiAgICAgICAgXSksXG4gICAgICAgIHVpLmJveCh1aS5kaXZIKFtcbiAgICAgICAgICAgIHNzTW9kaWZpY2F0aW9uU2VjdGlvbixcbiAgICAgICAgICAgIGFzTW9kaWZpY2F0aW9uU2VjdGlvbixcbiAgICAgICAgXSksIHsgc3R5bGU6IHsgbWF4V2lkdGg6ICczNjBweCcgfSB9KSxcbiAgICBdKTtcbn1cbiIsImltcG9ydCB7IGF4b2xhYnNNYXAgfSBmcm9tICcuL2NvbnN0YW50cyc7XG4vLyBodHRwczovL3V4ZGVzaWduLmNjL3N0YXItcmF0aW5nLW1ha2Utc3ZnLWdyZWF0LWFnYWluLWQ0Y2U0NzMxMzQ3ZVxuZnVuY3Rpb24gZ2V0UG9pbnRzVG9EcmF3U3RhcihjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgY29uc3QgaW5uZXJDaXJjbGVQb2ludHMgPSA1OyAvLyBhIDUgcG9pbnQgc3RhclxuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gMTUgLyBpbm5lckNpcmNsZVBvaW50cztcbiAgICBjb25zdCBpbm5lck91dGVyUmFkaXVzUmF0aW8gPSAyOyAvLyBvdXR0ZXIgY2lyY2xlIGlzIHgyIHRoZSBpbm5lclxuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gaW5uZXJSYWRpdXMgKiBpbm5lck91dGVyUmFkaXVzUmF0aW87XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLlBJIC8gaW5uZXJDaXJjbGVQb2ludHM7XG4gICAgY29uc3QgYW5nbGVPZmZzZXRUb0NlbnRlclN0YXIgPSA2MDtcbiAgICBjb25zdCB0b3RhbE51bWJlck9mUG9pbnRzID0gaW5uZXJDaXJjbGVQb2ludHMgKiAyOyAvLyAxMCBpbiBhIDUtcG9pbnRzIHN0YXJcbiAgICBsZXQgcG9pbnRzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbE51bWJlck9mUG9pbnRzOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IChpICUgMiA9PSAwKSA/IG91dGVyUmFkaXVzIDogaW5uZXJSYWRpdXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRYID0gY2VudGVyWCArIE1hdGguY29zKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZID0gY2VudGVyWSArIE1hdGguc2luKGkgKiBhbmdsZSArIGFuZ2xlT2Zmc2V0VG9DZW50ZXJTdGFyKSAqIHI7XG4gICAgICAgIHBvaW50cyArPSBjdXJyZW50WCArICcsJyArIGN1cnJlbnRZICsgJyAnO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuZnVuY3Rpb24gY291bnRPdmVyaGFuZ3NPblRoZVJpZ2h0RWRnZShtb2RpZmljYXRpb25zKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbW9kaWZpY2F0aW9ucy5sZW5ndGggJiYgbW9kaWZpY2F0aW9uc1tpXS5zbGljZSgtMykgPT0gJyhvKScpXG4gICAgICAgIGkrKztcbiAgICByZXR1cm4gKGkgPT0gbW9kaWZpY2F0aW9ucy5sZW5ndGggLSAxKSA/IDAgOiBpO1xufVxuZnVuY3Rpb24gZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29udGV4dC5mb250ID0gU3RyaW5nKGZvbnQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gMiAqIGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG59XG5mdW5jdGlvbiBnZXRUZXh0SW5zaWRlQ2lyY2xlKGJhc2VzLCBpbmRleCkge1xuICAgIHJldHVybiAoYmFzZXNbaW5kZXhdLnNsaWNlKC0zKSA9PSAnKG8pJyB8fCAhWydBJywgJ0cnLCAnQycsICdVJywgJ1QnXS5pbmNsdWRlcyhiYXNlc1tpbmRleF0pKSA/ICcnIDogYmFzZXNbaW5kZXhdO1xufVxuZnVuY3Rpb24gZ2V0Rm9udENvbG9yVmlzaWJsZU9uQmFja2dyb3VuZChyZ2JTdHJpbmcpIHtcbiAgICBjb25zdCByZ2JJbnRMaXN0ID0gcmdiU3RyaW5nLm1hdGNoKC9cXGQrL2cpLm1hcCgoZSkgPT4gTnVtYmVyKGUpKTtcbiAgICByZXR1cm4gKHJnYkludExpc3RbMF0gKiAwLjI5OSArIHJnYkludExpc3RbMV0gKiAwLjU4NyArIHJnYkludExpc3RbMl0gKiAwLjExNCkgPiAxODYgPyAnIzMzMzMzJyA6ICcjZmZmZmZmJztcbn1cbmZ1bmN0aW9uIGdldEJhc2VDb2xvcihiYXNlKSB7XG4gICAgcmV0dXJuIGF4b2xhYnNNYXBbYmFzZV1bJ2NvbG9yJ107XG59XG5leHBvcnQgZnVuY3Rpb24gZHJhd0F4b2xhYnNQYXR0ZXJuKHBhdHRlcm5OYW1lLCBhc0V4aXN0cywgc3NCYXNlcywgYXNCYXNlcywgc3NQdG9TdGF0dXNlcywgYXNQdG9TdGF0dXNlcywgc3NUaHJlZU1vZGlmaWNhdGlvbiwgc3NGaXZlTW9kaWZpY2F0aW9uLCBhc1RocmVlTW9kaWZpY2F0aW9uLCBhc0ZpdmVNb2RpZmljYXRpb24sIGNvbW1lbnQsIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGluZGV4ICsgc3RhcnRGcm9tKSAqIHdpZHRoIC8gKHVuaXF1ZUJhc2VzLmxlbmd0aCArIHN0YXJ0RnJvbSkgKyBsZWdlbmRSYWRpdXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRYT2ZCYXNlQ2lyY2xlcyhpbmRleCwgcmlnaHRPdmVyaGFuZ3MpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoT2ZSaWdodE1vZGlmaWNhdGlvbiArXG4gICAgICAgICAgICAocmVzdWx0aW5nTnVtYmVyT2ZOdWNsZW90aWRlc0luU3RyYW5kcyAtIGluZGV4ICsgcmlnaHRPdmVyaGFuZ3MgKyAxKSAqIGJhc2VEaWFtZXRlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKGJhc2VzLCBnZW5lcmFsSW5kZXgsIG51Y2xlb3RpZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gKG51Y2xlb3RpZGVJbmRleCA8IDEwIHx8IFsnQScsICdHJywgJ0MnLCAnVScsICdUJ10uXG4gICAgICAgICAgICBpbmNsdWRlcyhiYXNlc1tnZW5lcmFsSW5kZXhdKSkgPyBzaGlmdFRvQWxpZ25PbmVEaWdpdE51bWJlckluc2lkZUNpcmNsZSA6IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlO1xuICAgIH1cbiAgICBjb25zdCBzdmcgPSB7XG4gICAgICAgIHhtbG5zOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsICdzdmcnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdpZCcsICdteVN2ZycpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHdpZHRoKSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKGhlaWdodCkpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNpcmNsZTogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ2NpcmNsZScpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2N4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjeScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgncicsIFN0cmluZyhyYWRpdXMpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0ZXh0LCB4LCB5LCBmb250U2l6ZSwgY29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3RleHQnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd4JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCBTdHJpbmcoZm9udFNpemUpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LXdlaWdodCcsICdub3JtYWwnKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsICdBcmlhbCcpO1xuICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICBlLmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcjogZnVuY3Rpb24gKHgsIHksIGZpbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy54bWxucywgJ3BvbHlnb24nKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBnZXRQb2ludHNUb0RyYXdTdGFyKHgsIHkpKTtcbiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdmaWxsJywgZmlsbCk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHNzQmFzZXMgPSBzc0Jhc2VzLnJldmVyc2UoKTtcbiAgICBzc1B0b1N0YXR1c2VzID0gc3NQdG9TdGF0dXNlcy5yZXZlcnNlKCk7XG4gICAgY29uc3QgYmFzZVJhZGl1cyA9IDE1O1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnblR3b0RpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTEwO1xuICAgIGNvbnN0IHNoaWZ0VG9BbGlnbk9uZURpZ2l0TnVtYmVySW5zaWRlQ2lyY2xlID0gLTU7XG4gICAgY29uc3QgbGVnZW5kUmFkaXVzID0gNjtcbiAgICBjb25zdCBwc0xpbmthZ2VSYWRpdXMgPSA1O1xuICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IDE3O1xuICAgIGNvbnN0IGxlZ2VuZEZvbnRTaXplID0gMTQ7XG4gICAgY29uc3QgcHNMaW5rYWdlQ29sb3IgPSAncmVkJztcbiAgICBjb25zdCBmb250Q29sb3IgPSAndmFyKC0tZ3JleS02KSc7XG4gICAgY29uc3QgdGl0bGVGb250Q29sb3IgPSAnYmxhY2snO1xuICAgIGNvbnN0IG1vZGlmaWNhdGlvbnNDb2xvciA9ICdyZWQnO1xuICAgIGNvbnN0IHNzTGVmdFRleHQgPSAnU1M6IDVcXCcnO1xuICAgIGNvbnN0IGFzTGVmdFRleHQgPSAnQVM6IDNcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRUZXh0ID0gJzNcXCcnO1xuICAgIGNvbnN0IGFzUmlnaHRUZXh0ID0gJzVcXCcnO1xuICAgIGNvbnN0IHNzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKHNzQmFzZXMpO1xuICAgIGNvbnN0IGFzUmlnaHRPdmVyaGFuZ3MgPSBjb3VudE92ZXJoYW5nc09uVGhlUmlnaHRFZGdlKGFzQmFzZXMpO1xuICAgIGNvbnN0IHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgPSBNYXRoLm1heChzc0Jhc2VzLmxlbmd0aCAtIHNzUmlnaHRPdmVyaGFuZ3MsIGFzQmFzZXMubGVuZ3RoIC0gYXNSaWdodE92ZXJoYW5ncyk7XG4gICAgY29uc3QgYmFzZURpYW1ldGVyID0gMiAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3Qgd2lkdGhPZkJhc2VzID0gYmFzZURpYW1ldGVyICogKHJlc3VsdGluZ051bWJlck9mTnVjbGVvdGlkZXNJblN0cmFuZHMgKyBNYXRoLm1heChzc1JpZ2h0T3ZlcmhhbmdzLCBhc1JpZ2h0T3ZlcmhhbmdzKSk7XG4gICAgY29uc3Qgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gPSBNYXRoLm1heChnZXRUZXh0V2lkdGgoc3NUaHJlZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uID0gTWF0aC5tYXgoZ2V0VGV4dFdpZHRoKHNzRml2ZU1vZGlmaWNhdGlvbiwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzVGhyZWVNb2RpZmljYXRpb24sIGJhc2VGb250U2l6ZSkpO1xuICAgIGNvbnN0IHdpZHRoT2ZMZWZ0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc0xlZnRUZXh0LCBiYXNlRm9udFNpemUpLCBnZXRUZXh0V2lkdGgoYXNMZWZ0VGV4dCwgYmFzZUZvbnRTaXplKSk7XG4gICAgY29uc3Qgd2lkdGhPZlJpZ2h0VGV4dCA9IE1hdGgubWF4KGdldFRleHRXaWR0aChzc1JpZ2h0VGV4dCwgYmFzZUZvbnRTaXplKSwgZ2V0VGV4dFdpZHRoKGFzUmlnaHRUZXh0LCBiYXNlRm9udFNpemUpKTtcbiAgICBjb25zdCB3aWR0aCA9IHdpZHRoT2ZMZWZ0VGV4dCArIHdpZHRoT2ZMZWZ0TW9kaWZpY2F0aW9uICsgd2lkdGhPZkJhc2VzICtcbiAgICAgICAgd2lkdGhPZlJpZ2h0TW9kaWZpY2F0aW9uICsgd2lkdGhPZlJpZ2h0VGV4dCArIGJhc2VEaWFtZXRlcjtcbiAgICBjb25zdCBoZWlnaHQgPSBhc0V4aXN0cyA/IDExICogYmFzZVJhZGl1cyA6IDkgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHhPZlRpdGxlID0gYmFzZVJhZGl1czsgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDQpLFxuICAgIGNvbnN0IHVuaXF1ZUJhc2VzID0gYXNFeGlzdHMgPyBbLi4ubmV3IFNldChzc0Jhc2VzLmNvbmNhdChhc0Jhc2VzKSldIDogWy4uLm5ldyBTZXQoc3NCYXNlcyldO1xuICAgIGNvbnN0IGlzUHRvRXhpc3QgPSBhc0V4aXN0cyA/IFsuLi5uZXcgU2V0KHNzUHRvU3RhdHVzZXMuY29uY2F0KGFzUHRvU3RhdHVzZXMpKV0uaW5jbHVkZXModHJ1ZSkgOlxuICAgICAgICBbLi4ubmV3IFNldChzc1B0b1N0YXR1c2VzKV0uaW5jbHVkZXModHJ1ZSk7XG4gICAgY29uc3Qgc3RhcnRGcm9tID0gaXNQdG9FeGlzdCA/IDEgOiAwO1xuICAgIGNvbnN0IHhPZkxlZnRUZXh0cyA9IDA7XG4gICAgY29uc3QgeE9mTGVmdE1vZGlmaWNhdGlvbnMgPSB4T2ZMZWZ0VGV4dHMgKyB3aWR0aE9mTGVmdFRleHQgLSA1O1xuICAgIGNvbnN0IHhPZlNzUmlnaHRNb2RpZmljYXRpb25zID0gc3NSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZkFzUmlnaHRNb2RpZmljYXRpb25zID0gYXNSaWdodE92ZXJoYW5ncyAqIGJhc2VEaWFtZXRlciArIGdldFhPZkJhc2VDaXJjbGVzKC0wLjUsIDApO1xuICAgIGNvbnN0IHhPZlJpZ2h0VGV4dHMgPSBNYXRoLm1heCh4T2ZTc1JpZ2h0TW9kaWZpY2F0aW9ucywgeE9mQXNSaWdodE1vZGlmaWNhdGlvbnMpICtcbiAgICAgICAgd2lkdGhPZkxlZnRNb2RpZmljYXRpb24gKyBiYXNlRGlhbWV0ZXIgKiAoTWF0aC5tYXgoc3NSaWdodE92ZXJoYW5ncywgYXNSaWdodE92ZXJoYW5ncykpO1xuICAgIGNvbnN0IHlPZlRpdGxlID0gYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc051bWJlcnMgPSAyICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc051bWJlcnMgPSA4LjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZlNzVGV4dHMgPSA0ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZBc1RleHRzID0gNyAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQ29tbWVudCA9IGFzRXhpc3RzID8gMTEgKiBiYXNlUmFkaXVzIDogOC41ICogYmFzZVJhZGl1cztcbiAgICBjb25zdCB5T2ZTc0NpcmNsZXMgPSAzLjUgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZkFzQ2lyY2xlcyA9IDYuNSAqIGJhc2VSYWRpdXM7XG4gICAgY29uc3QgeU9mQ2lyY2xlc0luTGVnZW5kcyA9IGFzRXhpc3RzID8gOS41ICogYmFzZVJhZGl1cyA6IDYgKiBiYXNlUmFkaXVzO1xuICAgIGNvbnN0IHlPZlRleHRMZWdlbmQgPSBhc0V4aXN0cyA/IDEwICogYmFzZVJhZGl1cyAtIDMgOiB5T2ZBc0NpcmNsZXMgLSAzO1xuICAgIGNvbnN0IGltYWdlID0gc3ZnLnJlbmRlcih3aWR0aCwgaGVpZ2h0KTtcbiAgICBpbWFnZS5hcHBlbmQoc3ZnLnRleHQoc3NMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNMZWZ0VGV4dCwgeE9mTGVmdFRleHRzLCB5T2ZBc1RleHRzLCBiYXNlRm9udFNpemUsIGZvbnRDb2xvcikgOiAnJywgc3ZnLnRleHQoc3NSaWdodFRleHQsIHhPZlJpZ2h0VGV4dHMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgZm9udENvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1JpZ2h0VGV4dCwgeE9mUmlnaHRUZXh0cywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBmb250Q29sb3IpIDogJycsIHN2Zy50ZXh0KHNzRml2ZU1vZGlmaWNhdGlvbiwgeE9mTGVmdE1vZGlmaWNhdGlvbnMsIHlPZlNzVGV4dHMsIGJhc2VGb250U2l6ZSwgbW9kaWZpY2F0aW9uc0NvbG9yKSwgYXNFeGlzdHMgPyBzdmcudGV4dChhc1RocmVlTW9kaWZpY2F0aW9uLCB4T2ZMZWZ0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KHNzVGhyZWVNb2RpZmljYXRpb24sIHhPZlNzUmlnaHRNb2RpZmljYXRpb25zLCB5T2ZTc1RleHRzLCBiYXNlRm9udFNpemUsIG1vZGlmaWNhdGlvbnNDb2xvciksIGFzRXhpc3RzID8gc3ZnLnRleHQoYXNGaXZlTW9kaWZpY2F0aW9uLCB4T2ZBc1JpZ2h0TW9kaWZpY2F0aW9ucywgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBtb2RpZmljYXRpb25zQ29sb3IpIDogJycsIHN2Zy50ZXh0KGNvbW1lbnQsIHhPZkxlZnRUZXh0cywgeU9mQ29tbWVudCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIGlzUHRvRXhpc3QgPyBzdmcuc3RhcihiYXNlUmFkaXVzLCB5T2ZDaXJjbGVzSW5MZWdlbmRzLCBwc0xpbmthZ2VDb2xvcikgOiAnJywgaXNQdG9FeGlzdCA/IHN2Zy50ZXh0KCdwcyBsaW5rYWdlJywgMiAqIGJhc2VSYWRpdXMgLSA4LCB5T2ZUZXh0TGVnZW5kLCBsZWdlbmRGb250U2l6ZSwgZm9udENvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZTc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZTc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGxldCBudWNsZW90aWRlQ291bnRlciA9IG51bWJlck9mU3NOdWNsZW90aWRlcztcbiAgICBmb3IgKGxldCBpID0gc3NCYXNlcy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICBjb25zdCB4T2ZOdW1iZXJzID0gZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKHNzQmFzZXMsIHNzQmFzZXMubGVuZ3RoIC0gaSwgbnVtYmVyT2ZTc051Y2xlb3RpZGVzIC0gbnVjbGVvdGlkZUNvdW50ZXIpO1xuICAgICAgICBpZiAoc3NCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICBudWNsZW90aWRlQ291bnRlci0tO1xuICAgICAgICBjb25zdCBuID0gKHNzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknICYmIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXMoc3NCYXNlc1tpXSkpID9cbiAgICAgICAgICAgIFN0cmluZyhudW1iZXJPZlNzTnVjbGVvdGlkZXMgLSBudWNsZW90aWRlQ291bnRlcikgOiAnJztcbiAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy50ZXh0KG4sIHhPZk51bWJlcnMsIHlPZlNzTnVtYmVycywgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgc3NSaWdodE92ZXJoYW5ncyksIHlPZlNzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKHNzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShzc0Jhc2VzLCBpKSwgeE9mTnVtYmVycywgeU9mU3NUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGdldEJhc2VDb2xvcihzc0Jhc2VzW2ldKSkpLCBzc1B0b1N0YXR1c2VzW2ldID9cbiAgICAgICAgICAgIHN2Zy5zdGFyKGdldFhPZkJhc2VDaXJjbGVzKGksIHNzUmlnaHRPdmVyaGFuZ3MpICsgYmFzZVJhZGl1cywgeU9mU3NUZXh0cyArIHBzTGlua2FnZVJhZGl1cywgcHNMaW5rYWdlQ29sb3IpIDpcbiAgICAgICAgICAgICcnKTtcbiAgICB9XG4gICAgaW1hZ2UuYXBwZW5kKHNzUHRvU3RhdHVzZXNbc3NCYXNlcy5sZW5ndGhdID9cbiAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoc3NCYXNlcy5sZW5ndGgsIHNzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZlNzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICBsZXQgbnVtYmVyT2ZBc051Y2xlb3RpZGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzQmFzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknKVxuICAgICAgICAgICAgbnVtYmVyT2ZBc051Y2xlb3RpZGVzKys7XG4gICAgfVxuICAgIGlmIChhc0V4aXN0cykge1xuICAgICAgICBsZXQgbnVjbGVvdGlkZUNvdW50ZXIgPSBudW1iZXJPZkFzTnVjbGVvdGlkZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSBhc0Jhc2VzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoYXNCYXNlc1tpXS5zbGljZSgtMykgIT0gJyhvKScpXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZUNvdW50ZXItLTtcbiAgICAgICAgICAgIGNvbnN0IHhPZk51bWJlcnMgPSBnZXRYT2ZCYXNlQ2lyY2xlcyhpLCBhc1JpZ2h0T3ZlcmhhbmdzKSArXG4gICAgICAgICAgICAgICAgZ2V0U2hpZnRUb0FsaWduTnVtYmVySW5zaWRlQ2lyY2xlKGFzQmFzZXMsIGksIG51Y2xlb3RpZGVDb3VudGVyICsgMSk7XG4gICAgICAgICAgICBjb25zdCBuID0gKGFzQmFzZXNbaV0uc2xpY2UoLTMpICE9ICcobyknICYmIGVudW1lcmF0ZU1vZGlmaWNhdGlvbnMuaW5jbHVkZXMoYXNCYXNlc1tpXSkpID9cbiAgICAgICAgICAgICAgICBTdHJpbmcobnVjbGVvdGlkZUNvdW50ZXIgKyAxKSA6ICcnO1xuICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKHN2Zy50ZXh0KG4sIHhPZk51bWJlcnMsIHlPZkFzTnVtYmVycywgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvciksIHN2Zy5jaXJjbGUoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncyksIHlPZkFzQ2lyY2xlcywgYmFzZVJhZGl1cywgZ2V0QmFzZUNvbG9yKGFzQmFzZXNbaV0pKSwgc3ZnLnRleHQoZ2V0VGV4dEluc2lkZUNpcmNsZShhc0Jhc2VzLCBpKSwgZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgKyBnZXRTaGlmdFRvQWxpZ25OdW1iZXJJbnNpZGVDaXJjbGUoYXNCYXNlcywgaSwgbnVjbGVvdGlkZUNvdW50ZXIgKyAxKSwgeU9mQXNUZXh0cywgYmFzZUZvbnRTaXplLCBnZXRGb250Q29sb3JWaXNpYmxlT25CYWNrZ3JvdW5kKGdldEJhc2VDb2xvcihhc0Jhc2VzW2ldKSkpLCBhc1B0b1N0YXR1c2VzW2ldID8gc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoaSwgYXNSaWdodE92ZXJoYW5ncykgK1xuICAgICAgICAgICAgICAgIGJhc2VSYWRpdXMsIHlPZkFzVGV4dHMgKyBwc0xpbmthZ2VSYWRpdXMsIHBzTGlua2FnZUNvbG9yKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpbWFnZS5hcHBlbmQoYXNQdG9TdGF0dXNlc1thc0Jhc2VzLmxlbmd0aF0gP1xuICAgICAgICAgICAgc3ZnLnN0YXIoZ2V0WE9mQmFzZUNpcmNsZXMoYXNCYXNlcy5sZW5ndGgsIGFzUmlnaHRPdmVyaGFuZ3MpICtcbiAgICAgICAgICAgICAgICBiYXNlUmFkaXVzLCB5T2ZBc1RleHRzICsgcHNMaW5rYWdlUmFkaXVzLCBwc0xpbmthZ2VDb2xvcikgOiAnJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlID0gcGF0dGVybk5hbWUgKyAnIGZvciAnICtcbiAgICAgICAgU3RyaW5nKG51bWJlck9mU3NOdWNsZW90aWRlcykgKyAoYXNFeGlzdHMgPyAnLycgKyBTdHJpbmcobnVtYmVyT2ZBc051Y2xlb3RpZGVzKSA6ICcnKSArICdtZXInO1xuICAgIGltYWdlLmFwcGVuZChzdmcudGV4dCh0aXRsZSwgeE9mVGl0bGUsIHlPZlRpdGxlLCBiYXNlRm9udFNpemUsIHRpdGxlRm9udENvbG9yKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmlxdWVCYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbWFnZS5hcHBlbmQoc3ZnLmNpcmNsZShnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSksIHlPZkNpcmNsZXNJbkxlZ2VuZHMsIGxlZ2VuZFJhZGl1cywgZ2V0QmFzZUNvbG9yKHVuaXF1ZUJhc2VzW2ldKSksIHN2Zy50ZXh0KHVuaXF1ZUJhc2VzW2ldLCBnZXRFcXVpZGlzdGFudFhGb3JMZWdlbmQoaSkgK1xuICAgICAgICAgICAgbGVnZW5kUmFkaXVzICsgNCwgeU9mVGV4dExlZ2VuZCwgbGVnZW5kRm9udFNpemUsIGZvbnRDb2xvcikpO1xuICAgIH1cbiAgICByZXR1cm4gaW1hZ2U7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDsgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW1zKSB7XG4gICAgcmV0dXJuICdbXCInICsgaXRlbXMuam9pbignXCIsIFwiJykgKyAnXCJdJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZChuYW1lLCBocmVmKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwnICsgaHJlZik7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgbmFtZSk7XG4gICAgZWxlbWVudC5jbGljaygpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtcHR5Um93cyh0LCBjb2xUb0NoZWNrKSB7XG4gICAgZm9yIChsZXQgaSA9IHQucm93Q291bnQgLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgICBpZiAoY29sVG9DaGVjay5nZXRTdHJpbmcoaSkgPT0gJycpXG4gICAgICAgICAgICB0LnJvd3MucmVtb3ZlQXQoaSwgMSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlT2ZUd29BcnJheXMoYSwgYikge1xuICAgIHJldHVybiBhLmZpbHRlcigoeCkgPT4gIWIuaW5jbHVkZXMoeCkpO1xufVxuIiwiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGNvbnZlcnRTZXF1ZW5jZSwgdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSwgaXNWYWxpZFNlcXVlbmNlIH0gZnJvbSAnLi4vc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBtYXAsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL21hcCc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvU21pbGVzLCBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0ICQgZnJvbSAnY2FzaC1kb20nO1xuaW1wb3J0IHsgZG93bmxvYWQgfSBmcm9tICcuLi9oZWxwZXJzJztcbmNvbnN0IGRlZmF1bHRJbnB1dCA9ICdmQW1DbUdtQW1DcHNtVSc7XG5jb25zdCBzZXF1ZW5jZVdhc0NvcGllZCA9ICdDb3BpZWQnO1xuY29uc3QgdG9vbHRpcFNlcXVlbmNlID0gJ0NvcHkgc2VxdWVuY2UnO1xuZXhwb3J0IGZ1bmN0aW9uIG1haW5WaWV3KCkge1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlQW5kTW9sZWN1bGUoc2VxdWVuY2UsIGlucHV0Rm9ybWF0KSB7XG4gICAgICAgIG1vbGVjdWxlU3ZnRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgICBvdXRwdXRUYWJsZURpdi5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgY29uc3QgcGkgPSBERy5UYXNrQmFyUHJvZ3Jlc3NJbmRpY2F0b3IuY3JlYXRlKCdSZW5kZXJpbmcgdGFibGUgYW5kIG1vbGVjdWxlLi4uJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXF1ZW5jZSA9IHNlcXVlbmNlLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIG51bGwpO1xuICAgICAgICAgICAgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSA9IG91dHB1dC5zeW50aGVzaXplclswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFNlcXVlbmNlT2JqID0gY29udmVydFNlcXVlbmNlKHNlcXVlbmNlLCBvdXRwdXQpO1xuICAgICAgICAgICAgY29uc3QgdGFibGVSb3dzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdXRwdXRTZXF1ZW5jZU9iaikuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAoJ2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcicgaW4gb3V0cHV0U2VxdWVuY2VPYmopID9cbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShvdXRwdXRTZXF1ZW5jZU9iai5pbmRleE9mRmlyc3ROb3RWYWxpZENoYXIpLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA6XG4gICAgICAgICAgICAgICAgICAgIC0xO1xuICAgICAgICAgICAgICAgIHRhYmxlUm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogKCdpbmRleE9mRmlyc3ROb3RWYWxpZENoYXInIGluIG91dHB1dFNlcXVlbmNlT2JqKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKDAsIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdncmV5JyB9IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLnRvb2x0aXAuYmluZCh1aS5kaXZUZXh0KHNlcXVlbmNlLnNsaWNlKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciksIHsgc3R5bGU6IHsgY29sb3I6ICdyZWQnIH0gfSksICdFeHBlY3RlZCBmb3JtYXQ6ICcgKyBKU09OLnBhcnNlKG91dHB1dFNlcXVlbmNlT2JqLmluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcikuc3ludGhlc2l6ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLiBTZWUgdGFibGVzIHdpdGggdmFsaWQgY29kZXMgb24gdGhlIHJpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSA6IC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdWkubGluayhvdXRwdXRTZXF1ZW5jZU9ialtrZXldLCAoKSA9PiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChvdXRwdXRTZXF1ZW5jZU9ialtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpLCB0b29sdGlwU2VxdWVuY2UsICcnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFRhYmxlRGl2LmFwcGVuZCh1aS5kaXYoW1xuICAgICAgICAgICAgICAgIERHLkh0bWxUYWJsZS5jcmVhdGUodGFibGVSb3dzLCAoaXRlbSkgPT4gW2l0ZW0ua2V5LCBpdGVtLnZhbHVlXSwgWydDb2RlJywgJ1NlcXVlbmNlJ10pLnJvb3QsXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBpZiAob3V0cHV0U2VxdWVuY2VPYmoudHlwZSAhPSB1bmRlZmluZWRJbnB1dFNlcXVlbmNlICYmIG91dHB1dFNlcXVlbmNlT2JqLkVycm9yICE9IHVuZGVmaW5lZElucHV0U2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSB1aS5jYW52YXMoMzAwLCAxNzApO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudiA9IHVpLmNhbnZhcygkKHdpbmRvdykud2lkdGgoKSwgJCh3aW5kb3cpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9sID0gc2VxdWVuY2VUb01vbFYzMDAwKGlucHV0U2VxdWVuY2VGaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpLCBmYWxzZSwgdHJ1ZSwgb3V0cHV0LnN5bnRoZXNpemVyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudiwgT0NMLk1vbGVjdWxlLmZyb21Nb2xmaWxlKG1vbCksIHsgc3VwcHJlc3NDaGlyYWxUZXh0OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB1aS5kaWFsb2coJ01vbGVjdWxlOiAnICsgaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjYW52KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dNb2RhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKGNhbnZhcykub24oJ21vdXNlb3ZlcicsICgpID0+ICQoY2FudmFzKS5jc3MoJ2N1cnNvcicsICd6b29tLWluJykpO1xuICAgICAgICAgICAgICAgICQoY2FudmFzKS5vbignbW91c2VvdXQnLCAoKSA9PiAkKGNhbnZhcykuY3NzKCdjdXJzb3InLCAnZGVmYXVsdCcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2wgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoaW5wdXRTZXF1ZW5jZUZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJyksIGZhbHNlLCB0cnVlLCBvdXRwdXQuc3ludGhlc2l6ZXJbMF0pO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBPQ0wuU3RydWN0dXJlVmlldy5kcmF3TW9sZWN1bGUoY2FudmFzLCBPQ0wuTW9sZWN1bGUuZnJvbU1vbGZpbGUobW9sKSwgeyBzdXBwcmVzc0NoaXJhbFRleHQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuYXBwZW5kKGNhbnZhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBwaS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnSW5wdXQgZm9ybWF0OiAnLCAnSmFuc3NlbiBHQ1JTIENvZGVzJywgT2JqZWN0LmtleXMobWFwKSk7XG4gICAgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC5vbklucHV0KChmb3JtYXQpID0+IHtcbiAgICAgICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZm9ybWF0KTtcbiAgICB9KTtcbiAgICBjb25zdCBtb2xlY3VsZVN2Z0RpdiA9IHVpLmJsb2NrKFtdKTtcbiAgICBjb25zdCBvdXRwdXRUYWJsZURpdiA9IHVpLmRpdihbXSk7XG4gICAgY29uc3QgaW5wdXRTZXF1ZW5jZUZpZWxkID0gdWkudGV4dElucHV0KCcnLCBkZWZhdWx0SW5wdXQsIChzZXF1ZW5jZSkgPT4ge1xuICAgICAgICB1cGRhdGVUYWJsZUFuZE1vbGVjdWxlKHNlcXVlbmNlLCBpbnB1dEZvcm1hdENob2ljZUlucHV0LnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBhc29HYXBtZXJzR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS01TWUtclUnLCAnQmlvU3ByaW5nJzogJzUnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZVQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ01PRS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdKYW5zc2VuIEdDUlMnOiAnbW9lQScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnTU9FLTVNZS1yQycsICdCaW9TcHJpbmcnOiAnNycsICdKYW5zc2VuIEdDUlMnOiAnbW9lNW1DJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdNT0UtckcnLCAnQmlvU3ByaW5nJzogJzgnLCAnSmFuc3NlbiBHQ1JTJzogJ21vZUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnNS1NZXRoeWwtZEMnLCAnQmlvU3ByaW5nJzogJzknLCAnSmFuc3NlbiBHQ1JTJzogJzVtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdwcyBsaW5rYWdlJywgJ0Jpb1NwcmluZyc6ICcqJywgJ0phbnNzZW4gR0NSUyc6ICdwcycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkQScsICdCaW9TcHJpbmcnOiAnQScsICdKYW5zc2VuIEdDUlMnOiAnQSwgZEEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnZEMnLCAnQmlvU3ByaW5nJzogJ0MnLCAnSmFuc3NlbiBHQ1JTJzogJ0MsIGRDJyB9LFxuICAgICAgICB7ICdOYW1lJzogJ2RHJywgJ0Jpb1NwcmluZyc6ICdHJywgJ0phbnNzZW4gR0NSUyc6ICdHLCBkRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICdkVCcsICdCaW9TcHJpbmcnOiAnVCcsICdKYW5zc2VuIEdDUlMnOiAnVCwgZFQnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckEnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckEnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckMnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnckcnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnckcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnclUnLCAnQmlvU3ByaW5nJzogJycsICdKYW5zc2VuIEdDUlMnOiAnclUnIH0sXG4gICAgXSksIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UsIGFsbG93RWRpdDogZmFsc2UgfSk7XG4gICAgY29uc3Qgb21lQW5kRmx1b3JvR3JpZCA9IERHLlZpZXdlci5ncmlkKERHLkRhdGFGcmFtZS5mcm9tT2JqZWN0cyhbXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tVScsICdCaW9TcHJpbmcnOiAnMScsICdBeG9sYWJzJzogJ1VmJywgJ0phbnNzZW4gR0NSUyc6ICdmVScgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnLWZsdW9yby1BJywgJ0Jpb1NwcmluZyc6ICcyJywgJ0F4b2xhYnMnOiAnQWYnLCAnSmFuc3NlbiBHQ1JTJzogJ2ZBJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCctZmx1b3JvLUMnLCAnQmlvU3ByaW5nJzogJzMnLCAnQXhvbGFicyc6ICdDZicsICdKYW5zc2VuIEdDUlMnOiAnZkMnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJy1mbHVvcm8tRycsICdCaW9TcHJpbmcnOiAnNCcsICdBeG9sYWJzJzogJ0dmJywgJ0phbnNzZW4gR0NSUyc6ICdmRycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJVJywgJ0Jpb1NwcmluZyc6ICc1JywgJ0F4b2xhYnMnOiAndScsICdKYW5zc2VuIEdDUlMnOiAnbVUnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAnMlxcJ09NZS1yQScsICdCaW9TcHJpbmcnOiAnNicsICdBeG9sYWJzJzogJ2EnLCAnSmFuc3NlbiBHQ1JTJzogJ21BJyB9LFxuICAgICAgICB7ICdOYW1lJzogJzJcXCdPTWUtckMnLCAnQmlvU3ByaW5nJzogJzcnLCAnQXhvbGFicyc6ICdjJywgJ0phbnNzZW4gR0NSUyc6ICdtQycgfSxcbiAgICAgICAgeyAnTmFtZSc6ICcyXFwnT01lLXJHJywgJ0Jpb1NwcmluZyc6ICc4JywgJ0F4b2xhYnMnOiAnZycsICdKYW5zc2VuIEdDUlMnOiAnbUcnIH0sXG4gICAgICAgIHsgJ05hbWUnOiAncHMgbGlua2FnZScsICdCaW9TcHJpbmcnOiAnKicsICdBeG9sYWJzJzogJ3MnLCAnSmFuc3NlbiBHQ1JTJzogJ3BzJyB9LFxuICAgIF0pLCB7IHNob3dSb3dIZWFkZXI6IGZhbHNlLCBzaG93Q2VsbFRvb2x0aXA6IGZhbHNlLCBhbGxvd0VkaXQ6IGZhbHNlIH0pO1xuICAgIGNvbnN0IG92ZXJoYW5nTW9kaWZpY2F0aW9uc0dyaWQgPSBERy5WaWV3ZXIuZ3JpZChERy5EYXRhRnJhbWUuZnJvbUNvbHVtbnMoW1xuICAgICAgICBERy5Db2x1bW4uZnJvbVN0cmluZ3MoJ05hbWUnLCBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSksXG4gICAgXSksIHsgc2hvd1Jvd0hlYWRlcjogZmFsc2UsIHNob3dDZWxsVG9vbHRpcDogZmFsc2UsIGFsbG93RWRpdDogZmFsc2UgfSk7XG4gICAgdXBkYXRlVGFibGVBbmRNb2xlY3VsZShkZWZhdWx0SW5wdXQsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IGNvZGVzVGFibGVzRGl2ID0gdWkuc3BsaXRWKFtcbiAgICAgICAgdWkuYm94KHVpLmgyKCdBU08gR2FwbWVycycpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIGFzb0dhcG1lcnNHcmlkLnJvb3QsXG4gICAgICAgIHVpLmJveCh1aS5oMignMlxcJy1PTWUgYW5kIDJcXCctRiBzaVJOQScpLCB7IHN0eWxlOiB7IG1heEhlaWdodDogJzQwcHgnIH0gfSksXG4gICAgICAgIG9tZUFuZEZsdW9yb0dyaWQucm9vdCxcbiAgICAgICAgdWkuYm94KHVpLmgyKCdPdmVyaGFuZyBtb2RpZmljYXRpb25zJyksIHsgc3R5bGU6IHsgbWF4SGVpZ2h0OiAnNDBweCcgfSB9KSxcbiAgICAgICAgb3ZlcmhhbmdNb2RpZmljYXRpb25zR3JpZC5yb290LFxuICAgIF0sIHsgc3R5bGU6IHsgbWF4V2lkdGg6ICczNTBweCcgfSB9KTtcbiAgICBjb25zdCBhcHBNYWluRGVzY3JpcHRpb24gPSB1aS5pbmZvKFtcbiAgICAgICAgdWkuZGl2VGV4dCgnSG93IHRvIGNvbnZlcnQgb25lIHNlcXVlbmNlOicsIHsgc3R5bGU6IHsgJ2ZvbnQtd2VpZ2h0JzogJ2JvbGRlcicgfSB9KSxcbiAgICAgICAgdWkuZGl2VGV4dCgnUGFzdGUgc2VxdWVuY2UgaW50byB0aGUgdGV4dCBmaWVsZCBiZWxvdycpLFxuICAgICAgICB1aS5kaXZUZXh0KCdcXG4gSG93IHRvIGNvbnZlcnQgbWFueSBzZXF1ZW5jZXM6JywgeyBzdHlsZTogeyAnZm9udC13ZWlnaHQnOiAnYm9sZGVyJyB9IH0pLFxuICAgICAgICB1aS5kaXZUZXh0KCcxLiBEcmFnICYgZHJvcCBhbiBFeGNlbCBvciBDU1YgZmlsZSB3aXRoIHNlcXVlbmNlcyBpbnRvIERhdGFncm9rJyksXG4gICAgICAgIHVpLmRpdlRleHQoJzIuIFJpZ2h0LWNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyLCB0aGVuIHNlZSB0aGUgXFwnQ29udmVydFxcJyBtZW51JyksXG4gICAgICAgIHVpLmRpdlRleHQoJ1RoaXMgd2lsbCBhZGQgdGhlIHJlc3VsdCBjb2x1bW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWJsZScpLFxuICAgIF0sICdDb252ZXJ0IG9saWdvbnVjbGVvdGlkZSBzZXF1ZW5jZXMgYmV0d2VlbiBOdWNsZW90aWRlcywgQmlvU3ByaW5nLCBBeG9sYWJzLCBNZXJtYWRlIDEyIGFuZCBHQ1JTIHJlcHJlc2VudGF0aW9ucy4nKTtcbiAgICAkKGNvZGVzVGFibGVzRGl2KS5oaWRlKCk7XG4gICAgY29uc3Qgc3dpdGNoSW5wdXQgPSB1aS5zd2l0Y2hJbnB1dCgnQ29kZXMnLCBmYWxzZSwgKHYpID0+ICh2KSA/XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLnNob3coKSA6XG4gICAgICAgICQoY29kZXNUYWJsZXNEaXYpLmhpZGUoKSk7XG4gICAgY29uc3QgZG93bmxvYWRNb2xGaWxlSWNvbiA9IHVpLmljb25GQSgnZG93bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFyU2VxdWVuY2UgPSBpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VxdWVuY2VUb01vbFYzMDAwKGNsZWFyU2VxdWVuY2UsIGZhbHNlLCBmYWxzZSwgaW5wdXRGb3JtYXRDaG9pY2VJbnB1dC52YWx1ZSk7XG4gICAgICAgIGRvd25sb2FkKGNsZWFyU2VxdWVuY2UgKyAnLm1vbCcsIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbiAgICB9LCAnU2F2ZSAubW9sIGZpbGUnKTtcbiAgICBjb25zdCBjb3B5U21pbGVzSWNvbiA9IHVpLmljb25GQSgnY29weScsICgpID0+IHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VxdWVuY2VUb1NtaWxlcyhpbnB1dFNlcXVlbmNlRmllbGQudmFsdWUucmVwbGFjZSgvXFxzL2csICcnKSwgZmFsc2UsIGlucHV0Rm9ybWF0Q2hvaWNlSW5wdXQudmFsdWUpKS50aGVuKCgpID0+IGdyb2suc2hlbGwuaW5mbyhzZXF1ZW5jZVdhc0NvcGllZCkpO1xuICAgIH0sICdDb3B5IFNNSUxFUycpO1xuICAgIGNvbnN0IHRvcFBhbmVsID0gW1xuICAgICAgICBkb3dubG9hZE1vbEZpbGVJY29uLFxuICAgICAgICBjb3B5U21pbGVzSWNvbixcbiAgICAgICAgc3dpdGNoSW5wdXQucm9vdCxcbiAgICBdO1xuICAgIGNvbnN0IHYgPSBncm9rLnNoZWxsLnY7XG4gICAgY29uc3QgdGFiQ29udHJvbCA9IGdyb2suc2hlbGwuc2lkZWJhcjtcbiAgICB0YWJDb250cm9sLm9uVGFiQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdi5zZXRSaWJib25QYW5lbHMoWyh0YWJDb250cm9sLmN1cnJlbnRQYW5lLm5hbWUgPT0gJ01BSU4nKSA/IHRvcFBhbmVsIDogW11dKTtcbiAgICB9KTtcbiAgICB2LnNldFJpYmJvblBhbmVscyhbdG9wUGFuZWxdKTtcbiAgICByZXR1cm4gdWkuYm94KHVpLnNwbGl0SChbXG4gICAgICAgIHVpLnNwbGl0VihbXG4gICAgICAgICAgICB1aS5wYW5lbChbXG4gICAgICAgICAgICAgICAgYXBwTWFpbkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdJbnB1dCBzZXF1ZW5jZScpLFxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTZXF1ZW5jZUZpZWxkLnJvb3QsXG4gICAgICAgICAgICAgICAgICAgIF0sICdpbnB1dC1iYXNlJyksXG4gICAgICAgICAgICAgICAgXSwgJ2lucHV0U2VxdWVuY2UnKSxcbiAgICAgICAgICAgICAgICB1aS5kaXYoW2lucHV0Rm9ybWF0Q2hvaWNlSW5wdXRdLCB7IHN0eWxlOiB7IHBhZGRpbmc6ICc1cHggMCcgfSB9KSxcbiAgICAgICAgICAgICAgICB1aS5ibG9jayhbXG4gICAgICAgICAgICAgICAgICAgIHVpLmgxKCdPdXRwdXQnKSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGFibGVEaXYsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgICAgICAgICBdLCAnc2VxdWVuY2UnKSxcbiAgICAgICAgXSksXG4gICAgICAgIGNvZGVzVGFibGVzRGl2LFxuICAgIF0sIHsgc3R5bGU6IHsgaGVpZ2h0OiAnMTAwJScsIHdpZHRoOiAnMTAwJScgfSB9KSk7XG59XG4iLCJpbXBvcnQgeyBsY21zVG9HY3JzIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGRlbGltaXRlciB9IGZyb20gJy4vbWFwJztcbi8vbmFtZTogZ2Nyc1RvTGNtc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IExDTVN9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTGNtcyhzZXF1ZW5jZSkge1xuICAgIGNvbnN0IGRmID0gREcuRGF0YUZyYW1lLmZyb21Dc3YobGNtc1RvR2Nycyk7XG4gICAgY29uc3QgYXJyMSA9IGRmLmdldENvbCgnR0NSUycpLnRvTGlzdCgpO1xuICAgIGNvbnN0IGFycjIgPSBkZi5nZXRDb2woJ0xDTVMnKS50b0xpc3QoKTtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBhcnIxLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiBvYmpbZWxlbWVudF0gPSBhcnIyW2luZGV4XSk7XG4gICAgb2JqW2RlbGltaXRlcl0gPSBkZWxpbWl0ZXI7XG4gICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICBhcnIxW2ldID0gYXJyMVtpXS5yZXBsYWNlKCcoJywgJ1xcXFwoJyk7XG4gICAgLy8gICBhcnIxW2ldID0gYXJyMVtpXS5yZXBsYWNlKCcpJywgJ1xcXFwpJyk7XG4gICAgLy8gfVxuICAgIC8vIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoJygnICsgYXJyMS5qb2luKCd8JykgKyAnKScsICdnJyk7XG4gICAgLy8gbGV0IHIxID0gc2VxdWVuY2UucmVwbGFjZShyZWdFeHAsIGZ1bmN0aW9uKGNvZGUpIHtyZXR1cm4gb2JqW2NvZGVdO30pO1xuICAgIGNvbnN0IGNvZGVzID0gYXJyMS5jb25jYXQoZGVsaW1pdGVyKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoOyB9KTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHIxID0gJyc7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBjLmxlbmd0aCkpO1xuICAgICAgICByMSArPSBvYmpbc2VxdWVuY2Uuc2xpY2UoaSwgaSArIG1hdGNoZWRDb2RlLmxlbmd0aCldO1xuICAgICAgICBpICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICB9XG4gICAgd2hpbGUgKHIxLmluZGV4T2YoJy8vJykgIT0gLTEpXG4gICAgICAgIHIxID0gcjEucmVwbGFjZSgnLy8nLCAnLycpO1xuICAgIHJldHVybiByMTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnNSonLCAnQSc6ICc2KicsICdDJzogJzcqJywgJ0cnOiAnOConXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJ1QqJywgJ0EnOiAnQSonLCAnQyc6ICc5KicsICdHJzogJ0cqJ1xuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VHxDfEcpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPiA0ICYmIGNvdW50IDwgMTUpID8gb2JqRm9yQ2VudGVyW3hdIDogb2JqRm9yRWRnZXNbeF07XG4gICAgfSkuc2xpY2UoMCwgKG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoaW52YWJhc2ljKScpIHx8IG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoR2FsTkFjLTItSk5KKScpKSA/XG4gICAgICAgIG51Y2xlb3RpZGVzLmxlbmd0aCA6IDIgKiBjb3VudCArIDEpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckVkZ2VzID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdtb2VVbnBzJyxcbiAgICAgICAgJ0EnOiAnbW9lQW5wcycsICdDJzogJ21vZTVtQ25wcycsICdHJzogJ21vZUducHMnXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdDJzogJzVtQ3BzJywgJ0EnOiAnQXBzJywgJ1QnOiAnVHBzJywgJ0cnOiAnR3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCA1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9iakZvckVkZ2VzW3hdLnNsaWNlKDAsIC0zKSArICdwcycgOiBvYmpGb3JFZGdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50IDwgMTUpXG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ID09IDE0KSA/IG9iakZvckNlbnRlclt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9iakZvckNlbnRlclt4XTtcbiAgICAgICAgcmV0dXJuIG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAtMyk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnKic6ICcnLCAnNSc6ICdUJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJzknOiAnQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8XFwqfDV8Nnw3fDh8OSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnNSonOiAnbW9lVW5wcycsICc2Kic6ICdtb2VBbnBzJywgJzcqJzogJ21vZTVtQ25wcycsICc4Kic6ICdtb2VHbnBzJywgJzkqJzogJzVtQ3BzJywgJ0EqJzogJ0FwcycsICdUKic6ICdUcHMnLFxuICAgICAgICAnRyonOiAnR3BzJywgJ0MqJzogJ0NwcycsICc1JzogJ21vZVUnLCAnNic6ICdtb2VBJywgJzcnOiAnbW9lNW1DJywgJzgnOiAnbW9lRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8NVxcKnw2XFwqfDdcXCp8OFxcKnw5XFwqfEFcXCp8VFxcKnxHXFwqfENcXCp8NXw2fDd8OCkvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9ialt4XS5zbGljZSgwLCAtMykgKyAncHMnIDogKGNvdW50ID09IDE0KSA/IG9ialt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICcxJywgJ2ZBJzogJzInLCAnZkMnOiAnMycsICdmRyc6ICc0JywgJ21VJzogJzUnLCAnbUEnOiAnNicsICdtQyc6ICc3JywgJ21HJzogJzgnLFxuICAgICAgICAnbW9lVCc6ICc1JywgJ21vZUEnOiAnNicsICdtb2U1bUMnOiAnNycsICdtb2VHJzogJzgnLCAnbW9lVSc6ICc1JywgJzVtQyc6ICc5JywgJ25wcyc6ICcqJywgJ3BzJzogJyonLCAnVSc6ICdUJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xtb2VUfG1vZUF8bW9lNW1DfG1vZUd8bW9lVXw1bUN8bnBzfHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21vZSc6ICcnLCAnNW0nOiAnJywgJ24nOiAnJywgJ3BzJzogJycsICdVJzogJ1QnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZXw1bXxufHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVScsICcyJzogJ0EnLCAnMyc6ICdDJywgJzQnOiAnRycsICc1JzogJ1UnLCAnNic6ICdBJywgJzcnOiAnQycsICc4JzogJ0cnLCAnKic6ICcnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ1VmJywgJzInOiAnQWYnLCAnMyc6ICdDZicsICc0JzogJ0dmJywgJzUnOiAndScsICc2JzogJ2EnLCAnNyc6ICdjJywgJzgnOiAnZycsICcqJzogJ3MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdmVScsICcyJzogJ2ZBJywgJzMnOiAnZkMnLCAnNCc6ICdmRycsICc1JzogJ21VJywgJzYnOiAnbUEnLCAnNyc6ICdtQycsICc4JzogJ21HJywgJyonOiAncHMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnZlUnLCAnQWYnOiAnZkEnLCAnQ2YnOiAnZkMnLCAnR2YnOiAnZkcnLCAndSc6ICdtVScsICdhJzogJ21BJywgJ2MnOiAnbUMnLCAnZyc6ICdtRycsICdzJzogJ3BzJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICcxJywgJ0FmJzogJzInLCAnQ2YnOiAnMycsICdHZic6ICc0JywgJ3UnOiAnNScsICdhJzogJzYnLCAnYyc6ICc3JywgJ2cnOiAnOCcsICdzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnVScsICdBZic6ICdBJywgJ0NmJzogJ0MnLCAnR2YnOiAnRycsICd1JzogJ1UnLCAnYSc6ICdBJywgJ2MnOiAnQycsICdnJzogJ0cnLCAncyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsICdwcyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJzEnLCAnZkEnOiAnMicsICdmQyc6ICczJywgJ2ZHJzogJzQnLCAnbVUnOiAnNScsICdtQSc6ICc2JywgJ21DJzogJzcnLCAnbUcnOiAnOCcsICdwcyc6ICcqJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICdVZicsICdmQSc6ICdBZicsICdmQyc6ICdDZicsICdmRyc6ICdHZicsICdtVSc6ICd1JywgJ21BJzogJ2EnLCAnbUMnOiAnYycsICdtRyc6ICdnJywgJ3BzJzogJ3MnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICc2KicsICdVJzogJzUqJywgJ0cnOiAnOConLCAnQyc6ICc3KicgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJyo2JywgJ1UnOiAnKjUnLCAnRyc6ICcqOCcsICdDJzogJyo3JyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYnLCAnVSc6ICc1JywgJ0cnOiAnOCcsICdDJzogJzcnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJzInLCAnVSc6ICcxJywgJ0cnOiAnNCcsICdDJzogJzMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA+IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDMpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yUmlnaHRFZGdlW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ICUgMiA9PSAwKSA/IG9iakZvckV2ZW5JbmRpY2VzW3hdIDogb2JqRm9yT2RkSW5kaWNlc1t4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlc1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ21BcHMnLCAnVSc6ICdtVXBzJywgJ0cnOiAnbUdwcycsICdDJzogJ21DcHMnIH07XG4gICAgY29uc3Qgb2JqRm9yUmlnaHRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdwc21BJywgJ1UnOiAncHNtVScsICdHJzogJ3BzbUcnLCAnQyc6ICdwc21DJyB9O1xuICAgIGNvbnN0IG9iakZvckV2ZW5JbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdmQScsICdVJzogJ2ZVJywgJ0cnOiAnZkcnLCAnQyc6ICdmQycgfTtcbiAgICBjb25zdCBvYmpGb3JPZGRJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdtQScsICdVJzogJ21VJywgJ0cnOiAnbUcnLCAnQyc6ICdtQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JTb21lSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWYnLCAnVSc6ICdVZicsICdHJzogJ0dmJywgJ0MnOiAnQ2YnIH07XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhJywgJ1UnOiAndScsICdHJzogJ2cnLCAnQyc6ICdjJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gNiB8fCAoY291bnQgPiA3ICYmIGNvdW50IDwgMTEpKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclNvbWVJbmRpY2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHJldHVybiAnYSc7XG4gICAgICAgIHJldHVybiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNBbnRpc2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JTbWFsbExpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JCaWdMaW5rYWdlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWZzJywgJ1UnOiAnVWZzJywgJ0cnOiAnR2ZzJywgJ0MnOiAnQ2ZzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA+IDE5ICYmIGNvdW50IDwgMjIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU21hbGxMaW5rYWdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gJ3VzJztcbiAgICAgICAgaWYgKGNvdW50ID09IDEpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yQmlnTGlua2FnZXNbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNSB8fCBjb3VudCA9PSA3IHx8IGNvdW50ID09IDggfHwgY291bnQgPT0gMTMgfHwgY291bnQgPT0gMTUpID8gb2JqRm9yU29tZUluZGljZXNbeF0gOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGdjcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbUFwcyc6ICdBJywgJ21VcHMnOiAnVScsICdtR3BzJzogJ0cnLCAnbUNwcyc6ICdDJywgJ2ZBcHMnOiAnQScsICdmVXBzJzogJ1UnLCAnZkdwcyc6ICdHJywgJ2ZDcHMnOiAnQycsXG4gICAgICAgICdmVSc6ICdVJywgJ2ZBJzogJ0EnLCAnZkMnOiAnQycsICdmRyc6ICdHJywgJ21VJzogJ1UnLCAnbUEnOiAnQScsICdtQyc6ICdDJywgJ21HJzogJ0cnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1BcHN8bVVwc3xtR3BzfG1DcHN8ZkFwc3xmVXBzfGZHcHN8ZkNwc3xmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtRykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGdjcnNUb01lcm1hZGUxMlxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IE1lcm1hZGUgMTIgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9NZXJtYWRlMTIobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ2UnLCAnbVVwcyc6ICdoJywgJ21HcHMnOiAnZycsICdtQ3BzJzogJ2YnLCAnZkFwcyc6ICdpJywgJ2ZVcHMnOiAnbCcsICdmR3BzJzogJ2snLCAnZkNwcyc6ICdqJywgJ2ZVJzogJ0wnLFxuICAgICAgICAnZkEnOiAnSScsICdmQyc6ICdKJywgJ2ZHJzogJ0snLCAnbVUnOiAnSCcsICdtQSc6ICdFJywgJ21DJzogJ0YnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbiIsImltcG9ydCB7IG1hcCwgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TLCBkZWxpbWl0ZXIgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBpc1ZhbGlkU2VxdWVuY2UgfSBmcm9tICcuL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IGdldE51Y2xlb3RpZGVzTW9sIH0gZnJvbSAnLi9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmltcG9ydCB7IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyIH0gZnJvbSAnLi4vaGVscGVycyc7XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb01vbFYzMDAwKHNlcXVlbmNlLCBpbnZlcnRlZCA9IGZhbHNlLCBvY2xSZW5kZXIgPSBmYWxzZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpO1xuICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKG9iaikpO1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBzbWlsZXNDb2RlcyA9IFtdO1xuICAgIGNvbnN0IGNvZGVzTGlzdCA9IFtdO1xuICAgIGNvbnN0IGxpbmtzID0gWydzJywgJ3BzJywgJyonXTtcbiAgICBjb25zdCBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkgPSBbJ2UnLCAnaCcsIC8qJ2cnLCovICdmJywgJ2knLCAnbCcsICdrJywgJ2onXTtcbiAgICBjb25zdCBkcm9wZG93bnMgPSBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKTtcbiAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChkcm9wZG93bnMpLmNvbmNhdChkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICBpICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICBpbnZlcnRlZCA/IGNvZGVzTGlzdC51bnNoaWZ0KGNvZGUpIDogY29kZXNMaXN0LnB1c2goY29kZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSkge1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaCgoaSA+PSBjb2Rlc0xpc3QubGVuZ3RoIC8gMikgP1xuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5yaWdodCA6IE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5sZWZ0KTtcbiAgICAgICAgICAgIGlmICghKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlVG9TbWlsZXMoc2VxdWVuY2UsIGludmVydGVkID0gZmFsc2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSwgZm9ybWF0KTtcbiAgICBsZXQgY29kZXMgPSBzb3J0QnlTdHJpbmdMZW5ndGhJbkRlc2NlbmRpbmdPcmRlcihPYmplY3Qua2V5cyhvYmopKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHNtaWxlcyA9ICcnO1xuICAgIGNvbnN0IGNvZGVzTGlzdCA9IFtdO1xuICAgIGNvbnN0IGxpbmtzID0gWydzJywgJ3BzJywgJyonXTtcbiAgICBjb25zdCBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkgPSBbJ2UnLCAnaCcsIC8qJ2cnLCovICdmJywgJ2knLCAnbCcsICdrJywgJ2onXTtcbiAgICBjb25zdCBkcm9wZG93bnMgPSBPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKTtcbiAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChkcm9wZG93bnMpLmNvbmNhdChkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChpIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maW5kKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKGksIGkgKyBzLmxlbmd0aCkpO1xuICAgICAgICBpICs9IGNvZGUubGVuZ3RoO1xuICAgICAgICBpbnZlcnRlZCA/IGNvZGVzTGlzdC51bnNoaWZ0KGNvZGUpIDogY29kZXNMaXN0LnB1c2goY29kZSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSkge1xuICAgICAgICAgICAgc21pbGVzICs9IChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0ICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgOlxuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5sZWZ0ICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzICs9IG9ialtjb2Rlc0xpc3RbaV1dO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNtaWxlcyArPSBvYmpbY29kZXNMaXN0W2ldXSArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNtaWxlcyA9IHNtaWxlcy5yZXBsYWNlKC9PTy9nLCAnTycpO1xuICAgIHJldHVybiAoKGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pICYmXG4gICAgICAgIGNvZGVzTGlzdC5sZW5ndGggPiAxICYmXG4gICAgICAgICFpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAyXSkpIHx8XG4gICAgICAgIGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSB8fFxuICAgICAgICBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkpID9cbiAgICAgICAgc21pbGVzIDpcbiAgICAgICAgc21pbGVzLnNsaWNlKDAsIHNtaWxlcy5sZW5ndGggLSBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcy5sZW5ndGggKyAxKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ludGhlc2l6ZXIgb2YgT2JqZWN0LmtleXMobWFwKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgICAgICAgICBvYmpbY29kZV0gPSBtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldW2NvZGVdLlNNSUxFUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtmb3JtYXRdKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtmb3JtYXRdW3RlY2hub2xvZ3ldKSlcbiAgICAgICAgICAgICAgICBvYmpbY29kZV0gPSBtYXBbZm9ybWF0XVt0ZWNobm9sb2d5XVtjb2RlXS5TTUlMRVM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb2JqW2RlbGltaXRlcl0gPSAnJztcbiAgICAvLyBUT0RPOiBjcmVhdGUgb2JqZWN0IGJhc2VkIGZyb20gc3ludGhlc2l6ZXIgdHlwZSB0byBhdm9pZCBrZXkoY29kZXMpIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuTUVSTUFERV8xMikpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5NRVJNQURFXzEyXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICBlbHNlIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBnZXRBbGxDb2Rlc09mU3ludGhlc2l6ZXIgfSBmcm9tICcuL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IGRpZmZlcmVuY2VPZlR3b0FycmF5cyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuZXhwb3J0IGNvbnN0IGRlbGltaXRlciA9ICc7JztcbmV4cG9ydCBjb25zdCBTWU5USEVTSVpFUlMgPSB7XG4gICAgUkFXX05VQ0xFT1RJREVTOiAnUmF3IE51Y2xlb3RpZGVzJyxcbiAgICBCSU9TUFJJTkc6ICdCaW9TcHJpbmcgQ29kZXMnLFxuICAgIEdDUlM6ICdKYW5zc2VuIEdDUlMgQ29kZXMnLFxuICAgIEFYT0xBQlM6ICdBeG9sYWJzIENvZGVzJyxcbiAgICBNRVJNQURFXzEyOiAnTWVybWFkZSAxMicsXG4gICAgTENNUzogJ0xDTVMnLFxufTtcbmV4cG9ydCBjb25zdCBURUNITk9MT0dJRVMgPSB7XG4gICAgRE5BOiAnRE5BJyxcbiAgICBSTkE6ICdSTkEnLFxuICAgIEFTT19HQVBNRVJTOiAnRm9yIEFTTyBHYXBtZXJzJyxcbiAgICBTSV9STkE6ICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQScsXG59O1xuZXhwb3J0IGNvbnN0IE1PRElGSUNBVElPTlMgPSB7XG4gICAgJyhpbnZhYmFzaWMpJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDExOC4xMyxcbiAgICAgICAgbGVmdDogJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycsXG4gICAgICAgIHJpZ2h0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICB9LFxuICAgICcoR2FsTkFjLTItSk5KKSc6IHtcbiAgICAgICAgbW9sZWN1bGFyV2VpZ2h0OiAxMjczLjMsXG4gICAgICAgIGxlZnQ6ICdDKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpTkMoPU8pQ0NDQyg9TylOQ0MoTylDTycsXG4gICAgICAgIHJpZ2h0OiAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzID0gJ09QKD1PKShPKU8nO1xuZXhwb3J0IGNvbnN0IG1hcCA9IHtcbiAgICAnUmF3IE51Y2xlb3RpZGVzJzoge1xuICAgICAgICAnRE5BJzoge1xuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnUk5BJzoge1xuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdVcmFjaWwnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDYuMTcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0MnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0Jpb1NwcmluZyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICc1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzgnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDQwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc5Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnMSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnMic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICczJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDcuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc0Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjAuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc2Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzgnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0F4b2xhYnMgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdVZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQWYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0dmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICd1Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjAuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdhJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDMuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4sXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAncyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgICdKYW5zc2VuIEdDUlMgQ29kZXMnOiB7XG4gICAgICAgICdGb3IgQVNPIEdhcG1lcnMnOiB7XG4gICAgICAgICAgICAnbW9lVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLTVNZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM3OC4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2VBJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtckEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzODcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lNW1DJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyg1bSltb2VDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDQwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyg1bSlDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzUtTWV0aHlsLWRDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdwcyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcyBsaW5rYWdlJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMTYuMDcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDUuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ1LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnclUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdmVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21HJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdPdGhlcnMnOiB7fSxcbiAgICB9LFxuICAgICdNZXJtYWRlIDEyJzoge1xuICAgICAgICAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnOiB7XG4gICAgICAgICAgICAnZSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNi4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdnJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzUuMzEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzM1LjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2knOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4yNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2wnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyNC4yMyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM2My4yNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMy4yNSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0wnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwOC4xNixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0knOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1HJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ3LjE5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnSCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQzLjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAvLyAnTENNUyc6IHtcbiAgICAvLyAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbn07XG5leHBvcnQgY29uc3QgbGNtc1RvR2NycyA9IGBMQ01TLCBHQ1JTXG5BLCBBXG5DLCBDXG4vNW1DLywgKDVtKUNcbkcsIEdcblQsIFRcbnJBLCByQVxuckMsIHJDXG5yRywgckdcbnJVLCByVVxubUEsIG1BXG5tQywgbUNcbi81bW1DLywgKDVtKW1DXG5tRywgbUdcbm1VLCBtVVxuZkEsIGZBXG5mQywgZkNcbi81bWZDLywgKDVtKWZDXG5mRywgZkdcbmZVLCBmVVxuL2FmQS8sIGFmQVxuL2FmQy8sIGFmQ1xuL2FmRy8sIGFmR1xuL2FmVS8sIGFmVVxuK0EsIGxuYSBBXG4rQywgbG5hIENcbitHLCBsbmEgR1xuK1QsIGxuYSBUXG4vbW9lQS8sIG1vZUFcbi9tb2VDLywgbW9lQ1xuLzVtbW9lQy8sICg1bSltb2VDXG4vbW9lRy8sIG1vZUdcbi9tb2VULywgbW9lVFxuL21vZVUvLCBtb2VVXG4veEEvLCBBbnBcbi94Qy8sIENucFxuL3g1bUMvLCAoNW0pQ25wXG4veEcvLCBHbnBcbi94VC8sIFRucFxuL3hyQS8sIHJBbnBcbi94ckMvLCByQ25wXG4veHJHLywgckducFxuL3hyVS8sIHJVbnBcbi94bUEvLCBtQW5wXG4veG1DLywgbUNucFxuL3g1bW1DLywgKDVtKW1DbnBcbi94bUcvLCBtR25wXG4veG1VLywgbVVucFxuL3hmQS8sIGZBbnBcbi94ZkMvLCBmQ25wXG4veGZHLywgZkducFxuL3hmVC8sIGZUbnBcbi94ZlUvLCBmVW5wXG4veGFmQS8sIGFmQW5wXG4veGFmQy8sIGFmQ25wXG4veGFmRy8sIGFmR25wXG4veGFmVS8sIGFmVW5wXG4veGVBLywgZUFucFxuL3hlQy8sIGVDbnBcbi94ZUcvLCBlR25wXG4veGVVLywgZVVucFxuL3htb2VBLywgbW9lQW5wXG4veG1vZUMvLCBtb2VDbnBcbi94NW1tb2VDLywgKDVtKW1vZUNucFxuL3htb2VHLywgbW9lR25wXG4veG1vZVUvLCBtb2VVbnBcbi9VTkEtQS8sIChVTkEtQSlcbi9VTkEtQy8sIChVTkEtQylcbi9VTkEtRy8sIChVTkEtRylcbi9VTkEtVC8sIChVTkEtVClcbi9VTkEtVS8sIChVTkEtVSlcbi9HTkEtQS8sIChHTkEtQSlcbi9HTkEtQy8sIChHTkEtQylcbi9HTkEtRy8sIChHTkEtRylcbi9HTkEtVC8sIChHTkEtVClcbi9HTkEtVS8sIChHTkEtVSlcbi81Q2hvbFRFRy8sICg1LUNob2xURUcpXG4vM0Nob2xURUcvLCAoVEVHQ2hvbC0zKVxuL1RvY28vLCBUb2NvXG4vUGFsbS8sIFBhbG1cbi9HYWxOQWMvLCBHYWxOQWNcbi9HYWxOQWMyLywgR2FsTkFjMlxuL0dhbE5BYzMvLCBHYWxOQWMzXG4vR2FsTkFjNi8sIEdhbE5BYzZcbi9HYWxOQWM3LywgR2FsTkFjN1xuL0dhbE5BYzkvLCBHYWxOQWM5XG4vR2FsTkFjMTQvLCBHYWxOQWMxNFxuL05BRzM3LywgTkFHMzdcbi9IRUcvLCAoSEVHKVxuL1RFRy8sIChURUcpXG4vQW1tQzYvLCAoTkhDNilcbi9BbW1DNy8sIChOSEM3KVxuL0FtbUMxMi8sIChOSEMxMilcbi9pbnZBYi8sIChpbnZhYmFzaWMpXG4vaW52ZFQvLCAoaW52ZFQpXG4vVlBtVS8sICh2aW51KVxuKiwgcHNcbi8yLUMxNlUvLCAyLUMxNlUgXG4vMi1DMTh3OVUvLCAyLUMxOHc5VVxuL0pEaS1QYWxtLywgSkRpLVBhbG1cbi9KMi1DT05DMTZVLywgSjItQ09OQzE2VVxuL0oyLUMzTkMxNlUvLCBKMi1DM05DMTZVXG4vSi1DMTVBZGEvLCBKLUMxNUFkYVxuL0otMkMxNUFkYVUvLCBKLTJDMTVBZGFVXG4vSi1DMTZOQzYvLCBKLUMxNk5DNlxuL1IyLUM2TkgtVS8sIFIyLUM2TkgtVVxuL0otTTEvLCBKLU0xXG4vSi1CMS8sIEotQjFcbi9KLUIyLywgSi1CMlxuL0otTTIvLCBKLU0yXG4vMi1DMTZDLywgMi1DMTZDXG4vMi1DMTZBLywgMi1DMTZBXG4vMi1DMTZHLywgMi1DMTZHXG4vUjItQzZOSC1HLywgUjItQzZOSC1HXG4vUjItQzZOSC1DLywgUjItQzZOSC1DXG4vSjItQ09OQzE2QS8sIEoyLUNPTkMxNkFcbi9KMi1DT05DMTZDLywgSjItQ09OQzE2Q1xuL0oyLUNPTkMxNkcvLCBKMi1DT05DMTZHXG4vSjItQzE1QWRhQy8sIEoyLUMxNUFkYUNcbi9KMi1NMlUvLCBKMi1NMlVcbi9KMi1CMlUvLCBKMi1CMlVcbi9KMi1DM05DMTZDLywgSjItQzNOQzE2Q1xuL0oyLUMzTkMxNkcvLCBKMi1DM05DMTZHXG4vUjItQzZOSC1BLywgUjItQzZOSC1BXG4vSjItQzE1QWRhQS8sIEoyLUMxNUFkYUFcbi9KMi1DM05DMTZBLywgSjItQzNOQzE2QVxuL0otQzUtU0VSLTEvLCBKLUM1LVNFUi0xXG4vSi1DMTYtU0VSLTEvLCBKLUMxNi1TRVItMVxuL0otQTIvLCBKLUEyXG4vSi1BMS8sIEotQTFcbi9KMi1DMTVBZGFHLywgSjItQzE1QWRhR1xuL0otQzE2TkFzcC8sIEotQzE2TkFzcFxuL0oyLUMxNk5DNlUvLCBKMi1DMTZOQzZVXG4vSi1DNS1SRUJPLTEvLCBKLUM1LVJFQk8tMVxuL0otQzE2LVJFQk8tMS8sIEotQzE2LVJFQk8tMVxuL0otQzE2LUlORC0xLywgSi1DMTYtSU5ELTFcbi9KLUM1LUlORC0xLywgSi1DNS1JTkQtMVxuL0otMUMxNUFkYS0yTWFuLywgSi0xQzE1QWRhLTJNYW5cbi9KRy0xQzE1QWRhLTIzRGlNYW4vLCBKRy0xQzE1QWRhLTIsM0RpTWFuXG4vSi1UcmlNYW5QQy8sIEotVHJpTWFuUENcbi9KLXRyaU1hblBPLywgSi10cmlNYW5QT1xuL0otQTQvLCBKLUE0XG4vSi1BcmEtMS8sIEotQXJhLTFcbi9KLUFyYS0yLywgSi1BcmEtMlxuL0otQWNDUy8sIEotQWNDU1xuL0otQ2JDUy8sIEotQ2JDU1xuL0otTXRDRC8sIEotTXRDRGA7XG5jb25zdCBjb2Rlc1dpdGhTbWlsZXMgPSBnZXRBbGxDb2Rlc09mU3ludGhlc2l6ZXIoU1lOVEhFU0laRVJTLkdDUlMpO1xuY29uc3QgYWxsR2Nyc0NvZGVzID0gREcuRGF0YUZyYW1lLmZyb21Dc3YobGNtc1RvR2NycykuZ2V0Q29sKCdHQ1JTJykudG9MaXN0KCk7XG5leHBvcnQgY29uc3QgZ2Nyc0NvZGVzV2l0aG91dFNtaWxlcyA9IGRpZmZlcmVuY2VPZlR3b0FycmF5cyhhbGxHY3JzQ29kZXMsIGNvZGVzV2l0aFNtaWxlcyk7XG5mb3IgKGNvbnN0IGUgb2YgZ2Nyc0NvZGVzV2l0aG91dFNtaWxlcylcbiAgICBtYXBbU1lOVEhFU0laRVJTLkdDUlNdWydPdGhlcnMnXVtlXSA9IHsgbmFtZTogJycsIHdlaWdodDogMCwgbm9ybWFsaXplZDogJycsIFNNSUxFUzogJycgfTtcbmV4cG9ydCBjb25zdCB3ZWlnaHRzT2JqID0ge307XG5mb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgd2VpZ2h0c09ialtjb2RlXSA9IG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV1bY29kZV0ud2VpZ2h0O1xuICAgIH1cbn1cbmZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE1PRElGSUNBVElPTlMpKVxuICAgIHdlaWdodHNPYmpba2V5XSA9IHZhbHVlLm1vbGVjdWxhcldlaWdodDtcbiIsImNvbnN0IFBIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgTyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IFRISU9QSE9TSEFURSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDUgNCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gLTEuNSAwIDAgMFxuTSAgVjMwIDIgUCAwIDAgMCAwXG5NICBWMzAgMyBPIDAgMSAwIDBcbk0gIFYzMCA0IFMgMCAtMSAwIDBcbk0gIFYzMCA1IE8gMS41IDAgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDEgMlxuTSAgVjMwIDIgMiAyIDNcbk0gIFYzMCAzIDEgMiA0XG5NICBWMzAgNCAxIDIgNVxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIEVORGA7XG5jb25zdCBJTlZBQkFTSUMgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA4IDggMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIDEuMDkzNCAtMi4xNjM2IDAgMFxuTSAgVjMwIDIgQyAxLjgzNjUgLTEuNDk0NSAwIDAgQ0ZHPTJcbk0gIFYzMCAzIEMgMi44MTQ3IC0xLjcwMjQgMCAwXG5NICBWMzAgNCBDIDMuMzE0NyAtMC44MzY0IDAgMFxuTSAgVjMwIDUgTyAyLjY0NTUgLTAuMDkzMiAwIDBcbk0gIFYzMCA2IEMgMS43MzIgLTAuNSAwIDAgQ0ZHPTFcbk0gIFYzMCA3IEMgMC44NjYgMCAwIDBcbk0gIFYzMCA4IE8gMC44NjYgMSAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMiAxIENGRz0xXG5NICBWMzAgMiAxIDIgM1xuTSAgVjMwIDMgMSAzIDRcbk0gIFYzMCA0IDEgNCA1XG5NICBWMzAgNSAxIDYgNVxuTSAgVjMwIDYgMSAyIDZcbk0gIFYzMCA3IDEgNiA3IENGRz0zXG5NICBWMzAgOCAxIDcgOFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KDIgMiA2KVxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5jb25zdCBHQUxOQUMgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbjAgIDAgIDAgICAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDExMSAxMTMgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0yMC43MzEzIC0wLjcwMjcgMCAwXG5NICBWMzAgMiBDIC0xOS4zOTc2IDAuMDY3MyAwIDBcbk0gIFYzMCAzIEMgLTE4LjA2MzggLTAuNzAyNyAwIDBcbk0gIFYzMCA0IEMgLTE2LjczMDMgMC4wNjczIDAgMFxuTSAgVjMwIDUgTiAtMTUuMzk2NSAtMC43MDI3IDAgMFxuTSAgVjMwIDYgQyAtMTQuMDYyOCAwLjA2NzMgMCAwXG5NICBWMzAgNyBDIC0xMi43MjkzIC0wLjcwMjcgMCAwXG5NICBWMzAgOCBDIC0xMS4zOTU1IDAuMDY3MyAwIDBcbk0gIFYzMCA5IEMgLTEwLjA2MiAtMC43MDI3IDAgMFxuTSAgVjMwIDEwIEMgLTguNzI4MyAwLjA2NzMgMCAwXG5NICBWMzAgMTEgTiAtNy4zOTQ3IC0wLjcwMjcgMCAwXG5NICBWMzAgMTIgTyAtMTguMDYzOCAtMi4yNDI3IDAgMFxuTSAgVjMwIDEzIE8gLTE0LjA2MjggMS42MDczIDAgMFxuTSAgVjMwIDE0IE8gLTguNzI4MyAxLjYwNzMgMCAwXG5NICBWMzAgMTUgQyAtNS44NTQ3IC0wLjcwMjcgMCAwXG5NICBWMzAgMTYgQyAtNS44NTQ3IDAuODM3MyAwIDBcbk0gIFYzMCAxNyBDIC01Ljg1NDcgLTIuMjQyNyAwIDBcbk0gIFYzMCAxOCBDIC0zLjQ4NDggLTMuMDEyNyAwIDBcbk0gIFYzMCAxOSBDIC0yLjQ1NDQgLTQuMTU3IDAgMFxuTSAgVjMwIDIwIEMgLTAuOTQ4IC0zLjgzNjggMCAwXG5NICBWMzAgMjEgTiAwLjA4MjQgLTQuOTgxMyAwIDBcbk0gIFYzMCAyMiBDIDEuNTg4OCAtNC42NjEyIDAgMFxuTSAgVjMwIDIzIEMgMi42MTkyIC01LjgwNTYgMCAwXG5NICBWMzAgMjQgQyA0LjEyNTYgLTUuNDg1NSAwIDBcbk0gIFYzMCAyNSBOIDUuMTU2IC02LjYyOTcgMCAwXG5NICBWMzAgMjYgQyA2LjY2MjQgLTYuMzA5NiAwIDBcbk0gIFYzMCAyNyBDIDcuNjkyOCAtNy40NTQxIDAgMFxuTSAgVjMwIDI4IEMgOS4xOTkyIC03LjEzMzkgMCAwXG5NICBWMzAgMjkgQyAxMC4yMjk2IC04LjI3ODQgMCAwXG5NICBWMzAgMzAgQyAxMS43MzYgLTcuOTU4MyAwIDBcbk0gIFYzMCAzMSBPIDEyLjc2NjQgLTkuMTAyNyAwIDBcbk0gIFYzMCAzMiBPIC0wLjQ3MjIgLTIuMzcyMyAwIDBcbk0gIFYzMCAzMyBPIDcuMTM4MiAtNC44NDUgMCAwXG5NICBWMzAgMzQgQyAxNC4yNzI4IC04Ljc4MjQgMCAwXG5NICBWMzAgMzUgQyAxNS4zMDMyIC05LjkyNjcgMCAwXG5NICBWMzAgMzYgQyAxNi44MDk4IC05LjYwNjUgMCAwXG5NICBWMzAgMzcgQyAxNy4yODU2IC04LjE0MjEgMCAwXG5NICBWMzAgMzggQyAxNi4yNTUyIC02Ljk5NzUgMCAwXG5NICBWMzAgMzkgTyAxNC43NDg2IC03LjMxNzggMCAwXG5NICBWMzAgNDAgQyAxNi43MzEyIC01LjUzMjkgMCAwXG5NICBWMzAgNDEgTyAxOC43OTE4IC03LjgyMTggMCAwXG5NICBWMzAgNDIgTyAxNy44NDA0IC0xMC43NTEgMCAwXG5NICBWMzAgNDMgTiAxNC44Mjc0IC0xMS4zOTE0IDAgMFxuTSAgVjMwIDQ0IEMgMTUuNzMyNSAtMTIuNjM3MiAwIDBcbk0gIFYzMCA0NSBDIDE1LjI1NjcgLTE0LjEwMTggMCAwXG5NICBWMzAgNDYgTyAxNy4yNTM3IC0xMi4zOTYzIDAgMFxuTSAgVjMwIDQ3IE8gMTguMjYyOCAtNS4zNzIgMCAwXG5NICBWMzAgNDggTyAtNC45NDk0IC0zLjQ4ODUgMCAwXG5NICBWMzAgNDkgQyAtNC41MjEgMC4wNjczIDAgMFxuTSAgVjMwIDUwIEMgLTEuOTQxNCAwLjIwMjYgMCAwXG5NICBWMzAgNTEgQyAtMC42MDc3IC0wLjU2NzQgMCAwXG5NICBWMzAgNTIgQyAwLjcyNiAwLjIwMjYgMCAwXG5NICBWMzAgNTMgTiAyLjA1OTYgLTAuNTY3NCAwIDBcbk0gIFYzMCA1NCBDIDMuMzkzMyAwLjIwMjYgMCAwXG5NICBWMzAgNTUgQyA0LjcyNzEgLTAuNTY3NCAwIDBcbk0gIFYzMCA1NiBDIDYuMDYwNiAwLjIwMjYgMCAwXG5NICBWMzAgNTcgTiA3LjM5NDMgLTAuNTY3NCAwIDBcbk0gIFYzMCA1OCBDIDguNzI4MSAwLjIwMjYgMCAwXG5NICBWMzAgNTkgQyAxMC4wNjE4IC0wLjU2NzQgMCAwXG5NICBWMzAgNjAgQyAxMS4zOTUzIDAuMjAyNiAwIDBcbk0gIFYzMCA2MSBDIDE0LjA2MjggMC4yMDI2IDAgMFxuTSAgVjMwIDYyIE8gMTUuMzk2NCAtMC41Njc0IDAgMFxuTSAgVjMwIDYzIE8gMC43MjYgMS43NDI2IDAgMFxuTSAgVjMwIDY0IE8gOC43MjgxIDEuNzQyNiAwIDBcbk0gIFYzMCA2NSBDIDE2LjczMDEgMC4yMDI2IDAgMFxuTSAgVjMwIDY2IEMgMTguMDYzOCAtMC41Njc2IDAgMFxuTSAgVjMwIDY3IEMgMTkuMzk3NiAwLjIwMjYgMCAwXG5NICBWMzAgNjggQyAxOS4zOTc0IDEuNzQyNiAwIDBcbk0gIFYzMCA2OSBDIDE4LjA2MzggMi41MTI2IDAgMFxuTSAgVjMwIDcwIE8gMTYuNzMwMSAxLjc0MjYgMCAwXG5NICBWMzAgNzEgQyAxOC4wNjQgNC4wNTI2IDAgMFxuTSAgVjMwIDcyIE8gMjAuNzMxMSAyLjUxMjYgMCAwXG5NICBWMzAgNzMgTyAyMC43MzEzIC0wLjU2NzQgMCAwXG5NICBWMzAgNzQgTiAxOC4wNjM4IC0yLjEwNzYgMCAwXG5NICBWMzAgNzUgQyAxOS4zMDk2IC0zLjAxMjcgMCAwXG5NICBWMzAgNzYgQyAxOS4zMDk2IC00LjU1MjcgMCAwXG5NICBWMzAgNzcgTyAyMC42ODE4IC0yLjMxMzUgMCAwXG5NICBWMzAgNzggTyAxOS40NzA5IDQuNjc5MSAwIDBcbk0gIFYzMCA3OSBPIC0zLjE4NzIgLTAuNzAyNyAwIDBcbk0gIFYzMCA4MCBDIDEyLjcyOTEgLTAuNTY3NCAwIDBcbk0gIFYzMCA4MSBDIC0zLjkxOSAzLjIyNzcgMCAwXG5NICBWMzAgODIgQyAtMi40MTI2IDIuOTA3NiAwIDBcbk0gIFYzMCA4MyBDIC0xLjM4MjIgNC4wNTE5IDAgMFxuTSAgVjMwIDg0IE4gMC4xMjQyIDMuNzMxNyAwIDBcbk0gIFYzMCA4NSBDIDEuMTU0NiA0Ljg3NjIgMCAwXG5NICBWMzAgODYgQyAyLjY2MSA0LjU1NjEgMCAwXG5NICBWMzAgODcgQyAzLjY5MTQgNS43MDA1IDAgMFxuTSAgVjMwIDg4IE4gNS4xOTc4IDUuMzgwNCAwIDBcbk0gIFYzMCA4OSBDIDYuMjI4MiA2LjUyNDggMCAwXG5NICBWMzAgOTAgQyA3LjczNDYgNi4yMDQ1IDAgMFxuTSAgVjMwIDkxIEMgOC43NjUgNy4zNDkgMCAwXG5NICBWMzAgOTIgQyAxMC4yNzE0IDcuMDI4OCAwIDBcbk0gIFYzMCA5MyBDIDExLjMwMTggOC4xNzMzIDAgMFxuTSAgVjMwIDk0IE8gMTIuODA4MiA3Ljg1MzIgMCAwXG5NICBWMzAgOTUgTyAtMS44NTggNS41MTY3IDAgMFxuTSAgVjMwIDk2IE8gNS43NTI0IDcuOTg5NCAwIDBcbk0gIFYzMCA5NyBDIDEzLjgzODYgOC45OTc2IDAgMFxuTSAgVjMwIDk4IEMgMTUuMzQ1IDguNjc3MyAwIDBcbk0gIFYzMCA5OSBDIDE2LjM3NTYgOS44MjE5IDAgMFxuTSAgVjMwIDEwMCBDIDE1Ljg5OTYgMTEuMjg2MyAwIDBcbk0gIFYzMCAxMDEgQyAxNC4zOTM0IDExLjYwNjggMCAwXG5NICBWMzAgMTAyIE8gMTMuMzYyOCAxMC40NjIyIDAgMFxuTSAgVjMwIDEwMyBDIDEzLjkxNzYgMTMuMDcxNCAwIDBcbk0gIFYzMCAxMDQgTyAxNi45MyAxMi40MzA4IDAgMFxuTSAgVjMwIDEwNSBPIDE3Ljg4MiA5LjUwMTggMCAwXG5NICBWMzAgMTA2IE4gMTUuODIwOCA3LjIxMjcgMCAwXG5NICBWMzAgMTA3IEMgMTcuMjg1NiA2LjczNjcgMCAwXG5NICBWMzAgMTA4IEMgMTcuNzYxNCA1LjI3MjEgMCAwXG5NICBWMzAgMTA5IE8gMTguMzc0NCA3LjgyNTcgMCAwXG5NICBWMzAgMTEwIE8gMTUuMDYyIDE0LjEwMTggMCAwXG5NICBWMzAgMTExIE8gLTQuODI0MSAxLjk4MTcgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDIgM1xuTSAgVjMwIDIgMSAzIDRcbk0gIFYzMCAzIDEgNiA3XG5NICBWMzAgNCAxIDcgOFxuTSAgVjMwIDUgMSA4IDlcbk0gIFYzMCA2IDEgOSAxMFxuTSAgVjMwIDcgMSAxIDJcbk0gIFYzMCA4IDEgMyAxMlxuTSAgVjMwIDkgMSA0IDVcbk0gIFYzMCAxMCAxIDUgNlxuTSAgVjMwIDExIDIgNiAxM1xuTSAgVjMwIDEyIDEgMTAgMTFcbk0gIFYzMCAxMyAxIDExIDE1XG5NICBWMzAgMTQgMSAxNSAxNlxuTSAgVjMwIDE1IDEgMTUgMTdcbk0gIFYzMCAxNiAyIDEwIDE0XG5NICBWMzAgMTcgMSAxOCAxOVxuTSAgVjMwIDE4IDEgMTkgMjBcbk0gIFYzMCAxOSAxIDIyIDIzXG5NICBWMzAgMjAgMSAyMyAyNFxuTSAgVjMwIDIxIDEgMjYgMjdcbk0gIFYzMCAyMiAxIDI3IDI4XG5NICBWMzAgMjMgMSAyOCAyOVxuTSAgVjMwIDI0IDEgMjkgMzBcbk0gIFYzMCAyNSAyIDI2IDMzXG5NICBWMzAgMjYgMiAyMCAzMlxuTSAgVjMwIDI3IDEgMjAgMjFcbk0gIFYzMCAyOCAxIDIxIDIyXG5NICBWMzAgMjkgMSAyNCAyNVxuTSAgVjMwIDMwIDEgMjUgMjZcbk0gIFYzMCAzMSAxIDMwIDMxXG5NICBWMzAgMzIgMSAzMSAzNFxuTSAgVjMwIDMzIDEgMzUgMzZcbk0gIFYzMCAzNCAxIDM2IDM3XG5NICBWMzAgMzUgMSAzNyAzOFxuTSAgVjMwIDM2IDEgMzQgMzVcbk0gIFYzMCAzNyAxIDM4IDM5XG5NICBWMzAgMzggMSAzNCAzOVxuTSAgVjMwIDM5IDEgMzggNDBcbk0gIFYzMCA0MCAxIDM1IDQzXG5NICBWMzAgNDEgMSA0MyA0NFxuTSAgVjMwIDQyIDEgNDQgNDVcbk0gIFYzMCA0MyAyIDQ0IDQ2XG5NICBWMzAgNDQgMSAzNiA0MlxuTSAgVjMwIDQ1IDEgMzcgNDFcbk0gIFYzMCA0NiAxIDQwIDQ3XG5NICBWMzAgNDcgMSAxOCA0OFxuTSAgVjMwIDQ4IDEgMTUgNDlcbk0gIFYzMCA0OSAxIDUwIDUxXG5NICBWMzAgNTAgMSA1MSA1MlxuTSAgVjMwIDUxIDEgNTQgNTVcbk0gIFYzMCA1MiAxIDU1IDU2XG5NICBWMzAgNTMgMSA1OCA1OVxuTSAgVjMwIDU0IDEgNTkgNjBcbk0gIFYzMCA1NSAyIDU4IDY0XG5NICBWMzAgNTYgMiA1MiA2M1xuTSAgVjMwIDU3IDEgNTIgNTNcbk0gIFYzMCA1OCAxIDUzIDU0XG5NICBWMzAgNTkgMSA1NiA1N1xuTSAgVjMwIDYwIDEgNTcgNThcbk0gIFYzMCA2MSAxIDYxIDYyXG5NICBWMzAgNjIgMSA2MiA2NVxuTSAgVjMwIDYzIDEgNjYgNjdcbk0gIFYzMCA2NCAxIDY3IDY4XG5NICBWMzAgNjUgMSA2OCA2OVxuTSAgVjMwIDY2IDEgNjUgNjZcbk0gIFYzMCA2NyAxIDY5IDcwXG5NICBWMzAgNjggMSA2NSA3MFxuTSAgVjMwIDY5IDEgNjkgNzFcbk0gIFYzMCA3MCAxIDY2IDc0XG5NICBWMzAgNzEgMSA3NCA3NVxuTSAgVjMwIDcyIDEgNzUgNzZcbk0gIFYzMCA3MyAyIDc1IDc3XG5NICBWMzAgNzQgMSA2NyA3M1xuTSAgVjMwIDc1IDEgNjggNzJcbk0gIFYzMCA3NiAxIDcxIDc4XG5NICBWMzAgNzcgMSA1MCA3OVxuTSAgVjMwIDc4IDEgNDkgNzlcbk0gIFYzMCA3OSAxIDYwIDgwXG5NICBWMzAgODAgMSA4MCA2MVxuTSAgVjMwIDgxIDEgODEgODJcbk0gIFYzMCA4MiAxIDgyIDgzXG5NICBWMzAgODMgMSA4NSA4NlxuTSAgVjMwIDg0IDEgODYgODdcbk0gIFYzMCA4NSAxIDg5IDkwXG5NICBWMzAgODYgMSA5MCA5MVxuTSAgVjMwIDg3IDEgOTEgOTJcbk0gIFYzMCA4OCAxIDkyIDkzXG5NICBWMzAgODkgMiA4OSA5NlxuTSAgVjMwIDkwIDIgODMgOTVcbk0gIFYzMCA5MSAxIDgzIDg0XG5NICBWMzAgOTIgMSA4NCA4NVxuTSAgVjMwIDkzIDEgODcgODhcbk0gIFYzMCA5NCAxIDg4IDg5XG5NICBWMzAgOTUgMSA5MyA5NFxuTSAgVjMwIDk2IDEgOTQgOTdcbk0gIFYzMCA5NyAxIDk4IDk5XG5NICBWMzAgOTggMSA5OSAxMDBcbk0gIFYzMCA5OSAxIDEwMCAxMDFcbk0gIFYzMCAxMDAgMSA5NyA5OFxuTSAgVjMwIDEwMSAxIDEwMSAxMDJcbk0gIFYzMCAxMDIgMSA5NyAxMDJcbk0gIFYzMCAxMDMgMSAxMDEgMTAzXG5NICBWMzAgMTA0IDEgOTggMTA2XG5NICBWMzAgMTA1IDEgMTA2IDEwN1xuTSAgVjMwIDEwNiAxIDEwNyAxMDhcbk0gIFYzMCAxMDcgMiAxMDcgMTA5XG5NICBWMzAgMTA4IDEgOTkgMTA1XG5NICBWMzAgMTA5IDEgMTAwIDEwNFxuTSAgVjMwIDExMCAxIDEwMyAxMTBcbk0gIFYzMCAxMTEgMSA4MSAxMTFcbk0gIFYzMCAxMTIgMSAxNiAxMTFcbk0gIFYzMCAxMTMgMSAxNyA0OFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5jb25zdCBHQUxOQUNQUklNRSA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlcyAgICAgICAgICBcblxuMCAgMCAgMCAgICAgMCAgMCAgICAgICAgICAgIDk5OSBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgMTExIDExMyAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMjAuNzMxMyAwLjcwMjcgMCAwXG5NICBWMzAgMiBDIDE5LjM5NzYgLTAuMDY3MyAwIDBcbk0gIFYzMCAzIEMgMTguMDYzOCAwLjcwMjcgMCAwXG5NICBWMzAgNCBDIDE2LjczMDMgLTAuMDY3MyAwIDBcbk0gIFYzMCA1IE4gMTUuMzk2NSAwLjcwMjcgMCAwXG5NICBWMzAgNiBDIDE0LjA2MjggLTAuMDY3MyAwIDBcbk0gIFYzMCA3IEMgMTIuNzI5MyAwLjcwMjcgMCAwXG5NICBWMzAgOCBDIDExLjM5NTUgLTAuMDY3MyAwIDBcbk0gIFYzMCA5IEMgMTAuMDYyIDAuNzAyNyAwIDBcbk0gIFYzMCAxMCBDIDguNzI4MyAtMC4wNjczIDAgMFxuTSAgVjMwIDExIE4gNy4zOTQ3IDAuNzAyNyAwIDBcbk0gIFYzMCAxMiBPIDE4LjA2MzggMi4yNDI3IDAgMFxuTSAgVjMwIDEzIE8gMTQuMDYyOCAtMS42MDczIDAgMFxuTSAgVjMwIDE0IE8gOC43MjgzIC0xLjYwNzMgMCAwXG5NICBWMzAgMTUgQyA1Ljg1NDcgMC43MDI3IDAgMFxuTSAgVjMwIDE2IEMgNS44NTQ3IC0wLjgzNzMgMCAwXG5NICBWMzAgMTcgQyA1Ljg1NDcgMi4yNDI3IDAgMFxuTSAgVjMwIDE4IEMgMy40ODQ4IDMuMDEyNyAwIDBcbk0gIFYzMCAxOSBDIDIuNDU0NCA0LjE1NyAwIDBcbk0gIFYzMCAyMCBDIDAuOTQ4IDMuODM2OCAwIDBcbk0gIFYzMCAyMSBOIC0wLjA4MjQgNC45ODEzIDAgMFxuTSAgVjMwIDIyIEMgLTEuNTg4OCA0LjY2MTIgMCAwXG5NICBWMzAgMjMgQyAtMi42MTkyIDUuODA1NiAwIDBcbk0gIFYzMCAyNCBDIC00LjEyNTYgNS40ODU1IDAgMFxuTSAgVjMwIDI1IE4gLTUuMTU2IDYuNjI5NyAwIDBcbk0gIFYzMCAyNiBDIC02LjY2MjQgNi4zMDk2IDAgMFxuTSAgVjMwIDI3IEMgLTcuNjkyOCA3LjQ1NDEgMCAwXG5NICBWMzAgMjggQyAtOS4xOTkyIDcuMTMzOSAwIDBcbk0gIFYzMCAyOSBDIC0xMC4yMjk2IDguMjc4NCAwIDBcbk0gIFYzMCAzMCBDIC0xMS43MzYgNy45NTgzIDAgMFxuTSAgVjMwIDMxIE8gLTEyLjc2NjQgOS4xMDI3IDAgMFxuTSAgVjMwIDMyIE8gMC40NzIyIDIuMzcyMyAwIDBcbk0gIFYzMCAzMyBPIC03LjEzODIgNC44NDUgMCAwXG5NICBWMzAgMzQgQyAtMTQuMjcyOCA4Ljc4MjQgMCAwXG5NICBWMzAgMzUgQyAtMTUuMzAzMiA5LjkyNjcgMCAwXG5NICBWMzAgMzYgQyAtMTYuODA5OCA5LjYwNjUgMCAwXG5NICBWMzAgMzcgQyAtMTcuMjg1NiA4LjE0MjEgMCAwXG5NICBWMzAgMzggQyAtMTYuMjU1MiA2Ljk5NzUgMCAwXG5NICBWMzAgMzkgTyAtMTQuNzQ4NiA3LjMxNzggMCAwXG5NICBWMzAgNDAgQyAtMTYuNzMxMiA1LjUzMjkgMCAwXG5NICBWMzAgNDEgTyAtMTguNzkxOCA3LjgyMTggMCAwXG5NICBWMzAgNDIgTyAtMTcuODQwNCAxMC43NTEgMCAwXG5NICBWMzAgNDMgTiAtMTQuODI3NCAxMS4zOTE0IDAgMFxuTSAgVjMwIDQ0IEMgLTE1LjczMjUgMTIuNjM3MiAwIDBcbk0gIFYzMCA0NSBDIC0xNS4yNTY3IDE0LjEwMTggMCAwXG5NICBWMzAgNDYgTyAtMTcuMjUzNyAxMi4zOTYzIDAgMFxuTSAgVjMwIDQ3IE8gLTE4LjI2MjggNS4zNzIgMCAwXG5NICBWMzAgNDggTyA0Ljk0OTQgMy40ODg1IDAgMFxuTSAgVjMwIDQ5IEMgNC41MjEgLTAuMDY3MyAwIDBcbk0gIFYzMCA1MCBDIDEuOTQxNCAtMC4yMDI2IDAgMFxuTSAgVjMwIDUxIEMgMC42MDc3IDAuNTY3NCAwIDBcbk0gIFYzMCA1MiBDIC0wLjcyNiAtMC4yMDI2IDAgMFxuTSAgVjMwIDUzIE4gLTIuMDU5NiAwLjU2NzQgMCAwXG5NICBWMzAgNTQgQyAtMy4zOTMzIC0wLjIwMjYgMCAwXG5NICBWMzAgNTUgQyAtNC43MjcxIDAuNTY3NCAwIDBcbk0gIFYzMCA1NiBDIC02LjA2MDYgLTAuMjAyNiAwIDBcbk0gIFYzMCA1NyBOIC03LjM5NDMgMC41Njc0IDAgMFxuTSAgVjMwIDU4IEMgLTguNzI4MSAtMC4yMDI2IDAgMFxuTSAgVjMwIDU5IEMgLTEwLjA2MTggMC41Njc0IDAgMFxuTSAgVjMwIDYwIEMgLTExLjM5NTMgLTAuMjAyNiAwIDBcbk0gIFYzMCA2MSBDIC0xNC4wNjI4IC0wLjIwMjYgMCAwXG5NICBWMzAgNjIgTyAtMTUuMzk2NCAwLjU2NzQgMCAwXG5NICBWMzAgNjMgTyAtMC43MjYgLTEuNzQyNiAwIDBcbk0gIFYzMCA2NCBPIC04LjcyODEgLTEuNzQyNiAwIDBcbk0gIFYzMCA2NSBDIC0xNi43MzAxIC0wLjIwMjYgMCAwXG5NICBWMzAgNjYgQyAtMTguMDYzOCAwLjU2NzYgMCAwXG5NICBWMzAgNjcgQyAtMTkuMzk3NiAtMC4yMDI2IDAgMFxuTSAgVjMwIDY4IEMgLTE5LjM5NzQgLTEuNzQyNiAwIDBcbk0gIFYzMCA2OSBDIC0xOC4wNjM4IC0yLjUxMjYgMCAwXG5NICBWMzAgNzAgTyAtMTYuNzMwMSAtMS43NDI2IDAgMFxuTSAgVjMwIDcxIEMgLTE4LjA2NCAtNC4wNTI2IDAgMFxuTSAgVjMwIDcyIE8gLTIwLjczMTEgLTIuNTEyNiAwIDBcbk0gIFYzMCA3MyBPIC0yMC43MzEzIDAuNTY3NCAwIDBcbk0gIFYzMCA3NCBOIC0xOC4wNjM4IDIuMTA3NiAwIDBcbk0gIFYzMCA3NSBDIC0xOS4zMDk2IDMuMDEyNyAwIDBcbk0gIFYzMCA3NiBDIC0xOS4zMDk2IDQuNTUyNyAwIDBcbk0gIFYzMCA3NyBPIC0yMC42ODE4IDIuMzEzNSAwIDBcbk0gIFYzMCA3OCBPIC0xOS40NzA5IC00LjY3OTEgMCAwXG5NICBWMzAgNzkgTyAzLjE4NzIgMC43MDI3IDAgMFxuTSAgVjMwIDgwIEMgLTEyLjcyOTEgMC41Njc0IDAgMFxuTSAgVjMwIDgxIEMgMy45MTkgLTMuMjI3NyAwIDBcbk0gIFYzMCA4MiBDIDIuNDEyNiAtMi45MDc2IDAgMFxuTSAgVjMwIDgzIEMgMS4zODIyIC00LjA1MTkgMCAwXG5NICBWMzAgODQgTiAtMC4xMjQyIC0zLjczMTcgMCAwXG5NICBWMzAgODUgQyAtMS4xNTQ2IC00Ljg3NjIgMCAwXG5NICBWMzAgODYgQyAtMi42NjEgLTQuNTU2MSAwIDBcbk0gIFYzMCA4NyBDIC0zLjY5MTQgLTUuNzAwNSAwIDBcbk0gIFYzMCA4OCBOIC01LjE5NzggLTUuMzgwNCAwIDBcbk0gIFYzMCA4OSBDIC02LjIyODIgLTYuNTI0OCAwIDBcbk0gIFYzMCA5MCBDIC03LjczNDYgLTYuMjA0NSAwIDBcbk0gIFYzMCA5MSBDIC04Ljc2NSAtNy4zNDkgMCAwXG5NICBWMzAgOTIgQyAtMTAuMjcxNCAtNy4wMjg4IDAgMFxuTSAgVjMwIDkzIEMgLTExLjMwMTggLTguMTczMyAwIDBcbk0gIFYzMCA5NCBPIC0xMi44MDgyIC03Ljg1MzIgMCAwXG5NICBWMzAgOTUgTyAxLjg1OCAtNS41MTY3IDAgMFxuTSAgVjMwIDk2IE8gLTUuNzUyNCAtNy45ODk0IDAgMFxuTSAgVjMwIDk3IEMgLTEzLjgzODYgLTguOTk3NiAwIDBcbk0gIFYzMCA5OCBDIC0xNS4zNDUgLTguNjc3MyAwIDBcbk0gIFYzMCA5OSBDIC0xNi4zNzU2IC05LjgyMTkgMCAwXG5NICBWMzAgMTAwIEMgLTE1Ljg5OTYgLTExLjI4NjMgMCAwXG5NICBWMzAgMTAxIEMgLTE0LjM5MzQgLTExLjYwNjggMCAwXG5NICBWMzAgMTAyIE8gLTEzLjM2MjggLTEwLjQ2MjIgMCAwXG5NICBWMzAgMTAzIEMgLTEzLjkxNzYgLTEzLjA3MTQgMCAwXG5NICBWMzAgMTA0IE8gLTE2LjkzIC0xMi40MzA4IDAgMFxuTSAgVjMwIDEwNSBPIC0xNy44ODIgLTkuNTAxOCAwIDBcbk0gIFYzMCAxMDYgTiAtMTUuODIwOCAtNy4yMTI3IDAgMFxuTSAgVjMwIDEwNyBDIC0xNy4yODU2IC02LjczNjcgMCAwXG5NICBWMzAgMTA4IEMgLTE3Ljc2MTQgLTUuMjcyMSAwIDBcbk0gIFYzMCAxMDkgTyAtMTguMzc0NCAtNy44MjU3IDAgMFxuTSAgVjMwIDExMCBPIC0xNS4wNjIgLTE0LjEwMTggMCAwXG5NICBWMzAgMTExIE8gNC44MjQxIC0xLjk4MTcgMCAwXG5NICBWMzAgRU5EIEFUT01cbk0gIFYzMCBCRUdJTiBCT05EXG5NICBWMzAgMSAxIDIgM1xuTSAgVjMwIDIgMSAzIDRcbk0gIFYzMCAzIDEgNiA3XG5NICBWMzAgNCAxIDcgOFxuTSAgVjMwIDUgMSA4IDlcbk0gIFYzMCA2IDEgOSAxMFxuTSAgVjMwIDcgMSAxIDJcbk0gIFYzMCA4IDEgMyAxMlxuTSAgVjMwIDkgMSA0IDVcbk0gIFYzMCAxMCAxIDUgNlxuTSAgVjMwIDExIDIgNiAxM1xuTSAgVjMwIDEyIDEgMTAgMTFcbk0gIFYzMCAxMyAxIDExIDE1XG5NICBWMzAgMTQgMSAxNSAxNlxuTSAgVjMwIDE1IDEgMTUgMTdcbk0gIFYzMCAxNiAyIDEwIDE0XG5NICBWMzAgMTcgMSAxOCAxOVxuTSAgVjMwIDE4IDEgMTkgMjBcbk0gIFYzMCAxOSAxIDIyIDIzXG5NICBWMzAgMjAgMSAyMyAyNFxuTSAgVjMwIDIxIDEgMjYgMjdcbk0gIFYzMCAyMiAxIDI3IDI4XG5NICBWMzAgMjMgMSAyOCAyOVxuTSAgVjMwIDI0IDEgMjkgMzBcbk0gIFYzMCAyNSAyIDI2IDMzXG5NICBWMzAgMjYgMiAyMCAzMlxuTSAgVjMwIDI3IDEgMjAgMjFcbk0gIFYzMCAyOCAxIDIxIDIyXG5NICBWMzAgMjkgMSAyNCAyNVxuTSAgVjMwIDMwIDEgMjUgMjZcbk0gIFYzMCAzMSAxIDMwIDMxXG5NICBWMzAgMzIgMSAzMSAzNFxuTSAgVjMwIDMzIDEgMzUgMzZcbk0gIFYzMCAzNCAxIDM2IDM3XG5NICBWMzAgMzUgMSAzNyAzOFxuTSAgVjMwIDM2IDEgMzQgMzVcbk0gIFYzMCAzNyAxIDM4IDM5XG5NICBWMzAgMzggMSAzNCAzOVxuTSAgVjMwIDM5IDEgMzggNDBcbk0gIFYzMCA0MCAxIDM1IDQzXG5NICBWMzAgNDEgMSA0MyA0NFxuTSAgVjMwIDQyIDEgNDQgNDVcbk0gIFYzMCA0MyAyIDQ0IDQ2XG5NICBWMzAgNDQgMSAzNiA0MlxuTSAgVjMwIDQ1IDEgMzcgNDFcbk0gIFYzMCA0NiAxIDQwIDQ3XG5NICBWMzAgNDcgMSAxOCA0OFxuTSAgVjMwIDQ4IDEgMTUgNDlcbk0gIFYzMCA0OSAxIDUwIDUxXG5NICBWMzAgNTAgMSA1MSA1MlxuTSAgVjMwIDUxIDEgNTQgNTVcbk0gIFYzMCA1MiAxIDU1IDU2XG5NICBWMzAgNTMgMSA1OCA1OVxuTSAgVjMwIDU0IDEgNTkgNjBcbk0gIFYzMCA1NSAyIDU4IDY0XG5NICBWMzAgNTYgMiA1MiA2M1xuTSAgVjMwIDU3IDEgNTIgNTNcbk0gIFYzMCA1OCAxIDUzIDU0XG5NICBWMzAgNTkgMSA1NiA1N1xuTSAgVjMwIDYwIDEgNTcgNThcbk0gIFYzMCA2MSAxIDYxIDYyXG5NICBWMzAgNjIgMSA2MiA2NVxuTSAgVjMwIDYzIDEgNjYgNjdcbk0gIFYzMCA2NCAxIDY3IDY4XG5NICBWMzAgNjUgMSA2OCA2OVxuTSAgVjMwIDY2IDEgNjUgNjZcbk0gIFYzMCA2NyAxIDY5IDcwXG5NICBWMzAgNjggMSA2NSA3MFxuTSAgVjMwIDY5IDEgNjkgNzFcbk0gIFYzMCA3MCAxIDY2IDc0XG5NICBWMzAgNzEgMSA3NCA3NVxuTSAgVjMwIDcyIDEgNzUgNzZcbk0gIFYzMCA3MyAyIDc1IDc3XG5NICBWMzAgNzQgMSA2NyA3M1xuTSAgVjMwIDc1IDEgNjggNzJcbk0gIFYzMCA3NiAxIDcxIDc4XG5NICBWMzAgNzcgMSA1MCA3OVxuTSAgVjMwIDc4IDEgNDkgNzlcbk0gIFYzMCA3OSAxIDYwIDgwXG5NICBWMzAgODAgMSA4MCA2MVxuTSAgVjMwIDgxIDEgODEgODJcbk0gIFYzMCA4MiAxIDgyIDgzXG5NICBWMzAgODMgMSA4NSA4NlxuTSAgVjMwIDg0IDEgODYgODdcbk0gIFYzMCA4NSAxIDg5IDkwXG5NICBWMzAgODYgMSA5MCA5MVxuTSAgVjMwIDg3IDEgOTEgOTJcbk0gIFYzMCA4OCAxIDkyIDkzXG5NICBWMzAgODkgMiA4OSA5NlxuTSAgVjMwIDkwIDIgODMgOTVcbk0gIFYzMCA5MSAxIDgzIDg0XG5NICBWMzAgOTIgMSA4NCA4NVxuTSAgVjMwIDkzIDEgODcgODhcbk0gIFYzMCA5NCAxIDg4IDg5XG5NICBWMzAgOTUgMSA5MyA5NFxuTSAgVjMwIDk2IDEgOTQgOTdcbk0gIFYzMCA5NyAxIDk4IDk5XG5NICBWMzAgOTggMSA5OSAxMDBcbk0gIFYzMCA5OSAxIDEwMCAxMDFcbk0gIFYzMCAxMDAgMSA5NyA5OFxuTSAgVjMwIDEwMSAxIDEwMSAxMDJcbk0gIFYzMCAxMDIgMSA5NyAxMDJcbk0gIFYzMCAxMDMgMSAxMDEgMTAzXG5NICBWMzAgMTA0IDEgOTggMTA2XG5NICBWMzAgMTA1IDEgMTA2IDEwN1xuTSAgVjMwIDEwNiAxIDEwNyAxMDhcbk0gIFYzMCAxMDcgMiAxMDcgMTA5XG5NICBWMzAgMTA4IDEgOTkgMTA1XG5NICBWMzAgMTA5IDEgMTAwIDEwNFxuTSAgVjMwIDExMCAxIDEwMyAxMTBcbk0gIFYzMCAxMTEgMSA4MSAxMTFcbk0gIFYzMCAxMTIgMSAxNiAxMTFcbk0gIFYzMCAxMTMgMSAxNyA0OFxuTSAgVjMwIEVORCBCT05EXG5NICBWMzAgRU5EIENUQUJcbk0gIEVORGA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyA/IG1vbEJsb2Nrcy5wdXNoKEdBTE5BQykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQykoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQykoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyA/IG1vbEJsb2Nrcy5wdXNoKEdBTE5BQ1BSSU1FKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2Nrcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGlua1N0cmFuZHNWMzAwMChzdHJhbmRzLCB1c2VDaGlyYWxpdHkgPSB0cnVlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCB4U2hpZnQgPSAwO1xuICAgIC8vIGlmICh0d29DaGFpbnMgJiYgbW9sQmxvY2tzLmxlbmd0aCA+IDEpXG4gICAgLy8gICBtb2xCbG9ja3NbMV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbEJsb2Nrc1sxXSk7XG4gICAgaWYgKHN0cmFuZHMuYW50aVN0cmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmFuZHMuYW50aVN0cmFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmFuZHMuYW50aVN0cmFuZHNbaV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKHN0cmFuZHMuYW50aVN0cmFuZHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBpbnZlcnRlZCA9IGZhbHNlO1xuICAgIGxldCBtb2xCbG9ja3MgPSBzdHJhbmRzLnNlbnNlU3RyYW5kcy5jb25jYXQoc3RyYW5kcy5hbnRpU3RyYW5kcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2xCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPj0gc3RyYW5kcy5zZW5zZVN0cmFuZHMubGVuZ3RoICYmIGludmVydGVkID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpbnZlcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB4U2hpZnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5yZXBsYWNlQWxsKCcoLVxcbk0gIFYzMCAnLCAnKCcpXG4gICAgICAgICAgICAucmVwbGFjZUFsbCgnLVxcbk0gIFYzMCAnLCAnJykucmVwbGFjZUFsbCgnICknLCAnKScpO1xuICAgICAgICBjb25zdCBudW1iZXJzID0gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2tzW2ldKTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBpZiAoaW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHhTaGlmdFJpZ2h0ID0gTWF0aC5taW4oLi4uY29vcmRpbmF0ZXMueCkgLSB4U2hpZnQ7XG4gICAgICAgICAgICBjb25zdCB5U2hpZnQgPSAhaW52ZXJ0ZWQgPyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSAtIDEgOiBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KSArIDEwO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlcy54Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbal0gLT0geFNoaWZ0UmlnaHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb3JkaW5hdGVzLnkubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMueVtqXSAtPSB5U2hpZnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4QXRvbXMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgICAgIGluZGV4QXRvbXMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXhBdG9tcyk7XG4gICAgICAgIGxldCBpbmRleCA9IGluZGV4QXRvbXM7XG4gICAgICAgIGxldCBpbmRleEVuZCA9IGluZGV4QXRvbXM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYXRvbTsgaisrKSB7XG4gICAgICAgICAgICAvLyBpZiAoY29vcmRpbmF0ZXMuYXRvbUluZGV4W2pdICE9IDEgfHwgaSA9PSAwIHx8IHR3b0NoYWlucykge1xuICAgICAgICAgICAgLy9yZXdyaXRlIGF0b20gbnVtYmVyXG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAvL3Jld3JpdGUgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxTaGlmdCA9IHRydWUgPyAwIDogeFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgIGxldCBjb29yZGluYXRlID0gdHJ1ZSA/XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIGNvb3JkaW5hdGVzLnhbal0pIC8gMTAwMDAgOlxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgY29vcmRpbmF0ZSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBjb29yZGluYXRlID0gdHJ1ZSA/XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIGNvb3JkaW5hdGVzLnlbal0pIC8gMTAwMDAgOlxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpKSkgLyAxMDAwMDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBjb29yZGluYXRlICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEFUT00nKTtcbiAgICAgICAgYXRvbUJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhBdG9tcyArIDEsIGluZGV4QXRvbXNFbmQpO1xuICAgICAgICBsZXQgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICAgICAgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEJvbmRzO1xuICAgICAgICBpbmRleEVuZCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYm9uZDsgaisrKSB7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYm9uZCBudW1iZXJcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYm9uZE51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYm9uZDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBib25kTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIHBhaXIgaW4gYm9uZFxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBsZXQgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBNYXRoLm1pbihtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpLCBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICAgICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEJvbmRFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgICAgIGJvbmRCbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgICAgICBsZXQgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGNvbGxlY3Rpb25zXG4gICAgICAgIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignKScsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRW5kKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChwYXJzZUludChlKSArIG5hdG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBuYXRvbSArPSB0cnVlID8gbnVtYmVycy5uYXRvbSA6IG51bWJlcnMubmF0b20gLSAxO1xuICAgICAgICBuYm9uZCArPSBudW1iZXJzLm5ib25kO1xuICAgICAgICB4U2hpZnQgKz0gTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyAxOyAvL3R3b0NoYWlucyA/IDAgOiBjb29yZGluYXRlcy54W251bWJlcnMubmF0b20gLSAxXSAtIGNvb3JkaW5hdGVzLnhbMF07XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXMgPSA0O1xuICAgIGNvbnN0IGNvbGxOdW1iZXIgPSBNYXRoLmNlaWwoY29sbGVjdGlvbi5sZW5ndGggLyBlbnRyaWVzKTtcbiAgICAvL2lmIChvY2xSZW5kZXIpIHtcbiAgICAvLyBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnICsgY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgLy8gZm9yIChsZXQgaiA9IDA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKVxuICAgIC8vICAgY29sbGVjdGlvbkJsb2NrICs9ICcgJyArIGNvbGxlY3Rpb25bal07XG4gICAgLy8gY29sbGVjdGlvbkJsb2NrICs9ICcpXFxuJztcbiAgICAvL30gZWxzZSB7XG4gICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoICsgJyAtXFxuJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbGxOdW1iZXI7IGkrKykge1xuICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCAnO1xuICAgICAgICBjb25zdCBlbnRyaWVzQ3VycmVudCA9IGkgKyAxID09IGNvbGxOdW1iZXIgPyBjb2xsZWN0aW9uLmxlbmd0aCAtIChjb2xsTnVtYmVyIC0gMSkgKiBlbnRyaWVzIDogZW50cmllcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbnRyaWVzQ3VycmVudDsgaisrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gKGogKyAxID09IGVudHJpZXNDdXJyZW50KSA/XG4gICAgICAgICAgICAgICAgKGkgPT0gY29sbE51bWJlciAtIDEgPyBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnKVxcbicgOiBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnIC1cXG4nKSA6XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vfVxuICAgIC8vZ2VuZXJhdGUgZmlsZVxuICAgIHRydWUgPyBuYXRvbSA6IG5hdG9tKys7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIENPVU5UUyAnICsgbmF0b20gKyAnICcgKyBuYm9uZCArICcgMCAwIDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9IGF0b21CbG9jaztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEFUT01cXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9IGJvbmRCbG9jaztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEJPTkRcXG4nO1xuICAgIGlmICh1c2VDaGlyYWxpdHkpIHtcbiAgICAgICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cXG4nO1xuICAgICAgICBtYWNyb01vbEJsb2NrICs9IGNvbGxlY3Rpb25CbG9jaztcbiAgICAgICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDT0xMRUNUSU9OXFxuJztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBtYWNyb01vbEJsb2NrID0gbWFjcm9Nb2xCbG9jay5yZXBsYWNlKC8gQ0ZHPVxcZC9nLCAnICcpO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQ1RBQlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgRU5EJztcbiAgICByZXR1cm4gbWFjcm9Nb2xCbG9jaztcbn1cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVjMwMDAobW9sQmxvY2tzLCB1c2VDaGlyYWxpdHkgPSB0cnVlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCB4U2hpZnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9sQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5yZXBsYWNlQWxsKCcoLVxcbk0gIFYzMCAnLCAnKCcpXG4gICAgICAgICAgICAucmVwbGFjZUFsbCgnLVxcbk0gIFYzMCAnLCAnJykucmVwbGFjZUFsbCgnICknLCAnKScpO1xuICAgICAgICBjb25zdCBudW1iZXJzID0gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2tzW2ldKTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBsZXQgaW5kZXhBdG9tcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICAgICAgaW5kZXhBdG9tcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEF0b21zKTtcbiAgICAgICAgbGV0IGluZGV4ID0gaW5kZXhBdG9tcztcbiAgICAgICAgbGV0IGluZGV4RW5kID0gaW5kZXhBdG9tcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJzLm5hdG9tOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5hdG9tSW5kZXhbal0gIT0gMSB8fCBpID09IDApIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0geFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpKSkgLyAxMDAwMDtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgY29vcmRpbmF0ZSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCcsIGluZGV4KSAtIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEF0b21zRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBFTkQgQVRPTScpO1xuICAgICAgICBhdG9tQmxvY2sgKz0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleEF0b21zICsgMSwgaW5kZXhBdG9tc0VuZCk7XG4gICAgICAgIGxldCBpbmRleEJvbmRzID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBCT05EJyk7IC8vIFYzMDAwIGluZGV4IGZvciBib25kc1xuICAgICAgICBpbmRleEJvbmRzID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4Qm9uZHMpO1xuICAgICAgICBpbmRleCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGluZGV4RW5kID0gaW5kZXhCb25kcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJzLm5ib25kOyBqKyspIHtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBib25kIG51bWJlclxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBjb25zdCBib25kTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5ib25kO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGJvbmROdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgLy9yZXdyaXRlIGF0b20gcGFpciBpbiBib25kXG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgIGxldCBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleEVuZCA9IE1hdGgubWluKG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCksIG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpKTtcbiAgICAgICAgICAgIGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4Qm9uZEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEJPTkQnKTtcbiAgICAgICAgYm9uZEJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhCb25kcyArIDEsIGluZGV4Qm9uZEVuZCk7XG4gICAgICAgIGxldCBpbmRleENvbGxlY3Rpb24gPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgY29sbGVjdGlvbnNcbiAgICAgICAgd2hpbGUgKGluZGV4Q29sbGVjdGlvbiAhPSAtMSkge1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uICs9IDI4O1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcpJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleENvbGxlY3Rpb24sIGNvbGxlY3Rpb25FbmQpLnNwbGl0KCcgJykuc2xpY2UoMSk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uRW50cmllcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKHBhcnNlSW50KGUpICsgbmF0b20pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uRW5kO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnLCBpbmRleENvbGxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIG5hdG9tICs9IG51bWJlcnMubmF0b20gLSAxO1xuICAgICAgICBuYm9uZCArPSBudW1iZXJzLm5ib25kO1xuICAgICAgICB4U2hpZnQgKz0gY29vcmRpbmF0ZXMueFtudW1iZXJzLm5hdG9tIC0gMV0gLSBjb29yZGluYXRlcy54WzBdO1xuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzID0gNDtcbiAgICBjb25zdCBjb2xsTnVtYmVyID0gTWF0aC5jZWlsKGNvbGxlY3Rpb24ubGVuZ3RoIC8gZW50cmllcyk7XG4gICAgLy9pZiAob2NsUmVuZGVyKSB7XG4gICAgLy8gY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgIC8vIGZvciAobGV0IGogPSAwOyBqIDwgY29sbGVjdGlvbi5sZW5ndGg7IGorKylcbiAgICAvLyAgIGNvbGxlY3Rpb25CbG9jayArPSAnICcgKyBjb2xsZWN0aW9uW2pdO1xuICAgIC8vIGNvbGxlY3Rpb25CbG9jayArPSAnKVxcbic7XG4gICAgLy99IGVsc2Uge1xuICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsTnVtYmVyOyBpKyspIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgJztcbiAgICAgICAgY29uc3QgZW50cmllc0N1cnJlbnQgPSBpICsgMSA9PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpICogZW50cmllcyA6IGVudHJpZXM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZW50cmllc0N1cnJlbnQ7IGorKykge1xuICAgICAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9IChqICsgMSA9PSBlbnRyaWVzQ3VycmVudCkgP1xuICAgICAgICAgICAgICAgIChpID09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJylcXG4nIDogY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAtXFxuJykgOlxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25bZW50cmllcyAqIGkgKyBqXSArICcgJztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL31cbiAgICAvL2dlbmVyYXRlIGZpbGVcbiAgICBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBpZiAodXNlQ2hpcmFsaXR5KSB7XG4gICAgICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXFxuJztcbiAgICAgICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTlxcbic7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgbWFjcm9Nb2xCbG9jayA9IG1hY3JvTW9sQmxvY2sucmVwbGFjZSgvIENGRz1cXGQvZywgJyAnKTtcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORCc7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IGluZGV4Rml2ZVByaW1lID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4LmluZGV4T2YoMSk7XG4gICAgY29uc3QgaW5kZXhUaHJlZVByaW1lID0gY29vcmRpbmF0ZXMuYXRvbUluZGV4LmluZGV4T2YobmF0b20pO1xuICAgIC8vZml4IDUgcHJpbWUgaWYgaW5hZGVxdWF0ZVxuICAgIGlmIChuYXRvbSA+IDgpXG4gICAgICAgIGZpeDVQcmltZShjb29yZGluYXRlcywgaW5kZXhGaXZlUHJpbWUsIGluZGV4VGhyZWVQcmltZSk7XG4gICAgY29uc3QgeENlbnRlciA9IChjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdICsgY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0pIC8gMjtcbiAgICAvL3BsYWNlIHRvIGNlbnRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb29yZGluYXRlcy54W2ldIC09IHhDZW50ZXI7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gLT0geUNlbnRlcjtcbiAgICB9XG4gICAgbGV0IGFuZ2xlID0gMDtcbiAgICBpZiAoY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgLyAyIDogMyAqIE1hdGguUEkgLyAyO1xuICAgIGVsc2UgaWYgKGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID09IDApXG4gICAgICAgIGFuZ2xlID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPiBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gPyBNYXRoLlBJIDogMDtcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVyaXZhdGl2ZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC8gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV07XG4gICAgICAgIGFuZ2xlID0gZGVyaXZhdGl2ZSA+IDAgPyBNYXRoLlBJIC0gTWF0aC5hdGFuKGRlcml2YXRpdmUpIDogTWF0aC5hdGFuKGRlcml2YXRpdmUpO1xuICAgIH1cbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb25zdCB4QWRkID0gY29vcmRpbmF0ZXMueFtpXTtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQgKiBjb3MgLSBjb29yZGluYXRlcy55W2ldICogc2luO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldID0geEFkZCAqIHNpbiArIGNvb3JkaW5hdGVzLnlbaV0gKiBjb3M7XG4gICAgfVxuICAgIC8vcGxhY2UgdG8gcmlnaHRcbiAgICBjb25zdCB4U2hpZnQgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspXG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geFNoaWZ0O1xuICAgIC8vcmV3cml0ZSBtb2xCbG9ja1xuICAgIGxldCBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpO1xuICAgIGxldCBpbmRleEVuZCA9IGluZGV4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4RW5kKTtcbiAgICAgICAgbW9sQmxvY2sgPSBtb2xCbG9jay5zbGljZSgwLCBpbmRleCkgK1xuICAgICAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArICcgJyArIGNvb3JkaW5hdGVzLnlbaV0gK1xuICAgICAgICAgICAgbW9sQmxvY2suc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgfVxuICAgIHJldHVybiBtb2xCbG9jaztcbn1cbmZ1bmN0aW9uIGludmVydE51Y2xlb3RpZGVzVjMwMDAobW9sZWN1bGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgeENlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy54KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLngpKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChNYXRoLm1heCguLi5jb29yZGluYXRlcy55KSArIE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLnkpKSAvIDI7XG4gICAgLy9wbGFjZSB0byBjZW50ZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gICAgfVxuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5QSTtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb25zdCB4QWRkID0gY29vcmRpbmF0ZXMueFtpXTtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQgKiBjb3MgLSBjb29yZGluYXRlcy55W2ldICogc2luO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldID0geEFkZCAqIHNpbiArIGNvb3JkaW5hdGVzLnlbaV0gKiBjb3M7XG4gICAgfVxuICAgIC8vcGxhY2UgYmFja1xuICAgIGNvbnN0IHlTaGlmdCA9IE1hdGgubWF4KC4uLmNvb3JkaW5hdGVzLnkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKykge1xuICAgICAgICBjb29yZGluYXRlcy54W2ldICs9IHhDZW50ZXI7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gLT0geVNoaWZ0O1xuICAgIH1cbiAgICAvL3Jld3JpdGUgbW9sQmxvY2tcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleEVuZCk7XG4gICAgICAgIG1vbEJsb2NrID0gbW9sQmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgICAgICAgIG1vbEJsb2NrLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbW9sQmxvY2s7XG59XG5mdW5jdGlvbiBmaXg1UHJpbWUoY29vcmRpbmF0ZXMsIGluZGV4Rml2ZVByaW1lLCBpbmRleFRocmVlUHJpbWUpIHtcbiAgICBjb25zdCBpbmRleEZpdmVQcmltZU5laWdoYm91ciA9IGluZGV4Rml2ZVByaW1lICsgMTtcbiAgICBjb25zdCB4U2hpZnQgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCB5U2hpZnQgPSBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lTmVpZ2hib3VyXTtcbiAgICBjb25zdCBiYXNlM1ByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlM1ByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhUaHJlZVByaW1lXSAtIHlTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdIC0geFNoaWZ0O1xuICAgIGNvbnN0IGJhc2U1UHJpbWVZID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVggPSBiYXNlNVByaW1lWCAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMykgLSBiYXNlNVByaW1lWSAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3Qgcm90YXRlZDVQcmltZVkgPSBiYXNlNVByaW1lWCAqIE1hdGguc2luKE1hdGguUEkgKiAyIC8gMykgKyBiYXNlNVByaW1lWSAqIE1hdGguY29zKE1hdGguUEkgKiAyIC8gMyk7XG4gICAgY29uc3QgZHggPSBiYXNlNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5ID0gYmFzZTVQcmltZVkgLSBiYXNlM1ByaW1lWTtcbiAgICBjb25zdCBkeFJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWCAtIGJhc2UzUHJpbWVYO1xuICAgIGNvbnN0IGR5Um90YXRlZCA9IHJvdGF0ZWQ1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgaWYgKE1hdGguc3FydChkeVJvdGF0ZWQgKiBkeVJvdGF0ZWQgKyBkeFJvdGF0ZWQgKiBkeFJvdGF0ZWQpID49IE1hdGguc3FydChkeSAqIGR5ICsgZHggKiBkeCkpIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWCArIHhTaGlmdDtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPSByb3RhdGVkNVByaW1lWSArIHlTaGlmdDtcbiAgICB9XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jaykge1xuICAgIG1vbEJsb2NrID0gbW9sQmxvY2sucmVwbGFjZUFsbCgnXFxyJywgJycpOyAvL2VxdWFsaXplIG9sZCBhbmQgbmV3IHNkZiBzdGFuZGFyZHNcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdDT1VOVFMnKSArIDc7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBhbmQgYm9uZHMgbnVtYmVyXG4gICAgbGV0IGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICBjb25zdCBhdG9tc051bWJlciA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYm9uZHNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgcmV0dXJuIHsgbmF0b206IGF0b21zTnVtYmVyLCBuYm9uZDogYm9uZHNOdW1iZXIgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKSB7XG4gICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tc0JvbmRzTnVtYmVyc1YzMDAwKG1vbEJsb2NrKTtcbiAgICBsZXQgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4KTtcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleDtcbiAgICBjb25zdCBpbmRleGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgdHlwZXMgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBjb25zdCB4ID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeSA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5uYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICBpbmRleGVzW2ldID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB0eXBlc1tpXSA9IG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB4W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gaW5kZXhFbmQgKyAxO1xuICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgIHlbaV0gPSBwYXJzZUZsb2F0KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cbiAgICByZXR1cm4geyBhdG9tSW5kZXg6IGluZGV4ZXMsIGF0b21UeXBlOiB0eXBlcywgeDogeCwgeTogeSB9O1xufVxuIiwiaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCB7IGRvd25sb2FkIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBzZXF1ZW5jZVRvTW9sVjMwMDAgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMnO1xuaW1wb3J0IHsgbGlua1N0cmFuZHNWMzAwMCB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5pbXBvcnQgeyBnZXRGb3JtYXQgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmV4cG9ydCBmdW5jdGlvbiBzYXZlU2RmKGFzLCBzcywgb25lRW50aXR5LCB1c2VDaGlyYWxpdHksIGludmVydFNTLCBpbnZlcnRBUywgYXMyID0gbnVsbCwgaW52ZXJ0QVMyKSB7XG4gICAgY29uc3QgZm9ybWF0QXMgPSBnZXRGb3JtYXQoYXMpO1xuICAgIGNvbnN0IGZvcm1hdFNzID0gZ2V0Rm9ybWF0KHNzKTtcbiAgICBsZXQgZm9ybWF0QXMyID0gbnVsbDtcbiAgICBsZXQgbW9sQVMyID0gbnVsbDtcbiAgICBjb25zdCBtb2xTUyA9IHNlcXVlbmNlVG9Nb2xWMzAwMChzcywgaW52ZXJ0U1MsIGZhbHNlLCBmb3JtYXRTcyk7XG4gICAgY29uc3QgbW9sQVMgPSBzZXF1ZW5jZVRvTW9sVjMwMDAoYXMsIGludmVydEFTLCBmYWxzZSwgZm9ybWF0QXMpO1xuICAgIGlmIChhczIgIT0gbnVsbCAmJiBhczIgIT0gJycpIHtcbiAgICAgICAgZm9ybWF0QXMyID0gZ2V0Rm9ybWF0KGFzMik7XG4gICAgICAgIG1vbEFTMiA9IHNlcXVlbmNlVG9Nb2xWMzAwMChhczIsIGludmVydEFTMiwgZmFsc2UsIGZvcm1hdEFzMik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG9uZUVudGl0eSkge1xuICAgICAgICBjb25zdCBhbnRpU3RyYW5kcyA9IG1vbEFTMiA9PSBudWxsID8gW21vbEFTXSA6IFttb2xBUywgbW9sQVMyXTtcbiAgICAgICAgcmVzdWx0ID0gbGlua1N0cmFuZHNWMzAwMCh7IHNlbnNlU3RyYW5kczogW21vbFNTXSwgYW50aVN0cmFuZHM6IGFudGlTdHJhbmRzIH0sIHVzZUNoaXJhbGl0eSkgKyAnXFxuJCQkJFxcbic7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgbW9sU1MgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgYD4gPFNlcXVlbmNlPlxcblNlbnNlIFN0cmFuZFxcbiQkJCRcXG5gICtcbiAgICAgICAgICAgICAgICBtb2xBUyArICdcXG4nICtcbiAgICAgICAgICAgICAgICBgPiA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZVxcbiQkJCRcXG5gO1xuICAgICAgICBpZiAobW9sQVMyKVxuICAgICAgICAgICAgcmVzdWx0ICs9IG1vbEFTMiArICdcXG4nICtcbiAgICAgICAgICAgICAgICBgPiA8U2VxdWVuY2U+XFxuQW50aSBTZW5zZSAyXFxuJCQkJFxcbmA7XG4gICAgfVxuICAgIGRvd25sb2FkKHNzLnJlcGxhY2UoL1xccy9nLCAnJykgKyAnLnNkZicsIGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzYXZlU2Vuc2VBbnRpU2Vuc2UoKSB7XG4gICAgY29uc3QgbW9sZWN1bGVTdmdEaXYgPSB1aS5ibG9jayhbXSk7XG4gICAgY29uc3Qgc3NJbnB1dCA9IHVpLnRleHRJbnB1dCgnU2Vuc2UgU3RyYW5kJywgJycpO1xuICAgIGNvbnN0IGFzSW5wdXQgPSB1aS50ZXh0SW5wdXQoJ0FudGkgU2Vuc2UnLCAnJyk7XG4gICAgY29uc3QgYXNJbnB1dDIgPSB1aS50ZXh0SW5wdXQoJ0FudGkgU2Vuc2UgMicsICcnKTtcbiAgICBjb25zdCBzdHJhaWdodCA9IFwiNSBwcmltZSAtPiAzIHByaW1lXCI7XG4gICAgY29uc3QgaW52ZXJzZSA9IFwiMyBwcmltZSAtPiA1IHByaW1lXCI7XG4gICAgbGV0IHNzSW52ZXJzZSA9IGZhbHNlO1xuICAgIGxldCBhc0ludmVyc2UgPSBmYWxzZTtcbiAgICBsZXQgYXMySW52ZXJzZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZVNlbnNlID0gdWkuY2hvaWNlSW5wdXQoJ1NTIGRpcmVjdGlvbicsIHN0cmFpZ2h0LCBbc3RyYWlnaHQsIGludmVyc2VdKTtcbiAgICBjaGFuZ2VTZW5zZS5vbkNoYW5nZWQoKCkgPT4geyBzc0ludmVyc2UgPSBjaGFuZ2VTZW5zZS52YWx1ZSA9PSBpbnZlcnNlOyB9KTtcbiAgICBjb25zdCBjaGFuZ2VBbnRpU2Vuc2UgPSB1aS5jaG9pY2VJbnB1dCgnQVMgZGlyZWN0aW9uJywgc3RyYWlnaHQsIFtzdHJhaWdodCwgaW52ZXJzZV0pO1xuICAgIGNoYW5nZUFudGlTZW5zZS5vbkNoYW5nZWQoKCkgPT4geyBhc0ludmVyc2UgPSBjaGFuZ2VBbnRpU2Vuc2UudmFsdWUgPT0gaW52ZXJzZTsgfSk7XG4gICAgY29uc3QgY2hhbmdlQW50aVNlbnNlMiA9IHVpLmNob2ljZUlucHV0KCdBUyAyIGRpcmVjdGlvbicsIHN0cmFpZ2h0LCBbc3RyYWlnaHQsIGludmVyc2VdKTtcbiAgICBjaGFuZ2VBbnRpU2Vuc2UyLm9uQ2hhbmdlZCgoKSA9PiB7IGFzSW52ZXJzZSA9IGNoYW5nZUFudGlTZW5zZS52YWx1ZSA9PSBpbnZlcnNlOyB9KTtcbiAgICBjb25zdCBzYXZlT3B0aW9uID0gdWkuc3dpdGNoSW5wdXQoJ1NhdmUgYXMgb25lIGVudGl0eScsIHRydWUpO1xuICAgIGNvbnN0IGNoaXJhbGl0eSA9IHVpLnN3aXRjaElucHV0KCdVc2UgY2hpcmFsJywgdHJ1ZSk7XG4gICAgY29uc3Qgc2F2ZUJ0biA9IHVpLmJ1dHRvbignU2F2ZSBTREYnLCAoKSA9PiBzYXZlU2RmKGFzSW5wdXQudmFsdWUsIHNzSW5wdXQudmFsdWUsIHNhdmVPcHRpb24udmFsdWUsIGNoaXJhbGl0eS52YWx1ZSwgc3NJbnZlcnNlLCBhc0ludmVyc2UsIGFzSW5wdXQyLnZhbHVlLCBhczJJbnZlcnNlKSk7XG4gICAgY29uc3Qgc2F2ZVNlY3Rpb24gPSB1aS5wYW5lbChbXG4gICAgICAgIHVpLmRpdihbXG4gICAgICAgICAgICB1aS5kaXYoW1xuICAgICAgICAgICAgICAgIHVpLmRpdkgoW3VpLmgxKCdJbnB1dHMnKV0pLFxuICAgICAgICAgICAgICAgIHVpLmRpdlYoW1xuICAgICAgICAgICAgICAgICAgICBzc0lucHV0LFxuICAgICAgICAgICAgICAgICAgICBhc0lucHV0LFxuICAgICAgICAgICAgICAgICAgICBhc0lucHV0MixcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KFtjaGFuZ2VTZW5zZV0sIHsgc3R5bGU6IHsgd2lkdGg6ICc0MCcgfSB9KSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlU2Vuc2UsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUFudGlTZW5zZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlQW50aVNlbnNlMixcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgY2hpcmFsaXR5LFxuICAgICAgICAgICAgICAgICAgICB1aS5idXR0b25zSW5wdXQoW3NhdmVCdG5dKSxcbiAgICAgICAgICAgICAgICBdLCAndWktZm9ybScpLFxuICAgICAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgXSwgJ3VpLWZvcm0nKSxcbiAgICAgICAgbW9sZWN1bGVTdmdEaXYsXG4gICAgXSk7XG4gICAgcmV0dXJuIHNhdmVTZWN0aW9uO1xufVxuIiwiaW1wb3J0IHsgbWFwLCBTWU5USEVTSVpFUlMsIFRFQ0hOT0xPR0lFUywgTU9ESUZJQ0FUSU9OUywgZGVsaW1pdGVyLCBnY3JzQ29kZXNXaXRob3V0U21pbGVzIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nLCBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzLCBnY3JzVG9NZXJtYWRlMTIsIHNpUm5hTnVjbGVvdGlkZVRvQmlvU3ByaW5nU2Vuc2VTdHJhbmQsIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzLCBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzLCBzaVJuYUJpb1NwcmluZ1RvR2Nycywgc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcywgc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcsIHNpUm5hQXhvbGFic1RvR2Nycywgc2lSbmFHY3JzVG9OdWNsZW90aWRlcywgc2lSbmFHY3JzVG9CaW9TcHJpbmcsIHNpUm5hR2Nyc1RvQXhvbGFicywgZ2Nyc1RvTnVjbGVvdGlkZXMsIGdjcnNUb0xjbXMgfSBmcm9tICcuL2NvbnZlcnRlcnMnO1xuY29uc3Qgbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlID0gJ05vIHRyYW5zbGF0aW9uIHRhYmxlIGF2YWlsYWJsZSc7XG5leHBvcnQgY29uc3QgdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSA9ICdUeXBlIG9mIGlucHV0IHNlcXVlbmNlIGlzIHVuZGVmaW5lZCc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0KHNlcXVlbmNlKSB7XG4gICAgY29uc3QgcG9zc2libGVTeW50aGVzaXplcnMgPSBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSk7XG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9IChvdXRwdXRJbmRleCA9PSBzZXF1ZW5jZS5sZW5ndGgpID8gLTEgOiBvdXRwdXRJbmRleDtcbiAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKVxuICAgICAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG4gICAgY29uc3QgcG9zc2libGVUZWNobm9sb2dpZXMgPSBnZXRMaXN0T2ZQb3NzaWJsZVRlY2hub2xvZ2llc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSwgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgb3V0cHV0SW5kZXggPSAwO1xuICAgIHBvc3NpYmxlVGVjaG5vbG9naWVzLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbcG9zc2libGVTeW50aGVzaXplcnNbMF1dW3RlY2hub2xvZ3ldKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwb3NzaWJsZVN5bnRoZXNpemVyc1swXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZm9ybWF0ID09IG51bGwgP1xuICAgICAgICBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkgOlxuICAgICAgICBbZm9ybWF0XTtcbiAgICAvLyBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgIC8vICAgY29uc3Qgc3ludGhlc2l6ZXIgPSB1aS5jaG9pY2VJbnB1dCgnQ2hvb3NlIHN5bnRoZXNpemVyIGZyb20gbGlzdDogJywgcG9zc2libGVTeW50aGVzaXplcnNbMF0sXG4gICAgLy8gIHBvc3NpYmxlU3ludGhlc2l6ZXJzKTtcbiAgICAvLyAgIHVpLmRpYWxvZygnQ2hvb3NlIFN5bnRoZXNpemVyJylcbiAgICAvLyAgICAgLmFkZCh1aS5wYW5lbChbc3ludGhlc2l6ZXIucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVTeW50aGVzaXplcnMgPSBbc3ludGhlc2l6ZXIudmFsdWVdKVxuICAgIC8vICAgICAub25DYW5jZWwoKCkgPT4ge1xuICAgIC8vICAgICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXTtcbiAgICAvLyAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vICAgICB9KVxuICAgIC8vICAgICAuc2hvdygpO1xuICAgIC8vIH0gZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4geyBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IDAsIHN5bnRoZXNpemVyOiBudWxsIH07IC8vLCB0ZWNobm9sb2d5OiBudWxsfTtcbiAgICBjb25zdCBvdXRwdXRJbmRpY2VzID0gQXJyYXkocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goZnVuY3Rpb24gKHN5bnRoZXNpemVyLCBpKSB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRpY2VzW2ldIDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kaWNlc1tpXSwgb3V0cHV0SW5kaWNlc1tpXSArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlc1tpXSA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRpY2VzW2ldXSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kaWNlc1tpXSAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGljZXNbaV0gKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRpY2VzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRpY2VzW2ldKys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzW2ldICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dEluZGV4ID0gTWF0aC5tYXgoLi4ub3V0cHV0SW5kaWNlcyk7XG4gICAgY29uc3Qgc3ludGhlc2l6ZXIgPSBwb3NzaWJsZVN5bnRoZXNpemVyc1tvdXRwdXRJbmRpY2VzLmluZGV4T2Yob3V0cHV0SW5kZXgpXTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgICAgICBzeW50aGVzaXplcjogW3N5bnRoZXNpemVyXSxcbiAgICAgICAgICAgIC8vIHRlY2hub2xvZ3k6IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbnN0IHBvc3NpYmxlVGVjaG5vbG9naWVzID1cbiAgICAvLyAgIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1tvdXRwdXRJbmRleF0pO1xuICAgIC8vIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPiAxKSB7XG4gICAgLy8gICBjb25zdCB0ZWNobm9sb2d5ID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSB0ZWNobm9sb2d5IGZyb20gbGlzdDogJywgcG9zc2libGVUZWNobm9sb2dpZXNbMF0sXG4gICAgLy8gcG9zc2libGVUZWNobm9sb2dpZXMpO1xuICAgIC8vICAgdWkuZGlhbG9nKCdDaG9vc2UgVGVjaG5vbG9neScpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3RlY2hub2xvZ3kucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVUZWNobm9sb2dpZXMgPSBbdGVjaG5vbG9neS52YWx1ZV0pXG4gICAgLy8gICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgLy8gICAgICAgcG9zc2libGVUZWNobm9sb2dpZXMgPSBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dO1xuICAgIC8vICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5zaG93KCk7XG4gICAgLy8gfSBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAvLyBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgLy8gICByZXR1cm4ge2luZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IFtwb3NzaWJsZVN5bnRoZXNpemVyc1szXV0sIHRlY2hub2xvZ3k6IG51bGx9O1xuICAgIC8vIG91dHB1dEluZGV4ID0gMDtcbiAgICAvLyBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5OiBzdHJpbmcpID0+IHtcbiAgICAvLyAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgLy8gICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAvLyAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgLy8gICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgIC8vICAgICAgIGJyZWFrO1xuICAgIC8vICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAvLyAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAvLyAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgLy8gICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pXG4gICAgLy8gICAgICkgYnJlYWs7XG4gICAgLy8gICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgIC8vICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgIC8vICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSlcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgIHN5bnRoZXNpemVyOiBbc3ludGhlc2l6ZXJdLFxuICAgICAgICAvLyB0ZWNobm9sb2d5OiBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKSB7XG4gICAgbGV0IGNvZGVzID0gW107XG4gICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKVxuICAgICAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKSk7XG4gICAgcmV0dXJuIGNvZGVzLmNvbmNhdChPYmplY3Qua2V5cyhNT0RJRklDQVRJT05TKSkuY29uY2F0KGRlbGltaXRlcik7XG59XG5mdW5jdGlvbiBnZXRMaXN0T2ZQb3NzaWJsZVN5bnRoZXNpemVyc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSkge1xuICAgIGxldCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikpO1xuICAgICAgICBpZiAoc3ludGhlc2l6ZXIgPT0gJ0phbnNzZW4gR0NSUyBDb2RlcycpXG4gICAgICAgICAgICBjb2RlcyA9IGNvZGVzLmNvbmNhdChnY3JzQ29kZXNXaXRob3V0U21pbGVzKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChnY3JzQ29kZXNXaXRob3V0U21pbGVzLnNvbWUoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgcy5sZW5ndGgpKSlcbiAgICAgICAgICAgIHN5bnRoZXNpemVycyA9IFsnSmFuc3NlbiBHQ1JTIENvZGVzJ107XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpKSB7IC8vJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5ETkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpKSB7XG4gICAgICAgIC8vICYmIG91dHB1dC50ZWNobm9sb2d5IS5pbmNsdWRlcyhURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQklPU1BSSU5HICsgJyAnICsgVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykpIHsgLy8gJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTICsgJyAnICsgVEVDSE5PTE9HSUVTLkFTT19HQVBNRVJTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFHY3JzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFHY3JzVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUykpIHtcbiAgICAgICAgLy8gJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICsgJyAnICsgVEVDSE5PTE9HSUVTLlJOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQklPU1BSSU5HKSkgeyAvLyAmJiBvdXRwdXQudGVjaG5vbG9neSEuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlNJX1JOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgR0NSUzogc2lSbmFCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5BWE9MQUJTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkFYT0xBQlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQXhvbGFic1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpKSB7IC8vICYmIG91dHB1dC50ZWNobm9sb2d5IS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTENNUzogZ2Nyc1RvTGNtcyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkdDUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBnY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIExDTVM6IGdjcnNUb0xjbXMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIm1vZHVsZS5leHBvcnRzID0gdWk7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBhdXRvc3RhcnRPbGlnb1NkRmlsZVN1YnNjcmlwdGlvbiB9IGZyb20gJy4vYXV0b3N0YXJ0L3JlZ2lzdHJhdGlvbic7XG5pbXBvcnQgeyBkZWZpbmVBeG9sYWJzUGF0dGVybiB9IGZyb20gJy4vYXhvbGFicy9kZWZpbmUtcGF0dGVybic7XG5pbXBvcnQgeyBzYXZlU2Vuc2VBbnRpU2Vuc2UgfSBmcm9tICcuL3N0cnVjdHVyZXMtd29ya3Mvc2F2ZS1zZW5zZS1hbnRpc2Vuc2UnO1xuaW1wb3J0IHsgbWFpblZpZXcgfSBmcm9tICcuL21haW4vbWFpbi12aWV3JztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG4vL25hbWU6IFNlcXVlbmNlIFRyYW5zbGF0b3Jcbi8vdGFnczogYXBwXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUcmFuc2xhdG9yKCkge1xuICAgIGNvbnN0IHdpbmRvd3MgPSBncm9rLnNoZWxsLndpbmRvd3M7XG4gICAgd2luZG93cy5zaG93UHJvcGVydGllcyA9IGZhbHNlO1xuICAgIHdpbmRvd3Muc2hvd1Rvb2xib3ggPSBmYWxzZTtcbiAgICB3aW5kb3dzLnNob3dIZWxwID0gZmFsc2U7XG4gICAgY29uc3QgdiA9IGdyb2suc2hlbGwubmV3VmlldygnU2VxdWVuY2UgVHJhbnNsYXRvcicsIFtdKTtcbiAgICB2LmJveCA9IHRydWU7XG4gICAgdi5hcHBlbmQodWkudGFiQ29udHJvbCh7XG4gICAgICAgICdNQUlOJzogbWFpblZpZXcoKSxcbiAgICAgICAgJ0FYT0xBQlMnOiBkZWZpbmVBeG9sYWJzUGF0dGVybigpLFxuICAgICAgICAnU0RGJzogc2F2ZVNlbnNlQW50aVNlbnNlKCksXG4gICAgfSkpO1xufVxuLy90YWdzOiBhdXRvc3RhcnRcbmF1dG9zdGFydE9saWdvU2RGaWxlU3Vic2NyaXB0aW9uKCk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=