w-cluster 1.0.8 → 1.0.9

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/README.md CHANGED
@@ -163,10 +163,10 @@ testCluster()
163
163
  ```alias
164
164
 
165
165
  <!-- for basic -->
166
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.umd.js"></script>
166
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.umd.js"></script>
167
167
 
168
168
  <!-- for web workers -->
169
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.wk.umd.js"></script>
169
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.wk.umd.js"></script>
170
170
 
171
171
  ```
172
172
 
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * w-cluster v1.0.7
2
+ * w-cluster v1.0.9
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -236,7 +236,7 @@ export default WCluster
236
236
  <br class="clear">
237
237
 
238
238
  <footer>
239
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:34:57 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
239
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:37:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
240
240
  </footer>
241
241
 
242
242
  <script>prettyPrint();</script>
@@ -10,7 +10,7 @@
10
10
 
11
11
  <script src="https://cdn.jsdelivr.net/npm/wsemi/dist/wsemi.umd.js"></script>
12
12
 
13
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.umd.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.umd.js"></script>
14
14
 
15
15
  <script>
16
16
  let dataIris=[{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.6,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.7,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.4,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.4,"x2":2.9,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.4,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.3,"x2":3,"x3":1.1,"x4":0.1},{"class":"setosa","x1":5.8,"x2":4,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.7,"x2":4.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.3,"x4":0.4},{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.7,"x2":3.8,"x3":1.7,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.5,"x4":0.3},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.7,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.7,"x3":1.5,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.6,"x3":1,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.3,"x3":1.7,"x4":0.5},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.9,"x4":0.2},{"class":"setosa","x1":5,"x2":3,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5,"x2":3.4,"x3":1.6,"x4":0.4},{"class":"setosa","x1":5.2,"x2":3.5,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5.2,"x2":3.4,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.1,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.2,"x2":4.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.5,"x2":4.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.2,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.5,"x2":3.5,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.6,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.4,"x2":3,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.5,"x2":2.3,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.4,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.6,"x4":0.6},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.9,"x4":0.4},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.3,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.3,"x3":1.4,"x4":0.2},{"class":"versicolor","x1":7,"x2":3.2,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":6.4,"x2":3.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6.9,"x2":3.1,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":5.5,"x2":2.3,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.5,"x2":2.8,"x3":4.6,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.5,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":3.3,"x3":4.7,"x4":1.6},{"class":"versicolor","x1":4.9,"x2":2.4,"x3":3.3,"x4":1},{"class":"versicolor","x1":6.6,"x2":2.9,"x3":4.6,"x4":1.3},{"class":"versicolor","x1":5.2,"x2":2.7,"x3":3.9,"x4":1.4},{"class":"versicolor","x1":5,"x2":2,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.9,"x2":3,"x3":4.2,"x4":1.5},{"class":"versicolor","x1":6,"x2":2.2,"x3":4,"x4":1},{"class":"versicolor","x1":6.1,"x2":2.9,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":2.9,"x3":3.6,"x4":1.3},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":4.1,"x4":1},{"class":"versicolor","x1":6.2,"x2":2.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.6,"x2":2.5,"x3":3.9,"x4":1.1},{"class":"versicolor","x1":5.9,"x2":3.2,"x3":4.8,"x4":1.8},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":2.5,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4.7,"x4":1.2},{"class":"versicolor","x1":6.4,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":6.6,"x2":3,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":6.8,"x2":2.8,"x3":4.8,"x4":1.4},{"class":"versicolor","x1":6.7,"x2":3,"x3":5,"x4":1.7},{"class":"versicolor","x1":6,"x2":2.9,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.6,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.8,"x4":1.1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.7,"x4":1},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":3.9,"x4":1.2},{"class":"versicolor","x1":6,"x2":2.7,"x3":5.1,"x4":1.6},{"class":"versicolor","x1":5.4,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6,"x2":3.4,"x3":4.5,"x4":1.6},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.7,"x4":1.5},{"class":"versicolor","x1":6.3,"x2":2.3,"x3":4.4,"x4":1.3},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.1,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.5,"x3":4,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.6,"x3":4.4,"x4":1.2},{"class":"versicolor","x1":6.1,"x2":3,"x3":4.6,"x4":1.4},{"class":"versicolor","x1":5.8,"x2":2.6,"x3":4,"x4":1.2},{"class":"versicolor","x1":5,"x2":2.3,"x3":3.3,"x4":1},{"class":"versicolor","x1":5.6,"x2":2.7,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":5.7,"x2":3,"x3":4.2,"x4":1.2},{"class":"versicolor","x1":5.7,"x2":2.9,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":6.2,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":5.1,"x2":2.5,"x3":3,"x4":1.1},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.1,"x4":1.3},{"class":"virginica","x1":6.3,"x2":3.3,"x3":6,"x4":2.5},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":7.1,"x2":3,"x3":5.9,"x4":2.1},{"class":"virginica","x1":6.3,"x2":2.9,"x3":5.6,"x4":1.8},{"class":"virginica","x1":6.5,"x2":3,"x3":5.8,"x4":2.2},{"class":"virginica","x1":7.6,"x2":3,"x3":6.6,"x4":2.1},{"class":"virginica","x1":4.9,"x2":2.5,"x3":4.5,"x4":1.7},{"class":"virginica","x1":7.3,"x2":2.9,"x3":6.3,"x4":1.8},{"class":"virginica","x1":6.7,"x2":2.5,"x3":5.8,"x4":1.8},{"class":"virginica","x1":7.2,"x2":3.6,"x3":6.1,"x4":2.5},{"class":"virginica","x1":6.5,"x2":3.2,"x3":5.1,"x4":2},{"class":"virginica","x1":6.4,"x2":2.7,"x3":5.3,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3,"x3":5.5,"x4":2.1},{"class":"virginica","x1":5.7,"x2":2.5,"x3":5,"x4":2},{"class":"virginica","x1":5.8,"x2":2.8,"x3":5.1,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.2,"x3":5.3,"x4":2.3},{"class":"virginica","x1":6.5,"x2":3,"x3":5.5,"x4":1.8},{"class":"virginica","x1":7.7,"x2":3.8,"x3":6.7,"x4":2.2},{"class":"virginica","x1":7.7,"x2":2.6,"x3":6.9,"x4":2.3},{"class":"virginica","x1":6,"x2":2.2,"x3":5,"x4":1.5},{"class":"virginica","x1":6.9,"x2":3.2,"x3":5.7,"x4":2.3},{"class":"virginica","x1":5.6,"x2":2.8,"x3":4.9,"x4":2},{"class":"virginica","x1":7.7,"x2":2.8,"x3":6.7,"x4":2},{"class":"virginica","x1":6.3,"x2":2.7,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3.2,"x3":6,"x4":1.8},{"class":"virginica","x1":6.2,"x2":2.8,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.1,"x2":3,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3,"x3":5.8,"x4":1.6},{"class":"virginica","x1":7.4,"x2":2.8,"x3":6.1,"x4":1.9},{"class":"virginica","x1":7.9,"x2":3.8,"x3":6.4,"x4":2},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.2},{"class":"virginica","x1":6.3,"x2":2.8,"x3":5.1,"x4":1.5},{"class":"virginica","x1":6.1,"x2":2.6,"x3":5.6,"x4":1.4},{"class":"virginica","x1":7.7,"x2":3,"x3":6.1,"x4":2.3},{"class":"virginica","x1":6.3,"x2":3.4,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.1,"x3":5.5,"x4":1.8},{"class":"virginica","x1":6,"x2":3,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.4,"x4":2.1},{"class":"virginica","x1":6.7,"x2":3.1,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.1,"x4":2.3},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3.2,"x3":5.9,"x4":2.3},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.5},{"class":"virginica","x1":6.7,"x2":3,"x3":5.2,"x4":2.3},{"class":"virginica","x1":6.3,"x2":2.5,"x3":5,"x4":1.9},{"class":"virginica","x1":6.5,"x2":3,"x3":5.2,"x4":2},{"class":"virginica","x1":6.2,"x2":3.4,"x3":5.4,"x4":2.3},{"class":"virginica","x1":5.9,"x2":3,"x3":5.1,"x4":1.8}]
@@ -12,7 +12,7 @@
12
12
 
13
13
  <script src="https://code.highcharts.com/highcharts.js"></script>
14
14
 
15
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.umd.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.umd.js"></script>
16
16
 
17
17
  <script>
18
18
  let dataIris=[{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.6,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.7,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.4,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.4,"x2":2.9,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.4,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.3,"x2":3,"x3":1.1,"x4":0.1},{"class":"setosa","x1":5.8,"x2":4,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.7,"x2":4.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.3,"x4":0.4},{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.7,"x2":3.8,"x3":1.7,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.5,"x4":0.3},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.7,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.7,"x3":1.5,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.6,"x3":1,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.3,"x3":1.7,"x4":0.5},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.9,"x4":0.2},{"class":"setosa","x1":5,"x2":3,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5,"x2":3.4,"x3":1.6,"x4":0.4},{"class":"setosa","x1":5.2,"x2":3.5,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5.2,"x2":3.4,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.1,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.2,"x2":4.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.5,"x2":4.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.2,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.5,"x2":3.5,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.6,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.4,"x2":3,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.5,"x2":2.3,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.4,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.6,"x4":0.6},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.9,"x4":0.4},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.3,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.3,"x3":1.4,"x4":0.2},{"class":"versicolor","x1":7,"x2":3.2,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":6.4,"x2":3.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6.9,"x2":3.1,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":5.5,"x2":2.3,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.5,"x2":2.8,"x3":4.6,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.5,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":3.3,"x3":4.7,"x4":1.6},{"class":"versicolor","x1":4.9,"x2":2.4,"x3":3.3,"x4":1},{"class":"versicolor","x1":6.6,"x2":2.9,"x3":4.6,"x4":1.3},{"class":"versicolor","x1":5.2,"x2":2.7,"x3":3.9,"x4":1.4},{"class":"versicolor","x1":5,"x2":2,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.9,"x2":3,"x3":4.2,"x4":1.5},{"class":"versicolor","x1":6,"x2":2.2,"x3":4,"x4":1},{"class":"versicolor","x1":6.1,"x2":2.9,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":2.9,"x3":3.6,"x4":1.3},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":4.1,"x4":1},{"class":"versicolor","x1":6.2,"x2":2.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.6,"x2":2.5,"x3":3.9,"x4":1.1},{"class":"versicolor","x1":5.9,"x2":3.2,"x3":4.8,"x4":1.8},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":2.5,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4.7,"x4":1.2},{"class":"versicolor","x1":6.4,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":6.6,"x2":3,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":6.8,"x2":2.8,"x3":4.8,"x4":1.4},{"class":"versicolor","x1":6.7,"x2":3,"x3":5,"x4":1.7},{"class":"versicolor","x1":6,"x2":2.9,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.6,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.8,"x4":1.1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.7,"x4":1},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":3.9,"x4":1.2},{"class":"versicolor","x1":6,"x2":2.7,"x3":5.1,"x4":1.6},{"class":"versicolor","x1":5.4,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6,"x2":3.4,"x3":4.5,"x4":1.6},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.7,"x4":1.5},{"class":"versicolor","x1":6.3,"x2":2.3,"x3":4.4,"x4":1.3},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.1,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.5,"x3":4,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.6,"x3":4.4,"x4":1.2},{"class":"versicolor","x1":6.1,"x2":3,"x3":4.6,"x4":1.4},{"class":"versicolor","x1":5.8,"x2":2.6,"x3":4,"x4":1.2},{"class":"versicolor","x1":5,"x2":2.3,"x3":3.3,"x4":1},{"class":"versicolor","x1":5.6,"x2":2.7,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":5.7,"x2":3,"x3":4.2,"x4":1.2},{"class":"versicolor","x1":5.7,"x2":2.9,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":6.2,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":5.1,"x2":2.5,"x3":3,"x4":1.1},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.1,"x4":1.3},{"class":"virginica","x1":6.3,"x2":3.3,"x3":6,"x4":2.5},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":7.1,"x2":3,"x3":5.9,"x4":2.1},{"class":"virginica","x1":6.3,"x2":2.9,"x3":5.6,"x4":1.8},{"class":"virginica","x1":6.5,"x2":3,"x3":5.8,"x4":2.2},{"class":"virginica","x1":7.6,"x2":3,"x3":6.6,"x4":2.1},{"class":"virginica","x1":4.9,"x2":2.5,"x3":4.5,"x4":1.7},{"class":"virginica","x1":7.3,"x2":2.9,"x3":6.3,"x4":1.8},{"class":"virginica","x1":6.7,"x2":2.5,"x3":5.8,"x4":1.8},{"class":"virginica","x1":7.2,"x2":3.6,"x3":6.1,"x4":2.5},{"class":"virginica","x1":6.5,"x2":3.2,"x3":5.1,"x4":2},{"class":"virginica","x1":6.4,"x2":2.7,"x3":5.3,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3,"x3":5.5,"x4":2.1},{"class":"virginica","x1":5.7,"x2":2.5,"x3":5,"x4":2},{"class":"virginica","x1":5.8,"x2":2.8,"x3":5.1,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.2,"x3":5.3,"x4":2.3},{"class":"virginica","x1":6.5,"x2":3,"x3":5.5,"x4":1.8},{"class":"virginica","x1":7.7,"x2":3.8,"x3":6.7,"x4":2.2},{"class":"virginica","x1":7.7,"x2":2.6,"x3":6.9,"x4":2.3},{"class":"virginica","x1":6,"x2":2.2,"x3":5,"x4":1.5},{"class":"virginica","x1":6.9,"x2":3.2,"x3":5.7,"x4":2.3},{"class":"virginica","x1":5.6,"x2":2.8,"x3":4.9,"x4":2},{"class":"virginica","x1":7.7,"x2":2.8,"x3":6.7,"x4":2},{"class":"virginica","x1":6.3,"x2":2.7,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3.2,"x3":6,"x4":1.8},{"class":"virginica","x1":6.2,"x2":2.8,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.1,"x2":3,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3,"x3":5.8,"x4":1.6},{"class":"virginica","x1":7.4,"x2":2.8,"x3":6.1,"x4":1.9},{"class":"virginica","x1":7.9,"x2":3.8,"x3":6.4,"x4":2},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.2},{"class":"virginica","x1":6.3,"x2":2.8,"x3":5.1,"x4":1.5},{"class":"virginica","x1":6.1,"x2":2.6,"x3":5.6,"x4":1.4},{"class":"virginica","x1":7.7,"x2":3,"x3":6.1,"x4":2.3},{"class":"virginica","x1":6.3,"x2":3.4,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.1,"x3":5.5,"x4":1.8},{"class":"virginica","x1":6,"x2":3,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.4,"x4":2.1},{"class":"virginica","x1":6.7,"x2":3.1,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.1,"x4":2.3},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3.2,"x3":5.9,"x4":2.3},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.5},{"class":"virginica","x1":6.7,"x2":3,"x3":5.2,"x4":2.3},{"class":"virginica","x1":6.3,"x2":2.5,"x3":5,"x4":1.9},{"class":"virginica","x1":6.5,"x2":3,"x3":5.2,"x4":2},{"class":"virginica","x1":6.2,"x2":3.4,"x3":5.4,"x4":2.3},{"class":"virginica","x1":5.9,"x2":3,"x3":5.1,"x4":1.8}]
@@ -12,7 +12,7 @@
12
12
 
13
13
  <script src="https://code.highcharts.com/highcharts.js"></script>
14
14
 
15
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.umd.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.umd.js"></script>
16
16
 
17
17
  <script>
18
18
  let dataIris=[{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.6,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.7,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.4,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.4,"x2":2.9,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.4,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.3,"x2":3,"x3":1.1,"x4":0.1},{"class":"setosa","x1":5.8,"x2":4,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.7,"x2":4.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.3,"x4":0.4},{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.7,"x2":3.8,"x3":1.7,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.5,"x4":0.3},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.7,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.7,"x3":1.5,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.6,"x3":1,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.3,"x3":1.7,"x4":0.5},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.9,"x4":0.2},{"class":"setosa","x1":5,"x2":3,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5,"x2":3.4,"x3":1.6,"x4":0.4},{"class":"setosa","x1":5.2,"x2":3.5,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5.2,"x2":3.4,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.1,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.2,"x2":4.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.5,"x2":4.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.2,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.5,"x2":3.5,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.6,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.4,"x2":3,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.5,"x2":2.3,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.4,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.6,"x4":0.6},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.9,"x4":0.4},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.3,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.3,"x3":1.4,"x4":0.2},{"class":"versicolor","x1":7,"x2":3.2,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":6.4,"x2":3.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6.9,"x2":3.1,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":5.5,"x2":2.3,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.5,"x2":2.8,"x3":4.6,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.5,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":3.3,"x3":4.7,"x4":1.6},{"class":"versicolor","x1":4.9,"x2":2.4,"x3":3.3,"x4":1},{"class":"versicolor","x1":6.6,"x2":2.9,"x3":4.6,"x4":1.3},{"class":"versicolor","x1":5.2,"x2":2.7,"x3":3.9,"x4":1.4},{"class":"versicolor","x1":5,"x2":2,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.9,"x2":3,"x3":4.2,"x4":1.5},{"class":"versicolor","x1":6,"x2":2.2,"x3":4,"x4":1},{"class":"versicolor","x1":6.1,"x2":2.9,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":2.9,"x3":3.6,"x4":1.3},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":4.1,"x4":1},{"class":"versicolor","x1":6.2,"x2":2.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.6,"x2":2.5,"x3":3.9,"x4":1.1},{"class":"versicolor","x1":5.9,"x2":3.2,"x3":4.8,"x4":1.8},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":2.5,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4.7,"x4":1.2},{"class":"versicolor","x1":6.4,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":6.6,"x2":3,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":6.8,"x2":2.8,"x3":4.8,"x4":1.4},{"class":"versicolor","x1":6.7,"x2":3,"x3":5,"x4":1.7},{"class":"versicolor","x1":6,"x2":2.9,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.6,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.8,"x4":1.1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.7,"x4":1},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":3.9,"x4":1.2},{"class":"versicolor","x1":6,"x2":2.7,"x3":5.1,"x4":1.6},{"class":"versicolor","x1":5.4,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6,"x2":3.4,"x3":4.5,"x4":1.6},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.7,"x4":1.5},{"class":"versicolor","x1":6.3,"x2":2.3,"x3":4.4,"x4":1.3},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.1,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.5,"x3":4,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.6,"x3":4.4,"x4":1.2},{"class":"versicolor","x1":6.1,"x2":3,"x3":4.6,"x4":1.4},{"class":"versicolor","x1":5.8,"x2":2.6,"x3":4,"x4":1.2},{"class":"versicolor","x1":5,"x2":2.3,"x3":3.3,"x4":1},{"class":"versicolor","x1":5.6,"x2":2.7,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":5.7,"x2":3,"x3":4.2,"x4":1.2},{"class":"versicolor","x1":5.7,"x2":2.9,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":6.2,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":5.1,"x2":2.5,"x3":3,"x4":1.1},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.1,"x4":1.3},{"class":"virginica","x1":6.3,"x2":3.3,"x3":6,"x4":2.5},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":7.1,"x2":3,"x3":5.9,"x4":2.1},{"class":"virginica","x1":6.3,"x2":2.9,"x3":5.6,"x4":1.8},{"class":"virginica","x1":6.5,"x2":3,"x3":5.8,"x4":2.2},{"class":"virginica","x1":7.6,"x2":3,"x3":6.6,"x4":2.1},{"class":"virginica","x1":4.9,"x2":2.5,"x3":4.5,"x4":1.7},{"class":"virginica","x1":7.3,"x2":2.9,"x3":6.3,"x4":1.8},{"class":"virginica","x1":6.7,"x2":2.5,"x3":5.8,"x4":1.8},{"class":"virginica","x1":7.2,"x2":3.6,"x3":6.1,"x4":2.5},{"class":"virginica","x1":6.5,"x2":3.2,"x3":5.1,"x4":2},{"class":"virginica","x1":6.4,"x2":2.7,"x3":5.3,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3,"x3":5.5,"x4":2.1},{"class":"virginica","x1":5.7,"x2":2.5,"x3":5,"x4":2},{"class":"virginica","x1":5.8,"x2":2.8,"x3":5.1,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.2,"x3":5.3,"x4":2.3},{"class":"virginica","x1":6.5,"x2":3,"x3":5.5,"x4":1.8},{"class":"virginica","x1":7.7,"x2":3.8,"x3":6.7,"x4":2.2},{"class":"virginica","x1":7.7,"x2":2.6,"x3":6.9,"x4":2.3},{"class":"virginica","x1":6,"x2":2.2,"x3":5,"x4":1.5},{"class":"virginica","x1":6.9,"x2":3.2,"x3":5.7,"x4":2.3},{"class":"virginica","x1":5.6,"x2":2.8,"x3":4.9,"x4":2},{"class":"virginica","x1":7.7,"x2":2.8,"x3":6.7,"x4":2},{"class":"virginica","x1":6.3,"x2":2.7,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3.2,"x3":6,"x4":1.8},{"class":"virginica","x1":6.2,"x2":2.8,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.1,"x2":3,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3,"x3":5.8,"x4":1.6},{"class":"virginica","x1":7.4,"x2":2.8,"x3":6.1,"x4":1.9},{"class":"virginica","x1":7.9,"x2":3.8,"x3":6.4,"x4":2},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.2},{"class":"virginica","x1":6.3,"x2":2.8,"x3":5.1,"x4":1.5},{"class":"virginica","x1":6.1,"x2":2.6,"x3":5.6,"x4":1.4},{"class":"virginica","x1":7.7,"x2":3,"x3":6.1,"x4":2.3},{"class":"virginica","x1":6.3,"x2":3.4,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.1,"x3":5.5,"x4":1.8},{"class":"virginica","x1":6,"x2":3,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.4,"x4":2.1},{"class":"virginica","x1":6.7,"x2":3.1,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.1,"x4":2.3},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3.2,"x3":5.9,"x4":2.3},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.5},{"class":"virginica","x1":6.7,"x2":3,"x3":5.2,"x4":2.3},{"class":"virginica","x1":6.3,"x2":2.5,"x3":5,"x4":1.9},{"class":"virginica","x1":6.5,"x2":3,"x3":5.2,"x4":2},{"class":"virginica","x1":6.2,"x2":3.4,"x3":5.4,"x4":2.3},{"class":"virginica","x1":5.9,"x2":3,"x3":5.1,"x4":1.8}]
@@ -12,7 +12,7 @@
12
12
 
13
13
  <script src="https://code.highcharts.com/highcharts.js"></script>
14
14
 
15
- <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.8/dist/w-cluster.wk.umd.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/w-cluster@1.0.9/dist/w-cluster.wk.umd.js"></script>
16
16
 
17
17
  <script>
18
18
  let dataIris=[{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.6,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.7,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.4,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.4,"x2":2.9,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.4,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.3,"x2":3,"x3":1.1,"x4":0.1},{"class":"setosa","x1":5.8,"x2":4,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.7,"x2":4.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.4,"x2":3.9,"x3":1.3,"x4":0.4},{"class":"setosa","x1":5.1,"x2":3.5,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.7,"x2":3.8,"x3":1.7,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.5,"x4":0.3},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.7,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.7,"x3":1.5,"x4":0.4},{"class":"setosa","x1":4.6,"x2":3.6,"x3":1,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.3,"x3":1.7,"x4":0.5},{"class":"setosa","x1":4.8,"x2":3.4,"x3":1.9,"x4":0.2},{"class":"setosa","x1":5,"x2":3,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5,"x2":3.4,"x3":1.6,"x4":0.4},{"class":"setosa","x1":5.2,"x2":3.5,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5.2,"x2":3.4,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.7,"x2":3.2,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.8,"x2":3.1,"x3":1.6,"x4":0.2},{"class":"setosa","x1":5.4,"x2":3.4,"x3":1.5,"x4":0.4},{"class":"setosa","x1":5.2,"x2":4.1,"x3":1.5,"x4":0.1},{"class":"setosa","x1":5.5,"x2":4.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.1,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.2,"x3":1.2,"x4":0.2},{"class":"setosa","x1":5.5,"x2":3.5,"x3":1.3,"x4":0.2},{"class":"setosa","x1":4.9,"x2":3.6,"x3":1.4,"x4":0.1},{"class":"setosa","x1":4.4,"x2":3,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5.1,"x2":3.4,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.5,"x2":2.3,"x3":1.3,"x4":0.3},{"class":"setosa","x1":4.4,"x2":3.2,"x3":1.3,"x4":0.2},{"class":"setosa","x1":5,"x2":3.5,"x3":1.6,"x4":0.6},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.9,"x4":0.4},{"class":"setosa","x1":4.8,"x2":3,"x3":1.4,"x4":0.3},{"class":"setosa","x1":5.1,"x2":3.8,"x3":1.6,"x4":0.2},{"class":"setosa","x1":4.6,"x2":3.2,"x3":1.4,"x4":0.2},{"class":"setosa","x1":5.3,"x2":3.7,"x3":1.5,"x4":0.2},{"class":"setosa","x1":5,"x2":3.3,"x3":1.4,"x4":0.2},{"class":"versicolor","x1":7,"x2":3.2,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":6.4,"x2":3.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6.9,"x2":3.1,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":5.5,"x2":2.3,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.5,"x2":2.8,"x3":4.6,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.5,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":3.3,"x3":4.7,"x4":1.6},{"class":"versicolor","x1":4.9,"x2":2.4,"x3":3.3,"x4":1},{"class":"versicolor","x1":6.6,"x2":2.9,"x3":4.6,"x4":1.3},{"class":"versicolor","x1":5.2,"x2":2.7,"x3":3.9,"x4":1.4},{"class":"versicolor","x1":5,"x2":2,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.9,"x2":3,"x3":4.2,"x4":1.5},{"class":"versicolor","x1":6,"x2":2.2,"x3":4,"x4":1},{"class":"versicolor","x1":6.1,"x2":2.9,"x3":4.7,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":2.9,"x3":3.6,"x4":1.3},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":4.1,"x4":1},{"class":"versicolor","x1":6.2,"x2":2.2,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.6,"x2":2.5,"x3":3.9,"x4":1.1},{"class":"versicolor","x1":5.9,"x2":3.2,"x3":4.8,"x4":1.8},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4,"x4":1.3},{"class":"versicolor","x1":6.3,"x2":2.5,"x3":4.9,"x4":1.5},{"class":"versicolor","x1":6.1,"x2":2.8,"x3":4.7,"x4":1.2},{"class":"versicolor","x1":6.4,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":6.6,"x2":3,"x3":4.4,"x4":1.4},{"class":"versicolor","x1":6.8,"x2":2.8,"x3":4.8,"x4":1.4},{"class":"versicolor","x1":6.7,"x2":3,"x3":5,"x4":1.7},{"class":"versicolor","x1":6,"x2":2.9,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":5.7,"x2":2.6,"x3":3.5,"x4":1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.8,"x4":1.1},{"class":"versicolor","x1":5.5,"x2":2.4,"x3":3.7,"x4":1},{"class":"versicolor","x1":5.8,"x2":2.7,"x3":3.9,"x4":1.2},{"class":"versicolor","x1":6,"x2":2.7,"x3":5.1,"x4":1.6},{"class":"versicolor","x1":5.4,"x2":3,"x3":4.5,"x4":1.5},{"class":"versicolor","x1":6,"x2":3.4,"x3":4.5,"x4":1.6},{"class":"versicolor","x1":6.7,"x2":3.1,"x3":4.7,"x4":1.5},{"class":"versicolor","x1":6.3,"x2":2.3,"x3":4.4,"x4":1.3},{"class":"versicolor","x1":5.6,"x2":3,"x3":4.1,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.5,"x3":4,"x4":1.3},{"class":"versicolor","x1":5.5,"x2":2.6,"x3":4.4,"x4":1.2},{"class":"versicolor","x1":6.1,"x2":3,"x3":4.6,"x4":1.4},{"class":"versicolor","x1":5.8,"x2":2.6,"x3":4,"x4":1.2},{"class":"versicolor","x1":5,"x2":2.3,"x3":3.3,"x4":1},{"class":"versicolor","x1":5.6,"x2":2.7,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":5.7,"x2":3,"x3":4.2,"x4":1.2},{"class":"versicolor","x1":5.7,"x2":2.9,"x3":4.2,"x4":1.3},{"class":"versicolor","x1":6.2,"x2":2.9,"x3":4.3,"x4":1.3},{"class":"versicolor","x1":5.1,"x2":2.5,"x3":3,"x4":1.1},{"class":"versicolor","x1":5.7,"x2":2.8,"x3":4.1,"x4":1.3},{"class":"virginica","x1":6.3,"x2":3.3,"x3":6,"x4":2.5},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":7.1,"x2":3,"x3":5.9,"x4":2.1},{"class":"virginica","x1":6.3,"x2":2.9,"x3":5.6,"x4":1.8},{"class":"virginica","x1":6.5,"x2":3,"x3":5.8,"x4":2.2},{"class":"virginica","x1":7.6,"x2":3,"x3":6.6,"x4":2.1},{"class":"virginica","x1":4.9,"x2":2.5,"x3":4.5,"x4":1.7},{"class":"virginica","x1":7.3,"x2":2.9,"x3":6.3,"x4":1.8},{"class":"virginica","x1":6.7,"x2":2.5,"x3":5.8,"x4":1.8},{"class":"virginica","x1":7.2,"x2":3.6,"x3":6.1,"x4":2.5},{"class":"virginica","x1":6.5,"x2":3.2,"x3":5.1,"x4":2},{"class":"virginica","x1":6.4,"x2":2.7,"x3":5.3,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3,"x3":5.5,"x4":2.1},{"class":"virginica","x1":5.7,"x2":2.5,"x3":5,"x4":2},{"class":"virginica","x1":5.8,"x2":2.8,"x3":5.1,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.2,"x3":5.3,"x4":2.3},{"class":"virginica","x1":6.5,"x2":3,"x3":5.5,"x4":1.8},{"class":"virginica","x1":7.7,"x2":3.8,"x3":6.7,"x4":2.2},{"class":"virginica","x1":7.7,"x2":2.6,"x3":6.9,"x4":2.3},{"class":"virginica","x1":6,"x2":2.2,"x3":5,"x4":1.5},{"class":"virginica","x1":6.9,"x2":3.2,"x3":5.7,"x4":2.3},{"class":"virginica","x1":5.6,"x2":2.8,"x3":4.9,"x4":2},{"class":"virginica","x1":7.7,"x2":2.8,"x3":6.7,"x4":2},{"class":"virginica","x1":6.3,"x2":2.7,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3.2,"x3":6,"x4":1.8},{"class":"virginica","x1":6.2,"x2":2.8,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.1,"x2":3,"x3":4.9,"x4":1.8},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.1},{"class":"virginica","x1":7.2,"x2":3,"x3":5.8,"x4":1.6},{"class":"virginica","x1":7.4,"x2":2.8,"x3":6.1,"x4":1.9},{"class":"virginica","x1":7.9,"x2":3.8,"x3":6.4,"x4":2},{"class":"virginica","x1":6.4,"x2":2.8,"x3":5.6,"x4":2.2},{"class":"virginica","x1":6.3,"x2":2.8,"x3":5.1,"x4":1.5},{"class":"virginica","x1":6.1,"x2":2.6,"x3":5.6,"x4":1.4},{"class":"virginica","x1":7.7,"x2":3,"x3":6.1,"x4":2.3},{"class":"virginica","x1":6.3,"x2":3.4,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.4,"x2":3.1,"x3":5.5,"x4":1.8},{"class":"virginica","x1":6,"x2":3,"x3":4.8,"x4":1.8},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.4,"x4":2.1},{"class":"virginica","x1":6.7,"x2":3.1,"x3":5.6,"x4":2.4},{"class":"virginica","x1":6.9,"x2":3.1,"x3":5.1,"x4":2.3},{"class":"virginica","x1":5.8,"x2":2.7,"x3":5.1,"x4":1.9},{"class":"virginica","x1":6.8,"x2":3.2,"x3":5.9,"x4":2.3},{"class":"virginica","x1":6.7,"x2":3.3,"x3":5.7,"x4":2.5},{"class":"virginica","x1":6.7,"x2":3,"x3":5.2,"x4":2.3},{"class":"virginica","x1":6.3,"x2":2.5,"x3":5,"x4":1.9},{"class":"virginica","x1":6.5,"x2":3,"x3":5.2,"x4":2},{"class":"virginica","x1":6.2,"x2":3.4,"x3":5.4,"x4":2.3},{"class":"virginica","x1":5.9,"x2":3,"x3":5.1,"x4":1.8}]
package/docs/global.html CHANGED
@@ -897,7 +897,7 @@
897
897
  <br class="clear">
898
898
 
899
899
  <footer>
900
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:34:57 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
900
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:37:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
901
901
  </footer>
902
902
 
903
903
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -68,7 +68,7 @@
68
68
  <br class="clear">
69
69
 
70
70
  <footer>
71
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:34:57 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
71
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 07 2022 15:37:05 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
72
72
  </footer>
73
73
 
74
74
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-cluster",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "A tool for data PCA(Principle Component Analysis) and cluster(K-Means & K-Medoids).",
5
5
  "main": "dist/w-cluster.umd.js",
6
6
  "dependencies": {
@@ -0,0 +1 @@
1
+ !function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";function l(d,l){(null==l||l>d.length)&&(l=d.length);for(var b=0,c=new Array(l);b<l;b++)c[b]=d[b];return c}function b(d){return function(d){if(Array.isArray(d))return l(d)}(d)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(d)||function(d,b){if(d){if("string"==typeof d)return l(d,b);var c=Object.prototype.toString.call(d).slice(8,-1);return"Object"===c&&d.constructor&&(c=d.constructor.name),"Map"===c||"Set"===c?Array.from(d):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?l(d,b):void 0}}(d)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(d,l,b,c,Z,X,y){try{var G=d[X](y),m=G.value}catch(d){return void b(d)}G.done?l(m):Promise.resolve(m).then(c,Z)}function Z(d){return function(){var l=this,b=arguments;return new Promise((function(Z,X){var y=d.apply(l,b);function G(d){c(y,Z,X,G,m,"next",d)}function m(d){c(y,Z,X,G,m,"throw",d)}G(void 0)}))}}function X(d){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(d){return typeof d}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},X(d)}function y(d){var l={exports:{}};return d(l,l.exports),l.exports}var G,m=y((function(d){var l=function(d){var l,b=Object.prototype,c=b.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},y=Z.iterator||"@@iterator",G=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,b){return Object.defineProperty(d,l,{value:b,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,b){return d[l]=b}}function p(d,l,b,c){var Z=l&&l.prototype instanceof o?l:o,X=Object.create(Z.prototype),y=new R(c||[]);return X._invoke=function(d,l,b){var c=t;return function(Z,X){if(c===I)throw new Error("Generator is already running");if(c===W){if("throw"===Z)throw X;return J()}for(b.method=Z,b.arg=X;;){var y=b.delegate;if(y){var G=S(y,b);if(G){if(G===u)continue;return G}}if("next"===b.method)b.sent=b._sent=b.arg;else if("throw"===b.method){if(c===t)throw c=W,b.arg;b.dispatchException(b.arg)}else"return"===b.method&&b.abrupt("return",b.arg);c=I;var m=i(d,l,b);if("normal"===m.type){if(c=b.done?W:h,m.arg===u)continue;return{value:m.arg,done:b.done}}"throw"===m.type&&(c=W,b.method="throw",b.arg=m.arg)}}}(d,b,y),X}function i(d,l,b){try{return{type:"normal",arg:d.call(l,b)}}catch(d){return{type:"throw",arg:d}}}d.wrap=p;var t="suspendedStart",h="suspendedYield",I="executing",W="completed",u={};function o(){}function V(){}function s(){}var H={};K(H,y,(function(){return this}));var C=Object.getPrototypeOf,L=C&&C(C(z([])));L&&L!==b&&c.call(L,y)&&(H=L);var a=s.prototype=o.prototype=Object.create(H);function n(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function b(Z,y,G,m){var K=i(d[Z],d,y);if("throw"!==K.type){var p=K.arg,t=p.value;return t&&"object"===X(t)&&c.call(t,"__await")?l.resolve(t.__await).then((function(d){b("next",d,G,m)}),(function(d){b("throw",d,G,m)})):l.resolve(t).then((function(d){p.value=d,G(p)}),(function(d){return b("throw",d,G,m)}))}m(K.arg)}var Z;this._invoke=function(d,c){function X(){return new l((function(l,Z){b(d,c,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,b){var c=d.iterator[b.method];if(c===l){if(b.delegate=null,"throw"===b.method){if(d.iterator.return&&(b.method="return",b.arg=l,S(d,b),"throw"===b.method))return u;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return u}var Z=i(c,d.iterator,b.arg);if("throw"===Z.type)return b.method="throw",b.arg=Z.arg,b.delegate=null,u;var X=Z.arg;return X?X.done?(b[d.resultName]=X.value,b.next=d.nextLoc,"return"!==b.method&&(b.method="next",b.arg=l),b.delegate=null,u):X:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,u)}function g(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function Y(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(g,this),this.reset(!0)}function z(d){if(d){var b=d[y];if(b)return b.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,X=function b(){for(;++Z<d.length;)if(c.call(d,Z))return b.value=d[Z],b.done=!1,b;return b.value=l,b.done=!0,b};return X.next=X}}return{next:J}}function J(){return{value:l,done:!0}}return V.prototype=s,K(a,"constructor",s),K(s,"constructor",V),V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(a),d},d.awrap=function(d){return{__await:d}},n(x.prototype),K(x.prototype,G,(function(){return this})),d.AsyncIterator=x,d.async=function(l,b,c,Z,X){void 0===X&&(X=Promise);var y=new x(p(l,b,c,Z),X);return d.isGeneratorFunction(b)?y:y.next().then((function(d){return d.done?d.value:y.next()}))},n(a),K(a,m,"Generator"),K(a,y,(function(){return this})),K(a,"toString",(function(){return"[object Generator]"})),d.keys=function(d){var l=[];for(var b in d)l.push(b);return l.reverse(),function b(){for(;l.length;){var c=l.pop();if(c in d)return b.value=c,b.done=!1,b}return b.done=!0,b}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(Y),!d)for(var b in this)"t"===b.charAt(0)&&c.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var b=this;function Z(c,Z){return G.type="throw",G.arg=d,b.next=c,Z&&(b.method="next",b.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var y=this.tryEntries[X],G=y.completion;if("root"===y.tryLoc)return Z("end");if(y.tryLoc<=this.prev){var m=c.call(y,"catchLoc"),K=c.call(y,"finallyLoc");if(m&&K){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0);if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}else if(m){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}}}},abrupt:function(d,l){for(var b=this.tryEntries.length-1;b>=0;--b){var Z=this.tryEntries[b];if(Z.tryLoc<=this.prev&&c.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var y=X?X.completion:{};return y.type=d,y.arg=l,X?(this.method="next",this.next=X.finallyLoc,u):this.complete(y)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),u},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.finallyLoc===d)return this.complete(b.completion,b.afterLoc),Y(b),u}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.tryLoc===d){var c=b.completion;if("throw"===c.type){var Z=c.arg;Y(b)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,b,c){return this.delegate={iterator:z(d),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=l),u}},d}(d.exports);try{regeneratorRuntime=l}catch(d){"object"===("undefined"==typeof globalThis?"undefined":X(globalThis))?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}})),K=y((function(d){var l=Object.prototype.hasOwnProperty,b="~";function c(){}function Z(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,c,X,y){if("function"!=typeof c)throw new TypeError("The listener must be a function");var G=new Z(c,X||d,y),m=b?b+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],G]:d._events[m].push(G):(d._events[m]=G,d._eventsCount++),d}function y(d,l){0==--d._eventsCount?d._events=new c:delete d._events[l]}function G(){this._events=new c,this._eventsCount=0}Object.create&&(c.prototype=Object.create(null),(new c).__proto__||(b=!1)),G.prototype.eventNames=function(){var d,c,Z=[];if(0===this._eventsCount)return Z;for(c in d=this._events)l.call(d,c)&&Z.push(b?c.slice(1):c);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},G.prototype.listeners=function(d){var l=b?b+d:d,c=this._events[l];if(!c)return[];if(c.fn)return[c.fn];for(var Z=0,X=c.length,y=new Array(X);Z<X;Z++)y[Z]=c[Z].fn;return y},G.prototype.listenerCount=function(d){var l=b?b+d:d,c=this._events[l];return c?c.fn?1:c.length:0},G.prototype.emit=function(d,l,c,Z,X,y){var G=b?b+d:d;if(!this._events[G])return!1;var m,K,p=this._events[G],i=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),i){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,c),!0;case 4:return p.fn.call(p.context,l,c,Z),!0;case 5:return p.fn.call(p.context,l,c,Z,X),!0;case 6:return p.fn.call(p.context,l,c,Z,X,y),!0}for(K=1,m=new Array(i-1);K<i;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var t,h=p.length;for(K=0;K<h;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),i){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,c);break;case 4:p[K].fn.call(p[K].context,l,c,Z);break;default:if(!m)for(t=1,m=new Array(i-1);t<i;t++)m[t-1]=arguments[t];p[K].fn.apply(p[K].context,m)}}return!0},G.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},G.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},G.prototype.removeListener=function(d,l,c,Z){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return y(this,X),this;var G=this._events[X];if(G.fn)G.fn!==l||Z&&!G.once||c&&G.context!==c||y(this,X);else{for(var m=0,K=[],p=G.length;m<p;m++)(G[m].fn!==l||Z&&!G[m].once||c&&G[m].context!==c)&&K.push(G[m]);K.length?this._events[X]=1===K.length?K[0]:K:y(this,X)}return this},G.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&y(this,l)):(this._events=new c,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=b,G.EventEmitter=G,d.exports=G}));return function(){if("nodejs"!==("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new K}function c(){var d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function X(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),c=b.length,Z=0;Z<d;Z++)l[Z]=b[0|Math.random()*c];var X=l.join("");return X}var y,p=(y="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH1mdW5jdGlvbiBuKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBvPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmUscz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9b3x8c3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx1PWkuU3ltYm9sLGE9T2JqZWN0LnByb3RvdHlwZSxoPWEuaGFzT3duUHJvcGVydHksbD1hLnRvU3RyaW5nLGM9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZj1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxjKSxyPXRbY107dHJ5e3RbY109dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgbz1sLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbY109cjpkZWxldGUgdFtjXSksb30sbT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiBtLmNhbGwodCl9LHA9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpwJiZwIGluIE9iamVjdCh0KT9mKHQpOmcodCl9O3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBiPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXcodCl9LHk9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sdj0vXlx3KiQvO3ZhciBNPWZ1bmN0aW9uKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT1lJiYhYihlKSl8fCh2LnRlc3QoZSl8fCF5LnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX07dmFyIHg9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBFLFM9ZnVuY3Rpb24odCl7aWYoIXgodCkpcmV0dXJuITE7dmFyIGU9dyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGo9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sXz0oRT0vW14uXSskLy5leGVjKGomJmoua2V5cyYmai5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrRToiIjt2YXIgQT1mdW5jdGlvbih0KXtyZXR1cm4hIV8mJl8gaW4gdH0sQz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBDLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLE49T2JqZWN0LnByb3RvdHlwZSxPPWsudG9TdHJpbmcsRj1OLmhhc093blByb3BlcnR5LHo9UmVnRXhwKCJeIitPLmNhbGwoRikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIFQ9ZnVuY3Rpb24odCl7cmV0dXJuISgheCh0KXx8QSh0KSkmJihTKHQpP3o6SSkudGVzdChSKHQpKX07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFA9ZnVuY3Rpb24odCxlKXt2YXIgcj1WKHQsZSk7cmV0dXJuIFQocik/cjp2b2lkIDB9LHE9UChPYmplY3QsImNyZWF0ZSIpO3ZhciAkPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1xP3EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihxKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFUuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxCPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcT92b2lkIDAhPT1lW3RdOkIuY2FsbChlLHQpfTt2YXIgSz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09cSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVcucHJvdG90eXBlLmNsZWFyPSQsVy5wcm90b3R5cGUuZGVsZXRlPUQsVy5wcm90b3R5cGUuZ2V0PUwsVy5wcm90b3R5cGUuaGFzPUcsVy5wcm90b3R5cGUuc2V0PUs7dmFyIFg9Vzt2YXIgSj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sSD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1aKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkguY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFoodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPVoocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gbnQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bnQucHJvdG90eXBlLmNsZWFyPUosbnQucHJvdG90eXBlLmRlbGV0ZT1RLG50LnByb3RvdHlwZS5nZXQ9dHQsbnQucHJvdG90eXBlLmhhcz1ldCxudC5wcm90b3R5cGUuc2V0PXJ0O3ZhciBvdD1udCxzdD1QKGksIk1hcCIpO3ZhciBpdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFgsbWFwOm5ldyhzdHx8b3QpLHN0cmluZzpuZXcgWH19O3ZhciB1dD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiB1dChlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgaHQ9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gbXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bXQucHJvdG90eXBlLmNsZWFyPWl0LG10LnByb3RvdHlwZS5kZWxldGU9aHQsbXQucHJvdG90eXBlLmdldD1sdCxtdC5wcm90b3R5cGUuaGFzPWN0LG10LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PW10O2Z1bmN0aW9uIHB0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxvPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG8pKXJldHVybiBzLmdldChvKTt2YXIgaT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9cy5zZXQobyxpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcocHQuQ2FjaGV8fGd0KSxyfXB0LkNhY2hlPWd0O3ZhciB3dD1wdDt2YXIgZHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csYnQ9L1xcKFxcKT8vZyx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGR0LChmdW5jdGlvbih0LHIsbixvKXtlLnB1c2gobj9vLnJlcGxhY2UoYnQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgdnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsbz1BcnJheShuKTsrK3I8bjspb1tyXT1lKHRbcl0scix0KTtyZXR1cm4gb30sTXQ9dT91LnByb3RvdHlwZTp2b2lkIDAseHQ9TXQ/TXQudG9TdHJpbmc6dm9pZCAwO3ZhciBFdD1mdW5jdGlvbiBlKHIpe2lmKCJzdHJpbmciPT10eXBlb2YgcilyZXR1cm4gcjtpZih0KHIpKXJldHVybiB2dChyLGUpKyIiO2lmKGIocikpcmV0dXJuIHh0P3h0LmNhbGwocik6IiI7dmFyIG49cisiIjtyZXR1cm4iMCI9PW4mJjEvcj09LUluZmluaXR5PyItMCI6bn07dmFyIFN0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOkV0KHQpfTt2YXIganQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlKT9lOk0oZSxyKT9bZV06eXQoU3QoZSkpfTt2YXIgX3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxiKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBBdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9anQoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W190KGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfTt2YXIgQ3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOkF0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufSxSdD1PYmplY3QucHJvdG90eXBlO3ZhciBJdD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UnQpfTt2YXIga3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE90PWZ1bmN0aW9uKHQpe2lmKCFJdCh0KSlyZXR1cm4ga3QodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlOdC5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sRnQ9UChpLCJEYXRhVmlldyIpLHp0PVAoaSwiUHJvbWlzZSIpLFR0PVAoaSwiU2V0IiksVnQ9UChpLCJXZWFrTWFwIiksUHQ9UihGdCkscXQ9UihzdCksJHQ9Uih6dCksRHQ9UihUdCksVXQ9UihWdCksTHQ9dzsoRnQmJiJbb2JqZWN0IERhdGFWaWV3XSIhPUx0KG5ldyBGdChuZXcgQXJyYXlCdWZmZXIoMSkpKXx8c3QmJiJbb2JqZWN0IE1hcF0iIT1MdChuZXcgc3QpfHx6dCYmIltvYmplY3QgUHJvbWlzZV0iIT1MdCh6dC5yZXNvbHZlKCkpfHxUdCYmIltvYmplY3QgU2V0XSIhPUx0KG5ldyBUdCl8fFZ0JiYiW29iamVjdCBXZWFrTWFwXSIhPUx0KG5ldyBWdCkpJiYoTHQ9ZnVuY3Rpb24odCl7dmFyIGU9dyh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG49cj9SKHIpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgUHQ6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIHF0OnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgJHQ6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgRHQ6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBVdDpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgQnQ9THQ7dmFyIEd0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkd0KHQubGVuZ3RoKSYmIVModCl9O3ZhciBXdD1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCF0KGUpJiZkKGUpJiYiW29iamVjdCBTdHJpbmddIj09dyhlKX07dmFyIFh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LEp0PVh0KCJsZW5ndGgiKSxZdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIFp0PWZ1bmN0aW9uKHQpe3JldHVybiBZdC50ZXN0KHQpfSxIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFF0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsdGU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZWU9IlteXFx1ZDgwMC1cXHVkZmZmXSIscmU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLG5lPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixvZT0iKD86IitRdCsifCIrdGUrIikiKyI/IixzZT0iW1xcdWZlMGVcXHVmZTBmXT8iK29lKygiKD86XFx1MjAwZCg/OiIrW2VlLHJlLG5lXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIrb2UrIikqIiksaWU9Iig/OiIrW2VlK1F0KyI/IixRdCxyZSxuZSxIdF0uam9pbigifCIpKyIpIix1ZT1SZWdFeHAodGUrIig/PSIrdGUrIil8IitpZStzZSwiZyIpO3ZhciBhZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWUubGFzdEluZGV4PTA7dWUudGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgaGU9ZnVuY3Rpb24odCl7cmV0dXJuIFp0KHQpP2FlKHQpOkp0KHQpfTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihLdCh0KSlyZXR1cm4gV3QodCk/aGUodCk6dC5sZW5ndGg7dmFyIGU9QnQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpPdCh0KS5sZW5ndGh9O3ZhciBjZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fGQodCkmJiJbb2JqZWN0IE51bWJlcl0iPT13KHQpfTt2YXIgZmU9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fGQodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09dyh0KX07ZnVuY3Rpb24gbWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghcGUodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhbWUodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gZGUodCl7cmV0dXJuISFtZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IXdlKHRbMF0pKSl9Y29uc3QgYmU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gdmUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbj12b2lkIDA9PT1yPzA6cixvPWUudG9JbmRleCxzPXZvaWQgMD09PW8/dC5sZW5ndGg6bztpZihuPDB8fG4+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9bnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W25dLHU9bisxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX1mdW5jdGlvbiBNZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIHhlKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCF5ZShyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG49TWUodCksbz12ZSh0KTtpZihuPT09byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9uOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bzoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBoPShhLWkpLyhvLW4pLGw9MDtsPHQubGVuZ3RoO2wrKyllW2xdPSh0W2xdLW4pKmgraTtyZXR1cm4gZX1jb25zdCBFZT0iICIucmVwZWF0KDIpLFNlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gamUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpuPTEwLG1heE51bVNpemU6bz04fT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtFZX1bXG4ke1NlfSR7ZnVuY3Rpb24odCxlLHIsbil7Y29uc3R7cm93czpvLGNvbHVtbnM6c309dCxpPU1hdGgubWluKG8sZSksdT1NYXRoLm1pbihzLHIpLGE9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzx1O28rKylyLnB1c2goX2UodC5nZXQoZSxvKSxuKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfXUhPT1zJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtzLXJ9IG1vcmUgY29sdW1uc2ApO2khPT1vJiZhLnB1c2goYC4uLiAke28tZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke1NlfWApfSh0LHIsbixvKX1cbiR7RWV9XVxuJHtFZX1yb3dzOiAke3Qucm93c31cbiR7RWV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBfZSh0LGUpe2NvbnN0IHI9U3RyaW5nKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByLnBhZEVuZChlLCIgIik7Y29uc3Qgbj10LnRvUHJlY2lzaW9uKGUtMik7aWYobi5sZW5ndGg8PWUpcmV0dXJuIG47Y29uc3Qgbz10LnRvRXhwb25lbnRpYWwoZS0yKSxzPW8uaW5kZXhPZigiZSIpLGk9by5zbGljZShzKTtyZXR1cm4gby5zbGljZSgwLGUtaS5sZW5ndGgpK2l9ZnVuY3Rpb24gQWUodCxlLHIpe2xldCBuPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ2UodCxlLHIpe2xldCBuPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gSWUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24ga2UodCxlLHIsbixvKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihPZSgic3RhcnRSb3ciLGUpLE9lKCJlbmRSb3ciLHIpLE9lKCJzdGFydENvbHVtbiIsbiksT2UoImVuZENvbHVtbiIsbyksZT5yfHxuPm98fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8bjwwfHxuPj10LmNvbHVtbnN8fG88MHx8bz49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTmUodCxlPTApe2xldCByPVtdO2ZvcihsZXQgbj0wO248dDtuKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE9lKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIEZlKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIHple3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgbj1uZXcgVmUodCxlKTtmb3IobGV0IG89MDtvPHQ7bysrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQobyx0LHJbbyplK3RdKTtyZXR1cm4gbn1zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBWZSgxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgVmUodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpuPU1hdGgucmFuZG9tfT1yO2xldCBvPW5ldyBWZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChyLHQsbigpKTtyZXR1cm4gb31zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46bj0wLG1heDpvPTFlMyxyYW5kb206cz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKG4+PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1vLW4sdT1uZXcgVmUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW4rTWF0aC5yb3VuZChzKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBuPU1hdGgubWluKHQsZSksbz10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxuO3QrKylvLnNldCh0LHQscik7cmV0dXJuIG99c3RhdGljIGRpYWcodCxlLHIpe2xldCBuPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPW4pLHZvaWQgMD09PXImJihyPWUpO2xldCBvPU1hdGgubWluKG4sZSxyKSxzPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG87ZSsrKXMuc2V0KGUsZSx0W2VdKTtyZXR1cm4gc31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgVmUocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWluKHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyB0aGlzKHIsbik7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKW8uc2V0KHMscixNYXRoLm1heCh0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gb31zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIHplLmlzTWF0cml4KHQpP3Q6bmV3IFZlKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO3QrK31yZXR1cm4gbn1pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbj0hMCxvPSExO2Zvcig7dDx0aGlzLnJvd3MmJm47KXtmb3IoZT0wLG89ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bzspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG89ITAscj1lKToobj0hMSxvPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKG49ITEpO3QrK31yZXR1cm4gbn1lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IG49ZTtmb3IobGV0IG89ZTtvPHQucm93cztvKyspdC5nZXQobyxyKT50LmdldChuLHIpJiYobj1vKTtpZigwPT09dC5nZXQobixyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUsbik7bGV0IG89dC5nZXQoZSxyKTtmb3IobGV0IG49cjtuPHQuY29sdW1ucztuKyspdC5zZXQoZSxuLHQuZ2V0KGUsbikvbyk7Zm9yKGxldCBuPWUrMTtuPHQucm93cztuKyspe2xldCBvPXQuZ2V0KG4scikvdC5nZXQoZSxyKTt0LnNldChuLHIsMCk7Zm9yKGxldCBzPXIrMTtzPHQuY29sdW1ucztzKyspdC5zZXQobixzLHQuZ2V0KG4scyktdC5nZXQoZSxzKSpvKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Msbj1yLTE7Zm9yKDtuPj0wOylpZigwPT09dC5tYXhSb3cobikpbi0tO2Vsc2V7bGV0IG89MCxzPSExO2Zvcig7bzxyJiYhMT09PXM7KTE9PT10LmdldChuLG8pP3M9ITA6bysrO2ZvcihsZXQgcj0wO3I8bjtyKyspe2xldCBzPXQuZ2V0KHIsbyk7Zm9yKGxldCBpPW87aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1zKnQuZ2V0KG4saSk7dC5zZXQocixpLGUpfX1uLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IG49bmV3IFZlKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspbi5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG59ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7QWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gVmUucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtBZSh0aGlzLHQpLGU9UmUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7QWUodGhpcyx0KSxBZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IG49dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLG4pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtDZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBWZS5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe0NlKHRoaXMsdCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtDZSh0aGlzLHQpLENlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgbj10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUsbil9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtBZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtDZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgoKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fW1heEluZGV4KCl7RmUodGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQocixuKT50JiYodD10aGlzLmdldChyLG4pLGVbMF09cixlWzFdPW4pO3JldHVybiBlfW1pbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWluSW5kZXgoKXtGZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldChyLG4pPHQmJih0PXRoaXMuZ2V0KHIsbiksZVswXT1yLGVbMV09bik7cmV0dXJuIGV9bWF4Um93KHQpe2lmKEFlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe0FlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPmUmJihlPXRoaXMuZ2V0KHQsbiksclsxXT1uKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7QWUodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik8ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1heENvbHVtbih0KXtpZihDZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtDZSh0aGlzLHQpLEZlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KT5lJiYoZT10aGlzLmdldChuLHQpLHJbMF09bik7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPGUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllKz10aGlzLmdldCh0LHIpKnRoaXMuZ2V0KHQscik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQrPXRoaXMuZ2V0KGUsciksdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfWRvdCh0KXt6ZS5pc01hdHJpeCh0KSYmKHQ9dC50bzFEQXJyYXkoKSk7bGV0IGU9dGhpcy50bzFEQXJyYXkoKTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3JzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUiKTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0qdFtuXTtyZXR1cm4gcn1tbXVsKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5jb2x1bW5zLG89bmV3IFZlKGUsbikscz1uZXcgRmxvYXQ2NEFycmF5KHIpO2ZvcihsZXQgaT0wO2k8bjtpKyspe2ZvcihsZXQgZT0wO2U8cjtlKyspc1tlXT10LmdldChlLGkpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBuPTA7bjxyO24rKyllKz10aGlzLmdldCh0LG4pKnNbbl07by5zZXQodCxpLGUpfX1yZXR1cm4gb31zdHJhc3NlbjJ4Mih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXQuZ2V0KDAsMCksbz10aGlzLmdldCgwLDEpLHM9dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxoPXQuZ2V0KDEsMSksbD0ocithKSoobitoKSxjPShpK2EpKm4sZj1yKihzLWgpLG09YSoodS1uKSxnPShyK28pKmgscD1sK20tZysoby1hKSoodStoKSx3PWYrZyxkPWMrbSxiPWwtYytmKyhpLXIpKihuK3MpO3JldHVybiBlLnNldCgwLDAscCksZS5zZXQoMCwxLHcpLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEsYiksZX1zdHJhc3NlbjN4Myh0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSksbz10aGlzLmdldCgwLDIpLHM9dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGE9dGhpcy5nZXQoMiwwKSxoPXRoaXMuZ2V0KDIsMSksbD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSxwPXQuZ2V0KDEsMSksdz10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSxiPXQuZ2V0KDIsMSkseT10LmdldCgyLDIpLHY9KHItcykqKC1mK3ApLE09KC1yK3MraSkqKGMtZitwKSx4PShzK2kpKigtYytmKSxFPXIqYyxTPSgtcithK2gpKihjLW0rdyksaj0oLXIrYSkqKG0tdyksXz0oYStoKSooLWMrbSksQT0oLW8raCtsKSoocCtkLWIpLEM9KG8tbCkqKHAtYiksUj1vKmQsST0oaCtsKSooLWQrYiksaz0oLW8raSt1KSoodytkLXkpLE49KG8tdSkqKHcteSksTz0oaSt1KSooLWQreSksRj1FK1IrbipnLHo9KHIrbitvLXMtaS1oLWwpKnArTSt4K0UrQStSK0ksVD1FK1MrXysocituK28taS11LWEtaCkqdytSK2srTyxWPXYraSooLWMrZitnLXAtdy1kK3kpK00rRStSK2srTixQPXYrTSt4K0UrdSpiLHE9UitrK04rTytzKm0sJD1FK1MraitoKigtYyttK2ctcC13LWQrYikrQStDK1IsRD1BK0MrUitJK2EqZixVPUUrUytqK18rbCp5O3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLHopLGUuc2V0KDAsMixUKSxlLnNldCgxLDAsViksZS5zZXQoMSwxLFApLGUuc2V0KDEsMixxKSxlLnNldCgyLDAsJCksZS5zZXQoMiwxLEQpLGUuc2V0KDIsMixVKSxlfW1tdWxTdHJhc3Nlbih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxuPWUuY29sdW1ucyxvPXQucm93cyxzPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgbj10LnJvd3Msbz10LmNvbHVtbnM7aWYobj09PWUmJm89PT1yKXJldHVybiB0O3tsZXQgbj16ZS56ZXJvcyhlLHIpO3JldHVybiBuPW4uc2V0U3ViTWF0cml4KHQsMCwwKSxufX1uIT09byYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtufSBhbmQgJHtvfSB4ICR7c30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG8pLGE9TWF0aC5tYXgobixzKTtyZXR1cm4gZT1pKGUsdSxhKSxmdW5jdGlvbiB0KGUscixuLG8pe2lmKG48PTUxMnx8bzw9NTEyKXJldHVybiBlLm1tdWwocik7biUyPT0xJiZvJTI9PTE/KGU9aShlLG4rMSxvKzEpLHI9aShyLG4rMSxvKzEpKTpuJTI9PTE/KGU9aShlLG4rMSxvKSxyPWkocixuKzEsbykpOm8lMj09MSYmKGU9aShlLG4sbysxKSxyPWkocixuLG8rMSkpO2xldCBzPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxhPWUuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxoPXIuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxsPWUuc3ViTWF0cml4KDAscy0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxzLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChzLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSxwPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsdSxyLmNvbHVtbnMtMSksdz10KHplLmFkZChhLGcpLHplLmFkZChoLHApLHMsdSksZD10KHplLmFkZChmLGcpLGgscyx1KSxiPXQoYSx6ZS5zdWIoYyxwKSxzLHUpLHk9dChnLHplLnN1YihtLGgpLHMsdSksdj10KHplLmFkZChhLGwpLHAscyx1KSxNPXQoemUuc3ViKGYsYSksemUuYWRkKGgsYykscyx1KSx4PXQoemUuc3ViKGwsZyksemUuYWRkKG0scCkscyx1KSxFPXplLmFkZCh3LHkpO0Uuc3ViKHYpLEUuYWRkKHgpO2xldCBTPXplLmFkZChiLHYpLGo9emUuYWRkKGQseSksXz16ZS5zdWIodyxkKTtfLmFkZChiKSxfLmFkZChNKTtsZXQgQT16ZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChqLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KF8sRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxuLTEsMCxvLTEpfShlLHQ9aSh0LHUsYSksdSxhKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbz10aGlzLmdldFJvdyh0KTtvLmxlbmd0aD4wJiZ4ZShvLHttaW46ZSxtYXg6cixvdXRwdXQ6b30pLG4uc2V0Um93KHQsbyl9cmV0dXJuIG59c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBuPW5ldyBWZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG89dGhpcy5nZXRDb2x1bW4odCk7by5sZW5ndGgmJnhlKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRDb2x1bW4odCxvKX1yZXR1cm4gbn1mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxuPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLG4pLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxuPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLG4pLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bmV3IFZlKGUqbixyKm8pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPG47cisrKWZvcihsZXQgdT0wO3U8bzt1Kyspcy5zZXQobippK3IsbyplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gc31rcm9uZWNrZXJTdW0odCl7aWYodD1WZS5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLG49dGhpcy5rcm9uZWNrZXJQcm9kdWN0KFZlLmV5ZShyLHIpKSxvPVZlLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG4uYWRkKG8pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBWZSh0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIsbil7a2UodGhpcyx0LGUscixuKTtsZXQgbz1uZXcgVmUoZS10KzEsbi1yKzEpO2ZvcihsZXQgcz10O3M8PWU7cysrKWZvcihsZXQgZT1yO2U8PW47ZSsrKW8uc2V0KHMtdCxlLXIsdGhpcy5nZXQocyxlKSk7cmV0dXJuIG99c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZSh0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQobyxzLWUsdGhpcy5nZXQodFtvXSxzKSl9cmV0dXJuIG59c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZShyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQocy1lLG8sdGhpcy5nZXQocyx0W29dKSl9cmV0dXJuIG59c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1WZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO2tlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0aGlzLnNldChlK24scitvLHQuZ2V0KG4sbykpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpeyFmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyx0KSxmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyxlKTtsZXQgcj1uZXcgVmUodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgbz10W25dO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1lW3RdO3Iuc2V0KG4sdCx0aGlzLmdldChvLHMpKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtyXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbbl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bj10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylhPXQuZ2V0KGksZSktcltpXSxuKz1hLHUrPWEqYTtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlImNvbHVtbiI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG87aSsrKXtsZXQgbz0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylhPXQuZ2V0KGUsaSktcltpXSxvKz1hLHUrPWEqYTtlP3MucHVzaCgodS1vKm8vbikvKG4tMSkpOnMucHVzaCgodS1vKm8vbikvbil9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPW4qbztsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IG49MDtuPG87bisrKWE9dC5nZXQoZSxuKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KHIsZSksMikvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKyluKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChuKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIXllKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2Vbbl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKXIrPU1hdGgucG93KHQuZ2V0KG8sbiksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gamUodGhpcyx0KX19ZnVuY3Rpb24gVGUodCxlKXtyZXR1cm4gdC1lfXplLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHplLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBqZSh0aGlzKX0pLHplLnJhbmRvbT16ZS5yYW5kLHplLnJhbmRvbUludD16ZS5yYW5kSW50LHplLmRpYWdvbmFsPXplLmRpYWcsemUucHJvdG90eXBlLmRpYWdvbmFsPXplLnByb3RvdHlwZS5kaWFnLHplLmlkZW50aXR5PXplLmV5ZSx6ZS5wcm90b3R5cGUubmVnYXRlPXplLnByb3RvdHlwZS5uZWcsemUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9emUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgVmUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksVmUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCByPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PXIubGVuZ3RoKT9yWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbj0wO248dDtuKyspe2lmKHJbbl0ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShyW25dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBBZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksQWUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKFJlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtDZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQ7bisrKXJbbl09dGhpcy5kYXRhW2VdW25dO2ZvcihsZXQgbj10KzE7bjx0aGlzLmNvbHVtbnM7bisrKXJbbi0xXT10aGlzLmRhdGFbZV1bbl07dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLENlKHRoaXMsdCwhMCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgbj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbz0wO2Zvcig7bzx0O28rKyluW29dPXRoaXMuZGF0YVtyXVtvXTtmb3IobltvKytdPWVbcl07bzx0aGlzLmNvbHVtbnMrMTtvKyspbltvXT10aGlzLmRhdGFbcl1bby0xXTt0aGlzLmRhdGFbcl09bn1yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQpKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdC5nZXQoZSxyKSkpO3JldHVybiB0aGlzfX0oemUsVmUpO2NsYXNzIFBlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3MgcWUgZXh0ZW5kcyBQZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fWNsYXNzICRlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19ZnVuY3Rpb24gRGUodCxlKXtsZXQgcj0wO3JldHVybiBNYXRoLmFicyh0KT5NYXRoLmFicyhlKT8ocj1lL3QsTWF0aC5hYnModCkqTWF0aC5zcXJ0KDErcipyKSk6MCE9PWU/KHI9dC9lLE1hdGguYWJzKGUpKk1hdGguc3FydCgxK3IqcikpOjB9Y2xhc3MgVWV7Y29uc3RydWN0b3IodCxlPXt9KXtpZigodD0kZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOm89ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOnM9ITAsYXV0b1RyYW5zcG9zZTppPSExfT1lO2xldCB1LGE9Qm9vbGVhbihvKSxoPUJvb2xlYW4ocyksbD0hMTtpZihyPG4paWYoaSl7dT10LnRyYW5zcG9zZSgpLHI9dS5yb3dzLG49dS5jb2x1bW5zLGw9ITA7bGV0IGU9YTthPWgsaD1lfWVsc2UgdT10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2UgdT10LmNsb25lKCk7bGV0IGM9TWF0aC5taW4ocixuKSxmPU1hdGgubWluKHIrMSxuKSxtPW5ldyBGbG9hdDY0QXJyYXkoZiksZz1uZXcgVmUocixjKSxwPW5ldyBWZShuLG4pLHc9bmV3IEZsb2F0NjRBcnJheShuKSxkPW5ldyBGbG9hdDY0QXJyYXkociksYj1uZXcgRmxvYXQ2NEFycmF5KGYpO2ZvcihsZXQgdD0wO3Q8Zjt0KyspYlt0XT10O2xldCB5PU1hdGgubWluKHItMSxuKSx2PU1hdGgubWF4KDAsTWF0aC5taW4obi0yLHIpKSxNPU1hdGgubWF4KHksdik7Zm9yKGxldCB0PTA7dDxNO3QrKyl7aWYodDx5KXttW3RdPTA7Zm9yKGxldCBlPXQ7ZTxyO2UrKyltW3RdPURlKG1bdF0sdS5nZXQoZSx0KSk7aWYoMCE9PW1bdF0pe3UuZ2V0KHQsdCk8MCYmKG1bdF09LW1bdF0pO2ZvcihsZXQgZT10O2U8cjtlKyspdS5zZXQoZSx0LHUuZ2V0KGUsdCkvbVt0XSk7dS5zZXQodCx0LHUuZ2V0KHQsdCkrMSl9bVt0XT0tbVt0XX1mb3IobGV0IGU9dCsxO2U8bjtlKyspe2lmKHQ8eSYmMCE9PW1bdF0pe2xldCBuPTA7Zm9yKGxldCBvPXQ7bzxyO28rKyluKz11LmdldChvLHQpKnUuZ2V0KG8sZSk7bj0tbi91LmdldCh0LHQpO2ZvcihsZXQgbz10O288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbip1LmdldChvLHQpKX13W2VdPXUuZ2V0KHQsZSl9aWYoYSYmdDx5KWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LHUuZ2V0KGUsdCkpO2lmKHQ8dil7d1t0XT0wO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W3RdPURlKHdbdF0sd1tlXSk7aWYoMCE9PXdbdF0pe3dbdCsxXTwwJiYod1t0XT0wLXdbdF0pO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W2VdLz13W3RdO3dbdCsxXSs9MX1pZih3W3RdPS13W3RdLHQrMTxyJiYwIT09d1t0XSl7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWRbZV09MDtmb3IobGV0IGU9dCsxO2U8cjtlKyspZm9yKGxldCByPXQrMTtyPG47cisrKWRbZV0rPXdbcl0qdS5nZXQoZSxyKTtmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCBuPS13W2VdL3dbdCsxXTtmb3IobGV0IG89dCsxO288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbipkW29dKX19aWYoaClmb3IobGV0IGU9dCsxO2U8bjtlKyspcC5zZXQoZSx0LHdbZV0pfX1sZXQgeD1NYXRoLm1pbihuLHIrMSk7aWYoeTxuJiYobVt5XT11LmdldCh5LHkpKSxyPHgmJihtW3gtMV09MCksdisxPHgmJih3W3ZdPXUuZ2V0KHYseC0xKSksd1t4LTFdPTAsYSl7Zm9yKGxldCB0PXk7dDxjO3QrKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfWZvcihsZXQgdD15LTE7dD49MDt0LS0paWYoMCE9PW1bdF0pe2ZvcihsZXQgZT10KzE7ZTxjO2UrKyl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPWcuZ2V0KG8sdCkqZy5nZXQobyxlKTtuPS1uL2cuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKylnLnNldChvLGUsZy5nZXQobyxlKStuKmcuZ2V0KG8sdCkpfWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LC1nLmdldChlLHQpKTtnLnNldCh0LHQsMStnLmdldCh0LHQpKTtmb3IobGV0IGU9MDtlPHQtMTtlKyspZy5zZXQoZSx0LDApfWVsc2V7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfX1pZihoKWZvcihsZXQgdD1uLTE7dD49MDt0LS0pe2lmKHQ8diYmMCE9PXdbdF0pZm9yKGxldCBlPXQrMTtlPG47ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz10KzE7bzxuO28rKylyKz1wLmdldChvLHQpKnAuZ2V0KG8sZSk7cj0tci9wLmdldCh0KzEsdCk7Zm9yKGxldCBvPXQrMTtvPG47bysrKXAuc2V0KG8sZSxwLmdldChvLGUpK3IqcC5nZXQobyx0KSl9Zm9yKGxldCBlPTA7ZTxuO2UrKylwLnNldChlLHQsMCk7cC5zZXQodCx0LDEpfWxldCBFPXgtMSxTPU51bWJlci5FUFNJTE9OO2Zvcig7eD4wOyl7bGV0IHQsZTtmb3IodD14LTI7dD49LTEmJi0xIT09dDt0LS0pe2NvbnN0IGU9TnVtYmVyLk1JTl9WQUxVRStTKk1hdGguYWJzKG1bdF0rTWF0aC5hYnMobVt0KzFdKSk7aWYoTWF0aC5hYnMod1t0XSk8PWV8fE51bWJlci5pc05hTih3W3RdKSl7d1t0XT0wO2JyZWFrfX1pZih0PT09eC0yKWU9NDtlbHNle2xldCByO2ZvcihyPXgtMTtyPj10JiZyIT09dDtyLS0pe2xldCBlPShyIT09eD9NYXRoLmFicyh3W3JdKTowKSsociE9PXQrMT9NYXRoLmFicyh3W3ItMV0pOjApO2lmKE1hdGguYWJzKG1bcl0pPD1TKmUpe21bcl09MDticmVha319cj09PXQ/ZT0zOnI9PT14LTE/ZT0xOihlPTIsdD1yKX1zd2l0Y2godCsrLGUpe2Nhc2UgMTp7bGV0IGU9d1t4LTJdO3dbeC0yXT0wO2ZvcihsZXQgcj14LTI7cj49dDtyLS0pe2xldCBvPURlKG1bcl0sZSkscz1tW3JdL28saT1lL287aWYobVtyXT1vLHIhPT10JiYoZT0taSp3W3ItMV0sd1tyLTFdPXMqd1tyLTFdKSxoKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQscikraSpwLmdldCh0LHgtMSkscC5zZXQodCx4LTEsLWkqcC5nZXQodCxyKStzKnAuZ2V0KHQseC0xKSkscC5zZXQodCxyLG8pfWJyZWFrfWNhc2UgMjp7bGV0IGU9d1t0LTFdO3dbdC0xXT0wO2ZvcihsZXQgbj10O248eDtuKyspe2xldCBvPURlKG1bbl0sZSkscz1tW25dL28saT1lL287aWYobVtuXT1vLGU9LWkqd1tuXSx3W25dPXMqd1tuXSxhKWZvcihsZXQgZT0wO2U8cjtlKyspbz1zKmcuZ2V0KGUsbikraSpnLmdldChlLHQtMSksZy5zZXQoZSx0LTEsLWkqZy5nZXQoZSxuKStzKmcuZ2V0KGUsdC0xKSksZy5zZXQoZSxuLG8pfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyhtW3gtMV0pLE1hdGguYWJzKG1beC0yXSksTWF0aC5hYnMod1t4LTJdKSxNYXRoLmFicyhtW3RdKSxNYXRoLmFicyh3W3RdKSksbz1tW3gtMV0vZSxzPW1beC0yXS9lLGk9d1t4LTJdL2UsdT1tW3RdL2UsbD13W3RdL2UsYz0oKHMrbykqKHMtbykraSppKS8yLGY9byppKihvKmkpO2xldCBkPTA7MD09PWMmJjA9PT1mfHwoZD1jPDA/MC1NYXRoLnNxcnQoYypjK2YpOk1hdGguc3FydChjKmMrZiksZD1mLyhjK2QpKTtsZXQgYj0odStvKSoodS1vKStkLHk9dSpsO2ZvcihsZXQgZT10O2U8eC0xO2UrKyl7bGV0IG89RGUoYix5KTswPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSk7bGV0IHM9Yi9vLGk9eS9vO2lmKGUhPT10JiYod1tlLTFdPW8pLGI9cyptW2VdK2kqd1tlXSx3W2VdPXMqd1tlXS1pKm1bZV0seT1pKm1bZSsxXSxtW2UrMV09cyptW2UrMV0saClmb3IobGV0IHQ9MDt0PG47dCsrKW89cypwLmdldCh0LGUpK2kqcC5nZXQodCxlKzEpLHAuc2V0KHQsZSsxLC1pKnAuZ2V0KHQsZSkrcypwLmdldCh0LGUrMSkpLHAuc2V0KHQsZSxvKTtpZihvPURlKGIseSksMD09PW8mJihvPU51bWJlci5NSU5fVkFMVUUpLHM9Yi9vLGk9eS9vLG1bZV09byxiPXMqd1tlXStpKm1bZSsxXSxtW2UrMV09LWkqd1tlXStzKm1bZSsxXSx5PWkqd1tlKzFdLHdbZSsxXT1zKndbZSsxXSxhJiZlPHItMSlmb3IobGV0IHQ9MDt0PHI7dCsrKW89cypnLmdldCh0LGUpK2kqZy5nZXQodCxlKzEpLGcuc2V0KHQsZSsxLC1pKmcuZ2V0KHQsZSkrcypnLmdldCh0LGUrMSkpLGcuc2V0KHQsZSxvKX13W3gtMl09YjticmVha31jYXNlIDQ6aWYobVt0XTw9MCYmKG1bdF09bVt0XTwwPy1tW3RdOjAsaCkpZm9yKGxldCBlPTA7ZTw9RTtlKyspcC5zZXQoZSx0LC1wLmdldChlLHQpKTtmb3IoO3Q8RSYmIShtW3RdPj1tW3QrMV0pOyl7bGV0IGU9bVt0XTtpZihtW3RdPW1bdCsxXSxtW3QrMV09ZSxoJiZ0PG4tMSlmb3IobGV0IHI9MDtyPG47cisrKWU9cC5nZXQocix0KzEpLHAuc2V0KHIsdCsxLHAuZ2V0KHIsdCkpLHAuc2V0KHIsdCxlKTtpZihhJiZ0PHItMSlmb3IobGV0IG49MDtuPHI7bisrKWU9Zy5nZXQobix0KzEpLGcuc2V0KG4sdCsxLGcuZ2V0KG4sdCkpLGcuc2V0KG4sdCxlKTt0Kyt9eC0tfX1pZihsKXtsZXQgdD1wO3A9ZyxnPXR9dGhpcy5tPXIsdGhpcy5uPW4sdGhpcy5zPW0sdGhpcy5VPWcsdGhpcy5WPXB9c29sdmUodCl7bGV0IGU9dCxyPXRoaXMudGhyZXNob2xkLG49dGhpcy5zLmxlbmd0aCxvPVZlLnplcm9zKG4sbik7Zm9yKGxldCB0PTA7dDxuO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1yP28uc2V0KHQsdCwwKTpvLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBzPXRoaXMuVSxpPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMsdT1pLm1tdWwobyksYT1pLnJvd3MsaD1zLnJvd3MsbD1WZS56ZXJvcyhhLGgpO2ZvcihsZXQgdD0wO3Q8YTt0KyspZm9yKGxldCBlPTA7ZTxoO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89MDtvPG47bysrKXIrPXUuZ2V0KHQsbykqcy5nZXQoZSxvKTtsLnNldCh0LGUscil9cmV0dXJuIGwubW11bChlKX1zb2x2ZUZvckRpYWdvbmFsKHQpe3JldHVybiB0aGlzLnNvbHZlKFZlLmRpYWcodCkpfWludmVyc2UoKXtsZXQgdD10aGlzLlYsZT10aGlzLnRocmVzaG9sZCxyPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBWZShyLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylNYXRoLmFicyh0aGlzLnNbcl0pPmUmJm8uc2V0KHMscix0LmdldChzLHIpL3RoaXMuc1tyXSk7bGV0IHM9dGhpcy5VLGk9cy5yb3dzLHU9cy5jb2x1bW5zLGE9bmV3IFZlKHIsaSk7Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dTtuKyspcis9by5nZXQodCxuKSpzLmdldChlLG4pO2Euc2V0KHQsZSxyKX1yZXR1cm4gYX1nZXQgY29uZGl0aW9uKCl7cmV0dXJuIHRoaXMuc1swXS90aGlzLnNbTWF0aC5taW4odGhpcy5tLHRoaXMubiktMV19Z2V0IG5vcm0yKCl7cmV0dXJuIHRoaXMuc1swXX1nZXQgcmFuaygpe2xldCB0PU1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXSpOdW1iZXIuRVBTSUxPTixlPTAscj10aGlzLnM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87bisrKXJbbl0+dCYmZSsrO3JldHVybiBlfWdldCBkaWFnb25hbCgpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucyl9Z2V0IHRocmVzaG9sZCgpe3JldHVybiBOdW1iZXIuRVBTSUxPTi8yKk1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXX1nZXQgbGVmdFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0IHJpZ2h0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtyZXR1cm4gVmUuZGlhZyh0aGlzLnMpfX1jbGFzcyBMZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD0kZS5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgbixvLHM9dC5jb2x1bW5zLGk9bmV3IFZlKHMscyksdT1uZXcgRmxvYXQ2NEFycmF5KHMpLGE9bmV3IEZsb2F0NjRBcnJheShzKSxoPXQsbD0hMTtpZihsPSEhcnx8dC5pc1N5bW1ldHJpYygpLGwpe2ZvcihuPTA7bjxzO24rKylmb3Iobz0wO288cztvKyspaS5zZXQobixvLGguZ2V0KG4sbykpOyFmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGgsbCxjO2ZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsaD0wO2g8dTtoKyspYys9TWF0aC5hYnMocltoXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGE9MDthPHU7YSsrKXJbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKSxuLnNldChhLHUsMCk7ZWxzZXtmb3IoaD0wO2g8dTtoKyspcltoXS89YyxpKz1yW2hdKnJbaF07Zm9yKG89clt1LTFdLHM9TWF0aC5zcXJ0KGkpLG8+MCYmKHM9LXMpLGVbdV09YypzLGktPW8qcyxyW3UtMV09by1zLGE9MDthPHU7YSsrKWVbYV09MDtmb3IoYT0wO2E8dTthKyspe2ZvcihvPXJbYV0sbi5zZXQoYSx1LG8pLHM9ZVthXStuLmdldChhLGEpKm8saD1hKzE7aDw9dS0xO2grKylzKz1uLmdldChoLGEpKnJbaF0sZVtoXSs9bi5nZXQoaCxhKSpvO2VbYV09c31mb3Iobz0wLGE9MDthPHU7YSsrKWVbYV0vPWksbys9ZVthXSpyW2FdO2ZvcihsPW8vKGkraSksYT0wO2E8dTthKyspZVthXS09bCpyW2FdO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxzPWVbYV0saD1hO2g8PXUtMTtoKyspbi5zZXQoaCxhLG4uZ2V0KGgsYSktKG8qZVtoXStzKnJbaF0pKTtyW2FdPW4uZ2V0KHUtMSxhKSxuLnNldCh1LGEsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYobi5zZXQodC0xLHUsbi5nZXQodSx1KSksbi5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IoaD0wO2g8PXU7aCsrKXJbaF09bi5nZXQoaCx1KzEpL2k7Zm9yKGE9MDthPD11O2ErKyl7Zm9yKHM9MCxoPTA7aDw9dTtoKyspcys9bi5nZXQoaCx1KzEpKm4uZ2V0KGgsYSk7Zm9yKGg9MDtoPD11O2grKyluLnNldChoLGEsbi5nZXQoaCxhKS1zKnJbaF0pfX1mb3IoaD0wO2g8PXU7aCsrKW4uc2V0KGgsdSsxLDApfWZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKSxuLnNldCh0LTEsYSwwKTtuLnNldCh0LTEsdC0xLDEpLGVbMF09MH0ocyxhLHUsaSksZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxoLGwsYyxmLG0sZyxwLHcsZCxiLHk7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCB2PTAsTT0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGg9MDtoPHQ7aCsrKXtmb3IoTT1NYXRoLm1heChNLE1hdGguYWJzKHJbaF0pK01hdGguYWJzKGVbaF0pKSxsPWg7bDx0JiYhKE1hdGguYWJzKGVbbF0pPD14Kk0pOylsKys7aWYobD5oKWRve2ZvcihvPXJbaF0sYz0ocltoKzFdLW8pLygyKmVbaF0pLGY9RGUoYywxKSxjPDAmJihmPS1mKSxyW2hdPWVbaF0vKGMrZikscltoKzFdPWVbaF0qKGMrZiksbT1yW2grMV0scz1vLXJbaF0saT1oKzI7aTx0O2krKylyW2ldLT1zO2Zvcih2Kz1zLGM9cltsXSxnPTEscD1nLHc9ZyxkPWVbaCsxXSxiPTAseT0wLGk9bC0xO2k+PWg7aS0tKWZvcih3PXAscD1nLHk9YixvPWcqZVtpXSxzPWcqYyxmPURlKGMsZVtpXSksZVtpKzFdPWIqZixiPWVbaV0vZixnPWMvZixjPWcqcltpXS1iKm8scltpKzFdPXMrYiooZypvK2IqcltpXSksYT0wO2E8dDthKyspcz1uLmdldChhLGkrMSksbi5zZXQoYSxpKzEsYipuLmdldChhLGkpK2cqcyksbi5zZXQoYSxpLGcqbi5nZXQoYSxpKS1iKnMpO2M9LWIqeSp3KmQqZVtoXS9tLGVbaF09YipjLHJbaF09ZypjfXdoaWxlKE1hdGguYWJzKGVbaF0pPngqTSk7cltoXT1yW2hdK3YsZVtoXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoYT1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGE9dSxjPXJbdV0pO2lmKGEhPT1pKWZvcihyW2FdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9bi5nZXQodSxpKSxuLnNldCh1LGksbi5nZXQodSxhKSksbi5zZXQodSxhLGMpfX0ocyxhLHUsaSl9ZWxzZXtsZXQgdD1uZXcgVmUocyxzKSxlPW5ldyBGbG9hdDY0QXJyYXkocyk7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKyl0LnNldChuLG8saC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsaCxsLGM9MCxmPXQtMTtmb3IoaD1jKzE7aDw9Zi0xO2grKyl7Zm9yKGw9MCx1PWg7dTw9Zjt1KyspbCs9TWF0aC5hYnMoZS5nZXQodSxoLTEpKTtpZigwIT09bCl7Zm9yKGk9MCx1PWY7dT49aDt1LS0pclt1XT1lLmdldCh1LGgtMSkvbCxpKz1yW3VdKnJbdV07Zm9yKHM9TWF0aC5zcXJ0KGkpLHJbaF0+MCYmKHM9LXMpLGktPXJbaF0qcyxyW2hdPXJbaF0tcyxhPWg7YTx0O2ErKyl7Zm9yKG89MCx1PWY7dT49aDt1LS0pbys9clt1XSplLmdldCh1LGEpO2ZvcihvLz1pLHU9aDt1PD1mO3UrKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihvPTAsYT1mO2E+PWg7YS0tKW8rPXJbYV0qZS5nZXQodSxhKTtmb3Ioby89aSxhPWg7YTw9ZjthKyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbypyW2FdKX1yW2hdPWwqcltoXSxlLnNldChoLGgtMSxsKnMpfX1mb3IodT0wO3U8dDt1KyspZm9yKGE9MDthPHQ7YSsrKW4uc2V0KHUsYSx1PT09YT8xOjApO2ZvcihoPWYtMTtoPj1jKzE7aC0tKWlmKDAhPT1lLmdldChoLGgtMSkpe2Zvcih1PWgrMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsaC0xKTtmb3IoYT1oO2E8PWY7YSsrKXtmb3Iocz0wLHU9aDt1PD1mO3UrKylzKz1yW3VdKm4uZ2V0KHUsYSk7Zm9yKHM9cy9yW2hdL2UuZ2V0KGgsaC0xKSx1PWg7dTw9Zjt1Kyspbi5zZXQodSxhLG4uZ2V0KHUsYSkrcypyW3VdKX19fShzLHQsZSxpKSxmdW5jdGlvbih0LGUscixuLG8pe2xldCBzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseSx2PXQtMSxNPTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsaj0wLF89MCxBPTAsQz0wLFI9MCxJPTAsaz0wO2ZvcihzPTA7czx0O3MrKylmb3IoKHM8TXx8cz54KSYmKHJbc109by5nZXQocyxzKSxlW3NdPTApLGk9TWF0aC5tYXgocy0xLDApO2k8dDtpKyspais9TWF0aC5hYnMoby5nZXQocyxpKSk7Zm9yKDt2Pj1NOyl7Zm9yKGE9djthPk0mJihSPU1hdGguYWJzKG8uZ2V0KGEtMSxhLTEpKStNYXRoLmFicyhvLmdldChhLGEpKSwwPT09UiYmKFI9aiksIShNYXRoLmFicyhvLmdldChhLGEtMSkpPEUqUikpOylhLS07aWYoYT09PXYpby5zZXQodix2LG8uZ2V0KHYsdikrUyksclt2XT1vLmdldCh2LHYpLGVbdl09MCx2LS0saz0wO2Vsc2UgaWYoYT09PXYtMSl7aWYoYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpLF89KG8uZ2V0KHYtMSx2LTEpLW8uZ2V0KHYsdikpLzIsQT1fKl8rYyxJPU1hdGguc3FydChNYXRoLmFicyhBKSksby5zZXQodix2LG8uZ2V0KHYsdikrUyksby5zZXQodi0xLHYtMSxvLmdldCh2LTEsdi0xKStTKSxmPW8uZ2V0KHYsdiksQT49MCl7Zm9yKEk9Xz49MD9fK0k6Xy1JLHJbdi0xXT1mK0ksclt2XT1yW3YtMV0sMCE9PUkmJihyW3ZdPWYtYy9JKSxlW3YtMV09MCxlW3ZdPTAsZj1vLmdldCh2LHYtMSksUj1NYXRoLmFicyhmKStNYXRoLmFicyhJKSxfPWYvUixBPUkvUixDPU1hdGguc3FydChfKl8rQSpBKSxfLz1DLEEvPUMsaT12LTE7aTx0O2krKylJPW8uZ2V0KHYtMSxpKSxvLnNldCh2LTEsaSxBKkkrXypvLmdldCh2LGkpKSxvLnNldCh2LGksQSpvLmdldCh2LGkpLV8qSSk7Zm9yKHM9MDtzPD12O3MrKylJPW8uZ2V0KHMsdi0xKSxvLnNldChzLHYtMSxBKkkrXypvLmdldChzLHYpKSxvLnNldChzLHYsQSpvLmdldChzLHYpLV8qSSk7Zm9yKHM9TTtzPD14O3MrKylJPW4uZ2V0KHMsdi0xKSxuLnNldChzLHYtMSxBKkkrXypuLmdldChzLHYpKSxuLnNldChzLHYsQSpuLmdldChzLHYpLV8qSSl9ZWxzZSByW3YtMV09ZitfLHJbdl09ZitfLGVbdi0xXT1JLGVbdl09LUk7di09MixrPTB9ZWxzZXtpZihmPW8uZ2V0KHYsdiksbT0wLGM9MCxhPHYmJihtPW8uZ2V0KHYtMSx2LTEpLGM9by5nZXQodix2LTEpKm8uZ2V0KHYtMSx2KSksMTA9PT1rKXtmb3IoUys9ZixzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktZik7Uj1NYXRoLmFicyhvLmdldCh2LHYtMSkpK01hdGguYWJzKG8uZ2V0KHYtMSx2LTIpKSxmPW09Ljc1KlIsYz0tLjQzNzUqUipSfWlmKDMwPT09ayYmKFI9KG0tZikvMixSPVIqUitjLFI+MCkpe2ZvcihSPU1hdGguc3FydChSKSxtPGYmJihSPS1SKSxSPWYtYy8oKG0tZikvMitSKSxzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktUik7Uys9UixmPW09Yz0uOTY0fWZvcihrKz0xLGg9di0yO2g+PWEmJihJPW8uZ2V0KGgsaCksQz1mLUksUj1tLUksXz0oQypSLWMpL28uZ2V0KGgrMSxoKStvLmdldChoLGgrMSksQT1vLmdldChoKzEsaCsxKS1JLUMtUixDPW8uZ2V0KGgrMixoKzEpLFI9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksXy89UixBLz1SLEMvPVIsaCE9PWEpJiYhKE1hdGguYWJzKG8uZ2V0KGgsaC0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKEMpKTxFKihNYXRoLmFicyhfKSooTWF0aC5hYnMoby5nZXQoaC0xLGgtMSkpK01hdGguYWJzKEkpK01hdGguYWJzKG8uZ2V0KGgrMSxoKzEpKSkpKTspaC0tO2ZvcihzPWgrMjtzPD12O3MrKylvLnNldChzLHMtMiwwKSxzPmgrMiYmby5zZXQocyxzLTMsMCk7Zm9yKHU9aDt1PD12LTEmJihiPXUhPT12LTEsdSE9PWgmJihfPW8uZ2V0KHUsdS0xKSxBPW8uZ2V0KHUrMSx1LTEpLEM9Yj9vLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksMCE9PWYmJihfLz1mLEEvPWYsQy89ZikpLDAhPT1mKTt1KyspaWYoUj1NYXRoLnNxcnQoXypfK0EqQStDKkMpLF88MCYmKFI9LVIpLDAhPT1SKXtmb3IodSE9PWg/by5zZXQodSx1LTEsLVIqZik6YSE9PWgmJm8uc2V0KHUsdS0xLC1vLmdldCh1LHUtMSkpLF8rPVIsZj1fL1IsbT1BL1IsST1DL1IsQS89XyxDLz1fLGk9dTtpPHQ7aSsrKV89by5nZXQodSxpKStBKm8uZ2V0KHUrMSxpKSxiJiYoXys9QypvLmdldCh1KzIsaSksby5zZXQodSsyLGksby5nZXQodSsyLGkpLV8qSSkpLG8uc2V0KHUsaSxvLmdldCh1LGkpLV8qZiksby5zZXQodSsxLGksby5nZXQodSsxLGkpLV8qbSk7Zm9yKHM9MDtzPD1NYXRoLm1pbih2LHUrMyk7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1JKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypDKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSk7Zm9yKHM9TTtzPD14O3MrKylfPWYqbi5nZXQocyx1KSttKm4uZ2V0KHMsdSsxKSxiJiYoXys9SSpuLmdldChzLHUrMiksbi5zZXQocyx1KzIsbi5nZXQocyx1KzIpLV8qQykpLG4uc2V0KHMsdSxuLmdldChzLHUpLV8pLG4uc2V0KHMsdSsxLG4uZ2V0KHMsdSsxKS1fKkEpfX19aWYoMD09PWopcmV0dXJuO2Zvcih2PXQtMTt2Pj0wO3YtLSlpZihfPXJbdl0sQT1lW3ZdLDA9PT1BKWZvcihhPXYsby5zZXQodix2LDEpLHM9di0xO3M+PTA7cy0tKXtmb3IoYz1vLmdldChzLHMpLV8sQz0wLGk9YTtpPD12O2krKylDKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoZVtzXTwwKUk9YyxSPUM7ZWxzZSBpZihhPXMsMD09PWVbc10/by5zZXQocyx2LDAhPT1jPy1DL2M6LUMvKEUqaikpOihmPW8uZ2V0KHMscysxKSxtPW8uZ2V0KHMrMSxzKSxBPShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXSxsPShmKlItSSpDKS9BLG8uc2V0KHMsdixsKSxvLnNldChzKzEsdixNYXRoLmFicyhmKT5NYXRoLmFicyhJKT8oLUMtYypsKS9mOigtUi1tKmwpL0kpKSxsPU1hdGguYWJzKG8uZ2V0KHMsdikpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYsby5nZXQoaSx2KS9sKX1lbHNlIGlmKEE8MClmb3IoYT12LTEsTWF0aC5hYnMoby5nZXQodix2LTEpKT5NYXRoLmFicyhvLmdldCh2LTEsdikpPyhvLnNldCh2LTEsdi0xLEEvby5nZXQodix2LTEpKSxvLnNldCh2LTEsdiwtKG8uZ2V0KHYsdiktXykvby5nZXQodix2LTEpKSk6KHk9QmUoMCwtby5nZXQodi0xLHYpLG8uZ2V0KHYtMSx2LTEpLV8sQSksby5zZXQodi0xLHYtMSx5WzBdKSxvLnNldCh2LTEsdix5WzFdKSksby5zZXQodix2LTEsMCksby5zZXQodix2LDEpLHM9di0yO3M+PTA7cy0tKXtmb3IoZz0wLHA9MCxpPWE7aTw9djtpKyspZys9by5nZXQocyxpKSpvLmdldChpLHYtMSkscCs9by5nZXQocyxpKSpvLmdldChpLHYpO2lmKGM9by5nZXQocyxzKS1fLGVbc108MClJPWMsQz1nLFI9cDtlbHNlIGlmKGE9cywwPT09ZVtzXT8oeT1CZSgtZywtcCxjLEEpLG8uc2V0KHMsdi0xLHlbMF0pLG8uc2V0KHMsdix5WzFdKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLHc9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLUEqQSxkPTIqKHJbc10tXykqQSwwPT09dyYmMD09PWQmJih3PUUqaiooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoSSkpKSx5PUJlKGYqQy1JKmcrQSpwLGYqUi1JKnAtQSpnLHcsZCksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEkpK01hdGguYWJzKEEpPyhvLnNldChzKzEsdi0xLCgtZy1jKm8uZ2V0KHMsdi0xKStBKm8uZ2V0KHMsdikpL2YpLG8uc2V0KHMrMSx2LCgtcC1jKm8uZ2V0KHMsdiktQSpvLmdldChzLHYtMSkpL2YpKTooeT1CZSgtQy1tKm8uZ2V0KHMsdi0xKSwtUi1tKm8uZ2V0KHMsdiksSSxBKSxvLnNldChzKzEsdi0xLHlbMF0pLG8uc2V0KHMrMSx2LHlbMV0pKSksbD1NYXRoLm1heChNYXRoLmFicyhvLmdldChzLHYtMSkpLE1hdGguYWJzKG8uZ2V0KHMsdikpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspby5zZXQoaSx2LTEsby5nZXQoaSx2LTEpL2wpLG8uc2V0KGksdixvLmdldChpLHYpL2wpfWZvcihzPTA7czx0O3MrKylpZihzPE18fHM+eClmb3IoaT1zO2k8dDtpKyspbi5zZXQocyxpLG8uZ2V0KHMsaSkpO2ZvcihpPXQtMTtpPj1NO2ktLSlmb3Iocz1NO3M8PXg7cysrKXtmb3IoST0wLHU9TTt1PD1NYXRoLm1pbihpLHgpO3UrKylJKz1uLmdldChzLHUpKm8uZ2V0KHUsaSk7bi5zZXQocyxpLEkpfX0ocyxhLHUsaSx0KX10aGlzLm49cyx0aGlzLmU9YSx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixuPXRoaXMuZSxvPXRoaXMuZCxzPW5ldyBWZShyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKXMuc2V0KHQsZSwwKTtzLnNldCh0LHQsb1t0XSksblt0XT4wP3Muc2V0KHQsdCsxLG5bdF0pOm5bdF08MCYmcy5zZXQodCx0LTEsblt0XSl9cmV0dXJuIHN9fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe2xldCBvLHM7cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKG4pPyhvPW4vcixzPXIrbypuLFsodCtvKmUpL3MsKGUtbyp0KS9zXSk6KG89ci9uLHM9bitvKnIsWyhvKnQrZSkvcywobyplLXQpL3NdKX1jbGFzcyBHZXtjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9JGUuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpuPSExLG1heEl0ZXJhdGlvbnM6bz0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpzPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9eWUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9WZS5jb2x1bW5WZWN0b3Iocik6JGUuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxoLGwsYz0xO2ZvcihsZXQgZT0wO2U8byYmYz5zO2UrKyloPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSx1PXQubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbj10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxvPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMoby5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1uLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1vfWVsc2UgdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW4/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGgudHJhbnNwb3NlKCkpKX19Y2xhc3MgS2V7Y29uc3RydWN0b3IodCxlPXt9KXtpZighMD09PXQpe2NvbnN0IHQ9ZTtyZXR1cm4gdGhpcy5jZW50ZXI9dC5jZW50ZXIsdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMubWVhbnM9dC5tZWFucyx0aGlzLnN0ZGV2cz10LnN0ZGV2cyx0aGlzLlU9VmUuY2hlY2tNYXRyaXgodC5VKSx0aGlzLlM9dC5TLHRoaXMuUj10LlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9dC5leGNsdWRlZEZlYXR1cmVzfHxbXSl9dD1uZXcgVmUodCk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4OnI9ITEsbWV0aG9kOm49IlNWRCIsbkNvbXBOSVBBTFM6bz0yLGNlbnRlcjpzPSEwLHNjYWxlOmk9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOnU9ITF9PWU7aWYodGhpcy5jZW50ZXI9cyx0aGlzLnNjYWxlPWksdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLHIpdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdCh0LHUpLG4pe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IGU9bmV3IHFlKHQpLm1tdWwodCkuZGl2KHQucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgoZSk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKHQsbyk7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCBlPW5ldyBVZSh0LHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT1lLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IHI9ZS5kaWFnb25hbCxuPVtdO2Zvcihjb25zdCBlIG9mIHIpbi5wdXNoKGUqZS8odC5yb3dzLTEpKTt0aGlzLlM9bjticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7bn1gKX19c3RhdGljIGxvYWQodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0Lm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09dC5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke3QubmFtZX1gKTtyZXR1cm4gbmV3IEtlKCEwLHQpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2lmKHQ9bmV3IFZlKHQpLHRoaXMuY2VudGVyJiYodC5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgZSBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpdC5yZW1vdmVDb2x1bW4oZSk7dC5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPXQubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9VmUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlMubWFwKChlPT5lL3QpKX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG49dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKylpZigwPT09bltyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG4uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW4sdC5kaXZSb3dWZWN0b3Iobil9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IExlKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgVmUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBHZShyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19ZnVuY3Rpb24gV2UodCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwic2NhbGUiKTtmZShyKXx8KHI9ITApO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7Y2Uobil8fChuPTIpO2xldCBvPWxlKEN0KHQsMCxbXSkpO2lmKDA9PT1vKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG4+byl0aHJvdyBuZXcgRXJyb3IoIm5Db21wTklQQUxTIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uIG9mIGRhdGEiKTtsZXQgcz1uZXcgS2UodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6bn0pLGk9cy5wcmVkaWN0KHQpO3JldHVybiBzLmludmVydChpKS50b0pTT04oKX12YXIgWGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG4mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH07dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9T2JqZWN0KGUpLGk9bihlKSx1PWkubGVuZ3RoO3UtLTspe3ZhciBhPWlbdD91Oisrb107aWYoITE9PT1yKHNbYV0sYSxzKSlicmVha31yZXR1cm4gZX19KCk7dmFyIFllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49QXJyYXkodCk7KytyPHQ7KW5bcl09ZShyKTtyZXR1cm4gbn07dmFyIFplPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dyh0KX0sSGU9T2JqZWN0LnByb3RvdHlwZSxRZT1IZS5oYXNPd25Qcm9wZXJ0eSx0cj1IZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxlcj1aZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1plOmZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZRZS5jYWxsKHQsImNhbGxlZSIpJiYhdHIuY2FsbCh0LCJjYWxsZWUiKX07dmFyIHJyPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG5yPW4oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbj1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxvPW4mJm4uZXhwb3J0cz09PXI/aS5CdWZmZXI6dm9pZCAwLHM9KG8/by5pc0J1ZmZlcjp2b2lkIDApfHxycjt0LmV4cG9ydHM9c30pKSxvcj0vXig/OjB8WzEtOV1cZCopJC87dmFyIHNyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJm9yLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX0saXI9e307aXJbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1pclsiW29iamVjdCBJbnQ4QXJyYXldIl09aXJbIltvYmplY3QgSW50MTZBcnJheV0iXT1pclsiW29iamVjdCBJbnQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09aXJbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aXJbIltvYmplY3QgVWludDE2QXJyYXldIl09aXJbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsaXJbIltvYmplY3QgQXJndW1lbnRzXSJdPWlyWyJbb2JqZWN0IEFycmF5XSJdPWlyWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPWlyWyJbb2JqZWN0IEJvb2xlYW5dIl09aXJbIltvYmplY3QgRGF0YVZpZXddIl09aXJbIltvYmplY3QgRGF0ZV0iXT1pclsiW29iamVjdCBFcnJvcl0iXT1pclsiW29iamVjdCBGdW5jdGlvbl0iXT1pclsiW29iamVjdCBNYXBdIl09aXJbIltvYmplY3QgTnVtYmVyXSJdPWlyWyJbb2JqZWN0IE9iamVjdF0iXT1pclsiW29iamVjdCBSZWdFeHBdIl09aXJbIltvYmplY3QgU2V0XSJdPWlyWyJbb2JqZWN0IFN0cmluZ10iXT1pclsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciB1cj1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmR3QodC5sZW5ndGgpJiYhIWlyW3codCldfTt2YXIgYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0saHI9bigoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxuPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9biYmbi5leHBvcnRzPT09ciYmby5wcm9jZXNzLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9biYmbi5yZXF1aXJlJiZuLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8cyYmcy5iaW5kaW5nJiZzLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1pfSkpLGxyPWhyJiZoci5pc1R5cGVkQXJyYXksY3I9bHI/YXIobHIpOnVyLGZyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIG1yPWZ1bmN0aW9uKGUscil7dmFyIG49dChlKSxvPSFuJiZlcihlKSxzPSFuJiYhbyYmbnIoZSksaT0hbiYmIW8mJiFzJiZjcihlKSx1PW58fG98fHN8fGksYT11P1llKGUubGVuZ3RoLFN0cmluZyk6W10saD1hLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIWZyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHNyKGwsaCkpfHxhLnB1c2gobCk7cmV0dXJuIGF9O3ZhciBncj1mdW5jdGlvbih0KXtyZXR1cm4gS3QodCk/bXIodCk6T3QodCl9O3ZhciBwcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG4pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUt0KHIpKXJldHVybiB0KHIsbik7Zm9yKHZhciBvPXIubGVuZ3RoLHM9ZT9vOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bykmJiExIT09bihpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZKZSh0LGUsZ3IpfSkpO3ZhciB3cj1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIGRyPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6d3J9O3ZhciBicj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP1hlOnByKShlLGRyKHIpKX07dmFyIHlyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgb3QsdGhpcy5zaXplPTB9O3ZhciB2cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUscn07dmFyIE1yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIHhyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIEVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2Ygb3Qpe3ZhciBuPXIuX19kYXRhX187aWYoIXN0fHxuLmxlbmd0aDwxOTkpcmV0dXJuIG4ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBndChuKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9O2Z1bmN0aW9uIFNyKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IG90KHQpO3RoaXMuc2l6ZT1lLnNpemV9U3IucHJvdG90eXBlLmNsZWFyPXlyLFNyLnByb3RvdHlwZS5kZWxldGU9dnIsU3IucHJvdG90eXBlLmdldD1NcixTci5wcm90b3R5cGUuaGFzPXhyLFNyLnByb3RvdHlwZS5zZXQ9RXI7dmFyIGpyPVNyO3ZhciBfcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBBcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIENyKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8cjspdGhpcy5hZGQodFtlXSl9Q3IucHJvdG90eXBlLmFkZD1Dci5wcm90b3R5cGUucHVzaD1fcixDci5wcm90b3R5cGUuaGFzPUFyO3ZhciBScj1Dcjt2YXIgSXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG47KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIga3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBOcj1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9dC5sZW5ndGgsYT1lLmxlbmd0aDtpZih1IT1hJiYhKGkmJmE+dSkpcmV0dXJuITE7dmFyIGg9cy5nZXQodCksbD1zLmdldChlKTtpZihoJiZsKXJldHVybiBoPT1lJiZsPT10O3ZhciBjPS0xLGY9ITAsbT0yJnI/bmV3IFJyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobil2YXIgdz1pP24ocCxnLGMsZSx0LHMpOm4oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighSXIoZSwoZnVuY3Rpb24odCxlKXtpZigha3IobSxlKSYmKGc9PT10fHxvKGcsdCxyLG4scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFvKGcscCxyLG4scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfSxPcj1pLlVpbnQ4QXJyYXk7dmFyIEZyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3JbKytlXT1bbix0XX0pKSxyfTt2YXIgenI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9LFRyPXU/dS5wcm90b3R5cGU6dm9pZCAwLFZyPVRyP1RyLnZhbHVlT2Y6dm9pZCAwO3ZhciBQcj1mdW5jdGlvbih0LGUscixuLG8scyxpKXtzd2l0Y2gocil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgT3IodCksbmV3IE9yKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gWSgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT1GcjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZuO2lmKHV8fCh1PXpyKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGg9aS5nZXQodCk7aWYoaClyZXR1cm4gaD09ZTtufD0yLGkuc2V0KHQsZSk7dmFyIGw9TnIodSh0KSx1KGUpLG4sbyxzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihWcilyZXR1cm4gVnIuY2FsbCh0KT09VnIuY2FsbChlKX1yZXR1cm4hMX07dmFyIHFyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49ZS5sZW5ndGgsbz10Lmxlbmd0aDsrK3I8bjspdFtvK3JdPWVbcl07cmV0dXJuIHR9O3ZhciAkcj1mdW5jdGlvbihlLHIsbil7dmFyIG89cihlKTtyZXR1cm4gdChlKT9vOnFyKG8sbihlKSl9O3ZhciBEcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPTAscz1bXTsrK3I8bjspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW28rK109aSl9cmV0dXJuIHN9O3ZhciBVcj1mdW5jdGlvbigpe3JldHVybltdfSxMcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEJyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsR3I9QnI/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLERyKEJyKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gTHIuY2FsbCh0LGUpfSkpKX06VXI7dmFyIEtyPWZ1bmN0aW9uKHQpe3JldHVybiAkcih0LGdyLEdyKX0sV3I9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWHI9ZnVuY3Rpb24odCxlLHIsbixvLHMpe3ZhciBpPTEmcix1PUtyKHQpLGE9dS5sZW5ndGg7aWYoYSE9S3IoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGg9YTtoLS07KXt2YXIgbD11W2hdO2lmKCEoaT9sIGluIGU6V3IuY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysraDxhOyl7dmFyIHA9dFtsPXVbaF1dLHc9ZVtsXTtpZihuKXZhciBkPWk/bih3LHAsbCxlLHQscyk6bihwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxvKHAsdyxyLG4scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0sSnI9IltvYmplY3QgT2JqZWN0XSIsWXI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWnI9ZnVuY3Rpb24oZSxyLG4sbyxzLGkpe3ZhciB1PXQoZSksYT10KHIpLGg9dT8iW29iamVjdCBBcnJheV0iOkJ0KGUpLGw9YT8iW29iamVjdCBBcnJheV0iOkJ0KHIpLGM9KGg9IltvYmplY3QgQXJndW1lbnRzXSI9PWg/SnI6aCk9PUpyLGY9KGw9IltvYmplY3QgQXJndW1lbnRzXSI9PWw/SnI6bCk9PUpyLG09aD09bDtpZihtJiZucihlKSl7aWYoIW5yKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IGpyKSx1fHxjcihlKT9OcihlLHIsbixvLHMsaSk6UHIoZSxyLGgsbixvLHMsaSk7aWYoISgxJm4pKXt2YXIgZz1jJiZZci5jYWxsKGUsIl9fd3JhcHBlZF9fIikscD1mJiZZci5jYWxsKHIsIl9fd3JhcHBlZF9fIik7aWYoZ3x8cCl7dmFyIHc9Zz9lLnZhbHVlKCk6ZSxkPXA/ci52YWx1ZSgpOnI7cmV0dXJuIGl8fChpPW5ldyBqcikscyh3LGQsbixvLGkpfX1yZXR1cm4hIW0mJihpfHwoaT1uZXcganIpLFhyKGUscixuLG8scyxpKSl9O3ZhciBIcj1mdW5jdGlvbiB0KGUscixuLG8scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IWQoZSkmJiFkKHIpP2UhPWUmJnIhPXI6WnIoZSxyLG4sbyx0LHMpKX07dmFyIFFyPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBvPXIubGVuZ3RoLHM9byxpPSFuO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO28tLTspe3ZhciB1PXJbb107aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGE9KHU9cltvXSlbMF0saD10W2FdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1oJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcganI7aWYobil2YXIgZj1uKGgsbCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/SHIobCxoLDMsbixjKTpmKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciB0bj1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9Z3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbj1lW3JdLG89dFtuXTtlW3JdPVtuLG8sdG4obyldfXJldHVybiBlfTt2YXIgcm49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fTt2YXIgbm49ZnVuY3Rpb24odCl7dmFyIGU9ZW4odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP3JuKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxRcihyLHQsZSl9fTt2YXIgb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciBzbj1mdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9KHI9anQocixlKSkubGVuZ3RoLGk9ITE7KytvPHM7KXt2YXIgdT1fdChyW29dKTtpZighKGk9bnVsbCE9ZSYmbihlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbyE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmR3QocykmJnNyKHUscykmJih0KGUpfHxlcihlKSl9O3ZhciB1bj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZzbih0LGUsb24pfTt2YXIgYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gTSh0KSYmdG4oZSk/cm4oX3QodCksZSk6ZnVuY3Rpb24ocil7dmFyIG49Q3Qocix0KTtyZXR1cm4gdm9pZCAwPT09biYmbj09PWU/dW4ocix0KTpIcihlLG4sMyl9fTt2YXIgaG49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBdChlLHQpfX07dmFyIGxuPWZ1bmN0aW9uKHQpe3JldHVybiBNKHQpP1h0KF90KHQpKTpobih0KX07dmFyIGNuPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT93cjoib2JqZWN0Ij09dHlwZW9mIGU/dChlKT9hbihlWzBdLGVbMV0pOm5uKGUpOmxuKGUpfTt2YXIgZm49ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxuPUt0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gcHIodCwoZnVuY3Rpb24odCxvLHMpe25bKytyXT1lKHQsbyxzKX0pKSxufTt2YXIgbW49ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT92dDpmbikoZSxjbihyKSl9O3ZhciBnbj1mdW5jdGlvbih0LGUpe3JldHVybiB2dChlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX07dmFyIHBuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOmduKHQsZ3IodCkpfTtmdW5jdGlvbiB3bih0KXtyZXR1cm4hKCFwZSh0KXx8IiI9PT10KX1mdW5jdGlvbiBkbih0KXtsZXQgZT0hMTtyZXR1cm4gd24odCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfWZ1bmN0aW9uIGJuKHQsZSl7aWYoIWdlKHQpKXJldHVybnt9O2lmKCFkZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gYnIoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISFnZSh0KSYmISghd24oZSkmJiFkbihlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPUN0KHQsZSkpfSkpLHJ9dmFyIHluPS9ccy87dmFyIHZuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJnluLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LE1uPS9eXHMrLzt2YXIgeG49ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHZuKHQpKzEpLnJlcGxhY2UoTW4sIiIpOnR9LEVuPS9eWy0rXTB4WzAtOWEtZl0rJC9pLFNuPS9eMGJbMDFdKyQvaSxqbj0vXjBvWzAtN10rJC9pLF9uPXBhcnNlSW50O3ZhciBBbj1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoYih0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PXhuKHQpO3ZhciByPVNuLnRlc3QodCk7cmV0dXJuIHJ8fGpuLnRlc3QodCk/X24odC5zbGljZSgyKSxyPzI6OCk6RW4udGVzdCh0KT9OYU46K3R9O3ZhciBDbj1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PUFuKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O3ZhciBSbj1mdW5jdGlvbih0KXt2YXIgZT1Dbih0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9LEluPWkuaXNGaW5pdGUsa249TWF0aC5taW47dmFyIE5uPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1Bbih0KSwocj1udWxsPT1yPzA6a24oUm4ociksMjkyKSkmJkluKHQpKXt2YXIgbj0oU3QodCkrImUiKS5zcGxpdCgiZSIpLG89ZShuWzBdKyJlIisoK25bMV0rcikpO3JldHVybisoKG49KFN0KG8pKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrblsxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKTtmdW5jdGlvbiBPbih0KXtpZighZG4odCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gZG4odCk/Q24odCk6MH0odCk7bGV0IGU9Tm4odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX12YXIgRm49QXJyYXkucHJvdG90eXBlLmpvaW47dmFyIHpuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6Rm4uY2FsbCh0LGUpfTtjbGFzcyBUbntjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixuKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG5bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBUbih7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YXIgVm49VG4sUG49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyOlZufSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscW49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtkaXN0YW5jZToodCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX19LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwkbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2tHdEVsZW1lbnRBcnJMZW5ndGg6ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkifSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgRG57Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbj1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbz1uZXcgRG4odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO28uTWVkb2lkcz1lLG8uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW8uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG4mJihuPXMsdGhpcy5DbHVzdGVycz1vLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgUG4uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG49ci5yZWR1Y2UoKCh0LGUscixuKT0+ZTxuW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tuXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltuXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93ICRuLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8cW4uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Ebi5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0RuLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxEbi5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgRG4odCxlLHIpO3ZhciBVbj1EbixMbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXJlcjpVbn0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEJuPXIobigoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgciBpbiB0KWUuaGFzT3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKFBuKSxyKExuKX0pKSk7ZnVuY3Rpb24gR24odCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXIrPSh0W25dLWVbbl0pKih0W25dLWVbbl0pO3JldHVybiByfWNvbnN0IEtuPXtkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBXbih0LGUscj1Lbil7Y29uc3Qgbj1yLmRpc3RhbmNlRnVuY3Rpb258fEtuLmRpc3RhbmNlRnVuY3Rpb24sbz1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8S24uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPnImJihyPWkscz1uKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k8ciYmKHI9aSxzPW8pfX19cmV0dXJuIHN9ZnVuY3Rpb24gWG4odCxlLHIsbil7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspcltvXT1XbihlLHRbb10se2Rpc3RhbmNlRnVuY3Rpb246bn0pO3JldHVybiByfWZ1bmN0aW9uIEpuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtKbigxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gWm4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bj0xLHJlcGxhY2U6bz0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1vJiZuPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCB0PUhuKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG98fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gSG4odCxlLHIpe2NvbnN0IG49ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtuPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihuKnQpfWNsYXNzIFFue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgWW4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBabih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gdG8odCxlKXtjb25zdCByPW5ldyBWZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzxlLnJvd3M7bysrKXIuc2V0KG4sbyxHbih0LmdldFJvdyhuKSxlLmdldFJvdyhvKSkpO3JldHVybiByfWZ1bmN0aW9uIGVvKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIHJvKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWNvbnN0IG5vPVN5bWJvbCgiZGlzdGFuY2UiKTtjbGFzcyBvb3tjb25zdHJ1Y3Rvcih0LGUscixuLG8pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW4sdGhpc1tub109b31uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gWG4odCx0aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNlbnRyb2lkfSkpLGUsdGhpc1tub10pfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH19KSkscj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXNbbm9dKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2Zvcih2YXIgbj0wO248dGhpcy5jZW50cm9pZHMubGVuZ3RoO24rKyllW25dLnNpemU/ZVtuXS5lcnJvci89ZVtuXS5zaXplOmVbbl0uZXJyb3I9bnVsbDtyZXR1cm4gbmV3IG9vKHRoaXMuY2x1c3RlcnMsZSx0aGlzLmNvbnZlcmdlZCx0aGlzLml0ZXJhdGlvbnMsdGhpc1tub10pfX1jb25zdCBzbz17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsd2l0aEl0ZXJhdGlvbnM6ITEsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBpbyh0LGUscixuLG8scyl7dmFyIGk9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1lWzBdLmxlbmd0aDtmb3IodmFyIHM9bmV3IEFycmF5KG4pLGk9bmV3IEFycmF5KG4pLHU9MDt1PG47dSsrKXtzW3VdPW5ldyBBcnJheShvKSxpW3VdPTA7Zm9yKHZhciBhPTA7YTxvO2ErKylzW3VdW2FdPTB9Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe2lbcltoXV0rKztmb3IodmFyIGw9MDtsPG87bCsrKXNbcltoXV1bbF0rPWVbaF1bbF19Zm9yKHZhciBjPTA7YzxuO2MrKylmb3IodmFyIGY9MDtmPG87ZisrKWlbY10/c1tjXVtmXS89aVtjXTpzW2NdW2ZdPXRbY11bZl07cmV0dXJuIHN9KHQsZSxyPVhuKGUsdCxyLG8uZGlzdGFuY2VGdW5jdGlvbiksbiksdT1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKylpZihyKHRbb10sZVtvXSk+bilyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG8uZGlzdGFuY2VGdW5jdGlvbixvLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyBvbyhyLGksdSxzLG8uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gdW8odCxlLHIpe2lmKHI9T2JqZWN0LmFzc2lnbih7fSxzbyxyKSxlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKTt2YXIgbjtpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bj1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm49ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG49KHQ9bmV3IFZlKHQpKS5yb3dzLG89bmV3IFFuKHIuc2VlZCkscz1bXSxpPXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksdT1vLnJhbmRJbnQobik7cy5wdXNoKHQuZ2V0Um93KHUpKTtsZXQgYT1uZXcgVmUoMSx0LnJvd3MpO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylhLnNldCgwLGUsR24odC5nZXRSb3coZSksc1swXSkpO2xldCBoPVtybyhhLmdldFJvdygwKSldO2NvbnN0IGw9MS9oWzBdW24tMV07bGV0IGM9VmUubXVsKGEsbCk7Zm9yKGxldCByPTE7cjxlO3IrKyl7Y29uc3QgZT1vLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6aSxwcm9iYWJpbGl0aWVzOmNbMF19KSx1PXRvKHQuc2VsZWN0aW9uKGUsZW8odC5jb2x1bW5zKSksdCk7bGV0IGwsZixtO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IHI9VmUubWluKGEsW3UuZ2V0Um93KHQpXSksbj1yLnN1bSgpOyh2b2lkIDA9PT1sfHxuPGYpJiYobD1lW3RdLGY9bixtPXIpfXNbcl09dC5nZXRSb3cobCksYT1tLGg9W3JvKGEuZ2V0Um93KDApKV0sYz1WZS5tdWwoYSwxL2hbMF1bbi0xXSl9cmV0dXJuIHN9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bj1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBRbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm49ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1uZXcgUW4obik7dmFyIHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihvLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2Zvcih2YXIgaT17ZGlzdDotMSxpbmRleDotMX0sdT0wO3U8dC5sZW5ndGg7Kyt1KXJbc1swXV1bdV0+aS5kaXN0JiYoaS5kaXN0PXJbc1swXV1bdV0saS5pbmRleD11KTtpZihzWzFdPWkuaW5kZXgsZT4yKWZvcih2YXIgYT0yO2E8ZTsrK2Epe2Zvcih2YXIgaD17ZGlzdDotMSxpbmRleDotMX0sbD0wO2w8dC5sZW5ndGg7KytsKXtmb3IodmFyIGM9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX0sZj0wO2Y8YTsrK2YpcltmXVtsXTxjLmRpc3QmJi0xPT09cy5pbmRleE9mKGwpJiYoYz17ZGlzdDpyW2ZdW2xdLGluZGV4Omx9KTtjLmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZjLmRpc3Q+aC5kaXN0JiYoaD1PYmplY3QuYXNzaWduKHt9LGMpKX1zW2FdPWguaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBvPW47bzx0Lmxlbmd0aDsrK28pe3Jbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W25dLHRbb10pO3Jbbl1bb109cyxyW29dW25dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZDogIiR7ci5pbml0aWFsaXphdGlvbn0iYCl9MD09PXIubWF4SXRlcmF0aW9ucyYmKHIubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTt2YXIgbz1uZXcgQXJyYXkodC5sZW5ndGgpO2lmKHIud2l0aEl0ZXJhdGlvbnMpcmV0dXJuIGZ1bmN0aW9uKih0LGUscixuLG8pe2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxvLm1heEl0ZXJhdGlvbnM7KXM9aW8odCxlLHIsbixvLCsrdSkseWllbGQgcy5jb21wdXRlSW5mb3JtYXRpb24oZSksaT1zLmNvbnZlcmdlZCx0PXMuY2VudHJvaWRzfShuLHQsbyxlLHIpO2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxyLm1heEl0ZXJhdGlvbnM7KWk9KHM9aW8obix0LG8sZSxyLCsrdSkpLmNvbnZlcmdlZCxuPXMuY2VudHJvaWRzO3JldHVybiBzLmNvbXB1dGVJbmZvcm1hdGlvbih0KX1mdW5jdGlvbiBhbyh0LGU9e30pe2xldCByPUN0KGUsImtOdW1iZXIiKTtyPWRuKHIpP09uKHIpOjI7bGV0IG4sbz1DdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1vJiYiay1tZWFucyIhPT1vJiYobz0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1vKW49ZnVuY3Rpb24odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBuKHQpe3JldHVybiB6bih0LCI6Iil9YnIodCwoKHQsZSk9PntsZXQgbz1uKHQpO3Jbb109ZX0pKTtsZXQgbz1Cbi5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG89bW4obywodD0+bW4odCwodD0+e2xldCBlPW4odCk7cmV0dXJuIHJbZV19KSkpKSxvfSh0LHIpO2Vsc2V7aWYoImstbWVhbnMiIT09byl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbW9kZSIpO249ZnVuY3Rpb24odCxlKXtsZXQgcj11byh0LGUpLG49e307cmV0dXJuIGJyKHIuY2x1c3RlcnMsKCh0LGUpPT57blt0XXx8KG5bdF09W10pLG5bdF0ucHVzaChlKX0pKSxwbihuKX0odCxyKX1yZXR1cm4gbn1mdW5jdGlvbiBobyh0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj1kbihyKT9PbihyKToyO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7bj1kbihuKT9PbihuKToyO2xldCBvPUN0KGUsIm1vZGUiKSxzPSIiLGk9bGUodCksdT0wLGE9MDtpZihicih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKGdlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/ZGUodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBoLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307YnIodCwodD0+e2JyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJmRuKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8ZG4odCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gYnIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbW4odCwodD0+e2xldCByPWJuKHQsZSk7cmV0dXJuIHBuKHIpfSkpfSh0LGwpKTpoPXQ7bGV0IGM9V2UoaCx7bkNvbXBOSVBBTFM6bn0pLGY9YW8oYyx7a051bWJlcjpyLG1vZGU6b30pLG09bW4oZiwodD0+bW4odCwodD0+Y1t0XSkpKSk7cmV0dXJue2tleXM6bCxnaW5kczpmLGdsdGR0Om1uKGYsKGU9Pm1uKGUsKGU9PnRbZV0pKSkpLGdtYXQ6bX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gV2UodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gaG8odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(y,"base64").toString("utf8"));function i(){var b=l();function Z(l){try{return new d.Worker(l,{eval:!0})}catch(d){h(d)}}var y=Z(p);if(!y)return h("invalid worker"),null;function G(){y?(y.terminate(),y=void 0):h("worker has been terminated")}function m(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};y.postMessage(d)}function K(){var d=c(),l=X(),Z={mode:"call",id:l,fun:"PCA",input:Array.prototype.slice.call(arguments)};return y.postMessage(Z),b.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function i(){var d=c(),l=X(),Z={mode:"call",id:l,fun:"cluster",input:Array.prototype.slice.call(arguments)};return y.postMessage(Z),b.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(d){var l=d,c=l.mode;"emit"!==c&&"return"!==c||("emit"===c&&b.emit(l.evName,l.msg),"return"===c&&b.emit(l.id,l))}function h(d){b.emit("error",d)}return y.on("message",t),y.on("error",h),m(Array.prototype.slice.call(arguments)),b.PCA=K,b.cluster=i,b.terminate=G,b}var t,h,I={PCA:(h=Z(m.mark((function d(){var l,c,Z,X=arguments;return m.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),c=i(),d.next=4,c.PCA.apply(c,b(l)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return h.apply(this,arguments)}),cluster:(t=Z(m.mark((function d(){var l,c,Z,X=arguments;return m.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),c=i(),d.next=4,c.cluster.apply(c,b(l)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return t.apply(this,arguments)})};for(var W in G=l(),I){var u=I[W];G[W]=u}}(),G}));
@@ -1,7 +1,6 @@
1
1
  import path from 'path'
2
2
  import rollupFiles from 'w-package-tools/src/rollupFiles.mjs'
3
3
  import rollupWorker from 'w-package-tools/src/rollupWorker.mjs'
4
- import rollupWorkerCore from 'w-package-tools/src/rollupWorkerCore.mjs'
5
4
 
6
5
 
7
6
  let fdSrc = './src'
@@ -10,21 +9,21 @@ let fdTar = './dist'
10
9
 
11
10
  async function rp() {
12
11
 
13
- // await rollupFiles({ //rollupFiles預設會clean folder
14
- // fns: 'WCluster.mjs',
15
- // fdSrc,
16
- // fdTar,
17
- // nameDistType: 'kebabCase',
18
- // // bNodePolyfill: true,
19
- // // bMinify: false,
20
- // globals: {
21
- // },
22
- // external: [
23
- // ],
24
- // })
25
- // .catch((err) => {
26
- // console.log(err)
27
- // })
12
+ await rollupFiles({ //rollupFiles預設會clean folder
13
+ fns: 'WCluster.mjs',
14
+ fdSrc,
15
+ fdTar,
16
+ nameDistType: 'kebabCase',
17
+ // bNodePolyfill: true,
18
+ // bMinify: false,
19
+ globals: {
20
+ },
21
+ external: [
22
+ ],
23
+ })
24
+ .catch((err) => {
25
+ console.log(err)
26
+ })
28
27
 
29
28
  await rollupWorker({
30
29
  name: 'WCluster', //原模組名稱, 將來會掛於winodw下