@datagrok-libraries/statistics 1.2.9 → 1.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # statistics changelog
2
2
 
3
+ ## 1.2.10 (2023-11-09)
4
+
5
+ ### Bug Fixes
6
+
7
+ * [#2101](https://github.com/datagrok-ai/public/issues/2101): Improved curves properties and rendering:
8
+ * Fixed curves not rendering because of undefined x if branch.
9
+ * Fixed linear fit not rendering.
10
+
3
11
  ## 1.2.9 (2023-11-02)
4
12
 
5
13
  ### Features
package/package.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "statistics",
7
- "version": "1.2.9",
7
+ "version": "1.2.10",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "datagrok-api": "^1.17.0",
11
- "@datagrok-libraries/utils": "^4.0.0",
11
+ "@datagrok-libraries/utils": "^4.1.0",
12
12
  "cash-dom": "latest",
13
13
  "jstat": "latest",
14
14
  "dayjs": "^1.11.7"
@@ -1 +1 @@
1
- {"version":3,"file":"fit-data.d.ts","sourceRoot":"","sources":["fit-data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAKL,WAAW,EAEX,aAAa,EACb,sBAAsB,EACtB,QAAQ,EAER,SAAS,EACT,aAAa,EACb,UAAU,EAOX,MAAM,aAAa,CAAC;AAErB,oBAAY,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAC1B,CAAC;AAcF,mDAAmD;AACnD,wBAAgB,sBAAsB,IAAI,aAAa,CAKtD;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,GAAG,aAAa,CAExE;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,aAAa,CAEtE;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG;IAAC,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,CAQjF;AAgED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,GAAG,EAAE,CAAC,IAAI,CAehE;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEpE;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAExF;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAOrG;AAED,mDAAmD;AACnD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAClF,cAAc,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAS1E;AAED,gCAAgC;AAChC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,aAAa,CAMpH"}
1
+ {"version":3,"file":"fit-data.d.ts","sourceRoot":"","sources":["fit-data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAKL,WAAW,EAEX,aAAa,EACb,sBAAsB,EACtB,QAAQ,EAER,SAAS,EACT,aAAa,EACb,UAAU,EAOX,MAAM,aAAa,CAAC;AAErB,oBAAY,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAC1B,CAAC;AAcF,mDAAmD;AACnD,wBAAgB,sBAAsB,IAAI,aAAa,CAKtD;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,GAAG,aAAa,CAExE;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,aAAa,CAEtE;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG;IAAC,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,CAQjF;AAwED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,GAAG,EAAE,CAAC,IAAI,CAehE;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEpE;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAExF;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAOrG;AAED,mDAAmD;AACnD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAClF,cAAc,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAS1E;AAED,gCAAgC;AAChC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,aAAa,CAMpH"}
@@ -40,6 +40,13 @@ export function getPointsArrays(points) {
40
40
  }
41
41
  return { xs: xs, ys: ys };
42
42
  }
43
+ /** Returns median from within multiple points */
44
+ function getMedian(points) {
45
+ const mid = Math.floor(points.y.length / 2);
46
+ const sortedPoints = points.y.sort((a, b) => a - b);
47
+ const median = sortedPoints.length % 2 === 0 ? (sortedPoints[mid - 1] + sortedPoints[mid]) / 2 : sortedPoints[mid];
48
+ return median;
49
+ }
43
50
  /** Returns median points from within multiple points with the same x. */
44
51
  function getMedianPoints(data) {
45
52
  const medianPoints = { x: [], y: [] };
@@ -50,14 +57,15 @@ function getMedianPoints(data) {
50
57
  currentPoints.y[currentPoints.y.length] = data.y[i];
51
58
  continue;
52
59
  }
53
- const mid = Math.floor(currentPoints.y.length / 2);
54
- const sortedPoints = currentPoints.y.sort((a, b) => a - b);
55
- const median = sortedPoints.length % 2 === 0 ? (sortedPoints[mid - 1] + sortedPoints[mid]) / 2 : sortedPoints[mid];
60
+ const median = getMedian(currentPoints);
56
61
  medianPoints.x[medianPoints.x.length] = currentPoints.x[0];
57
62
  medianPoints.y[medianPoints.y.length] = median;
58
63
  currentPoints.x = [data.x[i]];
59
64
  currentPoints.y = [data.y[i]];
60
65
  }
66
+ const median = getMedian(currentPoints);
67
+ medianPoints.x[medianPoints.x.length] = currentPoints.x[0];
68
+ medianPoints.y[medianPoints.y.length] = median;
61
69
  return medianPoints;
62
70
  }
63
71
  /** Returns logarithmic IC50 parameter bounds. */
@@ -106,7 +114,7 @@ export function getChartBounds(chartData) {
106
114
  let bounds = DG.Rect.fromXYArrays(xs, ys);
107
115
  for (let i = 1; i < chartData.series.length; i++) {
108
116
  const { xs, ys } = getPointsArrays(chartData.series[i].points);
109
- if (xs.some((x) => !x) || ys.some((y) => !y))
117
+ if (xs.some((x) => x === undefined) || ys.some((y) => y === undefined))
110
118
  continue;
111
119
  bounds = bounds.union(DG.Rect.fromXYArrays(xs, ys));
112
120
  }
@@ -149,4 +157,4 @@ export function getSeriesStatistics(series, fitFunc, logOptions) {
149
157
  series.parameters = fitSeries(series, fitFunc).parameters;
150
158
  return getStatistics(data, series.parameters, fitFunc.y, true);
151
159
  }
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaXQtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBZ0M7QUFDaEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLE9BQU8sRUFDUCwyQkFBMkIsRUFDM0IsYUFBYSxFQUViLGNBQWMsRUFJZCxzQkFBc0IsRUFJdEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixPQUFPLEdBSVIsTUFBTSxhQUFhLENBQUM7QUFRckIsaUZBQWlGO0FBQ2pGLFNBQVMsb0JBQW9CLENBQUMsVUFBeUI7SUFDckQsTUFBTSxDQUFDLEdBQVEsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFO1FBQzFCLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJO1lBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztLQUM5QjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELHFIQUFxSDtBQUNySCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPO1FBQ0wsWUFBWSxFQUFFLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDO1FBQzFELGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsd0JBQXdCLENBQUMsRUFBZ0I7OztJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLGFBQUMsRUFBRSxDQUFDLElBQUksRUFBQyxPQUFPLHdDQUFQLE9BQU8sSUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWlCOzs7SUFDckQsT0FBTyxJQUFJLENBQUMsS0FBSyxhQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsT0FBTyx3Q0FBUCxPQUFPLElBQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEVBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBbUI7SUFDakQsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyQjtJQUNELE9BQU8sRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsZUFBZSxDQUFDLElBQWdDO0lBQ3ZELE1BQU0sWUFBWSxHQUErQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2hFLE1BQU0sYUFBYSxHQUErQixFQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNuRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsU0FBUztTQUNWO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuSCxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQy9DLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsYUFBYSxD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NEQ7QUFDNUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUF3Qjs7SUFDckQsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUNqQyxJQUFJLENBQUMsQ0FBQSxNQUFBLFNBQVMsQ0FBQyxNQUFNLDBDQUFFLE1BQU0sQ0FBQSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDNUQsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDNUI7UUFDSCxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsTUFBTSxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLFNBQVM7WUFDWCxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUNELE9BQU8sQ0FBQyxDQUFDLENB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QUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDbkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ3BCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDNUQsT0FBTyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi9cbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7XG4gIEZpdEVycm9yTW9kZWwsXG4gIGZpdERhdGEsXG4gIGdldEN1cnZlQ29uZmlkZW5jZUludGVydmFscyxcbiAgZ2V0U3RhdGlzdGljcyxcbiAgRml0RnVuY3Rpb24sXG4gIGdldEZpdHRlZEN1cnZlLFxuICBGaXRTdGF0aXN0aWNzLFxuICBGaXRDb25maWRlbmNlSW50ZXJ2YWxzLFxuICBGaXRDdXJ2ZSxcbiAgZ2V0T3JDcmVhdGVGaXRGdW5jdGlvbixcbiAgSUZpdFBvaW50LFxuICBJRml0Q2hhcnREYXRhLFxuICBJRml0U2VyaWVzLFxuICBmaXRTZXJpZXNQcm9wZXJ0aWVzLFxuICBmaXRDaGFydERhdGFQcm9wZXJ0aWVzLFxuICBUQUdfRklULFxuICBGaXRQYXJhbUJvdW5kcyxcbiAgSUZpdENoYXJ0T3B0aW9ucyxcbiAgRml0RXJyb3JNb2RlbFR5cGUsXG59IGZyb20gJy4vZml0LWN1cnZlJztcblxuZXhwb3J0IHR5cGUgTG9nT3B0aW9ucyA9IHtcbiAgbG9nWDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgbG9nWTogYm9vbGVhbiB8IHVuZGVmaW5lZFxufTtcblxuXG4vKiogQ3JlYXRlcyBuZXcgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiB7QGxpbmsgcHJvcGVydGllc30gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZyb21Qcm9wZXJ0aWVzKHByb3BlcnRpZXM6IERHLlByb3BlcnR5W10pOiBhbnkge1xuICBjb25zdCBvOiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBwIG9mIHByb3BlcnRpZXMpIHtcbiAgICBpZiAocC5kZWZhdWx0VmFsdWUgIT09IG51bGwpXG4gICAgICBvW3AubmFtZV0gPSBwLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICByZXR1cm4gbztcbn1cblxuLy8gVE9ETzogc2V0IGNvbHVtbiB3aXRoIGZpdCByZWFkb25seSB2YWx1ZSAoaW4gZGV0ZWN0b3JzKSAtIHRyeSB0byBvbmx5IHNob3cgY2hhcnQgLSByZW1vdmUgZWRpdGFibGUgb3IgcHJldmVudCBpdD8/XG4vKiogQ3JlYXRlcyBkZWZhdWx0IHtAbGluayBJRml0Q2hhcnREYXRhfSBvYmplY3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q2hhcnREYXRhKCk6IElGaXRDaGFydERhdGEge1xuICByZXR1cm4ge1xuICAgIGNoYXJ0T3B0aW9uczogY3JlYXRlRnJvbVByb3BlcnRpZXMoZml0Q2hhcnREYXRhUHJvcGVydGllcyksXG4gICAgc2VyaWVzT3B0aW9uczogY3JlYXRlRnJvbVByb3BlcnRpZXMoZml0U2VyaWVzUHJvcGVydGllcyksXG4gIH07XG59XG5cbi8qKiBSZXR1cm5zIGV4aXN0aW5nLCBvciBjcmVhdGVzIG5ldyBkYXRhZnJhbWUgZGVmYXVsdCBjaGFydCBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcmFtZUNoYXJ0T3B0aW9ucyhkZjogREcuRGF0YUZyYW1lKTogSUZpdENoYXJ0RGF0YSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGRmLnRhZ3NbVEFHX0ZJVF0gPz89IEpTT04uc3RyaW5naWZ5KGNyZWF0ZURlZmF1bHRDaGFydERhdGEoKSkpO1xufVxuXG4vKiogUmV0dXJucyBleGlzdGluZywgb3IgY3JlYXRlcyBuZXcgY29sdW1uIGRlZmF1bHQgY2hhcnQgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5DaGFydE9wdGlvbnMoY29sdW1uOiBERy5Db2x1bW4pOiBJRml0Q2hhcnREYXRhIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoY29sdW1uLnRhZ3NbVEFHX0ZJVF0gPz89IEpTT04uc3RyaW5naWZ5KGNyZWF0ZURlZmF1bHRDaGFydERhdGEoKSkpO1xufVxuXG4vKiogUmV0dXJucyBwb2ludHMgYXJyYXlzIGZyb20ge0BsaW5rIElGaXRQb2ludH0gYXJyYXkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludHNBcnJheXMocG9pbnRzOiBJRml0UG9pbnRbXSk6IHt4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXX0ge1xuICBjb25zdCB4czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgeXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgeHNbaV0gPSBwb2ludHNbaV0ueDtcbiAgICB5c1tpXSA9IHBvaW50c1tpXS55O1xuICB9XG4gIHJldHVybiB7eHM6IHhzLCB5czogeXN9O1xufVxuXG4vKiogUmV0dXJucyBtZWRpYW4gcG9pbnRzIGZyb20gd2l0aGluIG11bHRpcGxlIHBvaW50cyB3aXRoIHRoZSBzYW1lIHguICovXG5mdW5jdGlvbiBnZXRNZWRpYW5Qb2ludHMoZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0pOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSB7XG4gIGNvbnN0IG1lZGlhblBvaW50czoge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0gPSB7eDogW10sIHk6IFtdfTtcbiAgY29uc3QgY3VycmVudFBvaW50czoge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0gPSB7eDogW2RhdGEueFswXV0sIHk6IFtkYXRhLnlbMF1dfTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS54W2ldID09PSBjdXJyZW50UG9pbnRzLnhbMF0pIHtcbiAgICAgIGN1cnJlbnRQb2ludHMueFtjdXJyZW50UG9pbnRzLngubGVuZ3RoXSA9IGRhdGEueFtpXTtcbiAgICAgIGN1cnJlbnRQb2ludHMueVtjdXJyZW50UG9pbnRzLnkubGVuZ3RoXSA9IGRhdGEueVtpXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKGN1cnJlbnRQb2ludHMueS5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBzb3J0ZWRQb2ludHMgPSBjdXJyZW50UG9pbnRzLnkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIGNvbnN0IG1lZGlhbiA9IHNvcnRlZFBvaW50cy5sZW5ndGggJSAyID09PSAwID8gKHNvcnRlZFBvaW50c1ttaWQgLSAxXSArIHNvcnRlZFBvaW50c1ttaWRdKSAvIDIgOiBzb3J0ZWRQb2ludHNbbWlkXTtcblxuICAgIG1lZGlhblBvaW50cy54W21lZGlhblBvaW50cy54Lmxlbmd0aF0gPSBjdXJyZW50UG9pbnRzLnhbMF07XG4gICAgbWVkaWFuUG9pbnRzLnlbbWVkaWFuUG9pbnRzLnkubGVuZ3RoXSA9IG1lZGlhbjtcbiAgICBjdXJyZW50UG9pbnRzLnggPSBbZGF0YS54W2ldXTtcbiAgICBjdXJyZW50UG9pbnRzLnkgPSBbZGF0YS55W2ldXTtcbiAgfVxuXG4gIHJldHVybiBtZWRpYW5Qb2ludHM7XG59XG5cbi8qKiBSZXR1cm5zIGxvZ2FyaXRobWljIElDNTAgcGFyYW1ldGVyIGJvdW5kcy4gKi9cbmZ1bmN0aW9uIGxvZ0lDNTBQYXJhbWV0ZXJCb3VuZHMoaWM1MEJvdW5kczogRml0UGFyYW1Cb3VuZHMpOiBGaXRQYXJhbUJvdW5kcyB7XG4gIGlmIChpYzUwQm91bmRzKSB7XG4gICAgaWYgKGljNTBCb3VuZHMubWF4ICE9PSB1bmRlZmluZWQpXG4gICAgICBpYzUwQm91bmRzLm1heCA9IE1hdGgubG9nMTAoaWM1MEJvdW5kcy5tYXgpO1xuICAgIGlmIChpYzUwQm91bmRzLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpYzUwQm91bmRzLm1pbiA9IGljNTBCb3VuZHMubWluID09PSAwID9cbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUgOiBNYXRoLmxvZzEwKGljNTBCb3VuZHMubWluKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGljNTBCb3VuZHM7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUJvdW5kcyhib3VuZHM6IERHLlJlY3QsIGNoYXJ0T3B0aW9uczogSUZpdENoYXJ0T3B0aW9ucyk6IERHLlJlY3Qge1xuICBsZXQgeCA9IGJvdW5kcy54O1xuICBsZXQgeSA9IGJvdW5kcy55O1xuICBsZXQgd2lkdGggPSBib3VuZHMud2lkdGg7XG4gIGxldCBoZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuXG4gIGlmIChjaGFydE9wdGlvbnMubWluWCAhPT0gdW5kZWZpbmVkICYmIGNoYXJ0T3B0aW9ucy5taW5YICE9PSBudWxsICYmXG4gICAgKCghY2hhcnRPcHRpb25zLmxvZ1gpIHx8IChjaGFydE9wdGlvbnMubG9nWCAmJiBjaGFydE9wdGlvbnMubWluWCA+IDApKSkge1xuICAgIHdpZHRoICs9IHggLSBjaGFydE9wdGlvbnMubWluWDtcbiAgICB4ID0gY2hhcnRPcHRpb25zLm1pblg7XG4gIH1cbiAgaWYgKGNoYXJ0T3B0aW9ucy5tYXhYICE9PSB1bmRlZmluZWQgJiYgY2hhcnRPcHRpb25zLm1heFggIT09IG51bGwgJiZcbiAgICAoKCFjaGFydE9wdGlvbnMubG9nWCkgfHwgKGNoYXJ0T3B0aW9ucy5sb2dYICYmIGNoYXJ0T3B0aW9ucy5tYXhYID4gMCkpKVxuICAgIHdpZHRoICs9IGNoYXJ0T3B0aW9ucy5tYXhYIC0gKHggKyB3aWR0aCk7XG4gIGlmIChjaGFydE9wdGlvbnMubWluWSAhPT0gdW5kZWZpbmVkICYmIGNoYXJ0T3B0aW9ucy5taW5ZICE9PSBudWxsICYmXG4gICAgKCghY2hhcnRPcHRpb25zLmxvZ1kpIHx8IChjaGFydE9wdGlvbnMubG9nWSAmJiBjaGFydE9wdGlvbnMubWluWSA+IDApKSkge1xuICAgIGhlaWdodCArPSB5IC0gY2hhcnRPcHRpb25zLm1pblk7XG4gICAgeSA9IGNoYXJ0T3B0aW9ucy5taW5ZO1xuICB9XG4gIGlmIChjaGFydE9wdGlvbnMubWF4WSAhPT0gdW5kZWZpbmVkICYmIGNoYXJ0T3B0aW9ucy5tYXhZICE9PSBudWxsICYmXG4gICAgKCghY2hhcnRPcHRpb25zLmxvZ1kpIHx8IChjaGFydE9wdGlvbnMubG9nWSAmJiBjaGFydE9wdGlvbnMubWF4WSA+IDApKSlcbiAgICBoZWlnaHQgKz0gY2hhcnRPcHRpb25zLm1heFkgLSAoeSArIGhlaWdodCk7XG5cbiAgcmV0dXJuIG5ldyBERy5SZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgYm91bmRzIG9mIGFuIHtAbGluayBJRml0Q2hhcnREYXRhfSBvYmplY3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFydEJvdW5kcyhjaGFydERhdGE6IElGaXRDaGFydERhdGEpOiBERy5SZWN0IHtcbiAgY29uc3QgbyA9IGNoYXJ0RGF0YS5jaGFydE9wdGlvbnM7XG4gIGlmICghY2hhcnREYXRhLnNlcmllcz8ubGVuZ3RoIHx8IGNoYXJ0RGF0YS5zZXJpZXMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBuZXcgREcuUmVjdCgwLCAwLCAxLCAxKTtcbiAgZWxzZSB7XG4gICAgY29uc3Qge3hzLCB5c30gPSBnZXRQb2ludHNBcnJheXMoY2hhcnREYXRhLnNlcmllc1swXS5wb2ludHMpO1xuICAgIGxldCBib3VuZHMgPSBERy5SZWN0LmZyb21YWUFycmF5cyh4cywgeXMpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hhcnREYXRhLnNlcmllcyEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHt4cywgeXN9ID0gZ2V0UG9pbnRzQXJyYXlzKGNoYXJ0RGF0YS5zZXJpZXNbaV0ucG9pbnRzKTtcbiAgICAgIGlmICh4cy5zb21lKCh4KSA9PiAheCkgfHwgeXMuc29tZSgoeSkgPT4gIXkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGJvdW5kcyA9IGJvdW5kcy51bmlvbihERy5SZWN0LmZyb21YWUFycmF5cyh4cywgeXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG8gPyBjaGFuZ2VCb3VuZHMoYm91bmRzLCBvISk6IGJvdW5kcztcbiAgfVxufVxuXG4vKiogUmV0dXJucyBzZXJpZXMgZml0IGZ1bmN0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWVzRml0RnVuY3Rpb24oc2VyaWVzOiBJRml0U2VyaWVzKTogRml0RnVuY3Rpb24ge1xuICByZXR1cm4gZ2V0T3JDcmVhdGVGaXRGdW5jdGlvbihzZXJpZXMuZml0RnVuY3Rpb24hKTtcbn1cblxuLyoqIFJldHVybnMgYSBjdXJ2ZSBmdW5jdGlvbiwgZWl0aGVyIHVzaW5nIHRoZSBwcmUtY29tcHV0ZWQgcGFyYW1ldGVycyBvciBieSBmaXR0aW5nIG9uLXRoZS1mbHkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJ2ZShzZXJpZXM6IElGaXRTZXJpZXMsIGZpdEZ1bmM6IEZpdEZ1bmN0aW9uKTogKHg6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIGdldEZpdHRlZEN1cnZlKGZpdEZ1bmMueSwgc2VyaWVzLnBhcmFtZXRlcnMhKTtcbn1cblxuLyoqIEZpdHMgdGhlIHNlcmllcyBkYXRhIGFjY29yZGluZyB0byB0aGUgc2VyaWVzIGZpdHRpbmcgc2V0dGluZ3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXRTZXJpZXMoc2VyaWVzOiBJRml0U2VyaWVzLCBmaXRGdW5jOiBGaXRGdW5jdGlvbiwgbG9nT3B0aW9ucz86IExvZ09wdGlvbnMpOiBGaXRDdXJ2ZSB7XG4gIGNvbnN0IGRhdGEgPSB7eDogc2VyaWVzLnBvaW50cy5maWx0ZXIoKHApID0+ICFwLm91dGxpZXIpLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWCA/IE1hdGgubG9nMTAocC54KSA6IHAueCksXG4gICAgeTogc2VyaWVzLnBvaW50cy5maWx0ZXIoKHApID0+ICFwLm91dGxpZXIpLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWSA/IE1hdGgubG9nMTAocC55KSA6IHAueSl9O1xuICBpZiAoc2VyaWVzLnBhcmFtZXRlckJvdW5kcyAmJiBsb2dPcHRpb25zPy5sb2dYKVxuICAgIHNlcmllcy5wYXJhbWV0ZXJCb3VuZHNbMl0gPSBsb2dJQzUwUGFyYW1ldGVyQm91bmRzKHNlcmllcy5wYXJhbWV0ZXJCb3VuZHNbMl0pO1xuICByZXR1cm4gZml0RGF0YShnZXRNZWRpYW5Qb2ludHMoZGF0YSksIGZpdEZ1bmMsIHNlcmllcy5lcnJvck1vZGVsID8/IEZpdEVycm9yTW9kZWwuQ09OU1RBTlQgYXMgRml0RXJyb3JNb2RlbFR5cGUsXG4gICAgc2VyaWVzLnBhcmFtZXRlckJvdW5kcyk7XG59XG5cbi8qKiBSZXR1cm5zIHNlcmllcyBjb25maWRlbmNlIGludGVydmFsIGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmllc0NvbmZpZGVuY2VJbnRlcnZhbChzZXJpZXM6IElGaXRTZXJpZXMsIGZpdEZ1bmM6IEZpdEZ1bmN0aW9uLFxuICB1c2VyUGFyYW1zRmxhZzogYm9vbGVhbiwgbG9nT3B0aW9ucz86IExvZ09wdGlvbnMpOiBGaXRDb25maWRlbmNlSW50ZXJ2YWxzIHtcbiAgY29uc3QgZGF0YSA9IHVzZXJQYXJhbXNGbGFnID8ge3g6IHNlcmllcy5wb2ludHMubWFwKChwKSA9PiBsb2dPcHRpb25zPy5sb2dYID8gTWF0aC5sb2cxMChwLngpIDogcC54KSxcbiAgICB5OiBzZXJpZXMucG9pbnRzLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWSA/IE1hdGgubG9nMTAocC55KSA6IHAueSl9IDpcbiAgICB7eDogc2VyaWVzLnBvaW50cy5maWx0ZXIoKHApID0+ICFwLm91dGxpZXIpLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWCA/IE1hdGgubG9nMTAocC54KSA6IHAueCksXG4gICAgICB5OiBzZXJpZXMucG9pbnRzLmZpbHRlcigocCkgPT4gIXAub3V0bGllcikubWFwKChwKSA9PiBsb2dPcHRpb25zPy5sb2dZID8gTWF0aC5sb2cxMChwLnkpIDogcC55KX07XG4gIGlmICghc2VyaWVzLnBhcmFtZXRlcnMpXG4gICAgc2VyaWVzLnBhcmFtZXRlcnMgPSBmaXRTZXJpZXMoc2VyaWVzLCBmaXRGdW5jKS5wYXJhbWV0ZXJzO1xuICByZXR1cm4gZ2V0Q3VydmVDb25maWRlbmNlSW50ZXJ2YWxzKGRhdGEsIHNlcmllcy5wYXJhbWV0ZXJzLCBmaXRGdW5jLnksIDAuMDUsXG4gICAgc2VyaWVzLmVycm9yTW9kZWwgPz8gRml0RXJyb3JNb2RlbC5DT05TVEFOVCBhcyBGaXRFcnJvck1vZGVsVHlwZSk7XG59XG5cbi8qKiBSZXR1cm5zIHNlcmllcyBzdGF0aXN0aWNzICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWVzU3RhdGlzdGljcyhzZXJpZXM6IElGaXRTZXJpZXMsIGZpdEZ1bmM6IEZpdEZ1bmN0aW9uLCBsb2dPcHRpb25zPzogTG9nT3B0aW9ucyk6IEZpdFN0YXRpc3RpY3Mge1xuICBjb25zdCBkYXRhID0ge3g6IHNlcmllcy5wb2ludHMuZmlsdGVyKChwKSA9PiAhcC5vdXRsaWVyKS5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1ggPyBNYXRoLmxvZzEwKHAueCkgOiBwLngpLFxuICAgIHk6IHNlcmllcy5wb2ludHMuZmlsdGVyKChwKSA9PiAhcC5vdXRsaWVyKS5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1kgPyBNYXRoLmxvZzEwKHAueSkgOiBwLnkpfTtcbiAgaWYgKCFzZXJpZXMucGFyYW1ldGVycylcbiAgICBzZXJpZXMucGFyYW1ldGVycyA9IGZpdFNlcmllcyhzZXJpZXMsIGZpdEZ1bmMpLnBhcmFtZXRlcnM7XG4gIHJldHVybiBnZXRTdGF0aXN0aWNzKGRhdGEsIHNlcmllcy5wYXJhbWV0ZXJzLCBmaXRGdW5jLnksIHRydWUpO1xufVxuIl19
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaXQtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBZ0M7QUFDaEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLE9BQU8sRUFDUCwyQkFBMkIsRUFDM0IsYUFBYSxFQUViLGNBQWMsRUFJZCxzQkFBc0IsRUFJdEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixPQUFPLEdBSVIsTUFBTSxhQUFhLENBQUM7QUFRckIsaUZBQWlGO0FBQ2pGLFNBQVMsb0JBQW9CLENBQUMsVUFBeUI7SUFDckQsTUFBTSxDQUFDLEdBQVEsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFO1FBQzFCLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJO1lBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztLQUM5QjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELHFIQUFxSDtBQUNySCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPO1FBQ0wsWUFBWSxFQUFFLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDO1FBQzFELGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsd0JBQXdCLENBQUMsRUFBZ0I7OztJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLGFBQUMsRUFBRSxDQUFDLElBQUksRUFBQyxPQUFPLHdDQUFQLE9BQU8sSUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLHFCQUFxQixDQUFD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QUFVLHVCQUFWLFVBQVUsQ0FBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN4RSxFQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNyRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDcEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUM1RCxPQUFPLDJCQUEyQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUN6RSxNQUFBLE1BQU0sQ0FBQyxVQUFVLG1DQUFJLGFBQWEsQ0FBQyxRQUE2QixDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELGdDQUFnQztBQUNoQyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBa0IsRUFBRSxPQUFvQixFQUFFLFVBQXVCO0lBQ25HLE1BQU0sSUFBSSxHQUFHLEVBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUEsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLElBQUksRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0csQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUEsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLElBQUksRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ25HLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNwQixNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQzVELE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovXG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1xuICBGaXRFcnJvck1vZGVsLFxuICBmaXREYXRhLFxuICBnZXRDdXJ2ZUNvbmZpZGVuY2VJbnRlcnZhbHMsXG4gIGdldFN0YXRpc3RpY3MsXG4gIEZpdEZ1bmN0aW9uLFxuICBnZXRGaXR0ZWRDdXJ2ZSxcbiAgRml0U3RhdGlzdGljcyxcbiAgRml0Q29uZmlkZW5jZUludGVydmFscyxcbiAgRml0Q3VydmUsXG4gIGdldE9yQ3JlYXRlRml0RnVuY3Rpb24sXG4gIElGaXRQb2ludCxcbiAgSUZpdENoYXJ0RGF0YSxcbiAgSUZpdFNlcmllcyxcbiAgZml0U2VyaWVzUHJvcGVydGllcyxcbiAgZml0Q2hhcnREYXRhUHJvcGVydGllcyxcbiAgVEFHX0ZJVCxcbiAgRml0UGFyYW1Cb3VuZHMsXG4gIElGaXRDaGFydE9wdGlvbnMsXG4gIEZpdEVycm9yTW9kZWxUeXBlLFxufSBmcm9tICcuL2ZpdC1jdXJ2ZSc7XG5cbmV4cG9ydCB0eXBlIExvZ09wdGlvbnMgPSB7XG4gIGxvZ1g6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIGxvZ1k6IGJvb2xlYW4gfCB1bmRlZmluZWRcbn07XG5cblxuLyoqIENyZWF0ZXMgbmV3IG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBzcGVjaWZpZWQgaW4ge0BsaW5rIHByb3BlcnRpZXN9ICovXG5mdW5jdGlvbiBjcmVhdGVGcm9tUHJvcGVydGllcyhwcm9wZXJ0aWVzOiBERy5Qcm9wZXJ0eVtdKTogYW55IHtcbiAgY29uc3QgbzogYW55ID0ge307XG4gIGZvciAoY29uc3QgcCBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHAuZGVmYXVsdFZhbHVlICE9PSBudWxsKVxuICAgICAgb1twLm5hbWVdID0gcC5kZWZhdWx0VmFsdWU7XG4gIH1cbiAgcmV0dXJuIG87XG59XG5cbi8vIFRPRE86IHNldCBjb2x1bW4gd2l0aCBmaXQgcmVhZG9ubHkgdmFsdWUgKGluIGRldGVjdG9ycykgLSB0cnkgdG8gb25seSBzaG93IGNoYXJ0IC0gcmVtb3ZlIGVkaXRhYmxlIG9yIHByZXZlbnQgaXQ/P1xuLyoqIENyZWF0ZXMgZGVmYXVsdCB7QGxpbmsgSUZpdENoYXJ0RGF0YX0gb2JqZWN0ICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENoYXJ0RGF0YSgpOiBJRml0Q2hhcnREYXRhIHtcbiAgcmV0dXJuIHtcbiAgICBjaGFydE9wdGlvbnM6IGNyZWF0ZUZyb21Qcm9wZXJ0aWVzKGZpdENoYXJ0RGF0YVByb3BlcnRpZXMpLFxuICAgIHNlcmllc09wdGlvbnM6IGNyZWF0ZUZyb21Qcm9wZXJ0aWVzKGZpdFNlcmllc1Byb3BlcnRpZXMpLFxuICB9O1xufVxuXG4vKiogUmV0dXJucyBleGlzdGluZywgb3IgY3JlYXRlcyBuZXcgZGF0YWZyYW1lIGRlZmF1bHQgY2hhcnQgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJhbWVDaGFydE9wdGlvbnMoZGY6IERHLkRhdGFGcmFtZSk6IElGaXRDaGFydERhdGEge1xuICByZXR1cm4gSlNPTi5wYXJzZShkZi50YWdzW1RBR19GSVRdID8/PSBKU09OLnN0cmluZ2lmeShjcmVhdGVEZWZhdWx0Q2hhcnREYXRhKCkpKTtcbn1cblxuLyoqIFJldHVybnMgZXhpc3RpbmcsIG9yIGNyZWF0ZXMgbmV3IGNvbHVtbiBkZWZhdWx0IGNoYXJ0IG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uQ2hhcnRPcHRpb25zKGNvbHVtbjogREcuQ29sdW1uKTogSUZpdENoYXJ0RGF0YSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGNvbHVtbi50YWdzW1RBR19GSVRdID8/PSBKU09OLnN0cmluZ2lmeShjcmVhdGVEZWZhdWx0Q2hhcnREYXRhKCkpKTtcbn1cblxuLyoqIFJldHVybnMgcG9pbnRzIGFycmF5cyBmcm9tIHtAbGluayBJRml0UG9pbnR9IGFycmF5ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnRzQXJyYXlzKHBvaW50czogSUZpdFBvaW50W10pOiB7eHM6IG51bWJlcltdLCB5czogbnVtYmVyW119IHtcbiAgY29uc3QgeHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHlzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHhzW2ldID0gcG9pbnRzW2ldLng7XG4gICAgeXNbaV0gPSBwb2ludHNbaV0ueTtcbiAgfVxuICByZXR1cm4ge3hzOiB4cywgeXM6IHlzfTtcbn1cblxuLyoqIFJldHVybnMgbWVkaWFuIGZyb20gd2l0aGluIG11bHRpcGxlIHBvaW50cyAqL1xuZnVuY3Rpb24gZ2V0TWVkaWFuKHBvaW50czoge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0pOiBudW1iZXIge1xuICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKHBvaW50cy55Lmxlbmd0aCAvIDIpO1xuICBjb25zdCBzb3J0ZWRQb2ludHMgPSBwb2ludHMueS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IG1lZGlhbiA9IHNvcnRlZFBvaW50cy5sZW5ndGggJSAyID09PSAwID8gKHNvcnRlZFBvaW50c1ttaWQgLSAxXSArIHNvcnRlZFBvaW50c1ttaWRdKSAvIDIgOiBzb3J0ZWRQb2ludHNbbWlkXTtcbiAgcmV0dXJuIG1lZGlhbjtcbn1cblxuLyoqIFJldHVybnMgbWVkaWFuIHBvaW50cyBmcm9tIHdpdGhpbiBtdWx0aXBsZSBwb2ludHMgd2l0aCB0aGUgc2FtZSB4LiAqL1xuZnVuY3Rpb24gZ2V0TWVkaWFuUG9pbnRzKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119KToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0ge1xuICBjb25zdCBtZWRpYW5Qb2ludHM6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119ID0ge3g6IFtdLCB5OiBbXX07XG4gIGNvbnN0IGN1cnJlbnRQb2ludHM6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119ID0ge3g6IFtkYXRhLnhbMF1dLCB5OiBbZGF0YS55WzBdXX07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRhdGEueFtpXSA9PT0gY3VycmVudFBvaW50cy54WzBdKSB7XG4gICAgICBjdXJyZW50UG9pbnRzLnhbY3VycmVudFBvaW50cy54Lmxlbmd0aF0gPSBkYXRhLnhbaV07XG4gICAgICBjdXJyZW50UG9pbnRzLnlbY3VycmVudFBvaW50cy55Lmxlbmd0aF0gPSBkYXRhLnlbaV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbWVkaWFuID0gZ2V0TWVkaWFuKGN1cnJlbnRQb2ludHMpO1xuICAgIG1lZGlhblBvaW50cy54W21lZGlhblBvaW50cy54Lmxlbmd0aF0gPSBjdXJyZW50UG9pbnRzLnhbMF07XG4gICAgbWVkaWFuUG9pbnRzLnlbbWVkaWFuUG9pbnRzLnkubGVuZ3RoXSA9IG1lZGlhbjtcbiAgICBjdXJyZW50UG9pbnRzLnggPSBbZGF0YS54W2ldXTtcbiAgICBjdXJyZW50UG9pbnRzLnkgPSBbZGF0YS55W2ldXTtcbiAgfVxuICBjb25zdCBtZWRpYW4gPSBnZXRNZWRpYW4oY3VycmVudFBvaW50cyk7XG4gIG1lZGlhblBvaW50cy54W21lZGlhblBvaW50cy54Lmxlbmd0aF0gPSBjdXJyZW50UG9pbnRzLnhbMF07XG4gIG1lZGlhblBvaW50cy55W21lZGlhblBvaW50cy55Lmxlbmd0aF0gPSBtZWRpYW47XG5cbiAgcmV0dXJuIG1lZGlhblBvaW50cztcbn1cblxuLyoqIFJldHVybnMgbG9nYXJpdGhtaWMgSUM1MCBwYXJhbWV0ZXIgYm91bmRzLiAqL1xuZnVuY3Rpb24gbG9nSUM1MFBhcmFtZXRlckJvdW5kcyhpYzUwQm91bmRzOiBGaXRQYXJhbUJvdW5kcyk6IEZpdFBhcmFtQm91bmRzIHtcbiAgaWYgKGljNTBCb3VuZHMpIHtcbiAgICBpZiAoaWM1MEJvdW5kcy5tYXggIT09IHVuZGVmaW5lZClcbiAgICAgIGljNTBCb3VuZHMubWF4ID0gTWF0aC5sb2cxMChpYzUwQm91bmRzLm1heCk7XG4gICAgaWYgKGljNTBCb3VuZHMubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGljNTBCb3VuZHMubWluID0gaWM1MEJvdW5kcy5taW4gPT09IDAgP1xuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSA6IE1hdGgubG9nMTAoaWM1MEJvdW5kcy5taW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaWM1MEJvdW5kcztcbn1cblxuZnVuY3Rpb24gY2hhbmdlQm91bmRzKGJvdW5kczogREcuUmVjdCwgY2hhcnRPcHRpb25zOiBJRml0Q2hhcnRPcHRpb25zKTogREcuUmVjdCB7XG4gIGxldCB4ID0gYm91bmRzLng7XG4gIGxldCB5ID0gYm91bmRzLnk7XG4gIGxldCB3aWR0aCA9IGJvdW5kcy53aWR0aDtcbiAgbGV0IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7XG5cbiAgaWYgKGNoYXJ0T3B0aW9ucy5taW5YICE9PSB1bmRlZmluZWQgJiYgY2hhcnRPcHRpb25zLm1pblggIT09IG51bGwgJiZcbiAgICAoKCFjaGFydE9wdGlvbnMubG9nWCkgfHwgKGNoYXJ0T3B0aW9ucy5sb2dYICYmIGNoYXJ0T3B0aW9ucy5taW5YID4gMCkpKSB7XG4gICAgd2lkdGggKz0geCAtIGNoYXJ0T3B0aW9ucy5taW5YO1xuICAgIHggPSBjaGFydE9wdGlvbnMubWluWDtcbiAgfVxuICBpZiAoY2hhcnRPcHRpb25zLm1heFggIT09IHVuZGVmaW5lZCAmJiBjaGFydE9wdGlvbnMubWF4WCAhPT0gbnVsbCAmJlxuICAgICgoIWNoYXJ0T3B0aW9ucy5sb2dYKSB8fCAoY2hhcnRPcHRpb25zLmxvZ1ggJiYgY2hhcnRPcHRpb25zLm1heFggPiAwKSkpXG4gICAgd2lkdGggKz0gY2hhcnRPcHRpb25zLm1heFggLSAoeCArIHdpZHRoKTtcbiAgaWYgKGNoYXJ0T3B0aW9ucy5taW5ZICE9PSB1bmRlZmluZWQgJiYgY2hhcnRPcHRpb25zLm1pblkgIT09IG51bGwgJiZcbiAgICAoKCFjaGFydE9wdGlvbnMubG9nWSkgfHwgKGNoYXJ0T3B0aW9ucy5sb2dZICYmIGNoYXJ0T3B0aW9ucy5taW5ZID4gMCkpKSB7XG4gICAgaGVpZ2h0ICs9IHkgLSBjaGFydE9wdGlvbnMubWluWTtcbiAgICB5ID0gY2hhcnRPcHRpb25zLm1pblk7XG4gIH1cbiAgaWYgKGNoYXJ0T3B0aW9ucy5tYXhZICE9PSB1bmRlZmluZWQgJiYgY2hhcnRPcHRpb25zLm1heFkgIT09IG51bGwgJiZcbiAgICAoKCFjaGFydE9wdGlvbnMubG9nWSkgfHwgKGNoYXJ0T3B0aW9ucy5sb2dZICYmIGNoYXJ0T3B0aW9ucy5tYXhZID4gMCkpKVxuICAgIGhlaWdodCArPSBjaGFydE9wdGlvbnMubWF4WSAtICh5ICsgaGVpZ2h0KTtcblxuICByZXR1cm4gbmV3IERHLlJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgYW4ge0BsaW5rIElGaXRDaGFydERhdGF9IG9iamVjdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYXJ0Qm91bmRzKGNoYXJ0RGF0YTogSUZpdENoYXJ0RGF0YSk6IERHLlJlY3Qge1xuICBjb25zdCBvID0gY2hhcnREYXRhLmNoYXJ0T3B0aW9ucztcbiAgaWYgKCFjaGFydERhdGEuc2VyaWVzPy5sZW5ndGggfHwgY2hhcnREYXRhLnNlcmllcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG5ldyBERy5SZWN0KDAsIDAsIDEsIDEpO1xuICBlbHNlIHtcbiAgICBjb25zdCB7eHMsIHlzfSA9IGdldFBvaW50c0FycmF5cyhjaGFydERhdGEuc2VyaWVzWzBdLnBvaW50cyk7XG4gICAgbGV0IGJvdW5kcyA9IERHLlJlY3QuZnJvbVhZQXJyYXlzKHhzLCB5cyk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGFydERhdGEuc2VyaWVzIS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qge3hzLCB5c30gPSBnZXRQb2ludHNBcnJheXMoY2hhcnREYXRhLnNlcmllc1tpXS5wb2ludHMpO1xuICAgICAgaWYgKHhzLnNvbWUoKHgpID0+IHggPT09IHVuZGVmaW5lZCkgfHwgeXMuc29tZSgoeSkgPT4geSA9PT0gdW5kZWZpbmVkKSlcbiAgICAgICAgY29udGludWU7XG4gICAgICBib3VuZHMgPSBib3VuZHMudW5pb24oREcuUmVjdC5mcm9tWFlBcnJheXMoeHMsIHlzKSk7XG4gICAgfVxuICAgIHJldHVybiBvID8gY2hhbmdlQm91bmRzKGJvdW5kcywgbyEpOiBib3VuZHM7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgc2VyaWVzIGZpdCBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmllc0ZpdEZ1bmN0aW9uKHNlcmllczogSUZpdFNlcmllcyk6IEZpdEZ1bmN0aW9uIHtcbiAgcmV0dXJuIGdldE9yQ3JlYXRlRml0RnVuY3Rpb24oc2VyaWVzLmZpdEZ1bmN0aW9uISk7XG59XG5cbi8qKiBSZXR1cm5zIGEgY3VydmUgZnVuY3Rpb24sIGVpdGhlciB1c2luZyB0aGUgcHJlLWNvbXB1dGVkIHBhcmFtZXRlcnMgb3IgYnkgZml0dGluZyBvbi10aGUtZmx5ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VydmUoc2VyaWVzOiBJRml0U2VyaWVzLCBmaXRGdW5jOiBGaXRGdW5jdGlvbik6ICh4OiBudW1iZXIpID0+IG51bWJlciB7XG4gIHJldHVybiBnZXRGaXR0ZWRDdXJ2ZShmaXRGdW5jLnksIHNlcmllcy5wYXJhbWV0ZXJzISk7XG59XG5cbi8qKiBGaXRzIHRoZSBzZXJpZXMgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIHNlcmllcyBmaXR0aW5nIHNldHRpbmdzICovXG5leHBvcnQgZnVuY3Rpb24gZml0U2VyaWVzKHNlcmllczogSUZpdFNlcmllcywgZml0RnVuYzogRml0RnVuY3Rpb24sIGxvZ09wdGlvbnM/OiBMb2dPcHRpb25zKTogRml0Q3VydmUge1xuICBjb25zdCBkYXRhID0ge3g6IHNlcmllcy5wb2ludHMuZmlsdGVyKChwKSA9PiAhcC5vdXRsaWVyKS5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1ggPyBNYXRoLmxvZzEwKHAueCkgOiBwLngpLFxuICAgIHk6IHNlcmllcy5wb2ludHMuZmlsdGVyKChwKSA9PiAhcC5vdXRsaWVyKS5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1kgPyBNYXRoLmxvZzEwKHAueSkgOiBwLnkpfTtcbiAgaWYgKHNlcmllcy5wYXJhbWV0ZXJCb3VuZHMgJiYgbG9nT3B0aW9ucz8ubG9nWClcbiAgICBzZXJpZXMucGFyYW1ldGVyQm91bmRzWzJdID0gbG9nSUM1MFBhcmFtZXRlckJvdW5kcyhzZXJpZXMucGFyYW1ldGVyQm91bmRzWzJdKTtcbiAgcmV0dXJuIGZpdERhdGEoZ2V0TWVkaWFuUG9pbnRzKGRhdGEpLCBmaXRGdW5jLCBzZXJpZXMuZXJyb3JNb2RlbCA/PyBGaXRFcnJvck1vZGVsLkNPTlNUQU5UIGFzIEZpdEVycm9yTW9kZWxUeXBlLFxuICAgIHNlcmllcy5wYXJhbWV0ZXJCb3VuZHMpO1xufVxuXG4vKiogUmV0dXJucyBzZXJpZXMgY29uZmlkZW5jZSBpbnRlcnZhbCBmdW5jdGlvbnMgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJpZXNDb25maWRlbmNlSW50ZXJ2YWwoc2VyaWVzOiBJRml0U2VyaWVzLCBmaXRGdW5jOiBGaXRGdW5jdGlvbixcbiAgdXNlclBhcmFtc0ZsYWc6IGJvb2xlYW4sIGxvZ09wdGlvbnM/OiBMb2dPcHRpb25zKTogRml0Q29uZmlkZW5jZUludGVydmFscyB7XG4gIGNvbnN0IGRhdGEgPSB1c2VyUGFyYW1zRmxhZyA/IHt4OiBzZXJpZXMucG9pbnRzLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWCA/IE1hdGgubG9nMTAocC54KSA6IHAueCksXG4gICAgeTogc2VyaWVzLnBvaW50cy5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1kgPyBNYXRoLmxvZzEwKHAueSkgOiBwLnkpfSA6XG4gICAge3g6IHNlcmllcy5wb2ludHMuZmlsdGVyKChwKSA9PiAhcC5vdXRsaWVyKS5tYXAoKHApID0+IGxvZ09wdGlvbnM/LmxvZ1ggPyBNYXRoLmxvZzEwKHAueCkgOiBwLngpLFxuICAgICAgeTogc2VyaWVzLnBvaW50cy5maWx0ZXIoKHApID0+ICFwLm91dGxpZXIpLm1hcCgocCkgPT4gbG9nT3B0aW9ucz8ubG9nWSA/IE1hdGgubG9nMTAocC55KSA6IHAueSl9O1xuICBpZiAoIXNlcmllcy5wYXJhbWV0ZXJzKVxuICAgIHNlcmllcy5wYXJhbWV0ZXJzID0gZml0U2VyaWVzKHNlcmllcywgZml0RnVuYykucGFyYW1ldGVycztcbiAgcmV0dXJuIGdldEN1cnZlQ29uZmlkZW5jZUludGVydmFscyhkYXRhLCBzZXJpZXMucGFyYW1ldGVycywgZml0RnVuYy55LCAwLjA1LFxuICAgIHNlcmllcy5lcnJvck1vZGVsID8/IEZpdEVycm9yTW9kZWwuQ09OU1RBTlQgYXMgRml0RXJyb3JNb2RlbFR5cGUpO1xufVxuXG4vKiogUmV0dXJucyBzZXJpZXMgc3RhdGlzdGljcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmllc1N0YXRpc3RpY3Moc2VyaWVzOiBJRml0U2VyaWVzLCBmaXRGdW5jOiBGaXRGdW5jdGlvbiwgbG9nT3B0aW9ucz86IExvZ09wdGlvbnMpOiBGaXRTdGF0aXN0aWNzIHtcbiAgY29uc3QgZGF0YSA9IHt4OiBzZXJpZXMucG9pbnRzLmZpbHRlcigocCkgPT4gIXAub3V0bGllcikubWFwKChwKSA9PiBsb2dPcHRpb25zPy5sb2dYID8gTWF0aC5sb2cxMChwLngpIDogcC54KSxcbiAgICB5OiBzZXJpZXMucG9pbnRzLmZpbHRlcigocCkgPT4gIXAub3V0bGllcikubWFwKChwKSA9PiBsb2dPcHRpb25zPy5sb2dZID8gTWF0aC5sb2cxMChwLnkpIDogcC55KX07XG4gIGlmICghc2VyaWVzLnBhcmFtZXRlcnMpXG4gICAgc2VyaWVzLnBhcmFtZXRlcnMgPSBmaXRTZXJpZXMoc2VyaWVzLCBmaXRGdW5jKS5wYXJhbWV0ZXJzO1xuICByZXR1cm4gZ2V0U3RhdGlzdGljcyhkYXRhLCBzZXJpZXMucGFyYW1ldGVycywgZml0RnVuYy55LCB0cnVlKTtcbn1cbiJdfQ==