@clickview/reports 0.0.14-rc.3 → 0.0.14

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.
Files changed (135) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/{8-4362d8ec47-reports.chunk.js → 8-561ad8215b-reports.chunk.js} +1 -1
  3. package/dist/scripts/{9-2294aec88e-reports.chunk.js → 9-09d4882649-reports.chunk.js} +1 -1
  4. package/dist/scripts/{bundle-a50e7f7abd.min.js → bundle-ea3b1ca1bb.min.js} +1 -1
  5. package/package.json +3 -3
  6. package/dist/css/1-reports.chunk.css +0 -26
  7. package/dist/css/10-reports-1a016faa7a.chunk.css +0 -16
  8. package/dist/css/10-reports-dfc303887f.chunk.css +0 -94
  9. package/dist/css/11-reports-6e0e114b8b.chunk.css +0 -16
  10. package/dist/css/11-reports-c64a3dae3c.chunk.css +0 -24
  11. package/dist/css/12-reports-82f3a62e3f.chunk.css +0 -6
  12. package/dist/css/12-reports-87b0f4ae23.chunk.css +0 -18
  13. package/dist/css/12-reports.chunk.css +0 -39
  14. package/dist/css/13-reports-5101603969.chunk.css +0 -8
  15. package/dist/css/13-reports-d7c596841b.chunk.css +0 -6
  16. package/dist/css/13-reports.chunk.css +0 -4
  17. package/dist/css/14-reports-1b564b1b5c.chunk.css +0 -12
  18. package/dist/css/14-reports.chunk.css +0 -9
  19. package/dist/css/15-reports-c822f03e9f.chunk.css +0 -6
  20. package/dist/css/15-reports.chunk.css +0 -12
  21. package/dist/css/16-reports-e755ceba53.chunk.css +0 -4
  22. package/dist/css/16-reports.chunk.css +0 -9
  23. package/dist/css/17-reports-a851153aa2.chunk.css +0 -6
  24. package/dist/css/17-reports.chunk.css +0 -421
  25. package/dist/css/18-reports-8d22d0432e.chunk.css +0 -2
  26. package/dist/css/18-reports.chunk.css +0 -60
  27. package/dist/css/19-reports-b5e731ba4c.chunk.css +0 -2
  28. package/dist/css/19-reports.chunk.css +0 -152
  29. package/dist/css/2-reports-ee0f55c5ef.chunk.css +0 -6
  30. package/dist/css/20-reports-b24d9e1929.chunk.css +0 -4
  31. package/dist/css/20-reports.chunk.css +0 -15
  32. package/dist/css/21-reports-b5e731ba4c.chunk.css +0 -2
  33. package/dist/css/21-reports.chunk.css +0 -24
  34. package/dist/css/22-reports.chunk.css +0 -22
  35. package/dist/css/23-reports.chunk.css +0 -4
  36. package/dist/css/24-reports.chunk.css +0 -4
  37. package/dist/css/25-reports.chunk.css +0 -9
  38. package/dist/css/26-reports.chunk.css +0 -12
  39. package/dist/css/27-reports.chunk.css +0 -12
  40. package/dist/css/28-reports.chunk.css +0 -12
  41. package/dist/css/3-reports.chunk.css +0 -52
  42. package/dist/css/5-reports.chunk.css +0 -12
  43. package/dist/css/6-reports-7d7912037e.chunk.css +0 -12
  44. package/dist/css/6-reports.chunk.css +0 -83
  45. package/dist/css/8-reports-9e7980819e.chunk.css +0 -94
  46. package/dist/css/9-reports-17de4ec4e3.chunk.css +0 -94
  47. package/dist/css/9-reports-80a3d4c4dc.chunk.css +0 -94
  48. package/dist/css/9-reports.chunk.css +0 -1793
  49. package/dist/css/reports-app-363cd589d6.css +0 -63
  50. package/dist/css/reports-app.css +0 -11386
  51. package/dist/scripts/0-c45f33cf27-reports.chunk.js +0 -1
  52. package/dist/scripts/0-fdb01ce347-reports.chunk.js +0 -1
  53. package/dist/scripts/0-reports.chunk.js +0 -11
  54. package/dist/scripts/1-593f3a2b8d-reports.chunk.js +0 -1
  55. package/dist/scripts/1-c590ecd5b7-reports.chunk.js +0 -1
  56. package/dist/scripts/1-reports.chunk.js +0 -161
  57. package/dist/scripts/10-75042090ca-reports.chunk.js +0 -1
  58. package/dist/scripts/10-d366e632ff-reports.chunk.js +0 -1
  59. package/dist/scripts/10-reports.chunk.js +0 -1270
  60. package/dist/scripts/11-50d5d1ddfd-reports.chunk.js +0 -1
  61. package/dist/scripts/11-60744bb8ca-reports.chunk.js +0 -1
  62. package/dist/scripts/11-reports.chunk.js +0 -59
  63. package/dist/scripts/12-a75cd2076e-reports.chunk.js +0 -1
  64. package/dist/scripts/12-d58e14d944-reports.chunk.js +0 -1
  65. package/dist/scripts/12-reports.chunk.js +0 -191
  66. package/dist/scripts/13-0a16876333-reports.chunk.js +0 -1
  67. package/dist/scripts/13-ff911da0b4-reports.chunk.js +0 -1
  68. package/dist/scripts/13-reports.chunk.js +0 -98
  69. package/dist/scripts/14-27dad36371-reports.chunk.js +0 -1
  70. package/dist/scripts/14-4059f6ff70-reports.chunk.js +0 -1
  71. package/dist/scripts/14-reports.chunk.js +0 -50
  72. package/dist/scripts/15-1ff7d228f0-reports.chunk.js +0 -1
  73. package/dist/scripts/15-6fe99dadbd-reports.chunk.js +0 -1
  74. package/dist/scripts/15-reports.chunk.js +0 -34
  75. package/dist/scripts/16-356448bd82-reports.chunk.js +0 -1
  76. package/dist/scripts/16-f51c2fd114-reports.chunk.js +0 -1
  77. package/dist/scripts/16-reports.chunk.js +0 -18
  78. package/dist/scripts/17-75641e87b3-reports.chunk.js +0 -1
  79. package/dist/scripts/17-903b3a42a8-reports.chunk.js +0 -1
  80. package/dist/scripts/17-reports.chunk.js +0 -450
  81. package/dist/scripts/18-0825e33ae4-reports.chunk.js +0 -1
  82. package/dist/scripts/18-145828e75c-reports.chunk.js +0 -1
  83. package/dist/scripts/18-reports.chunk.js +0 -172
  84. package/dist/scripts/19-a84afe10d6-reports.chunk.js +0 -1
  85. package/dist/scripts/19-ee16e3fc45-reports.chunk.js +0 -1
  86. package/dist/scripts/19-reports.chunk.js +0 -143
  87. package/dist/scripts/2-65f25368c3-reports.chunk.js +0 -1
  88. package/dist/scripts/2-a4d6cdfd17-reports.chunk.js +0 -1
  89. package/dist/scripts/2-reports.chunk.js +0 -17
  90. package/dist/scripts/20-5dc6922f9f-reports.chunk.js +0 -1
  91. package/dist/scripts/20-789131e4b0-reports.chunk.js +0 -1
  92. package/dist/scripts/20-reports.chunk.js +0 -96
  93. package/dist/scripts/21-3eeb7d3987-reports.chunk.js +0 -1
  94. package/dist/scripts/21-ee33292057-reports.chunk.js +0 -1
  95. package/dist/scripts/21-reports.chunk.js +0 -96
  96. package/dist/scripts/22-3c846d6a6f-reports.chunk.js +0 -1
  97. package/dist/scripts/22-853d813bbe-reports.chunk.js +0 -1
  98. package/dist/scripts/22-reports.chunk.js +0 -81
  99. package/dist/scripts/23-f2afd0b1c8-reports.chunk.js +0 -1
  100. package/dist/scripts/23-reports.chunk.js +0 -66
  101. package/dist/scripts/24-reports.chunk.js +0 -58
  102. package/dist/scripts/25-reports.chunk.js +0 -50
  103. package/dist/scripts/26-reports.chunk.js +0 -42
  104. package/dist/scripts/27-reports.chunk.js +0 -34
  105. package/dist/scripts/28-reports.chunk.js +0 -34
  106. package/dist/scripts/29-reports.chunk.js +0 -35
  107. package/dist/scripts/3-5f4ba3c213-reports.chunk.js +0 -1
  108. package/dist/scripts/3-dc412a5e87-reports.chunk.js +0 -1
  109. package/dist/scripts/3-reports.chunk.js +0 -97
  110. package/dist/scripts/30-reports.chunk.js +0 -19
  111. package/dist/scripts/31-reports.chunk.js +0 -11
  112. package/dist/scripts/32-reports.chunk.js +0 -11
  113. package/dist/scripts/4-04ae41a740-reports.chunk.js +0 -1
  114. package/dist/scripts/4-d0e7a012aa-reports.chunk.js +0 -1
  115. package/dist/scripts/4-reports.chunk.js +0 -1118
  116. package/dist/scripts/5-6d052b2b2d-reports.chunk.js +0 -101
  117. package/dist/scripts/5-9ff38a41fa-reports.chunk.js +0 -1
  118. package/dist/scripts/5-reports.chunk.js +0 -74
  119. package/dist/scripts/6-a6302fc5d5-reports.chunk.js +0 -1
  120. package/dist/scripts/6-reports.chunk.js +0 -56
  121. package/dist/scripts/7-reports.chunk.js +0 -43
  122. package/dist/scripts/8-2fb9a98a35-reports.chunk.js +0 -101
  123. package/dist/scripts/8-dee5906c67-reports.chunk.js +0 -101
  124. package/dist/scripts/8-reports.chunk.js +0 -17
  125. package/dist/scripts/9-8bb5696164-reports.chunk.js +0 -101
  126. package/dist/scripts/9-9b86a34919-reports.chunk.js +0 -101
  127. package/dist/scripts/9-d33b0f6f8a-reports.chunk.js +0 -1
  128. package/dist/scripts/9-reports.chunk.js +0 -1184
  129. package/dist/scripts/bundle-04a5b8c96e.min.js +0 -19
  130. package/dist/scripts/bundle-21f98d831e.min.js +0 -19
  131. package/dist/scripts/bundle-e519b5eef9.min.js +0 -19
  132. package/dist/scripts/bundle.js +0 -5722
  133. package/dist/scripts/polyfills-018d301355.min.js +0 -1
  134. package/dist/scripts/polyfills-be148b3001.min.js +0 -1
  135. package/dist/scripts/polyfills.js +0 -2750
@@ -1,17 +0,0 @@
1
- (window["webpackJsonp_clickview_reports"] = window["webpackJsonp_clickview_reports"] || []).push([[8],{
2
-
3
- /***/ "../../../node_modules/react-table/dist/react-table.development.js":
4
- /***/ (function(module, exports, __webpack_require__) {
5
-
6
- eval("(function (global, factory) {\n true ? factory(exports, __webpack_require__(\"react\")) :\n undefined;\n}(this, (function (exports, React) { 'use strict';\n\n React = React && Object.prototype.hasOwnProperty.call(React, 'default') ? React['default'] : React;\n\n function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n }\n\n function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n }\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n\n return (hint === \"string\" ? String : Number)(input);\n }\n\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n\n return typeof key === \"symbol\" ? key : String(key);\n }\n\n var renderErr = 'Renderer Error ☝️';\n var actions = {\n init: 'init'\n };\n var defaultRenderer = function defaultRenderer(_ref) {\n var _ref$value = _ref.value,\n value = _ref$value === void 0 ? '' : _ref$value;\n return value;\n };\n var emptyRenderer = function emptyRenderer() {\n return React.createElement(React.Fragment, null, \"\\xA0\");\n };\n var defaultColumn = {\n Cell: defaultRenderer,\n width: 150,\n minWidth: 0,\n maxWidth: Number.MAX_SAFE_INTEGER\n };\n\n function mergeProps() {\n for (var _len = arguments.length, propList = new Array(_len), _key = 0; _key < _len; _key++) {\n propList[_key] = arguments[_key];\n }\n\n return propList.reduce(function (props, next) {\n var style = next.style,\n className = next.className,\n rest = _objectWithoutPropertiesLoose(next, [\"style\", \"className\"]);\n\n props = _extends({}, props, {}, rest);\n\n if (style) {\n props.style = props.style ? _extends({}, props.style || {}, {}, style || {}) : style;\n }\n\n if (className) {\n props.className = props.className ? props.className + ' ' + className : className;\n }\n\n if (props.className === '') {\n delete props.className;\n }\n\n return props;\n }, {});\n }\n\n function handlePropGetter(prevProps, userProps, meta) {\n // Handle a lambda, pass it the previous props\n if (typeof userProps === 'function') {\n return handlePropGetter({}, userProps(prevProps, meta));\n } // Handle an array, merge each item as separate props\n\n\n if (Array.isArray(userProps)) {\n return mergeProps.apply(void 0, [prevProps].concat(userProps));\n } // Handle an object by default, merge the two objects\n\n\n return mergeProps(prevProps, userProps);\n }\n\n var makePropGetter = function makePropGetter(hooks, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return function (userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n return [].concat(hooks, [userProps]).reduce(function (prev, next) {\n return handlePropGetter(prev, next, _extends({}, meta, {\n userProps: userProps\n }));\n }, {});\n };\n };\n var reduceHooks = function reduceHooks(hooks, initial, meta, allowUndefined) {\n if (meta === void 0) {\n meta = {};\n }\n\n return hooks.reduce(function (prev, next) {\n var nextValue = next(prev, meta);\n\n {\n if (!allowUndefined && typeof nextValue === 'undefined') {\n console.info(next);\n throw new Error('React Table: A reducer hook ☝️ just returned undefined! This is not allowed.');\n }\n }\n\n return nextValue;\n }, initial);\n };\n var loopHooks = function loopHooks(hooks, context, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return hooks.forEach(function (hook) {\n var nextValue = hook(context, meta);\n\n {\n if (typeof nextValue !== 'undefined') {\n console.info(hook, nextValue);\n throw new Error('React Table: A loop-type hook ☝️ just returned a value! This is not allowed.');\n }\n }\n });\n };\n function ensurePluginOrder(plugins, befores, pluginName, afters) {\n if ( afters) {\n throw new Error(\"Defining plugins in the \\\"after\\\" section of ensurePluginOrder is no longer supported (see plugin \" + pluginName + \")\");\n }\n\n var pluginIndex = plugins.findIndex(function (plugin) {\n return plugin.pluginName === pluginName;\n });\n\n if (pluginIndex === -1) {\n {\n throw new Error(\"The plugin \\\"\" + pluginName + \"\\\" was not found in the plugin list!\\nThis usually means you need to need to name your plugin hook by setting the 'pluginName' property of the hook function, eg:\\n\\n \" + pluginName + \".pluginName = '\" + pluginName + \"'\\n\");\n }\n }\n\n befores.forEach(function (before) {\n var beforeIndex = plugins.findIndex(function (plugin) {\n return plugin.pluginName === before;\n });\n\n if (beforeIndex > -1 && beforeIndex > pluginIndex) {\n {\n throw new Error(\"React Table: The \" + pluginName + \" plugin hook must be placed after the \" + before + \" plugin hook!\");\n }\n }\n });\n }\n function functionalUpdate(updater, old) {\n return typeof updater === 'function' ? updater(old) : updater;\n }\n function useGetLatest(obj) {\n var ref = React.useRef();\n ref.current = obj;\n return React.useCallback(function () {\n return ref.current;\n }, []);\n } // SSR has issues with useLayoutEffect still, so use useEffect during SSR\n\n var safeUseLayoutEffect = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n function useMountedLayoutEffect(fn, deps) {\n var mountedRef = React.useRef(false);\n safeUseLayoutEffect(function () {\n if (mountedRef.current) {\n fn();\n }\n\n mountedRef.current = true; // eslint-disable-next-line\n }, deps);\n }\n function useAsyncDebounce(defaultFn, defaultWait) {\n if (defaultWait === void 0) {\n defaultWait = 0;\n }\n\n var debounceRef = React.useRef({});\n var getDefaultFn = useGetLatest(defaultFn);\n var getDefaultWait = useGetLatest(defaultWait);\n return React.useCallback(\n /*#__PURE__*/\n function () {\n var _ref2 = _asyncToGenerator(\n /*#__PURE__*/\n regeneratorRuntime.mark(function _callee2() {\n var _len2,\n args,\n _key2,\n _args2 = arguments;\n\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n for (_len2 = _args2.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = _args2[_key2];\n }\n\n if (!debounceRef.current.promise) {\n debounceRef.current.promise = new Promise(function (resolve, reject) {\n debounceRef.current.resolve = resolve;\n debounceRef.current.reject = reject;\n });\n }\n\n if (debounceRef.current.timeout) {\n clearTimeout(debounceRef.current.timeout);\n }\n\n debounceRef.current.timeout = setTimeout(\n /*#__PURE__*/\n _asyncToGenerator(\n /*#__PURE__*/\n regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n delete debounceRef.current.timeout;\n _context.prev = 1;\n _context.t0 = debounceRef.current;\n _context.next = 5;\n return getDefaultFn().apply(void 0, args);\n\n case 5:\n _context.t1 = _context.sent;\n\n _context.t0.resolve.call(_context.t0, _context.t1);\n\n _context.next = 12;\n break;\n\n case 9:\n _context.prev = 9;\n _context.t2 = _context[\"catch\"](1);\n debounceRef.current.reject(_context.t2);\n\n case 12:\n _context.prev = 12;\n delete debounceRef.current.promise;\n return _context.finish(12);\n\n case 15:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 9, 12, 15]]);\n })), getDefaultWait());\n return _context2.abrupt(\"return\", debounceRef.current.promise);\n\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function () {\n return _ref2.apply(this, arguments);\n };\n }(), [getDefaultFn, getDefaultWait]);\n }\n function makeRenderer(instance, column, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return function (type, userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n var Comp = typeof type === 'string' ? column[type] : type;\n\n if (typeof Comp === 'undefined') {\n console.info(column);\n throw new Error(renderErr);\n }\n\n return flexRender(Comp, _extends({}, instance, {\n column: column\n }, meta, {}, userProps));\n };\n }\n function flexRender(Comp, props) {\n return isReactComponent(Comp) ? React.createElement(Comp, props) : Comp;\n }\n\n function isReactComponent(component) {\n return isClassComponent(component) || typeof component === 'function' || isExoticComponent(component);\n }\n\n function isClassComponent(component) {\n return typeof component === 'function' && function () {\n var proto = Object.getPrototypeOf(component);\n return proto.prototype && proto.prototype.isReactComponent;\n }();\n }\n\n function isExoticComponent(component) {\n return typeof component === 'object' && typeof component.$$typeof === 'symbol' && ['react.memo', 'react.forward_ref'].includes(component.$$typeof.description);\n }\n\n function linkColumnStructure(columns, parent, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n\n return columns.map(function (column) {\n column = _extends({}, column, {\n parent: parent,\n depth: depth\n });\n assignColumnAccessor(column);\n\n if (column.columns) {\n column.columns = linkColumnStructure(column.columns, column, depth + 1);\n }\n\n return column;\n });\n }\n function flattenColumns(columns) {\n return flattenBy(columns, 'columns');\n }\n function assignColumnAccessor(column) {\n // First check for string accessor\n var id = column.id,\n accessor = column.accessor,\n Header = column.Header;\n\n if (typeof accessor === 'string') {\n id = id || accessor;\n var accessorPath = accessor.split('.');\n\n accessor = function accessor(row) {\n return getBy(row, accessorPath);\n };\n }\n\n if (!id && typeof Header === 'string' && Header) {\n id = Header;\n }\n\n if (!id && column.columns) {\n console.error(column);\n throw new Error('A column ID (or unique \"Header\" value) is required!');\n }\n\n if (!id) {\n console.error(column);\n throw new Error('A column ID (or string accessor) is required!');\n }\n\n Object.assign(column, {\n id: id,\n accessor: accessor\n });\n return column;\n }\n function decorateColumn(column, userDefaultColumn) {\n if (!userDefaultColumn) {\n throw new Error();\n }\n\n Object.assign(column, _extends({\n // Make sure there is a fallback header, just in case\n Header: emptyRenderer,\n Footer: emptyRenderer\n }, defaultColumn, {}, userDefaultColumn, {}, column));\n Object.assign(column, {\n originalWidth: column.width\n });\n return column;\n } // Build the header groups from the bottom up\n\n function makeHeaderGroups(allColumns, defaultColumn, additionalHeaderProperties) {\n if (additionalHeaderProperties === void 0) {\n additionalHeaderProperties = function additionalHeaderProperties() {\n return {};\n };\n }\n\n var headerGroups = [];\n var scanColumns = allColumns;\n var uid = 0;\n\n var getUID = function getUID() {\n return uid++;\n };\n\n var _loop = function _loop() {\n // The header group we are creating\n var headerGroup = {\n headers: []\n }; // The parent columns we're going to scan next\n\n var parentColumns = [];\n var hasParents = scanColumns.some(function (d) {\n return d.parent;\n }); // Scan each column for parents\n\n scanColumns.forEach(function (column) {\n // What is the latest (last) parent column?\n var latestParentColumn = [].concat(parentColumns).reverse()[0];\n var newParent;\n\n if (hasParents) {\n // If the column has a parent, add it if necessary\n if (column.parent) {\n newParent = _extends({}, column.parent, {\n originalId: column.parent.id,\n id: column.parent.id + \"_\" + getUID(),\n headers: [column]\n }, additionalHeaderProperties(column));\n } else {\n // If other columns have parents, we'll need to add a place holder if necessary\n var originalId = column.id + \"_placeholder\";\n newParent = decorateColumn(_extends({\n originalId: originalId,\n id: column.id + \"_placeholder_\" + getUID(),\n placeholderOf: column,\n headers: [column]\n }, additionalHeaderProperties(column)), defaultColumn);\n } // If the resulting parent columns are the same, just add\n // the column and increment the header span\n\n\n if (latestParentColumn && latestParentColumn.originalId === newParent.originalId) {\n latestParentColumn.headers.push(column);\n } else {\n parentColumns.push(newParent);\n }\n }\n\n headerGroup.headers.push(column);\n });\n headerGroups.push(headerGroup); // Start scanning the parent columns\n\n scanColumns = parentColumns;\n };\n\n while (scanColumns.length) {\n _loop();\n }\n\n return headerGroups.reverse();\n }\n var pathObjCache = new Map();\n function getBy(obj, path, def) {\n if (!path) {\n return obj;\n }\n\n var cacheKey = typeof path === 'function' ? path : JSON.stringify(path);\n\n var pathObj = pathObjCache.get(cacheKey) || function () {\n var pathObj = makePathArray(path);\n pathObjCache.set(cacheKey, pathObj);\n return pathObj;\n }();\n\n var val;\n\n try {\n val = pathObj.reduce(function (cursor, pathPart) {\n return cursor[pathPart];\n }, obj);\n } catch (e) {// continue regardless of error\n }\n\n return typeof val !== 'undefined' ? val : def;\n }\n function getFirstDefined() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n for (var i = 0; i < args.length; i += 1) {\n if (typeof args[i] !== 'undefined') {\n return args[i];\n }\n }\n }\n function isFunction(a) {\n if (typeof a === 'function') {\n return a;\n }\n }\n function flattenBy(arr, key) {\n var flat = [];\n\n var recurse = function recurse(arr) {\n arr.forEach(function (d) {\n if (!d[key]) {\n flat.push(d);\n } else {\n recurse(d[key]);\n }\n });\n };\n\n recurse(arr);\n return flat;\n }\n function expandRows(rows, _ref) {\n var manualExpandedKey = _ref.manualExpandedKey,\n expanded = _ref.expanded,\n _ref$expandSubRows = _ref.expandSubRows,\n expandSubRows = _ref$expandSubRows === void 0 ? true : _ref$expandSubRows;\n var expandedRows = [];\n\n var handleRow = function handleRow(row, addToExpandedRows) {\n if (addToExpandedRows === void 0) {\n addToExpandedRows = true;\n }\n\n row.isExpanded = row.original && row.original[manualExpandedKey] || expanded[row.id];\n row.canExpand = row.subRows && !!row.subRows.length;\n\n if (addToExpandedRows) {\n expandedRows.push(row);\n }\n\n if (row.subRows && row.subRows.length && row.isExpanded) {\n row.subRows.forEach(function (row) {\n return handleRow(row, expandSubRows);\n });\n }\n };\n\n rows.forEach(function (row) {\n return handleRow(row);\n });\n return expandedRows;\n }\n function getFilterMethod(filter, userFilterTypes, filterTypes) {\n return isFunction(filter) || userFilterTypes[filter] || filterTypes[filter] || filterTypes.text;\n }\n function shouldAutoRemoveFilter(autoRemove, value, column) {\n return autoRemove ? autoRemove(value, column) : typeof value === 'undefined';\n }\n function unpreparedAccessWarning() {\n throw new Error('React-Table: You have not called prepareRow(row) one or more rows you are attempting to render.');\n }\n var passiveSupported = null;\n function passiveEventSupported() {\n // memoize support to avoid adding multiple test events\n if (typeof passiveSupported === 'boolean') return passiveSupported;\n var supported = false;\n\n try {\n var options = {\n get passive() {\n supported = true;\n return false;\n }\n\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (err) {\n supported = false;\n }\n\n passiveSupported = supported;\n return passiveSupported;\n } //\n\n var reOpenBracket = /\\[/g;\n var reCloseBracket = /\\]/g;\n\n function makePathArray(obj) {\n return flattenDeep(obj) // remove all periods in parts\n .map(function (d) {\n return String(d).replace('.', '_');\n }) // join parts using period\n .join('.') // replace brackets with periods\n .replace(reOpenBracket, '.').replace(reCloseBracket, '') // split it back out on periods\n .split('.');\n }\n\n function flattenDeep(arr, newArr) {\n if (newArr === void 0) {\n newArr = [];\n }\n\n if (!Array.isArray(arr)) {\n newArr.push(arr);\n } else {\n for (var i = 0; i < arr.length; i += 1) {\n flattenDeep(arr[i], newArr);\n }\n }\n\n return newArr;\n }\n\n var defaultGetTableProps = function defaultGetTableProps(props) {\n return _extends({\n role: 'table'\n }, props);\n };\n\n var defaultGetTableBodyProps = function defaultGetTableBodyProps(props) {\n return _extends({\n role: 'rowgroup'\n }, props);\n };\n\n var defaultGetHeaderProps = function defaultGetHeaderProps(props, _ref) {\n var column = _ref.column;\n return _extends({\n key: \"header_\" + column.id,\n colSpan: column.totalVisibleHeaderCount,\n role: 'columnheader'\n }, props);\n };\n\n var defaultGetFooterProps = function defaultGetFooterProps(props, _ref2) {\n var column = _ref2.column;\n return _extends({\n key: \"footer_\" + column.id,\n colSpan: column.totalVisibleHeaderCount\n }, props);\n };\n\n var defaultGetHeaderGroupProps = function defaultGetHeaderGroupProps(props, _ref3) {\n var index = _ref3.index;\n return _extends({\n key: \"headerGroup_\" + index,\n role: 'row'\n }, props);\n };\n\n var defaultGetFooterGroupProps = function defaultGetFooterGroupProps(props, _ref4) {\n var index = _ref4.index;\n return _extends({\n key: \"footerGroup_\" + index\n }, props);\n };\n\n var defaultGetRowProps = function defaultGetRowProps(props, _ref5) {\n var row = _ref5.row;\n return _extends({\n key: \"row_\" + row.id,\n role: 'row'\n }, props);\n };\n\n var defaultGetCellProps = function defaultGetCellProps(props, _ref6) {\n var cell = _ref6.cell;\n return _extends({\n key: \"cell_\" + cell.row.id + \"_\" + cell.column.id,\n role: 'cell'\n }, props);\n };\n\n function makeDefaultPluginHooks() {\n return {\n useOptions: [],\n stateReducers: [],\n useControlledState: [],\n columns: [],\n columnsDeps: [],\n allColumns: [],\n allColumnsDeps: [],\n accessValue: [],\n materializedColumns: [],\n materializedColumnsDeps: [],\n useInstanceAfterData: [],\n visibleColumns: [],\n visibleColumnsDeps: [],\n headerGroups: [],\n headerGroupsDeps: [],\n useInstanceBeforeDimensions: [],\n useInstance: [],\n prepareRow: [],\n getTableProps: [defaultGetTableProps],\n getTableBodyProps: [defaultGetTableBodyProps],\n getHeaderGroupProps: [defaultGetHeaderGroupProps],\n getFooterGroupProps: [defaultGetFooterGroupProps],\n getHeaderProps: [defaultGetHeaderProps],\n getFooterProps: [defaultGetFooterProps],\n getRowProps: [defaultGetRowProps],\n getCellProps: [defaultGetCellProps],\n useFinalInstance: []\n };\n }\n\n actions.resetHiddenColumns = 'resetHiddenColumns';\n actions.toggleHideColumn = 'toggleHideColumn';\n actions.setHiddenColumns = 'setHiddenColumns';\n actions.toggleHideAllColumns = 'toggleHideAllColumns';\n var useColumnVisibility = function useColumnVisibility(hooks) {\n hooks.getToggleHiddenProps = [defaultGetToggleHiddenProps];\n hooks.getToggleHideAllColumnsProps = [defaultGetToggleHideAllColumnsProps];\n hooks.stateReducers.push(reducer);\n hooks.useInstanceBeforeDimensions.push(useInstanceBeforeDimensions);\n hooks.headerGroupsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.hiddenColumns]);\n });\n hooks.useInstance.push(useInstance);\n };\n useColumnVisibility.pluginName = 'useColumnVisibility';\n\n var defaultGetToggleHiddenProps = function defaultGetToggleHiddenProps(props, _ref2) {\n var column = _ref2.column;\n return [props, {\n onChange: function onChange(e) {\n column.toggleHidden(!e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: column.isVisible,\n title: 'Toggle Column Visible'\n }];\n };\n\n var defaultGetToggleHideAllColumnsProps = function defaultGetToggleHideAllColumnsProps(props, _ref3) {\n var instance = _ref3.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleHideAllColumns(!e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: !instance.allColumnsHidden && !instance.state.hiddenColumns.length,\n title: 'Toggle All Columns Hidden',\n indeterminate: !instance.allColumnsHidden && instance.state.hiddenColumns.length\n }];\n };\n\n function reducer(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n hiddenColumns: []\n }, state);\n }\n\n if (action.type === actions.resetHiddenColumns) {\n return _extends({}, state, {\n hiddenColumns: instance.initialState.hiddenColumns || []\n });\n }\n\n if (action.type === actions.toggleHideColumn) {\n var should = typeof action.value !== 'undefined' ? action.value : !state.hiddenColumns.includes(action.columnId);\n var hiddenColumns = should ? [].concat(state.hiddenColumns, [action.columnId]) : state.hiddenColumns.filter(function (d) {\n return d !== action.columnId;\n });\n return _extends({}, state, {\n hiddenColumns: hiddenColumns\n });\n }\n\n if (action.type === actions.setHiddenColumns) {\n return _extends({}, state, {\n hiddenColumns: functionalUpdate(action.value, state.hiddenColumns)\n });\n }\n\n if (action.type === actions.toggleHideAllColumns) {\n var shouldAll = typeof action.value !== 'undefined' ? action.value : !state.hiddenColumns.length;\n return _extends({}, state, {\n hiddenColumns: shouldAll ? instance.allColumns.map(function (d) {\n return d.id;\n }) : []\n });\n }\n }\n\n function useInstanceBeforeDimensions(instance) {\n var headers = instance.headers,\n hiddenColumns = instance.state.hiddenColumns;\n var isMountedRef = React.useRef(false);\n\n if (!isMountedRef.current) ;\n\n var handleColumn = function handleColumn(column, parentVisible) {\n column.isVisible = parentVisible && !hiddenColumns.includes(column.id);\n var totalVisibleHeaderCount = 0;\n\n if (column.headers && column.headers.length) {\n column.headers.forEach(function (subColumn) {\n return totalVisibleHeaderCount += handleColumn(subColumn, column.isVisible);\n });\n } else {\n totalVisibleHeaderCount = column.isVisible ? 1 : 0;\n }\n\n column.totalVisibleHeaderCount = totalVisibleHeaderCount;\n return totalVisibleHeaderCount;\n };\n\n var totalVisibleHeaderCount = 0;\n headers.forEach(function (subHeader) {\n return totalVisibleHeaderCount += handleColumn(subHeader, true);\n });\n }\n\n function useInstance(instance) {\n var columns = instance.columns,\n flatHeaders = instance.flatHeaders,\n dispatch = instance.dispatch,\n allColumns = instance.allColumns,\n getHooks = instance.getHooks,\n hiddenColumns = instance.state.hiddenColumns,\n _instance$autoResetHi = instance.autoResetHiddenColumns,\n autoResetHiddenColumns = _instance$autoResetHi === void 0 ? true : _instance$autoResetHi;\n var getInstance = useGetLatest(instance);\n var allColumnsHidden = allColumns.length === hiddenColumns.length;\n var toggleHideColumn = React.useCallback(function (columnId, value) {\n return dispatch({\n type: actions.toggleHideColumn,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var setHiddenColumns = React.useCallback(function (value) {\n return dispatch({\n type: actions.setHiddenColumns,\n value: value\n });\n }, [dispatch]);\n var toggleHideAllColumns = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleHideAllColumns,\n value: value\n });\n }, [dispatch]);\n var getToggleHideAllColumnsProps = makePropGetter(getHooks().getToggleHideAllColumnsProps, {\n instance: getInstance()\n });\n flatHeaders.forEach(function (column) {\n column.toggleHidden = function (value) {\n dispatch({\n type: actions.toggleHideColumn,\n columnId: column.id,\n value: value\n });\n };\n\n column.getToggleHiddenProps = makePropGetter(getHooks().getToggleHiddenProps, {\n instance: getInstance(),\n column: column\n });\n });\n var getAutoResetHiddenColumns = useGetLatest(autoResetHiddenColumns);\n useMountedLayoutEffect(function () {\n if (getAutoResetHiddenColumns()) {\n dispatch({\n type: actions.resetHiddenColumns\n });\n }\n }, [dispatch, columns]);\n Object.assign(instance, {\n allColumnsHidden: allColumnsHidden,\n toggleHideColumn: toggleHideColumn,\n setHiddenColumns: setHiddenColumns,\n toggleHideAllColumns: toggleHideAllColumns,\n getToggleHideAllColumnsProps: getToggleHideAllColumnsProps\n });\n }\n\n var defaultInitialState = {};\n var defaultColumnInstance = {};\n\n var defaultReducer = function defaultReducer(state, action, prevState) {\n return state;\n };\n\n var defaultGetSubRows = function defaultGetSubRows(row, index) {\n return row.subRows || [];\n };\n\n var defaultGetRowId = function defaultGetRowId(row, index, parent) {\n return \"\" + (parent ? [parent.id, index].join('.') : index);\n };\n\n var defaultUseControlledState = function defaultUseControlledState(d) {\n return d;\n };\n\n function applyDefaults(props) {\n var _props$initialState = props.initialState,\n initialState = _props$initialState === void 0 ? defaultInitialState : _props$initialState,\n _props$defaultColumn = props.defaultColumn,\n defaultColumn = _props$defaultColumn === void 0 ? defaultColumnInstance : _props$defaultColumn,\n _props$getSubRows = props.getSubRows,\n getSubRows = _props$getSubRows === void 0 ? defaultGetSubRows : _props$getSubRows,\n _props$getRowId = props.getRowId,\n getRowId = _props$getRowId === void 0 ? defaultGetRowId : _props$getRowId,\n _props$stateReducer = props.stateReducer,\n stateReducer = _props$stateReducer === void 0 ? defaultReducer : _props$stateReducer,\n _props$useControlledS = props.useControlledState,\n useControlledState = _props$useControlledS === void 0 ? defaultUseControlledState : _props$useControlledS,\n rest = _objectWithoutPropertiesLoose(props, [\"initialState\", \"defaultColumn\", \"getSubRows\", \"getRowId\", \"stateReducer\", \"useControlledState\"]);\n\n return _extends({}, rest, {\n initialState: initialState,\n defaultColumn: defaultColumn,\n getSubRows: getSubRows,\n getRowId: getRowId,\n stateReducer: stateReducer,\n useControlledState: useControlledState\n });\n }\n\n var useTable = function useTable(props) {\n for (var _len = arguments.length, plugins = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n plugins[_key - 1] = arguments[_key];\n }\n\n // Apply default props\n props = applyDefaults(props); // Add core plugins\n\n plugins = [useColumnVisibility].concat(plugins); // Create the table instance\n\n var instanceRef = React.useRef({}); // Create a getter for the instance (helps avoid a lot of potential memory leaks)\n\n var getInstance = useGetLatest(instanceRef.current); // Assign the props, plugins and hooks to the instance\n\n Object.assign(getInstance(), _extends({}, props, {\n plugins: plugins,\n hooks: makeDefaultPluginHooks()\n })); // Allow plugins to register hooks as early as possible\n\n plugins.filter(Boolean).forEach(function (plugin) {\n plugin(getInstance().hooks);\n }); // Consume all hooks and make a getter for them\n\n var getHooks = useGetLatest(getInstance().hooks);\n getInstance().getHooks = getHooks;\n delete getInstance().hooks; // Allow useOptions hooks to modify the options coming into the table\n\n Object.assign(getInstance(), reduceHooks(getHooks().useOptions, applyDefaults(props)));\n\n var _getInstance = getInstance(),\n data = _getInstance.data,\n userColumns = _getInstance.columns,\n initialState = _getInstance.initialState,\n defaultColumn = _getInstance.defaultColumn,\n getSubRows = _getInstance.getSubRows,\n getRowId = _getInstance.getRowId,\n stateReducer = _getInstance.stateReducer,\n useControlledState = _getInstance.useControlledState; // Setup user reducer ref\n\n\n var getStateReducer = useGetLatest(stateReducer); // Build the reducer\n\n var reducer = React.useCallback(function (state, action) {\n // Detect invalid actions\n if (!action.type) {\n console.info({\n action: action\n });\n throw new Error('Unknown Action 👆');\n } // Reduce the state from all plugin reducers\n\n\n return [].concat(getHooks().stateReducers, Array.isArray(getStateReducer()) ? getStateReducer() : [getStateReducer()]).reduce(function (s, handler) {\n return handler(s, action, state, getInstance()) || s;\n }, state);\n }, [getHooks, getStateReducer, getInstance]); // Start the reducer\n\n var _React$useReducer = React.useReducer(reducer, undefined, function () {\n return reducer(initialState, {\n type: actions.init\n });\n }),\n reducerState = _React$useReducer[0],\n dispatch = _React$useReducer[1]; // Allow the user to control the final state with hooks\n\n\n var state = reduceHooks([].concat(getHooks().useControlledState, [useControlledState]), reducerState, {\n instance: getInstance()\n });\n Object.assign(getInstance(), {\n state: state,\n dispatch: dispatch\n }); // Decorate All the columns\n\n var columns = React.useMemo(function () {\n return linkColumnStructure(reduceHooks(getHooks().columns, userColumns, {\n instance: getInstance()\n }));\n }, [getHooks, getInstance, userColumns].concat(reduceHooks(getHooks().columnsDeps, [], {\n instance: getInstance()\n })));\n getInstance().columns = columns; // Get the flat list of all columns and allow hooks to decorate\n // those columns (and trigger this memoization via deps)\n\n var allColumns = React.useMemo(function () {\n return reduceHooks(getHooks().allColumns, flattenColumns(columns), {\n instance: getInstance()\n }).map(assignColumnAccessor);\n }, [columns, getHooks, getInstance].concat(reduceHooks(getHooks().allColumnsDeps, [], {\n instance: getInstance()\n })));\n getInstance().allColumns = allColumns; // Access the row model using initial columns\n\n var _React$useMemo = React.useMemo(function () {\n var rows = [];\n var flatRows = [];\n var rowsById = {};\n var allColumnsQueue = [].concat(allColumns);\n\n while (allColumnsQueue.length) {\n var column = allColumnsQueue.shift();\n accessRowsForColumn({\n data: data,\n rows: rows,\n flatRows: flatRows,\n rowsById: rowsById,\n column: column,\n getRowId: getRowId,\n getSubRows: getSubRows,\n accessValueHooks: getHooks().accessValue,\n getInstance: getInstance\n });\n }\n\n return [rows, flatRows, rowsById];\n }, [allColumns, data, getRowId, getSubRows, getHooks, getInstance]),\n rows = _React$useMemo[0],\n flatRows = _React$useMemo[1],\n rowsById = _React$useMemo[2];\n\n Object.assign(getInstance(), {\n rows: rows,\n initialRows: [].concat(rows),\n flatRows: flatRows,\n rowsById: rowsById // materializedColumns,\n\n });\n loopHooks(getHooks().useInstanceAfterData, getInstance()); // Get the flat list of all columns AFTER the rows\n // have been access, and allow hooks to decorate\n // those columns (and trigger this memoization via deps)\n\n var visibleColumns = React.useMemo(function () {\n return reduceHooks(getHooks().visibleColumns, allColumns, {\n instance: getInstance()\n }).map(function (d) {\n return decorateColumn(d, defaultColumn);\n });\n }, [getHooks, allColumns, getInstance, defaultColumn].concat(reduceHooks(getHooks().visibleColumnsDeps, [], {\n instance: getInstance()\n }))); // Combine new visible columns with all columns\n\n allColumns = React.useMemo(function () {\n var columns = [].concat(visibleColumns);\n allColumns.forEach(function (column) {\n if (!columns.find(function (d) {\n return d.id === column.id;\n })) {\n columns.push(column);\n }\n });\n return columns;\n }, [allColumns, visibleColumns]);\n getInstance().allColumns = allColumns;\n\n {\n var duplicateColumns = allColumns.filter(function (column, i) {\n return allColumns.findIndex(function (d) {\n return d.id === column.id;\n }) !== i;\n });\n\n if (duplicateColumns.length) {\n console.info(allColumns);\n throw new Error(\"Duplicate columns were found with ids: \\\"\" + duplicateColumns.map(function (d) {\n return d.id;\n }).join(', ') + \"\\\" in the columns array above\");\n }\n } // Make the headerGroups\n\n\n var headerGroups = React.useMemo(function () {\n return reduceHooks(getHooks().headerGroups, makeHeaderGroups(visibleColumns, defaultColumn), getInstance());\n }, [getHooks, visibleColumns, defaultColumn, getInstance].concat(reduceHooks(getHooks().headerGroupsDeps, [], {\n instance: getInstance()\n })));\n getInstance().headerGroups = headerGroups; // Get the first level of headers\n\n var headers = React.useMemo(function () {\n return headerGroups.length ? headerGroups[0].headers : [];\n }, [headerGroups]);\n getInstance().headers = headers; // Provide a flat header list for utilities\n\n getInstance().flatHeaders = headerGroups.reduce(function (all, headerGroup) {\n return [].concat(all, headerGroup.headers);\n }, []);\n loopHooks(getHooks().useInstanceBeforeDimensions, getInstance()); // Filter columns down to visible ones\n\n var visibleColumnsDep = visibleColumns.filter(function (d) {\n return d.isVisible;\n }).map(function (d) {\n return d.id;\n }).sort().join('_');\n visibleColumns = React.useMemo(function () {\n return visibleColumns.filter(function (d) {\n return d.isVisible;\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [visibleColumns, visibleColumnsDep]);\n getInstance().visibleColumns = visibleColumns; // Header Visibility is needed by this point\n\n var _calculateHeaderWidth = calculateHeaderWidths(headers),\n totalColumnsMinWidth = _calculateHeaderWidth[0],\n totalColumnsWidth = _calculateHeaderWidth[1],\n totalColumnsMaxWidth = _calculateHeaderWidth[2];\n\n getInstance().totalColumnsMinWidth = totalColumnsMinWidth;\n getInstance().totalColumnsWidth = totalColumnsWidth;\n getInstance().totalColumnsMaxWidth = totalColumnsMaxWidth;\n loopHooks(getHooks().useInstance, getInstance()) // Each materialized header needs to be assigned a render function and other\n // prop getter properties here.\n ;\n [].concat(getInstance().flatHeaders, getInstance().allColumns).forEach(function (column) {\n // Give columns/headers rendering power\n column.render = makeRenderer(getInstance(), column); // Give columns/headers a default getHeaderProps\n\n column.getHeaderProps = makePropGetter(getHooks().getHeaderProps, {\n instance: getInstance(),\n column: column\n }); // Give columns/headers a default getFooterProps\n\n column.getFooterProps = makePropGetter(getHooks().getFooterProps, {\n instance: getInstance(),\n column: column\n });\n });\n getInstance().headerGroups = React.useMemo(function () {\n return headerGroups.filter(function (headerGroup, i) {\n // Filter out any headers and headerGroups that don't have visible columns\n headerGroup.headers = headerGroup.headers.filter(function (column) {\n var recurse = function recurse(headers) {\n return headers.filter(function (column) {\n if (column.headers) {\n return recurse(column.headers);\n }\n\n return column.isVisible;\n }).length;\n };\n\n if (column.headers) {\n return recurse(column.headers);\n }\n\n return column.isVisible;\n }); // Give headerGroups getRowProps\n\n if (headerGroup.headers.length) {\n headerGroup.getHeaderGroupProps = makePropGetter(getHooks().getHeaderGroupProps, {\n instance: getInstance(),\n headerGroup: headerGroup,\n index: i\n });\n headerGroup.getFooterGroupProps = makePropGetter(getHooks().getFooterGroupProps, {\n instance: getInstance(),\n headerGroup: headerGroup,\n index: i\n });\n return true;\n }\n\n return false;\n });\n }, [headerGroups, getInstance, getHooks]);\n getInstance().footerGroups = [].concat(getInstance().headerGroups).reverse(); // The prepareRow function is absolutely necessary and MUST be called on\n // any rows the user wishes to be displayed.\n\n getInstance().prepareRow = React.useCallback(function (row) {\n row.getRowProps = makePropGetter(getHooks().getRowProps, {\n instance: getInstance(),\n row: row\n }); // Build the visible cells for each row\n\n row.allCells = allColumns.map(function (column) {\n var value = row.values[column.id];\n var cell = {\n column: column,\n row: row,\n value: value\n }; // Give each cell a getCellProps base\n\n cell.getCellProps = makePropGetter(getHooks().getCellProps, {\n instance: getInstance(),\n cell: cell\n }); // Give each cell a renderer function (supports multiple renderers)\n\n cell.render = makeRenderer(getInstance(), column, {\n row: row,\n cell: cell,\n value: value\n });\n return cell;\n });\n row.cells = visibleColumns.map(function (column) {\n return row.allCells.find(function (cell) {\n return cell.column.id === column.id;\n });\n }); // need to apply any row specific hooks (useExpanded requires this)\n\n loopHooks(getHooks().prepareRow, row, {\n instance: getInstance()\n });\n }, [getHooks, getInstance, allColumns, visibleColumns]);\n getInstance().getTableProps = makePropGetter(getHooks().getTableProps, {\n instance: getInstance()\n });\n getInstance().getTableBodyProps = makePropGetter(getHooks().getTableBodyProps, {\n instance: getInstance()\n });\n loopHooks(getHooks().useFinalInstance, getInstance());\n return getInstance();\n };\n\n function calculateHeaderWidths(headers, left) {\n if (left === void 0) {\n left = 0;\n }\n\n var sumTotalMinWidth = 0;\n var sumTotalWidth = 0;\n var sumTotalMaxWidth = 0;\n var sumTotalFlexWidth = 0;\n headers.forEach(function (header) {\n var subHeaders = header.headers;\n header.totalLeft = left;\n\n if (subHeaders && subHeaders.length) {\n var _calculateHeaderWidth2 = calculateHeaderWidths(subHeaders, left),\n totalMinWidth = _calculateHeaderWidth2[0],\n totalWidth = _calculateHeaderWidth2[1],\n totalMaxWidth = _calculateHeaderWidth2[2],\n totalFlexWidth = _calculateHeaderWidth2[3];\n\n header.totalMinWidth = totalMinWidth;\n header.totalWidth = totalWidth;\n header.totalMaxWidth = totalMaxWidth;\n header.totalFlexWidth = totalFlexWidth;\n } else {\n header.totalMinWidth = header.minWidth;\n header.totalWidth = Math.min(Math.max(header.minWidth, header.width), header.maxWidth);\n header.totalMaxWidth = header.maxWidth;\n header.totalFlexWidth = header.canResize ? header.totalWidth : 0;\n }\n\n if (header.isVisible) {\n left += header.totalWidth;\n sumTotalMinWidth += header.totalMinWidth;\n sumTotalWidth += header.totalWidth;\n sumTotalMaxWidth += header.totalMaxWidth;\n sumTotalFlexWidth += header.totalFlexWidth;\n }\n });\n return [sumTotalMinWidth, sumTotalWidth, sumTotalMaxWidth, sumTotalFlexWidth];\n }\n\n function accessRowsForColumn(_ref) {\n var data = _ref.data,\n rows = _ref.rows,\n flatRows = _ref.flatRows,\n rowsById = _ref.rowsById,\n column = _ref.column,\n getRowId = _ref.getRowId,\n getSubRows = _ref.getSubRows,\n accessValueHooks = _ref.accessValueHooks,\n getInstance = _ref.getInstance;\n\n // Access the row's data column-by-column\n // We do it this way so we can incrementally add materialized\n // columns after the first pass and avoid excessive looping\n var accessRow = function accessRow(originalRow, rowIndex, depth, parent, parentRows) {\n if (depth === void 0) {\n depth = 0;\n }\n\n // Keep the original reference around\n var original = originalRow;\n var id = getRowId(originalRow, rowIndex, parent);\n var row = rowsById[id]; // If the row hasn't been created, let's make it\n\n if (!row) {\n row = {\n id: id,\n original: original,\n index: rowIndex,\n depth: depth,\n cells: [{}] // This is a dummy cell\n\n }; // Override common array functions (and the dummy cell's getCellProps function)\n // to show an error if it is accessed without calling prepareRow\n\n row.cells.map = unpreparedAccessWarning;\n row.cells.filter = unpreparedAccessWarning;\n row.cells.forEach = unpreparedAccessWarning;\n row.cells[0].getCellProps = unpreparedAccessWarning; // Create the cells and values\n\n row.values = {}; // Push this row into the parentRows array\n\n parentRows.push(row); // Keep track of every row in a flat array\n\n flatRows.push(row); // Also keep track of every row by its ID\n\n rowsById[id] = row; // Get the original subrows\n\n row.originalSubRows = getSubRows(originalRow, rowIndex); // Then recursively access them\n\n if (row.originalSubRows) {\n var subRows = [];\n row.originalSubRows.forEach(function (d, i) {\n return accessRow(d, i, depth + 1, row, subRows);\n }); // Keep the new subRows array on the row\n\n row.subRows = subRows;\n }\n } else if (row.subRows) {\n // If the row exists, then it's already been accessed\n // Keep recursing, but don't worry about passing the\n // accumlator array (those rows already exist)\n row.originalSubRows.forEach(function (d, i) {\n return accessRow(d, i, depth + 1, row);\n });\n } // If the column has an accessor, use it to get a value\n\n\n if (column.accessor) {\n row.values[column.id] = column.accessor(originalRow, rowIndex, row, parentRows, data);\n } // Allow plugins to manipulate the column value\n\n\n row.values[column.id] = reduceHooks(accessValueHooks, row.values[column.id], {\n row: row,\n column: column,\n instance: getInstance()\n }, true);\n };\n\n data.forEach(function (originalRow, rowIndex) {\n return accessRow(originalRow, rowIndex, 0, undefined, rows);\n });\n }\n\n actions.resetExpanded = 'resetExpanded';\n actions.toggleRowExpanded = 'toggleRowExpanded';\n actions.toggleAllRowsExpanded = 'toggleAllRowsExpanded';\n var useExpanded = function useExpanded(hooks) {\n hooks.getToggleAllRowsExpandedProps = [defaultGetToggleAllRowsExpandedProps];\n hooks.getToggleRowExpandedProps = [defaultGetToggleRowExpandedProps];\n hooks.stateReducers.push(reducer$1);\n hooks.useInstance.push(useInstance$1);\n hooks.prepareRow.push(prepareRow);\n };\n useExpanded.pluginName = 'useExpanded';\n\n var defaultGetToggleAllRowsExpandedProps = function defaultGetToggleAllRowsExpandedProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n onClick: function onClick(e) {\n instance.toggleAllRowsExpanded();\n },\n style: {\n cursor: 'pointer'\n },\n title: 'Toggle All Rows Expanded'\n }];\n };\n\n var defaultGetToggleRowExpandedProps = function defaultGetToggleRowExpandedProps(props, _ref2) {\n var row = _ref2.row;\n return [props, {\n onClick: function onClick() {\n row.toggleRowExpanded();\n },\n style: {\n cursor: 'pointer'\n },\n title: 'Toggle Row Expanded'\n }];\n }; // Reducer\n\n\n function reducer$1(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n expanded: {}\n }, state);\n }\n\n if (action.type === actions.resetExpanded) {\n return _extends({}, state, {\n expanded: instance.initialState.expanded || {}\n });\n }\n\n if (action.type === actions.toggleAllRowsExpanded) {\n var value = action.value;\n var isAllRowsExpanded = instance.isAllRowsExpanded,\n rowsById = instance.rowsById;\n var expandAll = typeof value !== 'undefined' ? value : !isAllRowsExpanded;\n\n if (expandAll) {\n var expanded = {};\n Object.keys(rowsById).forEach(function (rowId) {\n expanded[rowId] = true;\n });\n return _extends({}, state, {\n expanded: expanded\n });\n }\n\n return _extends({}, state, {\n expanded: {}\n });\n }\n\n if (action.type === actions.toggleRowExpanded) {\n var id = action.id,\n setExpanded = action.value;\n var exists = state.expanded[id];\n var shouldExist = typeof setExpanded !== 'undefined' ? setExpanded : !exists;\n\n if (!exists && shouldExist) {\n var _extends2;\n\n return _extends({}, state, {\n expanded: _extends({}, state.expanded, (_extends2 = {}, _extends2[id] = true, _extends2))\n });\n } else if (exists && !shouldExist) {\n var _state$expanded = state.expanded,\n _ = _state$expanded[id],\n rest = _objectWithoutPropertiesLoose(_state$expanded, [id].map(_toPropertyKey));\n\n return _extends({}, state, {\n expanded: rest\n });\n } else {\n return state;\n }\n }\n }\n\n function useInstance$1(instance) {\n var data = instance.data,\n rows = instance.rows,\n rowsById = instance.rowsById,\n _instance$manualExpan = instance.manualExpandedKey,\n manualExpandedKey = _instance$manualExpan === void 0 ? 'expanded' : _instance$manualExpan,\n _instance$paginateExp = instance.paginateExpandedRows,\n paginateExpandedRows = _instance$paginateExp === void 0 ? true : _instance$paginateExp,\n _instance$expandSubRo = instance.expandSubRows,\n expandSubRows = _instance$expandSubRo === void 0 ? true : _instance$expandSubRo,\n _instance$autoResetEx = instance.autoResetExpanded,\n autoResetExpanded = _instance$autoResetEx === void 0 ? true : _instance$autoResetEx,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n expanded = instance.state.expanded,\n dispatch = instance.dispatch;\n ensurePluginOrder(plugins, ['useSortBy', 'useGroupBy', 'usePivotColumns', 'useGlobalFilter'], 'useExpanded');\n var getAutoResetExpanded = useGetLatest(autoResetExpanded);\n var isAllRowsExpanded = Boolean(Object.keys(rowsById).length && Object.keys(expanded).length);\n\n if (isAllRowsExpanded) {\n if (Object.keys(rowsById).some(function (id) {\n return !expanded[id];\n })) {\n isAllRowsExpanded = false;\n }\n } // Bypass any effects from firing when this changes\n\n\n useMountedLayoutEffect(function () {\n if (getAutoResetExpanded()) {\n dispatch({\n type: actions.resetExpanded\n });\n }\n }, [dispatch, data]);\n var toggleRowExpanded = React.useCallback(function (id, value) {\n dispatch({\n type: actions.toggleRowExpanded,\n id: id,\n value: value\n });\n }, [dispatch]);\n var toggleAllRowsExpanded = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllRowsExpanded,\n value: value\n });\n }, [dispatch]);\n var expandedRows = React.useMemo(function () {\n if (paginateExpandedRows) {\n return expandRows(rows, {\n manualExpandedKey: manualExpandedKey,\n expanded: expanded,\n expandSubRows: expandSubRows\n });\n }\n\n return rows;\n }, [paginateExpandedRows, rows, manualExpandedKey, expanded, expandSubRows]);\n var expandedDepth = React.useMemo(function () {\n return findExpandedDepth(expanded);\n }, [expanded]);\n var getInstance = useGetLatest(instance);\n var getToggleAllRowsExpandedProps = makePropGetter(getHooks().getToggleAllRowsExpandedProps, {\n instance: getInstance()\n });\n Object.assign(instance, {\n preExpandedRows: rows,\n expandedRows: expandedRows,\n rows: expandedRows,\n expandedDepth: expandedDepth,\n isAllRowsExpanded: isAllRowsExpanded,\n toggleRowExpanded: toggleRowExpanded,\n toggleAllRowsExpanded: toggleAllRowsExpanded,\n getToggleAllRowsExpandedProps: getToggleAllRowsExpandedProps\n });\n }\n\n function prepareRow(row, _ref3) {\n var getHooks = _ref3.instance.getHooks,\n instance = _ref3.instance;\n\n row.toggleRowExpanded = function (set) {\n return instance.toggleRowExpanded(row.id, set);\n };\n\n row.getToggleRowExpandedProps = makePropGetter(getHooks().getToggleRowExpandedProps, {\n instance: instance,\n row: row\n });\n }\n\n function findExpandedDepth(expanded) {\n var maxDepth = 0;\n Object.keys(expanded).forEach(function (id) {\n var splitId = id.split('.');\n maxDepth = Math.max(maxDepth, splitId.length);\n });\n return maxDepth;\n }\n\n var text = function text(rows, ids, filterValue) {\n rows = rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return String(rowValue).toLowerCase().includes(String(filterValue).toLowerCase());\n });\n });\n return rows;\n };\n\n text.autoRemove = function (val) {\n return !val;\n };\n\n var exactText = function exactText(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue !== undefined ? String(rowValue).toLowerCase() === String(filterValue).toLowerCase() : true;\n });\n });\n };\n\n exactText.autoRemove = function (val) {\n return !val;\n };\n\n var exactTextCase = function exactTextCase(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue !== undefined ? String(rowValue) === String(filterValue) : true;\n });\n });\n };\n\n exactTextCase.autoRemove = function (val) {\n return !val;\n };\n\n var includes = function includes(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue.includes(filterValue);\n });\n });\n };\n\n includes.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesAll = function includesAll(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue && rowValue.length && filterValue.every(function (val) {\n return rowValue.includes(val);\n });\n });\n });\n };\n\n includesAll.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesSome = function includesSome(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue && rowValue.length && filterValue.some(function (val) {\n return rowValue.includes(val);\n });\n });\n });\n };\n\n includesSome.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesValue = function includesValue(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return filterValue.includes(rowValue);\n });\n });\n };\n\n includesValue.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var exact = function exact(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue === filterValue;\n });\n });\n };\n\n exact.autoRemove = function (val) {\n return typeof val === 'undefined';\n };\n\n var equals = function equals(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id]; // eslint-disable-next-line eqeqeq\n\n return rowValue == filterValue;\n });\n });\n };\n\n equals.autoRemove = function (val) {\n return val == null;\n };\n\n var between = function between(rows, ids, filterValue) {\n var _ref = filterValue || [],\n min = _ref[0],\n max = _ref[1];\n\n min = typeof min === 'number' ? min : -Infinity;\n max = typeof max === 'number' ? max : Infinity;\n\n if (min > max) {\n var temp = min;\n min = max;\n max = temp;\n }\n\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue >= min && rowValue <= max;\n });\n });\n };\n\n between.autoRemove = function (val) {\n return !val || typeof val[0] !== 'number' && typeof val[1] !== 'number';\n };\n\n var filterTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n text: text,\n exactText: exactText,\n exactTextCase: exactTextCase,\n includes: includes,\n includesAll: includesAll,\n includesSome: includesSome,\n includesValue: includesValue,\n exact: exact,\n equals: equals,\n between: between\n });\n\n actions.resetFilters = 'resetFilters';\n actions.setFilter = 'setFilter';\n actions.setAllFilters = 'setAllFilters';\n var useFilters = function useFilters(hooks) {\n hooks.stateReducers.push(reducer$2);\n hooks.useInstance.push(useInstance$2);\n };\n useFilters.pluginName = 'useFilters';\n\n function reducer$2(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n filters: []\n }, state);\n }\n\n if (action.type === actions.resetFilters) {\n return _extends({}, state, {\n filters: instance.initialState.filters || []\n });\n }\n\n if (action.type === actions.setFilter) {\n var columnId = action.columnId,\n filterValue = action.filterValue;\n var allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes;\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n\n if (!column) {\n throw new Error(\"React-Table: Could not find a column with id: \" + columnId);\n }\n\n var filterMethod = getFilterMethod(column.filter, userFilterTypes || {}, filterTypes);\n var previousfilter = state.filters.find(function (d) {\n return d.id === columnId;\n });\n var newFilter = functionalUpdate(filterValue, previousfilter && previousfilter.value); //\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, newFilter, column)) {\n return _extends({}, state, {\n filters: state.filters.filter(function (d) {\n return d.id !== columnId;\n })\n });\n }\n\n if (previousfilter) {\n return _extends({}, state, {\n filters: state.filters.map(function (d) {\n if (d.id === columnId) {\n return {\n id: columnId,\n value: newFilter\n };\n }\n\n return d;\n })\n });\n }\n\n return _extends({}, state, {\n filters: [].concat(state.filters, [{\n id: columnId,\n value: newFilter\n }])\n });\n }\n\n if (action.type === actions.setAllFilters) {\n var filters = action.filters;\n var _allColumns = instance.allColumns,\n _userFilterTypes = instance.filterTypes;\n return _extends({}, state, {\n // Filter out undefined values\n filters: functionalUpdate(filters, state.filters).filter(function (filter) {\n var column = _allColumns.find(function (d) {\n return d.id === filter.id;\n });\n\n var filterMethod = getFilterMethod(column.filter, _userFilterTypes || {}, filterTypes);\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, filter.value, column)) {\n return false;\n }\n\n return true;\n })\n });\n }\n }\n\n function useInstance$2(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes,\n manualFilters = instance.manualFilters,\n _instance$defaultCanF = instance.defaultCanFilter,\n defaultCanFilter = _instance$defaultCanF === void 0 ? false : _instance$defaultCanF,\n disableFilters = instance.disableFilters,\n filters = instance.state.filters,\n dispatch = instance.dispatch,\n _instance$autoResetFi = instance.autoResetFilters,\n autoResetFilters = _instance$autoResetFi === void 0 ? true : _instance$autoResetFi;\n var setFilter = React.useCallback(function (columnId, filterValue) {\n dispatch({\n type: actions.setFilter,\n columnId: columnId,\n filterValue: filterValue\n });\n }, [dispatch]);\n var setAllFilters = React.useCallback(function (filters) {\n dispatch({\n type: actions.setAllFilters,\n filters: filters\n });\n }, [dispatch]);\n allColumns.forEach(function (column) {\n var id = column.id,\n accessor = column.accessor,\n columnDefaultCanFilter = column.defaultCanFilter,\n columnDisableFilters = column.disableFilters; // Determine if a column is filterable\n\n column.canFilter = accessor ? getFirstDefined(columnDisableFilters === true ? false : undefined, disableFilters === true ? false : undefined, true) : getFirstDefined(columnDefaultCanFilter, defaultCanFilter, false); // Provide the column a way of updating the filter value\n\n column.setFilter = function (val) {\n return setFilter(column.id, val);\n }; // Provide the current filter value to the column for\n // convenience\n\n\n var found = filters.find(function (d) {\n return d.id === id;\n });\n column.filterValue = found && found.value;\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualFilters || !filters.length) {\n return [rows, flatRows, rowsById];\n }\n\n var filteredFlatRows = [];\n var filteredRowsById = {}; // Filters top level and nested rows\n\n var filterRows = function filterRows(rows, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n\n var filteredRows = rows;\n filteredRows = filters.reduce(function (filteredSoFar, _ref) {\n var columnId = _ref.id,\n filterValue = _ref.value;\n // Find the filters column\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n\n if (!column) {\n return filteredSoFar;\n }\n\n if (depth === 0) {\n column.preFilteredRows = filteredSoFar;\n }\n\n var filterMethod = getFilterMethod(column.filter, userFilterTypes || {}, filterTypes);\n\n if (!filterMethod) {\n console.warn(\"Could not find a valid 'column.filter' for column with the ID: \" + column.id + \".\");\n return filteredSoFar;\n } // Pass the rows, id, filterValue and column to the filterMethod\n // to get the filtered rows back\n\n\n column.filteredRows = filterMethod(filteredSoFar, [columnId], filterValue);\n return column.filteredRows;\n }, rows); // Apply the filter to any subRows\n // We technically could do this recursively in the above loop,\n // but that would severely hinder the API for the user, since they\n // would be required to do that recursion in some scenarios\n\n filteredRows.forEach(function (row) {\n filteredFlatRows.push(row);\n filteredRowsById[row.id] = row;\n\n if (!row.subRows) {\n return;\n }\n\n row.subRows = row.subRows && row.subRows.length > 0 ? filterRows(row.subRows, depth + 1) : row.subRows;\n });\n return filteredRows;\n };\n\n return [filterRows(rows), filteredFlatRows, filteredRowsById];\n }, [manualFilters, filters, rows, flatRows, rowsById, allColumns, userFilterTypes]),\n filteredRows = _React$useMemo[0],\n filteredFlatRows = _React$useMemo[1],\n filteredRowsById = _React$useMemo[2];\n\n React.useMemo(function () {\n // Now that each filtered column has it's partially filtered rows,\n // lets assign the final filtered rows to all of the other columns\n var nonFilteredColumns = allColumns.filter(function (column) {\n return !filters.find(function (d) {\n return d.id === column.id;\n });\n }); // This essentially enables faceted filter options to be built easily\n // using every column's preFilteredRows value\n\n nonFilteredColumns.forEach(function (column) {\n column.preFilteredRows = filteredRows;\n column.filteredRows = filteredRows;\n });\n }, [filteredRows, filters, allColumns]);\n var getAutoResetFilters = useGetLatest(autoResetFilters);\n useMountedLayoutEffect(function () {\n if (getAutoResetFilters()) {\n dispatch({\n type: actions.resetFilters\n });\n }\n }, [dispatch, manualFilters ? null : data]);\n Object.assign(instance, {\n preFilteredRows: rows,\n preFilteredFlatRows: flatRows,\n preFilteredRowsById: rowsById,\n filteredRows: filteredRows,\n filteredFlatRows: filteredFlatRows,\n filteredRowsById: filteredRowsById,\n rows: filteredRows,\n flatRows: filteredFlatRows,\n rowsById: filteredRowsById,\n setFilter: setFilter,\n setAllFilters: setAllFilters\n });\n }\n\n actions.resetGlobalFilter = 'resetGlobalFilter';\n actions.setGlobalFilter = 'setGlobalFilter';\n var useGlobalFilter = function useGlobalFilter(hooks) {\n hooks.stateReducers.push(reducer$3);\n hooks.useInstance.push(useInstance$3);\n };\n useGlobalFilter.pluginName = 'useGlobalFilter';\n\n function reducer$3(state, action, previousState, instance) {\n if (action.type === actions.resetGlobalFilter) {\n return _extends({}, state, {\n globalFilter: instance.initialState.globalFilter || undefined\n });\n }\n\n if (action.type === actions.setGlobalFilter) {\n var filterValue = action.filterValue;\n var userFilterTypes = instance.userFilterTypes;\n var filterMethod = getFilterMethod(instance.globalFilter, userFilterTypes || {}, filterTypes);\n var newFilter = functionalUpdate(filterValue, state.globalFilter); //\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, newFilter)) {\n var globalFilter = state.globalFilter,\n stateWithoutGlobalFilter = _objectWithoutPropertiesLoose(state, [\"globalFilter\"]);\n\n return stateWithoutGlobalFilter;\n }\n\n return _extends({}, state, {\n globalFilter: newFilter\n });\n }\n }\n\n function useInstance$3(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes,\n globalFilter = instance.globalFilter,\n manualGlobalFilter = instance.manualGlobalFilter,\n globalFilterValue = instance.state.globalFilter,\n dispatch = instance.dispatch,\n _instance$autoResetGl = instance.autoResetGlobalFilter,\n autoResetGlobalFilter = _instance$autoResetGl === void 0 ? true : _instance$autoResetGl,\n disableGlobalFilter = instance.disableGlobalFilter;\n var setGlobalFilter = React.useCallback(function (filterValue) {\n dispatch({\n type: actions.setGlobalFilter,\n filterValue: filterValue\n });\n }, [dispatch]); // TODO: Create a filter cache for incremental high speed multi-filtering\n // This gets pretty complicated pretty fast, since you have to maintain a\n // cache for each row group (top-level rows, and each row's recursive subrows)\n // This would make multi-filtering a lot faster though. Too far?\n\n var _React$useMemo = React.useMemo(function () {\n if (manualGlobalFilter || typeof globalFilterValue === 'undefined') {\n return [rows, flatRows, rowsById];\n }\n\n var filteredFlatRows = [];\n var filteredRowsById = {};\n var filterMethod = getFilterMethod(globalFilter, userFilterTypes || {}, filterTypes);\n\n if (!filterMethod) {\n console.warn(\"Could not find a valid 'globalFilter' option.\");\n return rows;\n }\n\n allColumns.forEach(function (column) {\n var columnDisableGlobalFilter = column.disableGlobalFilter;\n column.canFilter = getFirstDefined(columnDisableGlobalFilter === true ? false : undefined, disableGlobalFilter === true ? false : undefined, true);\n });\n var filterableColumns = allColumns.filter(function (c) {\n return c.canFilter === true;\n }); // Filters top level and nested rows\n\n var filterRows = function filterRows(filteredRows) {\n filteredRows = filterMethod(filteredRows, filterableColumns.map(function (d) {\n return d.id;\n }), globalFilterValue);\n filteredRows.forEach(function (row) {\n filteredFlatRows.push(row);\n filteredRowsById[row.id] = row;\n row.subRows = row.subRows && row.subRows.length ? filterRows(row.subRows) : row.subRows;\n });\n return filteredRows;\n };\n\n return [filterRows(rows), filteredFlatRows, filteredRowsById];\n }, [manualGlobalFilter, globalFilterValue, globalFilter, userFilterTypes, allColumns, rows, flatRows, rowsById, disableGlobalFilter]),\n globalFilteredRows = _React$useMemo[0],\n globalFilteredFlatRows = _React$useMemo[1],\n globalFilteredRowsById = _React$useMemo[2];\n\n var getAutoResetGlobalFilter = useGetLatest(autoResetGlobalFilter);\n useMountedLayoutEffect(function () {\n if (getAutoResetGlobalFilter()) {\n dispatch({\n type: actions.resetGlobalFilter\n });\n }\n }, [dispatch, manualGlobalFilter ? null : data]);\n Object.assign(instance, {\n preGlobalFilteredRows: rows,\n preGlobalFilteredFlatRows: flatRows,\n preGlobalFilteredRowsById: rowsById,\n globalFilteredRows: globalFilteredRows,\n globalFilteredFlatRows: globalFilteredFlatRows,\n globalFilteredRowsById: globalFilteredRowsById,\n rows: globalFilteredRows,\n flatRows: globalFilteredFlatRows,\n rowsById: globalFilteredRowsById,\n setGlobalFilter: setGlobalFilter,\n disableGlobalFilter: disableGlobalFilter\n });\n }\n\n function sum(values, aggregatedValues) {\n // It's faster to just add the aggregations together instead of\n // process leaf nodes individually\n return aggregatedValues.reduce(function (sum, next) {\n return sum + (typeof next === 'number' ? next : 0);\n }, 0);\n }\n function min(values) {\n var min = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n min = Math.min(min, value);\n }\n });\n return min;\n }\n function max(values) {\n var max = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n max = Math.max(max, value);\n }\n });\n return max;\n }\n function minMax(values) {\n var min = values[0] || 0;\n var max = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n });\n return min + \"..\" + max;\n }\n function average(values) {\n return sum(null, values) / values.length;\n }\n function median(values) {\n if (!values.length) {\n return null;\n }\n\n var mid = Math.floor(values.length / 2);\n var nums = [].concat(values).sort(function (a, b) {\n return a - b;\n });\n return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n }\n function unique(values) {\n return Array.from(new Set(values).values());\n }\n function uniqueCount(values) {\n return new Set(values).size;\n }\n function count(values) {\n return values.length;\n }\n\n var aggregations = /*#__PURE__*/Object.freeze({\n __proto__: null,\n sum: sum,\n min: min,\n max: max,\n minMax: minMax,\n average: average,\n median: median,\n unique: unique,\n uniqueCount: uniqueCount,\n count: count\n });\n\n var emptyArray = [];\n var emptyObject = {}; // Actions\n\n actions.resetGroupBy = 'resetGroupBy';\n actions.setGroupBy = 'setGroupBy';\n actions.toggleGroupBy = 'toggleGroupBy';\n var useGroupBy = function useGroupBy(hooks) {\n hooks.getGroupByToggleProps = [defaultGetGroupByToggleProps];\n hooks.stateReducers.push(reducer$4);\n hooks.visibleColumnsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.groupBy]);\n });\n hooks.visibleColumns.push(visibleColumns);\n hooks.useInstance.push(useInstance$4);\n hooks.prepareRow.push(prepareRow$1);\n };\n useGroupBy.pluginName = 'useGroupBy';\n\n var defaultGetGroupByToggleProps = function defaultGetGroupByToggleProps(props, _ref2) {\n var header = _ref2.header;\n return [props, {\n onClick: header.canGroupBy ? function (e) {\n e.persist();\n header.toggleGroupBy();\n } : undefined,\n style: {\n cursor: header.canGroupBy ? 'pointer' : undefined\n },\n title: 'Toggle GroupBy'\n }];\n }; // Reducer\n\n\n function reducer$4(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n groupBy: []\n }, state);\n }\n\n if (action.type === actions.resetGroupBy) {\n return _extends({}, state, {\n groupBy: instance.initialState.groupBy || []\n });\n }\n\n if (action.type === actions.setGroupBy) {\n var value = action.value;\n return _extends({}, state, {\n groupBy: value\n });\n }\n\n if (action.type === actions.toggleGroupBy) {\n var columnId = action.columnId,\n setGroupBy = action.value;\n var resolvedGroupBy = typeof setGroupBy !== 'undefined' ? setGroupBy : !state.groupBy.includes(columnId);\n\n if (resolvedGroupBy) {\n return _extends({}, state, {\n groupBy: [].concat(state.groupBy, [columnId])\n });\n }\n\n return _extends({}, state, {\n groupBy: state.groupBy.filter(function (d) {\n return d !== columnId;\n })\n });\n }\n }\n\n function visibleColumns(columns, _ref3) {\n var groupBy = _ref3.instance.state.groupBy;\n // Sort grouped columns to the start of the column list\n // before the headers are built\n var groupByColumns = groupBy.map(function (g) {\n return columns.find(function (col) {\n return col.id === g;\n });\n }).filter(Boolean);\n var nonGroupByColumns = columns.filter(function (col) {\n return !groupBy.includes(col.id);\n });\n columns = [].concat(groupByColumns, nonGroupByColumns);\n columns.forEach(function (column) {\n column.isGrouped = groupBy.includes(column.id);\n column.groupedIndex = groupBy.indexOf(column.id);\n });\n return columns;\n }\n\n var defaultUserAggregations = {};\n\n function useInstance$4(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n flatHeaders = instance.flatHeaders,\n _instance$groupByFn = instance.groupByFn,\n groupByFn = _instance$groupByFn === void 0 ? defaultGroupByFn : _instance$groupByFn,\n manualGroupBy = instance.manualGroupBy,\n _instance$aggregation = instance.aggregations,\n userAggregations = _instance$aggregation === void 0 ? defaultUserAggregations : _instance$aggregation,\n plugins = instance.plugins,\n groupBy = instance.state.groupBy,\n dispatch = instance.dispatch,\n _instance$autoResetGr = instance.autoResetGroupBy,\n autoResetGroupBy = _instance$autoResetGr === void 0 ? true : _instance$autoResetGr,\n disableGroupBy = instance.disableGroupBy,\n defaultCanGroupBy = instance.defaultCanGroupBy,\n getHooks = instance.getHooks;\n ensurePluginOrder(plugins, ['useColumnOrder', 'useFilters'], 'useGroupBy');\n var getInstance = useGetLatest(instance);\n allColumns.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnGroupBy = column.defaultGroupBy,\n columnDisableGroupBy = column.disableGroupBy;\n column.canGroupBy = accessor ? getFirstDefined(column.canGroupBy, columnDisableGroupBy === true ? false : undefined, disableGroupBy === true ? false : undefined, true) : getFirstDefined(column.canGroupBy, defaultColumnGroupBy, defaultCanGroupBy, false);\n\n if (column.canGroupBy) {\n column.toggleGroupBy = function () {\n return instance.toggleGroupBy(column.id);\n };\n }\n\n column.Aggregated = column.Aggregated || column.Cell;\n });\n var toggleGroupBy = React.useCallback(function (columnId, value) {\n dispatch({\n type: actions.toggleGroupBy,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var setGroupBy = React.useCallback(function (value) {\n dispatch({\n type: actions.setGroupBy,\n value: value\n });\n }, [dispatch]);\n flatHeaders.forEach(function (header) {\n header.getGroupByToggleProps = makePropGetter(getHooks().getGroupByToggleProps, {\n instance: getInstance(),\n header: header\n });\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualGroupBy || !groupBy.length) {\n return [rows, flatRows, rowsById, emptyArray, emptyObject, flatRows, rowsById];\n } // Ensure that the list of filtered columns exist\n\n\n var existingGroupBy = groupBy.filter(function (g) {\n return allColumns.find(function (col) {\n return col.id === g;\n });\n }); // Find the columns that can or are aggregating\n // Uses each column to aggregate rows into a single value\n\n var aggregateRowsToValues = function aggregateRowsToValues(leafRows, groupedRows, depth) {\n var values = {};\n allColumns.forEach(function (column) {\n // Don't aggregate columns that are in the groupBy\n if (existingGroupBy.includes(column.id)) {\n values[column.id] = groupedRows[0] ? groupedRows[0].values[column.id] : null;\n return;\n } // Aggregate the values\n\n\n var aggregateFn = typeof column.aggregate === 'function' ? column.aggregate : userAggregations[column.aggregate] || aggregations[column.aggregate];\n\n if (aggregateFn) {\n // Get the columnValues to aggregate\n var groupedValues = groupedRows.map(function (row) {\n return row.values[column.id];\n }); // Get the columnValues to aggregate\n\n var leafValues = leafRows.map(function (row) {\n var columnValue = row.values[column.id];\n\n if (!depth && column.aggregateValue) {\n var aggregateValueFn = typeof column.aggregateValue === 'function' ? column.aggregateValue : userAggregations[column.aggregateValue] || aggregations[column.aggregateValue];\n\n if (!aggregateValueFn) {\n console.info({\n column: column\n });\n throw new Error(\"React Table: Invalid column.aggregateValue option for column listed above\");\n }\n\n columnValue = aggregateValueFn(columnValue, row, column);\n }\n\n return columnValue;\n });\n values[column.id] = aggregateFn(leafValues, groupedValues);\n } else if (column.aggregate) {\n console.info({\n column: column\n });\n throw new Error(\"React Table: Invalid column.aggregate option for column listed above\");\n } else {\n values[column.id] = null;\n }\n });\n return values;\n };\n\n var groupedFlatRows = [];\n var groupedRowsById = {};\n var onlyGroupedFlatRows = [];\n var onlyGroupedRowsById = {};\n var nonGroupedFlatRows = [];\n var nonGroupedRowsById = {}; // Recursively group the data\n\n var groupUpRecursively = function groupUpRecursively(rows, depth, parentId) {\n if (depth === void 0) {\n depth = 0;\n }\n\n // This is the last level, just return the rows\n if (depth === existingGroupBy.length) {\n return rows;\n }\n\n var columnId = existingGroupBy[depth]; // Group the rows together for this level\n\n var rowGroupsMap = groupByFn(rows, columnId); // Peform aggregations for each group\n\n var aggregatedGroupedRows = Object.entries(rowGroupsMap).map(function (_ref4, index) {\n var groupByVal = _ref4[0],\n groupedRows = _ref4[1];\n var id = columnId + \":\" + groupByVal;\n id = parentId ? parentId + \">\" + id : id; // First, Recurse to group sub rows before aggregation\n\n var subRows = groupUpRecursively(groupedRows, depth + 1, id); // Flatten the leaf rows of the rows in this group\n\n var leafRows = depth ? flattenBy(groupedRows, 'leafRows') : groupedRows;\n var values = aggregateRowsToValues(leafRows, groupedRows, depth);\n var row = {\n id: id,\n isGrouped: true,\n groupByID: columnId,\n groupByVal: groupByVal,\n values: values,\n subRows: subRows,\n leafRows: leafRows,\n depth: depth,\n index: index\n };\n subRows.forEach(function (subRow) {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n\n if (subRow.isGrouped) {\n onlyGroupedFlatRows.push(subRow);\n onlyGroupedRowsById[subRow.id] = subRow;\n } else {\n nonGroupedFlatRows.push(subRow);\n nonGroupedRowsById[subRow.id] = subRow;\n }\n });\n return row;\n });\n return aggregatedGroupedRows;\n };\n\n var groupedRows = groupUpRecursively(rows);\n groupedRows.forEach(function (subRow) {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n\n if (subRow.isGrouped) {\n onlyGroupedFlatRows.push(subRow);\n onlyGroupedRowsById[subRow.id] = subRow;\n } else {\n nonGroupedFlatRows.push(subRow);\n nonGroupedRowsById[subRow.id] = subRow;\n }\n }); // Assign the new data\n\n return [groupedRows, groupedFlatRows, groupedRowsById, onlyGroupedFlatRows, onlyGroupedRowsById, nonGroupedFlatRows, nonGroupedRowsById];\n }, [manualGroupBy, groupBy, rows, flatRows, rowsById, allColumns, userAggregations, groupByFn]),\n groupedRows = _React$useMemo[0],\n groupedFlatRows = _React$useMemo[1],\n groupedRowsById = _React$useMemo[2],\n onlyGroupedFlatRows = _React$useMemo[3],\n onlyGroupedRowsById = _React$useMemo[4],\n nonGroupedFlatRows = _React$useMemo[5],\n nonGroupedRowsById = _React$useMemo[6];\n\n var getAutoResetGroupBy = useGetLatest(autoResetGroupBy);\n useMountedLayoutEffect(function () {\n if (getAutoResetGroupBy()) {\n dispatch({\n type: actions.resetGroupBy\n });\n }\n }, [dispatch, manualGroupBy ? null : data]);\n Object.assign(instance, {\n preGroupedRows: rows,\n preGroupedFlatRow: flatRows,\n preGroupedRowsById: rowsById,\n groupedRows: groupedRows,\n groupedFlatRows: groupedFlatRows,\n groupedRowsById: groupedRowsById,\n onlyGroupedFlatRows: onlyGroupedFlatRows,\n onlyGroupedRowsById: onlyGroupedRowsById,\n nonGroupedFlatRows: nonGroupedFlatRows,\n nonGroupedRowsById: nonGroupedRowsById,\n rows: groupedRows,\n flatRows: groupedFlatRows,\n rowsById: groupedRowsById,\n toggleGroupBy: toggleGroupBy,\n setGroupBy: setGroupBy\n });\n }\n\n function prepareRow$1(row) {\n row.allCells.forEach(function (cell) {\n var _row$subRows;\n\n // Grouped cells are in the groupBy and the pivot cell for the row\n cell.isGrouped = cell.column.isGrouped && cell.column.id === row.groupByID; // Placeholder cells are any columns in the groupBy that are not grouped\n\n cell.isPlaceholder = !cell.isGrouped && cell.column.isGrouped; // Aggregated cells are not grouped, not repeated, but still have subRows\n\n cell.isAggregated = !cell.isGrouped && !cell.isPlaceholder && ((_row$subRows = row.subRows) == null ? void 0 : _row$subRows.length);\n });\n }\n\n function defaultGroupByFn(rows, columnId) {\n return rows.reduce(function (prev, row, i) {\n // TODO: Might want to implement a key serializer here so\n // irregular column values can still be grouped if needed?\n var resKey = \"\" + row.values[columnId];\n prev[resKey] = Array.isArray(prev[resKey]) ? prev[resKey] : [];\n prev[resKey].push(row);\n return prev;\n }, {});\n }\n\n var reSplitAlphaNumeric = /([0-9]+)/gm; // Mixed sorting is slow, but very inclusive of many edge cases.\n // It handles numbers, mixed alphanumeric combinations, and even\n // null, undefined, and Infinity\n\n var alphanumeric = function alphanumeric(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId); // Force to strings (or \"\" for unsupported types)\n\n a = toString(a);\n b = toString(b); // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n\n a = a.split(reSplitAlphaNumeric).filter(Boolean);\n b = b.split(reSplitAlphaNumeric).filter(Boolean); // While\n\n while (a.length && b.length) {\n var aa = a.shift();\n var bb = b.shift();\n var an = parseInt(aa, 10);\n var bn = parseInt(bb, 10);\n var combo = [an, bn].sort(); // Both are string\n\n if (isNaN(combo[0])) {\n if (aa > bb) {\n return 1;\n }\n\n if (bb > aa) {\n return -1;\n }\n\n continue;\n } // One is a string, one is a number\n\n\n if (isNaN(combo[1])) {\n return isNaN(an) ? -1 : 1;\n } // Both are numbers\n\n\n if (an > bn) {\n return 1;\n }\n\n if (bn > an) {\n return -1;\n }\n }\n\n return a.length - b.length;\n };\n function datetime(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId);\n a = a.getTime();\n b = b.getTime();\n return compareBasic(a, b);\n }\n function basic(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId);\n return compareBasic(a, b);\n } // Utils\n\n function compareBasic(a, b) {\n return a === b ? 0 : a > b ? 1 : -1;\n }\n\n function getRowValueByColumnID(row, columnId) {\n return row.values[columnId];\n }\n\n function toString(a) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return '';\n }\n\n return String(a);\n }\n\n if (typeof a === 'string') {\n return a;\n }\n\n return '';\n }\n\n var sortTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n alphanumeric: alphanumeric,\n datetime: datetime,\n basic: basic\n });\n\n actions.resetSortBy = 'resetSortBy';\n actions.setSortBy = 'setSortBy';\n actions.toggleSortBy = 'toggleSortBy';\n actions.clearSortBy = 'clearSortBy';\n defaultColumn.sortType = 'alphanumeric';\n defaultColumn.sortDescFirst = false;\n var useSortBy = function useSortBy(hooks) {\n hooks.getSortByToggleProps = [defaultGetSortByToggleProps];\n hooks.stateReducers.push(reducer$5);\n hooks.useInstance.push(useInstance$5);\n };\n useSortBy.pluginName = 'useSortBy';\n\n var defaultGetSortByToggleProps = function defaultGetSortByToggleProps(props, _ref) {\n var instance = _ref.instance,\n column = _ref.column;\n var _instance$isMultiSort = instance.isMultiSortEvent,\n isMultiSortEvent = _instance$isMultiSort === void 0 ? function (e) {\n return e.shiftKey;\n } : _instance$isMultiSort;\n return [props, {\n onClick: column.canSort ? function (e) {\n e.persist();\n column.toggleSortBy(undefined, !instance.disableMultiSort && isMultiSortEvent(e));\n } : undefined,\n style: {\n cursor: column.canSort ? 'pointer' : undefined\n },\n title: column.canSort ? 'Toggle SortBy' : undefined\n }];\n }; // Reducer\n\n\n function reducer$5(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n sortBy: []\n }, state);\n }\n\n if (action.type === actions.resetSortBy) {\n return _extends({}, state, {\n sortBy: instance.initialState.sortBy || []\n });\n }\n\n if (action.type === actions.clearSortBy) {\n var sortBy = state.sortBy;\n var newSortBy = sortBy.filter(function (d) {\n return d.id !== action.columnId;\n });\n return _extends({}, state, {\n sortBy: newSortBy\n });\n }\n\n if (action.type === actions.setSortBy) {\n var _sortBy = action.sortBy;\n return _extends({}, state, {\n sortBy: _sortBy\n });\n }\n\n if (action.type === actions.toggleSortBy) {\n var columnId = action.columnId,\n desc = action.desc,\n multi = action.multi;\n var allColumns = instance.allColumns,\n disableMultiSort = instance.disableMultiSort,\n disableSortRemove = instance.disableSortRemove,\n disableMultiRemove = instance.disableMultiRemove,\n _instance$maxMultiSor = instance.maxMultiSortColCount,\n maxMultiSortColCount = _instance$maxMultiSor === void 0 ? Number.MAX_SAFE_INTEGER : _instance$maxMultiSor;\n var _sortBy2 = state.sortBy; // Find the column for this columnId\n\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n var sortDescFirst = column.sortDescFirst; // Find any existing sortBy for this column\n\n var existingSortBy = _sortBy2.find(function (d) {\n return d.id === columnId;\n });\n\n var existingIndex = _sortBy2.findIndex(function (d) {\n return d.id === columnId;\n });\n\n var hasDescDefined = typeof desc !== 'undefined' && desc !== null;\n var _newSortBy = []; // What should we do with this sort action?\n\n var sortAction;\n\n if (!disableMultiSort && multi) {\n if (existingSortBy) {\n sortAction = 'toggle';\n } else {\n sortAction = 'add';\n }\n } else {\n // Normal mode\n if (existingIndex !== _sortBy2.length - 1 || _sortBy2.length !== 1) {\n sortAction = 'replace';\n } else if (existingSortBy) {\n sortAction = 'toggle';\n } else {\n sortAction = 'replace';\n }\n } // Handle toggle states that will remove the sortBy\n\n\n if (sortAction === 'toggle' && // Must be toggling\n !disableSortRemove && // If disableSortRemove, disable in general\n !hasDescDefined && ( // Must not be setting desc\n multi ? !disableMultiRemove : true) && ( // If multi, don't allow if disableMultiRemove\n existingSortBy && // Finally, detect if it should indeed be removed\n existingSortBy.desc && !sortDescFirst || !existingSortBy.desc && sortDescFirst)) {\n sortAction = 'remove';\n }\n\n if (sortAction === 'replace') {\n _newSortBy = [{\n id: columnId,\n desc: hasDescDefined ? desc : sortDescFirst\n }];\n } else if (sortAction === 'add') {\n _newSortBy = [].concat(_sortBy2, [{\n id: columnId,\n desc: hasDescDefined ? desc : sortDescFirst\n }]); // Take latest n columns\n\n _newSortBy.splice(0, _newSortBy.length - maxMultiSortColCount);\n } else if (sortAction === 'toggle') {\n // This flips (or sets) the\n _newSortBy = _sortBy2.map(function (d) {\n if (d.id === columnId) {\n return _extends({}, d, {\n desc: hasDescDefined ? desc : !existingSortBy.desc\n });\n }\n\n return d;\n });\n } else if (sortAction === 'remove') {\n _newSortBy = _sortBy2.filter(function (d) {\n return d.id !== columnId;\n });\n }\n\n return _extends({}, state, {\n sortBy: _newSortBy\n });\n }\n }\n\n function useInstance$5(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n allColumns = instance.allColumns,\n _instance$orderByFn = instance.orderByFn,\n orderByFn = _instance$orderByFn === void 0 ? defaultOrderByFn : _instance$orderByFn,\n userSortTypes = instance.sortTypes,\n manualSortBy = instance.manualSortBy,\n defaultCanSort = instance.defaultCanSort,\n disableSortBy = instance.disableSortBy,\n flatHeaders = instance.flatHeaders,\n sortBy = instance.state.sortBy,\n dispatch = instance.dispatch,\n plugins = instance.plugins,\n getHooks = instance.getHooks,\n _instance$autoResetSo = instance.autoResetSortBy,\n autoResetSortBy = _instance$autoResetSo === void 0 ? true : _instance$autoResetSo;\n ensurePluginOrder(plugins, ['useFilters', 'useGlobalFilter', 'useGroupBy', 'usePivotColumns'], 'useSortBy');\n var setSortBy = React.useCallback(function (sortBy) {\n dispatch({\n type: actions.setSortBy,\n sortBy: sortBy\n });\n }, [dispatch]); // Updates sorting based on a columnId, desc flag and multi flag\n\n var toggleSortBy = React.useCallback(function (columnId, desc, multi) {\n dispatch({\n type: actions.toggleSortBy,\n columnId: columnId,\n desc: desc,\n multi: multi\n });\n }, [dispatch]); // use reference to avoid memory leak in #1608\n\n var getInstance = useGetLatest(instance); // Add the getSortByToggleProps method to columns and headers\n\n flatHeaders.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnCanSort = column.canSort,\n columnDisableSortBy = column.disableSortBy,\n id = column.id;\n var canSort = accessor ? getFirstDefined(columnDisableSortBy === true ? false : undefined, disableSortBy === true ? false : undefined, true) : getFirstDefined(defaultCanSort, defaultColumnCanSort, false);\n column.canSort = canSort;\n\n if (column.canSort) {\n column.toggleSortBy = function (desc, multi) {\n return toggleSortBy(column.id, desc, multi);\n };\n\n column.clearSortBy = function () {\n dispatch({\n type: actions.clearSortBy,\n columnId: column.id\n });\n };\n }\n\n column.getSortByToggleProps = makePropGetter(getHooks().getSortByToggleProps, {\n instance: getInstance(),\n column: column\n });\n var columnSort = sortBy.find(function (d) {\n return d.id === id;\n });\n column.isSorted = !!columnSort;\n column.sortedIndex = sortBy.findIndex(function (d) {\n return d.id === id;\n });\n column.isSortedDesc = column.isSorted ? columnSort.desc : undefined;\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualSortBy || !sortBy.length) {\n return [rows, flatRows];\n }\n\n var sortedFlatRows = []; // Filter out sortBys that correspond to non existing columns\n\n var availableSortBy = sortBy.filter(function (sort) {\n return allColumns.find(function (col) {\n return col.id === sort.id;\n });\n });\n\n var sortData = function sortData(rows) {\n // Use the orderByFn to compose multiple sortBy's together.\n // This will also perform a stable sorting using the row index\n // if needed.\n var sortedData = orderByFn(rows, availableSortBy.map(function (sort) {\n // Support custom sorting methods for each column\n var column = allColumns.find(function (d) {\n return d.id === sort.id;\n });\n\n if (!column) {\n throw new Error(\"React-Table: Could not find a column with id: \" + sort.id + \" while sorting\");\n }\n\n var sortType = column.sortType; // Look up sortBy functions in this order:\n // column function\n // column string lookup on user sortType\n // column string lookup on built-in sortType\n // default function\n // default string lookup on user sortType\n // default string lookup on built-in sortType\n\n var sortMethod = isFunction(sortType) || (userSortTypes || {})[sortType] || sortTypes[sortType];\n\n if (!sortMethod) {\n throw new Error(\"React-Table: Could not find a valid sortType of '\" + sortType + \"' for column '\" + sort.id + \"'.\");\n } // Return the correct sortFn.\n // This function should always return in ascending order\n\n\n return function (a, b) {\n return sortMethod(a, b, sort.id, sort.desc);\n };\n }), // Map the directions\n availableSortBy.map(function (sort) {\n // Detect and use the sortInverted option\n var column = allColumns.find(function (d) {\n return d.id === sort.id;\n });\n\n if (column && column.sortInverted) {\n return sort.desc;\n }\n\n return !sort.desc;\n })); // If there are sub-rows, sort them\n\n sortedData.forEach(function (row) {\n sortedFlatRows.push(row);\n\n if (!row.subRows || row.subRows.length === 0) {\n return;\n }\n\n row.subRows = sortData(row.subRows);\n });\n return sortedData;\n };\n\n return [sortData(rows), sortedFlatRows];\n }, [manualSortBy, sortBy, rows, flatRows, allColumns, orderByFn, userSortTypes]),\n sortedRows = _React$useMemo[0],\n sortedFlatRows = _React$useMemo[1];\n\n var getAutoResetSortBy = useGetLatest(autoResetSortBy);\n useMountedLayoutEffect(function () {\n if (getAutoResetSortBy()) {\n dispatch({\n type: actions.resetSortBy\n });\n }\n }, [manualSortBy ? null : data]);\n Object.assign(instance, {\n preSortedRows: rows,\n preSortedFlatRows: flatRows,\n sortedRows: sortedRows,\n sortedFlatRows: sortedFlatRows,\n rows: sortedRows,\n flatRows: sortedFlatRows,\n setSortBy: setSortBy,\n toggleSortBy: toggleSortBy\n });\n }\n\n function defaultOrderByFn(arr, funcs, dirs) {\n return [].concat(arr).sort(function (rowA, rowB) {\n for (var i = 0; i < funcs.length; i += 1) {\n var sortFn = funcs[i];\n var desc = dirs[i] === false || dirs[i] === 'desc';\n var sortInt = sortFn(rowA, rowB);\n\n if (sortInt !== 0) {\n return desc ? -sortInt : sortInt;\n }\n }\n\n return dirs[0] ? rowA.index - rowB.index : rowB.index - rowA.index;\n });\n }\n\n var pluginName = 'usePagination'; // Actions\n\n actions.resetPage = 'resetPage';\n actions.gotoPage = 'gotoPage';\n actions.setPageSize = 'setPageSize';\n var usePagination = function usePagination(hooks) {\n hooks.stateReducers.push(reducer$6);\n hooks.useInstance.push(useInstance$6);\n };\n usePagination.pluginName = pluginName;\n\n function reducer$6(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n pageSize: 10,\n pageIndex: 0\n }, state);\n }\n\n if (action.type === actions.resetPage) {\n return _extends({}, state, {\n pageIndex: instance.initialState.pageIndex || 0\n });\n }\n\n if (action.type === actions.gotoPage) {\n var pageCount = instance.pageCount,\n page = instance.page;\n var newPageIndex = functionalUpdate(action.pageIndex, state.pageIndex);\n var canNavigate = false;\n\n if (newPageIndex > state.pageIndex) {\n // next page\n canNavigate = pageCount === -1 ? page.length >= state.pageSize : newPageIndex < pageCount;\n } else if (newPageIndex < state.pageIndex) {\n // prev page\n canNavigate = newPageIndex > -1;\n }\n\n if (!canNavigate) {\n return state;\n }\n\n return _extends({}, state, {\n pageIndex: newPageIndex\n });\n }\n\n if (action.type === actions.setPageSize) {\n var pageSize = action.pageSize;\n var topRowIndex = state.pageSize * state.pageIndex;\n var pageIndex = Math.floor(topRowIndex / pageSize);\n return _extends({}, state, {\n pageIndex: pageIndex,\n pageSize: pageSize\n });\n }\n }\n\n function useInstance$6(instance) {\n var rows = instance.rows,\n _instance$autoResetPa = instance.autoResetPage,\n autoResetPage = _instance$autoResetPa === void 0 ? true : _instance$autoResetPa,\n _instance$manualExpan = instance.manualExpandedKey,\n manualExpandedKey = _instance$manualExpan === void 0 ? 'expanded' : _instance$manualExpan,\n plugins = instance.plugins,\n userPageCount = instance.pageCount,\n _instance$paginateExp = instance.paginateExpandedRows,\n paginateExpandedRows = _instance$paginateExp === void 0 ? true : _instance$paginateExp,\n _instance$expandSubRo = instance.expandSubRows,\n expandSubRows = _instance$expandSubRo === void 0 ? true : _instance$expandSubRo,\n _instance$state = instance.state,\n pageSize = _instance$state.pageSize,\n pageIndex = _instance$state.pageIndex,\n expanded = _instance$state.expanded,\n globalFilter = _instance$state.globalFilter,\n filters = _instance$state.filters,\n groupBy = _instance$state.groupBy,\n sortBy = _instance$state.sortBy,\n dispatch = instance.dispatch,\n data = instance.data,\n manualPagination = instance.manualPagination;\n ensurePluginOrder(plugins, ['useGlobalFilter', 'useFilters', 'useGroupBy', 'useSortBy', 'useExpanded'], 'usePagination');\n var getAutoResetPage = useGetLatest(autoResetPage);\n useMountedLayoutEffect(function () {\n if (getAutoResetPage()) {\n dispatch({\n type: actions.resetPage\n });\n }\n }, [dispatch, manualPagination ? null : data, globalFilter, filters, groupBy, sortBy]);\n var pageCount = manualPagination ? userPageCount : Math.ceil(rows.length / pageSize);\n var pageOptions = React.useMemo(function () {\n return pageCount > 0 ? [].concat(new Array(pageCount)).fill(null).map(function (d, i) {\n return i;\n }) : [];\n }, [pageCount]);\n var page = React.useMemo(function () {\n var page;\n\n if (manualPagination) {\n page = rows;\n } else {\n var pageStart = pageSize * pageIndex;\n var pageEnd = pageStart + pageSize;\n page = rows.slice(pageStart, pageEnd);\n }\n\n if (paginateExpandedRows) {\n return page;\n }\n\n return expandRows(page, {\n manualExpandedKey: manualExpandedKey,\n expanded: expanded,\n expandSubRows: expandSubRows\n });\n }, [expandSubRows, expanded, manualExpandedKey, manualPagination, pageIndex, pageSize, paginateExpandedRows, rows]);\n var canPreviousPage = pageIndex > 0;\n var canNextPage = pageCount === -1 ? page.length >= pageSize : pageIndex < pageCount - 1;\n var gotoPage = React.useCallback(function (pageIndex) {\n dispatch({\n type: actions.gotoPage,\n pageIndex: pageIndex\n });\n }, [dispatch]);\n var previousPage = React.useCallback(function () {\n return gotoPage(function (old) {\n return old - 1;\n });\n }, [gotoPage]);\n var nextPage = React.useCallback(function () {\n return gotoPage(function (old) {\n return old + 1;\n });\n }, [gotoPage]);\n var setPageSize = React.useCallback(function (pageSize) {\n dispatch({\n type: actions.setPageSize,\n pageSize: pageSize\n });\n }, [dispatch]);\n Object.assign(instance, {\n pageOptions: pageOptions,\n pageCount: pageCount,\n page: page,\n canPreviousPage: canPreviousPage,\n canNextPage: canNextPage,\n gotoPage: gotoPage,\n previousPage: previousPage,\n nextPage: nextPage,\n setPageSize: setPageSize\n });\n }\n\n actions.resetPivot = 'resetPivot';\n actions.togglePivot = 'togglePivot';\n var _UNSTABLE_usePivotColumns = function _UNSTABLE_usePivotColumns(hooks) {\n hooks.getPivotToggleProps = [defaultGetPivotToggleProps];\n hooks.stateReducers.push(reducer$7);\n hooks.useInstanceAfterData.push(useInstanceAfterData);\n hooks.allColumns.push(allColumns);\n hooks.accessValue.push(accessValue);\n hooks.materializedColumns.push(materializedColumns);\n hooks.materializedColumnsDeps.push(materializedColumnsDeps);\n hooks.visibleColumns.push(visibleColumns$1);\n hooks.visibleColumnsDeps.push(visibleColumnsDeps);\n hooks.useInstance.push(useInstance$7);\n hooks.prepareRow.push(prepareRow$2);\n };\n _UNSTABLE_usePivotColumns.pluginName = 'usePivotColumns';\n var defaultPivotColumns = [];\n\n var defaultGetPivotToggleProps = function defaultGetPivotToggleProps(props, _ref) {\n var header = _ref.header;\n return [props, {\n onClick: header.canPivot ? function (e) {\n e.persist();\n header.togglePivot();\n } : undefined,\n style: {\n cursor: header.canPivot ? 'pointer' : undefined\n },\n title: 'Toggle Pivot'\n }];\n }; // Reducer\n\n\n function reducer$7(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n pivotColumns: defaultPivotColumns\n }, state);\n }\n\n if (action.type === actions.resetPivot) {\n return _extends({}, state, {\n pivotColumns: instance.initialState.pivotColumns || defaultPivotColumns\n });\n }\n\n if (action.type === actions.togglePivot) {\n var columnId = action.columnId,\n setPivot = action.value;\n var resolvedPivot = typeof setPivot !== 'undefined' ? setPivot : !state.pivotColumns.includes(columnId);\n\n if (resolvedPivot) {\n return _extends({}, state, {\n pivotColumns: [].concat(state.pivotColumns, [columnId])\n });\n }\n\n return _extends({}, state, {\n pivotColumns: state.pivotColumns.filter(function (d) {\n return d !== columnId;\n })\n });\n }\n }\n\n function useInstanceAfterData(instance) {\n instance.allColumns.forEach(function (column) {\n column.isPivotSource = instance.state.pivotColumns.includes(column.id);\n });\n }\n\n function allColumns(columns, _ref2) {\n var instance = _ref2.instance;\n columns.forEach(function (column) {\n column.isPivotSource = instance.state.pivotColumns.includes(column.id);\n column.uniqueValues = new Set();\n });\n return columns;\n }\n\n function accessValue(value, _ref3) {\n var column = _ref3.column;\n\n if (column.uniqueValues && typeof value !== 'undefined') {\n column.uniqueValues.add(value);\n }\n\n return value;\n }\n\n function materializedColumns(materialized, _ref4) {\n var instance = _ref4.instance;\n var allColumns = instance.allColumns,\n state = instance.state;\n\n if (!state.pivotColumns.length || !state.groupBy || !state.groupBy.length) {\n return materialized;\n }\n\n var pivotColumns = state.pivotColumns.map(function (id) {\n return allColumns.find(function (d) {\n return d.id === id;\n });\n }).filter(Boolean);\n var sourceColumns = allColumns.filter(function (d) {\n return !d.isPivotSource && !state.groupBy.includes(d.id) && !state.pivotColumns.includes(d.id);\n });\n\n var buildPivotColumns = function buildPivotColumns(depth, parent, pivotFilters) {\n if (depth === void 0) {\n depth = 0;\n }\n\n if (pivotFilters === void 0) {\n pivotFilters = [];\n }\n\n var pivotColumn = pivotColumns[depth];\n\n if (!pivotColumn) {\n return sourceColumns.map(function (sourceColumn) {\n // TODO: We could offer support here for renesting pivoted\n // columns inside copies of their header groups. For now,\n // that seems like it would be (1) overkill on nesting, considering\n // you already get nesting for every pivot level and (2)\n // really hard. :)\n return _extends({}, sourceColumn, {\n canPivot: false,\n isPivoted: true,\n parent: parent,\n depth: depth,\n id: \"\" + (parent ? parent.id + \".\" + sourceColumn.id : sourceColumn.id),\n accessor: function accessor(originalRow, i, row) {\n if (pivotFilters.every(function (filter) {\n return filter(row);\n })) {\n return row.values[sourceColumn.id];\n }\n }\n });\n });\n }\n\n var uniqueValues = Array.from(pivotColumn.uniqueValues).sort();\n return uniqueValues.map(function (uniqueValue) {\n var columnGroup = _extends({}, pivotColumn, {\n Header: pivotColumn.PivotHeader || typeof pivotColumn.header === 'string' ? pivotColumn.Header + \": \" + uniqueValue : uniqueValue,\n isPivotGroup: true,\n parent: parent,\n depth: depth,\n id: parent ? parent.id + \".\" + pivotColumn.id + \".\" + uniqueValue : pivotColumn.id + \".\" + uniqueValue,\n pivotValue: uniqueValue\n });\n\n columnGroup.columns = buildPivotColumns(depth + 1, columnGroup, [].concat(pivotFilters, [function (row) {\n return row.values[pivotColumn.id] === uniqueValue;\n }]));\n return columnGroup;\n });\n };\n\n var newMaterialized = flattenColumns(buildPivotColumns());\n return [].concat(materialized, newMaterialized);\n }\n\n function materializedColumnsDeps(deps, _ref5) {\n var _ref5$instance$state = _ref5.instance.state,\n pivotColumns = _ref5$instance$state.pivotColumns,\n groupBy = _ref5$instance$state.groupBy;\n return [].concat(deps, [pivotColumns, groupBy]);\n }\n\n function visibleColumns$1(visibleColumns, _ref6) {\n var state = _ref6.instance.state;\n visibleColumns = visibleColumns.filter(function (d) {\n return !d.isPivotSource;\n });\n\n if (state.pivotColumns.length && state.groupBy && state.groupBy.length) {\n visibleColumns = visibleColumns.filter(function (column) {\n return column.isGrouped || column.isPivoted;\n });\n }\n\n return visibleColumns;\n }\n\n function visibleColumnsDeps(deps, _ref7) {\n var instance = _ref7.instance;\n return [].concat(deps, [instance.state.pivotColumns, instance.state.groupBy]);\n }\n\n function useInstance$7(instance) {\n var columns = instance.columns,\n allColumns = instance.allColumns,\n flatHeaders = instance.flatHeaders,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n dispatch = instance.dispatch,\n _instance$autoResetPi = instance.autoResetPivot,\n autoResetPivot = _instance$autoResetPi === void 0 ? true : _instance$autoResetPi,\n manaulPivot = instance.manaulPivot,\n disablePivot = instance.disablePivot,\n defaultCanPivot = instance.defaultCanPivot;\n ensurePluginOrder(plugins, ['useGroupBy'], 'usePivotColumns');\n var getInstance = useGetLatest(instance);\n allColumns.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnPivot = column.defaultPivot,\n columnDisablePivot = column.disablePivot;\n column.canPivot = accessor ? getFirstDefined(column.canPivot, columnDisablePivot === true ? false : undefined, disablePivot === true ? false : undefined, true) : getFirstDefined(column.canPivot, defaultColumnPivot, defaultCanPivot, false);\n\n if (column.canPivot) {\n column.togglePivot = function () {\n return instance.togglePivot(column.id);\n };\n }\n\n column.Aggregated = column.Aggregated || column.Cell;\n });\n\n var togglePivot = function togglePivot(columnId, value) {\n dispatch({\n type: actions.togglePivot,\n columnId: columnId,\n value: value\n });\n };\n\n flatHeaders.forEach(function (header) {\n header.getPivotToggleProps = makePropGetter(getHooks().getPivotToggleProps, {\n instance: getInstance(),\n header: header\n });\n });\n var getAutoResetPivot = useGetLatest(autoResetPivot);\n useMountedLayoutEffect(function () {\n if (getAutoResetPivot()) {\n dispatch({\n type: actions.resetPivot\n });\n }\n }, [dispatch, manaulPivot ? null : columns]);\n Object.assign(instance, {\n togglePivot: togglePivot\n });\n }\n\n function prepareRow$2(row) {\n row.allCells.forEach(function (cell) {\n // Grouped cells are in the pivotColumns and the pivot cell for the row\n cell.isPivoted = cell.column.isPivoted;\n });\n }\n\n var pluginName$1 = 'useRowSelect'; // Actions\n\n actions.resetSelectedRows = 'resetSelectedRows';\n actions.toggleAllRowsSelected = 'toggleAllRowsSelected';\n actions.toggleRowSelected = 'toggleRowSelected';\n actions.toggleAllPageRowsSelected = 'toggleAllPageRowsSelected';\n var useRowSelect = function useRowSelect(hooks) {\n hooks.getToggleRowSelectedProps = [defaultGetToggleRowSelectedProps];\n hooks.getToggleAllRowsSelectedProps = [defaultGetToggleAllRowsSelectedProps];\n hooks.getToggleAllPageRowsSelectedProps = [defaultGetToggleAllPageRowsSelectedProps];\n hooks.stateReducers.push(reducer$8);\n hooks.useInstance.push(useInstance$8);\n hooks.prepareRow.push(prepareRow$3);\n };\n useRowSelect.pluginName = pluginName$1;\n\n var defaultGetToggleRowSelectedProps = function defaultGetToggleRowSelectedProps(props, _ref) {\n var instance = _ref.instance,\n row = _ref.row;\n var _instance$manualRowSe = instance.manualRowSelectedKey,\n manualRowSelectedKey = _instance$manualRowSe === void 0 ? 'isSelected' : _instance$manualRowSe;\n var checked = false;\n\n if (row.original && row.original[manualRowSelectedKey]) {\n checked = true;\n } else {\n checked = row.isSelected;\n }\n\n return [props, {\n onChange: function onChange(e) {\n row.toggleRowSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: checked,\n title: 'Toggle Row Selected',\n indeterminate: row.isSomeSelected\n }];\n };\n\n var defaultGetToggleAllRowsSelectedProps = function defaultGetToggleAllRowsSelectedProps(props, _ref2) {\n var instance = _ref2.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleAllRowsSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: instance.isAllRowsSelected,\n title: 'Toggle All Rows Selected',\n indeterminate: Boolean(!instance.isAllRowsSelected && Object.keys(instance.state.selectedRowIds).length)\n }];\n };\n\n var defaultGetToggleAllPageRowsSelectedProps = function defaultGetToggleAllPageRowsSelectedProps(props, _ref3) {\n var instance = _ref3.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleAllPageRowsSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: instance.isAllPageRowsSelected,\n title: 'Toggle All Current Page Rows Selected',\n indeterminate: Boolean(!instance.isAllPageRowsSelected && instance.page.some(function (_ref4) {\n var id = _ref4.id;\n return instance.state.selectedRowIds[id];\n }))\n }];\n }; // eslint-disable-next-line max-params\n\n\n function reducer$8(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n selectedRowIds: {}\n }, state);\n }\n\n if (action.type === actions.resetSelectedRows) {\n return _extends({}, state, {\n selectedRowIds: instance.initialState.selectedRowIds || {}\n });\n }\n\n if (action.type === actions.toggleAllRowsSelected) {\n var setSelected = action.value;\n var isAllRowsSelected = instance.isAllRowsSelected,\n rowsById = instance.rowsById,\n _instance$nonGroupedR = instance.nonGroupedRowsById,\n nonGroupedRowsById = _instance$nonGroupedR === void 0 ? rowsById : _instance$nonGroupedR;\n var selectAll = typeof setSelected !== 'undefined' ? setSelected : !isAllRowsSelected; // Only remove/add the rows that are visible on the screen\n // Leave all the other rows that are selected alone.\n\n var selectedRowIds = Object.assign({}, state.selectedRowIds);\n\n if (selectAll) {\n Object.keys(nonGroupedRowsById).forEach(function (rowId) {\n selectedRowIds[rowId] = true;\n });\n } else {\n Object.keys(nonGroupedRowsById).forEach(function (rowId) {\n delete selectedRowIds[rowId];\n });\n }\n\n return _extends({}, state, {\n selectedRowIds: selectedRowIds\n });\n }\n\n if (action.type === actions.toggleRowSelected) {\n var id = action.id,\n _setSelected = action.value;\n var _rowsById = instance.rowsById,\n _instance$selectSubRo = instance.selectSubRows,\n selectSubRows = _instance$selectSubRo === void 0 ? true : _instance$selectSubRo,\n getSubRows = instance.getSubRows;\n var isSelected = state.selectedRowIds[id];\n var shouldExist = typeof _setSelected !== 'undefined' ? _setSelected : !isSelected;\n\n if (isSelected === shouldExist) {\n return state;\n }\n\n var newSelectedRowIds = _extends({}, state.selectedRowIds);\n\n var handleRowById = function handleRowById(id) {\n var row = _rowsById[id];\n\n if (!row.isGrouped) {\n if (shouldExist) {\n newSelectedRowIds[id] = true;\n } else {\n delete newSelectedRowIds[id];\n }\n }\n\n if (selectSubRows && getSubRows(row)) {\n return getSubRows(row).forEach(function (row) {\n return handleRowById(row.id);\n });\n }\n };\n\n handleRowById(id);\n return _extends({}, state, {\n selectedRowIds: newSelectedRowIds\n });\n }\n\n if (action.type === actions.toggleAllPageRowsSelected) {\n var _setSelected2 = action.value;\n\n var page = instance.page,\n _rowsById2 = instance.rowsById,\n _instance$selectSubRo2 = instance.selectSubRows,\n _selectSubRows = _instance$selectSubRo2 === void 0 ? true : _instance$selectSubRo2,\n isAllPageRowsSelected = instance.isAllPageRowsSelected,\n _getSubRows = instance.getSubRows;\n\n var _selectAll = typeof _setSelected2 !== 'undefined' ? _setSelected2 : !isAllPageRowsSelected;\n\n var _newSelectedRowIds = _extends({}, state.selectedRowIds);\n\n var _handleRowById = function _handleRowById(id) {\n var row = _rowsById2[id];\n\n if (!row.isGrouped) {\n if (_selectAll) {\n _newSelectedRowIds[id] = true;\n } else {\n delete _newSelectedRowIds[id];\n }\n }\n\n if (_selectSubRows && _getSubRows(row)) {\n return _getSubRows(row).forEach(function (row) {\n return _handleRowById(row.id);\n });\n }\n };\n\n page.forEach(function (row) {\n return _handleRowById(row.id);\n });\n return _extends({}, state, {\n selectedRowIds: _newSelectedRowIds\n });\n }\n\n return state;\n }\n\n function useInstance$8(instance) {\n var data = instance.data,\n rows = instance.rows,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n rowsById = instance.rowsById,\n _instance$nonGroupedR2 = instance.nonGroupedRowsById,\n nonGroupedRowsById = _instance$nonGroupedR2 === void 0 ? rowsById : _instance$nonGroupedR2,\n _instance$autoResetSe = instance.autoResetSelectedRows,\n autoResetSelectedRows = _instance$autoResetSe === void 0 ? true : _instance$autoResetSe,\n selectedRowIds = instance.state.selectedRowIds,\n _instance$selectSubRo3 = instance.selectSubRows,\n selectSubRows = _instance$selectSubRo3 === void 0 ? true : _instance$selectSubRo3,\n dispatch = instance.dispatch,\n page = instance.page,\n getSubRows = instance.getSubRows;\n ensurePluginOrder(plugins, ['useFilters', 'useGroupBy', 'useSortBy', 'useExpanded', 'usePagination'], 'useRowSelect');\n var selectedFlatRows = React.useMemo(function () {\n var selectedFlatRows = [];\n rows.forEach(function (row) {\n var isSelected = selectSubRows ? getRowIsSelected(row, selectedRowIds, getSubRows) : !!selectedRowIds[row.id];\n row.isSelected = !!isSelected;\n row.isSomeSelected = isSelected === null;\n\n if (isSelected) {\n selectedFlatRows.push(row);\n }\n });\n return selectedFlatRows;\n }, [rows, selectSubRows, selectedRowIds, getSubRows]);\n var isAllRowsSelected = Boolean(Object.keys(nonGroupedRowsById).length && Object.keys(selectedRowIds).length);\n var isAllPageRowsSelected = isAllRowsSelected;\n\n if (isAllRowsSelected) {\n if (Object.keys(nonGroupedRowsById).some(function (id) {\n return !selectedRowIds[id];\n })) {\n isAllRowsSelected = false;\n }\n }\n\n if (!isAllRowsSelected) {\n if (page && page.length && page.some(function (_ref5) {\n var id = _ref5.id;\n return !selectedRowIds[id];\n })) {\n isAllPageRowsSelected = false;\n }\n }\n\n var getAutoResetSelectedRows = useGetLatest(autoResetSelectedRows);\n useMountedLayoutEffect(function () {\n if (getAutoResetSelectedRows()) {\n dispatch({\n type: actions.resetSelectedRows\n });\n }\n }, [dispatch, data]);\n var toggleAllRowsSelected = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllRowsSelected,\n value: value\n });\n }, [dispatch]);\n var toggleAllPageRowsSelected = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllPageRowsSelected,\n value: value\n });\n }, [dispatch]);\n var toggleRowSelected = React.useCallback(function (id, value) {\n return dispatch({\n type: actions.toggleRowSelected,\n id: id,\n value: value\n });\n }, [dispatch]);\n var getInstance = useGetLatest(instance);\n var getToggleAllRowsSelectedProps = makePropGetter(getHooks().getToggleAllRowsSelectedProps, {\n instance: getInstance()\n });\n var getToggleAllPageRowsSelectedProps = makePropGetter(getHooks().getToggleAllPageRowsSelectedProps, {\n instance: getInstance()\n });\n Object.assign(instance, {\n selectedFlatRows: selectedFlatRows,\n isAllRowsSelected: isAllRowsSelected,\n isAllPageRowsSelected: isAllPageRowsSelected,\n toggleRowSelected: toggleRowSelected,\n toggleAllRowsSelected: toggleAllRowsSelected,\n getToggleAllRowsSelectedProps: getToggleAllRowsSelectedProps,\n getToggleAllPageRowsSelectedProps: getToggleAllPageRowsSelectedProps,\n toggleAllPageRowsSelected: toggleAllPageRowsSelected\n });\n }\n\n function prepareRow$3(row, _ref6) {\n var instance = _ref6.instance;\n\n row.toggleRowSelected = function (set) {\n return instance.toggleRowSelected(row.id, set);\n };\n\n row.getToggleRowSelectedProps = makePropGetter(instance.getHooks().getToggleRowSelectedProps, {\n instance: instance,\n row: row\n });\n }\n\n function getRowIsSelected(row, selectedRowIds, getSubRows) {\n if (selectedRowIds[row.id]) {\n return true;\n }\n\n var subRows = getSubRows(row);\n\n if (subRows && subRows.length) {\n var allChildrenSelected = true;\n var someSelected = false;\n subRows.forEach(function (subRow) {\n // Bail out early if we know both of these\n if (someSelected && !allChildrenSelected) {\n return;\n }\n\n if (getRowIsSelected(subRow, selectedRowIds, getSubRows)) {\n someSelected = true;\n } else {\n allChildrenSelected = false;\n }\n });\n return allChildrenSelected ? true : someSelected ? null : false;\n }\n\n return false;\n }\n\n var defaultInitialRowStateAccessor = function defaultInitialRowStateAccessor(row) {\n return {};\n };\n\n var defaultInitialCellStateAccessor = function defaultInitialCellStateAccessor(cell) {\n return {};\n }; // Actions\n\n\n actions.setRowState = 'setRowState';\n actions.setCellState = 'setCellState';\n actions.resetRowState = 'resetRowState';\n var useRowState = function useRowState(hooks) {\n hooks.stateReducers.push(reducer$9);\n hooks.useInstance.push(useInstance$9);\n hooks.prepareRow.push(prepareRow$4);\n };\n useRowState.pluginName = 'useRowState';\n\n function reducer$9(state, action, previousState, instance) {\n var _instance$initialRowS = instance.initialRowStateAccessor,\n initialRowStateAccessor = _instance$initialRowS === void 0 ? defaultInitialRowStateAccessor : _instance$initialRowS,\n _instance$initialCell = instance.initialCellStateAccessor,\n initialCellStateAccessor = _instance$initialCell === void 0 ? defaultInitialCellStateAccessor : _instance$initialCell,\n rowsById = instance.rowsById;\n\n if (action.type === actions.init) {\n return _extends({\n rowState: {}\n }, state);\n }\n\n if (action.type === actions.resetRowState) {\n return _extends({}, state, {\n rowState: instance.initialState.rowState || {}\n });\n }\n\n if (action.type === actions.setRowState) {\n var _extends2;\n\n var rowId = action.rowId,\n value = action.value;\n var oldRowState = typeof state.rowState[rowId] !== 'undefined' ? state.rowState[rowId] : initialRowStateAccessor(rowsById[rowId]);\n return _extends({}, state, {\n rowState: _extends({}, state.rowState, (_extends2 = {}, _extends2[rowId] = functionalUpdate(value, oldRowState), _extends2))\n });\n }\n\n if (action.type === actions.setCellState) {\n var _oldRowState$cellStat, _rowsById$_rowId, _rowsById$_rowId$cell, _extends3, _extends4;\n\n var _rowId = action.rowId,\n columnId = action.columnId,\n _value = action.value;\n\n var _oldRowState = typeof state.rowState[_rowId] !== 'undefined' ? state.rowState[_rowId] : initialRowStateAccessor(rowsById[_rowId]);\n\n var oldCellState = typeof (_oldRowState == null ? void 0 : (_oldRowState$cellStat = _oldRowState.cellState) == null ? void 0 : _oldRowState$cellStat[columnId]) !== 'undefined' ? _oldRowState.cellState[columnId] : initialCellStateAccessor((_rowsById$_rowId = rowsById[_rowId]) == null ? void 0 : (_rowsById$_rowId$cell = _rowsById$_rowId.cells) == null ? void 0 : _rowsById$_rowId$cell.find(function (cell) {\n return cell.column.id === columnId;\n }));\n return _extends({}, state, {\n rowState: _extends({}, state.rowState, (_extends4 = {}, _extends4[_rowId] = _extends({}, _oldRowState, {\n cellState: _extends({}, _oldRowState.cellState || {}, (_extends3 = {}, _extends3[columnId] = functionalUpdate(_value, oldCellState), _extends3))\n }), _extends4))\n });\n }\n }\n\n function useInstance$9(instance) {\n var _instance$autoResetRo = instance.autoResetRowState,\n autoResetRowState = _instance$autoResetRo === void 0 ? true : _instance$autoResetRo,\n data = instance.data,\n dispatch = instance.dispatch;\n var setRowState = React.useCallback(function (rowId, value) {\n return dispatch({\n type: actions.setRowState,\n rowId: rowId,\n value: value\n });\n }, [dispatch]);\n var setCellState = React.useCallback(function (rowId, columnId, value) {\n return dispatch({\n type: actions.setCellState,\n rowId: rowId,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var getAutoResetRowState = useGetLatest(autoResetRowState);\n useMountedLayoutEffect(function () {\n if (getAutoResetRowState()) {\n dispatch({\n type: actions.resetRowState\n });\n }\n }, [data]);\n Object.assign(instance, {\n setRowState: setRowState,\n setCellState: setCellState\n });\n }\n\n function prepareRow$4(row, _ref) {\n var instance = _ref.instance;\n var _instance$initialRowS2 = instance.initialRowStateAccessor,\n initialRowStateAccessor = _instance$initialRowS2 === void 0 ? defaultInitialRowStateAccessor : _instance$initialRowS2,\n _instance$initialCell2 = instance.initialCellStateAccessor,\n initialCellStateAccessor = _instance$initialCell2 === void 0 ? defaultInitialCellStateAccessor : _instance$initialCell2,\n rowState = instance.state.rowState;\n\n if (row) {\n row.state = typeof rowState[row.id] !== 'undefined' ? rowState[row.id] : initialRowStateAccessor(row);\n\n row.setState = function (updater) {\n return instance.setRowState(row.id, updater);\n };\n\n row.cells.forEach(function (cell) {\n if (!row.state.cellState) {\n row.state.cellState = {};\n }\n\n cell.state = typeof row.state.cellState[cell.column.id] !== 'undefined' ? row.state.cellState[cell.column.id] : initialCellStateAccessor(cell);\n\n cell.setState = function (updater) {\n return instance.setCellState(row.id, cell.column.id, updater);\n };\n });\n }\n }\n\n actions.resetColumnOrder = 'resetColumnOrder';\n actions.setColumnOrder = 'setColumnOrder';\n var useColumnOrder = function useColumnOrder(hooks) {\n hooks.stateReducers.push(reducer$a);\n hooks.visibleColumnsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.columnOrder]);\n });\n hooks.visibleColumns.push(visibleColumns$2);\n hooks.useInstance.push(useInstance$a);\n };\n useColumnOrder.pluginName = 'useColumnOrder';\n\n function reducer$a(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n columnOrder: []\n }, state);\n }\n\n if (action.type === actions.resetColumnOrder) {\n return _extends({}, state, {\n columnOrder: instance.initialState.columnOrder || []\n });\n }\n\n if (action.type === actions.setColumnOrder) {\n return _extends({}, state, {\n columnOrder: functionalUpdate(action.columnOrder, state.columnOrder)\n });\n }\n }\n\n function visibleColumns$2(columns, _ref2) {\n var columnOrder = _ref2.instance.state.columnOrder;\n\n // If there is no order, return the normal columns\n if (!columnOrder || !columnOrder.length) {\n return columns;\n }\n\n var columnOrderCopy = [].concat(columnOrder); // If there is an order, make a copy of the columns\n\n var columnsCopy = [].concat(columns); // And make a new ordered array of the columns\n\n var columnsInOrder = []; // Loop over the columns and place them in order into the new array\n\n var _loop = function _loop() {\n var targetColumnId = columnOrderCopy.shift();\n var foundIndex = columnsCopy.findIndex(function (d) {\n return d.id === targetColumnId;\n });\n\n if (foundIndex > -1) {\n columnsInOrder.push(columnsCopy.splice(foundIndex, 1)[0]);\n }\n };\n\n while (columnsCopy.length && columnOrderCopy.length) {\n _loop();\n } // If there are any columns left, add them to the end\n\n\n return [].concat(columnsInOrder, columnsCopy);\n }\n\n function useInstance$a(instance) {\n var dispatch = instance.dispatch;\n instance.setColumnOrder = React.useCallback(function (columnOrder) {\n return dispatch({\n type: actions.setColumnOrder,\n columnOrder: columnOrder\n });\n }, [dispatch]);\n }\n\n defaultColumn.canResize = true; // Actions\n\n actions.columnStartResizing = 'columnStartResizing';\n actions.columnResizing = 'columnResizing';\n actions.columnDoneResizing = 'columnDoneResizing';\n actions.resetResize = 'resetResize';\n var useResizeColumns = function useResizeColumns(hooks) {\n hooks.getResizerProps = [defaultGetResizerProps];\n hooks.getHeaderProps.push({\n style: {\n position: 'relative'\n }\n });\n hooks.stateReducers.push(reducer$b);\n hooks.useInstance.push(useInstance$b);\n hooks.useInstanceBeforeDimensions.push(useInstanceBeforeDimensions$1);\n };\n\n var defaultGetResizerProps = function defaultGetResizerProps(props, _ref) {\n var instance = _ref.instance,\n header = _ref.header;\n var dispatch = instance.dispatch;\n\n var onResizeStart = function onResizeStart(e, header) {\n var isTouchEvent = false;\n\n if (e.type === 'touchstart') {\n // lets not respond to multiple touches (e.g. 2 or 3 fingers)\n if (e.touches && e.touches.length > 1) {\n return;\n }\n\n isTouchEvent = true;\n }\n\n var headersToResize = getLeafHeaders(header);\n var headerIdWidths = headersToResize.map(function (d) {\n return [d.id, d.totalWidth];\n });\n var clientX = isTouchEvent ? Math.round(e.touches[0].clientX) : e.clientX;\n\n var dispatchMove = function dispatchMove(clientXPos) {\n dispatch({\n type: actions.columnResizing,\n clientX: clientXPos\n });\n };\n\n var dispatchEnd = function dispatchEnd() {\n return dispatch({\n type: actions.columnDoneResizing\n });\n };\n\n var handlersAndEvents = {\n mouse: {\n moveEvent: 'mousemove',\n moveHandler: function moveHandler(e) {\n return dispatchMove(e.clientX);\n },\n upEvent: 'mouseup',\n upHandler: function upHandler(e) {\n document.removeEventListener('mousemove', handlersAndEvents.mouse.moveHandler);\n document.removeEventListener('mouseup', handlersAndEvents.mouse.upHandler);\n dispatchEnd();\n }\n },\n touch: {\n moveEvent: 'touchmove',\n moveHandler: function moveHandler(e) {\n if (e.cancelable) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n dispatchMove(e.touches[0].clientX);\n return false;\n },\n upEvent: 'touchend',\n upHandler: function upHandler(e) {\n document.removeEventListener(handlersAndEvents.touch.moveEvent, handlersAndEvents.touch.moveHandler);\n document.removeEventListener(handlersAndEvents.touch.upEvent, handlersAndEvents.touch.moveHandler);\n dispatchEnd();\n }\n }\n };\n var events = isTouchEvent ? handlersAndEvents.touch : handlersAndEvents.mouse;\n var passiveIfSupported = passiveEventSupported() ? {\n passive: false\n } : false;\n document.addEventListener(events.moveEvent, events.moveHandler, passiveIfSupported);\n document.addEventListener(events.upEvent, events.upHandler, passiveIfSupported);\n dispatch({\n type: actions.columnStartResizing,\n columnId: header.id,\n columnWidth: header.totalWidth,\n headerIdWidths: headerIdWidths,\n clientX: clientX\n });\n };\n\n return [props, {\n onMouseDown: function onMouseDown(e) {\n return e.persist() || onResizeStart(e, header);\n },\n onTouchStart: function onTouchStart(e) {\n return e.persist() || onResizeStart(e, header);\n },\n style: {\n cursor: 'col-resize'\n },\n draggable: false,\n role: 'separator'\n }];\n };\n\n useResizeColumns.pluginName = 'useResizeColumns';\n\n function reducer$b(state, action) {\n if (action.type === actions.init) {\n return _extends({\n columnResizing: {\n columnWidths: {}\n }\n }, state);\n }\n\n if (action.type === actions.resetResize) {\n return _extends({}, state, {\n columnResizing: {\n columnWidths: {}\n }\n });\n }\n\n if (action.type === actions.columnStartResizing) {\n var clientX = action.clientX,\n columnId = action.columnId,\n columnWidth = action.columnWidth,\n headerIdWidths = action.headerIdWidths;\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n startX: clientX,\n headerIdWidths: headerIdWidths,\n columnWidth: columnWidth,\n isResizingColumn: columnId\n })\n });\n }\n\n if (action.type === actions.columnResizing) {\n var _clientX = action.clientX;\n\n var _state$columnResizing = state.columnResizing,\n startX = _state$columnResizing.startX,\n _columnWidth = _state$columnResizing.columnWidth,\n _state$columnResizing2 = _state$columnResizing.headerIdWidths,\n _headerIdWidths = _state$columnResizing2 === void 0 ? [] : _state$columnResizing2;\n\n var deltaX = _clientX - startX;\n var percentageDeltaX = deltaX / _columnWidth;\n var newColumnWidths = {};\n\n _headerIdWidths.forEach(function (_ref2) {\n var headerId = _ref2[0],\n headerWidth = _ref2[1];\n newColumnWidths[headerId] = Math.max(headerWidth + headerWidth * percentageDeltaX, 0);\n });\n\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n columnWidths: _extends({}, state.columnResizing.columnWidths, {}, newColumnWidths)\n })\n });\n }\n\n if (action.type === actions.columnDoneResizing) {\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n startX: null,\n isResizingColumn: null\n })\n });\n }\n }\n\n var useInstanceBeforeDimensions$1 = function useInstanceBeforeDimensions(instance) {\n var flatHeaders = instance.flatHeaders,\n disableResizing = instance.disableResizing,\n getHooks = instance.getHooks,\n columnResizing = instance.state.columnResizing;\n var getInstance = useGetLatest(instance);\n flatHeaders.forEach(function (header) {\n var canResize = getFirstDefined(header.disableResizing === true ? false : undefined, disableResizing === true ? false : undefined, true);\n header.canResize = canResize;\n header.width = columnResizing.columnWidths[header.id] || header.originalWidth || header.width;\n header.isResizing = columnResizing.isResizingColumn === header.id;\n\n if (canResize) {\n header.getResizerProps = makePropGetter(getHooks().getResizerProps, {\n instance: getInstance(),\n header: header\n });\n }\n });\n };\n\n function useInstance$b(instance) {\n var plugins = instance.plugins,\n dispatch = instance.dispatch,\n _instance$autoResetRe = instance.autoResetResize,\n autoResetResize = _instance$autoResetRe === void 0 ? true : _instance$autoResetRe,\n columns = instance.columns;\n ensurePluginOrder(plugins, ['useAbsoluteLayout'], 'useResizeColumns');\n var getAutoResetResize = useGetLatest(autoResetResize);\n useMountedLayoutEffect(function () {\n if (getAutoResetResize()) {\n dispatch({\n type: actions.resetResize\n });\n }\n }, [columns]);\n var resetResizing = React.useCallback(function () {\n return dispatch({\n type: actions.resetResize\n });\n }, [dispatch]);\n Object.assign(instance, {\n resetResizing: resetResizing\n });\n }\n\n function getLeafHeaders(header) {\n var leafHeaders = [];\n\n var recurseHeader = function recurseHeader(header) {\n if (header.columns && header.columns.length) {\n header.columns.map(recurseHeader);\n }\n\n leafHeaders.push(header);\n };\n\n recurseHeader(header);\n return leafHeaders;\n }\n\n var cellStyles = {\n position: 'absolute',\n top: 0\n };\n var useAbsoluteLayout = function useAbsoluteLayout(hooks) {\n hooks.getTableBodyProps.push(getRowStyles);\n hooks.getRowProps.push(getRowStyles);\n hooks.getHeaderGroupProps.push(getRowStyles);\n hooks.getFooterGroupProps.push(getRowStyles);\n hooks.getHeaderProps.push(function (props, _ref) {\n var column = _ref.column;\n return [props, {\n style: _extends({}, cellStyles, {\n left: column.totalLeft + \"px\",\n width: column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getCellProps.push(function (props, _ref2) {\n var cell = _ref2.cell;\n return [props, {\n style: _extends({}, cellStyles, {\n left: cell.column.totalLeft + \"px\",\n width: cell.column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getFooterProps.push(function (props, _ref3) {\n var column = _ref3.column;\n return [props, {\n style: _extends({}, cellStyles, {\n left: column.totalLeft + \"px\",\n width: column.totalWidth + \"px\"\n })\n }];\n });\n };\n useAbsoluteLayout.pluginName = 'useAbsoluteLayout';\n\n var getRowStyles = function getRowStyles(props, _ref4) {\n var instance = _ref4.instance;\n return [props, {\n style: {\n position: 'relative',\n width: instance.totalColumnsWidth + \"px\"\n }\n }];\n };\n\n var cellStyles$1 = {\n display: 'inline-block',\n boxSizing: 'border-box'\n };\n\n var getRowStyles$1 = function getRowStyles(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n display: 'flex',\n width: instance.totalColumnsWidth + \"px\"\n }\n }];\n };\n\n var useBlockLayout = function useBlockLayout(hooks) {\n hooks.getRowProps.push(getRowStyles$1);\n hooks.getHeaderGroupProps.push(getRowStyles$1);\n hooks.getFooterGroupProps.push(getRowStyles$1);\n hooks.getHeaderProps.push(function (props, _ref2) {\n var column = _ref2.column;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getCellProps.push(function (props, _ref3) {\n var cell = _ref3.cell;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: cell.column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getFooterProps.push(function (props, _ref4) {\n var column = _ref4.column;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: column.totalWidth + \"px\"\n })\n }];\n });\n };\n useBlockLayout.pluginName = 'useBlockLayout';\n\n function useFlexLayout(hooks) {\n hooks.getTableProps.push(getTableProps);\n hooks.getRowProps.push(getRowStyles$2);\n hooks.getHeaderGroupProps.push(getRowStyles$2);\n hooks.getFooterGroupProps.push(getRowStyles$2);\n hooks.getHeaderProps.push(getHeaderProps);\n hooks.getCellProps.push(getCellProps);\n hooks.getFooterProps.push(getFooterProps);\n }\n useFlexLayout.pluginName = 'useFlexLayout';\n\n var getTableProps = function getTableProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n minWidth: instance.totalColumnsMinWidth + \"px\"\n }\n }];\n };\n\n var getRowStyles$2 = function getRowStyles(props, _ref2) {\n var instance = _ref2.instance;\n return [props, {\n style: {\n display: 'flex',\n flex: '1 0 auto',\n minWidth: instance.totalColumnsMinWidth + \"px\"\n }\n }];\n };\n\n var getHeaderProps = function getHeaderProps(props, _ref3) {\n var column = _ref3.column;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: column.totalFlexWidth ? column.totalFlexWidth + \" 0 auto\" : undefined,\n minWidth: column.totalMinWidth + \"px\",\n width: column.totalWidth + \"px\"\n }\n }];\n };\n\n var getCellProps = function getCellProps(props, _ref4) {\n var cell = _ref4.cell;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: cell.column.totalFlexWidth + \" 0 auto\",\n minWidth: cell.column.totalMinWidth + \"px\",\n width: cell.column.totalWidth + \"px\"\n }\n }];\n };\n\n var getFooterProps = function getFooterProps(props, _ref5) {\n var column = _ref5.column;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: column.totalFlexWidth ? column.totalFlexWidth + \" 0 auto\" : undefined,\n minWidth: column.totalMinWidth + \"px\",\n width: column.totalWidth + \"px\"\n }\n }];\n };\n\n function useGridLayout(hooks) {\n hooks.stateReducers.push(reducer$c);\n hooks.getTableProps.push(getTableProps$1);\n hooks.getHeaderProps.push(getHeaderProps$1);\n }\n useGridLayout.pluginName = 'useGridLayout';\n\n var getTableProps$1 = function getTableProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n display: \"grid\",\n gridTemplateColumns: instance.state.gridLayout.columnWidths.map(function (w) {\n return w;\n }).join(\" \")\n }\n }];\n };\n\n var getHeaderProps$1 = function getHeaderProps(props, _ref2) {\n var column = _ref2.column;\n return [props, {\n id: \"header-cell-\" + column.id,\n style: {\n position: \"sticky\" //enables a scroll wrapper to be placed around the table and have sticky headers\n\n }\n }];\n };\n\n function reducer$c(state, action, previousState, instance) {\n if (action.type === \"init\") {\n return _extends({\n gridLayout: {\n columnWidths: instance.columns.map(function () {\n return \"auto\";\n })\n }\n }, state);\n }\n\n if (action.type === \"columnStartResizing\") {\n var columnId = action.columnId;\n var columnIndex = instance.visibleColumns.findIndex(function (col) {\n return col.id === columnId;\n });\n var elWidth = getElementWidth(columnId);\n\n if (elWidth !== undefined) {\n return _extends({}, state, {\n gridLayout: _extends({}, state.gridLayout, {\n columnId: columnId,\n columnIndex: columnIndex,\n startingWidth: elWidth\n })\n });\n } else {\n return state;\n }\n }\n\n if (action.type === \"columnResizing\") {\n var _state$gridLayout = state.gridLayout,\n _columnIndex = _state$gridLayout.columnIndex,\n startingWidth = _state$gridLayout.startingWidth,\n columnWidths = _state$gridLayout.columnWidths;\n var change = state.columnResizing.startX - action.clientX;\n var newWidth = startingWidth - change;\n var columnWidthsCopy = [].concat(columnWidths);\n columnWidthsCopy[_columnIndex] = newWidth + \"px\";\n return _extends({}, state, {\n gridLayout: _extends({}, state.gridLayout, {\n columnWidths: columnWidthsCopy\n })\n });\n }\n }\n\n function getElementWidth(columnId) {\n var _document$getElementB;\n\n var width = (_document$getElementB = document.getElementById(\"header-cell-\" + columnId)) == null ? void 0 : _document$getElementB.offsetWidth;\n\n if (width !== undefined) {\n return width;\n }\n }\n\n exports._UNSTABLE_usePivotColumns = _UNSTABLE_usePivotColumns;\n exports.actions = actions;\n exports.defaultColumn = defaultColumn;\n exports.defaultGroupByFn = defaultGroupByFn;\n exports.defaultOrderByFn = defaultOrderByFn;\n exports.defaultRenderer = defaultRenderer;\n exports.emptyRenderer = emptyRenderer;\n exports.ensurePluginOrder = ensurePluginOrder;\n exports.flexRender = flexRender;\n exports.functionalUpdate = functionalUpdate;\n exports.loopHooks = loopHooks;\n exports.makePropGetter = makePropGetter;\n exports.makeRenderer = makeRenderer;\n exports.reduceHooks = reduceHooks;\n exports.safeUseLayoutEffect = safeUseLayoutEffect;\n exports.useAbsoluteLayout = useAbsoluteLayout;\n exports.useAsyncDebounce = useAsyncDebounce;\n exports.useBlockLayout = useBlockLayout;\n exports.useColumnOrder = useColumnOrder;\n exports.useExpanded = useExpanded;\n exports.useFilters = useFilters;\n exports.useFlexLayout = useFlexLayout;\n exports.useGetLatest = useGetLatest;\n exports.useGlobalFilter = useGlobalFilter;\n exports.useGridLayout = useGridLayout;\n exports.useGroupBy = useGroupBy;\n exports.useMountedLayoutEffect = useMountedLayoutEffect;\n exports.usePagination = usePagination;\n exports.useResizeColumns = useResizeColumns;\n exports.useRowSelect = useRowSelect;\n exports.useRowState = useRowState;\n exports.useSortBy = useSortBy;\n exports.useTable = useTable;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=react-table.development.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXRhYmxlL2Rpc3QvcmVhY3QtdGFibGUuZGV2ZWxvcG1lbnQuanMuanMiLCJzb3VyY2VzIjpbImZpbGU6Ly9DOi9DbGlja1ZpZXcgUHJvamVjdHMvQGNsaWNrdmlldy9ub2RlX21vZHVsZXMvcmVhY3QtdGFibGUvZGlzdC9yZWFjdC10YWJsZS5kZXZlbG9wbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3JlYWN0JykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdyZWFjdCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuUmVhY3RUYWJsZSA9IHt9LCBnbG9iYWwuUmVhY3QpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCBSZWFjdCkgeyAndXNlIHN0cmljdCc7XG5cbiAgUmVhY3QgPSBSZWFjdCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVhY3QsICdkZWZhdWx0JykgPyBSZWFjdFsnZGVmYXVsdCddIDogUmVhY3Q7XG5cbiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IHt9O1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIga2V5LCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcblxuICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgICAgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG5cbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpO1xuICB9XG5cbiAgdmFyIHJlbmRlckVyciA9ICdSZW5kZXJlciBFcnJvciDimJ3vuI8nO1xuICB2YXIgYWN0aW9ucyA9IHtcbiAgICBpbml0OiAnaW5pdCdcbiAgfTtcbiAgdmFyIGRlZmF1bHRSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJlcihfcmVmKSB7XG4gICAgdmFyIF9yZWYkdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICB2YWx1ZSA9IF9yZWYkdmFsdWUgPT09IHZvaWQgMCA/ICcnIDogX3JlZiR2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHZhciBlbXB0eVJlbmRlcmVyID0gZnVuY3Rpb24gZW1wdHlSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgXCJcXHhBMFwiKTtcbiAgfTtcbiAgdmFyIGRlZmF1bHRDb2x1bW4gPSB7XG4gICAgQ2VsbDogZGVmYXVsdFJlbmRlcmVyLFxuICAgIHdpZHRoOiAxNTAsXG4gICAgbWluV2lkdGg6IDAsXG4gICAgbWF4V2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gIH07XG5cbiAgZnVuY3Rpb24gbWVyZ2VQcm9wcygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcHJvcExpc3QgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwcm9wTGlzdFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcExpc3QucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywgbmV4dCkge1xuICAgICAgdmFyIHN0eWxlID0gbmV4dC5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBuZXh0LmNsYXNzTmFtZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UobmV4dCwgW1wic3R5bGVcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gICAgICBwcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywge30sIHJlc3QpO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgcHJvcHMuc3R5bGUgPSBwcm9wcy5zdHlsZSA/IF9leHRlbmRzKHt9LCBwcm9wcy5zdHlsZSB8fCB7fSwge30sIHN0eWxlIHx8IHt9KSA6IHN0eWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSA/IHByb3BzLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZSA6IGNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNsYXNzTmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVByb3BHZXR0ZXIocHJldlByb3BzLCB1c2VyUHJvcHMsIG1ldGEpIHtcbiAgICAvLyBIYW5kbGUgYSBsYW1iZGEsIHBhc3MgaXQgdGhlIHByZXZpb3VzIHByb3BzXG4gICAgaWYgKHR5cGVvZiB1c2VyUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBoYW5kbGVQcm9wR2V0dGVyKHt9LCB1c2VyUHJvcHMocHJldlByb3BzLCBtZXRhKSk7XG4gICAgfSAvLyBIYW5kbGUgYW4gYXJyYXksIG1lcmdlIGVhY2ggaXRlbSBhcyBzZXBhcmF0ZSBwcm9wc1xuXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1c2VyUHJvcHMpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VQcm9wcy5hcHBseSh2b2lkIDAsIFtwcmV2UHJvcHNdLmNvbmNhdCh1c2VyUHJvcHMpKTtcbiAgICB9IC8vIEhhbmRsZSBhbiBvYmplY3QgYnkgZGVmYXVsdCwgbWVyZ2UgdGhlIHR3byBvYmplY3RzXG5cblxuICAgIHJldHVybiBtZXJnZVByb3BzKHByZXZQcm9wcywgdXNlclByb3BzKTtcbiAgfVxuXG4gIHZhciBtYWtlUHJvcEdldHRlciA9IGZ1bmN0aW9uIG1ha2VQcm9wR2V0dGVyKGhvb2tzLCBtZXRhKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAodXNlclByb3BzKSB7XG4gICAgICBpZiAodXNlclByb3BzID09PSB2b2lkIDApIHtcbiAgICAgICAgdXNlclByb3BzID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXS5jb25jYXQoaG9va3MsIFt1c2VyUHJvcHNdKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVByb3BHZXR0ZXIocHJldiwgbmV4dCwgX2V4dGVuZHMoe30sIG1ldGEsIHtcbiAgICAgICAgICB1c2VyUHJvcHM6IHVzZXJQcm9wc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7fSk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIHJlZHVjZUhvb2tzID0gZnVuY3Rpb24gcmVkdWNlSG9va3MoaG9va3MsIGluaXRpYWwsIG1ldGEsIGFsbG93VW5kZWZpbmVkKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBob29rcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBuZXh0KHByZXYsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICghYWxsb3dVbmRlZmluZWQgJiYgdHlwZW9mIG5leHRWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8obmV4dCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBUYWJsZTogQSByZWR1Y2VyIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgdW5kZWZpbmVkISBUaGlzIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfSwgaW5pdGlhbCk7XG4gIH07XG4gIHZhciBsb29wSG9va3MgPSBmdW5jdGlvbiBsb29wSG9va3MoaG9va3MsIGNvbnRleHQsIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBob29rKGNvbnRleHQsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgbmV4dFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhob29rLCBuZXh0VmFsdWUpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgVGFibGU6IEEgbG9vcC10eXBlIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgYSB2YWx1ZSEgVGhpcyBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBmdW5jdGlvbiBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBiZWZvcmVzLCBwbHVnaW5OYW1lLCBhZnRlcnMpIHtcbiAgICBpZiAoIGFmdGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmaW5pbmcgcGx1Z2lucyBpbiB0aGUgXFxcImFmdGVyXFxcIiBzZWN0aW9uIG9mIGVuc3VyZVBsdWdpbk9yZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHNlZSBwbHVnaW4gXCIgKyBwbHVnaW5OYW1lICsgXCIpXCIpO1xuICAgIH1cblxuICAgIHZhciBwbHVnaW5JbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucGx1Z2luTmFtZSA9PT0gcGx1Z2luTmFtZTtcbiAgICB9KTtcblxuICAgIGlmIChwbHVnaW5JbmRleCA9PT0gLTEpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsdWdpbiBcXFwiXCIgKyBwbHVnaW5OYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQgaW4gdGhlIHBsdWdpbiBsaXN0IVxcblRoaXMgdXN1YWxseSBtZWFucyB5b3UgbmVlZCB0byBuZWVkIHRvIG5hbWUgeW91ciBwbHVnaW4gaG9vayBieSBzZXR0aW5nIHRoZSAncGx1Z2luTmFtZScgcHJvcGVydHkgb2YgdGhlIGhvb2sgZnVuY3Rpb24sIGVnOlxcblxcbiAgXCIgKyBwbHVnaW5OYW1lICsgXCIucGx1Z2luTmFtZSA9ICdcIiArIHBsdWdpbk5hbWUgKyBcIidcXG5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmVmb3Jlcy5mb3JFYWNoKGZ1bmN0aW9uIChiZWZvcmUpIHtcbiAgICAgIHZhciBiZWZvcmVJbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5wbHVnaW5OYW1lID09PSBiZWZvcmU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGJlZm9yZUluZGV4ID4gLTEgJiYgYmVmb3JlSW5kZXggPiBwbHVnaW5JbmRleCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QgVGFibGU6IFRoZSBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4gaG9vayBtdXN0IGJlIHBsYWNlZCBhZnRlciB0aGUgXCIgKyBiZWZvcmUgKyBcIiBwbHVnaW4gaG9vayFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmFsVXBkYXRlKHVwZGF0ZXIsIG9sZCkge1xuICAgIHJldHVybiB0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZXIob2xkKSA6IHVwZGF0ZXI7XG4gIH1cbiAgZnVuY3Rpb24gdXNlR2V0TGF0ZXN0KG9iaikge1xuICAgIHZhciByZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgICByZWYuY3VycmVudCA9IG9iajtcbiAgICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlZi5jdXJyZW50O1xuICAgIH0sIFtdKTtcbiAgfSAvLyBTU1IgaGFzIGlzc3VlcyB3aXRoIHVzZUxheW91dEVmZmVjdCBzdGlsbCwgc28gdXNlIHVzZUVmZmVjdCBkdXJpbmcgU1NSXG5cbiAgdmFyIHNhZmVVc2VMYXlvdXRFZmZlY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xuICBmdW5jdGlvbiB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZuLCBkZXBzKSB7XG4gICAgdmFyIG1vdW50ZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIHNhZmVVc2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG1vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICBmbigpO1xuICAgICAgfVxuXG4gICAgICBtb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB9LCBkZXBzKTtcbiAgfVxuICBmdW5jdGlvbiB1c2VBc3luY0RlYm91bmNlKGRlZmF1bHRGbiwgZGVmYXVsdFdhaXQpIHtcbiAgICBpZiAoZGVmYXVsdFdhaXQgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFdhaXQgPSAwO1xuICAgIH1cblxuICAgIHZhciBkZWJvdW5jZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgdmFyIGdldERlZmF1bHRGbiA9IHVzZUdldExhdGVzdChkZWZhdWx0Rm4pO1xuICAgIHZhciBnZXREZWZhdWx0V2FpdCA9IHVzZUdldExhdGVzdChkZWZhdWx0V2FpdCk7XG4gICAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICB2YXIgX2xlbjIsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgX2tleTIsXG4gICAgICAgICAgICBfYXJnczIgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBmb3IgKF9sZW4yID0gX2FyZ3MyLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICAgICAgYXJnc1tfa2V5Ml0gPSBfYXJnczJbX2tleTJdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZGVib3VuY2VSZWYuY3VycmVudC5wcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVib3VuY2VSZWYuY3VycmVudC50aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgICAgICAgX2FzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWJvdW5jZVJlZi5jdXJyZW50LnRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IGRlYm91bmNlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZuKCkuYXBwbHkodm9pZCAwLCBhcmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDAucmVzb2x2ZS5jYWxsKF9jb250ZXh0LnQwLCBfY29udGV4dC50MSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDIgPSBfY29udGV4dFtcImNhdGNoXCJdKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnJlamVjdChfY29udGV4dC50Mik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxMik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzEsIDksIDEyLCAxNV1dKTtcbiAgICAgICAgICAgICAgICB9KSksIGdldERlZmF1bHRXYWl0KCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCksIFtnZXREZWZhdWx0Rm4sIGdldERlZmF1bHRXYWl0XSk7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZVJlbmRlcmVyKGluc3RhbmNlLCBjb2x1bW4sIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlLCB1c2VyUHJvcHMpIHtcbiAgICAgIGlmICh1c2VyUHJvcHMgPT09IHZvaWQgMCkge1xuICAgICAgICB1c2VyUHJvcHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIENvbXAgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyBjb2x1bW5bdHlwZV0gOiB0eXBlO1xuXG4gICAgICBpZiAodHlwZW9mIENvbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb2x1bW4pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVuZGVyRXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsZXhSZW5kZXIoQ29tcCwgX2V4dGVuZHMoe30sIGluc3RhbmNlLCB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICB9LCBtZXRhLCB7fSwgdXNlclByb3BzKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBmbGV4UmVuZGVyKENvbXAsIHByb3BzKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RDb21wb25lbnQoQ29tcCkgPyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXAsIHByb3BzKSA6IENvbXA7XG4gIH1cblxuICBmdW5jdGlvbiBpc1JlYWN0Q29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgfHwgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0V4b3RpY0NvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29tcG9uZW50KTtcbiAgICAgIHJldHVybiBwcm90by5wcm90b3R5cGUgJiYgcHJvdG8ucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG4gICAgfSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFeG90aWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBjb21wb25lbnQuJCR0eXBlb2YgPT09ICdzeW1ib2wnICYmIFsncmVhY3QubWVtbycsICdyZWFjdC5mb3J3YXJkX3JlZiddLmluY2x1ZGVzKGNvbXBvbmVudC4kJHR5cGVvZi5kZXNjcmlwdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rQ29sdW1uU3RydWN0dXJlKGNvbHVtbnMsIHBhcmVudCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgICAgZGVwdGggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4gPSBfZXh0ZW5kcyh7fSwgY29sdW1uLCB7XG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBkZXB0aDogZGVwdGhcbiAgICAgIH0pO1xuICAgICAgYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKTtcblxuICAgICAgaWYgKGNvbHVtbi5jb2x1bW5zKSB7XG4gICAgICAgIGNvbHVtbi5jb2x1bW5zID0gbGlua0NvbHVtblN0cnVjdHVyZShjb2x1bW4uY29sdW1ucywgY29sdW1uLCBkZXB0aCArIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZsYXR0ZW5Db2x1bW5zKGNvbHVtbnMpIHtcbiAgICByZXR1cm4gZmxhdHRlbkJ5KGNvbHVtbnMsICdjb2x1bW5zJyk7XG4gIH1cbiAgZnVuY3Rpb24gYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgZm9yIHN0cmluZyBhY2Nlc3NvclxuICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgIEhlYWRlciA9IGNvbHVtbi5IZWFkZXI7XG5cbiAgICBpZiAodHlwZW9mIGFjY2Vzc29yID09PSAnc3RyaW5nJykge1xuICAgICAgaWQgPSBpZCB8fCBhY2Nlc3NvcjtcbiAgICAgIHZhciBhY2Nlc3NvclBhdGggPSBhY2Nlc3Nvci5zcGxpdCgnLicpO1xuXG4gICAgICBhY2Nlc3NvciA9IGZ1bmN0aW9uIGFjY2Vzc29yKHJvdykge1xuICAgICAgICByZXR1cm4gZ2V0Qnkocm93LCBhY2Nlc3NvclBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWlkICYmIHR5cGVvZiBIZWFkZXIgPT09ICdzdHJpbmcnICYmIEhlYWRlcikge1xuICAgICAgaWQgPSBIZWFkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFpZCAmJiBjb2x1bW4uY29sdW1ucykge1xuICAgICAgY29uc29sZS5lcnJvcihjb2x1bW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGNvbHVtbiBJRCAob3IgdW5pcXVlIFwiSGVhZGVyXCIgdmFsdWUpIGlzIHJlcXVpcmVkIScpO1xuICAgIH1cblxuICAgIGlmICghaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY29sdW1uKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBjb2x1bW4gSUQgKG9yIHN0cmluZyBhY2Nlc3NvcikgaXMgcmVxdWlyZWQhJyk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGFjY2Vzc29yOiBhY2Nlc3NvclxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgZnVuY3Rpb24gZGVjb3JhdGVDb2x1bW4oY29sdW1uLCB1c2VyRGVmYXVsdENvbHVtbikge1xuICAgIGlmICghdXNlckRlZmF1bHRDb2x1bW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCBfZXh0ZW5kcyh7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSBmYWxsYmFjayBoZWFkZXIsIGp1c3QgaW4gY2FzZVxuICAgICAgSGVhZGVyOiBlbXB0eVJlbmRlcmVyLFxuICAgICAgRm9vdGVyOiBlbXB0eVJlbmRlcmVyXG4gICAgfSwgZGVmYXVsdENvbHVtbiwge30sIHVzZXJEZWZhdWx0Q29sdW1uLCB7fSwgY29sdW1uKSk7XG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIG9yaWdpbmFsV2lkdGg6IGNvbHVtbi53aWR0aFxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH0gLy8gQnVpbGQgdGhlIGhlYWRlciBncm91cHMgZnJvbSB0aGUgYm90dG9tIHVwXG5cbiAgZnVuY3Rpb24gbWFrZUhlYWRlckdyb3VwcyhhbGxDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcykge1xuICAgIGlmIChhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9PT0gdm9pZCAwKSB7XG4gICAgICBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJHcm91cHMgPSBbXTtcbiAgICB2YXIgc2NhbkNvbHVtbnMgPSBhbGxDb2x1bW5zO1xuICAgIHZhciB1aWQgPSAwO1xuXG4gICAgdmFyIGdldFVJRCA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcbiAgICAgIHJldHVybiB1aWQrKztcbiAgICB9O1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBUaGUgaGVhZGVyIGdyb3VwIHdlIGFyZSBjcmVhdGluZ1xuICAgICAgdmFyIGhlYWRlckdyb3VwID0ge1xuICAgICAgICBoZWFkZXJzOiBbXVxuICAgICAgfTsgLy8gVGhlIHBhcmVudCBjb2x1bW5zIHdlJ3JlIGdvaW5nIHRvIHNjYW4gbmV4dFxuXG4gICAgICB2YXIgcGFyZW50Q29sdW1ucyA9IFtdO1xuICAgICAgdmFyIGhhc1BhcmVudHMgPSBzY2FuQ29sdW1ucy5zb21lKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnBhcmVudDtcbiAgICAgIH0pOyAvLyBTY2FuIGVhY2ggY29sdW1uIGZvciBwYXJlbnRzXG5cbiAgICAgIHNjYW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAvLyBXaGF0IGlzIHRoZSBsYXRlc3QgKGxhc3QpIHBhcmVudCBjb2x1bW4/XG4gICAgICAgIHZhciBsYXRlc3RQYXJlbnRDb2x1bW4gPSBbXS5jb25jYXQocGFyZW50Q29sdW1ucykucmV2ZXJzZSgpWzBdO1xuICAgICAgICB2YXIgbmV3UGFyZW50O1xuXG4gICAgICAgIGlmIChoYXNQYXJlbnRzKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBoYXMgYSBwYXJlbnQsIGFkZCBpdCBpZiBuZWNlc3NhcnlcbiAgICAgICAgICBpZiAoY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgbmV3UGFyZW50ID0gX2V4dGVuZHMoe30sIGNvbHVtbi5wYXJlbnQsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogY29sdW1uLnBhcmVudC5pZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5wYXJlbnQuaWQgKyBcIl9cIiArIGdldFVJRCgpLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBbY29sdW1uXVxuICAgICAgICAgICAgfSwgYWRkaXRpb25hbEhlYWRlclByb3BlcnRpZXMoY29sdW1uKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG90aGVyIGNvbHVtbnMgaGF2ZSBwYXJlbnRzLCB3ZSdsbCBuZWVkIHRvIGFkZCBhIHBsYWNlIGhvbGRlciBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbElkID0gY29sdW1uLmlkICsgXCJfcGxhY2Vob2xkZXJcIjtcbiAgICAgICAgICAgIG5ld1BhcmVudCA9IGRlY29yYXRlQ29sdW1uKF9leHRlbmRzKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogb3JpZ2luYWxJZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5pZCArIFwiX3BsYWNlaG9sZGVyX1wiICsgZ2V0VUlEKCksXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyT2Y6IGNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyczogW2NvbHVtbl1cbiAgICAgICAgICAgIH0sIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKGNvbHVtbikpLCBkZWZhdWx0Q29sdW1uKTtcbiAgICAgICAgICB9IC8vIElmIHRoZSByZXN1bHRpbmcgcGFyZW50IGNvbHVtbnMgYXJlIHRoZSBzYW1lLCBqdXN0IGFkZFxuICAgICAgICAgIC8vIHRoZSBjb2x1bW4gYW5kIGluY3JlbWVudCB0aGUgaGVhZGVyIHNwYW5cblxuXG4gICAgICAgICAgaWYgKGxhdGVzdFBhcmVudENvbHVtbiAmJiBsYXRlc3RQYXJlbnRDb2x1bW4ub3JpZ2luYWxJZCA9PT0gbmV3UGFyZW50Lm9yaWdpbmFsSWQpIHtcbiAgICAgICAgICAgIGxhdGVzdFBhcmVudENvbHVtbi5oZWFkZXJzLnB1c2goY29sdW1uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50Q29sdW1ucy5wdXNoKG5ld1BhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycy5wdXNoKGNvbHVtbik7XG4gICAgICB9KTtcbiAgICAgIGhlYWRlckdyb3Vwcy5wdXNoKGhlYWRlckdyb3VwKTsgLy8gU3RhcnQgc2Nhbm5pbmcgdGhlIHBhcmVudCBjb2x1bW5zXG5cbiAgICAgIHNjYW5Db2x1bW5zID0gcGFyZW50Q29sdW1ucztcbiAgICB9O1xuXG4gICAgd2hpbGUgKHNjYW5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyR3JvdXBzLnJldmVyc2UoKTtcbiAgfVxuICB2YXIgcGF0aE9iakNhY2hlID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBnZXRCeShvYmosIHBhdGgsIGRlZikge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB2YXIgY2FjaGVLZXkgPSB0eXBlb2YgcGF0aCA9PT0gJ2Z1bmN0aW9uJyA/IHBhdGggOiBKU09OLnN0cmluZ2lmeShwYXRoKTtcblxuICAgIHZhciBwYXRoT2JqID0gcGF0aE9iakNhY2hlLmdldChjYWNoZUtleSkgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhdGhPYmogPSBtYWtlUGF0aEFycmF5KHBhdGgpO1xuICAgICAgcGF0aE9iakNhY2hlLnNldChjYWNoZUtleSwgcGF0aE9iaik7XG4gICAgICByZXR1cm4gcGF0aE9iajtcbiAgICB9KCk7XG5cbiAgICB2YXIgdmFsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbCA9IHBhdGhPYmoucmVkdWNlKGZ1bmN0aW9uIChjdXJzb3IsIHBhdGhQYXJ0KSB7XG4gICAgICAgIHJldHVybiBjdXJzb3JbcGF0aFBhcnRdO1xuICAgICAgfSwgb2JqKTtcbiAgICB9IGNhdGNoIChlKSB7Ly8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyA/IHZhbCA6IGRlZjtcbiAgfVxuICBmdW5jdGlvbiBnZXRGaXJzdERlZmluZWQoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYXJnc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihhKSB7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZmxhdHRlbkJ5KGFyciwga2V5KSB7XG4gICAgdmFyIGZsYXQgPSBbXTtcblxuICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24gcmVjdXJzZShhcnIpIHtcbiAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIGlmICghZFtrZXldKSB7XG4gICAgICAgICAgZmxhdC5wdXNoKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2UoZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlY3Vyc2UoYXJyKTtcbiAgICByZXR1cm4gZmxhdDtcbiAgfVxuICBmdW5jdGlvbiBleHBhbmRSb3dzKHJvd3MsIF9yZWYpIHtcbiAgICB2YXIgbWFudWFsRXhwYW5kZWRLZXkgPSBfcmVmLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICAgIF9yZWYkZXhwYW5kU3ViUm93cyA9IF9yZWYuZXhwYW5kU3ViUm93cyxcbiAgICAgICAgZXhwYW5kU3ViUm93cyA9IF9yZWYkZXhwYW5kU3ViUm93cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkZXhwYW5kU3ViUm93cztcbiAgICB2YXIgZXhwYW5kZWRSb3dzID0gW107XG5cbiAgICB2YXIgaGFuZGxlUm93ID0gZnVuY3Rpb24gaGFuZGxlUm93KHJvdywgYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgIGlmIChhZGRUb0V4cGFuZGVkUm93cyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGFkZFRvRXhwYW5kZWRSb3dzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcm93LmlzRXhwYW5kZWQgPSByb3cub3JpZ2luYWwgJiYgcm93Lm9yaWdpbmFsW21hbnVhbEV4cGFuZGVkS2V5XSB8fCBleHBhbmRlZFtyb3cuaWRdO1xuICAgICAgcm93LmNhbkV4cGFuZCA9IHJvdy5zdWJSb3dzICYmICEhcm93LnN1YlJvd3MubGVuZ3RoO1xuXG4gICAgICBpZiAoYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgZXhwYW5kZWRSb3dzLnB1c2gocm93KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCAmJiByb3cuaXNFeHBhbmRlZCkge1xuICAgICAgICByb3cuc3ViUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlUm93KHJvdywgZXhwYW5kU3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGhhbmRsZVJvdyhyb3cpO1xuICAgIH0pO1xuICAgIHJldHVybiBleHBhbmRlZFJvd3M7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RmlsdGVyTWV0aG9kKGZpbHRlciwgdXNlckZpbHRlclR5cGVzLCBmaWx0ZXJUeXBlcykge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGZpbHRlcikgfHwgdXNlckZpbHRlclR5cGVzW2ZpbHRlcl0gfHwgZmlsdGVyVHlwZXNbZmlsdGVyXSB8fCBmaWx0ZXJUeXBlcy50ZXh0O1xuICB9XG4gIGZ1bmN0aW9uIHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoYXV0b1JlbW92ZSwgdmFsdWUsIGNvbHVtbikge1xuICAgIHJldHVybiBhdXRvUmVtb3ZlID8gYXV0b1JlbW92ZSh2YWx1ZSwgY29sdW1uKSA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gIH1cbiAgZnVuY3Rpb24gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmcoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC1UYWJsZTogWW91IGhhdmUgbm90IGNhbGxlZCBwcmVwYXJlUm93KHJvdykgb25lIG9yIG1vcmUgcm93cyB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gcmVuZGVyLicpO1xuICB9XG4gIHZhciBwYXNzaXZlU3VwcG9ydGVkID0gbnVsbDtcbiAgZnVuY3Rpb24gcGFzc2l2ZUV2ZW50U3VwcG9ydGVkKCkge1xuICAgIC8vIG1lbW9pemUgc3VwcG9ydCB0byBhdm9pZCBhZGRpbmcgbXVsdGlwbGUgdGVzdCBldmVudHNcbiAgICBpZiAodHlwZW9mIHBhc3NpdmVTdXBwb3J0ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHBhc3NpdmVTdXBwb3J0ZWQ7XG4gICAgdmFyIHN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwYXNzaXZlU3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuICAgIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkO1xuICB9IC8vXG5cbiAgdmFyIHJlT3BlbkJyYWNrZXQgPSAvXFxbL2c7XG4gIHZhciByZUNsb3NlQnJhY2tldCA9IC9cXF0vZztcblxuICBmdW5jdGlvbiBtYWtlUGF0aEFycmF5KG9iaikge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChvYmopIC8vIHJlbW92ZSBhbGwgcGVyaW9kcyBpbiBwYXJ0c1xuICAgIC5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoZCkucmVwbGFjZSgnLicsICdfJyk7XG4gICAgfSkgLy8gam9pbiBwYXJ0cyB1c2luZyBwZXJpb2RcbiAgICAuam9pbignLicpIC8vIHJlcGxhY2UgYnJhY2tldHMgd2l0aCBwZXJpb2RzXG4gICAgLnJlcGxhY2UocmVPcGVuQnJhY2tldCwgJy4nKS5yZXBsYWNlKHJlQ2xvc2VCcmFja2V0LCAnJykgLy8gc3BsaXQgaXQgYmFjayBvdXQgb24gcGVyaW9kc1xuICAgIC5zcGxpdCgnLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyLCBuZXdBcnIpIHtcbiAgICBpZiAobmV3QXJyID09PSB2b2lkIDApIHtcbiAgICAgIG5ld0FyciA9IFtdO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBuZXdBcnIucHVzaChhcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBmbGF0dGVuRGVlcChhcnJbaV0sIG5ld0Fycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0FycjtcbiAgfVxuXG4gIHZhciBkZWZhdWx0R2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZVByb3BzKHByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIHJvbGU6ICd0YWJsZSdcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyhwcm9wcykge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICByb2xlOiAncm93Z3JvdXAnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0SGVhZGVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0SGVhZGVyUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQsXG4gICAgICByb2xlOiAnY29sdW1uaGVhZGVyJ1xuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldEZvb3RlclByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3RlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnRcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRIZWFkZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHMocHJvcHMsIF9yZWYzKSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjMuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJHcm91cF9cIiArIGluZGV4LFxuICAgICAgcm9sZTogJ3JvdydcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3Rlckdyb3VwUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjQuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJHcm91cF9cIiArIGluZGV4XG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Um93UHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Um93UHJvcHMocHJvcHMsIF9yZWY1KSB7XG4gICAgdmFyIHJvdyA9IF9yZWY1LnJvdztcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcInJvd19cIiArIHJvdy5pZCxcbiAgICAgIHJvbGU6ICdyb3cnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Q2VsbFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldENlbGxQcm9wcyhwcm9wcywgX3JlZjYpIHtcbiAgICB2YXIgY2VsbCA9IF9yZWY2LmNlbGw7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJjZWxsX1wiICsgY2VsbC5yb3cuaWQgKyBcIl9cIiArIGNlbGwuY29sdW1uLmlkLFxuICAgICAgcm9sZTogJ2NlbGwnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VEZWZhdWx0UGx1Z2luSG9va3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZU9wdGlvbnM6IFtdLFxuICAgICAgc3RhdGVSZWR1Y2VyczogW10sXG4gICAgICB1c2VDb250cm9sbGVkU3RhdGU6IFtdLFxuICAgICAgY29sdW1uczogW10sXG4gICAgICBjb2x1bW5zRGVwczogW10sXG4gICAgICBhbGxDb2x1bW5zOiBbXSxcbiAgICAgIGFsbENvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGFjY2Vzc1ZhbHVlOiBbXSxcbiAgICAgIG1hdGVyaWFsaXplZENvbHVtbnM6IFtdLFxuICAgICAgbWF0ZXJpYWxpemVkQ29sdW1uc0RlcHM6IFtdLFxuICAgICAgdXNlSW5zdGFuY2VBZnRlckRhdGE6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnM6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGhlYWRlckdyb3VwczogW10sXG4gICAgICBoZWFkZXJHcm91cHNEZXBzOiBbXSxcbiAgICAgIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9uczogW10sXG4gICAgICB1c2VJbnN0YW5jZTogW10sXG4gICAgICBwcmVwYXJlUm93OiBbXSxcbiAgICAgIGdldFRhYmxlUHJvcHM6IFtkZWZhdWx0R2V0VGFibGVQcm9wc10sXG4gICAgICBnZXRUYWJsZUJvZHlQcm9wczogW2RlZmF1bHRHZXRUYWJsZUJvZHlQcm9wc10sXG4gICAgICBnZXRIZWFkZXJHcm91cFByb3BzOiBbZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHNdLFxuICAgICAgZ2V0Rm9vdGVyR3JvdXBQcm9wczogW2RlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzXSxcbiAgICAgIGdldEhlYWRlclByb3BzOiBbZGVmYXVsdEdldEhlYWRlclByb3BzXSxcbiAgICAgIGdldEZvb3RlclByb3BzOiBbZGVmYXVsdEdldEZvb3RlclByb3BzXSxcbiAgICAgIGdldFJvd1Byb3BzOiBbZGVmYXVsdEdldFJvd1Byb3BzXSxcbiAgICAgIGdldENlbGxQcm9wczogW2RlZmF1bHRHZXRDZWxsUHJvcHNdLFxuICAgICAgdXNlRmluYWxJbnN0YW5jZTogW11cbiAgICB9O1xuICB9XG5cbiAgYWN0aW9ucy5yZXNldEhpZGRlbkNvbHVtbnMgPSAncmVzZXRIaWRkZW5Db2x1bW5zJztcbiAgYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uID0gJ3RvZ2dsZUhpZGVDb2x1bW4nO1xuICBhY3Rpb25zLnNldEhpZGRlbkNvbHVtbnMgPSAnc2V0SGlkZGVuQ29sdW1ucyc7XG4gIGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMgPSAndG9nZ2xlSGlkZUFsbENvbHVtbnMnO1xuICB2YXIgdXNlQ29sdW1uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIHVzZUNvbHVtblZpc2liaWxpdHkoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVIaWRkZW5Qcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMpO1xuICAgIGhvb2tzLmhlYWRlckdyb3Vwc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnNdKTtcbiAgICB9KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlKTtcbiAgfTtcbiAgdXNlQ29sdW1uVmlzaWJpbGl0eS5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtblZpc2liaWxpdHknO1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYyLmNvbHVtbjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuKCFlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNvbHVtbi5pc1Zpc2libGUsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBDb2x1bW4gVmlzaWJsZSdcbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVIaWRlQWxsQ29sdW1ucyghZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiAhaW5zdGFuY2UuYWxsQ29sdW1uc0hpZGRlbiAmJiAhaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGgsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ29sdW1ucyBIaWRkZW4nLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogIWluc3RhbmNlLmFsbENvbHVtbnNIaWRkZW4gJiYgaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGhcbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1ucykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBoaWRkZW5Db2x1bW5zOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuaGlkZGVuQ29sdW1ucyB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4pIHtcbiAgICAgIHZhciBzaG91bGQgPSB0eXBlb2YgYWN0aW9uLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IGFjdGlvbi52YWx1ZSA6ICFzdGF0ZS5oaWRkZW5Db2x1bW5zLmluY2x1ZGVzKGFjdGlvbi5jb2x1bW5JZCk7XG4gICAgICB2YXIgaGlkZGVuQ29sdW1ucyA9IHNob3VsZCA/IFtdLmNvbmNhdChzdGF0ZS5oaWRkZW5Db2x1bW5zLCBbYWN0aW9uLmNvbHVtbklkXSkgOiBzdGF0ZS5oaWRkZW5Db2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZCAhPT0gYWN0aW9uLmNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGhpZGRlbkNvbHVtbnNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRIaWRkZW5Db2x1bW5zKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnZhbHVlLCBzdGF0ZS5oaWRkZW5Db2x1bW5zKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVBbGxDb2x1bW5zKSB7XG4gICAgICB2YXIgc2hvdWxkQWxsID0gdHlwZW9mIGFjdGlvbi52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBhY3Rpb24udmFsdWUgOiAhc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IHNob3VsZEFsbCA/IGluc3RhbmNlLmFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQ7XG4gICAgICAgIH0pIDogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBoZWFkZXJzID0gaW5zdGFuY2UuaGVhZGVycyxcbiAgICAgICAgaGlkZGVuQ29sdW1ucyA9IGluc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnM7XG4gICAgdmFyIGlzTW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgICBpZiAoIWlzTW91bnRlZFJlZi5jdXJyZW50KSA7XG5cbiAgICB2YXIgaGFuZGxlQ29sdW1uID0gZnVuY3Rpb24gaGFuZGxlQ29sdW1uKGNvbHVtbiwgcGFyZW50VmlzaWJsZSkge1xuICAgICAgY29sdW1uLmlzVmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgIWhpZGRlbkNvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmlkKTtcbiAgICAgIHZhciB0b3RhbFZpc2libGVIZWFkZXJDb3VudCA9IDA7XG5cbiAgICAgIGlmIChjb2x1bW4uaGVhZGVycyAmJiBjb2x1bW4uaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY29sdW1uLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViQ29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJDb2x1bW4sIGNvbHVtbi5pc1Zpc2libGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gY29sdW1uLmlzVmlzaWJsZSA/IDEgOiAwO1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQgPSB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICAgIHJldHVybiB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICB9O1xuXG4gICAgdmFyIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YkhlYWRlcikge1xuICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJIZWFkZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBoaWRkZW5Db2x1bW5zID0gaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEhpID0gaW5zdGFuY2UuYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyA9IF9pbnN0YW5jZSRhdXRvUmVzZXRIaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRIaTtcbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2UpO1xuICAgIHZhciBhbGxDb2x1bW5zSGlkZGVuID0gYWxsQ29sdW1ucy5sZW5ndGggPT09IGhpZGRlbkNvbHVtbnMubGVuZ3RoO1xuICAgIHZhciB0b2dnbGVIaWRlQ29sdW1uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uLFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHNldEhpZGRlbkNvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlSGlkZUFsbENvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4sXG4gICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb2x1bW4uZ2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGRlblByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGdldEF1dG9SZXNldEhpZGRlbkNvbHVtbnMgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0SGlkZGVuQ29sdW1ucygpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1uc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBhbGxDb2x1bW5zSGlkZGVuOiBhbGxDb2x1bW5zSGlkZGVuLFxuICAgICAgdG9nZ2xlSGlkZUNvbHVtbjogdG9nZ2xlSGlkZUNvbHVtbixcbiAgICAgIHNldEhpZGRlbkNvbHVtbnM6IHNldEhpZGRlbkNvbHVtbnMsXG4gICAgICB0b2dnbGVIaWRlQWxsQ29sdW1uczogdG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzOiBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzXG4gICAgfSk7XG4gIH1cblxuICB2YXIgZGVmYXVsdEluaXRpYWxTdGF0ZSA9IHt9O1xuICB2YXIgZGVmYXVsdENvbHVtbkluc3RhbmNlID0ge307XG5cbiAgdmFyIGRlZmF1bHRSZWR1Y2VyID0gZnVuY3Rpb24gZGVmYXVsdFJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgcHJldlN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0U3ViUm93cyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRTdWJSb3dzKHJvdywgaW5kZXgpIHtcbiAgICByZXR1cm4gcm93LnN1YlJvd3MgfHwgW107XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSb3dJZCA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRSb3dJZChyb3csIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gXCJcIiArIChwYXJlbnQgPyBbcGFyZW50LmlkLCBpbmRleF0uam9pbignLicpIDogaW5kZXgpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0VXNlQ29udHJvbGxlZFN0YXRlID0gZnVuY3Rpb24gZGVmYXVsdFVzZUNvbnRyb2xsZWRTdGF0ZShkKSB7XG4gICAgcmV0dXJuIGQ7XG4gIH07XG5cbiAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0cyhwcm9wcykge1xuICAgIHZhciBfcHJvcHMkaW5pdGlhbFN0YXRlID0gcHJvcHMuaW5pdGlhbFN0YXRlLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfcHJvcHMkaW5pdGlhbFN0YXRlID09PSB2b2lkIDAgPyBkZWZhdWx0SW5pdGlhbFN0YXRlIDogX3Byb3BzJGluaXRpYWxTdGF0ZSxcbiAgICAgICAgX3Byb3BzJGRlZmF1bHRDb2x1bW4gPSBwcm9wcy5kZWZhdWx0Q29sdW1uLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX3Byb3BzJGRlZmF1bHRDb2x1bW4gPT09IHZvaWQgMCA/IGRlZmF1bHRDb2x1bW5JbnN0YW5jZSA6IF9wcm9wcyRkZWZhdWx0Q29sdW1uLFxuICAgICAgICBfcHJvcHMkZ2V0U3ViUm93cyA9IHByb3BzLmdldFN1YlJvd3MsXG4gICAgICAgIGdldFN1YlJvd3MgPSBfcHJvcHMkZ2V0U3ViUm93cyA9PT0gdm9pZCAwID8gZGVmYXVsdEdldFN1YlJvd3MgOiBfcHJvcHMkZ2V0U3ViUm93cyxcbiAgICAgICAgX3Byb3BzJGdldFJvd0lkID0gcHJvcHMuZ2V0Um93SWQsXG4gICAgICAgIGdldFJvd0lkID0gX3Byb3BzJGdldFJvd0lkID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0Um93SWQgOiBfcHJvcHMkZ2V0Um93SWQsXG4gICAgICAgIF9wcm9wcyRzdGF0ZVJlZHVjZXIgPSBwcm9wcy5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9wcm9wcyRzdGF0ZVJlZHVjZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRSZWR1Y2VyIDogX3Byb3BzJHN0YXRlUmVkdWNlcixcbiAgICAgICAgX3Byb3BzJHVzZUNvbnRyb2xsZWRTID0gcHJvcHMudXNlQ29udHJvbGxlZFN0YXRlLFxuICAgICAgICB1c2VDb250cm9sbGVkU3RhdGUgPSBfcHJvcHMkdXNlQ29udHJvbGxlZFMgPT09IHZvaWQgMCA/IGRlZmF1bHRVc2VDb250cm9sbGVkU3RhdGUgOiBfcHJvcHMkdXNlQ29udHJvbGxlZFMsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wiaW5pdGlhbFN0YXRlXCIsIFwiZGVmYXVsdENvbHVtblwiLCBcImdldFN1YlJvd3NcIiwgXCJnZXRSb3dJZFwiLCBcInN0YXRlUmVkdWNlclwiLCBcInVzZUNvbnRyb2xsZWRTdGF0ZVwiXSk7XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGluaXRpYWxTdGF0ZTogaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdENvbHVtbjogZGVmYXVsdENvbHVtbixcbiAgICAgIGdldFN1YlJvd3M6IGdldFN1YlJvd3MsXG4gICAgICBnZXRSb3dJZDogZ2V0Um93SWQsXG4gICAgICBzdGF0ZVJlZHVjZXI6IHN0YXRlUmVkdWNlcixcbiAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZTogdXNlQ29udHJvbGxlZFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgdXNlVGFibGUgPSBmdW5jdGlvbiB1c2VUYWJsZShwcm9wcykge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHBsdWdpbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgcHJvcHNcbiAgICBwcm9wcyA9IGFwcGx5RGVmYXVsdHMocHJvcHMpOyAvLyBBZGQgY29yZSBwbHVnaW5zXG5cbiAgICBwbHVnaW5zID0gW3VzZUNvbHVtblZpc2liaWxpdHldLmNvbmNhdChwbHVnaW5zKTsgLy8gQ3JlYXRlIHRoZSB0YWJsZSBpbnN0YW5jZVxuXG4gICAgdmFyIGluc3RhbmNlUmVmID0gUmVhY3QudXNlUmVmKHt9KTsgLy8gQ3JlYXRlIGEgZ2V0dGVyIGZvciB0aGUgaW5zdGFuY2UgKGhlbHBzIGF2b2lkIGEgbG90IG9mIHBvdGVudGlhbCBtZW1vcnkgbGVha3MpXG5cbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2VSZWYuY3VycmVudCk7IC8vIEFzc2lnbiB0aGUgcHJvcHMsIHBsdWdpbnMgYW5kIGhvb2tzIHRvIHRoZSBpbnN0YW5jZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBob29rczogbWFrZURlZmF1bHRQbHVnaW5Ib29rcygpXG4gICAgfSkpOyAvLyBBbGxvdyBwbHVnaW5zIHRvIHJlZ2lzdGVyIGhvb2tzIGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cbiAgICBwbHVnaW5zLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHBsdWdpbihnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICB9KTsgLy8gQ29uc3VtZSBhbGwgaG9va3MgYW5kIG1ha2UgYSBnZXR0ZXIgZm9yIHRoZW1cblxuICAgIHZhciBnZXRIb29rcyA9IHVzZUdldExhdGVzdChnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICBnZXRJbnN0YW5jZSgpLmdldEhvb2tzID0gZ2V0SG9va3M7XG4gICAgZGVsZXRlIGdldEluc3RhbmNlKCkuaG9va3M7IC8vIEFsbG93IHVzZU9wdGlvbnMgaG9va3MgdG8gbW9kaWZ5IHRoZSBvcHRpb25zIGNvbWluZyBpbnRvIHRoZSB0YWJsZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCByZWR1Y2VIb29rcyhnZXRIb29rcygpLnVzZU9wdGlvbnMsIGFwcGx5RGVmYXVsdHMocHJvcHMpKSk7XG5cbiAgICB2YXIgX2dldEluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgZGF0YSA9IF9nZXRJbnN0YW5jZS5kYXRhLFxuICAgICAgICB1c2VyQ29sdW1ucyA9IF9nZXRJbnN0YW5jZS5jb2x1bW5zLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfZ2V0SW5zdGFuY2UuaW5pdGlhbFN0YXRlLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX2dldEluc3RhbmNlLmRlZmF1bHRDb2x1bW4sXG4gICAgICAgIGdldFN1YlJvd3MgPSBfZ2V0SW5zdGFuY2UuZ2V0U3ViUm93cyxcbiAgICAgICAgZ2V0Um93SWQgPSBfZ2V0SW5zdGFuY2UuZ2V0Um93SWQsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9nZXRJbnN0YW5jZS5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZSA9IF9nZXRJbnN0YW5jZS51c2VDb250cm9sbGVkU3RhdGU7IC8vIFNldHVwIHVzZXIgcmVkdWNlciByZWZcblxuXG4gICAgdmFyIGdldFN0YXRlUmVkdWNlciA9IHVzZUdldExhdGVzdChzdGF0ZVJlZHVjZXIpOyAvLyBCdWlsZCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIHJlZHVjZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgLy8gRGV0ZWN0IGludmFsaWQgYWN0aW9uc1xuICAgICAgaWYgKCFhY3Rpb24udHlwZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQWN0aW9uIPCfkYYnKTtcbiAgICAgIH0gLy8gUmVkdWNlIHRoZSBzdGF0ZSBmcm9tIGFsbCBwbHVnaW4gcmVkdWNlcnNcblxuXG4gICAgICByZXR1cm4gW10uY29uY2F0KGdldEhvb2tzKCkuc3RhdGVSZWR1Y2VycywgQXJyYXkuaXNBcnJheShnZXRTdGF0ZVJlZHVjZXIoKSkgPyBnZXRTdGF0ZVJlZHVjZXIoKSA6IFtnZXRTdGF0ZVJlZHVjZXIoKV0pLnJlZHVjZShmdW5jdGlvbiAocywgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlcihzLCBhY3Rpb24sIHN0YXRlLCBnZXRJbnN0YW5jZSgpKSB8fCBzO1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0U3RhdGVSZWR1Y2VyLCBnZXRJbnN0YW5jZV0pOyAvLyBTdGFydCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIF9SZWFjdCR1c2VSZWR1Y2VyID0gUmVhY3QudXNlUmVkdWNlcihyZWR1Y2VyLCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VyKGluaXRpYWxTdGF0ZSwge1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmluaXRcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgICAgICByZWR1Y2VyU3RhdGUgPSBfUmVhY3QkdXNlUmVkdWNlclswXSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfUmVhY3QkdXNlUmVkdWNlclsxXTsgLy8gQWxsb3cgdGhlIHVzZXIgdG8gY29udHJvbCB0aGUgZmluYWwgc3RhdGUgd2l0aCBob29rc1xuXG5cbiAgICB2YXIgc3RhdGUgPSByZWR1Y2VIb29rcyhbXS5jb25jYXQoZ2V0SG9va3MoKS51c2VDb250cm9sbGVkU3RhdGUsIFt1c2VDb250cm9sbGVkU3RhdGVdKSwgcmVkdWNlclN0YXRlLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24oZ2V0SW5zdGFuY2UoKSwge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoXG4gICAgfSk7IC8vIERlY29yYXRlIEFsbCB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBsaW5rQ29sdW1uU3RydWN0dXJlKHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1ucywgdXNlckNvbHVtbnMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pKTtcbiAgICB9LCBbZ2V0SG9va3MsIGdldEluc3RhbmNlLCB1c2VyQ29sdW1uc10uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1uc0RlcHMsIFtdLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pKSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5jb2x1bW5zID0gY29sdW1uczsgLy8gR2V0IHRoZSBmbGF0IGxpc3Qgb2YgYWxsIGNvbHVtbnMgYW5kIGFsbG93IGhvb2tzIHRvIGRlY29yYXRlXG4gICAgLy8gdGhvc2UgY29sdW1ucyAoYW5kIHRyaWdnZXIgdGhpcyBtZW1vaXphdGlvbiB2aWEgZGVwcylcblxuICAgIHZhciBhbGxDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zLCBmbGF0dGVuQ29sdW1ucyhjb2x1bW5zKSwge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSkubWFwKGFzc2lnbkNvbHVtbkFjY2Vzc29yKTtcbiAgICB9LCBbY29sdW1ucywgZ2V0SG9va3MsIGdldEluc3RhbmNlXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmFsbENvbHVtbnMgPSBhbGxDb2x1bW5zOyAvLyBBY2Nlc3MgdGhlIHJvdyBtb2RlbCB1c2luZyBpbml0aWFsIGNvbHVtbnNcblxuICAgIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgIHZhciBmbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIHJvd3NCeUlkID0ge307XG4gICAgICB2YXIgYWxsQ29sdW1uc1F1ZXVlID0gW10uY29uY2F0KGFsbENvbHVtbnMpO1xuXG4gICAgICB3aGlsZSAoYWxsQ29sdW1uc1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1uc1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgcm93czogcm93cyxcbiAgICAgICAgICBmbGF0Um93czogZmxhdFJvd3MsXG4gICAgICAgICAgcm93c0J5SWQ6IHJvd3NCeUlkLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIGdldFJvd0lkOiBnZXRSb3dJZCxcbiAgICAgICAgICBnZXRTdWJSb3dzOiBnZXRTdWJSb3dzLFxuICAgICAgICAgIGFjY2Vzc1ZhbHVlSG9va3M6IGdldEhvb2tzKCkuYWNjZXNzVmFsdWUsXG4gICAgICAgICAgZ2V0SW5zdGFuY2U6IGdldEluc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgfSwgW2FsbENvbHVtbnMsIGRhdGEsIGdldFJvd0lkLCBnZXRTdWJSb3dzLCBnZXRIb29rcywgZ2V0SW5zdGFuY2VdKSxcbiAgICAgICAgcm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBmbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICByb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdO1xuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCB7XG4gICAgICByb3dzOiByb3dzLFxuICAgICAgaW5pdGlhbFJvd3M6IFtdLmNvbmNhdChyb3dzKSxcbiAgICAgIGZsYXRSb3dzOiBmbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiByb3dzQnlJZCAvLyBtYXRlcmlhbGl6ZWRDb2x1bW5zLFxuXG4gICAgfSk7XG4gICAgbG9vcEhvb2tzKGdldEhvb2tzKCkudXNlSW5zdGFuY2VBZnRlckRhdGEsIGdldEluc3RhbmNlKCkpOyAvLyBHZXQgdGhlIGZsYXQgbGlzdCBvZiBhbGwgY29sdW1ucyBBRlRFUiB0aGUgcm93c1xuICAgIC8vIGhhdmUgYmVlbiBhY2Nlc3MsIGFuZCBhbGxvdyBob29rcyB0byBkZWNvcmF0ZVxuICAgIC8vIHRob3NlIGNvbHVtbnMgKGFuZCB0cmlnZ2VyIHRoaXMgbWVtb2l6YXRpb24gdmlhIGRlcHMpXG5cbiAgICB2YXIgdmlzaWJsZUNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VIb29rcyhnZXRIb29rcygpLnZpc2libGVDb2x1bW5zLCBhbGxDb2x1bW5zLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRlQ29sdW1uKGQsIGRlZmF1bHRDb2x1bW4pO1xuICAgICAgfSk7XG4gICAgfSwgW2dldEhvb2tzLCBhbGxDb2x1bW5zLCBnZXRJbnN0YW5jZSwgZGVmYXVsdENvbHVtbl0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkudmlzaWJsZUNvbHVtbnNEZXBzLCBbXSwge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KSkpOyAvLyBDb21iaW5lIG5ldyB2aXNpYmxlIGNvbHVtbnMgd2l0aCBhbGwgY29sdW1uc1xuXG4gICAgYWxsQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvbHVtbnMgPSBbXS5jb25jYXQodmlzaWJsZUNvbHVtbnMpO1xuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uLmlkO1xuICAgICAgICB9KSkge1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFthbGxDb2x1bW5zLCB2aXNpYmxlQ29sdW1uc10pO1xuICAgIGdldEluc3RhbmNlKCkuYWxsQ29sdW1ucyA9IGFsbENvbHVtbnM7XG5cbiAgICB7XG4gICAgICB2YXIgZHVwbGljYXRlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4sIGkpIHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSkgIT09IGk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGR1cGxpY2F0ZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhhbGxDb2x1bW5zKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIGNvbHVtbnMgd2VyZSBmb3VuZCB3aXRoIGlkczogXFxcIlwiICsgZHVwbGljYXRlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSkuam9pbignLCAnKSArIFwiXFxcIiBpbiB0aGUgY29sdW1ucyBhcnJheSBhYm92ZVwiKTtcbiAgICAgIH1cbiAgICB9IC8vIE1ha2UgdGhlIGhlYWRlckdyb3Vwc1xuXG5cbiAgICB2YXIgaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5oZWFkZXJHcm91cHMsIG1ha2VIZWFkZXJHcm91cHModmlzaWJsZUNvbHVtbnMsIGRlZmF1bHRDb2x1bW4pLCBnZXRJbnN0YW5jZSgpKTtcbiAgICB9LCBbZ2V0SG9va3MsIHZpc2libGVDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBnZXRJbnN0YW5jZV0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuaGVhZGVyR3JvdXBzRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlckdyb3VwcyA9IGhlYWRlckdyb3VwczsgLy8gR2V0IHRoZSBmaXJzdCBsZXZlbCBvZiBoZWFkZXJzXG5cbiAgICB2YXIgaGVhZGVycyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwcy5sZW5ndGggPyBoZWFkZXJHcm91cHNbMF0uaGVhZGVycyA6IFtdO1xuICAgIH0sIFtoZWFkZXJHcm91cHNdKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlcnMgPSBoZWFkZXJzOyAvLyBQcm92aWRlIGEgZmxhdCBoZWFkZXIgbGlzdCBmb3IgdXRpbGl0aWVzXG5cbiAgICBnZXRJbnN0YW5jZSgpLmZsYXRIZWFkZXJzID0gaGVhZGVyR3JvdXBzLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBoZWFkZXJHcm91cCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChhbGwsIGhlYWRlckdyb3VwLmhlYWRlcnMpO1xuICAgIH0sIFtdKTtcbiAgICBsb29wSG9va3MoZ2V0SG9va3MoKS51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMsIGdldEluc3RhbmNlKCkpOyAvLyBGaWx0ZXIgY29sdW1ucyBkb3duIHRvIHZpc2libGUgb25lc1xuXG4gICAgdmFyIHZpc2libGVDb2x1bW5zRGVwID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pc1Zpc2libGU7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pZDtcbiAgICB9KS5zb3J0KCkuam9pbignXycpO1xuICAgIHZpc2libGVDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlzVmlzaWJsZTtcbiAgICAgIH0pO1xuICAgIH0sIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbdmlzaWJsZUNvbHVtbnMsIHZpc2libGVDb2x1bW5zRGVwXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS52aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zOyAvLyBIZWFkZXIgVmlzaWJpbGl0eSBpcyBuZWVkZWQgYnkgdGhpcyBwb2ludFxuXG4gICAgdmFyIF9jYWxjdWxhdGVIZWFkZXJXaWR0aCA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzKSxcbiAgICAgICAgdG90YWxDb2x1bW5zTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGhbMF0sXG4gICAgICAgIHRvdGFsQ29sdW1uc1dpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoWzFdLFxuICAgICAgICB0b3RhbENvbHVtbnNNYXhXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aFsyXTtcblxuICAgIGdldEluc3RhbmNlKCkudG90YWxDb2x1bW5zTWluV2lkdGggPSB0b3RhbENvbHVtbnNNaW5XaWR0aDtcbiAgICBnZXRJbnN0YW5jZSgpLnRvdGFsQ29sdW1uc1dpZHRoID0gdG90YWxDb2x1bW5zV2lkdGg7XG4gICAgZ2V0SW5zdGFuY2UoKS50b3RhbENvbHVtbnNNYXhXaWR0aCA9IHRvdGFsQ29sdW1uc01heFdpZHRoO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUluc3RhbmNlLCBnZXRJbnN0YW5jZSgpKSAvLyBFYWNoIG1hdGVyaWFsaXplZCBoZWFkZXIgbmVlZHMgdG8gYmUgYXNzaWduZWQgYSByZW5kZXIgZnVuY3Rpb24gYW5kIG90aGVyXG4gICAgLy8gcHJvcCBnZXR0ZXIgcHJvcGVydGllcyBoZXJlLlxuICAgIDtcbiAgICBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5mbGF0SGVhZGVycywgZ2V0SW5zdGFuY2UoKS5hbGxDb2x1bW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIC8vIEdpdmUgY29sdW1ucy9oZWFkZXJzIHJlbmRlcmluZyBwb3dlclxuICAgICAgY29sdW1uLnJlbmRlciA9IG1ha2VSZW5kZXJlcihnZXRJbnN0YW5jZSgpLCBjb2x1bW4pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0SGVhZGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEhlYWRlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0Rm9vdGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEZvb3RlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRGb290ZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaGVhZGVyR3JvdXBzLmZpbHRlcihmdW5jdGlvbiAoaGVhZGVyR3JvdXAsIGkpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgaGVhZGVycyBhbmQgaGVhZGVyR3JvdXBzIHRoYXQgZG9uJ3QgaGF2ZSB2aXNpYmxlIGNvbHVtbnNcbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycyA9IGhlYWRlckdyb3VwLmhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICB2YXIgcmVjdXJzZSA9IGZ1bmN0aW9uIHJlY3Vyc2UoaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgICAgICB9KS5sZW5ndGg7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChjb2x1bW4uaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNWaXNpYmxlO1xuICAgICAgICB9KTsgLy8gR2l2ZSBoZWFkZXJHcm91cHMgZ2V0Um93UHJvcHNcblxuICAgICAgICBpZiAoaGVhZGVyR3JvdXAuaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBoZWFkZXJHcm91cC5nZXRIZWFkZXJHcm91cFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJHcm91cFByb3BzLCB7XG4gICAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICAgIGhlYWRlckdyb3VwOiBoZWFkZXJHcm91cCxcbiAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGVhZGVyR3JvdXAuZ2V0Rm9vdGVyR3JvdXBQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Rm9vdGVyR3JvdXBQcm9wcywge1xuICAgICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgICBoZWFkZXJHcm91cDogaGVhZGVyR3JvdXAsXG4gICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSwgW2hlYWRlckdyb3VwcywgZ2V0SW5zdGFuY2UsIGdldEhvb2tzXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5mb290ZXJHcm91cHMgPSBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5oZWFkZXJHcm91cHMpLnJldmVyc2UoKTsgLy8gVGhlIHByZXBhcmVSb3cgZnVuY3Rpb24gaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkgYW5kIE1VU1QgYmUgY2FsbGVkIG9uXG4gICAgLy8gYW55IHJvd3MgdGhlIHVzZXIgd2lzaGVzIHRvIGJlIGRpc3BsYXllZC5cblxuICAgIGdldEluc3RhbmNlKCkucHJlcGFyZVJvdyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJvdy5nZXRSb3dQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Um93UHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIHJvdzogcm93XG4gICAgICB9KTsgLy8gQnVpbGQgdGhlIHZpc2libGUgY2VsbHMgZm9yIGVhY2ggcm93XG5cbiAgICAgIHJvdy5hbGxDZWxscyA9IGFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcm93LnZhbHVlc1tjb2x1bW4uaWRdO1xuICAgICAgICB2YXIgY2VsbCA9IHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTsgLy8gR2l2ZSBlYWNoIGNlbGwgYSBnZXRDZWxsUHJvcHMgYmFzZVxuXG4gICAgICAgIGNlbGwuZ2V0Q2VsbFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRDZWxsUHJvcHMsIHtcbiAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICBjZWxsOiBjZWxsXG4gICAgICAgIH0pOyAvLyBHaXZlIGVhY2ggY2VsbCBhIHJlbmRlcmVyIGZ1bmN0aW9uIChzdXBwb3J0cyBtdWx0aXBsZSByZW5kZXJlcnMpXG5cbiAgICAgICAgY2VsbC5yZW5kZXIgPSBtYWtlUmVuZGVyZXIoZ2V0SW5zdGFuY2UoKSwgY29sdW1uLCB7XG4gICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgY2VsbDogY2VsbCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgfSk7XG4gICAgICByb3cuY2VsbHMgPSB2aXNpYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gcm93LmFsbENlbGxzLmZpbmQoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICByZXR1cm4gY2VsbC5jb2x1bW4uaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gbmVlZCB0byBhcHBseSBhbnkgcm93IHNwZWNpZmljIGhvb2tzICh1c2VFeHBhbmRlZCByZXF1aXJlcyB0aGlzKVxuXG4gICAgICBsb29wSG9va3MoZ2V0SG9va3MoKS5wcmVwYXJlUm93LCByb3csIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0SW5zdGFuY2UsIGFsbENvbHVtbnMsIHZpc2libGVDb2x1bW5zXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5nZXRUYWJsZVByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUYWJsZVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuZ2V0VGFibGVCb2R5UHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRhYmxlQm9keVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUZpbmFsSW5zdGFuY2UsIGdldEluc3RhbmNlKCkpO1xuICAgIHJldHVybiBnZXRJbnN0YW5jZSgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzLCBsZWZ0KSB7XG4gICAgaWYgKGxlZnQgPT09IHZvaWQgMCkge1xuICAgICAgbGVmdCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHN1bVRvdGFsTWluV2lkdGggPSAwO1xuICAgIHZhciBzdW1Ub3RhbFdpZHRoID0gMDtcbiAgICB2YXIgc3VtVG90YWxNYXhXaWR0aCA9IDA7XG4gICAgdmFyIHN1bVRvdGFsRmxleFdpZHRoID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHN1YkhlYWRlcnMgPSBoZWFkZXIuaGVhZGVycztcbiAgICAgIGhlYWRlci50b3RhbExlZnQgPSBsZWZ0O1xuXG4gICAgICBpZiAoc3ViSGVhZGVycyAmJiBzdWJIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgX2NhbGN1bGF0ZUhlYWRlcldpZHRoMiA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhzdWJIZWFkZXJzLCBsZWZ0KSxcbiAgICAgICAgICAgIHRvdGFsTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyWzBdLFxuICAgICAgICAgICAgdG90YWxXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aDJbMV0sXG4gICAgICAgICAgICB0b3RhbE1heFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlsyXSxcbiAgICAgICAgICAgIHRvdGFsRmxleFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlszXTtcblxuICAgICAgICBoZWFkZXIudG90YWxNaW5XaWR0aCA9IHRvdGFsTWluV2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbFdpZHRoID0gdG90YWxXaWR0aDtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSB0b3RhbE1heFdpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxGbGV4V2lkdGggPSB0b3RhbEZsZXhXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlci50b3RhbE1pbldpZHRoID0gaGVhZGVyLm1pbldpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxXaWR0aCA9IE1hdGgubWluKE1hdGgubWF4KGhlYWRlci5taW5XaWR0aCwgaGVhZGVyLndpZHRoKSwgaGVhZGVyLm1heFdpZHRoKTtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSBoZWFkZXIubWF4V2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbEZsZXhXaWR0aCA9IGhlYWRlci5jYW5SZXNpemUgPyBoZWFkZXIudG90YWxXaWR0aCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWFkZXIuaXNWaXNpYmxlKSB7XG4gICAgICAgIGxlZnQgKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWluV2lkdGggKz0gaGVhZGVyLnRvdGFsTWluV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsV2lkdGggKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWF4V2lkdGggKz0gaGVhZGVyLnRvdGFsTWF4V2lkdGg7XG4gICAgICAgIHN1bVRvdGFsRmxleFdpZHRoICs9IGhlYWRlci50b3RhbEZsZXhXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW3N1bVRvdGFsTWluV2lkdGgsIHN1bVRvdGFsV2lkdGgsIHN1bVRvdGFsTWF4V2lkdGgsIHN1bVRvdGFsRmxleFdpZHRoXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oX3JlZikge1xuICAgIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgICByb3dzID0gX3JlZi5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IF9yZWYuZmxhdFJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gX3JlZi5yb3dzQnlJZCxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW4sXG4gICAgICAgIGdldFJvd0lkID0gX3JlZi5nZXRSb3dJZCxcbiAgICAgICAgZ2V0U3ViUm93cyA9IF9yZWYuZ2V0U3ViUm93cyxcbiAgICAgICAgYWNjZXNzVmFsdWVIb29rcyA9IF9yZWYuYWNjZXNzVmFsdWVIb29rcyxcbiAgICAgICAgZ2V0SW5zdGFuY2UgPSBfcmVmLmdldEluc3RhbmNlO1xuXG4gICAgLy8gQWNjZXNzIHRoZSByb3cncyBkYXRhIGNvbHVtbi1ieS1jb2x1bW5cbiAgICAvLyBXZSBkbyBpdCB0aGlzIHdheSBzbyB3ZSBjYW4gaW5jcmVtZW50YWxseSBhZGQgbWF0ZXJpYWxpemVkXG4gICAgLy8gY29sdW1ucyBhZnRlciB0aGUgZmlyc3QgcGFzcyBhbmQgYXZvaWQgZXhjZXNzaXZlIGxvb3BpbmdcbiAgICB2YXIgYWNjZXNzUm93ID0gZnVuY3Rpb24gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgZGVwdGgsIHBhcmVudCwgcGFyZW50Um93cykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UgYXJvdW5kXG4gICAgICB2YXIgb3JpZ2luYWwgPSBvcmlnaW5hbFJvdztcbiAgICAgIHZhciBpZCA9IGdldFJvd0lkKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcGFyZW50KTtcbiAgICAgIHZhciByb3cgPSByb3dzQnlJZFtpZF07IC8vIElmIHRoZSByb3cgaGFzbid0IGJlZW4gY3JlYXRlZCwgbGV0J3MgbWFrZSBpdFxuXG4gICAgICBpZiAoIXJvdykge1xuICAgICAgICByb3cgPSB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICBpbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgIGNlbGxzOiBbe31dIC8vIFRoaXMgaXMgYSBkdW1teSBjZWxsXG5cbiAgICAgICAgfTsgLy8gT3ZlcnJpZGUgY29tbW9uIGFycmF5IGZ1bmN0aW9ucyAoYW5kIHRoZSBkdW1teSBjZWxsJ3MgZ2V0Q2VsbFByb3BzIGZ1bmN0aW9uKVxuICAgICAgICAvLyB0byBzaG93IGFuIGVycm9yIGlmIGl0IGlzIGFjY2Vzc2VkIHdpdGhvdXQgY2FsbGluZyBwcmVwYXJlUm93XG5cbiAgICAgICAgcm93LmNlbGxzLm1hcCA9IHVucHJlcGFyZWRBY2Nlc3NXYXJuaW5nO1xuICAgICAgICByb3cuY2VsbHMuZmlsdGVyID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxscy5mb3JFYWNoID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxsc1swXS5nZXRDZWxsUHJvcHMgPSB1bnByZXBhcmVkQWNjZXNzV2FybmluZzsgLy8gQ3JlYXRlIHRoZSBjZWxscyBhbmQgdmFsdWVzXG5cbiAgICAgICAgcm93LnZhbHVlcyA9IHt9OyAvLyBQdXNoIHRoaXMgcm93IGludG8gdGhlIHBhcmVudFJvd3MgYXJyYXlcblxuICAgICAgICBwYXJlbnRSb3dzLnB1c2gocm93KTsgLy8gS2VlcCB0cmFjayBvZiBldmVyeSByb3cgaW4gYSBmbGF0IGFycmF5XG5cbiAgICAgICAgZmxhdFJvd3MucHVzaChyb3cpOyAvLyBBbHNvIGtlZXAgdHJhY2sgb2YgZXZlcnkgcm93IGJ5IGl0cyBJRFxuXG4gICAgICAgIHJvd3NCeUlkW2lkXSA9IHJvdzsgLy8gR2V0IHRoZSBvcmlnaW5hbCBzdWJyb3dzXG5cbiAgICAgICAgcm93Lm9yaWdpbmFsU3ViUm93cyA9IGdldFN1YlJvd3Mob3JpZ2luYWxSb3csIHJvd0luZGV4KTsgLy8gVGhlbiByZWN1cnNpdmVseSBhY2Nlc3MgdGhlbVxuXG4gICAgICAgIGlmIChyb3cub3JpZ2luYWxTdWJSb3dzKSB7XG4gICAgICAgICAgdmFyIHN1YlJvd3MgPSBbXTtcbiAgICAgICAgICByb3cub3JpZ2luYWxTdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3csIHN1YlJvd3MpO1xuICAgICAgICAgIH0pOyAvLyBLZWVwIHRoZSBuZXcgc3ViUm93cyBhcnJheSBvbiB0aGUgcm93XG5cbiAgICAgICAgICByb3cuc3ViUm93cyA9IHN1YlJvd3M7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocm93LnN1YlJvd3MpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJvdyBleGlzdHMsIHRoZW4gaXQncyBhbHJlYWR5IGJlZW4gYWNjZXNzZWRcbiAgICAgICAgLy8gS2VlcCByZWN1cnNpbmcsIGJ1dCBkb24ndCB3b3JyeSBhYm91dCBwYXNzaW5nIHRoZVxuICAgICAgICAvLyBhY2N1bWxhdG9yIGFycmF5ICh0aG9zZSByb3dzIGFscmVhZHkgZXhpc3QpXG4gICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3cpO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gSWYgdGhlIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3IsIHVzZSBpdCB0byBnZXQgYSB2YWx1ZVxuXG5cbiAgICAgIGlmIChjb2x1bW4uYWNjZXNzb3IpIHtcbiAgICAgICAgcm93LnZhbHVlc1tjb2x1bW4uaWRdID0gY29sdW1uLmFjY2Vzc29yKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcm93LCBwYXJlbnRSb3dzLCBkYXRhKTtcbiAgICAgIH0gLy8gQWxsb3cgcGx1Z2lucyB0byBtYW5pcHVsYXRlIHRoZSBjb2x1bW4gdmFsdWVcblxuXG4gICAgICByb3cudmFsdWVzW2NvbHVtbi5pZF0gPSByZWR1Y2VIb29rcyhhY2Nlc3NWYWx1ZUhvb2tzLCByb3cudmFsdWVzW2NvbHVtbi5pZF0sIHtcbiAgICAgICAgcm93OiByb3csXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAob3JpZ2luYWxSb3csIHJvd0luZGV4KSB7XG4gICAgICByZXR1cm4gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgMCwgdW5kZWZpbmVkLCByb3dzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbnMucmVzZXRFeHBhbmRlZCA9ICdyZXNldEV4cGFuZGVkJztcbiAgYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCA9ICd0b2dnbGVSb3dFeHBhbmRlZCc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkID0gJ3RvZ2dsZUFsbFJvd3NFeHBhbmRlZCc7XG4gIHZhciB1c2VFeHBhbmRlZCA9IGZ1bmN0aW9uIHVzZUV4cGFuZGVkKGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQxKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDEpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93KTtcbiAgfTtcbiAgdXNlRXhwYW5kZWQucGx1Z2luTmFtZSA9ICd1c2VFeHBhbmRlZCc7XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCgpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgQWxsIFJvd3MgRXhwYW5kZWQnXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIHJvdyA9IF9yZWYyLnJvdztcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQoKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIFJvdyBFeHBhbmRlZCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQxKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGV4cGFuZGVkOiB7fVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldEV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGV4cGFuZGVkOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZXhwYW5kZWQgfHwge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVBbGxSb3dzRXhwYW5kZWQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IGluc3RhbmNlLmlzQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQ7XG4gICAgICB2YXIgZXhwYW5kQWxsID0gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogIWlzQWxsUm93c0V4cGFuZGVkO1xuXG4gICAgICBpZiAoZXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBleHBhbmRlZCA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3dzQnlJZCkuZm9yRWFjaChmdW5jdGlvbiAocm93SWQpIHtcbiAgICAgICAgICBleHBhbmRlZFtyb3dJZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBleHBhbmRlZDoge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCkge1xuICAgICAgdmFyIGlkID0gYWN0aW9uLmlkLFxuICAgICAgICAgIHNldEV4cGFuZGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGV4aXN0cyA9IHN0YXRlLmV4cGFuZGVkW2lkXTtcbiAgICAgIHZhciBzaG91bGRFeGlzdCA9IHR5cGVvZiBzZXRFeHBhbmRlZCAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRFeHBhbmRlZCA6ICFleGlzdHM7XG5cbiAgICAgIGlmICghZXhpc3RzICYmIHNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBfZXh0ZW5kcyh7fSwgc3RhdGUuZXhwYW5kZWQsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2lkXSA9IHRydWUsIF9leHRlbmRzMikpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChleGlzdHMgJiYgIXNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfc3RhdGUkZXhwYW5kZWQgPSBzdGF0ZS5leHBhbmRlZCxcbiAgICAgICAgICAgIF8gPSBfc3RhdGUkZXhwYW5kZWRbaWRdLFxuICAgICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9zdGF0ZSRleHBhbmRlZCwgW2lkXS5tYXAoX3RvUHJvcGVydHlLZXkpKTtcblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZXhwYW5kZWQ6IHJlc3RcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkMShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9IGluc3RhbmNlLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBtYW51YWxFeHBhbmRlZEtleSA9IF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9PT0gdm9pZCAwID8gJ2V4cGFuZGVkJyA6IF9pbnN0YW5jZSRtYW51YWxFeHBhbixcbiAgICAgICAgX2luc3RhbmNlJHBhZ2luYXRlRXhwID0gaW5zdGFuY2UucGFnaW5hdGVFeHBhbmRlZFJvd3MsXG4gICAgICAgIHBhZ2luYXRlRXhwYW5kZWRSb3dzID0gX2luc3RhbmNlJHBhZ2luYXRlRXhwID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHBhZ2luYXRlRXhwLFxuICAgICAgICBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPSBpbnN0YW5jZS5leHBhbmRTdWJSb3dzLFxuICAgICAgICBleHBhbmRTdWJSb3dzID0gX2luc3RhbmNlJGV4cGFuZFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGV4cGFuZFN1YlJvLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPSBpbnN0YW5jZS5hdXRvUmVzZXRFeHBhbmRlZCxcbiAgICAgICAgYXV0b1Jlc2V0RXhwYW5kZWQgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0RXgsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICBleHBhbmRlZCA9IGluc3RhbmNlLnN0YXRlLmV4cGFuZGVkLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlU29ydEJ5JywgJ3VzZUdyb3VwQnknLCAndXNlUGl2b3RDb2x1bW5zJywgJ3VzZUdsb2JhbEZpbHRlciddLCAndXNlRXhwYW5kZWQnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RXhwYW5kZWQgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0RXhwYW5kZWQpO1xuICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMocm93c0J5SWQpLmxlbmd0aCAmJiBPYmplY3Qua2V5cyhleHBhbmRlZCkubGVuZ3RoKTtcblxuICAgIGlmIChpc0FsbFJvd3NFeHBhbmRlZCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIWV4cGFuZGVkW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c0V4cGFuZGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSAvLyBCeXBhc3MgYW55IGVmZmVjdHMgZnJvbSBmaXJpbmcgd2hlbiB0aGlzIGNoYW5nZXNcblxuXG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0RXhwYW5kZWQoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldEV4cGFuZGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGF0YV0pO1xuICAgIHZhciB0b2dnbGVSb3dFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpZCwgdmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciB0b2dnbGVBbGxSb3dzRXhwYW5kZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBleHBhbmRlZFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYWdpbmF0ZUV4cGFuZGVkUm93cykge1xuICAgICAgICByZXR1cm4gZXhwYW5kUm93cyhyb3dzLCB7XG4gICAgICAgICAgbWFudWFsRXhwYW5kZWRLZXk6IG1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbcGFnaW5hdGVFeHBhbmRlZFJvd3MsIHJvd3MsIG1hbnVhbEV4cGFuZGVkS2V5LCBleHBhbmRlZCwgZXhwYW5kU3ViUm93c10pO1xuICAgIHZhciBleHBhbmRlZERlcHRoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluZEV4cGFuZGVkRGVwdGgoZXhwYW5kZWQpO1xuICAgIH0sIFtleHBhbmRlZF0pO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgdmFyIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwcmVFeHBhbmRlZFJvd3M6IHJvd3MsXG4gICAgICBleHBhbmRlZFJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIHJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIGV4cGFuZGVkRGVwdGg6IGV4cGFuZGVkRGVwdGgsXG4gICAgICBpc0FsbFJvd3NFeHBhbmRlZDogaXNBbGxSb3dzRXhwYW5kZWQsXG4gICAgICB0b2dnbGVSb3dFeHBhbmRlZDogdG9nZ2xlUm93RXhwYW5kZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzRXhwYW5kZWQ6IHRvZ2dsZUFsbFJvd3NFeHBhbmRlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyhyb3csIF9yZWYzKSB7XG4gICAgdmFyIGdldEhvb2tzID0gX3JlZjMuaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGluc3RhbmNlID0gX3JlZjMuaW5zdGFuY2U7XG5cbiAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUm93RXhwYW5kZWQocm93LmlkLCBzZXQpO1xuICAgIH07XG5cbiAgICByb3cuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgcm93OiByb3dcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRFeHBhbmRlZERlcHRoKGV4cGFuZGVkKSB7XG4gICAgdmFyIG1heERlcHRoID0gMDtcbiAgICBPYmplY3Qua2V5cyhleHBhbmRlZCkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHZhciBzcGxpdElkID0gaWQuc3BsaXQoJy4nKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIHNwbGl0SWQubGVuZ3RoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF4RGVwdGg7XG4gIH1cblxuICB2YXIgdGV4dCA9IGZ1bmN0aW9uIHRleHQocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJvd3MgPSByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFN0cmluZyhmaWx0ZXJWYWx1ZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93cztcbiAgfTtcblxuICB0ZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dCA9IGZ1bmN0aW9uIGV4YWN0VGV4dChyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXhhY3RUZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dENhc2UgPSBmdW5jdGlvbiBleGFjdFRleHRDYXNlKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocm93VmFsdWUpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpIDogdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0VGV4dENhc2UuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyhyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlcy5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlc0FsbCA9IGZ1bmN0aW9uIGluY2x1ZGVzQWxsKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd1ZhbHVlLmluY2x1ZGVzKHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNBbGwuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNTb21lID0gZnVuY3Rpb24gaW5jbHVkZXNTb21lKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gcm93VmFsdWUuaW5jbHVkZXModmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlc1NvbWUuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNWYWx1ZSA9IGZ1bmN0aW9uIGluY2x1ZGVzVmFsdWUocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWUuaW5jbHVkZXMocm93VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNWYWx1ZS5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBleGFjdCA9IGZ1bmN0aW9uIGV4YWN0KHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09PSBmaWx0ZXJWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xuICB9O1xuXG4gIHZhciBlcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09IGZpbHRlclZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXF1YWxzLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbCA9PSBudWxsO1xuICB9O1xuXG4gIHZhciBiZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2Vlbihyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgdmFyIF9yZWYgPSBmaWx0ZXJWYWx1ZSB8fCBbXSxcbiAgICAgICAgbWluID0gX3JlZlswXSxcbiAgICAgICAgbWF4ID0gX3JlZlsxXTtcblxuICAgIG1pbiA9IHR5cGVvZiBtaW4gPT09ICdudW1iZXInID8gbWluIDogLUluZmluaXR5O1xuICAgIG1heCA9IHR5cGVvZiBtYXggPT09ICdudW1iZXInID8gbWF4IDogSW5maW5pdHk7XG5cbiAgICBpZiAobWluID4gbWF4KSB7XG4gICAgICB2YXIgdGVtcCA9IG1pbjtcbiAgICAgIG1pbiA9IG1heDtcbiAgICAgIG1heCA9IHRlbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSA+PSBtaW4gJiYgcm93VmFsdWUgPD0gbWF4O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgYmV0d2Vlbi5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8IHR5cGVvZiB2YWxbMF0gIT09ICdudW1iZXInICYmIHR5cGVvZiB2YWxbMV0gIT09ICdudW1iZXInO1xuICB9O1xuXG4gIHZhciBmaWx0ZXJUeXBlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdGV4dDogdGV4dCxcbiAgICBleGFjdFRleHQ6IGV4YWN0VGV4dCxcbiAgICBleGFjdFRleHRDYXNlOiBleGFjdFRleHRDYXNlLFxuICAgIGluY2x1ZGVzOiBpbmNsdWRlcyxcbiAgICBpbmNsdWRlc0FsbDogaW5jbHVkZXNBbGwsXG4gICAgaW5jbHVkZXNTb21lOiBpbmNsdWRlc1NvbWUsXG4gICAgaW5jbHVkZXNWYWx1ZTogaW5jbHVkZXNWYWx1ZSxcbiAgICBleGFjdDogZXhhY3QsXG4gICAgZXF1YWxzOiBlcXVhbHMsXG4gICAgYmV0d2VlbjogYmV0d2VlblxuICB9KTtcblxuICBhY3Rpb25zLnJlc2V0RmlsdGVycyA9ICdyZXNldEZpbHRlcnMnO1xuICBhY3Rpb25zLnNldEZpbHRlciA9ICdzZXRGaWx0ZXInO1xuICBhY3Rpb25zLnNldEFsbEZpbHRlcnMgPSAnc2V0QWxsRmlsdGVycyc7XG4gIHZhciB1c2VGaWx0ZXJzID0gZnVuY3Rpb24gdXNlRmlsdGVycyhob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDIpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMik7XG4gIH07XG4gIHVzZUZpbHRlcnMucGx1Z2luTmFtZSA9ICd1c2VGaWx0ZXJzJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJDIoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZmlsdGVyczogW11cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRGaWx0ZXJzKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGZpbHRlcnM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5maWx0ZXJzIHx8IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0RmlsdGVyKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBhY3Rpb24uZmlsdGVyVmFsdWU7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC1UYWJsZTogQ291bGQgbm90IGZpbmQgYSBjb2x1bW4gd2l0aCBpZDogXCIgKyBjb2x1bW5JZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoY29sdW1uLmZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgcHJldmlvdXNmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgcHJldmlvdXNmaWx0ZXIgJiYgcHJldmlvdXNmaWx0ZXIudmFsdWUpOyAvL1xuXG4gICAgICBpZiAoc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJNZXRob2QuYXV0b1JlbW92ZSwgbmV3RmlsdGVyLCBjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgIT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldmlvdXNmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBpZiAoZC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBmaWx0ZXJzOiBbXS5jb25jYXQoc3RhdGUuZmlsdGVycywgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICB9XSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRBbGxGaWx0ZXJzKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IGFjdGlvbi5maWx0ZXJzO1xuICAgICAgdmFyIF9hbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgICBfdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICBmaWx0ZXJzOiBmdW5jdGlvbmFsVXBkYXRlKGZpbHRlcnMsIHN0YXRlLmZpbHRlcnMpLmZpbHRlcihmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbiA9IF9hbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBmaWx0ZXIuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGNvbHVtbi5maWx0ZXIsIF91c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmIChzaG91bGRBdXRvUmVtb3ZlRmlsdGVyKGZpbHRlck1ldGhvZC5hdXRvUmVtb3ZlLCBmaWx0ZXIudmFsdWUsIGNvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDIoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIG1hbnVhbEZpbHRlcnMgPSBpbnN0YW5jZS5tYW51YWxGaWx0ZXJzLFxuICAgICAgICBfaW5zdGFuY2UkZGVmYXVsdENhbkYgPSBpbnN0YW5jZS5kZWZhdWx0Q2FuRmlsdGVyLFxuICAgICAgICBkZWZhdWx0Q2FuRmlsdGVyID0gX2luc3RhbmNlJGRlZmF1bHRDYW5GID09PSB2b2lkIDAgPyBmYWxzZSA6IF9pbnN0YW5jZSRkZWZhdWx0Q2FuRixcbiAgICAgICAgZGlzYWJsZUZpbHRlcnMgPSBpbnN0YW5jZS5kaXNhYmxlRmlsdGVycyxcbiAgICAgICAgZmlsdGVycyA9IGluc3RhbmNlLnN0YXRlLmZpbHRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRGaSA9IGluc3RhbmNlLmF1dG9SZXNldEZpbHRlcnMsXG4gICAgICAgIGF1dG9SZXNldEZpbHRlcnMgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RmkgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Rmk7XG4gICAgdmFyIHNldEZpbHRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRGaWx0ZXIsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0QWxsRmlsdGVycyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChmaWx0ZXJzKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0QWxsRmlsdGVycyxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc1xuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgICBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyID0gY29sdW1uLmRlZmF1bHRDYW5GaWx0ZXIsXG4gICAgICAgICAgY29sdW1uRGlzYWJsZUZpbHRlcnMgPSBjb2x1bW4uZGlzYWJsZUZpbHRlcnM7IC8vIERldGVybWluZSBpZiBhIGNvbHVtbiBpcyBmaWx0ZXJhYmxlXG5cbiAgICAgIGNvbHVtbi5jYW5GaWx0ZXIgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyLCBkZWZhdWx0Q2FuRmlsdGVyLCBmYWxzZSk7IC8vIFByb3ZpZGUgdGhlIGNvbHVtbiBhIHdheSBvZiB1cGRhdGluZyB0aGUgZmlsdGVyIHZhbHVlXG5cbiAgICAgIGNvbHVtbi5zZXRGaWx0ZXIgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoY29sdW1uLmlkLCB2YWwpO1xuICAgICAgfTsgLy8gUHJvdmlkZSB0aGUgY3VycmVudCBmaWx0ZXIgdmFsdWUgdG8gdGhlIGNvbHVtbiBmb3JcbiAgICAgIC8vIGNvbnZlbmllbmNlXG5cblxuICAgICAgdmFyIGZvdW5kID0gZmlsdGVycy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmZpbHRlclZhbHVlID0gZm91bmQgJiYgZm91bmQudmFsdWU7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxGaWx0ZXJzIHx8ICFmaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZmlsdGVyZWRSb3dzQnlJZCA9IHt9OyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKHJvd3MsIGRlcHRoKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZGVwdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpbHRlcmVkUm93cyA9IHJvd3M7XG4gICAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcnMucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZFNvRmFyLCBfcmVmKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbklkID0gX3JlZi5pZCxcbiAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlcnMgY29sdW1uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkU29GYXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZpbHRlck1ldGhvZCA9IGdldEZpbHRlck1ldGhvZChjb2x1bW4uZmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmICghZmlsdGVyTWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhIHZhbGlkICdjb2x1bW4uZmlsdGVyJyBmb3IgY29sdW1uIHdpdGggdGhlIElEOiBcIiArIGNvbHVtbi5pZCArIFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH0gLy8gUGFzcyB0aGUgcm93cywgaWQsIGZpbHRlclZhbHVlIGFuZCBjb2x1bW4gdG8gdGhlIGZpbHRlck1ldGhvZFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgZmlsdGVyZWQgcm93cyBiYWNrXG5cblxuICAgICAgICAgIGNvbHVtbi5maWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRTb0ZhciwgW2NvbHVtbklkXSwgZmlsdGVyVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBjb2x1bW4uZmlsdGVyZWRSb3dzO1xuICAgICAgICB9LCByb3dzKTsgLy8gQXBwbHkgdGhlIGZpbHRlciB0byBhbnkgc3ViUm93c1xuICAgICAgICAvLyBXZSB0ZWNobmljYWxseSBjb3VsZCBkbyB0aGlzIHJlY3Vyc2l2ZWx5IGluIHRoZSBhYm92ZSBsb29wLFxuICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBzZXZlcmVseSBoaW5kZXIgdGhlIEFQSSBmb3IgdGhlIHVzZXIsIHNpbmNlIHRoZXlcbiAgICAgICAgLy8gd291bGQgYmUgcmVxdWlyZWQgdG8gZG8gdGhhdCByZWN1cnNpb24gaW4gc29tZSBzY2VuYXJpb3NcblxuICAgICAgICBmaWx0ZXJlZFJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgZmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgZmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93O1xuXG4gICAgICAgICAgaWYgKCFyb3cuc3ViUm93cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdy5zdWJSb3dzID0gcm93LnN1YlJvd3MgJiYgcm93LnN1YlJvd3MubGVuZ3RoID4gMCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSkgOiByb3cuc3ViUm93cztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW2ZpbHRlclJvd3Mocm93cyksIGZpbHRlcmVkRmxhdFJvd3MsIGZpbHRlcmVkUm93c0J5SWRdO1xuICAgIH0sIFttYW51YWxGaWx0ZXJzLCBmaWx0ZXJzLCByb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGFsbENvbHVtbnMsIHVzZXJGaWx0ZXJUeXBlc10pLFxuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBmaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE5vdyB0aGF0IGVhY2ggZmlsdGVyZWQgY29sdW1uIGhhcyBpdCdzIHBhcnRpYWxseSBmaWx0ZXJlZCByb3dzLFxuICAgICAgLy8gbGV0cyBhc3NpZ24gdGhlIGZpbmFsIGZpbHRlcmVkIHJvd3MgdG8gYWxsIG9mIHRoZSBvdGhlciBjb2x1bW5zXG4gICAgICB2YXIgbm9uRmlsdGVyZWRDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gIWZpbHRlcnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW4uaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIFRoaXMgZXNzZW50aWFsbHkgZW5hYmxlcyBmYWNldGVkIGZpbHRlciBvcHRpb25zIHRvIGJlIGJ1aWx0IGVhc2lseVxuICAgICAgLy8gdXNpbmcgZXZlcnkgY29sdW1uJ3MgcHJlRmlsdGVyZWRSb3dzIHZhbHVlXG5cbiAgICAgIG5vbkZpbHRlcmVkQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgICAgY29sdW1uLmZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgIH0pO1xuICAgIH0sIFtmaWx0ZXJlZFJvd3MsIGZpbHRlcnMsIGFsbENvbHVtbnNdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RmlsdGVycyA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRGaWx0ZXJzKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRGaWx0ZXJzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRGaWx0ZXJzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgbWFudWFsRmlsdGVycyA/IG51bGwgOiBkYXRhXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcHJlRmlsdGVyZWRSb3dzOiByb3dzLFxuICAgICAgcHJlRmlsdGVyZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBwcmVGaWx0ZXJlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGZpbHRlcmVkUm93czogZmlsdGVyZWRSb3dzLFxuICAgICAgZmlsdGVyZWRGbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIGZpbHRlcmVkUm93c0J5SWQ6IGZpbHRlcmVkUm93c0J5SWQsXG4gICAgICByb3dzOiBmaWx0ZXJlZFJvd3MsXG4gICAgICBmbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiBmaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgc2V0RmlsdGVyOiBzZXRGaWx0ZXIsXG4gICAgICBzZXRBbGxGaWx0ZXJzOiBzZXRBbGxGaWx0ZXJzXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyID0gJ3Jlc2V0R2xvYmFsRmlsdGVyJztcbiAgYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIgPSAnc2V0R2xvYmFsRmlsdGVyJztcbiAgdmFyIHVzZUdsb2JhbEZpbHRlciA9IGZ1bmN0aW9uIHVzZUdsb2JhbEZpbHRlcihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDMpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMyk7XG4gIH07XG4gIHVzZUdsb2JhbEZpbHRlci5wbHVnaW5OYW1lID0gJ3VzZUdsb2JhbEZpbHRlcic7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQzKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdsb2JhbEZpbHRlcjogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLmdsb2JhbEZpbHRlciB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIpIHtcbiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGFjdGlvbi5maWx0ZXJWYWx1ZTtcbiAgICAgIHZhciB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS51c2VyRmlsdGVyVHlwZXM7XG4gICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGluc3RhbmNlLmdsb2JhbEZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgc3RhdGUuZ2xvYmFsRmlsdGVyKTsgLy9cblxuICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyTWV0aG9kLmF1dG9SZW1vdmUsIG5ld0ZpbHRlcikpIHtcbiAgICAgICAgdmFyIGdsb2JhbEZpbHRlciA9IHN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgICAgIHN0YXRlV2l0aG91dEdsb2JhbEZpbHRlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHN0YXRlLCBbXCJnbG9iYWxGaWx0ZXJcIl0pO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVdpdGhvdXRHbG9iYWxGaWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyOiBuZXdGaWx0ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDMoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IGluc3RhbmNlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgbWFudWFsR2xvYmFsRmlsdGVyID0gaW5zdGFuY2UubWFudWFsR2xvYmFsRmlsdGVyLFxuICAgICAgICBnbG9iYWxGaWx0ZXJWYWx1ZSA9IGluc3RhbmNlLnN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEdsID0gaW5zdGFuY2UuYXV0b1Jlc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgICBhdXRvUmVzZXRHbG9iYWxGaWx0ZXIgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wsXG4gICAgICAgIGRpc2FibGVHbG9iYWxGaWx0ZXIgPSBpbnN0YW5jZS5kaXNhYmxlR2xvYmFsRmlsdGVyO1xuICAgIHZhciBzZXRHbG9iYWxGaWx0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7IC8vIFRPRE86IENyZWF0ZSBhIGZpbHRlciBjYWNoZSBmb3IgaW5jcmVtZW50YWwgaGlnaCBzcGVlZCBtdWx0aS1maWx0ZXJpbmdcbiAgICAvLyBUaGlzIGdldHMgcHJldHR5IGNvbXBsaWNhdGVkIHByZXR0eSBmYXN0LCBzaW5jZSB5b3UgaGF2ZSB0byBtYWludGFpbiBhXG4gICAgLy8gY2FjaGUgZm9yIGVhY2ggcm93IGdyb3VwICh0b3AtbGV2ZWwgcm93cywgYW5kIGVhY2ggcm93J3MgcmVjdXJzaXZlIHN1YnJvd3MpXG4gICAgLy8gVGhpcyB3b3VsZCBtYWtlIG11bHRpLWZpbHRlcmluZyBhIGxvdCBmYXN0ZXIgdGhvdWdoLiBUb28gZmFyP1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR2xvYmFsRmlsdGVyIHx8IHR5cGVvZiBnbG9iYWxGaWx0ZXJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlsdGVyZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIGZpbHRlcmVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgaWYgKCFmaWx0ZXJNZXRob2QpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IGZpbmQgYSB2YWxpZCAnZ2xvYmFsRmlsdGVyJyBvcHRpb24uXCIpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cblxuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIGNvbHVtbkRpc2FibGVHbG9iYWxGaWx0ZXIgPSBjb2x1bW4uZGlzYWJsZUdsb2JhbEZpbHRlcjtcbiAgICAgICAgY29sdW1uLmNhbkZpbHRlciA9IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlR2xvYmFsRmlsdGVyID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHbG9iYWxGaWx0ZXIgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBmaWx0ZXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmNhbkZpbHRlciA9PT0gdHJ1ZTtcbiAgICAgIH0pOyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKGZpbHRlcmVkUm93cykge1xuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRSb3dzLCBmaWx0ZXJhYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSksIGdsb2JhbEZpbHRlclZhbHVlKTtcbiAgICAgICAgZmlsdGVyZWRSb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIGZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICAgIGZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvdztcbiAgICAgICAgICByb3cuc3ViUm93cyA9IHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MpIDogcm93LnN1YlJvd3M7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtmaWx0ZXJSb3dzKHJvd3MpLCBmaWx0ZXJlZEZsYXRSb3dzLCBmaWx0ZXJlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR2xvYmFsRmlsdGVyLCBnbG9iYWxGaWx0ZXJWYWx1ZSwgZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMsIGFsbENvbHVtbnMsIHJvd3MsIGZsYXRSb3dzLCByb3dzQnlJZCwgZGlzYWJsZUdsb2JhbEZpbHRlcl0pLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldEdsb2JhbEZpbHRlcik7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRHbG9iYWxGaWx0ZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxHbG9iYWxGaWx0ZXIgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkUm93czogcm93cyxcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGZsYXRSb3dzLFxuICAgICAgcHJlR2xvYmFsRmlsdGVyZWRSb3dzQnlJZDogcm93c0J5SWQsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3M6IGdsb2JhbEZpbHRlcmVkUm93cyxcbiAgICAgIGdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkOiBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgcm93czogZ2xvYmFsRmlsdGVyZWRSb3dzLFxuICAgICAgZmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ2xvYmFsRmlsdGVyZWRSb3dzQnlJZCxcbiAgICAgIHNldEdsb2JhbEZpbHRlcjogc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgZGlzYWJsZUdsb2JhbEZpbHRlcjogZGlzYWJsZUdsb2JhbEZpbHRlclxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3VtKHZhbHVlcywgYWdncmVnYXRlZFZhbHVlcykge1xuICAgIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3QgYWRkIHRoZSBhZ2dyZWdhdGlvbnMgdG9nZXRoZXIgaW5zdGVhZCBvZlxuICAgIC8vIHByb2Nlc3MgbGVhZiBub2RlcyBpbmRpdmlkdWFsbHlcbiAgICByZXR1cm4gYWdncmVnYXRlZFZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgbmV4dCkge1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgbmV4dCA9PT0gJ251bWJlcicgPyBuZXh0IDogMCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgZnVuY3Rpb24gbWluKHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW47XG4gIH1cbiAgZnVuY3Rpb24gbWF4KHZhbHVlcykge1xuICAgIHZhciBtYXggPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtYXg7XG4gIH1cbiAgZnVuY3Rpb24gbWluTWF4KHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YXIgbWF4ID0gdmFsdWVzWzBdIHx8IDA7XG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1pbiArIFwiLi5cIiArIG1heDtcbiAgfVxuICBmdW5jdGlvbiBhdmVyYWdlKHZhbHVlcykge1xuICAgIHJldHVybiBzdW0obnVsbCwgdmFsdWVzKSAvIHZhbHVlcy5sZW5ndGg7XG4gIH1cbiAgZnVuY3Rpb24gbWVkaWFuKHZhbHVlcykge1xuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgIHZhciBudW1zID0gW10uY29uY2F0KHZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoICUgMiAhPT0gMCA/IG51bXNbbWlkXSA6IChudW1zW21pZCAtIDFdICsgbnVtc1ttaWRdKSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlKHZhbHVlcykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKS52YWx1ZXMoKSk7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlQ291bnQodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKS5zaXplO1xuICB9XG4gIGZ1bmN0aW9uIGNvdW50KHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9XG5cbiAgdmFyIGFnZ3JlZ2F0aW9ucyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgc3VtOiBzdW0sXG4gICAgbWluOiBtaW4sXG4gICAgbWF4OiBtYXgsXG4gICAgbWluTWF4OiBtaW5NYXgsXG4gICAgYXZlcmFnZTogYXZlcmFnZSxcbiAgICBtZWRpYW46IG1lZGlhbixcbiAgICB1bmlxdWU6IHVuaXF1ZSxcbiAgICB1bmlxdWVDb3VudDogdW5pcXVlQ291bnQsXG4gICAgY291bnQ6IGNvdW50XG4gIH0pO1xuXG4gIHZhciBlbXB0eUFycmF5ID0gW107XG4gIHZhciBlbXB0eU9iamVjdCA9IHt9OyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldEdyb3VwQnkgPSAncmVzZXRHcm91cEJ5JztcbiAgYWN0aW9ucy5zZXRHcm91cEJ5ID0gJ3NldEdyb3VwQnknO1xuICBhY3Rpb25zLnRvZ2dsZUdyb3VwQnkgPSAndG9nZ2xlR3JvdXBCeSc7XG4gIHZhciB1c2VHcm91cEJ5ID0gZnVuY3Rpb24gdXNlR3JvdXBCeShob29rcykge1xuICAgIGhvb2tzLmdldEdyb3VwQnlUb2dnbGVQcm9wcyA9IFtkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ0KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgICB9KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1ucy5wdXNoKHZpc2libGVDb2x1bW5zKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDQpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDEpO1xuICB9O1xuICB1c2VHcm91cEJ5LnBsdWdpbk5hbWUgPSAndXNlR3JvdXBCeSc7XG5cbiAgdmFyIGRlZmF1bHRHZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmMi5oZWFkZXI7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogaGVhZGVyLmNhbkdyb3VwQnkgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZUdyb3VwQnkoKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGhlYWRlci5jYW5Hcm91cEJ5ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgR3JvdXBCeSdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ0KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGdyb3VwQnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R3JvdXBCeSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncm91cEJ5OiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZ3JvdXBCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEdyb3VwQnkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVHcm91cEJ5KSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgc2V0R3JvdXBCeSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZEdyb3VwQnkgPSB0eXBlb2Ygc2V0R3JvdXBCeSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRHcm91cEJ5IDogIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoY29sdW1uSWQpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRHcm91cEJ5KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncm91cEJ5OiBbXS5jb25jYXQoc3RhdGUuZ3JvdXBCeSwgW2NvbHVtbklkXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogc3RhdGUuZ3JvdXBCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyhjb2x1bW5zLCBfcmVmMykge1xuICAgIHZhciBncm91cEJ5ID0gX3JlZjMuaW5zdGFuY2Uuc3RhdGUuZ3JvdXBCeTtcbiAgICAvLyBTb3J0IGdyb3VwZWQgY29sdW1ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbiBsaXN0XG4gICAgLy8gYmVmb3JlIHRoZSBoZWFkZXJzIGFyZSBidWlsdFxuICAgIHZhciBncm91cEJ5Q29sdW1ucyA9IGdyb3VwQnkubWFwKGZ1bmN0aW9uIChnKSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5pZCA9PT0gZztcbiAgICAgIH0pO1xuICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICB2YXIgbm9uR3JvdXBCeUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gIWdyb3VwQnkuaW5jbHVkZXMoY29sLmlkKTtcbiAgICB9KTtcbiAgICBjb2x1bW5zID0gW10uY29uY2F0KGdyb3VwQnlDb2x1bW5zLCBub25Hcm91cEJ5Q29sdW1ucyk7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc0dyb3VwZWQgPSBncm91cEJ5LmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4uZ3JvdXBlZEluZGV4ID0gZ3JvdXBCeS5pbmRleE9mKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICB2YXIgZGVmYXVsdFVzZXJBZ2dyZWdhdGlvbnMgPSB7fTtcblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ0KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZmxhdFJvd3MgPSBpbnN0YW5jZS5mbGF0Um93cyxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIF9pbnN0YW5jZSRncm91cEJ5Rm4gPSBpbnN0YW5jZS5ncm91cEJ5Rm4sXG4gICAgICAgIGdyb3VwQnlGbiA9IF9pbnN0YW5jZSRncm91cEJ5Rm4gPT09IHZvaWQgMCA/IGRlZmF1bHRHcm91cEJ5Rm4gOiBfaW5zdGFuY2UkZ3JvdXBCeUZuLFxuICAgICAgICBtYW51YWxHcm91cEJ5ID0gaW5zdGFuY2UubWFudWFsR3JvdXBCeSxcbiAgICAgICAgX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID0gaW5zdGFuY2UuYWdncmVnYXRpb25zLFxuICAgICAgICB1c2VyQWdncmVnYXRpb25zID0gX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID09PSB2b2lkIDAgPyBkZWZhdWx0VXNlckFnZ3JlZ2F0aW9ucyA6IF9pbnN0YW5jZSRhZ2dyZWdhdGlvbixcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGdyb3VwQnkgPSBpbnN0YW5jZS5zdGF0ZS5ncm91cEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0R3IgPSBpbnN0YW5jZS5hdXRvUmVzZXRHcm91cEJ5LFxuICAgICAgICBhdXRvUmVzZXRHcm91cEJ5ID0gX2luc3RhbmNlJGF1dG9SZXNldEdyID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldEdyLFxuICAgICAgICBkaXNhYmxlR3JvdXBCeSA9IGluc3RhbmNlLmRpc2FibGVHcm91cEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuR3JvdXBCeSA9IGluc3RhbmNlLmRlZmF1bHRDYW5Hcm91cEJ5LFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQ29sdW1uT3JkZXInLCAndXNlRmlsdGVycyddLCAndXNlR3JvdXBCeScpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uR3JvdXBCeSA9IGNvbHVtbi5kZWZhdWx0R3JvdXBCeSxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlR3JvdXBCeSA9IGNvbHVtbi5kaXNhYmxlR3JvdXBCeTtcbiAgICAgIGNvbHVtbi5jYW5Hcm91cEJ5ID0gYWNjZXNzb3IgPyBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhbkdyb3VwQnksIGNvbHVtbkRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpIDogZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbi5jYW5Hcm91cEJ5LCBkZWZhdWx0Q29sdW1uR3JvdXBCeSwgZGVmYXVsdENhbkdyb3VwQnksIGZhbHNlKTtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Hcm91cEJ5KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVHcm91cEJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVHcm91cEJ5KGNvbHVtbi5pZCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbi5BZ2dyZWdhdGVkID0gY29sdW1uLkFnZ3JlZ2F0ZWQgfHwgY29sdW1uLkNlbGw7XG4gICAgfSk7XG4gICAgdmFyIHRvZ2dsZUdyb3VwQnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoY29sdW1uSWQsIHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlR3JvdXBCeSxcbiAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBzZXRHcm91cEJ5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0R3JvdXBCeSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIGhlYWRlci5nZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEdyb3VwQnlUb2dnbGVQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR3JvdXBCeSB8fCAhZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGVtcHR5QXJyYXksIGVtcHR5T2JqZWN0LCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfSAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdCBvZiBmaWx0ZXJlZCBjb2x1bW5zIGV4aXN0XG5cblxuICAgICAgdmFyIGV4aXN0aW5nR3JvdXBCeSA9IGdyb3VwQnkuZmlsdGVyKGZ1bmN0aW9uIChnKSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IGc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIEZpbmQgdGhlIGNvbHVtbnMgdGhhdCBjYW4gb3IgYXJlIGFnZ3JlZ2F0aW5nXG4gICAgICAvLyBVc2VzIGVhY2ggY29sdW1uIHRvIGFnZ3JlZ2F0ZSByb3dzIGludG8gYSBzaW5nbGUgdmFsdWVcblxuICAgICAgdmFyIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyA9IGZ1bmN0aW9uIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyhsZWFmUm93cywgZ3JvdXBlZFJvd3MsIGRlcHRoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAvLyBEb24ndCBhZ2dyZWdhdGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXBCeVxuICAgICAgICAgIGlmIChleGlzdGluZ0dyb3VwQnkuaW5jbHVkZXMoY29sdW1uLmlkKSkge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBncm91cGVkUm93c1swXSA/IGdyb3VwZWRSb3dzWzBdLnZhbHVlc1tjb2x1bW4uaWRdIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIEFnZ3JlZ2F0ZSB0aGUgdmFsdWVzXG5cblxuICAgICAgICAgIHZhciBhZ2dyZWdhdGVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlID09PSAnZnVuY3Rpb24nID8gY29sdW1uLmFnZ3JlZ2F0ZSA6IHVzZXJBZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVdO1xuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZuKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcbiAgICAgICAgICAgIHZhciBncm91cGVkVmFsdWVzID0gZ3JvdXBlZFJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJvdy52YWx1ZXNbY29sdW1uLmlkXTtcbiAgICAgICAgICAgIH0pOyAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcblxuICAgICAgICAgICAgdmFyIGxlYWZWYWx1ZXMgPSBsZWFmUm93cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICB2YXIgY29sdW1uVmFsdWUgPSByb3cudmFsdWVzW2NvbHVtbi5pZF07XG5cbiAgICAgICAgICAgICAgaWYgKCFkZXB0aCAmJiBjb2x1bW4uYWdncmVnYXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWdncmVnYXRlVmFsdWVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlVmFsdWUgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uYWdncmVnYXRlVmFsdWUgOiB1c2VyQWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlRm4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0IFRhYmxlOiBJbnZhbGlkIGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSBvcHRpb24gZm9yIGNvbHVtbiBsaXN0ZWQgYWJvdmVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZUZuKGNvbHVtblZhbHVlLCByb3csIGNvbHVtbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhbHVlc1tjb2x1bW4uaWRdID0gYWdncmVnYXRlRm4obGVhZlZhbHVlcywgZ3JvdXBlZFZhbHVlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uYWdncmVnYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdCBUYWJsZTogSW52YWxpZCBjb2x1bW4uYWdncmVnYXRlIG9wdGlvbiBmb3IgY29sdW1uIGxpc3RlZCBhYm92ZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZ3JvdXBlZFJvd3NCeUlkID0ge307XG4gICAgICB2YXIgb25seUdyb3VwZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIG9ubHlHcm91cGVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBub25Hcm91cGVkRmxhdFJvd3MgPSBbXTtcbiAgICAgIHZhciBub25Hcm91cGVkUm93c0J5SWQgPSB7fTsgLy8gUmVjdXJzaXZlbHkgZ3JvdXAgdGhlIGRhdGFcblxuICAgICAgdmFyIGdyb3VwVXBSZWN1cnNpdmVseSA9IGZ1bmN0aW9uIGdyb3VwVXBSZWN1cnNpdmVseShyb3dzLCBkZXB0aCwgcGFyZW50SWQpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgICBkZXB0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGxldmVsLCBqdXN0IHJldHVybiB0aGUgcm93c1xuICAgICAgICBpZiAoZGVwdGggPT09IGV4aXN0aW5nR3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb2x1bW5JZCA9IGV4aXN0aW5nR3JvdXBCeVtkZXB0aF07IC8vIEdyb3VwIHRoZSByb3dzIHRvZ2V0aGVyIGZvciB0aGlzIGxldmVsXG5cbiAgICAgICAgdmFyIHJvd0dyb3Vwc01hcCA9IGdyb3VwQnlGbihyb3dzLCBjb2x1bW5JZCk7IC8vIFBlZm9ybSBhZ2dyZWdhdGlvbnMgZm9yIGVhY2ggZ3JvdXBcblxuICAgICAgICB2YXIgYWdncmVnYXRlZEdyb3VwZWRSb3dzID0gT2JqZWN0LmVudHJpZXMocm93R3JvdXBzTWFwKS5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgIHZhciBncm91cEJ5VmFsID0gX3JlZjRbMF0sXG4gICAgICAgICAgICAgIGdyb3VwZWRSb3dzID0gX3JlZjRbMV07XG4gICAgICAgICAgdmFyIGlkID0gY29sdW1uSWQgKyBcIjpcIiArIGdyb3VwQnlWYWw7XG4gICAgICAgICAgaWQgPSBwYXJlbnRJZCA/IHBhcmVudElkICsgXCI+XCIgKyBpZCA6IGlkOyAvLyBGaXJzdCwgUmVjdXJzZSB0byBncm91cCBzdWIgcm93cyBiZWZvcmUgYWdncmVnYXRpb25cblxuICAgICAgICAgIHZhciBzdWJSb3dzID0gZ3JvdXBVcFJlY3Vyc2l2ZWx5KGdyb3VwZWRSb3dzLCBkZXB0aCArIDEsIGlkKTsgLy8gRmxhdHRlbiB0aGUgbGVhZiByb3dzIG9mIHRoZSByb3dzIGluIHRoaXMgZ3JvdXBcblxuICAgICAgICAgIHZhciBsZWFmUm93cyA9IGRlcHRoID8gZmxhdHRlbkJ5KGdyb3VwZWRSb3dzLCAnbGVhZlJvd3MnKSA6IGdyb3VwZWRSb3dzO1xuICAgICAgICAgIHZhciB2YWx1ZXMgPSBhZ2dyZWdhdGVSb3dzVG9WYWx1ZXMobGVhZlJvd3MsIGdyb3VwZWRSb3dzLCBkZXB0aCk7XG4gICAgICAgICAgdmFyIHJvdyA9IHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGlzR3JvdXBlZDogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwQnlJRDogY29sdW1uSWQsXG4gICAgICAgICAgICBncm91cEJ5VmFsOiBncm91cEJ5VmFsLFxuICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICBzdWJSb3dzOiBzdWJSb3dzLFxuICAgICAgICAgICAgbGVhZlJvd3M6IGxlYWZSb3dzLFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKHN1YlJvdykge1xuICAgICAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgIGdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuXG4gICAgICAgICAgICBpZiAoc3ViUm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgb25seUdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGVkR3JvdXBlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZFJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkocm93cyk7XG4gICAgICBncm91cGVkUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJSb3cpIHtcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgZ3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG5cbiAgICAgICAgaWYgKHN1YlJvdy5pc0dyb3VwZWQpIHtcbiAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIEFzc2lnbiB0aGUgbmV3IGRhdGFcblxuICAgICAgcmV0dXJuIFtncm91cGVkUm93cywgZ3JvdXBlZEZsYXRSb3dzLCBncm91cGVkUm93c0J5SWQsIG9ubHlHcm91cGVkRmxhdFJvd3MsIG9ubHlHcm91cGVkUm93c0J5SWQsIG5vbkdyb3VwZWRGbGF0Um93cywgbm9uR3JvdXBlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR3JvdXBCeSwgZ3JvdXBCeSwgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkLCBhbGxDb2x1bW5zLCB1c2VyQWdncmVnYXRpb25zLCBncm91cEJ5Rm5dKSxcbiAgICAgICAgZ3JvdXBlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIGdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdLFxuICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bM10sXG4gICAgICAgIG9ubHlHcm91cGVkUm93c0J5SWQgPSBfUmVhY3QkdXNlTWVtb1s0XSxcbiAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bNV0sXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzZdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldEdyb3VwQnkgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0R3JvdXBCeSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R3JvdXBCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0R3JvdXBCeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbnVhbEdyb3VwQnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdyb3VwZWRSb3dzOiByb3dzLFxuICAgICAgcHJlR3JvdXBlZEZsYXRSb3c6IGZsYXRSb3dzLFxuICAgICAgcHJlR3JvdXBlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGdyb3VwZWRSb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGdyb3VwZWRGbGF0Um93czogZ3JvdXBlZEZsYXRSb3dzLFxuICAgICAgZ3JvdXBlZFJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzOiBvbmx5R3JvdXBlZEZsYXRSb3dzLFxuICAgICAgb25seUdyb3VwZWRSb3dzQnlJZDogb25seUdyb3VwZWRSb3dzQnlJZCxcbiAgICAgIG5vbkdyb3VwZWRGbGF0Um93czogbm9uR3JvdXBlZEZsYXRSb3dzLFxuICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkOiBub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICByb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBncm91cGVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ3JvdXBlZFJvd3NCeUlkLFxuICAgICAgdG9nZ2xlR3JvdXBCeTogdG9nZ2xlR3JvdXBCeSxcbiAgICAgIHNldEdyb3VwQnk6IHNldEdyb3VwQnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMShyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgdmFyIF9yb3ckc3ViUm93cztcblxuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIGdyb3VwQnkgYW5kIHRoZSBwaXZvdCBjZWxsIGZvciB0aGUgcm93XG4gICAgICBjZWxsLmlzR3JvdXBlZCA9IGNlbGwuY29sdW1uLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pZCA9PT0gcm93Lmdyb3VwQnlJRDsgLy8gUGxhY2Vob2xkZXIgY2VsbHMgYXJlIGFueSBjb2x1bW5zIGluIHRoZSBncm91cEJ5IHRoYXQgYXJlIG5vdCBncm91cGVkXG5cbiAgICAgIGNlbGwuaXNQbGFjZWhvbGRlciA9ICFjZWxsLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pc0dyb3VwZWQ7IC8vIEFnZ3JlZ2F0ZWQgY2VsbHMgYXJlIG5vdCBncm91cGVkLCBub3QgcmVwZWF0ZWQsIGJ1dCBzdGlsbCBoYXZlIHN1YlJvd3NcblxuICAgICAgY2VsbC5pc0FnZ3JlZ2F0ZWQgPSAhY2VsbC5pc0dyb3VwZWQgJiYgIWNlbGwuaXNQbGFjZWhvbGRlciAmJiAoKF9yb3ckc3ViUm93cyA9IHJvdy5zdWJSb3dzKSA9PSBudWxsID8gdm9pZCAwIDogX3JvdyRzdWJSb3dzLmxlbmd0aCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0R3JvdXBCeUZuKHJvd3MsIGNvbHVtbklkKSB7XG4gICAgcmV0dXJuIHJvd3MucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCByb3csIGkpIHtcbiAgICAgIC8vIFRPRE86IE1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IGEga2V5IHNlcmlhbGl6ZXIgaGVyZSBzb1xuICAgICAgLy8gaXJyZWd1bGFyIGNvbHVtbiB2YWx1ZXMgY2FuIHN0aWxsIGJlIGdyb3VwZWQgaWYgbmVlZGVkP1xuICAgICAgdmFyIHJlc0tleSA9IFwiXCIgKyByb3cudmFsdWVzW2NvbHVtbklkXTtcbiAgICAgIHByZXZbcmVzS2V5XSA9IEFycmF5LmlzQXJyYXkocHJldltyZXNLZXldKSA/IHByZXZbcmVzS2V5XSA6IFtdO1xuICAgICAgcHJldltyZXNLZXldLnB1c2gocm93KTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHZhciByZVNwbGl0QWxwaGFOdW1lcmljID0gLyhbMC05XSspL2dtOyAvLyBNaXhlZCBzb3J0aW5nIGlzIHNsb3csIGJ1dCB2ZXJ5IGluY2x1c2l2ZSBvZiBtYW55IGVkZ2UgY2FzZXMuXG4gIC8vIEl0IGhhbmRsZXMgbnVtYmVycywgbWl4ZWQgYWxwaGFudW1lcmljIGNvbWJpbmF0aW9ucywgYW5kIGV2ZW5cbiAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbmQgSW5maW5pdHlcblxuICB2YXIgYWxwaGFudW1lcmljID0gZnVuY3Rpb24gYWxwaGFudW1lcmljKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIGEgPSBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93QSwgY29sdW1uSWQpO1xuICAgIHZhciBiID0gZ2V0Um93VmFsdWVCeUNvbHVtbklEKHJvd0IsIGNvbHVtbklkKTsgLy8gRm9yY2UgdG8gc3RyaW5ncyAob3IgXCJcIiBmb3IgdW5zdXBwb3J0ZWQgdHlwZXMpXG5cbiAgICBhID0gdG9TdHJpbmcoYSk7XG4gICAgYiA9IHRvU3RyaW5nKGIpOyAvLyBTcGxpdCBvbiBudW1iZXIgZ3JvdXBzLCBidXQga2VlcCB0aGUgZGVsaW1pdGVyXG4gICAgLy8gVGhlbiByZW1vdmUgZmFsc2V5IHNwbGl0IHZhbHVlc1xuXG4gICAgYSA9IGEuc3BsaXQocmVTcGxpdEFscGhhTnVtZXJpYykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGIgPSBiLnNwbGl0KHJlU3BsaXRBbHBoYU51bWVyaWMpLmZpbHRlcihCb29sZWFuKTsgLy8gV2hpbGVcblxuICAgIHdoaWxlIChhLmxlbmd0aCAmJiBiLmxlbmd0aCkge1xuICAgICAgdmFyIGFhID0gYS5zaGlmdCgpO1xuICAgICAgdmFyIGJiID0gYi5zaGlmdCgpO1xuICAgICAgdmFyIGFuID0gcGFyc2VJbnQoYWEsIDEwKTtcbiAgICAgIHZhciBibiA9IHBhcnNlSW50KGJiLCAxMCk7XG4gICAgICB2YXIgY29tYm8gPSBbYW4sIGJuXS5zb3J0KCk7IC8vIEJvdGggYXJlIHN0cmluZ1xuXG4gICAgICBpZiAoaXNOYU4oY29tYm9bMF0pKSB7XG4gICAgICAgIGlmIChhYSA+IGJiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmIgPiBhYSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBPbmUgaXMgYSBzdHJpbmcsIG9uZSBpcyBhIG51bWJlclxuXG5cbiAgICAgIGlmIChpc05hTihjb21ib1sxXSkpIHtcbiAgICAgICAgcmV0dXJuIGlzTmFOKGFuKSA/IC0xIDogMTtcbiAgICAgIH0gLy8gQm90aCBhcmUgbnVtYmVyc1xuXG5cbiAgICAgIGlmIChhbiA+IGJuKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm4gPiBhbikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gIH07XG4gIGZ1bmN0aW9uIGRhdGV0aW1lKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIGEgPSBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93QSwgY29sdW1uSWQpO1xuICAgIHZhciBiID0gZ2V0Um93VmFsdWVCeUNvbHVtbklEKHJvd0IsIGNvbHVtbklkKTtcbiAgICBhID0gYS5nZXRUaW1lKCk7XG4gICAgYiA9IGIuZ2V0VGltZSgpO1xuICAgIHJldHVybiBjb21wYXJlQmFzaWMoYSwgYik7XG4gIH1cbiAgZnVuY3Rpb24gYmFzaWMocm93QSwgcm93QiwgY29sdW1uSWQpIHtcbiAgICB2YXIgYSA9IGdldFJvd1ZhbHVlQnlDb2x1bW5JRChyb3dBLCBjb2x1bW5JZCk7XG4gICAgdmFyIGIgPSBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93QiwgY29sdW1uSWQpO1xuICAgIHJldHVybiBjb21wYXJlQmFzaWMoYSwgYik7XG4gIH0gLy8gVXRpbHNcblxuICBmdW5jdGlvbiBjb21wYXJlQmFzaWMoYSwgYikge1xuICAgIHJldHVybiBhID09PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Um93VmFsdWVCeUNvbHVtbklEKHJvdywgY29sdW1uSWQpIHtcbiAgICByZXR1cm4gcm93LnZhbHVlc1tjb2x1bW5JZF07XG4gIH1cblxuICBmdW5jdGlvbiB0b1N0cmluZyhhKSB7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKGEpIHx8IGEgPT09IEluZmluaXR5IHx8IGEgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBTdHJpbmcoYSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdmFyIHNvcnRUeXBlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgYWxwaGFudW1lcmljOiBhbHBoYW51bWVyaWMsXG4gICAgZGF0ZXRpbWU6IGRhdGV0aW1lLFxuICAgIGJhc2ljOiBiYXNpY1xuICB9KTtcblxuICBhY3Rpb25zLnJlc2V0U29ydEJ5ID0gJ3Jlc2V0U29ydEJ5JztcbiAgYWN0aW9ucy5zZXRTb3J0QnkgPSAnc2V0U29ydEJ5JztcbiAgYWN0aW9ucy50b2dnbGVTb3J0QnkgPSAndG9nZ2xlU29ydEJ5JztcbiAgYWN0aW9ucy5jbGVhclNvcnRCeSA9ICdjbGVhclNvcnRCeSc7XG4gIGRlZmF1bHRDb2x1bW4uc29ydFR5cGUgPSAnYWxwaGFudW1lcmljJztcbiAgZGVmYXVsdENvbHVtbi5zb3J0RGVzY0ZpcnN0ID0gZmFsc2U7XG4gIHZhciB1c2VTb3J0QnkgPSBmdW5jdGlvbiB1c2VTb3J0QnkoaG9va3MpIHtcbiAgICBob29rcy5nZXRTb3J0QnlUb2dnbGVQcm9wcyA9IFtkZWZhdWx0R2V0U29ydEJ5VG9nZ2xlUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDUpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkNSk7XG4gIH07XG4gIHVzZVNvcnRCeS5wbHVnaW5OYW1lID0gJ3VzZVNvcnRCeSc7XG5cbiAgdmFyIGRlZmF1bHRHZXRTb3J0QnlUb2dnbGVQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRTb3J0QnlUb2dnbGVQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICAgIGNvbHVtbiA9IF9yZWYuY29sdW1uO1xuICAgIHZhciBfaW5zdGFuY2UkaXNNdWx0aVNvcnQgPSBpbnN0YW5jZS5pc011bHRpU29ydEV2ZW50LFxuICAgICAgICBpc011bHRpU29ydEV2ZW50ID0gX2luc3RhbmNlJGlzTXVsdGlTb3J0ID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGUuc2hpZnRLZXk7XG4gICAgfSA6IF9pbnN0YW5jZSRpc011bHRpU29ydDtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBjb2x1bW4uY2FuU29ydCA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucGVyc2lzdCgpO1xuICAgICAgICBjb2x1bW4udG9nZ2xlU29ydEJ5KHVuZGVmaW5lZCwgIWluc3RhbmNlLmRpc2FibGVNdWx0aVNvcnQgJiYgaXNNdWx0aVNvcnRFdmVudChlKSk7XG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiBjb2x1bW4uY2FuU29ydCA/ICdwb2ludGVyJyA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiBjb2x1bW4uY2FuU29ydCA/ICdUb2dnbGUgU29ydEJ5JyA6IHVuZGVmaW5lZFxuICAgIH1dO1xuICB9OyAvLyBSZWR1Y2VyXG5cblxuICBmdW5jdGlvbiByZWR1Y2VyJDUoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgc29ydEJ5OiBbXVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldFNvcnRCeSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5zb3J0QnkgfHwgW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jbGVhclNvcnRCeSkge1xuICAgICAgdmFyIHNvcnRCeSA9IHN0YXRlLnNvcnRCeTtcbiAgICAgIHZhciBuZXdTb3J0QnkgPSBzb3J0QnkuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkICE9PSBhY3Rpb24uY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc29ydEJ5OiBuZXdTb3J0QnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRTb3J0QnkpIHtcbiAgICAgIHZhciBfc29ydEJ5ID0gYWN0aW9uLnNvcnRCeTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc29ydEJ5OiBfc29ydEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlU29ydEJ5KSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgZGVzYyA9IGFjdGlvbi5kZXNjLFxuICAgICAgICAgIG11bHRpID0gYWN0aW9uLm11bHRpO1xuICAgICAgdmFyIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICAgIGRpc2FibGVNdWx0aVNvcnQgPSBpbnN0YW5jZS5kaXNhYmxlTXVsdGlTb3J0LFxuICAgICAgICAgIGRpc2FibGVTb3J0UmVtb3ZlID0gaW5zdGFuY2UuZGlzYWJsZVNvcnRSZW1vdmUsXG4gICAgICAgICAgZGlzYWJsZU11bHRpUmVtb3ZlID0gaW5zdGFuY2UuZGlzYWJsZU11bHRpUmVtb3ZlLFxuICAgICAgICAgIF9pbnN0YW5jZSRtYXhNdWx0aVNvciA9IGluc3RhbmNlLm1heE11bHRpU29ydENvbENvdW50LFxuICAgICAgICAgIG1heE11bHRpU29ydENvbENvdW50ID0gX2luc3RhbmNlJG1heE11bHRpU29yID09PSB2b2lkIDAgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IF9pbnN0YW5jZSRtYXhNdWx0aVNvcjtcbiAgICAgIHZhciBfc29ydEJ5MiA9IHN0YXRlLnNvcnRCeTsgLy8gRmluZCB0aGUgY29sdW1uIGZvciB0aGlzIGNvbHVtbklkXG5cbiAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydERlc2NGaXJzdCA9IGNvbHVtbi5zb3J0RGVzY0ZpcnN0OyAvLyBGaW5kIGFueSBleGlzdGluZyBzb3J0QnkgZm9yIHRoaXMgY29sdW1uXG5cbiAgICAgIHZhciBleGlzdGluZ1NvcnRCeSA9IF9zb3J0QnkyLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBleGlzdGluZ0luZGV4ID0gX3NvcnRCeTIuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgaGFzRGVzY0RlZmluZWQgPSB0eXBlb2YgZGVzYyAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVzYyAhPT0gbnVsbDtcbiAgICAgIHZhciBfbmV3U29ydEJ5ID0gW107IC8vIFdoYXQgc2hvdWxkIHdlIGRvIHdpdGggdGhpcyBzb3J0IGFjdGlvbj9cblxuICAgICAgdmFyIHNvcnRBY3Rpb247XG5cbiAgICAgIGlmICghZGlzYWJsZU11bHRpU29ydCAmJiBtdWx0aSkge1xuICAgICAgICBpZiAoZXhpc3RpbmdTb3J0QnkpIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ3RvZ2dsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydEFjdGlvbiA9ICdhZGQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3JtYWwgbW9kZVxuICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gX3NvcnRCeTIubGVuZ3RoIC0gMSB8fCBfc29ydEJ5Mi5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ3JlcGxhY2UnO1xuICAgICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nU29ydEJ5KSB7XG4gICAgICAgICAgc29ydEFjdGlvbiA9ICd0b2dnbGUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSc7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSGFuZGxlIHRvZ2dsZSBzdGF0ZXMgdGhhdCB3aWxsIHJlbW92ZSB0aGUgc29ydEJ5XG5cblxuICAgICAgaWYgKHNvcnRBY3Rpb24gPT09ICd0b2dnbGUnICYmIC8vIE11c3QgYmUgdG9nZ2xpbmdcbiAgICAgICFkaXNhYmxlU29ydFJlbW92ZSAmJiAvLyBJZiBkaXNhYmxlU29ydFJlbW92ZSwgZGlzYWJsZSBpbiBnZW5lcmFsXG4gICAgICAhaGFzRGVzY0RlZmluZWQgJiYgKCAvLyBNdXN0IG5vdCBiZSBzZXR0aW5nIGRlc2NcbiAgICAgIG11bHRpID8gIWRpc2FibGVNdWx0aVJlbW92ZSA6IHRydWUpICYmICggLy8gSWYgbXVsdGksIGRvbid0IGFsbG93IGlmIGRpc2FibGVNdWx0aVJlbW92ZVxuICAgICAgZXhpc3RpbmdTb3J0QnkgJiYgLy8gRmluYWxseSwgZGV0ZWN0IGlmIGl0IHNob3VsZCBpbmRlZWQgYmUgcmVtb3ZlZFxuICAgICAgZXhpc3RpbmdTb3J0QnkuZGVzYyAmJiAhc29ydERlc2NGaXJzdCB8fCAhZXhpc3RpbmdTb3J0QnkuZGVzYyAmJiBzb3J0RGVzY0ZpcnN0KSkge1xuICAgICAgICBzb3J0QWN0aW9uID0gJ3JlbW92ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChzb3J0QWN0aW9uID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgX25ld1NvcnRCeSA9IFt7XG4gICAgICAgICAgaWQ6IGNvbHVtbklkLFxuICAgICAgICAgIGRlc2M6IGhhc0Rlc2NEZWZpbmVkID8gZGVzYyA6IHNvcnREZXNjRmlyc3RcbiAgICAgICAgfV07XG4gICAgICB9IGVsc2UgaWYgKHNvcnRBY3Rpb24gPT09ICdhZGQnKSB7XG4gICAgICAgIF9uZXdTb3J0QnkgPSBbXS5jb25jYXQoX3NvcnRCeTIsIFt7XG4gICAgICAgICAgaWQ6IGNvbHVtbklkLFxuICAgICAgICAgIGRlc2M6IGhhc0Rlc2NEZWZpbmVkID8gZGVzYyA6IHNvcnREZXNjRmlyc3RcbiAgICAgICAgfV0pOyAvLyBUYWtlIGxhdGVzdCBuIGNvbHVtbnNcblxuICAgICAgICBfbmV3U29ydEJ5LnNwbGljZSgwLCBfbmV3U29ydEJ5Lmxlbmd0aCAtIG1heE11bHRpU29ydENvbENvdW50KTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgLy8gVGhpcyBmbGlwcyAob3Igc2V0cykgdGhlXG4gICAgICAgIF9uZXdTb3J0QnkgPSBfc29ydEJ5Mi5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICBpZiAoZC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgZCwge1xuICAgICAgICAgICAgICBkZXNjOiBoYXNEZXNjRGVmaW5lZCA/IGRlc2MgOiAhZXhpc3RpbmdTb3J0QnkuZGVzY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChzb3J0QWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgICBfbmV3U29ydEJ5ID0gX3NvcnRCeTIuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQgIT09IGNvbHVtbklkO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IF9uZXdTb3J0QnlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDUoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgX2luc3RhbmNlJG9yZGVyQnlGbiA9IGluc3RhbmNlLm9yZGVyQnlGbixcbiAgICAgICAgb3JkZXJCeUZuID0gX2luc3RhbmNlJG9yZGVyQnlGbiA9PT0gdm9pZCAwID8gZGVmYXVsdE9yZGVyQnlGbiA6IF9pbnN0YW5jZSRvcmRlckJ5Rm4sXG4gICAgICAgIHVzZXJTb3J0VHlwZXMgPSBpbnN0YW5jZS5zb3J0VHlwZXMsXG4gICAgICAgIG1hbnVhbFNvcnRCeSA9IGluc3RhbmNlLm1hbnVhbFNvcnRCeSxcbiAgICAgICAgZGVmYXVsdENhblNvcnQgPSBpbnN0YW5jZS5kZWZhdWx0Q2FuU29ydCxcbiAgICAgICAgZGlzYWJsZVNvcnRCeSA9IGluc3RhbmNlLmRpc2FibGVTb3J0QnksXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIHNvcnRCeSA9IGluc3RhbmNlLnN0YXRlLnNvcnRCeSxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRTbyA9IGluc3RhbmNlLmF1dG9SZXNldFNvcnRCeSxcbiAgICAgICAgYXV0b1Jlc2V0U29ydEJ5ID0gX2luc3RhbmNlJGF1dG9SZXNldFNvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFNvO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlRmlsdGVycycsICd1c2VHbG9iYWxGaWx0ZXInLCAndXNlR3JvdXBCeScsICd1c2VQaXZvdENvbHVtbnMnXSwgJ3VzZVNvcnRCeScpO1xuICAgIHZhciBzZXRTb3J0QnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc29ydEJ5KSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0U29ydEJ5LFxuICAgICAgICBzb3J0Qnk6IHNvcnRCeVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7IC8vIFVwZGF0ZXMgc29ydGluZyBiYXNlZCBvbiBhIGNvbHVtbklkLCBkZXNjIGZsYWcgYW5kIG11bHRpIGZsYWdcblxuICAgIHZhciB0b2dnbGVTb3J0QnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoY29sdW1uSWQsIGRlc2MsIG11bHRpKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlU29ydEJ5LFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIGRlc2M6IGRlc2MsXG4gICAgICAgIG11bHRpOiBtdWx0aVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7IC8vIHVzZSByZWZlcmVuY2UgdG8gYXZvaWQgbWVtb3J5IGxlYWsgaW4gIzE2MDhcblxuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7IC8vIEFkZCB0aGUgZ2V0U29ydEJ5VG9nZ2xlUHJvcHMgbWV0aG9kIHRvIGNvbHVtbnMgYW5kIGhlYWRlcnNcblxuICAgIGZsYXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgdmFyIGFjY2Vzc29yID0gY29sdW1uLmFjY2Vzc29yLFxuICAgICAgICAgIGRlZmF1bHRDb2x1bW5DYW5Tb3J0ID0gY29sdW1uLmNhblNvcnQsXG4gICAgICAgICAgY29sdW1uRGlzYWJsZVNvcnRCeSA9IGNvbHVtbi5kaXNhYmxlU29ydEJ5LFxuICAgICAgICAgIGlkID0gY29sdW1uLmlkO1xuICAgICAgdmFyIGNhblNvcnQgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlU29ydEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVTb3J0QnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSkgOiBnZXRGaXJzdERlZmluZWQoZGVmYXVsdENhblNvcnQsIGRlZmF1bHRDb2x1bW5DYW5Tb3J0LCBmYWxzZSk7XG4gICAgICBjb2x1bW4uY2FuU29ydCA9IGNhblNvcnQ7XG5cbiAgICAgIGlmIChjb2x1bW4uY2FuU29ydCkge1xuICAgICAgICBjb2x1bW4udG9nZ2xlU29ydEJ5ID0gZnVuY3Rpb24gKGRlc2MsIG11bHRpKSB7XG4gICAgICAgICAgcmV0dXJuIHRvZ2dsZVNvcnRCeShjb2x1bW4uaWQsIGRlc2MsIG11bHRpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb2x1bW4uY2xlYXJTb3J0QnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogYWN0aW9ucy5jbGVhclNvcnRCeSxcbiAgICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29sdW1uLmdldFNvcnRCeVRvZ2dsZVByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRTb3J0QnlUb2dnbGVQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgICAgdmFyIGNvbHVtblNvcnQgPSBzb3J0QnkuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGNvbHVtbi5pc1NvcnRlZCA9ICEhY29sdW1uU29ydDtcbiAgICAgIGNvbHVtbi5zb3J0ZWRJbmRleCA9IHNvcnRCeS5maW5kSW5kZXgoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBjb2x1bW4uaXNTb3J0ZWREZXNjID0gY29sdW1uLmlzU29ydGVkID8gY29sdW1uU29ydC5kZXNjIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsU29ydEJ5IHx8ICFzb3J0QnkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbcm93cywgZmxhdFJvd3NdO1xuICAgICAgfVxuXG4gICAgICB2YXIgc29ydGVkRmxhdFJvd3MgPSBbXTsgLy8gRmlsdGVyIG91dCBzb3J0QnlzIHRoYXQgY29ycmVzcG9uZCB0byBub24gZXhpc3RpbmcgY29sdW1uc1xuXG4gICAgICB2YXIgYXZhaWxhYmxlU29ydEJ5ID0gc29ydEJ5LmZpbHRlcihmdW5jdGlvbiAoc29ydCkge1xuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgICByZXR1cm4gY29sLmlkID09PSBzb3J0LmlkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc29ydERhdGEgPSBmdW5jdGlvbiBzb3J0RGF0YShyb3dzKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgb3JkZXJCeUZuIHRvIGNvbXBvc2UgbXVsdGlwbGUgc29ydEJ5J3MgdG9nZXRoZXIuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBhbHNvIHBlcmZvcm0gYSBzdGFibGUgc29ydGluZyB1c2luZyB0aGUgcm93IGluZGV4XG4gICAgICAgIC8vIGlmIG5lZWRlZC5cbiAgICAgICAgdmFyIHNvcnRlZERhdGEgPSBvcmRlckJ5Rm4ocm93cywgYXZhaWxhYmxlU29ydEJ5Lm1hcChmdW5jdGlvbiAoc29ydCkge1xuICAgICAgICAgIC8vIFN1cHBvcnQgY3VzdG9tIHNvcnRpbmcgbWV0aG9kcyBmb3IgZWFjaCBjb2x1bW5cbiAgICAgICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gc29ydC5pZDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC1UYWJsZTogQ291bGQgbm90IGZpbmQgYSBjb2x1bW4gd2l0aCBpZDogXCIgKyBzb3J0LmlkICsgXCIgd2hpbGUgc29ydGluZ1wiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc29ydFR5cGUgPSBjb2x1bW4uc29ydFR5cGU7IC8vIExvb2sgdXAgc29ydEJ5IGZ1bmN0aW9ucyBpbiB0aGlzIG9yZGVyOlxuICAgICAgICAgIC8vIGNvbHVtbiBmdW5jdGlvblxuICAgICAgICAgIC8vIGNvbHVtbiBzdHJpbmcgbG9va3VwIG9uIHVzZXIgc29ydFR5cGVcbiAgICAgICAgICAvLyBjb2x1bW4gc3RyaW5nIGxvb2t1cCBvbiBidWlsdC1pbiBzb3J0VHlwZVxuICAgICAgICAgIC8vIGRlZmF1bHQgZnVuY3Rpb25cbiAgICAgICAgICAvLyBkZWZhdWx0IHN0cmluZyBsb29rdXAgb24gdXNlciBzb3J0VHlwZVxuICAgICAgICAgIC8vIGRlZmF1bHQgc3RyaW5nIGxvb2t1cCBvbiBidWlsdC1pbiBzb3J0VHlwZVxuXG4gICAgICAgICAgdmFyIHNvcnRNZXRob2QgPSBpc0Z1bmN0aW9uKHNvcnRUeXBlKSB8fCAodXNlclNvcnRUeXBlcyB8fCB7fSlbc29ydFR5cGVdIHx8IHNvcnRUeXBlc1tzb3J0VHlwZV07XG5cbiAgICAgICAgICBpZiAoIXNvcnRNZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LVRhYmxlOiBDb3VsZCBub3QgZmluZCBhIHZhbGlkIHNvcnRUeXBlIG9mICdcIiArIHNvcnRUeXBlICsgXCInIGZvciBjb2x1bW4gJ1wiICsgc29ydC5pZCArIFwiJy5cIik7XG4gICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGNvcnJlY3Qgc29ydEZuLlxuICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gaW4gYXNjZW5kaW5nIG9yZGVyXG5cblxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRNZXRob2QoYSwgYiwgc29ydC5pZCwgc29ydC5kZXNjKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KSwgLy8gTWFwIHRoZSBkaXJlY3Rpb25zXG4gICAgICAgIGF2YWlsYWJsZVNvcnRCeS5tYXAoZnVuY3Rpb24gKHNvcnQpIHtcbiAgICAgICAgICAvLyBEZXRlY3QgYW5kIHVzZSB0aGUgc29ydEludmVydGVkIG9wdGlvblxuICAgICAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBzb3J0LmlkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uc29ydEludmVydGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydC5kZXNjO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhc29ydC5kZXNjO1xuICAgICAgICB9KSk7IC8vIElmIHRoZXJlIGFyZSBzdWItcm93cywgc29ydCB0aGVtXG5cbiAgICAgICAgc29ydGVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICBzb3J0ZWRGbGF0Um93cy5wdXNoKHJvdyk7XG5cbiAgICAgICAgICBpZiAoIXJvdy5zdWJSb3dzIHx8IHJvdy5zdWJSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdy5zdWJSb3dzID0gc29ydERhdGEocm93LnN1YlJvd3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZERhdGE7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW3NvcnREYXRhKHJvd3MpLCBzb3J0ZWRGbGF0Um93c107XG4gICAgfSwgW21hbnVhbFNvcnRCeSwgc29ydEJ5LCByb3dzLCBmbGF0Um93cywgYWxsQ29sdW1ucywgb3JkZXJCeUZuLCB1c2VyU29ydFR5cGVzXSksXG4gICAgICAgIHNvcnRlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgc29ydGVkRmxhdFJvd3MgPSBfUmVhY3QkdXNlTWVtb1sxXTtcblxuICAgIHZhciBnZXRBdXRvUmVzZXRTb3J0QnkgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0U29ydEJ5KTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRTb3J0QnkoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldFNvcnRCeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbbWFudWFsU29ydEJ5ID8gbnVsbCA6IGRhdGFdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwcmVTb3J0ZWRSb3dzOiByb3dzLFxuICAgICAgcHJlU29ydGVkRmxhdFJvd3M6IGZsYXRSb3dzLFxuICAgICAgc29ydGVkUm93czogc29ydGVkUm93cyxcbiAgICAgIHNvcnRlZEZsYXRSb3dzOiBzb3J0ZWRGbGF0Um93cyxcbiAgICAgIHJvd3M6IHNvcnRlZFJvd3MsXG4gICAgICBmbGF0Um93czogc29ydGVkRmxhdFJvd3MsXG4gICAgICBzZXRTb3J0Qnk6IHNldFNvcnRCeSxcbiAgICAgIHRvZ2dsZVNvcnRCeTogdG9nZ2xlU29ydEJ5XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0T3JkZXJCeUZuKGFyciwgZnVuY3MsIGRpcnMpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGFycikuc29ydChmdW5jdGlvbiAocm93QSwgcm93Qikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgc29ydEZuID0gZnVuY3NbaV07XG4gICAgICAgIHZhciBkZXNjID0gZGlyc1tpXSA9PT0gZmFsc2UgfHwgZGlyc1tpXSA9PT0gJ2Rlc2MnO1xuICAgICAgICB2YXIgc29ydEludCA9IHNvcnRGbihyb3dBLCByb3dCKTtcblxuICAgICAgICBpZiAoc29ydEludCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZXNjID8gLXNvcnRJbnQgOiBzb3J0SW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXJzWzBdID8gcm93QS5pbmRleCAtIHJvd0IuaW5kZXggOiByb3dCLmluZGV4IC0gcm93QS5pbmRleDtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBwbHVnaW5OYW1lID0gJ3VzZVBhZ2luYXRpb24nOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldFBhZ2UgPSAncmVzZXRQYWdlJztcbiAgYWN0aW9ucy5nb3RvUGFnZSA9ICdnb3RvUGFnZSc7XG4gIGFjdGlvbnMuc2V0UGFnZVNpemUgPSAnc2V0UGFnZVNpemUnO1xuICB2YXIgdXNlUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIHVzZVBhZ2luYXRpb24oaG9va3MpIHtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ2KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDYpO1xuICB9O1xuICB1c2VQYWdpbmF0aW9uLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkNihzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBwYWdlU2l6ZTogMTAsXG4gICAgICAgIHBhZ2VJbmRleDogMFxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldFBhZ2UpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcGFnZUluZGV4OiBpbnN0YW5jZS5pbml0aWFsU3RhdGUucGFnZUluZGV4IHx8IDBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5nb3RvUGFnZSkge1xuICAgICAgdmFyIHBhZ2VDb3VudCA9IGluc3RhbmNlLnBhZ2VDb3VudCxcbiAgICAgICAgICBwYWdlID0gaW5zdGFuY2UucGFnZTtcbiAgICAgIHZhciBuZXdQYWdlSW5kZXggPSBmdW5jdGlvbmFsVXBkYXRlKGFjdGlvbi5wYWdlSW5kZXgsIHN0YXRlLnBhZ2VJbmRleCk7XG4gICAgICB2YXIgY2FuTmF2aWdhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKG5ld1BhZ2VJbmRleCA+IHN0YXRlLnBhZ2VJbmRleCkge1xuICAgICAgICAvLyBuZXh0IHBhZ2VcbiAgICAgICAgY2FuTmF2aWdhdGUgPSBwYWdlQ291bnQgPT09IC0xID8gcGFnZS5sZW5ndGggPj0gc3RhdGUucGFnZVNpemUgOiBuZXdQYWdlSW5kZXggPCBwYWdlQ291bnQ7XG4gICAgICB9IGVsc2UgaWYgKG5ld1BhZ2VJbmRleCA8IHN0YXRlLnBhZ2VJbmRleCkge1xuICAgICAgICAvLyBwcmV2IHBhZ2VcbiAgICAgICAgY2FuTmF2aWdhdGUgPSBuZXdQYWdlSW5kZXggPiAtMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjYW5OYXZpZ2F0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcGFnZUluZGV4OiBuZXdQYWdlSW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRQYWdlU2l6ZSkge1xuICAgICAgdmFyIHBhZ2VTaXplID0gYWN0aW9uLnBhZ2VTaXplO1xuICAgICAgdmFyIHRvcFJvd0luZGV4ID0gc3RhdGUucGFnZVNpemUgKiBzdGF0ZS5wYWdlSW5kZXg7XG4gICAgICB2YXIgcGFnZUluZGV4ID0gTWF0aC5mbG9vcih0b3BSb3dJbmRleCAvIHBhZ2VTaXplKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkNihpbnN0YW5jZSkge1xuICAgIHZhciByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFBhID0gaW5zdGFuY2UuYXV0b1Jlc2V0UGFnZSxcbiAgICAgICAgYXV0b1Jlc2V0UGFnZSA9IF9pbnN0YW5jZSRhdXRvUmVzZXRQYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRQYSxcbiAgICAgICAgX2luc3RhbmNlJG1hbnVhbEV4cGFuID0gaW5zdGFuY2UubWFudWFsRXhwYW5kZWRLZXksXG4gICAgICAgIG1hbnVhbEV4cGFuZGVkS2V5ID0gX2luc3RhbmNlJG1hbnVhbEV4cGFuID09PSB2b2lkIDAgPyAnZXhwYW5kZWQnIDogX2luc3RhbmNlJG1hbnVhbEV4cGFuLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgdXNlclBhZ2VDb3VudCA9IGluc3RhbmNlLnBhZ2VDb3VudCxcbiAgICAgICAgX2luc3RhbmNlJHBhZ2luYXRlRXhwID0gaW5zdGFuY2UucGFnaW5hdGVFeHBhbmRlZFJvd3MsXG4gICAgICAgIHBhZ2luYXRlRXhwYW5kZWRSb3dzID0gX2luc3RhbmNlJHBhZ2luYXRlRXhwID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHBhZ2luYXRlRXhwLFxuICAgICAgICBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPSBpbnN0YW5jZS5leHBhbmRTdWJSb3dzLFxuICAgICAgICBleHBhbmRTdWJSb3dzID0gX2luc3RhbmNlJGV4cGFuZFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGV4cGFuZFN1YlJvLFxuICAgICAgICBfaW5zdGFuY2Ukc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSxcbiAgICAgICAgcGFnZVNpemUgPSBfaW5zdGFuY2Ukc3RhdGUucGFnZVNpemUsXG4gICAgICAgIHBhZ2VJbmRleCA9IF9pbnN0YW5jZSRzdGF0ZS5wYWdlSW5kZXgsXG4gICAgICAgIGV4cGFuZGVkID0gX2luc3RhbmNlJHN0YXRlLmV4cGFuZGVkLFxuICAgICAgICBnbG9iYWxGaWx0ZXIgPSBfaW5zdGFuY2Ukc3RhdGUuZ2xvYmFsRmlsdGVyLFxuICAgICAgICBmaWx0ZXJzID0gX2luc3RhbmNlJHN0YXRlLmZpbHRlcnMsXG4gICAgICAgIGdyb3VwQnkgPSBfaW5zdGFuY2Ukc3RhdGUuZ3JvdXBCeSxcbiAgICAgICAgc29ydEJ5ID0gX2luc3RhbmNlJHN0YXRlLnNvcnRCeSxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIG1hbnVhbFBhZ2luYXRpb24gPSBpbnN0YW5jZS5tYW51YWxQYWdpbmF0aW9uO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlR2xvYmFsRmlsdGVyJywgJ3VzZUZpbHRlcnMnLCAndXNlR3JvdXBCeScsICd1c2VTb3J0QnknLCAndXNlRXhwYW5kZWQnXSwgJ3VzZVBhZ2luYXRpb24nKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UGFnZSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRQYWdlKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRQYWdlKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRQYWdlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgbWFudWFsUGFnaW5hdGlvbiA/IG51bGwgOiBkYXRhLCBnbG9iYWxGaWx0ZXIsIGZpbHRlcnMsIGdyb3VwQnksIHNvcnRCeV0pO1xuICAgIHZhciBwYWdlQ291bnQgPSBtYW51YWxQYWdpbmF0aW9uID8gdXNlclBhZ2VDb3VudCA6IE1hdGguY2VpbChyb3dzLmxlbmd0aCAvIHBhZ2VTaXplKTtcbiAgICB2YXIgcGFnZU9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwYWdlQ291bnQgPiAwID8gW10uY29uY2F0KG5ldyBBcnJheShwYWdlQ291bnQpKS5maWxsKG51bGwpLm1hcChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0pIDogW107XG4gICAgfSwgW3BhZ2VDb3VudF0pO1xuICAgIHZhciBwYWdlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFnZTtcblxuICAgICAgaWYgKG1hbnVhbFBhZ2luYXRpb24pIHtcbiAgICAgICAgcGFnZSA9IHJvd3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcGFnZVN0YXJ0ID0gcGFnZVNpemUgKiBwYWdlSW5kZXg7XG4gICAgICAgIHZhciBwYWdlRW5kID0gcGFnZVN0YXJ0ICsgcGFnZVNpemU7XG4gICAgICAgIHBhZ2UgPSByb3dzLnNsaWNlKHBhZ2VTdGFydCwgcGFnZUVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdpbmF0ZUV4cGFuZGVkUm93cykge1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cGFuZFJvd3MocGFnZSwge1xuICAgICAgICBtYW51YWxFeHBhbmRlZEtleTogbWFudWFsRXhwYW5kZWRLZXksXG4gICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgZXhwYW5kU3ViUm93czogZXhwYW5kU3ViUm93c1xuICAgICAgfSk7XG4gICAgfSwgW2V4cGFuZFN1YlJvd3MsIGV4cGFuZGVkLCBtYW51YWxFeHBhbmRlZEtleSwgbWFudWFsUGFnaW5hdGlvbiwgcGFnZUluZGV4LCBwYWdlU2l6ZSwgcGFnaW5hdGVFeHBhbmRlZFJvd3MsIHJvd3NdKTtcbiAgICB2YXIgY2FuUHJldmlvdXNQYWdlID0gcGFnZUluZGV4ID4gMDtcbiAgICB2YXIgY2FuTmV4dFBhZ2UgPSBwYWdlQ291bnQgPT09IC0xID8gcGFnZS5sZW5ndGggPj0gcGFnZVNpemUgOiBwYWdlSW5kZXggPCBwYWdlQ291bnQgLSAxO1xuICAgIHZhciBnb3RvUGFnZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwYWdlSW5kZXgpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5nb3RvUGFnZSxcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXhcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBwcmV2aW91c1BhZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ290b1BhZ2UoZnVuY3Rpb24gKG9sZCkge1xuICAgICAgICByZXR1cm4gb2xkIC0gMTtcbiAgICAgIH0pO1xuICAgIH0sIFtnb3RvUGFnZV0pO1xuICAgIHZhciBuZXh0UGFnZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnb3RvUGFnZShmdW5jdGlvbiAob2xkKSB7XG4gICAgICAgIHJldHVybiBvbGQgKyAxO1xuICAgICAgfSk7XG4gICAgfSwgW2dvdG9QYWdlXSk7XG4gICAgdmFyIHNldFBhZ2VTaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBhZ2VTaXplKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0UGFnZVNpemUsXG4gICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcGFnZU9wdGlvbnM6IHBhZ2VPcHRpb25zLFxuICAgICAgcGFnZUNvdW50OiBwYWdlQ291bnQsXG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgY2FuUHJldmlvdXNQYWdlOiBjYW5QcmV2aW91c1BhZ2UsXG4gICAgICBjYW5OZXh0UGFnZTogY2FuTmV4dFBhZ2UsXG4gICAgICBnb3RvUGFnZTogZ290b1BhZ2UsXG4gICAgICBwcmV2aW91c1BhZ2U6IHByZXZpb3VzUGFnZSxcbiAgICAgIG5leHRQYWdlOiBuZXh0UGFnZSxcbiAgICAgIHNldFBhZ2VTaXplOiBzZXRQYWdlU2l6ZVxuICAgIH0pO1xuICB9XG5cbiAgYWN0aW9ucy5yZXNldFBpdm90ID0gJ3Jlc2V0UGl2b3QnO1xuICBhY3Rpb25zLnRvZ2dsZVBpdm90ID0gJ3RvZ2dsZVBpdm90JztcbiAgdmFyIF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnMgPSBmdW5jdGlvbiBfVU5TVEFCTEVfdXNlUGl2b3RDb2x1bW5zKGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0UGl2b3RUb2dnbGVQcm9wcyA9IFtkZWZhdWx0R2V0UGl2b3RUb2dnbGVQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkNyk7XG4gICAgaG9va3MudXNlSW5zdGFuY2VBZnRlckRhdGEucHVzaCh1c2VJbnN0YW5jZUFmdGVyRGF0YSk7XG4gICAgaG9va3MuYWxsQ29sdW1ucy5wdXNoKGFsbENvbHVtbnMpO1xuICAgIGhvb2tzLmFjY2Vzc1ZhbHVlLnB1c2goYWNjZXNzVmFsdWUpO1xuICAgIGhvb2tzLm1hdGVyaWFsaXplZENvbHVtbnMucHVzaChtYXRlcmlhbGl6ZWRDb2x1bW5zKTtcbiAgICBob29rcy5tYXRlcmlhbGl6ZWRDb2x1bW5zRGVwcy5wdXNoKG1hdGVyaWFsaXplZENvbHVtbnNEZXBzKTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1ucy5wdXNoKHZpc2libGVDb2x1bW5zJDEpO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zRGVwcy5wdXNoKHZpc2libGVDb2x1bW5zRGVwcyk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ3KTtcbiAgICBob29rcy5wcmVwYXJlUm93LnB1c2gocHJlcGFyZVJvdyQyKTtcbiAgfTtcbiAgX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucy5wbHVnaW5OYW1lID0gJ3VzZVBpdm90Q29sdW1ucyc7XG4gIHZhciBkZWZhdWx0UGl2b3RDb2x1bW5zID0gW107XG5cbiAgdmFyIGRlZmF1bHRHZXRQaXZvdFRvZ2dsZVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFBpdm90VG9nZ2xlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaGVhZGVyID0gX3JlZi5oZWFkZXI7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogaGVhZGVyLmNhblBpdm90ID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIGhlYWRlci50b2dnbGVQaXZvdCgpO1xuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogaGVhZGVyLmNhblBpdm90ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgUGl2b3QnXG4gICAgfV07XG4gIH07IC8vIFJlZHVjZXJcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkNyhzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBwaXZvdENvbHVtbnM6IGRlZmF1bHRQaXZvdENvbHVtbnNcbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRQaXZvdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwaXZvdENvbHVtbnM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5waXZvdENvbHVtbnMgfHwgZGVmYXVsdFBpdm90Q29sdW1uc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZVBpdm90KSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgc2V0UGl2b3QgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgcmVzb2x2ZWRQaXZvdCA9IHR5cGVvZiBzZXRQaXZvdCAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRQaXZvdCA6ICFzdGF0ZS5waXZvdENvbHVtbnMuaW5jbHVkZXMoY29sdW1uSWQpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRQaXZvdCkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgcGl2b3RDb2x1bW5zOiBbXS5jb25jYXQoc3RhdGUucGl2b3RDb2x1bW5zLCBbY29sdW1uSWRdKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwaXZvdENvbHVtbnM6IHN0YXRlLnBpdm90Q29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZUFmdGVyRGF0YShpbnN0YW5jZSkge1xuICAgIGluc3RhbmNlLmFsbENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4uaXNQaXZvdFNvdXJjZSA9IGluc3RhbmNlLnN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhjb2x1bW4uaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsQ29sdW1ucyhjb2x1bW5zLCBfcmVmMikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYyLmluc3RhbmNlO1xuICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4uaXNQaXZvdFNvdXJjZSA9IGluc3RhbmNlLnN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhjb2x1bW4uaWQpO1xuICAgICAgY29sdW1uLnVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY2Vzc1ZhbHVlKHZhbHVlLCBfcmVmMykge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG5cbiAgICBpZiAoY29sdW1uLnVuaXF1ZVZhbHVlcyAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb2x1bW4udW5pcXVlVmFsdWVzLmFkZCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF0ZXJpYWxpemVkQ29sdW1ucyhtYXRlcmlhbGl6ZWQsIF9yZWY0KSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjQuaW5zdGFuY2U7XG4gICAgdmFyIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBzdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKCFzdGF0ZS5waXZvdENvbHVtbnMubGVuZ3RoIHx8ICFzdGF0ZS5ncm91cEJ5IHx8ICFzdGF0ZS5ncm91cEJ5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG1hdGVyaWFsaXplZDtcbiAgICB9XG5cbiAgICB2YXIgcGl2b3RDb2x1bW5zID0gc3RhdGUucGl2b3RDb2x1bW5zLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGlkO1xuICAgICAgfSk7XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHZhciBzb3VyY2VDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiAhZC5pc1Bpdm90U291cmNlICYmICFzdGF0ZS5ncm91cEJ5LmluY2x1ZGVzKGQuaWQpICYmICFzdGF0ZS5waXZvdENvbHVtbnMuaW5jbHVkZXMoZC5pZCk7XG4gICAgfSk7XG5cbiAgICB2YXIgYnVpbGRQaXZvdENvbHVtbnMgPSBmdW5jdGlvbiBidWlsZFBpdm90Q29sdW1ucyhkZXB0aCwgcGFyZW50LCBwaXZvdEZpbHRlcnMpIHtcbiAgICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGRlcHRoID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBpdm90RmlsdGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHBpdm90RmlsdGVycyA9IFtdO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGl2b3RDb2x1bW4gPSBwaXZvdENvbHVtbnNbZGVwdGhdO1xuXG4gICAgICBpZiAoIXBpdm90Q29sdW1uKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VDb2x1bW5zLm1hcChmdW5jdGlvbiAoc291cmNlQ29sdW1uKSB7XG4gICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgb2ZmZXIgc3VwcG9ydCBoZXJlIGZvciByZW5lc3RpbmcgcGl2b3RlZFxuICAgICAgICAgIC8vIGNvbHVtbnMgaW5zaWRlIGNvcGllcyBvZiB0aGVpciBoZWFkZXIgZ3JvdXBzLiBGb3Igbm93LFxuICAgICAgICAgIC8vIHRoYXQgc2VlbXMgbGlrZSBpdCB3b3VsZCBiZSAoMSkgb3ZlcmtpbGwgb24gbmVzdGluZywgY29uc2lkZXJpbmdcbiAgICAgICAgICAvLyB5b3UgYWxyZWFkeSBnZXQgbmVzdGluZyBmb3IgZXZlcnkgcGl2b3QgbGV2ZWwgYW5kICgyKVxuICAgICAgICAgIC8vIHJlYWxseSBoYXJkLiA6KVxuICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc291cmNlQ29sdW1uLCB7XG4gICAgICAgICAgICBjYW5QaXZvdDogZmFsc2UsXG4gICAgICAgICAgICBpc1Bpdm90ZWQ6IHRydWUsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgICAgIGlkOiBcIlwiICsgKHBhcmVudCA/IHBhcmVudC5pZCArIFwiLlwiICsgc291cmNlQ29sdW1uLmlkIDogc291cmNlQ29sdW1uLmlkKSxcbiAgICAgICAgICAgIGFjY2Vzc29yOiBmdW5jdGlvbiBhY2Nlc3NvcihvcmlnaW5hbFJvdywgaSwgcm93KSB7XG4gICAgICAgICAgICAgIGlmIChwaXZvdEZpbHRlcnMuZXZlcnkoZnVuY3Rpb24gKGZpbHRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIocm93KTtcbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcm93LnZhbHVlc1tzb3VyY2VDb2x1bW4uaWRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdW5pcXVlVmFsdWVzID0gQXJyYXkuZnJvbShwaXZvdENvbHVtbi51bmlxdWVWYWx1ZXMpLnNvcnQoKTtcbiAgICAgIHJldHVybiB1bmlxdWVWYWx1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWVWYWx1ZSkge1xuICAgICAgICB2YXIgY29sdW1uR3JvdXAgPSBfZXh0ZW5kcyh7fSwgcGl2b3RDb2x1bW4sIHtcbiAgICAgICAgICBIZWFkZXI6IHBpdm90Q29sdW1uLlBpdm90SGVhZGVyIHx8IHR5cGVvZiBwaXZvdENvbHVtbi5oZWFkZXIgPT09ICdzdHJpbmcnID8gcGl2b3RDb2x1bW4uSGVhZGVyICsgXCI6IFwiICsgdW5pcXVlVmFsdWUgOiB1bmlxdWVWYWx1ZSxcbiAgICAgICAgICBpc1Bpdm90R3JvdXA6IHRydWUsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgIGlkOiBwYXJlbnQgPyBwYXJlbnQuaWQgKyBcIi5cIiArIHBpdm90Q29sdW1uLmlkICsgXCIuXCIgKyB1bmlxdWVWYWx1ZSA6IHBpdm90Q29sdW1uLmlkICsgXCIuXCIgKyB1bmlxdWVWYWx1ZSxcbiAgICAgICAgICBwaXZvdFZhbHVlOiB1bmlxdWVWYWx1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBjb2x1bW5Hcm91cC5jb2x1bW5zID0gYnVpbGRQaXZvdENvbHVtbnMoZGVwdGggKyAxLCBjb2x1bW5Hcm91cCwgW10uY29uY2F0KHBpdm90RmlsdGVycywgW2Z1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICByZXR1cm4gcm93LnZhbHVlc1twaXZvdENvbHVtbi5pZF0gPT09IHVuaXF1ZVZhbHVlO1xuICAgICAgICB9XSkpO1xuICAgICAgICByZXR1cm4gY29sdW1uR3JvdXA7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIG5ld01hdGVyaWFsaXplZCA9IGZsYXR0ZW5Db2x1bW5zKGJ1aWxkUGl2b3RDb2x1bW5zKCkpO1xuICAgIHJldHVybiBbXS5jb25jYXQobWF0ZXJpYWxpemVkLCBuZXdNYXRlcmlhbGl6ZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF0ZXJpYWxpemVkQ29sdW1uc0RlcHMoZGVwcywgX3JlZjUpIHtcbiAgICB2YXIgX3JlZjUkaW5zdGFuY2Ukc3RhdGUgPSBfcmVmNS5pbnN0YW5jZS5zdGF0ZSxcbiAgICAgICAgcGl2b3RDb2x1bW5zID0gX3JlZjUkaW5zdGFuY2Ukc3RhdGUucGl2b3RDb2x1bW5zLFxuICAgICAgICBncm91cEJ5ID0gX3JlZjUkaW5zdGFuY2Ukc3RhdGUuZ3JvdXBCeTtcbiAgICByZXR1cm4gW10uY29uY2F0KGRlcHMsIFtwaXZvdENvbHVtbnMsIGdyb3VwQnldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZpc2libGVDb2x1bW5zJDEodmlzaWJsZUNvbHVtbnMsIF9yZWY2KSB7XG4gICAgdmFyIHN0YXRlID0gX3JlZjYuaW5zdGFuY2Uuc3RhdGU7XG4gICAgdmlzaWJsZUNvbHVtbnMgPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiAhZC5pc1Bpdm90U291cmNlO1xuICAgIH0pO1xuXG4gICAgaWYgKHN0YXRlLnBpdm90Q29sdW1ucy5sZW5ndGggJiYgc3RhdGUuZ3JvdXBCeSAmJiBzdGF0ZS5ncm91cEJ5Lmxlbmd0aCkge1xuICAgICAgdmlzaWJsZUNvbHVtbnMgPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gY29sdW1uLmlzR3JvdXBlZCB8fCBjb2x1bW4uaXNQaXZvdGVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2libGVDb2x1bW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZUNvbHVtbnNEZXBzKGRlcHMsIF9yZWY3KSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjcuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChkZXBzLCBbaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLCBpbnN0YW5jZS5zdGF0ZS5ncm91cEJ5XSk7XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ3KGluc3RhbmNlKSB7XG4gICAgdmFyIGNvbHVtbnMgPSBpbnN0YW5jZS5jb2x1bW5zLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRQaSA9IGluc3RhbmNlLmF1dG9SZXNldFBpdm90LFxuICAgICAgICBhdXRvUmVzZXRQaXZvdCA9IF9pbnN0YW5jZSRhdXRvUmVzZXRQaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRQaSxcbiAgICAgICAgbWFuYXVsUGl2b3QgPSBpbnN0YW5jZS5tYW5hdWxQaXZvdCxcbiAgICAgICAgZGlzYWJsZVBpdm90ID0gaW5zdGFuY2UuZGlzYWJsZVBpdm90LFxuICAgICAgICBkZWZhdWx0Q2FuUGl2b3QgPSBpbnN0YW5jZS5kZWZhdWx0Q2FuUGl2b3Q7XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VHcm91cEJ5J10sICd1c2VQaXZvdENvbHVtbnMnKTtcbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2UpO1xuICAgIGFsbENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICB2YXIgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgICAgZGVmYXVsdENvbHVtblBpdm90ID0gY29sdW1uLmRlZmF1bHRQaXZvdCxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlUGl2b3QgPSBjb2x1bW4uZGlzYWJsZVBpdm90O1xuICAgICAgY29sdW1uLmNhblBpdm90ID0gYWNjZXNzb3IgPyBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhblBpdm90LCBjb2x1bW5EaXNhYmxlUGl2b3QgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZVBpdm90ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpIDogZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbi5jYW5QaXZvdCwgZGVmYXVsdENvbHVtblBpdm90LCBkZWZhdWx0Q2FuUGl2b3QsIGZhbHNlKTtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5QaXZvdCkge1xuICAgICAgICBjb2x1bW4udG9nZ2xlUGl2b3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnRvZ2dsZVBpdm90KGNvbHVtbi5pZCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbi5BZ2dyZWdhdGVkID0gY29sdW1uLkFnZ3JlZ2F0ZWQgfHwgY29sdW1uLkNlbGw7XG4gICAgfSk7XG5cbiAgICB2YXIgdG9nZ2xlUGl2b3QgPSBmdW5jdGlvbiB0b2dnbGVQaXZvdChjb2x1bW5JZCwgdmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVQaXZvdCxcbiAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIGhlYWRlci5nZXRQaXZvdFRvZ2dsZVByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRQaXZvdFRvZ2dsZVByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBoZWFkZXI6IGhlYWRlclxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGdldEF1dG9SZXNldFBpdm90ID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFBpdm90KTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRQaXZvdCgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0UGl2b3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW5hdWxQaXZvdCA/IG51bGwgOiBjb2x1bW5zXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgdG9nZ2xlUGl2b3Q6IHRvZ2dsZVBpdm90XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlUm93JDIocm93KSB7XG4gICAgcm93LmFsbENlbGxzLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgIC8vIEdyb3VwZWQgY2VsbHMgYXJlIGluIHRoZSBwaXZvdENvbHVtbnMgYW5kIHRoZSBwaXZvdCBjZWxsIGZvciB0aGUgcm93XG4gICAgICBjZWxsLmlzUGl2b3RlZCA9IGNlbGwuY29sdW1uLmlzUGl2b3RlZDtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBwbHVnaW5OYW1lJDEgPSAndXNlUm93U2VsZWN0JzsgLy8gQWN0aW9uc1xuXG4gIGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3MgPSAncmVzZXRTZWxlY3RlZFJvd3MnO1xuICBhY3Rpb25zLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCA9ICd0b2dnbGVBbGxSb3dzU2VsZWN0ZWQnO1xuICBhY3Rpb25zLnRvZ2dsZVJvd1NlbGVjdGVkID0gJ3RvZ2dsZVJvd1NlbGVjdGVkJztcbiAgYWN0aW9ucy50b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkID0gJ3RvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQnO1xuICB2YXIgdXNlUm93U2VsZWN0ID0gZnVuY3Rpb24gdXNlUm93U2VsZWN0KGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wc107XG4gICAgaG9va3MuZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkOCk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ4KTtcbiAgICBob29rcy5wcmVwYXJlUm93LnB1c2gocHJlcGFyZVJvdyQzKTtcbiAgfTtcbiAgdXNlUm93U2VsZWN0LnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lJDE7XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZVJvd1NlbGVjdGVkUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlLFxuICAgICAgICByb3cgPSBfcmVmLnJvdztcbiAgICB2YXIgX2luc3RhbmNlJG1hbnVhbFJvd1NlID0gaW5zdGFuY2UubWFudWFsUm93U2VsZWN0ZWRLZXksXG4gICAgICAgIG1hbnVhbFJvd1NlbGVjdGVkS2V5ID0gX2luc3RhbmNlJG1hbnVhbFJvd1NlID09PSB2b2lkIDAgPyAnaXNTZWxlY3RlZCcgOiBfaW5zdGFuY2UkbWFudWFsUm93U2U7XG4gICAgdmFyIGNoZWNrZWQgPSBmYWxzZTtcblxuICAgIGlmIChyb3cub3JpZ2luYWwgJiYgcm93Lm9yaWdpbmFsW21hbnVhbFJvd1NlbGVjdGVkS2V5XSkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrZWQgPSByb3cuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICByb3cudG9nZ2xlUm93U2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgICAgdGl0bGU6ICdUb2dnbGUgUm93IFNlbGVjdGVkJyxcbiAgICAgIGluZGV0ZXJtaW5hdGU6IHJvdy5pc1NvbWVTZWxlY3RlZFxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjIuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcbiAgICAgICAgaW5zdGFuY2UudG9nZ2xlQWxsUm93c1NlbGVjdGVkKGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgY2hlY2tlZDogaW5zdGFuY2UuaXNBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgUm93cyBTZWxlY3RlZCcsXG4gICAgICBpbmRldGVybWluYXRlOiBCb29sZWFuKCFpbnN0YW5jZS5pc0FsbFJvd3NTZWxlY3RlZCAmJiBPYmplY3Qua2V5cyhpbnN0YW5jZS5zdGF0ZS5zZWxlY3RlZFJvd0lkcykubGVuZ3RoKVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkKGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgY2hlY2tlZDogaW5zdGFuY2UuaXNBbGxQYWdlUm93c1NlbGVjdGVkLFxuICAgICAgdGl0bGU6ICdUb2dnbGUgQWxsIEN1cnJlbnQgUGFnZSBSb3dzIFNlbGVjdGVkJyxcbiAgICAgIGluZGV0ZXJtaW5hdGU6IEJvb2xlYW4oIWluc3RhbmNlLmlzQWxsUGFnZVJvd3NTZWxlY3RlZCAmJiBpbnN0YW5jZS5wYWdlLnNvbWUoZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICAgIHZhciBpZCA9IF9yZWY0LmlkO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc3RhdGUuc2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgfSkpXG4gICAgfV07XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cblxuICBmdW5jdGlvbiByZWR1Y2VyJDgoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IHt9XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0U2VsZWN0ZWRSb3dzKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNlbGVjdGVkUm93SWRzOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuc2VsZWN0ZWRSb3dJZHMgfHwge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVBbGxSb3dzU2VsZWN0ZWQpIHtcbiAgICAgIHZhciBzZXRTZWxlY3RlZCA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBpc0FsbFJvd3NTZWxlY3RlZCA9IGluc3RhbmNlLmlzQWxsUm93c1NlbGVjdGVkLFxuICAgICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJG5vbkdyb3VwZWRSID0gaW5zdGFuY2Uubm9uR3JvdXBlZFJvd3NCeUlkLFxuICAgICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9pbnN0YW5jZSRub25Hcm91cGVkUiA9PT0gdm9pZCAwID8gcm93c0J5SWQgOiBfaW5zdGFuY2Ukbm9uR3JvdXBlZFI7XG4gICAgICB2YXIgc2VsZWN0QWxsID0gdHlwZW9mIHNldFNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyA/IHNldFNlbGVjdGVkIDogIWlzQWxsUm93c1NlbGVjdGVkOyAvLyBPbmx5IHJlbW92ZS9hZGQgdGhlIHJvd3MgdGhhdCBhcmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXG4gICAgICAvLyAgTGVhdmUgYWxsIHRoZSBvdGhlciByb3dzIHRoYXQgYXJlIHNlbGVjdGVkIGFsb25lLlxuXG4gICAgICB2YXIgc2VsZWN0ZWRSb3dJZHMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZWxlY3RlZFJvd0lkcyk7XG5cbiAgICAgIGlmIChzZWxlY3RBbGwpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChyb3dJZCkge1xuICAgICAgICAgIHNlbGVjdGVkUm93SWRzW3Jvd0lkXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChyb3dJZCkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxlY3RlZFJvd0lkc1tyb3dJZF07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNlbGVjdGVkUm93SWRzOiBzZWxlY3RlZFJvd0lkc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZVJvd1NlbGVjdGVkKSB7XG4gICAgICB2YXIgaWQgPSBhY3Rpb24uaWQsXG4gICAgICAgICAgX3NldFNlbGVjdGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIF9yb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICAgIF9pbnN0YW5jZSRzZWxlY3RTdWJSbyA9IGluc3RhbmNlLnNlbGVjdFN1YlJvd3MsXG4gICAgICAgICAgc2VsZWN0U3ViUm93cyA9IF9pbnN0YW5jZSRzZWxlY3RTdWJSbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRzZWxlY3RTdWJSbyxcbiAgICAgICAgICBnZXRTdWJSb3dzID0gaW5zdGFuY2UuZ2V0U3ViUm93cztcbiAgICAgIHZhciBpc1NlbGVjdGVkID0gc3RhdGUuc2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgdmFyIHNob3VsZEV4aXN0ID0gdHlwZW9mIF9zZXRTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgPyBfc2V0U2VsZWN0ZWQgOiAhaXNTZWxlY3RlZDtcblxuICAgICAgaWYgKGlzU2VsZWN0ZWQgPT09IHNob3VsZEV4aXN0KSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld1NlbGVjdGVkUm93SWRzID0gX2V4dGVuZHMoe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgdmFyIGhhbmRsZVJvd0J5SWQgPSBmdW5jdGlvbiBoYW5kbGVSb3dCeUlkKGlkKSB7XG4gICAgICAgIHZhciByb3cgPSBfcm93c0J5SWRbaWRdO1xuXG4gICAgICAgIGlmICghcm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgIGlmIChzaG91bGRFeGlzdCkge1xuICAgICAgICAgICAgbmV3U2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIG5ld1NlbGVjdGVkUm93SWRzW2lkXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0U3ViUm93cyAmJiBnZXRTdWJSb3dzKHJvdykpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0U3ViUm93cyhyb3cpLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVJvd0J5SWQocm93LmlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlUm93QnlJZChpZCk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNlbGVjdGVkUm93SWRzOiBuZXdTZWxlY3RlZFJvd0lkc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQpIHtcbiAgICAgIHZhciBfc2V0U2VsZWN0ZWQyID0gYWN0aW9uLnZhbHVlO1xuXG4gICAgICB2YXIgcGFnZSA9IGluc3RhbmNlLnBhZ2UsXG4gICAgICAgICAgX3Jvd3NCeUlkMiA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICAgIF9pbnN0YW5jZSRzZWxlY3RTdWJSbzIgPSBpbnN0YW5jZS5zZWxlY3RTdWJSb3dzLFxuICAgICAgICAgIF9zZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvMiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRzZWxlY3RTdWJSbzIsXG4gICAgICAgICAgaXNBbGxQYWdlUm93c1NlbGVjdGVkID0gaW5zdGFuY2UuaXNBbGxQYWdlUm93c1NlbGVjdGVkLFxuICAgICAgICAgIF9nZXRTdWJSb3dzID0gaW5zdGFuY2UuZ2V0U3ViUm93cztcblxuICAgICAgdmFyIF9zZWxlY3RBbGwgPSB0eXBlb2YgX3NldFNlbGVjdGVkMiAhPT0gJ3VuZGVmaW5lZCcgPyBfc2V0U2VsZWN0ZWQyIDogIWlzQWxsUGFnZVJvd3NTZWxlY3RlZDtcblxuICAgICAgdmFyIF9uZXdTZWxlY3RlZFJvd0lkcyA9IF9leHRlbmRzKHt9LCBzdGF0ZS5zZWxlY3RlZFJvd0lkcyk7XG5cbiAgICAgIHZhciBfaGFuZGxlUm93QnlJZCA9IGZ1bmN0aW9uIF9oYW5kbGVSb3dCeUlkKGlkKSB7XG4gICAgICAgIHZhciByb3cgPSBfcm93c0J5SWQyW2lkXTtcblxuICAgICAgICBpZiAoIXJvdy5pc0dyb3VwZWQpIHtcbiAgICAgICAgICBpZiAoX3NlbGVjdEFsbCkge1xuICAgICAgICAgICAgX25ld1NlbGVjdGVkUm93SWRzW2lkXSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBfbmV3U2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfc2VsZWN0U3ViUm93cyAmJiBfZ2V0U3ViUm93cyhyb3cpKSB7XG4gICAgICAgICAgcmV0dXJuIF9nZXRTdWJSb3dzKHJvdykuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gX2hhbmRsZVJvd0J5SWQocm93LmlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcGFnZS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgcmV0dXJuIF9oYW5kbGVSb3dCeUlkKHJvdy5pZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IF9uZXdTZWxlY3RlZFJvd0lkc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkOChpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBfaW5zdGFuY2Ukbm9uR3JvdXBlZFIyID0gaW5zdGFuY2Uubm9uR3JvdXBlZFJvd3NCeUlkLFxuICAgICAgICBub25Hcm91cGVkUm93c0J5SWQgPSBfaW5zdGFuY2Ukbm9uR3JvdXBlZFIyID09PSB2b2lkIDAgPyByb3dzQnlJZCA6IF9pbnN0YW5jZSRub25Hcm91cGVkUjIsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRTZSA9IGluc3RhbmNlLmF1dG9SZXNldFNlbGVjdGVkUm93cyxcbiAgICAgICAgYXV0b1Jlc2V0U2VsZWN0ZWRSb3dzID0gX2luc3RhbmNlJGF1dG9SZXNldFNlID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFNlLFxuICAgICAgICBzZWxlY3RlZFJvd0lkcyA9IGluc3RhbmNlLnN0YXRlLnNlbGVjdGVkUm93SWRzLFxuICAgICAgICBfaW5zdGFuY2Ukc2VsZWN0U3ViUm8zID0gaW5zdGFuY2Uuc2VsZWN0U3ViUm93cyxcbiAgICAgICAgc2VsZWN0U3ViUm93cyA9IF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2Ukc2VsZWN0U3ViUm8zLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBwYWdlID0gaW5zdGFuY2UucGFnZSxcbiAgICAgICAgZ2V0U3ViUm93cyA9IGluc3RhbmNlLmdldFN1YlJvd3M7XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VGaWx0ZXJzJywgJ3VzZUdyb3VwQnknLCAndXNlU29ydEJ5JywgJ3VzZUV4cGFuZGVkJywgJ3VzZVBhZ2luYXRpb24nXSwgJ3VzZVJvd1NlbGVjdCcpO1xuICAgIHZhciBzZWxlY3RlZEZsYXRSb3dzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZWN0ZWRGbGF0Um93cyA9IFtdO1xuICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzZWxlY3RTdWJSb3dzID8gZ2V0Um93SXNTZWxlY3RlZChyb3csIHNlbGVjdGVkUm93SWRzLCBnZXRTdWJSb3dzKSA6ICEhc2VsZWN0ZWRSb3dJZHNbcm93LmlkXTtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSAhIWlzU2VsZWN0ZWQ7XG4gICAgICAgIHJvdy5pc1NvbWVTZWxlY3RlZCA9IGlzU2VsZWN0ZWQgPT09IG51bGw7XG5cbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBzZWxlY3RlZEZsYXRSb3dzLnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRGbGF0Um93cztcbiAgICB9LCBbcm93cywgc2VsZWN0U3ViUm93cywgc2VsZWN0ZWRSb3dJZHMsIGdldFN1YlJvd3NdKTtcbiAgICB2YXIgaXNBbGxSb3dzU2VsZWN0ZWQgPSBCb29sZWFuKE9iamVjdC5rZXlzKG5vbkdyb3VwZWRSb3dzQnlJZCkubGVuZ3RoICYmIE9iamVjdC5rZXlzKHNlbGVjdGVkUm93SWRzKS5sZW5ndGgpO1xuICAgIHZhciBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBpc0FsbFJvd3NTZWxlY3RlZDtcblxuICAgIGlmIChpc0FsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKG5vbkdyb3VwZWRSb3dzQnlJZCkuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuICFzZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSkge1xuICAgICAgICBpc0FsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNBbGxSb3dzU2VsZWN0ZWQpIHtcbiAgICAgIGlmIChwYWdlICYmIHBhZ2UubGVuZ3RoICYmIHBhZ2Uuc29tZShmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgdmFyIGlkID0gX3JlZjUuaWQ7XG4gICAgICAgIHJldHVybiAhc2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgfSkpIHtcbiAgICAgICAgaXNBbGxQYWdlUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGdldEF1dG9SZXNldFNlbGVjdGVkUm93cyA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRTZWxlY3RlZFJvd3MpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFNlbGVjdGVkUm93cygpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0U2VsZWN0ZWRSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGF0YV0pO1xuICAgIHZhciB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUm93c1NlbGVjdGVkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciB0b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHRvZ2dsZVJvd1NlbGVjdGVkID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVSb3dTZWxlY3RlZCxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgdmFyIGdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICB2YXIgZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgc2VsZWN0ZWRGbGF0Um93czogc2VsZWN0ZWRGbGF0Um93cyxcbiAgICAgIGlzQWxsUm93c1NlbGVjdGVkOiBpc0FsbFJvd3NTZWxlY3RlZCxcbiAgICAgIGlzQWxsUGFnZVJvd3NTZWxlY3RlZDogaXNBbGxQYWdlUm93c1NlbGVjdGVkLFxuICAgICAgdG9nZ2xlUm93U2VsZWN0ZWQ6IHRvZ2dsZVJvd1NlbGVjdGVkLFxuICAgICAgdG9nZ2xlQWxsUm93c1NlbGVjdGVkOiB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wczogZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMsXG4gICAgICBnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHM6IGdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcyxcbiAgICAgIHRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQ6IHRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMyhyb3csIF9yZWY2KSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjYuaW5zdGFuY2U7XG5cbiAgICByb3cudG9nZ2xlUm93U2VsZWN0ZWQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUm93U2VsZWN0ZWQocm93LmlkLCBzZXQpO1xuICAgIH07XG5cbiAgICByb3cuZ2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGluc3RhbmNlLmdldEhvb2tzKCkuZ2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgcm93OiByb3dcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJvd0lzU2VsZWN0ZWQocm93LCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93cykge1xuICAgIGlmIChzZWxlY3RlZFJvd0lkc1tyb3cuaWRdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc3ViUm93cyA9IGdldFN1YlJvd3Mocm93KTtcblxuICAgIGlmIChzdWJSb3dzICYmIHN1YlJvd3MubGVuZ3RoKSB7XG4gICAgICB2YXIgYWxsQ2hpbGRyZW5TZWxlY3RlZCA9IHRydWU7XG4gICAgICB2YXIgc29tZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBzdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKHN1YlJvdykge1xuICAgICAgICAvLyBCYWlsIG91dCBlYXJseSBpZiB3ZSBrbm93IGJvdGggb2YgdGhlc2VcbiAgICAgICAgaWYgKHNvbWVTZWxlY3RlZCAmJiAhYWxsQ2hpbGRyZW5TZWxlY3RlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRSb3dJc1NlbGVjdGVkKHN1YlJvdywgc2VsZWN0ZWRSb3dJZHMsIGdldFN1YlJvd3MpKSB7XG4gICAgICAgICAgc29tZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbGxDaGlsZHJlblNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFsbENoaWxkcmVuU2VsZWN0ZWQgPyB0cnVlIDogc29tZVNlbGVjdGVkID8gbnVsbCA6IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0SW5pdGlhbFJvd1N0YXRlQWNjZXNzb3IgPSBmdW5jdGlvbiBkZWZhdWx0SW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIHZhciBkZWZhdWx0SW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yID0gZnVuY3Rpb24gZGVmYXVsdEluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcihjZWxsKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9OyAvLyBBY3Rpb25zXG5cblxuICBhY3Rpb25zLnNldFJvd1N0YXRlID0gJ3NldFJvd1N0YXRlJztcbiAgYWN0aW9ucy5zZXRDZWxsU3RhdGUgPSAnc2V0Q2VsbFN0YXRlJztcbiAgYWN0aW9ucy5yZXNldFJvd1N0YXRlID0gJ3Jlc2V0Um93U3RhdGUnO1xuICB2YXIgdXNlUm93U3RhdGUgPSBmdW5jdGlvbiB1c2VSb3dTdGF0ZShob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDkpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkOSk7XG4gICAgaG9va3MucHJlcGFyZVJvdy5wdXNoKHByZXBhcmVSb3ckNCk7XG4gIH07XG4gIHVzZVJvd1N0YXRlLnBsdWdpbk5hbWUgPSAndXNlUm93U3RhdGUnO1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkOShzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIHZhciBfaW5zdGFuY2UkaW5pdGlhbFJvd1MgPSBpbnN0YW5jZS5pbml0aWFsUm93U3RhdGVBY2Nlc3NvcixcbiAgICAgICAgaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3IgPSBfaW5zdGFuY2UkaW5pdGlhbFJvd1MgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsUm93UyxcbiAgICAgICAgX2luc3RhbmNlJGluaXRpYWxDZWxsID0gaW5zdGFuY2UuaW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgPSBfaW5zdGFuY2UkaW5pdGlhbENlbGwgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgOiBfaW5zdGFuY2UkaW5pdGlhbENlbGwsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQ7XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgcm93U3RhdGU6IHt9XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0Um93U3RhdGUpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcm93U3RhdGU6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5yb3dTdGF0ZSB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFJvd1N0YXRlKSB7XG4gICAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgICB2YXIgcm93SWQgPSBhY3Rpb24ucm93SWQsXG4gICAgICAgICAgdmFsdWUgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgb2xkUm93U3RhdGUgPSB0eXBlb2Ygc3RhdGUucm93U3RhdGVbcm93SWRdICE9PSAndW5kZWZpbmVkJyA/IHN0YXRlLnJvd1N0YXRlW3Jvd0lkXSA6IGluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yKHJvd3NCeUlkW3Jvd0lkXSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHJvd1N0YXRlOiBfZXh0ZW5kcyh7fSwgc3RhdGUucm93U3RhdGUsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3Jvd0lkXSA9IGZ1bmN0aW9uYWxVcGRhdGUodmFsdWUsIG9sZFJvd1N0YXRlKSwgX2V4dGVuZHMyKSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRDZWxsU3RhdGUpIHtcbiAgICAgIHZhciBfb2xkUm93U3RhdGUkY2VsbFN0YXQsIF9yb3dzQnlJZCRfcm93SWQsIF9yb3dzQnlJZCRfcm93SWQkY2VsbCwgX2V4dGVuZHMzLCBfZXh0ZW5kczQ7XG5cbiAgICAgIHZhciBfcm93SWQgPSBhY3Rpb24ucm93SWQsXG4gICAgICAgICAgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgX3ZhbHVlID0gYWN0aW9uLnZhbHVlO1xuXG4gICAgICB2YXIgX29sZFJvd1N0YXRlID0gdHlwZW9mIHN0YXRlLnJvd1N0YXRlW19yb3dJZF0gIT09ICd1bmRlZmluZWQnID8gc3RhdGUucm93U3RhdGVbX3Jvd0lkXSA6IGluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yKHJvd3NCeUlkW19yb3dJZF0pO1xuXG4gICAgICB2YXIgb2xkQ2VsbFN0YXRlID0gdHlwZW9mIChfb2xkUm93U3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IChfb2xkUm93U3RhdGUkY2VsbFN0YXQgPSBfb2xkUm93U3RhdGUuY2VsbFN0YXRlKSA9PSBudWxsID8gdm9pZCAwIDogX29sZFJvd1N0YXRlJGNlbGxTdGF0W2NvbHVtbklkXSkgIT09ICd1bmRlZmluZWQnID8gX29sZFJvd1N0YXRlLmNlbGxTdGF0ZVtjb2x1bW5JZF0gOiBpbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IoKF9yb3dzQnlJZCRfcm93SWQgPSByb3dzQnlJZFtfcm93SWRdKSA9PSBudWxsID8gdm9pZCAwIDogKF9yb3dzQnlJZCRfcm93SWQkY2VsbCA9IF9yb3dzQnlJZCRfcm93SWQuY2VsbHMpID09IG51bGwgPyB2b2lkIDAgOiBfcm93c0J5SWQkX3Jvd0lkJGNlbGwuZmluZChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgICByZXR1cm4gY2VsbC5jb2x1bW4uaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICByb3dTdGF0ZTogX2V4dGVuZHMoe30sIHN0YXRlLnJvd1N0YXRlLCAoX2V4dGVuZHM0ID0ge30sIF9leHRlbmRzNFtfcm93SWRdID0gX2V4dGVuZHMoe30sIF9vbGRSb3dTdGF0ZSwge1xuICAgICAgICAgIGNlbGxTdGF0ZTogX2V4dGVuZHMoe30sIF9vbGRSb3dTdGF0ZS5jZWxsU3RhdGUgfHwge30sIChfZXh0ZW5kczMgPSB7fSwgX2V4dGVuZHMzW2NvbHVtbklkXSA9IGZ1bmN0aW9uYWxVcGRhdGUoX3ZhbHVlLCBvbGRDZWxsU3RhdGUpLCBfZXh0ZW5kczMpKVxuICAgICAgICB9KSwgX2V4dGVuZHM0KSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDkoaW5zdGFuY2UpIHtcbiAgICB2YXIgX2luc3RhbmNlJGF1dG9SZXNldFJvID0gaW5zdGFuY2UuYXV0b1Jlc2V0Um93U3RhdGUsXG4gICAgICAgIGF1dG9SZXNldFJvd1N0YXRlID0gX2luc3RhbmNlJGF1dG9SZXNldFJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFJvLFxuICAgICAgICBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaDtcbiAgICB2YXIgc2V0Um93U3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocm93SWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldFJvd1N0YXRlLFxuICAgICAgICByb3dJZDogcm93SWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHNldENlbGxTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3dJZCwgY29sdW1uSWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldENlbGxTdGF0ZSxcbiAgICAgICAgcm93SWQ6IHJvd0lkLFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldEF1dG9SZXNldFJvd1N0YXRlID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFJvd1N0YXRlKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRSb3dTdGF0ZSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0Um93U3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2RhdGFdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBzZXRSb3dTdGF0ZTogc2V0Um93U3RhdGUsXG4gICAgICBzZXRDZWxsU3RhdGU6IHNldENlbGxTdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyQ0KHJvdywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgdmFyIF9pbnN0YW5jZSRpbml0aWFsUm93UzIgPSBpbnN0YW5jZS5pbml0aWFsUm93U3RhdGVBY2Nlc3NvcixcbiAgICAgICAgaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3IgPSBfaW5zdGFuY2UkaW5pdGlhbFJvd1MyID09PSB2b2lkIDAgPyBkZWZhdWx0SW5pdGlhbFJvd1N0YXRlQWNjZXNzb3IgOiBfaW5zdGFuY2UkaW5pdGlhbFJvd1MyLFxuICAgICAgICBfaW5zdGFuY2UkaW5pdGlhbENlbGwyID0gaW5zdGFuY2UuaW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgPSBfaW5zdGFuY2UkaW5pdGlhbENlbGwyID09PSB2b2lkIDAgPyBkZWZhdWx0SW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yIDogX2luc3RhbmNlJGluaXRpYWxDZWxsMixcbiAgICAgICAgcm93U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZS5yb3dTdGF0ZTtcblxuICAgIGlmIChyb3cpIHtcbiAgICAgIHJvdy5zdGF0ZSA9IHR5cGVvZiByb3dTdGF0ZVtyb3cuaWRdICE9PSAndW5kZWZpbmVkJyA/IHJvd1N0YXRlW3Jvdy5pZF0gOiBpbml0aWFsUm93U3RhdGVBY2Nlc3Nvcihyb3cpO1xuXG4gICAgICByb3cuc2V0U3RhdGUgPSBmdW5jdGlvbiAodXBkYXRlcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Um93U3RhdGUocm93LmlkLCB1cGRhdGVyKTtcbiAgICAgIH07XG5cbiAgICAgIHJvdy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgIGlmICghcm93LnN0YXRlLmNlbGxTdGF0ZSkge1xuICAgICAgICAgIHJvdy5zdGF0ZS5jZWxsU3RhdGUgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNlbGwuc3RhdGUgPSB0eXBlb2Ygcm93LnN0YXRlLmNlbGxTdGF0ZVtjZWxsLmNvbHVtbi5pZF0gIT09ICd1bmRlZmluZWQnID8gcm93LnN0YXRlLmNlbGxTdGF0ZVtjZWxsLmNvbHVtbi5pZF0gOiBpbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IoY2VsbCk7XG5cbiAgICAgICAgY2VsbC5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnNldENlbGxTdGF0ZShyb3cuaWQsIGNlbGwuY29sdW1uLmlkLCB1cGRhdGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbnMucmVzZXRDb2x1bW5PcmRlciA9ICdyZXNldENvbHVtbk9yZGVyJztcbiAgYWN0aW9ucy5zZXRDb2x1bW5PcmRlciA9ICdzZXRDb2x1bW5PcmRlcic7XG4gIHZhciB1c2VDb2x1bW5PcmRlciA9IGZ1bmN0aW9uIHVzZUNvbHVtbk9yZGVyKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnNEZXBzLnB1c2goZnVuY3Rpb24gKGRlcHMsIF9yZWYpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gW10uY29uY2F0KGRlcHMsIFtpbnN0YW5jZS5zdGF0ZS5jb2x1bW5PcmRlcl0pO1xuICAgIH0pO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zLnB1c2godmlzaWJsZUNvbHVtbnMkMik7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSRhKTtcbiAgfTtcbiAgdXNlQ29sdW1uT3JkZXIucGx1Z2luTmFtZSA9ICd1c2VDb2x1bW5PcmRlcic7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRhKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGNvbHVtbk9yZGVyOiBbXVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldENvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGNvbHVtbk9yZGVyOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuY29sdW1uT3JkZXIgfHwgW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRDb2x1bW5PcmRlcikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5PcmRlcjogZnVuY3Rpb25hbFVwZGF0ZShhY3Rpb24uY29sdW1uT3JkZXIsIHN0YXRlLmNvbHVtbk9yZGVyKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZUNvbHVtbnMkMihjb2x1bW5zLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW5PcmRlciA9IF9yZWYyLmluc3RhbmNlLnN0YXRlLmNvbHVtbk9yZGVyO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gb3JkZXIsIHJldHVybiB0aGUgbm9ybWFsIGNvbHVtbnNcbiAgICBpZiAoIWNvbHVtbk9yZGVyIHx8ICFjb2x1bW5PcmRlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5PcmRlckNvcHkgPSBbXS5jb25jYXQoY29sdW1uT3JkZXIpOyAvLyBJZiB0aGVyZSBpcyBhbiBvcmRlciwgbWFrZSBhIGNvcHkgb2YgdGhlIGNvbHVtbnNcblxuICAgIHZhciBjb2x1bW5zQ29weSA9IFtdLmNvbmNhdChjb2x1bW5zKTsgLy8gQW5kIG1ha2UgYSBuZXcgb3JkZXJlZCBhcnJheSBvZiB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnNJbk9yZGVyID0gW107IC8vIExvb3Agb3ZlciB0aGUgY29sdW1ucyBhbmQgcGxhY2UgdGhlbSBpbiBvcmRlciBpbnRvIHRoZSBuZXcgYXJyYXlcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIHRhcmdldENvbHVtbklkID0gY29sdW1uT3JkZXJDb3B5LnNoaWZ0KCk7XG4gICAgICB2YXIgZm91bmRJbmRleCA9IGNvbHVtbnNDb3B5LmZpbmRJbmRleChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gdGFyZ2V0Q29sdW1uSWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xuICAgICAgICBjb2x1bW5zSW5PcmRlci5wdXNoKGNvbHVtbnNDb3B5LnNwbGljZShmb3VuZEluZGV4LCAxKVswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdoaWxlIChjb2x1bW5zQ29weS5sZW5ndGggJiYgY29sdW1uT3JkZXJDb3B5Lmxlbmd0aCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9IC8vIElmIHRoZXJlIGFyZSBhbnkgY29sdW1ucyBsZWZ0LCBhZGQgdGhlbSB0byB0aGUgZW5kXG5cblxuICAgIHJldHVybiBbXS5jb25jYXQoY29sdW1uc0luT3JkZXIsIGNvbHVtbnNDb3B5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJGEoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaDtcbiAgICBpbnN0YW5jZS5zZXRDb2x1bW5PcmRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5PcmRlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRDb2x1bW5PcmRlcixcbiAgICAgICAgY29sdW1uT3JkZXI6IGNvbHVtbk9yZGVyXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgfVxuXG4gIGRlZmF1bHRDb2x1bW4uY2FuUmVzaXplID0gdHJ1ZTsgLy8gQWN0aW9uc1xuXG4gIGFjdGlvbnMuY29sdW1uU3RhcnRSZXNpemluZyA9ICdjb2x1bW5TdGFydFJlc2l6aW5nJztcbiAgYWN0aW9ucy5jb2x1bW5SZXNpemluZyA9ICdjb2x1bW5SZXNpemluZyc7XG4gIGFjdGlvbnMuY29sdW1uRG9uZVJlc2l6aW5nID0gJ2NvbHVtbkRvbmVSZXNpemluZyc7XG4gIGFjdGlvbnMucmVzZXRSZXNpemUgPSAncmVzZXRSZXNpemUnO1xuICB2YXIgdXNlUmVzaXplQ29sdW1ucyA9IGZ1bmN0aW9uIHVzZVJlc2l6ZUNvbHVtbnMoaG9va3MpIHtcbiAgICBob29rcy5nZXRSZXNpemVyUHJvcHMgPSBbZGVmYXVsdEdldFJlc2l6ZXJQcm9wc107XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaCh7XG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgfVxuICAgIH0pO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJGIpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkYik7XG4gICAgaG9va3MudXNlSW5zdGFuY2VCZWZvcmVEaW1lbnNpb25zLnB1c2godXNlSW5zdGFuY2VCZWZvcmVEaW1lbnNpb25zJDEpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0UmVzaXplclByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFJlc2l6ZXJQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICAgIGhlYWRlciA9IF9yZWYuaGVhZGVyO1xuICAgIHZhciBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuXG4gICAgdmFyIG9uUmVzaXplU3RhcnQgPSBmdW5jdGlvbiBvblJlc2l6ZVN0YXJ0KGUsIGhlYWRlcikge1xuICAgICAgdmFyIGlzVG91Y2hFdmVudCA9IGZhbHNlO1xuXG4gICAgICBpZiAoZS50eXBlID09PSAndG91Y2hzdGFydCcpIHtcbiAgICAgICAgLy8gbGV0cyBub3QgcmVzcG9uZCB0byBtdWx0aXBsZSB0b3VjaGVzIChlLmcuIDIgb3IgMyBmaW5nZXJzKVxuICAgICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNUb3VjaEV2ZW50ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhlYWRlcnNUb1Jlc2l6ZSA9IGdldExlYWZIZWFkZXJzKGhlYWRlcik7XG4gICAgICB2YXIgaGVhZGVySWRXaWR0aHMgPSBoZWFkZXJzVG9SZXNpemUubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBbZC5pZCwgZC50b3RhbFdpZHRoXTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGNsaWVudFggPSBpc1RvdWNoRXZlbnQgPyBNYXRoLnJvdW5kKGUudG91Y2hlc1swXS5jbGllbnRYKSA6IGUuY2xpZW50WDtcblxuICAgICAgdmFyIGRpc3BhdGNoTW92ZSA9IGZ1bmN0aW9uIGRpc3BhdGNoTW92ZShjbGllbnRYUG9zKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLmNvbHVtblJlc2l6aW5nLFxuICAgICAgICAgIGNsaWVudFg6IGNsaWVudFhQb3NcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZGlzcGF0Y2hFbmQgPSBmdW5jdGlvbiBkaXNwYXRjaEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLmNvbHVtbkRvbmVSZXNpemluZ1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBoYW5kbGVyc0FuZEV2ZW50cyA9IHtcbiAgICAgICAgbW91c2U6IHtcbiAgICAgICAgICBtb3ZlRXZlbnQ6ICdtb3VzZW1vdmUnLFxuICAgICAgICAgIG1vdmVIYW5kbGVyOiBmdW5jdGlvbiBtb3ZlSGFuZGxlcihlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2hNb3ZlKGUuY2xpZW50WCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cEV2ZW50OiAnbW91c2V1cCcsXG4gICAgICAgICAgdXBIYW5kbGVyOiBmdW5jdGlvbiB1cEhhbmRsZXIoZSkge1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlcnNBbmRFdmVudHMubW91c2UubW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZXJzQW5kRXZlbnRzLm1vdXNlLnVwSGFuZGxlcik7XG4gICAgICAgICAgICBkaXNwYXRjaEVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdG91Y2g6IHtcbiAgICAgICAgICBtb3ZlRXZlbnQ6ICd0b3VjaG1vdmUnLFxuICAgICAgICAgIG1vdmVIYW5kbGVyOiBmdW5jdGlvbiBtb3ZlSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlzcGF0Y2hNb3ZlKGUudG91Y2hlc1swXS5jbGllbnRYKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwRXZlbnQ6ICd0b3VjaGVuZCcsXG4gICAgICAgICAgdXBIYW5kbGVyOiBmdW5jdGlvbiB1cEhhbmRsZXIoZSkge1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC5tb3ZlRXZlbnQsIGhhbmRsZXJzQW5kRXZlbnRzLnRvdWNoLm1vdmVIYW5kbGVyKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcnNBbmRFdmVudHMudG91Y2gudXBFdmVudCwgaGFuZGxlcnNBbmRFdmVudHMudG91Y2gubW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgZGlzcGF0Y2hFbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgZXZlbnRzID0gaXNUb3VjaEV2ZW50ID8gaGFuZGxlcnNBbmRFdmVudHMudG91Y2ggOiBoYW5kbGVyc0FuZEV2ZW50cy5tb3VzZTtcbiAgICAgIHZhciBwYXNzaXZlSWZTdXBwb3J0ZWQgPSBwYXNzaXZlRXZlbnRTdXBwb3J0ZWQoKSA/IHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0gOiBmYWxzZTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRzLm1vdmVFdmVudCwgZXZlbnRzLm1vdmVIYW5kbGVyLCBwYXNzaXZlSWZTdXBwb3J0ZWQpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMudXBFdmVudCwgZXZlbnRzLnVwSGFuZGxlciwgcGFzc2l2ZUlmU3VwcG9ydGVkKTtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nLFxuICAgICAgICBjb2x1bW5JZDogaGVhZGVyLmlkLFxuICAgICAgICBjb2x1bW5XaWR0aDogaGVhZGVyLnRvdGFsV2lkdGgsXG4gICAgICAgIGhlYWRlcklkV2lkdGhzOiBoZWFkZXJJZFdpZHRocyxcbiAgICAgICAgY2xpZW50WDogY2xpZW50WFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIHJldHVybiBlLnBlcnNpc3QoKSB8fCBvblJlc2l6ZVN0YXJ0KGUsIGhlYWRlcik7XG4gICAgICB9LFxuICAgICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgICAgICByZXR1cm4gZS5wZXJzaXN0KCkgfHwgb25SZXNpemVTdGFydChlLCBoZWFkZXIpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ2NvbC1yZXNpemUnXG4gICAgICB9LFxuICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgIHJvbGU6ICdzZXBhcmF0b3InXG4gICAgfV07XG4gIH07XG5cbiAgdXNlUmVzaXplQ29sdW1ucy5wbHVnaW5OYW1lID0gJ3VzZVJlc2l6ZUNvbHVtbnMnO1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkYihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGNvbHVtblJlc2l6aW5nOiB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiB7fVxuICAgICAgICB9XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0UmVzaXplKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGNvbHVtblJlc2l6aW5nOiB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiB7fVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuY29sdW1uU3RhcnRSZXNpemluZykge1xuICAgICAgdmFyIGNsaWVudFggPSBhY3Rpb24uY2xpZW50WCxcbiAgICAgICAgICBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBjb2x1bW5XaWR0aCA9IGFjdGlvbi5jb2x1bW5XaWR0aCxcbiAgICAgICAgICBoZWFkZXJJZFdpZHRocyA9IGFjdGlvbi5oZWFkZXJJZFdpZHRocztcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IF9leHRlbmRzKHt9LCBzdGF0ZS5jb2x1bW5SZXNpemluZywge1xuICAgICAgICAgIHN0YXJ0WDogY2xpZW50WCxcbiAgICAgICAgICBoZWFkZXJJZFdpZHRoczogaGVhZGVySWRXaWR0aHMsXG4gICAgICAgICAgY29sdW1uV2lkdGg6IGNvbHVtbldpZHRoLFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IGNvbHVtbklkXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuY29sdW1uUmVzaXppbmcpIHtcbiAgICAgIHZhciBfY2xpZW50WCA9IGFjdGlvbi5jbGllbnRYO1xuXG4gICAgICB2YXIgX3N0YXRlJGNvbHVtblJlc2l6aW5nID0gc3RhdGUuY29sdW1uUmVzaXppbmcsXG4gICAgICAgICAgc3RhcnRYID0gX3N0YXRlJGNvbHVtblJlc2l6aW5nLnN0YXJ0WCxcbiAgICAgICAgICBfY29sdW1uV2lkdGggPSBfc3RhdGUkY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGgsXG4gICAgICAgICAgX3N0YXRlJGNvbHVtblJlc2l6aW5nMiA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZy5oZWFkZXJJZFdpZHRocyxcbiAgICAgICAgICBfaGVhZGVySWRXaWR0aHMgPSBfc3RhdGUkY29sdW1uUmVzaXppbmcyID09PSB2b2lkIDAgPyBbXSA6IF9zdGF0ZSRjb2x1bW5SZXNpemluZzI7XG5cbiAgICAgIHZhciBkZWx0YVggPSBfY2xpZW50WCAtIHN0YXJ0WDtcbiAgICAgIHZhciBwZXJjZW50YWdlRGVsdGFYID0gZGVsdGFYIC8gX2NvbHVtbldpZHRoO1xuICAgICAgdmFyIG5ld0NvbHVtbldpZHRocyA9IHt9O1xuXG4gICAgICBfaGVhZGVySWRXaWR0aHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGhlYWRlcklkID0gX3JlZjJbMF0sXG4gICAgICAgICAgICBoZWFkZXJXaWR0aCA9IF9yZWYyWzFdO1xuICAgICAgICBuZXdDb2x1bW5XaWR0aHNbaGVhZGVySWRdID0gTWF0aC5tYXgoaGVhZGVyV2lkdGggKyBoZWFkZXJXaWR0aCAqIHBlcmNlbnRhZ2VEZWx0YVgsIDApO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IF9leHRlbmRzKHt9LCBzdGF0ZS5jb2x1bW5SZXNpemluZywge1xuICAgICAgICAgIGNvbHVtbldpZHRoczogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLmNvbHVtbldpZHRocywge30sIG5ld0NvbHVtbldpZHRocylcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5Eb25lUmVzaXppbmcpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IF9leHRlbmRzKHt9LCBzdGF0ZS5jb2x1bW5SZXNpemluZywge1xuICAgICAgICAgIHN0YXJ0WDogbnVsbCxcbiAgICAgICAgICBpc1Jlc2l6aW5nQ29sdW1uOiBudWxsXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXNlSW5zdGFuY2VCZWZvcmVEaW1lbnNpb25zJDEgPSBmdW5jdGlvbiB1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMoaW5zdGFuY2UpIHtcbiAgICB2YXIgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgZGlzYWJsZVJlc2l6aW5nID0gaW5zdGFuY2UuZGlzYWJsZVJlc2l6aW5nLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBjb2x1bW5SZXNpemluZyA9IGluc3RhbmNlLnN0YXRlLmNvbHVtblJlc2l6aW5nO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICB2YXIgY2FuUmVzaXplID0gZ2V0Rmlyc3REZWZpbmVkKGhlYWRlci5kaXNhYmxlUmVzaXppbmcgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZVJlc2l6aW5nID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgaGVhZGVyLmNhblJlc2l6ZSA9IGNhblJlc2l6ZTtcbiAgICAgIGhlYWRlci53aWR0aCA9IGNvbHVtblJlc2l6aW5nLmNvbHVtbldpZHRoc1toZWFkZXIuaWRdIHx8IGhlYWRlci5vcmlnaW5hbFdpZHRoIHx8IGhlYWRlci53aWR0aDtcbiAgICAgIGhlYWRlci5pc1Jlc2l6aW5nID0gY29sdW1uUmVzaXppbmcuaXNSZXNpemluZ0NvbHVtbiA9PT0gaGVhZGVyLmlkO1xuXG4gICAgICBpZiAoY2FuUmVzaXplKSB7XG4gICAgICAgIGhlYWRlci5nZXRSZXNpemVyUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFJlc2l6ZXJQcm9wcywge1xuICAgICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICAgIGhlYWRlcjogaGVhZGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJGIoaW5zdGFuY2UpIHtcbiAgICB2YXIgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRSZSA9IGluc3RhbmNlLmF1dG9SZXNldFJlc2l6ZSxcbiAgICAgICAgYXV0b1Jlc2V0UmVzaXplID0gX2luc3RhbmNlJGF1dG9SZXNldFJlID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFJlLFxuICAgICAgICBjb2x1bW5zID0gaW5zdGFuY2UuY29sdW1ucztcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUFic29sdXRlTGF5b3V0J10sICd1c2VSZXNpemVDb2x1bW5zJyk7XG4gICAgdmFyIGdldEF1dG9SZXNldFJlc2l6ZSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRSZXNpemUpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFJlc2l6ZSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0UmVzaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtjb2x1bW5zXSk7XG4gICAgdmFyIHJlc2V0UmVzaXppbmcgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0UmVzaXplXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICByZXNldFJlc2l6aW5nOiByZXNldFJlc2l6aW5nXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMZWFmSGVhZGVycyhoZWFkZXIpIHtcbiAgICB2YXIgbGVhZkhlYWRlcnMgPSBbXTtcblxuICAgIHZhciByZWN1cnNlSGVhZGVyID0gZnVuY3Rpb24gcmVjdXJzZUhlYWRlcihoZWFkZXIpIHtcbiAgICAgIGlmIChoZWFkZXIuY29sdW1ucyAmJiBoZWFkZXIuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgaGVhZGVyLmNvbHVtbnMubWFwKHJlY3Vyc2VIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBsZWFmSGVhZGVycy5wdXNoKGhlYWRlcik7XG4gICAgfTtcblxuICAgIHJlY3Vyc2VIZWFkZXIoaGVhZGVyKTtcbiAgICByZXR1cm4gbGVhZkhlYWRlcnM7XG4gIH1cblxuICB2YXIgY2VsbFN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6IDBcbiAgfTtcbiAgdmFyIHVzZUFic29sdXRlTGF5b3V0ID0gZnVuY3Rpb24gdXNlQWJzb2x1dGVMYXlvdXQoaG9va3MpIHtcbiAgICBob29rcy5nZXRUYWJsZUJvZHlQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0Um93UHJvcHMucHVzaChnZXRSb3dTdHlsZXMpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMpO1xuICAgIGhvb2tzLmdldEZvb3Rlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMpO1xuICAgIGhvb2tzLmdldEhlYWRlclByb3BzLnB1c2goZnVuY3Rpb24gKHByb3BzLCBfcmVmKSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcywge1xuICAgICAgICAgIGxlZnQ6IGNvbHVtbi50b3RhbExlZnQgKyBcInB4XCIsXG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgY2VsbCA9IF9yZWYyLmNlbGw7XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcywge1xuICAgICAgICAgIGxlZnQ6IGNlbGwuY29sdW1uLnRvdGFsTGVmdCArIFwicHhcIixcbiAgICAgICAgICB3aWR0aDogY2VsbC5jb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgICB9KVxuICAgICAgfV07XG4gICAgfSk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYzKSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZjMuY29sdW1uO1xuICAgICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGNlbGxTdHlsZXMsIHtcbiAgICAgICAgICBsZWZ0OiBjb2x1bW4udG90YWxMZWZ0ICsgXCJweFwiLFxuICAgICAgICAgIHdpZHRoOiBjb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgICB9KVxuICAgICAgfV07XG4gICAgfSk7XG4gIH07XG4gIHVzZUFic29sdXRlTGF5b3V0LnBsdWdpbk5hbWUgPSAndXNlQWJzb2x1dGVMYXlvdXQnO1xuXG4gIHZhciBnZXRSb3dTdHlsZXMgPSBmdW5jdGlvbiBnZXRSb3dTdHlsZXMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjQuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIHdpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNXaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBjZWxsU3R5bGVzJDEgPSB7XG4gICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgfTtcblxuICB2YXIgZ2V0Um93U3R5bGVzJDEgPSBmdW5jdGlvbiBnZXRSb3dTdHlsZXMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgd2lkdGg6IGluc3RhbmNlLnRvdGFsQ29sdW1uc1dpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIHVzZUJsb2NrTGF5b3V0ID0gZnVuY3Rpb24gdXNlQmxvY2tMYXlvdXQoaG9va3MpIHtcbiAgICBob29rcy5nZXRSb3dQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQxKTtcbiAgICBob29rcy5nZXRIZWFkZXJHcm91cFByb3BzLnB1c2goZ2V0Um93U3R5bGVzJDEpO1xuICAgIGhvb2tzLmdldEZvb3Rlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMSk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZjIuY29sdW1uO1xuICAgICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGNlbGxTdHlsZXMkMSwge1xuICAgICAgICAgIHdpZHRoOiBjb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgICB9KVxuICAgICAgfV07XG4gICAgfSk7XG4gICAgaG9va3MuZ2V0Q2VsbFByb3BzLnB1c2goZnVuY3Rpb24gKHByb3BzLCBfcmVmMykge1xuICAgICAgdmFyIGNlbGwgPSBfcmVmMy5jZWxsO1xuICAgICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGNlbGxTdHlsZXMkMSwge1xuICAgICAgICAgIHdpZHRoOiBjZWxsLmNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRGb290ZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjQpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmNC5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgfTtcbiAgdXNlQmxvY2tMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VCbG9ja0xheW91dCc7XG5cbiAgZnVuY3Rpb24gdXNlRmxleExheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFRhYmxlUHJvcHMucHVzaChnZXRUYWJsZVByb3BzKTtcbiAgICBob29rcy5nZXRSb3dQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQyKTtcbiAgICBob29rcy5nZXRIZWFkZXJHcm91cFByb3BzLnB1c2goZ2V0Um93U3R5bGVzJDIpO1xuICAgIGhvb2tzLmdldEZvb3Rlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMik7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChnZXRIZWFkZXJQcm9wcyk7XG4gICAgaG9va3MuZ2V0Q2VsbFByb3BzLnB1c2goZ2V0Q2VsbFByb3BzKTtcbiAgICBob29rcy5nZXRGb290ZXJQcm9wcy5wdXNoKGdldEZvb3RlclByb3BzKTtcbiAgfVxuICB1c2VGbGV4TGF5b3V0LnBsdWdpbk5hbWUgPSAndXNlRmxleExheW91dCc7XG5cbiAgdmFyIGdldFRhYmxlUHJvcHMgPSBmdW5jdGlvbiBnZXRUYWJsZVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBtaW5XaWR0aDogaW5zdGFuY2UudG90YWxDb2x1bW5zTWluV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0Um93U3R5bGVzJDIgPSBmdW5jdGlvbiBnZXRSb3dTdHlsZXMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjIuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4OiAnMSAwIGF1dG8nLFxuICAgICAgICBtaW5XaWR0aDogaW5zdGFuY2UudG90YWxDb2x1bW5zTWluV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0SGVhZGVyUHJvcHMgPSBmdW5jdGlvbiBnZXRIZWFkZXJQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjMuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjb2x1bW4udG90YWxGbGV4V2lkdGggPyBjb2x1bW4udG90YWxGbGV4V2lkdGggKyBcIiAwIGF1dG9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluV2lkdGg6IGNvbHVtbi50b3RhbE1pbldpZHRoICsgXCJweFwiLFxuICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0Q2VsbFByb3BzID0gZnVuY3Rpb24gZ2V0Q2VsbFByb3BzKHByb3BzLCBfcmVmNCkge1xuICAgIHZhciBjZWxsID0gX3JlZjQuY2VsbDtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgZmxleDogY2VsbC5jb2x1bW4udG90YWxGbGV4V2lkdGggKyBcIiAwIGF1dG9cIixcbiAgICAgICAgbWluV2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsTWluV2lkdGggKyBcInB4XCIsXG4gICAgICAgIHdpZHRoOiBjZWxsLmNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGdldEZvb3RlclByb3BzID0gZnVuY3Rpb24gZ2V0Rm9vdGVyUHJvcHMocHJvcHMsIF9yZWY1KSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWY1LmNvbHVtbjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgZmxleDogY29sdW1uLnRvdGFsRmxleFdpZHRoID8gY29sdW1uLnRvdGFsRmxleFdpZHRoICsgXCIgMCBhdXRvXCIgOiB1bmRlZmluZWQsXG4gICAgICAgIG1pbldpZHRoOiBjb2x1bW4udG90YWxNaW5XaWR0aCArIFwicHhcIixcbiAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgZnVuY3Rpb24gdXNlR3JpZExheW91dChob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJGMpO1xuICAgIGhvb2tzLmdldFRhYmxlUHJvcHMucHVzaChnZXRUYWJsZVByb3BzJDEpO1xuICAgIGhvb2tzLmdldEhlYWRlclByb3BzLnB1c2goZ2V0SGVhZGVyUHJvcHMkMSk7XG4gIH1cbiAgdXNlR3JpZExheW91dC5wbHVnaW5OYW1lID0gJ3VzZUdyaWRMYXlvdXQnO1xuXG4gIHZhciBnZXRUYWJsZVByb3BzJDEgPSBmdW5jdGlvbiBnZXRUYWJsZVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiBcImdyaWRcIixcbiAgICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogaW5zdGFuY2Uuc3RhdGUuZ3JpZExheW91dC5jb2x1bW5XaWR0aHMubWFwKGZ1bmN0aW9uICh3KSB7XG4gICAgICAgICAgcmV0dXJuIHc7XG4gICAgICAgIH0pLmpvaW4oXCIgXCIpXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGdldEhlYWRlclByb3BzJDEgPSBmdW5jdGlvbiBnZXRIZWFkZXJQcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjIuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIGlkOiBcImhlYWRlci1jZWxsLVwiICsgY29sdW1uLmlkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIgLy9lbmFibGVzIGEgc2Nyb2xsIHdyYXBwZXIgdG8gYmUgcGxhY2VkIGFyb3VuZCB0aGUgdGFibGUgYW5kIGhhdmUgc3RpY2t5IGhlYWRlcnNcblxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkYyhzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJpbml0XCIpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGdyaWRMYXlvdXQ6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IGluc3RhbmNlLmNvbHVtbnMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcImF1dG9cIjtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBcImNvbHVtblN0YXJ0UmVzaXppbmdcIikge1xuICAgICAgdmFyIGNvbHVtbklkID0gYWN0aW9uLmNvbHVtbklkO1xuICAgICAgdmFyIGNvbHVtbkluZGV4ID0gaW5zdGFuY2UudmlzaWJsZUNvbHVtbnMuZmluZEluZGV4KGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBlbFdpZHRoID0gZ2V0RWxlbWVudFdpZHRoKGNvbHVtbklkKTtcblxuICAgICAgaWYgKGVsV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZ3JpZExheW91dDogX2V4dGVuZHMoe30sIHN0YXRlLmdyaWRMYXlvdXQsIHtcbiAgICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgICAgIGNvbHVtbkluZGV4OiBjb2x1bW5JbmRleCxcbiAgICAgICAgICAgIHN0YXJ0aW5nV2lkdGg6IGVsV2lkdGhcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiY29sdW1uUmVzaXppbmdcIikge1xuICAgICAgdmFyIF9zdGF0ZSRncmlkTGF5b3V0ID0gc3RhdGUuZ3JpZExheW91dCxcbiAgICAgICAgICBfY29sdW1uSW5kZXggPSBfc3RhdGUkZ3JpZExheW91dC5jb2x1bW5JbmRleCxcbiAgICAgICAgICBzdGFydGluZ1dpZHRoID0gX3N0YXRlJGdyaWRMYXlvdXQuc3RhcnRpbmdXaWR0aCxcbiAgICAgICAgICBjb2x1bW5XaWR0aHMgPSBfc3RhdGUkZ3JpZExheW91dC5jb2x1bW5XaWR0aHM7XG4gICAgICB2YXIgY2hhbmdlID0gc3RhdGUuY29sdW1uUmVzaXppbmcuc3RhcnRYIC0gYWN0aW9uLmNsaWVudFg7XG4gICAgICB2YXIgbmV3V2lkdGggPSBzdGFydGluZ1dpZHRoIC0gY2hhbmdlO1xuICAgICAgdmFyIGNvbHVtbldpZHRoc0NvcHkgPSBbXS5jb25jYXQoY29sdW1uV2lkdGhzKTtcbiAgICAgIGNvbHVtbldpZHRoc0NvcHlbX2NvbHVtbkluZGV4XSA9IG5ld1dpZHRoICsgXCJweFwiO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncmlkTGF5b3V0OiBfZXh0ZW5kcyh7fSwgc3RhdGUuZ3JpZExheW91dCwge1xuICAgICAgICAgIGNvbHVtbldpZHRoczogY29sdW1uV2lkdGhzQ29weVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxlbWVudFdpZHRoKGNvbHVtbklkKSB7XG4gICAgdmFyIF9kb2N1bWVudCRnZXRFbGVtZW50QjtcblxuICAgIHZhciB3aWR0aCA9IChfZG9jdW1lbnQkZ2V0RWxlbWVudEIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlYWRlci1jZWxsLVwiICsgY29sdW1uSWQpKSA9PSBudWxsID8gdm9pZCAwIDogX2RvY3VtZW50JGdldEVsZW1lbnRCLm9mZnNldFdpZHRoO1xuXG4gICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gIH1cblxuICBleHBvcnRzLl9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnMgPSBfVU5TVEFCTEVfdXNlUGl2b3RDb2x1bW5zO1xuICBleHBvcnRzLmFjdGlvbnMgPSBhY3Rpb25zO1xuICBleHBvcnRzLmRlZmF1bHRDb2x1bW4gPSBkZWZhdWx0Q29sdW1uO1xuICBleHBvcnRzLmRlZmF1bHRHcm91cEJ5Rm4gPSBkZWZhdWx0R3JvdXBCeUZuO1xuICBleHBvcnRzLmRlZmF1bHRPcmRlckJ5Rm4gPSBkZWZhdWx0T3JkZXJCeUZuO1xuICBleHBvcnRzLmRlZmF1bHRSZW5kZXJlciA9IGRlZmF1bHRSZW5kZXJlcjtcbiAgZXhwb3J0cy5lbXB0eVJlbmRlcmVyID0gZW1wdHlSZW5kZXJlcjtcbiAgZXhwb3J0cy5lbnN1cmVQbHVnaW5PcmRlciA9IGVuc3VyZVBsdWdpbk9yZGVyO1xuICBleHBvcnRzLmZsZXhSZW5kZXIgPSBmbGV4UmVuZGVyO1xuICBleHBvcnRzLmZ1bmN0aW9uYWxVcGRhdGUgPSBmdW5jdGlvbmFsVXBkYXRlO1xuICBleHBvcnRzLmxvb3BIb29rcyA9IGxvb3BIb29rcztcbiAgZXhwb3J0cy5tYWtlUHJvcEdldHRlciA9IG1ha2VQcm9wR2V0dGVyO1xuICBleHBvcnRzLm1ha2VSZW5kZXJlciA9IG1ha2VSZW5kZXJlcjtcbiAgZXhwb3J0cy5yZWR1Y2VIb29rcyA9IHJlZHVjZUhvb2tzO1xuICBleHBvcnRzLnNhZmVVc2VMYXlvdXRFZmZlY3QgPSBzYWZlVXNlTGF5b3V0RWZmZWN0O1xuICBleHBvcnRzLnVzZUFic29sdXRlTGF5b3V0ID0gdXNlQWJzb2x1dGVMYXlvdXQ7XG4gIGV4cG9ydHMudXNlQXN5bmNEZWJvdW5jZSA9IHVzZUFzeW5jRGVib3VuY2U7XG4gIGV4cG9ydHMudXNlQmxvY2tMYXlvdXQgPSB1c2VCbG9ja0xheW91dDtcbiAgZXhwb3J0cy51c2VDb2x1bW5PcmRlciA9IHVzZUNvbHVtbk9yZGVyO1xuICBleHBvcnRzLnVzZUV4cGFuZGVkID0gdXNlRXhwYW5kZWQ7XG4gIGV4cG9ydHMudXNlRmlsdGVycyA9IHVzZUZpbHRlcnM7XG4gIGV4cG9ydHMudXNlRmxleExheW91dCA9IHVzZUZsZXhMYXlvdXQ7XG4gIGV4cG9ydHMudXNlR2V0TGF0ZXN0ID0gdXNlR2V0TGF0ZXN0O1xuICBleHBvcnRzLnVzZUdsb2JhbEZpbHRlciA9IHVzZUdsb2JhbEZpbHRlcjtcbiAgZXhwb3J0cy51c2VHcmlkTGF5b3V0ID0gdXNlR3JpZExheW91dDtcbiAgZXhwb3J0cy51c2VHcm91cEJ5ID0gdXNlR3JvdXBCeTtcbiAgZXhwb3J0cy51c2VNb3VudGVkTGF5b3V0RWZmZWN0ID0gdXNlTW91bnRlZExheW91dEVmZmVjdDtcbiAgZXhwb3J0cy51c2VQYWdpbmF0aW9uID0gdXNlUGFnaW5hdGlvbjtcbiAgZXhwb3J0cy51c2VSZXNpemVDb2x1bW5zID0gdXNlUmVzaXplQ29sdW1ucztcbiAgZXhwb3J0cy51c2VSb3dTZWxlY3QgPSB1c2VSb3dTZWxlY3Q7XG4gIGV4cG9ydHMudXNlUm93U3RhdGUgPSB1c2VSb3dTdGF0ZTtcbiAgZXhwb3J0cy51c2VTb3J0QnkgPSB1c2VTb3J0Qnk7XG4gIGV4cG9ydHMudXNlVGFibGUgPSB1c2VUYWJsZTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3QtdGFibGUuZGV2ZWxvcG1lbnQuanMubWFwXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSxXQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/react-table/dist/react-table.development.js\n");
7
-
8
- /***/ }),
9
-
10
- /***/ "../../../node_modules/react-table/index.js":
11
- /***/ (function(module, exports, __webpack_require__) {
12
-
13
- eval("if (false) {} else {\n module.exports = __webpack_require__(\"../../../node_modules/react-table/dist/react-table.development.js\")\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXRhYmxlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJmaWxlOi8vQzovQ2xpY2tWaWV3IFByb2plY3RzL0BjbGlja3ZpZXcvbm9kZV9tb2R1bGVzL3JlYWN0LXRhYmxlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLnByb2R1Y3Rpb24ubWluLmpzJylcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzJylcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsYUFFQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/react-table/index.js\n");
14
-
15
- /***/ })
16
-
17
- }]);