@viewlift/player-backup 1.0.1 → 1.0.2-lighteningjs

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.babelrc +8 -0
  2. package/.browserslistrc +2 -0
  3. package/README.md +29 -0
  4. package/babel.config.json +8 -0
  5. package/dist/38afc79c94e0bcf0.png +0 -0
  6. package/dist/3bc8b7ff04e98d37.png +0 -0
  7. package/dist/522ea7c76ac4fd33.png +0 -0
  8. package/dist/a74cd46ed4277568.png +0 -0
  9. package/dist/b739faec1fde1346.png +0 -0
  10. package/dist/ed3d0a4d9de91460.png +0 -0
  11. package/dist/index.cjs.css +2 -0
  12. package/dist/index.cjs.css.map +1 -0
  13. package/dist/index.cjs.js +2 -0
  14. package/dist/index.d.ts +45 -0
  15. package/dist/index.esm.css +2 -0
  16. package/dist/index.esm.css.map +1 -0
  17. package/dist/index.esm.js +2 -0
  18. package/dist/main-player/player-ui.d.ts +19 -0
  19. package/dist/player-components/player-buttons/playerButtons.d.ts +38 -0
  20. package/dist/player-components/player-seekbar/playerSeekbar.d.ts +25 -0
  21. package/dist/player-ui/player-ui.d.ts +18 -0
  22. package/dist/playerInitializer.d.ts +13 -0
  23. package/index.html +49 -0
  24. package/package.json +32 -15
  25. package/rollup.config.mjs +45 -0
  26. package/src/ads-manager/ads-manager.js +120 -0
  27. package/src/assets/checkIcon.png +0 -0
  28. package/src/assets/pauseIcon.png +0 -0
  29. package/src/assets/pauseIconFocus.png +0 -0
  30. package/src/assets/playIcon.png +0 -0
  31. package/src/assets/playIconFocus.png +0 -0
  32. package/src/assets/settingsIcon.png +0 -0
  33. package/src/index.ts +242 -0
  34. package/src/player-components/player-buttons/playerButtons.js +104 -0
  35. package/src/player-components/player-seekbar/playerSeekbar.js +223 -0
  36. package/src/player-components/player-setting-option-wrapper/player-setting-option-one-wrapper.js +82 -0
  37. package/src/player-components/player-setting-option-wrapper/player-setting-option-two-wrapper.js +84 -0
  38. package/src/player-components/player-sidebar/player-sidebar.js +188 -0
  39. package/src/player-components/player-title/playerTitle.js +55 -0
  40. package/src/player-ui/player-ui.js +514 -0
  41. package/src/playerInitializer.js +335 -0
  42. package/src/styles/index.css +200 -0
  43. package/src/utilities/utilities.js +79 -0
  44. package/tsconfig.json +14 -0
  45. package/cjs/autoNextVideo-823821e8.js +0 -1
  46. package/cjs/bundle.css +0 -657
  47. package/cjs/caption-settings-67212c17.js +0 -1
  48. package/cjs/caption-settings-d42c056e.js +0 -1
  49. package/cjs/debugSelection-cbfdabb7.js +0 -1
  50. package/cjs/dvr_skin-f7f770ae.js +0 -1
  51. package/cjs/error-26d5a3c3.js +0 -1
  52. package/cjs/features-164c3cc6.js +0 -1
  53. package/cjs/generic-8b99b151.js +0 -1
  54. package/cjs/icons-7afb9c13.js +0 -1
  55. package/cjs/index-3dfe6459.js +0 -1
  56. package/cjs/index.js +0 -1
  57. package/cjs/keyboardShortcuts-cfd998c2.js +0 -1
  58. package/cjs/loader-393b838a.js +0 -1
  59. package/cjs/multicam-21c9a90b.js +0 -1
  60. package/cjs/multicam-a41fe4a6.js +0 -1
  61. package/cjs/multicamv2-76d8530b.js +0 -1
  62. package/cjs/multicamv2-c148fa24.js +0 -1
  63. package/cjs/mwebPotrait-3c11d7cf.js +0 -1
  64. package/cjs/mwebPotraitTray-b9d5d45a.js +0 -1
  65. package/cjs/nextEpisodeButton-300afadc.js +0 -1
  66. package/cjs/nextEpisodeButton-b6e6586f.js +0 -1
  67. package/cjs/nondvr_skin-ef2cb3b2.js +0 -1
  68. package/cjs/playlist-925f808b.js +0 -1
  69. package/cjs/playlist-df87ca90.js +0 -1
  70. package/cjs/renditions-bc841552.js +0 -1
  71. package/cjs/resolution-6a9adf54.js +0 -1
  72. package/cjs/series-82ec79d3.js +0 -1
  73. package/cjs/series-9c237975.js +0 -1
  74. package/cjs/series-v2-24855152.js +0 -1
  75. package/cjs/series-v2-70137d8c.js +0 -1
  76. package/cjs/settings-icon-a63f46fc.js +0 -1
  77. package/cjs/settings-icon-e6a8feee.js +0 -1
  78. package/cjs/skin-095cc078.js +0 -1
  79. package/cjs/skin-225252ff.js +0 -1
  80. package/cjs/skin-39ab30e2.js +0 -1
  81. package/cjs/skin-84083352.js +0 -1
  82. package/cjs/skin-93a3e5ae.js +0 -1
  83. package/cjs/skin-983a2ea7.js +0 -1
  84. package/cjs/skin-afbec6d7.js +0 -1
  85. package/cjs/skin-ec49b877.js +0 -1
  86. package/cjs/skin-f225a42e.js +0 -1
  87. package/cjs/skin-fb394911.js +0 -1
  88. package/cjs/util-fa21734a.js +0 -1
  89. package/cjs/videoSelector-01a9ef43.js +0 -1
  90. package/cjs/videoSelector-fcdf11eb.js +0 -1
  91. package/esm/autoNextVideo-1672740e.js +0 -1
  92. package/esm/bundle.css +0 -657
  93. package/esm/caption-settings-2e47813b.js +0 -1
  94. package/esm/caption-settings-3eacf3a0.js +0 -1
  95. package/esm/debugSelection-2601b8b3.js +0 -1
  96. package/esm/dvr_skin-9cc1b144.js +0 -1
  97. package/esm/error-2395864b.js +0 -1
  98. package/esm/features-f86404ce.js +0 -1
  99. package/esm/generic-7c43020f.js +0 -1
  100. package/esm/icons-c18c70b7.js +0 -1
  101. package/esm/index-9f022e82.js +0 -1
  102. package/esm/index.js +0 -1
  103. package/esm/keyboardShortcuts-c06f3c7b.js +0 -1
  104. package/esm/loader-580278fe.js +0 -1
  105. package/esm/multicam-94da3759.js +0 -1
  106. package/esm/multicam-de741974.js +0 -1
  107. package/esm/multicamv2-0105c40f.js +0 -1
  108. package/esm/multicamv2-d006cffa.js +0 -1
  109. package/esm/mwebPotrait-3c1805d8.js +0 -1
  110. package/esm/mwebPotraitTray-5ab39989.js +0 -1
  111. package/esm/nextEpisodeButton-2ea69b56.js +0 -1
  112. package/esm/nextEpisodeButton-a1556cdf.js +0 -1
  113. package/esm/nondvr_skin-64be70e5.js +0 -1
  114. package/esm/playlist-032fbbf3.js +0 -1
  115. package/esm/playlist-7ecf432a.js +0 -1
  116. package/esm/renditions-97276745.js +0 -1
  117. package/esm/resolution-38cd4f5c.js +0 -1
  118. package/esm/series-041152aa.js +0 -1
  119. package/esm/series-977edced.js +0 -1
  120. package/esm/series-v2-0727ee8c.js +0 -1
  121. package/esm/series-v2-516c91c2.js +0 -1
  122. package/esm/settings-icon-0125bffd.js +0 -1
  123. package/esm/settings-icon-2b713fbf.js +0 -1
  124. package/esm/skin-2c638dc1.js +0 -1
  125. package/esm/skin-42c2f81d.js +0 -1
  126. package/esm/skin-5e2fa9d4.js +0 -1
  127. package/esm/skin-6093bfb3.js +0 -1
  128. package/esm/skin-60a41d44.js +0 -1
  129. package/esm/skin-665ec17e.js +0 -1
  130. package/esm/skin-93e320fc.js +0 -1
  131. package/esm/skin-b939c35e.js +0 -1
  132. package/esm/skin-cd537931.js +0 -1
  133. package/esm/skin-d5510f70.js +0 -1
  134. package/esm/util-d9f5a7be.js +0 -1
  135. package/esm/videoSelector-8889c58e.js +0 -1
  136. package/esm/videoSelector-8e258d45.js +0 -1
package/.babelrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "presets": [
3
+ ["@babel/preset-env", {
4
+ "targets": { "ie": "11" },
5
+ "modules": false
6
+ }]
7
+ ]
8
+ }
@@ -0,0 +1,2 @@
1
+ IE 11
2
+ last 2 versions
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @viewlift/ligheningjs-video-player
2
+
3
+ A LightningJS video player component for Smart TV app development.
4
+
5
+ ## Features
6
+ - Video player component for LightningJS
7
+ - TypeScript support
8
+ - Easy to use in LightningJS-based projects
9
+
10
+ ## Installation
11
+ ```bash
12
+ npm install @viewlift/ligheningjs-video-player
13
+ ```
14
+
15
+ ## Usage
16
+ ```ts
17
+ import { LightningVideoPlayer } from '@viewlift/ligheningjs-video-player';
18
+
19
+ const player = new LightningVideoPlayer();
20
+ player.play();
21
+ ```
22
+
23
+ ## Build
24
+ ```bash
25
+ npm run build
26
+ ```
27
+
28
+ ## License
29
+ ISC
@@ -0,0 +1,8 @@
1
+ {
2
+ "presets": [
3
+ ["@babel/preset-env", {
4
+ "targets": { "ie": "11" },
5
+ "modules": false
6
+ }]
7
+ ]
8
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ body{background-color:#000;box-sizing:border-box;margin:0;padding:0}.vl-player-container .seekbar-container{background:#444;border-radius:6px;bottom:50px;cursor:pointer;height:12px;left:50%;margin:0;position:absolute;transform:translateX(-50%);user-select:none;width:90%;z-index:20}.vl-player-container .seekbar-buffer{background:#888;border-radius:6px;height:100%;position:absolute;width:0;z-index:1}.vl-player-container .seekbar-progress{background:#4169e1;border-radius:6px;height:100%;position:absolute;transition:width .1s linear;width:0;z-index:2}.vl-player-container .seekbar-thumb{background:#fff;border:2px solid #4169e1;border-radius:50%;box-shadow:0 2px 8px rgba(0,0,0,.2);cursor:pointer;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);transition:background .2s;width:16px;z-index:3}.vl-player-container .seekbar-thumb:hover{background:#ffeaea}.vl-player-container .seekbar-tooltip{background:#222;border-radius:4px;bottom:24px;color:#fff;font-size:12px;left:0;padding:2px 8px;pointer-events:none;position:absolute;transform:translateX(-50%);white-space:nowrap;z-index:10}.vl-player-container .seekbar-duration-label,.vl-player-container .seekbar-time-label{color:#eee;font-size:13px;margin-right:4px;position:relative;top:18px;z-index:5}.vl-player-container .play-pause-btn{background:hsla(0,0%,100%,.5);border-radius:50%;cursor:pointer;height:70px;left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%);width:70px;z-index:20}.vl-player-container .play-pause-btn img{height:50px;left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.vl-player-container .left-side-container{bottom:77px;display:flex;left:5%;position:absolute!important}.vl-player-container .right-side-container{bottom:77px;display:flex;position:absolute!important;right:5%}.vl-player-container .settings-btn{background:hsla(0,0%,100%,.5);border-radius:5px;bottom:100px;cursor:pointer;height:40px;margin:0 5px;padding:5px;width:50px;z-index:20}.vl-player-container .settings-btn img{height:100%}.vl-player-container .restart-btn{border:2px solid #fff;border-radius:8px;bottom:100px;color:#fff;cursor:pointer;display:flex;flex-direction:column;font-size:16px;font-weight:700;justify-content:center;margin:0 5px;padding:5px;right:2%;z-index:20}.vl-player-container .default-option-wrapper{align-items:center;background:#525760;border-radius:2px;box-shadow:0 10px 15px rgba(0,0,0,.1);color:#fff;cursor:pointer;display:flex;font-size:18px;font-weight:700;height:50px;justify-content:space-between;margin:20px 0;padding:5px 10px;text-transform:capitalize;width:95%}.vl-player-container .default-option-wrapper span{height:40px}.vl-player-container .default-option-wrapper span>img{height:100%}.vl-player-container .default-sidebar{background-color:rgba(30,30,30,.75);color:#fff;display:flex;flex-direction:column;height:100%;min-height:720px;padding:50px 20px 0;position:absolute;right:0;top:0;width:400px;z-index:30}
2
+ /*# sourceMappingURL=index.cjs.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.css"],"names":[],"mappings":"AACE,KAIE,qBAAsB,CADtB,qBAAsB,CAFtB,QAAS,CACT,SAGF,CACF,wCAMI,eAAgB,CAGhB,iBAAkB,CALlB,WAAY,CAIZ,cAAe,CAHf,WAAY,CAHZ,QAAS,CAQT,QAAS,CATT,iBAAkB,CAElB,0BAA2B,CAQ3B,gBAAiB,CAJjB,SAAU,CAKV,UACF,CAEF,qCAGI,eAAgB,CAEhB,iBAAkB,CAHlB,WAAY,CADZ,iBAAkB,CAGlB,OAAQ,CAER,SACF,CAEF,uCAGI,kBAAmB,CAEnB,iBAAkB,CAHlB,WAAY,CADZ,iBAAkB,CAMlB,2BAA6B,CAH7B,OAAQ,CAER,SAEF,CAEF,oCAMI,eAAgB,CAEhB,wBAAyB,CADzB,iBAAkB,CAGlB,mCAAqC,CACrC,cAAe,CANf,WAAY,CAJZ,iBAAkB,CAClB,OAAQ,CACR,8BAAgC,CAShC,yBAA2B,CAR3B,UAAW,CAKX,SAIF,CACD,0CACG,kBACF,CAED,sCAKG,eAAgB,CAGhB,iBAAkB,CANlB,WAAY,CAIZ,UAAW,CAGX,cAAe,CANf,MAAO,CAIP,eAAgB,CAIhB,mBAAoB,CAVpB,iBAAkB,CAGlB,0BAA2B,CAM3B,kBAAmB,CAEnB,UACF,CAEF,sFAII,UAAW,CADX,cAAe,CAEf,gBAAiB,CAJjB,iBAAkB,CAClB,QAAS,CAIT,SACF,CAOF,qCASE,6BAAiC,CADjC,iBAAkB,CAElB,cAAe,CAHf,WAAY,CALZ,QAAS,CADT,2BAA6B,CAE7B,OAAQ,CACR,8BAAgC,CAEhC,UAAW,CADX,UAMF,CAEA,yCAKE,WAAY,CAHZ,QAAS,CADT,2BAA6B,CAE7B,OAAQ,CACR,8BAEF,CAGA,0CAIE,WAAY,CAFZ,YAAa,CACb,OAAQ,CAFR,2BAIF,CAEA,2CAIE,WAAY,CAFZ,YAAa,CADb,2BAA6B,CAE7B,QAEF,CAEA,mCAOE,6BAAkC,CANlC,iBAAkB,CAElB,YAAa,CAKb,cAAe,CAHf,WAAY,CACZ,YAAa,CAJb,WAAY,CAEZ,UAAW,CAKX,UACF,CAEA,uCACE,WACF,CAEA,kCAKE,qBAAsB,CAHtB,iBAAkB,CAElB,YAAa,CAEb,UAAW,CAOX,cAAe,CAJf,YAAa,CACb,qBAAsB,CAHtB,cAAe,CACf,eAAgB,CAGhB,sBAAuB,CACvB,YAAa,CATb,WAAY,CAFZ,QAAS,CAaT,UACF,CAIA,6CAGE,kBAAmB,CAGnB,kBAAmB,CAKnB,iBAAkB,CAClB,qCAAyC,CALzC,UAAW,CAQX,cAAe,CAdf,YAAa,CASb,cAAe,CADf,eAAgB,CAJhB,WAAY,CAHZ,6BAA8B,CAW9B,aAAgB,CALhB,gBAAiB,CAMjB,yBAA0B,CAV1B,SAYF,CACA,kDACE,WACF,CAEA,sDACE,WACF,CAGA,sCAME,mCAAuC,CAHvC,UAAW,CACX,YAAa,CACb,qBAAsB,CAEtB,WAAY,CACZ,gBAAiB,CAEjB,mBAAyB,CATzB,iBAAkB,CAUlB,OAAU,CATV,KAAM,CAON,WAAY,CAGZ,UAEF","file":"index.cjs.css","sourcesContent":["/*************** playerSeekbar.css ***************/\n body {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n background-color: #000;\n }\n.vl-player-container .seekbar-container {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n bottom: 50px;\n height: 12px;\n background: #444;\n width: 90%;\n cursor: pointer;\n border-radius: 6px;\n margin: 0;\n user-select: none;\n z-index: 20;\n }\n \n.vl-player-container .seekbar-buffer {\n position: absolute;\n height: 100%;\n background: #888;\n width: 0;\n border-radius: 6px;\n z-index: 1;\n }\n \n.vl-player-container .seekbar-progress {\n position: absolute;\n height: 100%;\n background: #4169E1;\n width: 0;\n border-radius: 6px;\n z-index: 2;\n transition: width 0.1s linear;\n }\n \n.vl-player-container .seekbar-thumb {\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n border: 2px solid #4169E1;\n z-index: 3;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n cursor: pointer;\n transition: background 0.2s;\n }\n .vl-player-container .seekbar-thumb:hover {\n background: #ffeaea;\n }\n \n .vl-player-container .seekbar-tooltip {\n position: absolute;\n bottom: 24px;\n left: 0;\n transform: translateX(-50%);\n background: #222;\n color: #fff;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n }\n \n.vl-player-container .seekbar-time-label, .vl-player-container .seekbar-duration-label {\n position: relative;\n top: 18px;\n font-size: 13px;\n color: #eee;\n margin-right: 4px;\n z-index: 5;\n }\n \n\n\n\n/*************** playerButtons.css ***************/\n\n.vl-player-container .play-pause-btn {\n position: absolute !important;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n z-index: 20;\n width: 70px;\n height: 70px;\n border-radius: 50%;\n background: rgba(255,255,255, .5);\n cursor: pointer;\n} \n\n.vl-player-container .play-pause-btn img {\n position: absolute !important;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n height: 50px;\n}\n\n\n.vl-player-container .left-side-container {\n position: absolute !important;\n display: flex;\n left: 5%;\n bottom: 77px;\n}\n\n.vl-player-container .right-side-container {\n position: absolute !important;\n display: flex;\n right: 5%;\n bottom: 77px;\n}\n\n.vl-player-container .settings-btn {\n border-radius: 5px;\n padding: 5px;\n bottom: 100px;\n width: 50px;\n height: 40px;\n margin: 0 5px;\n background: rgba(255,255,255, 0.5);\n cursor: pointer;\n z-index: 20;\n}\n\n.vl-player-container .settings-btn img{\n height: 100%;\n}\n\n.vl-player-container .restart-btn {\n right: 2%;\n border-radius: 8px;\n padding: 5px;\n bottom: 100px;\n border: 2px solid #fff;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin: 0 5px;\n cursor: pointer;\n z-index: 20;\n}\n\n\n/*************** player-setting-option-wrapper ***************/\n.vl-player-container .default-option-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 95%;\n height: 50px;\n background: #525760;\n color: #fff;\n padding: 5px 10px;\n font-weight: 700;\n font-size: 18px;\n border-radius: 2px;\n box-shadow: 0 10px 15px rgba(0, 0, 0, .1);\n margin: 20px 0px;\n text-transform: capitalize;\n cursor: pointer;\n}\n.vl-player-container .default-option-wrapper span {\n height: 40px;\n}\n\n.vl-player-container .default-option-wrapper span > img{\n height: 100%;\n}\n\n\n.vl-player-container .default-sidebar {\n position: absolute;\n top: 0;\n color: #fff;\n display: flex;\n flex-direction: column;\n background-color: rgba(30, 30, 30, .75);\n height: 100%;\n min-height: 720px;\n width: 400px;\n padding: 50px 20px 0 20px;\n right: 0px;\n z-index: 30;\n /* right: -450px; */\n}"]}
@@ -0,0 +1,2 @@
1
+ "use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,i){return t&&function(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,s(n.key),n)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function n(t){return function(t){if(Array.isArray(t))return e(t)}(t)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(t,i){if(t){if("string"==typeof t)return e(t,i);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(t,i):void 0}}(t)||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 s(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var n=i.call(e,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}var a=function(){return i(function e(i){if(t(this,e),!i)throw new Error("Button Class: props are required");if(this.imgSrc=i.imgSrc||"",this.imgAltText=i.imgAltText||"",this.buttonText=i.buttonText||"",this.klassname=i.klassname||"default-button",this.width=i.width||100,this.height=i.height||50,this.focused=i.focused||!1,this.disabled=i.disabled||!1,this.handleClick=i.handleClick||function(){},"function"!=typeof this.handleClick)throw new Error("Button Class: handleClick must be a function");this.disabled&&(this.klassname+=" disabled"),this.focused&&(this.klassname+=" focused"),this.handleClick=this.handleClick.bind(this)},[{key:"focus",value:function(){this.buttonElement&&(this.buttonElement.focus(),this.buttonElement.classList.add("focused"),this.focused=!0)}},{key:"blur",value:function(){this.buttonElement&&(this.buttonElement.blur(),this.buttonElement.classList.remove("focused"),this.focused=!1)}},{key:"mount",value:function(e){var t=this;if(!(e&&e instanceof HTMLElement))throw new Error("Button Class: mountPoint must be a valid DOM element");var i=document.createElement("div");if(i.className=this.klassname,i.style.width="".concat(this.width,"px"),i.style.height="".concat(this.height,"px"),i.tabIndex=0,this.imgSrc){var n=document.createElement("img");n.src=this.imgSrc,n.alt=this.imgAltText,n.onerror=function(){console.warn("Button Class: Failed to load image at",t.imgSrc)},i.appendChild(n)}else{var s=document.createElement("span");s.textContent=this.buttonText,i.appendChild(s)}this.disabled||i.addEventListener("click",this.handleClick),i.addEventListener("keydown",function(e){"Enter"!==e.key&&"OK"!==e.key||t.handleClick()}),i.addEventListener("focus",function(){t.focused=!0,i.classList.add("focused")}),i.addEventListener("blur",function(){t.focused=!1,i.classList.remove("focused")}),this.buttonElement=i,e.appendChild(i)}},{key:"unmount",value:function(){this.buttonElement&&(this.buttonElement.removeEventListener("click",this.handleClick),this.buttonElement.removeEventListener("keydown",this.handleClick),this.buttonElement.removeEventListener("focus",this.handleClick),this.buttonElement.removeEventListener("blur",this.handleClick),this.buttonElement.remove(),this.buttonElement=void 0)}}])}(),r=function(){return i(function e(i){if(t(this,e),!(i&&i instanceof HTMLVideoElement))throw new Error("PlayerSeekbar: A valid HTMLVideoElement is required");this.video=i,this.container=null,this.progress=null,this.buffer=null,this.thumb=null,this.tooltip=null,this.timeLabel=null,this.durationLabel=null,this.isDragging=!1,this.focused=!1,this.init()},[{key:"init",value:function(){var e=this;this.container=document.createElement("div"),this.container.className="seekbar-container",this.buffer=document.createElement("div"),this.buffer.className="seekbar-buffer",this.progress=document.createElement("div"),this.progress.className="seekbar-progress",this.thumb=document.createElement("div"),this.thumb.className="seekbar-thumb",this.thumb.tabIndex=0,this.tooltip=document.createElement("div"),this.tooltip.className="seekbar-tooltip",this.tooltip.style.display="none",this.timeLabel=document.createElement("span"),this.timeLabel.className="seekbar-time-label",this.durationLabel=document.createElement("span"),this.durationLabel.className="seekbar-duration-label",this.container.appendChild(this.buffer),this.container.appendChild(this.progress),this.container.appendChild(this.thumb),this.container.appendChild(this.tooltip),this.container.appendChild(this.timeLabel),this.container.appendChild(this.durationLabel),this.video.addEventListener("timeupdate",function(){return e.update()}),this.video.addEventListener("progress",function(){return e.updateBuffer()}),this.video.addEventListener("durationchange",function(){return e.update()}),this.container.addEventListener("click",function(t){return e.seek(t)}),this.thumb.addEventListener("mousedown",function(t){return e.startDrag(t)}),this.container.addEventListener("mousemove",function(t){return e.showTooltip(t)}),this.container.addEventListener("mouseleave",function(){return e.hideTooltip()}),this.thumb.addEventListener("focus",function(){e.focused=!0,e.thumb.classList.add("focused")}),this.thumb.addEventListener("blur",function(){e.focused=!1,e.thumb.classList.remove("focused")}),this.thumb.addEventListener("keydown",function(t){"ArrowRight"===t.key?(t.preventDefault(),t.stopPropagation(),e.video.currentTime=Math.min(e.video.duration,e.video.currentTime+1),e.update()):"ArrowLeft"===t.key?(t.preventDefault(),t.stopPropagation(),e.video.currentTime=Math.max(0,e.video.currentTime-1),e.update()):"Enter"===t.key&&(t.preventDefault(),t.stopPropagation(),e.video.paused&&e.video.play())})}},{key:"focus",value:function(){this.thumb&&(this.thumb.focus(),this.thumb.classList.add("focused"),this.focused=!0)}},{key:"blur",value:function(){this.thumb&&(this.thumb.blur(),this.thumb.classList.remove("focused"),this.focused=!1)}},{key:"formatTime",value:function(e){if(isNaN(e))return"0:00";var t=Math.floor(e/60),i=Math.floor(e%60);return"".concat(t,":").concat(String(i).padStart(2,"0"))}},{key:"update",value:function(){if(this.video&&this.progress&&this.thumb&&this.timeLabel&&this.durationLabel){var e=this.video.currentTime/this.video.duration*100;this.progress.style.width=e+"%",this.thumb.style.left=e+"%",this.timeLabel.textContent=this.formatTime(this.video.currentTime),this.durationLabel.textContent=" / "+this.formatTime(this.video.duration)}}},{key:"updateBuffer",value:function(){if(this.video&&this.buffer&&this.video.buffered.length){var e=this.video.buffered.end(this.video.buffered.length-1)/this.video.duration*100;this.buffer.style.width=e+"%"}}},{key:"seek",value:function(e){if(!this.isDragging&&this.container&&this.video){var t=this.container.getBoundingClientRect(),i=(e.clientX-t.left)/t.width;this.video.currentTime=i*this.video.duration}}},{key:"startDrag",value:function(e){var t=this;if(this.container&&this.video){e.preventDefault(),this.isDragging=!0;var i=function(e){var i=t.container.getBoundingClientRect(),n=(e.clientX-i.left)/i.width;n=Math.max(0,Math.min(1,n)),t.progress.style.width=100*n+"%",t.thumb.style.left=100*n+"%",t.timeLabel.textContent=t.formatTime(n*t.video.duration)},n=function(e){var s=t.container.getBoundingClientRect(),o=(e.clientX-s.left)/s.width;o=Math.max(0,Math.min(1,o)),t.video.currentTime=o*t.video.duration,t.isDragging=!1,document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",n)};document.addEventListener("mousemove",i),document.addEventListener("mouseup",n)}}},{key:"showTooltip",value:function(e){if(this.container&&this.tooltip&&this.video){var t=this.container.getBoundingClientRect(),i=(e.clientX-t.left)/t.width,n=i*this.video.duration;this.tooltip.textContent=this.formatTime(n),this.tooltip.style.display="block",this.tooltip.style.left="".concat(100*i,"%")}}},{key:"hideTooltip",value:function(){this.tooltip&&(this.tooltip.style.display="none")}},{key:"getElement",value:function(){return this.thumb}},{key:"mount",value:function(e){if(!(e&&e instanceof HTMLElement))throw new Error("PlayerSeekbar: parent must be a valid DOM element");e.appendChild(this.container),this.update(),this.updateBuffer()}},{key:"unmount",value:function(){this.video&&this.container&&this.thumb&&(this.video.removeEventListener("timeupdate",this.update),this.video.removeEventListener("progress",this.updateBuffer),this.video.removeEventListener("durationchange",this.update),this.container.removeEventListener("click",this.seek),this.thumb.removeEventListener("mousedown",this.startDrag),this.container.removeEventListener("mousemove",this.showTooltip),this.container.removeEventListener("mouseleave",this.hideTooltip),this.thumb.removeEventListener("focus",this.focus),this.thumb.removeEventListener("blur",this.blur),this.thumb.removeEventListener("keydown",this.keydownHandler),this.container&&this.container.remove())}}])}(),l=function(){return i(function e(i){if(t(this,e),!i||"object"!==o(i))throw new Error("TextContent: props must be a valid object");this.text=i.text||"",this.fontSize=i.fontSize||"16px",this.fontFamily=i.fontFamily||"Arial, sans-serif",this.fontWeight=i.fontWeight||"normal",this.textAlign=i.textAlign||"left",this.textDecoration=i.textDecoration||"none",this.textTransform=i.textTransform||"none",this.lineHeight=i.lineHeight||"normal",this.letterSpacing=i.letterSpacing||"normal",this.color=i.color||"#000",this.backgroundColor=i.backgroundColor||"transparent",this.klassname=i.klassname||"default-text-content",this.width=i.width||100,this.height=i.height||50,this.focused=i.focused||!1},[{key:"setText",value:function(e){if("string"!=typeof e)throw new Error("TextContent: text must be a string");this.text=e,this.container&&(this.container.textContent=e)}},{key:"mount",value:function(e){if(!(e&&e instanceof HTMLElement))throw new Error("TextContent: mountPoint must be a valid DOM element");var t=document.createElement("div");t.className=this.klassname,t.style.fontSize=this.fontSize,t.style.color=this.color,t.style.backgroundColor=this.backgroundColor,t.innerText=this.text,e.appendChild(t),this.container=t}},{key:"unmount",value:function(){this.container&&(this.container.remove(),this.container=void 0)}}])}(),u=function(){return i(function e(i){if(t(this,e),!i||"object"!==o(i))throw new Error("SettingsOptionOneWrapper: props must be a valid object");if(this.title=i.title||"Option",this.klassname=i.klassname||"default-option-wrapper",this.handleClick=i.callback||function(){},this.focused=i.focused||!1,"function"!=typeof this.handleClick)throw new Error("SettingsOptionOneWrapper: callback must be a function");this.handleClick=this.handleClick.bind(this)},[{key:"mount",value:function(e){var t=this;if(!(e&&e instanceof HTMLElement))throw new Error("SettingsOptionOneWrapper: mountPoint must be a valid DOM element");var i=document.createElement("div");i.className=this.klassname,i.tabIndex=0;var n=document.createElement("p");n.textContent=this.title,i.appendChild(n);var s=document.createElement("p");s.textContent="›",i.appendChild(s),this.focused&&i.classList.add("focused"),i.addEventListener("focus",function(){t.focused=!0,i.classList.add("focused")}),i.addEventListener("blur",function(){t.focused=!1,i.classList.remove("focused")}),i.addEventListener("keydown",function(e){"Enter"!==e.key&&"OK"!==e.key||t.handleClick()}),this.optionWrapper=i,i.instance=this,e.appendChild(i)}},{key:"unmount",value:function(){this.optionWrapper&&(this.optionWrapper.remove(),this.optionWrapper=void 0)}},{key:"focus",value:function(){this.optionWrapper&&(this.optionWrapper.focus(),this.optionWrapper.classList.add("focused"),this.focused=!0)}},{key:"blur",value:function(){this.optionWrapper&&(this.optionWrapper.blur(),this.optionWrapper.classList.remove("focused"),this.focused=!1)}}])}(),d=function(){return i(function e(i){if(t(this,e),!i||"object"!==o(i))throw new Error("SettingsOptionTwoWrapper: props must be a valid object");if(this.title=i.title||"Option",this.klassname=i.klassname||"default-option-wrapper",this.selected=i.selected||!1,this.focused=i.focused||!1,this.imgSrc=i.imgSrc||"522ea7c76ac4fd33.png",this.id=i.id,"string"!=typeof this.title)throw new Error("SettingsOptionTwoWrapper: title must be a string")},[{key:"mount",value:function(e){var t=this;if(!(e&&e instanceof HTMLElement))throw new Error("SettingsOptionTwoWrapper: mountPoint must be a valid DOM element");var i=document.createElement("div");i.className=this.klassname,i.tabIndex=0;var n=document.createElement("p");if(n.textContent=this.title,i.appendChild(n),this.selected){i.classList.add("selected");var s=document.createElement("span"),o=document.createElement("img");o.src=this.imgSrc,o.alt=this.imgAltText||"Selected",s.appendChild(o),i.appendChild(s)}this.focused&&i.classList.add("focused"),i.addEventListener("focus",function(){t.focused=!0,i.classList.add("focused")}),i.addEventListener("blur",function(){t.focused=!1,i.classList.remove("focused")}),this.optionWrapper=i,i.instance=this,e.appendChild(i)}},{key:"unmount",value:function(){this.optionWrapper&&(this.optionWrapper.remove(),this.optionWrapper=void 0)}},{key:"focus",value:function(){this.optionWrapper&&(this.optionWrapper.focus(),this.optionWrapper.classList.add("focused"),this.focused=!0)}},{key:"blur",value:function(){this.optionWrapper&&(this.optionWrapper.blur(),this.optionWrapper.classList.remove("focused"),this.focused=!1)}}])}(),c=function(){return i(function e(i){if(t(this,e),!i||"object"!==o(i))throw new Error("Sidebar: props must be a valid object");if(this.title=i.title||"Settings",this.items=i.items||[{text:"Video Quality",isSelected:!0,callback:function(){}},{text:"Audio Language",isSelected:!1,callback:function(){}},{text:"Subtitles",isSelected:!1,callback:function(){}}],this.klassname=i.klassname||"default-sidebar",this.currentFocusedOption=null,this.lastFocusedElement=i.lastFocusedElement||null,this.type=i.type||"navigation",this.focused=i.focused||!1,this.callback=i.callback||function(){},this.onselect=i.onselect||function(){},"function"!=typeof this.callback)throw new Error("Sidebar: callback must be a function");if(!["navigation","selection"].includes(this.type))throw new Error('Sidebar: type must be either "navigation" or "selection"')},[{key:"mount",value:function(e){var t=this;if(!(e&&e instanceof HTMLElement))throw new Error("Sidebar: mountPoint must be a valid DOM element");var i=document.createElement("div");i.className=this.klassname;var n=document.createElement("h2");n.textContent=this.title,n.style.fontSize="38px",i.appendChild(n);var s=document.createElement("div");"navigation"===this.type?this.items.forEach(function(e,i){var n=new u({title:e.text,klassname:"default-option-wrapper",focused:0===i,callback:e.callback});e.instance=n,0===i&&(t.currentFocusedOption=n),n.mount(s)}):"selection"===this.type&&this.items.forEach(function(e,i){var n=new d({title:e.text,klassname:"default-option-wrapper",focused:0===i,selected:e.isSelected,id:e.id});e.instance=n,0===i&&(t.currentFocusedOption=n),n.mount(s)}),i.appendChild(s),this.sidebarElement=i,e.appendChild(i),this.addEventListeners(),this.focus()}},{key:"addEventListeners",value:function(){var e=this;if(!this.sidebarElement)throw new Error("Sidebar: sidebarElement is not initialized");this.sidebarElement.addEventListener("keydown",function(t){"ArrowDown"===t.key?(t.preventDefault(),t.stopPropagation(),e.focusNext()):"ArrowUp"===t.key?(t.preventDefault(),t.stopPropagation(),e.focusPrevious()):"Backspace"===t.key||"Escape"===t.key?(t.preventDefault(),t.stopPropagation(),e.unfocus(),e.unmount()):"Enter"!==t.key&&"OK"!==t.key||(t.preventDefault(),t.stopPropagation(),"selection"===e.type&&e.selectionTypeAction())})}},{key:"selectionTypeAction",value:function(){if(this.currentFocusedOption){this.items.forEach(function(e){if(e.instance){e.instance.optionWrapper.classList.remove("selected"),e.instance.selected=!1;var t=e.instance.optionWrapper.querySelector("img");t&&t.parentElement.remove()}}),this.currentFocusedOption.optionWrapper.classList.add("selected"),this.currentFocusedOption.selected=!0;var e=document.createElement("span"),t=document.createElement("img");t.src=this.currentFocusedOption.imgSrc,t.alt="Selected",e.appendChild(t),this.currentFocusedOption.optionWrapper.appendChild(e),this.onselect(this.currentFocusedOption)}}},{key:"focusNext",value:function(){if(this.sidebarElement&&this.currentFocusedOption){var e=this.currentFocusedOption.optionWrapper.nextElementSibling;e&&(this.currentFocusedOption.blur(),this.currentFocusedOption=e.instance,this.currentFocusedOption.focus())}}},{key:"focusPrevious",value:function(){if(this.sidebarElement&&this.currentFocusedOption){var e=this.currentFocusedOption.optionWrapper.previousElementSibling;e&&(this.currentFocusedOption.blur(),this.currentFocusedOption=e.instance,this.currentFocusedOption.focus())}}},{key:"focus",value:function(){this.sidebarElement&&this.currentFocusedOption&&this.currentFocusedOption.focus()}},{key:"unfocus",value:function(){this.sidebarElement&&this.currentFocusedOption&&this.currentFocusedOption.blur()}},{key:"unmount",value:function(){this.sidebarElement&&(this.sidebarElement.remove(),this.sidebarElement=void 0,this.lastFocusedElement&&(this.callback(),this.lastFocusedElement.focus()),this.currentFocusedOption=null)}}])}(),h="ed3d0a4d9de91460.png",p="3bc8b7ff04e98d37.png",f="b739faec1fde1346.png",m="38afc79c94e0bcf0.png",v=function(){return i(function e(i){var n=i.player,s=i.config;if(t(this,e),!n||"object"!==o(n)||!n.video)throw new Error("VideoPlayerUI: player must be a valid object with a video property");if(!s||"object"!==o(s))throw new Error("VideoPlayerUI: config must be a valid object");this.player=n,this.videoTitleConfig=s.videoTitleConfig||{},this.drmEnabled=s.drmEnabled,this.selectedVideoQuality="auto",this.selectedPlaybackCaption="",this.selectedAudioQuality="",this.container=document.createElement("div"),this.container.className="video-player-ui",this.rightSideContainer=document.createElement("div"),this.rightSideContainer.className="right-side-container",this.leftSideContainer=document.createElement("div"),this.leftSideContainer.className="left-side-container",this.container.appendChild(this.rightSideContainer),this.container.appendChild(this.leftSideContainer),this.createControls()},[{key:"createControls",value:function(){this.createPlayPauseBtn(),this.createSeekbar(),this.createSettingsBtn(),this.createRestartVideoBtn(),this.createTextContent(),this.addEventListeners(),this.container.appendChild(this.player.video)}},{key:"createPlayPauseBtn",value:function(){var e=this;this.playPauseBtn=new a({imgSrc:f,imgAltText:"Play/Pause",buttonText:"Play",width:70,height:70,klassname:"play-pause-btn",focused:!1,disabled:!1,handleClick:function(){e.player.video.paused?(e.player.play(),e.playPauseBtn&&e.playPauseBtn.buttonElement&&e.playPauseBtn.buttonElement.querySelector("img")?e.playPauseBtn.buttonElement.querySelector("img").setAttribute("src",m):e.playPauseBtn&&e.playPauseBtn.buttonElement&&(e.playPauseBtn.buttonElement.textContent="Pause")):(e.player.pause(),e.playPauseBtn&&e.playPauseBtn.buttonElement?e.playPauseBtn.buttonElement.querySelector("img").setAttribute("src",f):e.playPauseBtn&&e.playPauseBtn.buttonElement&&(e.playPauseBtn.buttonElement.textContent="Play"))}}),this.playPauseBtn.mount(this.container),requestAnimationFrame(function(){e.playPauseBtn&&e.playPauseBtn.focus()}),this.createPlayPauseBtnEventListeners()}},{key:"createPlayPauseBtnEventListeners",value:function(){var e=this;this.playPauseBtn&&this.playPauseBtn.buttonElement&&(this.playPauseBtn.buttonElement.addEventListener("focus",function(){if(e.playPauseBtn&&e.playPauseBtn.buttonElement&&e.playPauseBtn.buttonElement.querySelector("img")){var t=e.player.video.paused?f:m;e.playPauseBtn.buttonElement.querySelector("img").setAttribute("src",t),e.playPauseBtn.buttonElement.style.backgroundColor="rgba(255, 255, 255)"}}),this.playPauseBtn.buttonElement.addEventListener("blur",function(){if(e.playPauseBtn&&e.playPauseBtn.buttonElement&&e.playPauseBtn.buttonElement.querySelector("img")){var t=e.player.video.paused?h:p;e.playPauseBtn.buttonElement.querySelector("img").setAttribute("src",t),e.playPauseBtn.buttonElement.style.backgroundColor="rgba(255, 255, 255, 0.5)"}}))}},{key:"updatePlayPauseButton",value:function(){if(this.playPauseBtn&&this.playPauseBtn.buttonElement&&this.seekbar.focused){var e=this.player.video.paused?h:p;this.playPauseBtn.buttonElement.querySelector("img").setAttribute("src",e)}}},{key:"createSeekbar",value:function(){var e=this;this.player.video&&(this.seekbar=new r(this.player.video),this.seekbar.mount(this.container),this.player.video.addEventListener("play",function(){return e.updatePlayPauseButton()}),this.player.video.addEventListener("pause",function(){return e.updatePlayPauseButton()}))}},{key:"addEventListeners",value:function(){var e=this;if(this.playPauseBtn&&this.playPauseBtn.buttonElement){this.playPauseBtn.buttonElement.addEventListener("keydown",function(t){"ArrowDown"===t.key&&(t.preventDefault(),t.stopPropagation(),e.settingsBtn?e.settingsBtn.focus():e.restartVideoBtn?e.restartVideoBtn.focus():e.seekbar&&e.seekbar.focus())}),this.settingsBtn&&this.settingsBtn.buttonElement&&this.settingsBtn.buttonElement.addEventListener("keydown",function(t){"ArrowDown"===t.key?(t.preventDefault(),t.stopPropagation(),e.seekbar&&e.seekbar.focus()):"ArrowUp"===t.key?(t.preventDefault(),t.stopPropagation(),e.playPauseBtn&&e.playPauseBtn.focus()):"ArrowRight"===t.key&&(t.preventDefault(),t.stopPropagation(),e.restartVideoBtn&&e.restartVideoBtn.focus())}),this.restartVideoBtn&&this.restartVideoBtn.buttonElement&&this.restartVideoBtn.buttonElement.addEventListener("keydown",function(t){"ArrowDown"===t.key?(t.preventDefault(),t.stopPropagation(),e.seekbar&&e.seekbar.focus()):"ArrowUp"===t.key?(t.preventDefault(),t.stopPropagation(),e.playPauseBtn&&e.playPauseBtn.focus()):"ArrowLeft"===t.key&&(t.preventDefault(),t.stopPropagation(),e.settingsBtn&&e.settingsBtn.focus())});var t=this.seekbar.getElement&&this.seekbar.getElement();t&&t.addEventListener("keydown",function(t){"ArrowUp"===t.key&&(t.preventDefault(),t.stopPropagation(),e.settingsBtn?e.settingsBtn.focus():e.restartVideoBtn?e.restartVideoBtn.focus():e.playPauseBtn&&e.playPauseBtn.focus())})}}},{key:"createSettingsBtn",value:function(){var e=this;this.settingsBtn=new a({imgSrc:"a74cd46ed4277568.png",imgAltText:"Settings",buttonText:"Settings",width:40,height:40,klassname:"settings-btn",focused:!1,disabled:!1,handleClick:function(){e.createSideBar()}}),this.settingsBtn.mount(this.rightSideContainer)}},{key:"createRestartVideoBtn",value:function(){var e=this;this.restartVideoBtn=new a({imgSrc:"",imgAltText:"Start From Beginning",buttonText:"Start From Beginning",width:150,height:35,klassname:"restart-btn",focused:!1,disabled:!1,handleClick:function(){e.player.video&&(e.player.video.currentTime=0)}}),this.restartVideoBtn.mount(this.rightSideContainer)}},{key:"createTextContent",value:function(){this.textContent=new l({text:this.videoTitleConfig.text,fontSize:this.videoTitleConfig.fontSize,color:this.videoTitleConfig.color,fontWeight:this.videoTitleConfig.bold}),this.textContent.mount(this.leftSideContainer)}},{key:"changePlayBackQuality",value:function(e){this.selectedPlaybackQuality=e;var t=this.player.videoResolutions();if(t&&0!==t.length){if("auto"==e)this.selectedVideoQuality="auto",this.drmEnabled||(this.player.playerInstance.currentLevel=-1);else for(var i=0;i<(null==t?void 0:t.length);i++)if(t[i].height==e){this.selectedVideoQuality=t[i].height,this.drmEnabled?this.player.playerInstance.setQualityFor("video",i):this.player.playerInstance.currentLevel=i;break}}else console.warn("No video resolutions available to change playback quality.")}},{key:"changePlaybackCaptions",value:function(e){var t=this.player.captionsOptions();if(t&&0!==t.length)for(var i=["captions","subtitles","caption","subtitle"],n=0;n<t.length;n++)i.includes(t[n].kind.toLowerCase())&&(t[n].language===e?(this.selectedPlaybackCaption=e,t[n].mode="showing"):t[n].mode="disabled");else console.warn("No text tracks available to change playback captions.")}},{key:"changePlaybackAudio",value:function(e){var t=this.player.audioTracks();if(t&&0!==t.length){for(var i=0;i<t.length;i++)if(t[i].id==e||t[i].lang==e){this.selectedAudioQuality=e,this.drmEnabled?this.player.playerInstance.setCurrentTrack(t[i]):this.player.playerInstance.audioTrack=i;break}}else console.warn("No audio tracks available to change playback audio.")}},{key:"videoQualitySelector",value:function(){var e=this;if(this.mainSidebar){var t=this.player.videoResolutions(),i=this.selectedVideoQuality,s=[{text:"Auto",id:"auto",isSelected:"auto"===i,callback:function(){e.mainSidebar.currentFocusedOption.focus(),e.sidebar.unmount()}}].concat(n(t.map(function(t){return{text:"".concat(t.height,"p"),id:t.height,isSelected:i===t.height,callback:function(){e.mainSidebar.currentFocusedOption.focus(),e.sidebar.unmount()}}})));this.sidebar=new c({title:"Video Quality",items:s,klassname:"default-sidebar",lastFocusedElement:this.mainSidebar.currentFocusedOption,type:"selection",focused:!0,onselect:function(t){e.changePlayBackQuality(t.id)},callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="visible")}}),this.sidebar.mount(this.container)}}},{key:"audioLanguageSelector",value:function(){var e=this;if(this.mainSidebar){var t=this.player.audioTracks(),i=this.selectedAudioQuality;this.sidebar=new c({title:"Audio Language",items:t.map(function(n,s){return{id:n.id||n.lang,text:n.name||n.lang,isSelected:1===t.length||(i?i===n.id:n.default),callback:function(){e.mainSidebar.currentFocusedOption.focus(),e.sidebar.unmount()}}}),klassname:"default-sidebar",lastFocusedElement:this.mainSidebar.currentFocusedOption,type:"selection",focused:!0,onselect:function(t){e.changePlaybackAudio(t.id)},callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="visible")}}),this.sidebar.mount(this.container)}}},{key:"subtitlesSelector",value:function(){var e=this;if(this.mainSidebar){var t=this.player.captionsOptions(),i=this.selectedPlaybackCaption,s=[{id:"off",text:"Off",isSelected:"off"===i,callback:function(){e.mainSidebar.currentFocusedOption.focus(),e.sidebar.unmount()}}].concat(n(t.map(function(t){return{id:t.language,text:t.label,isSelected:i===t.language||"showing"===t.mode,callback:function(){e.mainSidebar.currentFocusedOption.focus(),e.sidebar.unmount()}}})));this.sidebar=new c({title:"Subtitles",items:s,klassname:"default-sidebar",lastFocusedElement:this.mainSidebar.currentFocusedOption,type:"selection",focused:!0,callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="visible")},onselect:function(t){e.changePlaybackCaptions(t.id)}}),this.sidebar.mount(this.container)}}},{key:"createSideBar",value:function(){var e=this,t=[{text:"Video Quality",isSelected:!0,callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="hidden"),e.videoQualitySelector()}}];this.player.audioTracks()&&this.player.audioTracks().length>0&&t.push({text:"Audio Language",isSelected:!1,callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="hidden"),e.audioLanguageSelector()}}),this.player.captionsOptions()&&this.player.captionsOptions().length>0&&t.push({text:"Subtitles",isSelected:!1,callback:function(){e.mainSidebar.sidebarElement&&(e.mainSidebar.sidebarElement.style.visibility="hidden"),e.subtitlesSelector()}}),this.mainSidebar=new c({title:"Settings",items:t,klassname:"default-sidebar",lastFocusedElement:this.settingsBtn.buttonElement,type:"navigation",focused:!0}),this.mainSidebar.mount(this.container)}},{key:"attachTo",value:function(e){if(!(e&&e instanceof HTMLElement))throw new Error("VideoPlayerUI: parent must be a valid DOM element");e.appendChild(this.container)}},{key:"getElement",value:function(){return this.container}},{key:"unmount",value:function(){this.playPauseBtn&&this.playPauseBtn.buttonElement&&(this.playPauseBtn.buttonElement.removeEventListener("focus",this.updatePlayPauseButton),this.playPauseBtn.buttonElement.removeEventListener("blur",this.updatePlayPauseButton),this.playPauseBtn.buttonElement.removeEventListener("keydown",this.handlePlayPauseKeydown)),this.player.video&&(this.player.video.removeEventListener("play",this.updatePlayPauseButton),this.player.video.removeEventListener("pause",this.updatePlayPauseButton)),this.container&&this.container.remove()}}])}(),y=function(e){var t=e.match(/^(?:([0-9]+):)?([0-5][0-9]):([0-5][0-9](?:[.,][0-9]{0,3})?)/);if(null==t)throw"Invalid timestamp format: "+e;var i=parseInt(t[1]||"0",10),n=parseInt(t[2],10);return parseFloat(t[3].replace(",","."))+60*n+3600*i},b=function(){return i(function e(i,n,s){t(this,e),this.mountPoint=document.createElement("div"),this.mountPoint.id=n,this.mountPoint.className="vl-player-container",this.mountPoint.style.width="100%",this.mountPoint.style.height="100%",this.mountPoint.style.position="absolute",this.mountPoint.style.top="0",this.mountPoint.style.left="0",this.parentContainerId?(this.parentContainer=document.getElementById(i),this.parentContainer.appendChild(this.mountPoint)):document.body.appendChild(this.mountPoint),this.config=s,this.hls=null,this.dashjs=null,this.closedCaptions=s.closedCaptions||[],this.enableTrack=s.enableTrack||!1,this.captionsOptionsList=[],this.videoResolutionsList=[],this.audioList=[],this.video=document.createElement("video"),this.video.style.position="absolute",this.track=document.createElement("ttml-rendering-div"),this.video.appendChild(this.track),this.initializePlayer()},[{key:"getCaptionsOptions",value:function(){return this.captionsOptionsList}},{key:"getVideoResolutions",value:function(){return this.videoResolutionsList}},{key:"getAudioTracks",value:function(){return this.audioList}},{key:"initializePlayer",value:function(){var e=this,t=this.config.streamUrl||"";if(!t)throw new Error("Stream URL is required to create HLS player");if(this.video.controls=!1,this.video.style.width="100%",this.video.style.height="100%",this.addPlayerEventListeners(),this.config.drmEnabled){this.dashjs=window.dashjs.MediaPlayer().create();var i=this.config.drmMetadata.widevine,n=this.config.drmMetadata.playReady,s={"com.widevine.alpha":{serverURL:i.licenseUrl,httpRequestHeaders:{"X-AxDRM-Message":i.licenseToken}},"com.microsoft.playready":{serverURL:n.licenseUrl,httpRequestHeaders:{"X-AxDRM-Message":n.licenseToken}}};this.dashjs.initialize(this.video,i.url,!0),this.dashjs.attachTTMLRenderingDiv(this.track),this.dashjs.attachView(this.video),this.dashjs.setProtectionData(s),this.dashjs.preload()}else if(window.Hls&&window.Hls.isSupported()){this.hls=new window.Hls({enableWorker:!0,lowLatencyMode:!0,backBufferLength:90,maxBufferLength:12,maxMaxBufferLength:15,maxFragLookUpTolerance:.25,maxLoadingDelay:4}),this.hls.loadSource(t),this.hls.attachMedia(this.video)}else{if(!this.video.canPlayType("application/vnd.apple.mpegurl"))throw new Error("HLS is not supported in this browser.");this.video.src=t,this.video.addEventListener("loadedmetadata",function(){e.video.play()})}this.config.drmEnabled?this.dashjs.on(dashjs.MediaPlayer.events.STREAM_INITIALIZED,function(){e.videoResolutionsList=e.dashjs.getBitrateInfoListFor("video"),e.audioList=e.dashjs.getTracksFor("audio"),e.captionsoptionsList=e.dashjs.getTracksFor("text"),e.player={video:e.video,play:function(){return e.video.play()},pause:function(){return e.video.pause()},captionsOptions:function(){return e.getCaptionsOptions()},videoResolutions:function(){return e.getVideoResolutions()},audioTracks:function(){return e.getAudioTracks()},playerInstance:e.dashjs},e.ui=new v({player:e.player,config:e.config}),e.ui.attachTo(e.mountPoint)}):(this.hls.on(window.Hls.Events.AUDIO_TRACKS_UPDATED,function(){e.audioList=e.hls.audioTracks}),this.hls.on(window.Hls.Events.MANIFEST_PARSED,function(){e.videoResolutionsList=e.hls.levels,e.player={video:e.video,play:function(){return e.video.play()},pause:function(){return e.video.pause()},captionsOptions:function(){return e.getCaptionsOptions()},videoResolutions:function(){return e.getVideoResolutions()},audioTracks:function(){return e.getAudioTracks()},playerInstance:e.hls},e.ui=new v({player:e.player,config:e.config}),e.ui.attachTo(e.mountPoint)}))}},{key:"addPlayerEventListeners",value:function(){this.video&&(this.video.addEventListener("loadedmetadata",this.onVideoLoad),this.video.addEventListener("canplaythrough",this.canplaythrough.bind(this)),this.video.addEventListener("ended",this.onPlayebackEnded),this.video.addEventListener("timeupdate",this.playbackprogress),this.video.addEventListener("playing",this.onPlaying),this.video.addEventListener("error",this.onError),this.video.addEventListener("waiting",this.onBuffering),this.video.addEventListener("play",this.onPlay),this.video.addEventListener("seeked",this.onSeeked),this.video.addEventListener("stalled",this.onStalled))}},{key:"removePlayerEventListeners",value:function(){this.video&&(this.video.removeEventListener("loadedmetadata",this.onVideoLoad),this.video.removeEventListener("ended",this.onPlayebackEnded),this.video.removeEventListener("timeupdate",this.playbackprogress),this.video.removeEventListener("playing",this.onPlaying),this.video.removeEventListener("error",this.onError),this.video.removeEventListener("waiting",this.onBuffering),this.video.removeEventListener("play",this.onPlay),this.video.removeEventListener("canplaythrough",this.canplaythrough.bind(this)),this.video.removeEventListener("seeked",this.onSeeked),this.video.removeEventListener("stalled",this.onStalled))}},{key:"canplaythrough",value:function(){if(this.captionsOptionsList.length<=0){this.addAllCaptionsToPlayer(0);var e=this.video.textTracks;if(null!=e&&e.length>0)for(var t=0;t<e.length;t++)"captions"!=e[t].kind.toLowerCase()&&"subtitles"!=e[t].kind.toLowerCase()&&"caption"!=e[t].kind.toLowerCase()&&"subtitle"!=e[t].kind.toLowerCase()||this.captionsOptionsList.push(e[t])}console.log("TEXT TRACKS:",this.captionsOptionsList),console.log("VIDEO RESOLUTION:",this.videoResolutionsList),console.log("AUDIO TRACKS:",this.audioList)}},{key:"addAllCaptionsToPlayer",value:function(e){var t=this;if(!(e>=this.closedCaptions.length)){var i=this.closedCaptions[e].language;fetch(this.closedCaptions[e].url).then(function(e){return e.json()}).then(function(n){if(n.hasOwnProperty("type"))"failure"===n.type&&t.addAllCaptionsToPlayer(e+1);else{var s={data:n,label:i,lang:i};t.addCaptionToPlayer(s),t.addAllCaptionsToPlayer(e+1)}}).catch(function(i){t.addAllCaptionsToPlayer(e+1)})}}},{key:"addCaptionToPlayer",value:function(e){var t,i=null===(t=this.player)||void 0===t||null===(t=t.video)||void 0===t?void 0:t.addTextTrack("captions",e.label,e.lang);i&&(i.mode="hidden"),function(e){try{var t=e.trim().split(/[\r\n\r\n]/).map(function(e){return e.trim()})}catch(i){try{t=e.message.split(/[\r\n\r\n]/).map(function(e){return e.trim()})}catch(e){return[]}}for(var i=[],n=null,s=null,o=null,a=0;a<t.length;a++)if(t[a].indexOf("--\x3e")>=0){var r,l=t[a].split(/[ \t]+-->[ \t]+/);if(2!=l.length)throw'Error when splitting "--\x3e": '+t[a];null!=n&&null!=s&&null!=o&&((r=new VTTCue(n,s,o)).line=13,i.push(r)),o=null,n=null,s=null,l[0]&&l[1]&&-1==l[0].indexOf("undefined")&&-1==l[1].indexOf("undefined")&&(n=y(l[0]),s=y(l[1]))}else if(null!=t[a]&&""!=t[a].trim())try{Number(t[a])>0||(o=""==(o=null==o?"":o).trim()?t[a]:o+"\n"+t[a])}catch(e){o=""==(o=null==o?"":o).trim()?t[a]:o+"\n"+t[a]}return n&&s&&o&&((r=new VTTCue(n,s,o)).line=13,i.push(r)),i}(e.data).map(function(e){i&&i.addCue(e)})}},{key:"toggleCaptions",value:function(){try{if(!this.video)return;var e=this.video.textTracks;if(e&&e.length>0)for(var t=0;t<e.length;t++){var i,n=e[t],s=null===(i=n.kind)||void 0===i?void 0:i.toLowerCase();if(["captions","subtitles","caption","subtitle"].includes(s))if(this.enableTrack)n.mode="hidden";else{var o;if((null===(o=n.cues)||void 0===o?void 0:o.length)>0){n.mode="showing";break}n.mode="disabled"}}}catch(e){console.error("Error managing captions:",e)}this.track&&(this.track.style.display=this.enableTrack?"none":"flex")}},{key:"onVideoLoad",value:function(){console.log("Video metadata loaded")}},{key:"onPlayebackEnded",value:function(){console.log("Playback ended")}},{key:"playbackprogress",value:function(){console.log("Playback progress updated")}},{key:"onPlaying",value:function(){console.log("Video is playing")}},{key:"onError",value:function(e){console.error("Video error:",e)}},{key:"onBuffering",value:function(){console.log("Video is buffering")}},{key:"onPlay",value:function(){console.log("Video started playing")}},{key:"onSeeked",value:function(){console.log("Video seeked")}},{key:"onStalled",value:function(){console.log("Video stalled")}},{key:"unmount",value:function(){this.mountPoint.remove(),this.mountPoint=void 0}}])}();exports.createHlsPlayer=function(e,t,i){if(!t)throw new Error("playerId must be a valid id");if(!i||"object"!==o(i))throw new Error("Config must be a valid object");return new b(e,t,i)};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGxheWVyLWNvbXBvbmVudHMvcGxheWVyLWJ1dHRvbnMvcGxheWVyQnV0dG9ucy5qcyIsIi4uL3NyYy9wbGF5ZXItY29tcG9uZW50cy9wbGF5ZXItc2Vla2Jhci9wbGF5ZXJTZWVrYmFyLmpzIiwiLi4vc3JjL3BsYXllci1jb21wb25lbnRzL3BsYXllci10aXRsZS9wbGF5ZXJUaXRsZS5qcyIsIi4uL3NyYy9wbGF5ZXItY29tcG9uZW50cy9wbGF5ZXItc2V0dGluZy1vcHRpb24td3JhcHBlci9wbGF5ZXItc2V0dGluZy1vcHRpb24tb25lLXdyYXBwZXIuanMiLCIuLi9zcmMvcGxheWVyLWNvbXBvbmVudHMvcGxheWVyLXNldHRpbmctb3B0aW9uLXdyYXBwZXIvcGxheWVyLXNldHRpbmctb3B0aW9uLXR3by13cmFwcGVyLmpzIiwiLi4vc3JjL2Fzc2V0cy9jaGVja0ljb24ucG5nIiwiLi4vc3JjL3BsYXllci1jb21wb25lbnRzL3BsYXllci1zaWRlYmFyL3BsYXllci1zaWRlYmFyLmpzIiwiLi4vc3JjL2Fzc2V0cy9wbGF5SWNvbi5wbmciLCIuLi9zcmMvYXNzZXRzL3BhdXNlSWNvbi5wbmciLCIuLi9zcmMvYXNzZXRzL3BsYXlJY29uRm9jdXMucG5nIiwiLi4vc3JjL2Fzc2V0cy9wYXVzZUljb25Gb2N1cy5wbmciLCIuLi9zcmMvcGxheWVyLXVpL3BsYXllci11aS5qcyIsIi4uL3NyYy9hc3NldHMvc2V0dGluZ3NJY29uLnBuZyIsIi4uL3NyYy91dGlsaXRpZXMvdXRpbGl0aWVzLmpzIiwiLi4vc3JjL3BsYXllckluaXRpYWxpemVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnV0dG9uIENsYXNzOiBwcm9wcyBhcmUgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1nU3JjID0gcHJvcHMuaW1nU3JjIHx8ICcnO1xuICAgICAgICB0aGlzLmltZ0FsdFRleHQgPSBwcm9wcy5pbWdBbHRUZXh0IHx8ICcnO1xuICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSBwcm9wcy5idXR0b25UZXh0IHx8ICcnO1xuICAgICAgICB0aGlzLmtsYXNzbmFtZSA9IHByb3BzLmtsYXNzbmFtZSB8fCAnZGVmYXVsdC1idXR0b24nO1xuICAgICAgICB0aGlzLndpZHRoID0gcHJvcHMud2lkdGggfHwgMTAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHByb3BzLmhlaWdodCB8fCA1MDtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gcHJvcHMuZm9jdXNlZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gcHJvcHMuaGFuZGxlQ2xpY2sgfHwgKCgpID0+IHt9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFuZGxlQ2xpY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnV0dG9uIENsYXNzOiBoYW5kbGVDbGljayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtsYXNzbmFtZSArPSAnIGRpc2FibGVkJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMua2xhc3NuYW1lICs9ICcgZm9jdXNlZCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gdGhpcy5oYW5kbGVDbGljay5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5idXR0b25FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5idXR0b25FbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1vdW50KG1vdW50UG9pbnQpIHtcbiAgICAgICAgaWYgKCFtb3VudFBvaW50IHx8ICEobW91bnRQb2ludCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdXR0b24gQ2xhc3M6IG1vdW50UG9pbnQgbXVzdCBiZSBhIHZhbGlkIERPTSBlbGVtZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9IHRoaXMua2xhc3NuYW1lO1xuICAgICAgICBidXR0b24uc3R5bGUud2lkdGggPSBgJHt0aGlzLndpZHRofXB4YDtcbiAgICAgICAgYnV0dG9uLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuaGVpZ2h0fXB4YDtcbiAgICAgICAgYnV0dG9uLnRhYkluZGV4ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5pbWdTcmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICAgICAgaW1nLnNyYyA9IHRoaXMuaW1nU3JjO1xuICAgICAgICAgICAgaW1nLmFsdCA9IHRoaXMuaW1nQWx0VGV4dDtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQnV0dG9uIENsYXNzOiBGYWlsZWQgdG8gbG9hZCBpbWFnZSBhdCcsIHRoaXMuaW1nU3JjKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gdGhpcy5idXR0b25UZXh0O1xuICAgICAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgICAgfVxuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICdPSycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQgPSBidXR0b247XG4gICAgICAgIG1vdW50UG9pbnQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICB9XG5cbiAgICB1bm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5idXR0b25FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59IiwiZXhwb3J0IGNsYXNzIFBsYXllclNlZWtiYXIge1xuICBjb25zdHJ1Y3Rvcih2aWRlbykge1xuICAgIGlmICghdmlkZW8gfHwgISh2aWRlbyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsYXllclNlZWtiYXI6IEEgdmFsaWQgSFRNTFZpZGVvRWxlbWVudCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHRoaXMudmlkZW8gPSB2aWRlbztcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5wcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgIHRoaXMudGh1bWIgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XG4gICAgdGhpcy50aW1lTGFiZWwgPSBudWxsO1xuICAgIHRoaXMuZHVyYXRpb25MYWJlbCA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSAnc2Vla2Jhci1jb250YWluZXInO1xuXG4gICAgdGhpcy5idWZmZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmJ1ZmZlci5jbGFzc05hbWUgPSAnc2Vla2Jhci1idWZmZXInO1xuXG4gICAgdGhpcy5wcm9ncmVzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucHJvZ3Jlc3MuY2xhc3NOYW1lID0gJ3NlZWtiYXItcHJvZ3Jlc3MnO1xuXG4gICAgdGhpcy50aHVtYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMudGh1bWIuY2xhc3NOYW1lID0gJ3NlZWtiYXItdGh1bWInO1xuICAgIHRoaXMudGh1bWIudGFiSW5kZXggPSAwOyAvLyBNYWtlIHRodW1iIGZvY3VzYWJsZVxuXG4gICAgdGhpcy50b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy50b29sdGlwLmNsYXNzTmFtZSA9ICdzZWVrYmFyLXRvb2x0aXAnO1xuICAgIHRoaXMudG9vbHRpcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgdGhpcy50aW1lTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGhpcy50aW1lTGFiZWwuY2xhc3NOYW1lID0gJ3NlZWtiYXItdGltZS1sYWJlbCc7XG4gICAgdGhpcy5kdXJhdGlvbkxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMuZHVyYXRpb25MYWJlbC5jbGFzc05hbWUgPSAnc2Vla2Jhci1kdXJhdGlvbi1sYWJlbCc7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmJ1ZmZlcik7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wcm9ncmVzcyk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50aHVtYik7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRpbWVMYWJlbCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kdXJhdGlvbkxhYmVsKTtcblxuICAgIC8vIFVwZGF0ZSBVSSBhcyB2aWRlbyBwbGF5c1xuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsICgpID0+IHRoaXMudXBkYXRlKCkpO1xuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCAoKSA9PiB0aGlzLnVwZGF0ZUJ1ZmZlcigpKTtcbiAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2R1cmF0aW9uY2hhbmdlJywgKCkgPT4gdGhpcy51cGRhdGUoKSk7XG5cbiAgICAvLyBTZWVrIG9uIGNsaWNrXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5zZWVrKGUpKTtcbiAgICAvLyBEcmFnZ2luZ1xuICAgIHRoaXMudGh1bWIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHRoaXMuc3RhcnREcmFnKGUpKTtcbiAgICAvLyBUb29sdGlwIG9uIGhvdmVyXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGUpID0+IHRoaXMuc2hvd1Rvb2x0aXAoZSkpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmhpZGVUb29sdGlwKCkpO1xuXG4gICAgLy8gRm9jdXMvYmx1ciBldmVudHMgZm9yIGFjY2Vzc2liaWxpdHkgYW5kIHZpc3VhbCBmZWVkYmFja1xuICAgIHRoaXMudGh1bWIuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgdGhpcy50aHVtYi5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgfSk7XG4gICAgdGhpcy50aHVtYi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnRodW1iLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBrZXlkb3duIGV2ZW50IGxpc3RlbmVycyBmb3IgYXJyb3cga2V5cyB0byBzaW11bGF0ZSBkcmFnZ2luZ1xuICAgIHRoaXMudGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICBjb25zdCBpbmNyZW1lbnQgPSAxOyBcbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy52aWRlby5jdXJyZW50VGltZSA9IE1hdGgubWluKHRoaXMudmlkZW8uZHVyYXRpb24sIHRoaXMudmlkZW8uY3VycmVudFRpbWUgKyBpbmNyZW1lbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gTWF0aC5tYXgoMCwgdGhpcy52aWRlby5jdXJyZW50VGltZSAtIGluY3JlbWVudCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYodGhpcy52aWRlby5wYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTsgLy8gUmVzdW1lIHBsYXlpbmcgdGhlIHZpZGVvXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIGlmICh0aGlzLnRodW1iKSB7XG4gICAgICB0aGlzLnRodW1iLmZvY3VzKCk7XG4gICAgICB0aGlzLnRodW1iLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmx1cigpIHtcbiAgICBpZiAodGhpcy50aHVtYikge1xuICAgICAgdGhpcy50aHVtYi5ibHVyKCk7XG4gICAgICB0aGlzLnRodW1iLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kcykge1xuICAgIGlmIChpc05hTihzZWNvbmRzKSkgcmV0dXJuICcwOjAwJztcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHMgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7XG4gICAgcmV0dXJuIGAke219OiR7U3RyaW5nKHMpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMudmlkZW8gfHwgIXRoaXMucHJvZ3Jlc3MgfHwgIXRoaXMudGh1bWIgfHwgIXRoaXMudGltZUxhYmVsIHx8ICF0aGlzLmR1cmF0aW9uTGFiZWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBlcmNlbnQgPSAodGhpcy52aWRlby5jdXJyZW50VGltZSAvIHRoaXMudmlkZW8uZHVyYXRpb24pICogMTAwO1xuICAgIHRoaXMucHJvZ3Jlc3Muc3R5bGUud2lkdGggPSBwZXJjZW50ICsgJyUnO1xuICAgIHRoaXMudGh1bWIuc3R5bGUubGVmdCA9IHBlcmNlbnQgKyAnJSc7XG4gICAgdGhpcy50aW1lTGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLmZvcm1hdFRpbWUodGhpcy52aWRlby5jdXJyZW50VGltZSk7XG4gICAgdGhpcy5kdXJhdGlvbkxhYmVsLnRleHRDb250ZW50ID0gJyAvICcgKyB0aGlzLmZvcm1hdFRpbWUodGhpcy52aWRlby5kdXJhdGlvbik7XG4gIH1cblxuICB1cGRhdGVCdWZmZXIoKSB7XG4gICAgaWYgKCF0aGlzLnZpZGVvIHx8ICF0aGlzLmJ1ZmZlcikgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudmlkZW8uYnVmZmVyZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnZpZGVvLmJ1ZmZlcmVkLmVuZCh0aGlzLnZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCAtIDEpO1xuICAgICAgY29uc3QgcGVyY2VudCA9IChlbmQgLyB0aGlzLnZpZGVvLmR1cmF0aW9uKSAqIDEwMDtcbiAgICAgIHRoaXMuYnVmZmVyLnN0eWxlLndpZHRoID0gcGVyY2VudCArICclJztcbiAgICB9XG4gIH1cblxuICBzZWVrKGUpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nIHx8ICF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy52aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBlcmNlbnQgPSAoZS5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7XG4gICAgdGhpcy52aWRlby5jdXJyZW50VGltZSA9IHBlcmNlbnQgKiB0aGlzLnZpZGVvLmR1cmF0aW9uO1xuICB9XG5cbiAgc3RhcnREcmFnKGUpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnZpZGVvKSByZXR1cm47XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBvbk1vdmUgPSAobW92ZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBsZXQgcGVyY2VudCA9IChtb3ZlRXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgICAgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHBlcmNlbnQpKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3Muc3R5bGUud2lkdGggPSBwZXJjZW50ICogMTAwICsgJyUnO1xuICAgICAgdGhpcy50aHVtYi5zdHlsZS5sZWZ0ID0gcGVyY2VudCAqIDEwMCArICclJztcbiAgICAgIHRoaXMudGltZUxhYmVsLnRleHRDb250ZW50ID0gdGhpcy5mb3JtYXRUaW1lKHBlcmNlbnQgKiB0aGlzLnZpZGVvLmR1cmF0aW9uKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uVXAgPSAodXBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbGV0IHBlcmNlbnQgPSAodXBFdmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7XG4gICAgICBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcGVyY2VudCkpO1xuICAgICAgdGhpcy52aWRlby5jdXJyZW50VGltZSA9IHBlcmNlbnQgKiB0aGlzLnZpZGVvLmR1cmF0aW9uO1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gIH1cblxuICBzaG93VG9vbHRpcChlKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy50b29sdGlwIHx8ICF0aGlzLnZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcGVyY2VudCA9IChlLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDtcbiAgICBjb25zdCB0aW1lID0gcGVyY2VudCAqIHRoaXMudmlkZW8uZHVyYXRpb247XG4gICAgdGhpcy50b29sdGlwLnRleHRDb250ZW50ID0gdGhpcy5mb3JtYXRUaW1lKHRpbWUpO1xuICAgIHRoaXMudG9vbHRpcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLnRvb2x0aXAuc3R5bGUubGVmdCA9IGAke3BlcmNlbnQgKiAxMDB9JWA7XG4gIH1cblxuICBoaWRlVG9vbHRpcCgpIHtcbiAgICBpZiAodGhpcy50b29sdGlwKSB7XG4gICAgICB0aGlzLnRvb2x0aXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICBnZXRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRodW1iO1xuICB9XG5cbiAgbW91bnQocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxheWVyU2Vla2JhcjogcGFyZW50IG11c3QgYmUgYSB2YWxpZCBET00gZWxlbWVudCcpO1xuICAgIH1cblxuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZUJ1ZmZlcigpO1xuICB9XG5cbiAgdW5tb3VudCgpIHtcbiAgICBpZiAoIXRoaXMudmlkZW8gfHwgIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnRodW1iKSByZXR1cm47XG5cbiAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMudXBkYXRlQnVmZmVyKTtcbiAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zZWVrKTtcbiAgICB0aGlzLnRodW1iLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuc3RhcnREcmFnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnNob3dUb29sdGlwKTtcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5oaWRlVG9vbHRpcCk7XG4gICAgdGhpcy50aHVtYi5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZm9jdXMpO1xuICAgIHRoaXMudGh1bWIucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuYmx1cik7XG4gICAgdGhpcy50aHVtYi5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duSGFuZGxlcik7XG5cbiAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFRleHRDb250ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBpZiAoIXByb3BzIHx8IHR5cGVvZiBwcm9wcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dENvbnRlbnQ6IHByb3BzIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dCA9IHByb3BzLnRleHQgfHwgJyc7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBwcm9wcy5mb250U2l6ZSB8fCAnMTZweCc7XG4gICAgICAgIHRoaXMuZm9udEZhbWlseSA9IHByb3BzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJztcbiAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gcHJvcHMuZm9udFdlaWdodCB8fCAnbm9ybWFsJztcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSBwcm9wcy50ZXh0QWxpZ24gfHwgJ2xlZnQnO1xuICAgICAgICB0aGlzLnRleHREZWNvcmF0aW9uID0gcHJvcHMudGV4dERlY29yYXRpb24gfHwgJ25vbmUnO1xuICAgICAgICB0aGlzLnRleHRUcmFuc2Zvcm0gPSBwcm9wcy50ZXh0VHJhbnNmb3JtIHx8ICdub25lJztcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gcHJvcHMubGluZUhlaWdodCB8fCAnbm9ybWFsJztcbiAgICAgICAgdGhpcy5sZXR0ZXJTcGFjaW5nID0gcHJvcHMubGV0dGVyU3BhY2luZyB8fCAnbm9ybWFsJztcbiAgICAgICAgdGhpcy5jb2xvciA9IHByb3BzLmNvbG9yIHx8ICcjMDAwJztcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBwcm9wcy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3RyYW5zcGFyZW50JztcbiAgICAgICAgdGhpcy5rbGFzc25hbWUgPSBwcm9wcy5rbGFzc25hbWUgfHwgJ2RlZmF1bHQtdGV4dC1jb250ZW50JztcbiAgICAgICAgdGhpcy53aWR0aCA9IHByb3BzLndpZHRoIHx8IDEwMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBwcm9wcy5oZWlnaHQgfHwgNTA7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0VGV4dCh0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dENvbnRlbnQ6IHRleHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbW91bnQobW91bnRQb2ludCkge1xuICAgICAgICBpZiAoIW1vdW50UG9pbnQgfHwgIShtb3VudFBvaW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHRDb250ZW50OiBtb3VudFBvaW50IG11c3QgYmUgYSB2YWxpZCBET00gZWxlbWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZXh0LmNsYXNzTmFtZSA9IHRoaXMua2xhc3NuYW1lO1xuICAgICAgICB0ZXh0LnN0eWxlLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgdGV4dC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICAgIHRleHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIHRleHQuaW5uZXJUZXh0ID0gdGhpcy50ZXh0O1xuICAgICAgICBtb3VudFBvaW50LmFwcGVuZENoaWxkKHRleHQpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRleHQ7XG4gICAgfVxuXG4gICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufSIsImV4cG9ydCBjbGFzcyBTZXR0aW5nc09wdGlvbk9uZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIGlmICghcHJvcHMgfHwgdHlwZW9mIHByb3BzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nc09wdGlvbk9uZVdyYXBwZXI6IHByb3BzIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBwcm9wcy50aXRsZSB8fCAnT3B0aW9uJztcbiAgICAgICAgdGhpcy5rbGFzc25hbWUgPSBwcm9wcy5rbGFzc25hbWUgfHwgJ2RlZmF1bHQtb3B0aW9uLXdyYXBwZXInO1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gcHJvcHMuY2FsbGJhY2sgfHwgKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gcHJvcHMuZm9jdXNlZCB8fCBmYWxzZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFuZGxlQ2xpY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2V0dGluZ3NPcHRpb25PbmVXcmFwcGVyOiBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgbW91bnQobW91bnRQb2ludCkge1xuICAgICAgICBpZiAoIW1vdW50UG9pbnQgfHwgIShtb3VudFBvaW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmdzT3B0aW9uT25lV3JhcHBlcjogbW91bnRQb2ludCBtdXN0IGJlIGEgdmFsaWQgRE9NIGVsZW1lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uV3JhcHBlci5jbGFzc05hbWUgPSB0aGlzLmtsYXNzbmFtZTtcbiAgICAgICAgb3B0aW9uV3JhcHBlci50YWJJbmRleCA9IDA7XG5cbiAgICAgICAgY29uc3QgdGl0bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICB0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlO1xuICAgICAgICBvcHRpb25XcmFwcGVyLmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgYXJyb3dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICBhcnJvd0VsZW1lbnQudGV4dENvbnRlbnQgPSBcIuKAulwiO1xuICAgICAgICBvcHRpb25XcmFwcGVyLmFwcGVuZENoaWxkKGFycm93RWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgb3B0aW9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIG9wdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3B0aW9uV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICBvcHRpb25XcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9uV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ09LJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyID0gb3B0aW9uV3JhcHBlcjtcbiAgICAgICAgb3B0aW9uV3JhcHBlci5pbnN0YW5jZSA9IHRoaXM7IC8vIFNldCB0aGUgaW5zdGFuY2UgcHJvcGVydHlcbiAgICAgICAgbW91bnRQb2ludC5hcHBlbmRDaGlsZChvcHRpb25XcmFwcGVyKTtcbiAgICB9XG5cbiAgICB1bm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25XcmFwcGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbldyYXBwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbldyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uV3JhcHBlcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJsdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbldyYXBwZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uV3JhcHBlci5ibHVyKCk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59ICAgICAgIFxuIiwiaW1wb3J0IGNoZWNrSWNvbiBmcm9tICcuLi8uLi9hc3NldHMvY2hlY2tJY29uLnBuZyc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc09wdGlvblR3b1dyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIGlmICghcHJvcHMgfHwgdHlwZW9mIHByb3BzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nc09wdGlvblR3b1dyYXBwZXI6IHByb3BzIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBwcm9wcy50aXRsZSB8fCAnT3B0aW9uJztcbiAgICAgICAgdGhpcy5rbGFzc25hbWUgPSBwcm9wcy5rbGFzc25hbWUgfHwgJ2RlZmF1bHQtb3B0aW9uLXdyYXBwZXInO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gcHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaW1nU3JjID0gcHJvcHMuaW1nU3JjIHx8IGNoZWNrSWNvbjtcbiAgICAgICAgdGhpcy5pZCA9IHByb3BzLmlkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aXRsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2V0dGluZ3NPcHRpb25Ud29XcmFwcGVyOiB0aXRsZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb3VudChtb3VudFBvaW50KSB7XG4gICAgICAgIGlmICghbW91bnRQb2ludCB8fCAhKG1vdW50UG9pbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2V0dGluZ3NPcHRpb25Ud29XcmFwcGVyOiBtb3VudFBvaW50IG11c3QgYmUgYSB2YWxpZCBET00gZWxlbWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBvcHRpb25XcmFwcGVyLmNsYXNzTmFtZSA9IHRoaXMua2xhc3NuYW1lO1xuICAgICAgICBvcHRpb25XcmFwcGVyLnRhYkluZGV4ID0gMDtcblxuICAgICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgIHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7XG4gICAgICAgIG9wdGlvbldyYXBwZXIuYXBwZW5kQ2hpbGQodGl0bGVFbGVtZW50KTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgb3B0aW9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICBpbWcuc3JjID0gdGhpcy5pbWdTcmM7XG4gICAgICAgICAgICBpbWcuYWx0ID0gdGhpcy5pbWdBbHRUZXh0IHx8ICdTZWxlY3RlZCc7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgICAgICAgIG9wdGlvbldyYXBwZXIuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9uV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICBvcHRpb25XcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbldyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgb3B0aW9uV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3B0aW9uV3JhcHBlciA9IG9wdGlvbldyYXBwZXI7XG4gICAgICAgIG9wdGlvbldyYXBwZXIuaW5zdGFuY2UgPSB0aGlzOyAvLyBTZXQgdGhlIGluc3RhbmNlIHByb3BlcnR5XG4gICAgICAgIG1vdW50UG9pbnQuYXBwZW5kQ2hpbGQob3B0aW9uV3JhcHBlcik7XG4gICAgfVxuXG4gICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uV3JhcHBlcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbldyYXBwZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uV3JhcHBlci5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBibHVyKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25XcmFwcGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbldyYXBwZXIuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25XcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufSAgICAgICBcbiIsImV4cG9ydCBkZWZhdWx0IFwiNTIyZWE3Yzc2YWM0ZmQzMy5wbmdcIiIsImltcG9ydCB7IFNldHRpbmdzT3B0aW9uT25lV3JhcHBlciB9IGZyb20gJy4uL3BsYXllci1zZXR0aW5nLW9wdGlvbi13cmFwcGVyL3BsYXllci1zZXR0aW5nLW9wdGlvbi1vbmUtd3JhcHBlci5qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc09wdGlvblR3b1dyYXBwZXIgfSBmcm9tICcuLi9wbGF5ZXItc2V0dGluZy1vcHRpb24td3JhcHBlci9wbGF5ZXItc2V0dGluZy1vcHRpb24tdHdvLXdyYXBwZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgU2lkZWJhciB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGViYXI6IHByb3BzIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBwcm9wcy50aXRsZSB8fCAnU2V0dGluZ3MnO1xuICAgICAgICB0aGlzLml0ZW1zID0gcHJvcHMuaXRlbXMgfHwgW1xuICAgICAgICAgICAge3RleHQ6ICdWaWRlbyBRdWFsaXR5JywgaXNTZWxlY3RlZDogdHJ1ZSwgY2FsbGJhY2s6ICgpID0+IHt9fSwgXG4gICAgICAgICAgICB7dGV4dDogJ0F1ZGlvIExhbmd1YWdlJywgaXNTZWxlY3RlZDogZmFsc2UsIGNhbGxiYWNrOiAoKSA9PiB7fX0sIFxuICAgICAgICAgICAge3RleHQ6ICdTdWJ0aXRsZXMnLCBpc1NlbGVjdGVkOiBmYWxzZSwgY2FsbGJhY2s6ICgpID0+IHt9fVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmtsYXNzbmFtZSA9IHByb3BzLmtsYXNzbmFtZSB8fCAnZGVmYXVsdC1zaWRlYmFyJztcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzZWRFbGVtZW50ID0gcHJvcHMubGFzdEZvY3VzZWRFbGVtZW50IHx8IG51bGw7XG4gICAgICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGUgfHwgJ25hdmlnYXRpb24nO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBwcm9wcy5mb2N1c2VkIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gcHJvcHMuY2FsbGJhY2sgfHwgKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5vbnNlbGVjdCA9IHByb3BzLm9uc2VsZWN0IHx8ICgoKSA9PiB7fSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGViYXI6IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFbJ25hdmlnYXRpb24nLCAnc2VsZWN0aW9uJ10uaW5jbHVkZXModGhpcy50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlYmFyOiB0eXBlIG11c3QgYmUgZWl0aGVyIFwibmF2aWdhdGlvblwiIG9yIFwic2VsZWN0aW9uXCInKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1vdW50KG1vdW50UG9pbnQpIHtcbiAgICAgICAgaWYgKCFtb3VudFBvaW50IHx8ICEobW91bnRQb2ludCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlYmFyOiBtb3VudFBvaW50IG11c3QgYmUgYSB2YWxpZCBET00gZWxlbWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2lkZWJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzaWRlYmFyLmNsYXNzTmFtZSA9IHRoaXMua2xhc3NuYW1lO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gyJyk7XG4gICAgICAgIHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7XG4gICAgICAgIHRpdGxlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICczOHB4JztcbiAgICAgICAgc2lkZWJhci5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gbmV3IFNldHRpbmdzT3B0aW9uT25lV3JhcHBlcih7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGtsYXNzbmFtZTogJ2RlZmF1bHQtb3B0aW9uLXdyYXBwZXInLFxuICAgICAgICAgICAgICAgICAgICBmb2N1c2VkOiBpZHggPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpdGVtLmNhbGxiYWNrXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaXRlbS5pbnN0YW5jZSA9IGxpc3RJdGVtOyAvLyBTdG9yZSB0aGUgbGlzdEl0ZW0gaW5zdGFuY2UgaW4gdGhlIGl0ZW1cbiAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRPcHRpb24gPSBsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW0ubW91bnQobGlzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdzZWxlY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gbmV3IFNldHRpbmdzT3B0aW9uVHdvV3JhcHBlcih7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGtsYXNzbmFtZTogJ2RlZmF1bHQtb3B0aW9uLXdyYXBwZXInLFxuICAgICAgICAgICAgICAgICAgICBmb2N1c2VkOiBpZHggPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpdGVtLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGl0ZW0uaW5zdGFuY2UgPSBsaXN0SXRlbTsgLy8gU3RvcmUgdGhlIGxpc3RJdGVtIGluc3RhbmNlIGluIHRoZSBpdGVtXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uID0gbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpc3RJdGVtLm1vdW50KGxpc3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzaWRlYmFyLmFwcGVuZENoaWxkKGxpc3QpO1xuICAgICAgICB0aGlzLnNpZGViYXJFbGVtZW50ID0gc2lkZWJhcjtcbiAgICAgICAgbW91bnRQb2ludC5hcHBlbmRDaGlsZChzaWRlYmFyKTtcblxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpZGViYXJFbGVtZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGViYXI6IHNpZGViYXJFbGVtZW50IGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaWRlYmFyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMudW5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMudW5tb3VudCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnT0snKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblR5cGVBY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlbGVjdGlvblR5cGVBY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uKSB7XG4gICAgICAgICAgICAvLyBEZXNlbGVjdCBhbGwgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uaW5zdGFuY2Uub3B0aW9uV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmluc3RhbmNlLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBpbWFnZSBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IGl0ZW0uaW5zdGFuY2Uub3B0aW9uV3JhcHBlci5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgY3VycmVudCBvcHRpb25cbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRPcHRpb24ub3B0aW9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBBZGQgaW1hZ2UgdG8gdGhlIHNlbGVjdGVkIG9wdGlvblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICBpbWcuc3JjID0gdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5pbWdTcmM7XG4gICAgICAgICAgICBpbWcuYWx0ID0gJ1NlbGVjdGVkJztcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5vcHRpb25XcmFwcGVyLmFwcGVuZENoaWxkKHNlbGVjdGVkRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLm9uc2VsZWN0KHRoaXMuY3VycmVudEZvY3VzZWRPcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXNOZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5zaWRlYmFyRWxlbWVudCAmJiB0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IHRoaXMuY3VycmVudEZvY3VzZWRPcHRpb24ub3B0aW9uV3JhcHBlci5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uLmJsdXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uID0gbmV4dFNpYmxpbmcuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXNQcmV2aW91cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhckVsZW1lbnQgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTaWJsaW5nID0gdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5vcHRpb25XcmFwcGVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5ibHVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbiA9IHByZXZpb3VzU2libGluZy5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkT3B0aW9uLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhckVsZW1lbnQgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5mb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhckVsZW1lbnQgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE9wdGlvbi5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zaWRlYmFyRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zaWRlYmFyRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2lkZWJhckVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Rm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRPcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgXCJlZDNkMGE0ZDlkZTkxNDYwLnBuZ1wiIiwiZXhwb3J0IGRlZmF1bHQgXCIzYmM4YjdmZjA0ZTk4ZDM3LnBuZ1wiIiwiZXhwb3J0IGRlZmF1bHQgXCJiNzM5ZmFlYzFmZGUxMzQ2LnBuZ1wiIiwiZXhwb3J0IGRlZmF1bHQgXCIzOGFmYzc5Yzk0ZTBiY2YwLnBuZ1wiIiwiaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi4vcGxheWVyLWNvbXBvbmVudHMvcGxheWVyLWJ1dHRvbnMvcGxheWVyQnV0dG9ucy5qcyc7XG5pbXBvcnQgeyBQbGF5ZXJTZWVrYmFyIH0gZnJvbSAnLi4vcGxheWVyLWNvbXBvbmVudHMvcGxheWVyLXNlZWtiYXIvcGxheWVyU2Vla2Jhci5qcyc7XG5pbXBvcnQgeyBUZXh0Q29udGVudCB9IGZyb20gJy4uL3BsYXllci1jb21wb25lbnRzL3BsYXllci10aXRsZS9wbGF5ZXJUaXRsZS5qcyc7XG5pbXBvcnQgeyBTaWRlYmFyIH0gZnJvbSAnLi4vcGxheWVyLWNvbXBvbmVudHMvcGxheWVyLXNpZGViYXIvcGxheWVyLXNpZGViYXIuanMnO1xuaW1wb3J0IHBsYXlJY29uIGZyb20gJy4uL2Fzc2V0cy9wbGF5SWNvbi5wbmcnO1xuaW1wb3J0IHBhdXNlSWNvbiBmcm9tICcuLi9hc3NldHMvcGF1c2VJY29uLnBuZyc7XG5pbXBvcnQgcGxheUljb25Gb2N1cyBmcm9tICcuLi9hc3NldHMvcGxheUljb25Gb2N1cy5wbmcnO1xuaW1wb3J0IHBhdXNlSWNvbkZvY3VzIGZyb20gJy4uL2Fzc2V0cy9wYXVzZUljb25Gb2N1cy5wbmcnO1xuaW1wb3J0IHNldHRpbmdzSWNvbiBmcm9tICcuLi9hc3NldHMvc2V0dGluZ3NJY29uLnBuZyc7XG5cbmNsYXNzIFZpZGVvUGxheWVyVUkge1xuICBjb25zdHJ1Y3Rvcih7IHBsYXllciwgY29uZmlnIH0pIHtcbiAgICBpZiAoIXBsYXllciB8fCB0eXBlb2YgcGxheWVyICE9PSAnb2JqZWN0JyB8fCAhcGxheWVyLnZpZGVvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZGVvUGxheWVyVUk6IHBsYXllciBtdXN0IGJlIGEgdmFsaWQgb2JqZWN0IHdpdGggYSB2aWRlbyBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaWRlb1BsYXllclVJOiBjb25maWcgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMudmlkZW9UaXRsZUNvbmZpZyA9IGNvbmZpZy52aWRlb1RpdGxlQ29uZmlnIHx8IHt9O1xuICAgIHRoaXMuZHJtRW5hYmxlZCA9IGNvbmZpZy5kcm1FbmFibGVkO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWRlb1F1YWxpdHkgPSBcImF1dG9cIjtcbiAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tDYXB0aW9uID0gXCJcIjtcbiAgICB0aGlzLnNlbGVjdGVkQXVkaW9RdWFsaXR5ID0gXCJcIjtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gJ3ZpZGVvLXBsYXllci11aSc7XG4gICAgdGhpcy5yaWdodFNpZGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJpZ2h0U2lkZUNvbnRhaW5lci5jbGFzc05hbWUgPSAncmlnaHQtc2lkZS1jb250YWluZXInO1xuICAgIHRoaXMubGVmdFNpZGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmxlZnRTaWRlQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdsZWZ0LXNpZGUtY29udGFpbmVyJztcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJpZ2h0U2lkZUNvbnRhaW5lcik7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5sZWZ0U2lkZUNvbnRhaW5lcik7XG4gICAgdGhpcy5jcmVhdGVDb250cm9scygpO1xuICB9XG5cbiAgY3JlYXRlQ29udHJvbHMoKSB7XG4gICAgdGhpcy5jcmVhdGVQbGF5UGF1c2VCdG4oKTtcbiAgICB0aGlzLmNyZWF0ZVNlZWtiYXIoKTtcbiAgICB0aGlzLmNyZWF0ZVNldHRpbmdzQnRuKCk7XG4gICAgdGhpcy5jcmVhdGVSZXN0YXJ0VmlkZW9CdG4oKTtcbiAgICB0aGlzLmNyZWF0ZVRleHRDb250ZW50KCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuXG4gICAgLy8gQXR0YWNoIHRoZSB2aWRlbyBlbGVtZW50XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wbGF5ZXIudmlkZW8pO1xuICB9XG5cbiAgY3JlYXRlUGxheVBhdXNlQnRuKCkge1xuICAgIHRoaXMucGxheVBhdXNlQnRuID0gbmV3IEJ1dHRvbih7XG4gICAgICBpbWdTcmM6IHBsYXlJY29uRm9jdXMsXG4gICAgICBpbWdBbHRUZXh0OiAnUGxheS9QYXVzZScsXG4gICAgICBidXR0b25UZXh0OiAnUGxheScsXG4gICAgICB3aWR0aDogNzAsXG4gICAgICBoZWlnaHQ6IDcwLFxuICAgICAga2xhc3NuYW1lOiAncGxheS1wYXVzZS1idG4nLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBoYW5kbGVDbGljazogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIudmlkZW8ucGF1c2VkKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgICAgICAgIGlmICh0aGlzLnBsYXlQYXVzZUJ0biAmJiB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50ICYmIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgICAgICAgIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykuc2V0QXR0cmlidXRlKCdzcmMnLCBwYXVzZUljb25Gb2N1cyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBsYXlQYXVzZUJ0biAmJiB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50LnRleHRDb250ZW50ID0gJ1BhdXNlJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICBpZiAodGhpcy5wbGF5UGF1c2VCdG4gJiYgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbWcnKS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHBsYXlJY29uRm9jdXMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wbGF5UGF1c2VCdG4gJiYgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC50ZXh0Q29udGVudCA9ICdQbGF5JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBsYXlQYXVzZUJ0bi5tb3VudCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGxheVBhdXNlQnRuKSB0aGlzLnBsYXlQYXVzZUJ0bi5mb2N1cygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jcmVhdGVQbGF5UGF1c2VCdG5FdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgY3JlYXRlUGxheVBhdXNlQnRuRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCF0aGlzLnBsYXlQYXVzZUJ0biB8fCAhdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsYXlQYXVzZUJ0biAmJiB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50ICYmIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgICAgY29uc3QgaWNvblNyYyA9IHRoaXMucGxheWVyLnZpZGVvLnBhdXNlZCA/IHBsYXlJY29uRm9jdXMgOiBwYXVzZUljb25Gb2N1cztcbiAgICAgICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbWcnKS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGljb25TcmMpO1xuICAgICAgICB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2JhKDI1NSwgMjU1LCAyNTUpJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsYXlQYXVzZUJ0biAmJiB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50ICYmIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgICAgY29uc3QgaWNvblNyYyA9IHRoaXMucGxheWVyLnZpZGVvLnBhdXNlZCA/IHBsYXlJY29uIDogcGF1c2VJY29uO1xuICAgICAgICB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2ltZycpLnNldEF0dHJpYnV0ZSgnc3JjJywgaWNvblNyYyk7XG4gICAgICAgIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVQbGF5UGF1c2VCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucGxheVBhdXNlQnRuICYmIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQgJiYgdGhpcy5zZWVrYmFyLmZvY3VzZWQpIHtcbiAgICAgIGNvbnN0IGljb25TcmMgPSB0aGlzLnBsYXllci52aWRlby5wYXVzZWQgPyBwbGF5SWNvbiA6IHBhdXNlSWNvbjtcbiAgICAgIHRoaXMucGxheVBhdXNlQnRuLmJ1dHRvbkVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykuc2V0QXR0cmlidXRlKCdzcmMnLCBpY29uU3JjKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVTZWVrYmFyKCkge1xuICAgIGlmICghdGhpcy5wbGF5ZXIudmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMuc2Vla2JhciA9IG5ldyBQbGF5ZXJTZWVrYmFyKHRoaXMucGxheWVyLnZpZGVvKTtcbiAgICB0aGlzLnNlZWtiYXIubW91bnQodGhpcy5jb250YWluZXIpO1xuXG4gICAgdGhpcy5wbGF5ZXIudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHRoaXMudXBkYXRlUGxheVBhdXNlQnV0dG9uKCkpO1xuICAgIHRoaXMucGxheWVyLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgKCkgPT4gdGhpcy51cGRhdGVQbGF5UGF1c2VCdXR0b24oKSk7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAoIXRoaXMucGxheVBhdXNlQnRuIHx8ICF0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50KSByZXR1cm47XG5cbiAgICB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nc0J0bikgdGhpcy5zZXR0aW5nc0J0bi5mb2N1cygpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnJlc3RhcnRWaWRlb0J0bikgdGhpcy5yZXN0YXJ0VmlkZW9CdG4uZm9jdXMoKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zZWVrYmFyKSB0aGlzLnNlZWtiYXIuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzQnRuICYmIHRoaXMuc2V0dGluZ3NCdG4uYnV0dG9uRWxlbWVudCkge1xuICAgICAgdGhpcy5zZXR0aW5nc0J0bi5idXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc2Vla2JhcikgdGhpcy5zZWVrYmFyLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh0aGlzLnBsYXlQYXVzZUJ0bikgdGhpcy5wbGF5UGF1c2VCdG4uZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHRoaXMucmVzdGFydFZpZGVvQnRuKSB0aGlzLnJlc3RhcnRWaWRlb0J0bi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN0YXJ0VmlkZW9CdG4gJiYgdGhpcy5yZXN0YXJ0VmlkZW9CdG4uYnV0dG9uRWxlbWVudCkge1xuICAgICAgdGhpcy5yZXN0YXJ0VmlkZW9CdG4uYnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWVrYmFyKSB0aGlzLnNlZWtiYXIuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHRoaXMucGxheVBhdXNlQnRuKSB0aGlzLnBsYXlQYXVzZUJ0bi5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzQnRuKSB0aGlzLnNldHRpbmdzQnRuLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZWtiYXJFbGVtZW50ID0gdGhpcy5zZWVrYmFyLmdldEVsZW1lbnQgJiYgdGhpcy5zZWVrYmFyLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoc2Vla2JhckVsZW1lbnQpIHtcbiAgICAgIHNlZWtiYXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NCdG4pIHRoaXMuc2V0dGluZ3NCdG4uZm9jdXMoKTtcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnJlc3RhcnRWaWRlb0J0bikgdGhpcy5yZXN0YXJ0VmlkZW9CdG4uZm9jdXMoKTtcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlQYXVzZUJ0bikgdGhpcy5wbGF5UGF1c2VCdG4uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU2V0dGluZ3NCdG4oKSB7XG4gICAgdGhpcy5zZXR0aW5nc0J0biA9IG5ldyBCdXR0b24oe1xuICAgICAgaW1nU3JjOiBzZXR0aW5nc0ljb24sXG4gICAgICBpbWdBbHRUZXh0OiAnU2V0dGluZ3MnLFxuICAgICAgYnV0dG9uVGV4dDogJ1NldHRpbmdzJyxcbiAgICAgIHdpZHRoOiA0MCxcbiAgICAgIGhlaWdodDogNDAsXG4gICAgICBrbGFzc25hbWU6ICdzZXR0aW5ncy1idG4nLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBoYW5kbGVDbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZVNpZGVCYXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldHRpbmdzQnRuLm1vdW50KHRoaXMucmlnaHRTaWRlQ29udGFpbmVyKTtcbiAgfVxuXG4gIGNyZWF0ZVJlc3RhcnRWaWRlb0J0bigpIHtcbiAgICB0aGlzLnJlc3RhcnRWaWRlb0J0biA9IG5ldyBCdXR0b24oe1xuICAgICAgaW1nU3JjOiAnJyxcbiAgICAgIGltZ0FsdFRleHQ6ICdTdGFydCBGcm9tIEJlZ2lubmluZycsXG4gICAgICBidXR0b25UZXh0OiAnU3RhcnQgRnJvbSBCZWdpbm5pbmcnLFxuICAgICAgd2lkdGg6IDE1MCxcbiAgICAgIGhlaWdodDogMzUsXG4gICAgICBrbGFzc25hbWU6ICdyZXN0YXJ0LWJ0bicsXG4gICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIGhhbmRsZUNsaWNrOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci52aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyLnZpZGVvLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVzdGFydFZpZGVvQnRuLm1vdW50KHRoaXMucmlnaHRTaWRlQ29udGFpbmVyKTtcbiAgfVxuXG4gIGNyZWF0ZVRleHRDb250ZW50KCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBuZXcgVGV4dENvbnRlbnQoe1xuICAgICAgdGV4dDogdGhpcy52aWRlb1RpdGxlQ29uZmlnLnRleHQsXG4gICAgICBmb250U2l6ZTogdGhpcy52aWRlb1RpdGxlQ29uZmlnLmZvbnRTaXplLFxuICAgICAgY29sb3I6IHRoaXMudmlkZW9UaXRsZUNvbmZpZy5jb2xvcixcbiAgICAgIGZvbnRXZWlnaHQ6IHRoaXMudmlkZW9UaXRsZUNvbmZpZy5ib2xkLFxuICAgIH0pO1xuICAgIHRoaXMudGV4dENvbnRlbnQubW91bnQodGhpcy5sZWZ0U2lkZUNvbnRhaW5lcik7XG4gIH1cblxuICBjaGFuZ2VQbGF5QmFja1F1YWxpdHkoaWQpIHtcbiAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tRdWFsaXR5ID0gaWQ7XG4gICAgbGV0IHZpZGVvTGV2ZWxzID0gdGhpcy5wbGF5ZXIudmlkZW9SZXNvbHV0aW9ucygpO1xuXG4gICAgaWYgKCF2aWRlb0xldmVscyB8fCB2aWRlb0xldmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gdmlkZW8gcmVzb2x1dGlvbnMgYXZhaWxhYmxlIHRvIGNoYW5nZSBwbGF5YmFjayBxdWFsaXR5LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpZCA9PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvUXVhbGl0eSA9IFwiYXV0b1wiO1xuICAgICAgaWYgKHRoaXMuZHJtRW5hYmxlZCkge1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllci5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50TGV2ZWwgPSAtMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb0xldmVscz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHZpZGVvTGV2ZWxzW2ldLmhlaWdodCA9PSBpZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlb1F1YWxpdHkgPSB2aWRlb0xldmVsc1tpXS5oZWlnaHQ7XG4gICAgICAgICAgaWYgKHRoaXMuZHJtRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIucGxheWVySW5zdGFuY2Uuc2V0UXVhbGl0eUZvcigndmlkZW8nLCBpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIucGxheWVySW5zdGFuY2UuY3VycmVudExldmVsID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VQbGF5YmFja0NhcHRpb25zKGlkKSB7XG4gICAgbGV0IHRleHRUcmFja3MgPSB0aGlzLnBsYXllci5jYXB0aW9uc09wdGlvbnMoKTtcblxuICAgIGlmICghdGV4dFRyYWNrcyB8fCB0ZXh0VHJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdObyB0ZXh0IHRyYWNrcyBhdmFpbGFibGUgdG8gY2hhbmdlIHBsYXliYWNrIGNhcHRpb25zLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZFRleHRUcmFja3NUeXBlID0gWydjYXB0aW9ucycsICdzdWJ0aXRsZXMnLCAnY2FwdGlvbicsICdzdWJ0aXRsZSddO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0VHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZih2YWxpZFRleHRUcmFja3NUeXBlLmluY2x1ZGVzKHRleHRUcmFja3NbaV0ua2luZC50b0xvd2VyQ2FzZSgpKSl7XG4gICAgICAgIGlmICh0ZXh0VHJhY2tzW2ldLmxhbmd1YWdlID09PSBpZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQbGF5YmFja0NhcHRpb24gPSBpZDtcbiAgICAgICAgICB0ZXh0VHJhY2tzW2ldLm1vZGUgPSAnc2hvd2luZyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dFRyYWNrc1tpXS5tb2RlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgY2hhbmdlUGxheWJhY2tBdWRpbyhpZCl7XG4gICAgbGV0IGF1ZGlvVHJhY2tzID0gdGhpcy5wbGF5ZXIuYXVkaW9UcmFja3MoKTtcblxuICAgIGlmICghYXVkaW9UcmFja3MgfHwgYXVkaW9UcmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIGF1ZGlvIHRyYWNrcyBhdmFpbGFibGUgdG8gY2hhbmdlIHBsYXliYWNrIGF1ZGlvLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9UcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhdWRpb1RyYWNrc1tpXS5pZCA9PSBpZCB8fCBhdWRpb1RyYWNrc1tpXS5sYW5nID09IGlkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdWRpb1F1YWxpdHkgPSBpZDtcbiAgICAgICAgaWYodGhpcy5kcm1FbmFibGVkKXtcbiAgICAgICAgICB0aGlzLnBsYXllci5wbGF5ZXJJbnN0YW5jZS5zZXRDdXJyZW50VHJhY2soYXVkaW9UcmFja3NbaV0pO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIucGxheWVySW5zdGFuY2UuYXVkaW9UcmFjayA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmlkZW9RdWFsaXR5U2VsZWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLm1haW5TaWRlYmFyKSByZXR1cm47XG5cbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IHRoaXMucGxheWVyLnZpZGVvUmVzb2x1dGlvbnMoKTtcbiAgICBjb25zdCBjdXJyZW50UXVhbGl0eSA9IHRoaXMuc2VsZWN0ZWRWaWRlb1F1YWxpdHk7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogJ0F1dG8nLFxuICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICBpc1NlbGVjdGVkOiBjdXJyZW50UXVhbGl0eSA9PT0gJ2F1dG8nLFxuICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFpblNpZGViYXIuY3VycmVudEZvY3VzZWRPcHRpb24uZm9jdXMoKTtcbiAgICAgICAgICB0aGlzLnNpZGViYXIudW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLi4ucmVzb2x1dGlvbnMubWFwKHJlc29sdXRpb24gPT4gKHtcbiAgICAgICAgdGV4dDogYCR7cmVzb2x1dGlvbi5oZWlnaHR9cGAsXG4gICAgICAgIGlkOiByZXNvbHV0aW9uLmhlaWdodCxcbiAgICAgICAgaXNTZWxlY3RlZDogY3VycmVudFF1YWxpdHkgPT09IHJlc29sdXRpb24uaGVpZ2h0LFxuICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFpblNpZGViYXIuY3VycmVudEZvY3VzZWRPcHRpb24uZm9jdXMoKTtcbiAgICAgICAgICB0aGlzLnNpZGViYXIudW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9KSlcbiAgICBdO1xuXG5cbiAgICB0aGlzLnNpZGViYXIgPSBuZXcgU2lkZWJhcih7XG4gICAgICB0aXRsZTogJ1ZpZGVvIFF1YWxpdHknLFxuICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAga2xhc3NuYW1lOiAnZGVmYXVsdC1zaWRlYmFyJyxcbiAgICAgIGxhc3RGb2N1c2VkRWxlbWVudDogdGhpcy5tYWluU2lkZWJhci5jdXJyZW50Rm9jdXNlZE9wdGlvbixcbiAgICAgIHR5cGU6ICdzZWxlY3Rpb24nLFxuICAgICAgZm9jdXNlZDogdHJ1ZSxcbiAgICAgIG9uc2VsZWN0OiAoZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmNoYW5nZVBsYXlCYWNrUXVhbGl0eShkYXRhLmlkKTtcbiAgICAgIH0sXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMubWFpblNpZGViYXIuc2lkZWJhckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2lkZWJhci5tb3VudCh0aGlzLmNvbnRhaW5lcik7XG4gIH1cblxuICBhdWRpb0xhbmd1YWdlU2VsZWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLm1haW5TaWRlYmFyKSByZXR1cm47XG4gICAgY29uc3QgYXVkaW9UcmFja3MgPSB0aGlzLnBsYXllci5hdWRpb1RyYWNrcygpO1xuICAgIGNvbnN0IGN1cnJlbnRBdWRpb1F1YWxpdHkgPSB0aGlzLnNlbGVjdGVkQXVkaW9RdWFsaXR5O1xuXG4gICAgdGhpcy5zaWRlYmFyID0gbmV3IFNpZGViYXIoe1xuICAgICAgdGl0bGU6ICdBdWRpbyBMYW5ndWFnZScsXG4gICAgICBpdGVtczogYXVkaW9UcmFja3MubWFwKChhdWRpbywgaWR4KSA9PiAoe1xuICAgICAgICBpZDogYXVkaW8uaWQgfHwgYXVkaW8ubGFuZyxcbiAgICAgICAgdGV4dDogYXVkaW8ubmFtZSB8fCBhdWRpby5sYW5nLFxuICAgICAgICBpc1NlbGVjdGVkOiAoYXVkaW9UcmFja3MubGVuZ3RoID09PSAxKSAgfHwgKGN1cnJlbnRBdWRpb1F1YWxpdHkgPyBjdXJyZW50QXVkaW9RdWFsaXR5ID09PSBhdWRpby5pZCA6IGF1ZGlvLmRlZmF1bHQpLFxuICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFpblNpZGViYXIuY3VycmVudEZvY3VzZWRPcHRpb24uZm9jdXMoKTtcbiAgICAgICAgICB0aGlzLnNpZGViYXIudW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9KSksXG4gICAgICBrbGFzc25hbWU6ICdkZWZhdWx0LXNpZGViYXInLFxuICAgICAgbGFzdEZvY3VzZWRFbGVtZW50OiB0aGlzLm1haW5TaWRlYmFyLmN1cnJlbnRGb2N1c2VkT3B0aW9uLFxuICAgICAgdHlwZTogJ3NlbGVjdGlvbicsXG4gICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgb25zZWxlY3Q6IChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VQbGF5YmFja0F1ZGlvKGRhdGEuaWQpO1xuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1haW5TaWRlYmFyLnNpZGViYXJFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zaWRlYmFyLm1vdW50KHRoaXMuY29udGFpbmVyKTtcbiAgfVxuXG4gIHN1YnRpdGxlc1NlbGVjdG9yKCkge1xuICAgIGlmICghdGhpcy5tYWluU2lkZWJhcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY2FwdGlvbnMgPSB0aGlzLnBsYXllci5jYXB0aW9uc09wdGlvbnMoKTtcbiAgICBjb25zdCBjdXJyZW50Q2FwdGlvbiA9IHRoaXMuc2VsZWN0ZWRQbGF5YmFja0NhcHRpb247XG5cblxuICAgIGNvbnN0IGl0ZW1zID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ29mZicsXG4gICAgICAgIHRleHQ6ICdPZmYnLFxuICAgICAgICBpc1NlbGVjdGVkOiBjdXJyZW50Q2FwdGlvbiA9PT0gJ29mZicsIC8vIFlvdSBjYW4gZW5oYW5jZSB0aGlzIGJ5IGNoZWNraW5nIGlmIGFsbCB0cmFja3MgYXJlIGRpc2FibGVkXG4gICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5jdXJyZW50Rm9jdXNlZE9wdGlvbi5mb2N1cygpO1xuICAgICAgICAgIHRoaXMuc2lkZWJhci51bm1vdW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAuLi5jYXB0aW9ucy5tYXAoc3VidGl0bGUgPT4gKHtcbiAgICAgICAgaWQ6IHN1YnRpdGxlLmxhbmd1YWdlLFxuICAgICAgICB0ZXh0OiBzdWJ0aXRsZS5sYWJlbCxcbiAgICAgICAgaXNTZWxlY3RlZDogY3VycmVudENhcHRpb24gPT09IHN1YnRpdGxlLmxhbmd1YWdlIHx8IHN1YnRpdGxlLm1vZGUgPT09ICdzaG93aW5nJyxcbiAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLm1haW5TaWRlYmFyLmN1cnJlbnRGb2N1c2VkT3B0aW9uLmZvY3VzKCk7XG4gICAgICAgICAgdGhpcy5zaWRlYmFyLnVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfSkpXG4gICAgXTtcblxuXG4gICAgdGhpcy5zaWRlYmFyID0gbmV3IFNpZGViYXIoe1xuICAgICAgdGl0bGU6ICdTdWJ0aXRsZXMnLFxuICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAga2xhc3NuYW1lOiAnZGVmYXVsdC1zaWRlYmFyJyxcbiAgICAgIGxhc3RGb2N1c2VkRWxlbWVudDogdGhpcy5tYWluU2lkZWJhci5jdXJyZW50Rm9jdXNlZE9wdGlvbixcbiAgICAgIHR5cGU6ICdzZWxlY3Rpb24nLFxuICAgICAgZm9jdXNlZDogdHJ1ZSxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1haW5TaWRlYmFyLnNpZGViYXJFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25zZWxlY3Q6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlUGxheWJhY2tDYXB0aW9ucyhkYXRhLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNpZGViYXIubW91bnQodGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgY3JlYXRlU2lkZUJhcigpIHtcbiAgICBsZXQgaXRlbXMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6ICdWaWRlbyBRdWFsaXR5JywgaXNTZWxlY3RlZDogdHJ1ZSwgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudmlkZW9RdWFsaXR5U2VsZWN0b3IoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cblxuICAgIGlmICh0aGlzLnBsYXllci5hdWRpb1RyYWNrcygpICYmIHRoaXMucGxheWVyLmF1ZGlvVHJhY2tzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdBdWRpbyBMYW5ndWFnZScsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpblNpZGViYXIuc2lkZWJhckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmF1ZGlvTGFuZ3VhZ2VTZWxlY3RvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYXllci5jYXB0aW9uc09wdGlvbnMoKSAmJiB0aGlzLnBsYXllci5jYXB0aW9uc09wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ1N1YnRpdGxlcycsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpblNpZGViYXIuc2lkZWJhckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYWluU2lkZWJhci5zaWRlYmFyRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1YnRpdGxlc1NlbGVjdG9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5tYWluU2lkZWJhciA9IG5ldyBTaWRlYmFyKHtcbiAgICAgIHRpdGxlOiAnU2V0dGluZ3MnLFxuICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAga2xhc3NuYW1lOiAnZGVmYXVsdC1zaWRlYmFyJyxcbiAgICAgIGxhc3RGb2N1c2VkRWxlbWVudDogdGhpcy5zZXR0aW5nc0J0bi5idXR0b25FbGVtZW50LFxuICAgICAgdHlwZTogJ25hdmlnYXRpb24nLFxuICAgICAgZm9jdXNlZDogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMubWFpblNpZGViYXIubW91bnQodGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgYXR0YWNoVG8ocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmlkZW9QbGF5ZXJVSTogcGFyZW50IG11c3QgYmUgYSB2YWxpZCBET00gZWxlbWVudCcpO1xuICAgIH1cbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICB1bm1vdW50KCkge1xuICAgIGlmICh0aGlzLnBsYXlQYXVzZUJ0biAmJiB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50KSB7XG4gICAgICB0aGlzLnBsYXlQYXVzZUJ0bi5idXR0b25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy51cGRhdGVQbGF5UGF1c2VCdXR0b24pO1xuICAgICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy51cGRhdGVQbGF5UGF1c2VCdXR0b24pO1xuICAgICAgdGhpcy5wbGF5UGF1c2VCdG4uYnV0dG9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVQbGF5UGF1c2VLZXlkb3duKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF5ZXIudmlkZW8pIHtcbiAgICAgIHRoaXMucGxheWVyLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCB0aGlzLnVwZGF0ZVBsYXlQYXVzZUJ1dHRvbik7XG4gICAgICB0aGlzLnBsYXllci52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXVzZScsIHRoaXMudXBkYXRlUGxheVBhdXNlQnV0dG9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1BsYXllclVJOyIsImV4cG9ydCBkZWZhdWx0IFwiYTc0Y2Q0NmVkNDI3NzU2OC5wbmdcIiIsImV4cG9ydCBjb25zdCB2dHRfb3Jfc3J0X3BhcnNlciA9ICh2dHQpID0+IHtcblxuICAgIHRyeSB7XG4gICAgICAgIHZhciBsaW5lcyA9IHZ0dC50cmltKCkuc3BsaXQoL1tcXHJcXG5cXHJcXG5dLykubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS50cmltKCk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBsaW5lcyA9IHZ0dC5tZXNzYWdlLnNwbGl0KC9bXFxyXFxuXFxyXFxuXS8pLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgIH1cbiAgICB2YXIgY3VlcyA9IFtdO1xuICAgIHZhciBzdGFydCA9IG51bGw7XG4gICAgdmFyIGVuZCA9IG51bGw7XG4gICAgdmFyIHBheWxvYWQgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICBpZiAobGluZXNbaV0uaW5kZXhPZignLS0+JykgPj0gMCkge1xuICAgICAgICAgICAgdmFyIHNwbGl0dGVkID0gbGluZXNbaV0uc3BsaXQoL1sgXFx0XSstLT5bIFxcdF0rLyk7XG4gICAgICAgICAgICBpZiAoc3BsaXR0ZWQubGVuZ3RoICE9IDIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnRXJyb3Igd2hlbiBzcGxpdHRpbmcgXCItLT5cIjogJyArIGxpbmVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kICE9IG51bGwgJiYgcGF5bG9hZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ZSA9IG5ldyBWVFRDdWUoc3RhcnQsIGVuZCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgY3VlLmxpbmUgPSAxMztcbiAgICAgICAgICAgICAgICBjdWVzLnB1c2goY3VlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGF5bG9hZCA9IG51bGw7XG4gICAgICAgICAgICBzdGFydCA9IG51bGw7XG4gICAgICAgICAgICBlbmQgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBBbHJlYWR5IGlnbm9yaW5nIGFueXRoaW5nIHBhc3QgdGhlIFwiZW5kXCIgdGltZXN0YW1wIChpLmUuIGN1ZSBzZXR0aW5ncykuXG4gICAgICAgICAgICBpZiAoc3BsaXR0ZWRbMF0gJiYgc3BsaXR0ZWRbMV0gJiYgc3BsaXR0ZWRbMF0uaW5kZXhPZihcInVuZGVmaW5lZFwiKSA9PSAtMSAmJiBzcGxpdHRlZFsxXS5pbmRleE9mKFwidW5kZWZpbmVkXCIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBwYXJzZV90aW1lc3RhbXAoc3BsaXR0ZWRbMF0pO1xuICAgICAgICAgICAgICAgIGVuZCA9IHBhcnNlX3RpbWVzdGFtcChzcGxpdHRlZFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXNbaV0gIT0gdW5kZWZpbmVkICYmIGxpbmVzW2ldLnRyaW0oKSAhPSAnJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGxpbmVzW2ldKSA+IDApIHtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSAocGF5bG9hZCA9PSBudWxsKSA/IFwiXCIgOiBwYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gKChwYXlsb2FkLnRyaW0oKSA9PSBcIlwiKSA/IGxpbmVzW2ldIDogKHBheWxvYWQgKyAnXFxuJyArIGxpbmVzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChwYXlsb2FkID09IG51bGwpID8gXCJcIiA6IHBheWxvYWQ7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9ICgocGF5bG9hZC50cmltKCkgPT0gXCJcIikgPyBsaW5lc1tpXSA6IChwYXlsb2FkICsgJ1xcbicgKyBsaW5lc1tpXSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuXG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQgJiYgcGF5bG9hZCkge1xuICAgICAgICB2YXIgY3VlID0gbmV3IFZUVEN1ZShzdGFydCwgZW5kLCBwYXlsb2FkKTtcbiAgICAgICAgY3VlLmxpbmUgPSAxMztcbiAgICAgICAgY3Vlcy5wdXNoKGN1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZV90aW1lc3RhbXAgPSAocykgPT4ge1xuICAgIGxldCBtYXRjaCA9IHMubWF0Y2goL14oPzooWzAtOV0rKTopPyhbMC01XVswLTldKTooWzAtNV1bMC05XSg/OlsuLF1bMC05XXswLDN9KT8pLyk7XG4gICAgaWYgKG1hdGNoID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgJ0ludmFsaWQgdGltZXN0YW1wIGZvcm1hdDogJyArIHM7XG4gICAgfVxuICAgIGxldCBob3VycyA9IHBhcnNlSW50KG1hdGNoWzFdIHx8IFwiMFwiLCAxMCk7XG4gICAgbGV0IG1pbnV0ZXMgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuICAgIGxldCBzZWNvbmRzID0gcGFyc2VGbG9hdChtYXRjaFszXS5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgcmV0dXJuIHNlY29uZHMgKyA2MCAqIG1pbnV0ZXMgKyA2MCAqIDYwICogaG91cnM7XG59IiwiaW1wb3J0IFZpZGVvUGxheWVyVUkgZnJvbSAnLi9wbGF5ZXItdWkvcGxheWVyLXVpLmpzJztcbmltcG9ydCB7IHZ0dF9vcl9zcnRfcGFyc2VyIH0gZnJvbSAnLi91dGlsaXRpZXMvdXRpbGl0aWVzLmpzJztcbmltcG9ydCBcIi4vc3R5bGVzL2luZGV4LmNzc1wiO1xuXG5jbGFzcyBTbWFydFRWVmlkZW9QbGF5ZXIge1xuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250YWluZXJJZCwgcGxheWVySWQsIGNvbmZpZykge1xuICAgIHRoaXMubW91bnRQb2ludCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMubW91bnRQb2ludC5pZCA9IHBsYXllcklkO1xuICAgIHRoaXMubW91bnRQb2ludC5jbGFzc05hbWUgPSBcInZsLXBsYXllci1jb250YWluZXJcIjtcbiAgICB0aGlzLm1vdW50UG9pbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy5tb3VudFBvaW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aGlzLm1vdW50UG9pbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMubW91bnRQb2ludC5zdHlsZS50b3AgPSAnMCc7XG4gICAgdGhpcy5tb3VudFBvaW50LnN0eWxlLmxlZnQgPSAnMCc7XG5cbiAgICBpZih0aGlzLnBhcmVudENvbnRhaW5lcklkKXtcbiAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50Q29udGFpbmVySWQpO1xuICAgICAgdGhpcy5wYXJlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5tb3VudFBvaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vdW50UG9pbnQpO1xuICAgIH1cblxuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5obHMgPSBudWxsO1xuICAgIHRoaXMuZGFzaGpzID0gbnVsbDtcbiAgICB0aGlzLmNsb3NlZENhcHRpb25zID0gY29uZmlnLmNsb3NlZENhcHRpb25zIHx8IFtdO1xuICAgIHRoaXMuZW5hYmxlVHJhY2sgPSBjb25maWcuZW5hYmxlVHJhY2sgfHwgZmFsc2U7XG5cbiAgICB0aGlzLmNhcHRpb25zT3B0aW9uc0xpc3QgPSBbXTtcbiAgICB0aGlzLnZpZGVvUmVzb2x1dGlvbnNMaXN0ID0gW107XG4gICAgdGhpcy5hdWRpb0xpc3QgPSBbXTtcblxuICAgIHRoaXMudmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHRoaXMudmlkZW8uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7IFxuICAgIHRoaXMudHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0dG1sLXJlbmRlcmluZy1kaXYnKTtcbiAgICB0aGlzLnZpZGVvLmFwcGVuZENoaWxkKHRoaXMudHJhY2spO1xuXG4gICAgdGhpcy5pbml0aWFsaXplUGxheWVyKCk7XG4gIH1cblxuICBnZXRDYXB0aW9uc09wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FwdGlvbnNPcHRpb25zTGlzdDtcbiAgfVxuXG4gIGdldFZpZGVvUmVzb2x1dGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlkZW9SZXNvbHV0aW9uc0xpc3Q7XG4gIH1cblxuICBnZXRBdWRpb1RyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb0xpc3Q7XG4gIH1cblxuICBpbml0aWFsaXplUGxheWVyKCkge1xuICAgIGNvbnN0IHN0cmVhbVVybCA9IHRoaXMuY29uZmlnLnN0cmVhbVVybCB8fCAnJztcbiAgICBpZiAoIXN0cmVhbVVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJlYW0gVVJMIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBITFMgcGxheWVyJyk7XG4gICAgfVxuXG4gICAgdGhpcy52aWRlby5jb250cm9scyA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW8uc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy52aWRlby5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG5cbiAgICB0aGlzLmFkZFBsYXllckV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICBpZih0aGlzLmNvbmZpZy5kcm1FbmFibGVkKXtcbiAgICAgIHRoaXMuZGFzaGpzICA9IHdpbmRvdy5kYXNoanMuTWVkaWFQbGF5ZXIoKS5jcmVhdGUoKTtcblxuICAgICAgY29uc3Qgd2lkZXZpbmUgPSB0aGlzLmNvbmZpZy5kcm1NZXRhZGF0YS53aWRldmluZTtcbiAgICAgIGNvbnN0IHBsYXlSZWFkeT0gdGhpcy5jb25maWcuZHJtTWV0YWRhdGEucGxheVJlYWR5O1xuXG4gICAgICBsZXQgcHJvdGVjdGlvbkRhdGEgPSB7XG4gICAgICAgICAgXCJjb20ud2lkZXZpbmUuYWxwaGFcIjoge1xuICAgICAgICAgICAgc2VydmVyVVJMOiB3aWRldmluZS5saWNlbnNlVXJsLFxuICAgICAgICAgICAgaHR0cFJlcXVlc3RIZWFkZXJzOiB7XG4gICAgICAgICAgICAgIFwiWC1BeERSTS1NZXNzYWdlXCI6IHdpZGV2aW5lLmxpY2Vuc2VUb2tlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeVwiOiB7XG4gICAgICAgICAgICBzZXJ2ZXJVUkw6IHBsYXlSZWFkeS5saWNlbnNlVXJsLFxuICAgICAgICAgICAgaHR0cFJlcXVlc3RIZWFkZXJzOiB7XG4gICAgICAgICAgICAgIFwiWC1BeERSTS1NZXNzYWdlXCI6IHBsYXlSZWFkeS5saWNlbnNlVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmRhc2hqcy5pbml0aWFsaXplKHRoaXMudmlkZW8sIHdpZGV2aW5lLnVybCwgdHJ1ZSk7XG4gICAgICB0aGlzLmRhc2hqcy5hdHRhY2hUVE1MUmVuZGVyaW5nRGl2KHRoaXMudHJhY2spO1xuICAgICAgdGhpcy5kYXNoanMuYXR0YWNoVmlldyh0aGlzLnZpZGVvKTtcbiAgICAgIHRoaXMuZGFzaGpzLnNldFByb3RlY3Rpb25EYXRhKHByb3RlY3Rpb25EYXRhKTtcbiAgICAgIHRoaXMuZGFzaGpzLnByZWxvYWQoKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93LkhscyAmJiB3aW5kb3cuSGxzLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIGNvbnN0IGhsc0NvbmZpZyA9IHtcbiAgICAgICAgXCJlbmFibGVXb3JrZXJcIjogdHJ1ZSxcbiAgICAgICAgXCJsb3dMYXRlbmN5TW9kZVwiOiB0cnVlLFxuICAgICAgICBcImJhY2tCdWZmZXJMZW5ndGhcIjogOTAsXG4gICAgICAgIFwibWF4QnVmZmVyTGVuZ3RoXCI6IDEyLFxuICAgICAgICBcIm1heE1heEJ1ZmZlckxlbmd0aFwiOiAxNSxcbiAgICAgICAgXCJtYXhGcmFnTG9va1VwVG9sZXJhbmNlXCI6IDAuMjUsXG4gICAgICAgIFwibWF4TG9hZGluZ0RlbGF5XCI6IDRcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuaGxzID0gbmV3IHdpbmRvdy5IbHMoaGxzQ29uZmlnKTtcbiAgICAgIHRoaXMuaGxzLmxvYWRTb3VyY2Uoc3RyZWFtVXJsKTtcbiAgICAgIHRoaXMuaGxzLmF0dGFjaE1lZGlhKHRoaXMudmlkZW8pO1xuXG4gICAgICBcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlkZW8uY2FuUGxheVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcHBsZS5tcGVndXJsJykpIHtcbiAgICAgIHRoaXMudmlkZW8uc3JjID0gc3RyZWFtVXJsO1xuICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdITFMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRybUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZGFzaGpzLm9uKGRhc2hqcy5NZWRpYVBsYXllci5ldmVudHMuU1RSRUFNX0lOSVRJQUxJWkVELCAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9SZXNvbHV0aW9uc0xpc3QgPSB0aGlzLmRhc2hqcy5nZXRCaXRyYXRlSW5mb0xpc3RGb3IoJ3ZpZGVvJyk7XG4gICAgICAgIHRoaXMuYXVkaW9MaXN0ID0gdGhpcy5kYXNoanMuZ2V0VHJhY2tzRm9yKCdhdWRpbycpO1xuICAgICAgICB0aGlzLmNhcHRpb25zb3B0aW9uc0xpc3QgPSB0aGlzLmRhc2hqcy5nZXRUcmFja3NGb3IoJ3RleHQnKTtcblxuXG4gICAgICAgICB0aGlzLnBsYXllciA9IHtcbiAgICAgICAgICAgIHZpZGVvOiB0aGlzLnZpZGVvLFxuICAgICAgICAgICAgcGxheTogKCkgPT4gdGhpcy52aWRlby5wbGF5KCksXG4gICAgICAgICAgICBwYXVzZTogKCkgPT4gdGhpcy52aWRlby5wYXVzZSgpLFxuICAgICAgICAgICAgY2FwdGlvbnNPcHRpb25zOiAoKSA9PiB0aGlzLmdldENhcHRpb25zT3B0aW9ucygpLFxuICAgICAgICAgICAgdmlkZW9SZXNvbHV0aW9uczogKCkgPT4gdGhpcy5nZXRWaWRlb1Jlc29sdXRpb25zKCksXG4gICAgICAgICAgICBhdWRpb1RyYWNrczogKCkgPT4gdGhpcy5nZXRBdWRpb1RyYWNrcygpLFxuICAgICAgICAgICAgcGxheWVySW5zdGFuY2U6IHRoaXMuZGFzaGpzXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMudWkgPSBuZXcgVmlkZW9QbGF5ZXJVSSh7IFxuICAgICAgICAgICAgcGxheWVyOiB0aGlzLnBsYXllciwgXG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51aS5hdHRhY2hUbyh0aGlzLm1vdW50UG9pbnQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGxzLm9uKHdpbmRvdy5IbHMuRXZlbnRzLkFVRElPX1RSQUNLU19VUERBVEVELCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXVkaW9MaXN0ID0gdGhpcy5obHMuYXVkaW9UcmFja3M7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5obHMub24od2luZG93Lkhscy5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWRlb1Jlc29sdXRpb25zTGlzdCA9IHRoaXMuaGxzLmxldmVscztcblxuICAgICAgICAgIHRoaXMucGxheWVyID0ge1xuICAgICAgICAgICAgdmlkZW86IHRoaXMudmlkZW8sXG4gICAgICAgICAgICBwbGF5OiAoKSA9PiB0aGlzLnZpZGVvLnBsYXkoKSxcbiAgICAgICAgICAgIHBhdXNlOiAoKSA9PiB0aGlzLnZpZGVvLnBhdXNlKCksXG4gICAgICAgICAgICBjYXB0aW9uc09wdGlvbnM6ICgpID0+IHRoaXMuZ2V0Q2FwdGlvbnNPcHRpb25zKCksXG4gICAgICAgICAgICB2aWRlb1Jlc29sdXRpb25zOiAoKSA9PiB0aGlzLmdldFZpZGVvUmVzb2x1dGlvbnMoKSxcbiAgICAgICAgICAgIGF1ZGlvVHJhY2tzOiAoKSA9PiB0aGlzLmdldEF1ZGlvVHJhY2tzKCksXG4gICAgICAgICAgICBwbGF5ZXJJbnN0YW5jZTogdGhpcy5obHNcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy51aSA9IG5ldyBWaWRlb1BsYXllclVJKHsgXG4gICAgICAgICAgICBwbGF5ZXI6IHRoaXMucGxheWVyLCBcbiAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVpLmF0dGFjaFRvKHRoaXMubW91bnRQb2ludCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgYWRkUGxheWVyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCF0aGlzLnZpZGVvKSByZXR1cm47XG4gICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkbWV0YWRhdGFcIiwgdGhpcy5vblZpZGVvTG9hZCk7XG4gICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwiY2FucGxheXRocm91Z2hcIiwgdGhpcy5jYW5wbGF5dGhyb3VnaC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmRlZFwiLCB0aGlzLm9uUGxheWViYWNrRW5kZWQpO1xuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgdGhpcy5wbGF5YmFja3Byb2dyZXNzKTtcbiAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsIHRoaXMub25QbGF5aW5nKTtcbiAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLm9uRXJyb3IpO1xuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcIndhaXRpbmdcIiwgdGhpcy5vbkJ1ZmZlcmluZyk7XG4gICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwicGxheVwiLCB0aGlzLm9uUGxheSk7XG4gICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKFwic2Vla2VkXCIsIHRoaXMub25TZWVrZWQpO1xuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihcInN0YWxsZWRcIiwgdGhpcy5vblN0YWxsZWQpO1xuICB9XG5cbiAgcmVtb3ZlUGxheWVyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCF0aGlzLnZpZGVvKSByZXR1cm47XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZGVkbWV0YWRhdGFcIiwgdGhpcy5vblZpZGVvTG9hZCk7XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFwiZW5kZWRcIiwgdGhpcy5vblBsYXllYmFja0VuZGVkKTtcbiAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIHRoaXMucGxheWJhY2twcm9ncmVzcyk7XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFwicGxheWluZ1wiLCB0aGlzLm9uUGxheWluZyk7XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5vbkVycm9yKTtcbiAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3YWl0aW5nXCIsIHRoaXMub25CdWZmZXJpbmcpO1xuICAgIHRoaXMudmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBsYXlcIiwgdGhpcy5vblBsYXkpO1xuICAgIHRoaXMudmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNhbnBsYXl0aHJvdWdoXCIsIHRoaXMuY2FucGxheXRocm91Z2guYmluZCh0aGlzKSk7XG4gICAgdGhpcy52aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Vla2VkXCIsIHRoaXMub25TZWVrZWQpO1xuICAgIHRoaXMudmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN0YWxsZWRcIiwgdGhpcy5vblN0YWxsZWQpO1xuICB9XG5cbiAgY2FucGxheXRocm91Z2goKSB7XG4gICAgaWYodGhpcy5jYXB0aW9uc09wdGlvbnNMaXN0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLmFkZEFsbENhcHRpb25zVG9QbGF5ZXIoMCk7XG5cbiAgICAgIGxldCBhbGxDQ1RyYWNrcyA9IHRoaXMudmlkZW8udGV4dFRyYWNrcztcblxuICAgICAgaWYgKGFsbENDVHJhY2tzICE9IHVuZGVmaW5lZCAmJiBhbGxDQ1RyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ0NUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoYWxsQ0NUcmFja3NbaV0ua2luZC50b0xvd2VyQ2FzZSgpID09IFwiY2FwdGlvbnNcIiB8fCBhbGxDQ1RyYWNrc1tpXS5raW5kLnRvTG93ZXJDYXNlKCkgPT0gXCJzdWJ0aXRsZXNcIiB8fCBhbGxDQ1RyYWNrc1tpXS5raW5kLnRvTG93ZXJDYXNlKCkgPT0gXCJjYXB0aW9uXCIgfHwgYWxsQ0NUcmFja3NbaV0ua2luZC50b0xvd2VyQ2FzZSgpID09IFwic3VidGl0bGVcIikge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uc09wdGlvbnNMaXN0LnB1c2goYWxsQ0NUcmFja3NbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFwiVEVYVCBUUkFDS1M6XCIsIHRoaXMuY2FwdGlvbnNPcHRpb25zTGlzdCk7XG4gICAgY29uc29sZS5sb2coXCJWSURFTyBSRVNPTFVUSU9OOlwiLCB0aGlzLnZpZGVvUmVzb2x1dGlvbnNMaXN0KTtcbiAgICBjb25zb2xlLmxvZyhcIkFVRElPIFRSQUNLUzpcIiwgdGhpcy5hdWRpb0xpc3QpO1xuICB9XG5cbiAgYWRkQWxsQ2FwdGlvbnNUb1BsYXllcihjb3VudGVyVmFyaWFibGUpIHtcbiAgICBpZiAoY291bnRlclZhcmlhYmxlID49IHRoaXMuY2xvc2VkQ2FwdGlvbnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50TGFiZWwgPSB0aGlzLmNsb3NlZENhcHRpb25zW2NvdW50ZXJWYXJpYWJsZV0ubGFuZ3VhZ2U7XG5cbiAgICBmZXRjaCh0aGlzLmNsb3NlZENhcHRpb25zW2NvdW50ZXJWYXJpYWJsZV0udXJsKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwidHlwZVwiKSkge1xuICAgICAgICAgIGlmIChkYXRhW1widHlwZVwiXSA9PT0gXCJmYWlsdXJlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsQ2FwdGlvbnNUb1BsYXllcihjb3VudGVyVmFyaWFibGUgKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdnR0T2JqID0ge1xuICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIGxhYmVsOiBjdXJyZW50TGFiZWwsXG4gICAgICAgICAgICBsYW5nOiBjdXJyZW50TGFiZWwsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmFkZENhcHRpb25Ub1BsYXllcih2dHRPYmopO1xuICAgICAgICAgIHRoaXMuYWRkQWxsQ2FwdGlvbnNUb1BsYXllcihjb3VudGVyVmFyaWFibGUgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuYWRkQWxsQ2FwdGlvbnNUb1BsYXllcihjb3VudGVyVmFyaWFibGUgKyAxKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWRkQ2FwdGlvblRvUGxheWVyKHZ0dE9iaikge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5wbGF5ZXI/LnZpZGVvPy5hZGRUZXh0VHJhY2soJ2NhcHRpb25zJywgdnR0T2JqLmxhYmVsLCB2dHRPYmoubGFuZyk7XG4gICAgaWYgKHRyYWNrKSB0cmFjay5tb2RlID0gXCJoaWRkZW5cIjtcbiAgICB2dHRfb3Jfc3J0X3BhcnNlcih2dHRPYmouZGF0YSkubWFwKGN1ZSA9PiB7XG4gICAgICBpZiAodHJhY2spIHRyYWNrLmFkZEN1ZShjdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlQ2FwdGlvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy52aWRlbykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhbGxDQ1RyYWNrcyA9IHRoaXMudmlkZW8udGV4dFRyYWNrcztcblxuICAgICAgaWYgKGFsbENDVHJhY2tzICYmIGFsbENDVHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxDQ1RyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRyYWNrID0gYWxsQ0NUcmFja3NbaV07XG4gICAgICAgICAgY29uc3Qga2luZCA9IHRyYWNrLmtpbmQ/LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICBpZiAoWydjYXB0aW9ucycsICdzdWJ0aXRsZXMnLCAnY2FwdGlvbicsICdzdWJ0aXRsZSddLmluY2x1ZGVzKGtpbmQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVUcmFjaykge1xuICAgICAgICAgICAgICB0cmFjay5tb2RlID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0cmFjay5jdWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdHJhY2subW9kZSA9IFwic2hvd2luZ1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBTaG93IGZpcnN0IHZhbGlkIHRyYWNrIG9ubHlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFjay5tb2RlID0gXCJkaXNhYmxlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBtYW5hZ2luZyBjYXB0aW9uczpcIiwgZXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYWNrKSB7XG4gICAgICB0aGlzLnRyYWNrLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmVuYWJsZVRyYWNrID8gXCJub25lXCIgOiBcImZsZXhcIjtcbiAgICB9XG4gIH1cblxuXG4gIG9uVmlkZW9Mb2FkKCkge1xuICAgIGNvbnNvbGUubG9nKCdWaWRlbyBtZXRhZGF0YSBsb2FkZWQnKTtcbiAgfVxuXG4gIG9uUGxheWViYWNrRW5kZWQoKSB7XG4gICAgY29uc29sZS5sb2coJ1BsYXliYWNrIGVuZGVkJyk7XG4gIH1cblxuICBwbGF5YmFja3Byb2dyZXNzKCkge1xuICAgIGNvbnNvbGUubG9nKCdQbGF5YmFjayBwcm9ncmVzcyB1cGRhdGVkJyk7XG4gIH1cblxuICBvblBsYXlpbmcoKSB7XG4gICAgY29uc29sZS5sb2coJ1ZpZGVvIGlzIHBsYXlpbmcnKTtcbiAgfVxuXG4gIG9uRXJyb3IoZXZlbnQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdWaWRlbyBlcnJvcjonLCBldmVudCk7XG4gIH1cblxuICBvbkJ1ZmZlcmluZygpIHtcbiAgICBjb25zb2xlLmxvZygnVmlkZW8gaXMgYnVmZmVyaW5nJyk7XG4gIH1cblxuICBvblBsYXkoKSB7XG4gICAgY29uc29sZS5sb2coJ1ZpZGVvIHN0YXJ0ZWQgcGxheWluZycpO1xuICB9XG5cbiAgb25TZWVrZWQoKSB7XG4gICAgY29uc29sZS5sb2coJ1ZpZGVvIHNlZWtlZCcpO1xuICB9XG5cbiAgb25TdGFsbGVkKCkge1xuICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdGFsbGVkJyk7XG4gIH1cblxuICB1bm1vdW50KCl7XG4gICAgdGhpcy5tb3VudFBvaW50LnJlbW92ZSgpO1xuICAgIHRoaXMubW91bnRQb2ludCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGxzUGxheWVyKHBhcmVudENvbnRhaW5lcklkLCBwbGF5ZXJJZCwgY29uZmlnKSB7XG4gIGlmICghcGxheWVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BsYXllcklkIG11c3QgYmUgYSB2YWxpZCBpZCcpO1xuICB9XG4gIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICB9XG4gIHJldHVybiBuZXcgU21hcnRUVlZpZGVvUGxheWVyKHBhcmVudENvbnRhaW5lcklkLCBwbGF5ZXJJZCwgY29uZmlnKTtcbn0iXSwibmFtZXMiOlsiQnV0dG9uIiwiX2NyZWF0ZUNsYXNzIiwicHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2siLCJFcnJvciIsInRoaXMiLCJpbWdTcmMiLCJpbWdBbHRUZXh0IiwiYnV0dG9uVGV4dCIsImtsYXNzbmFtZSIsIndpZHRoIiwiaGVpZ2h0IiwiZm9jdXNlZCIsImRpc2FibGVkIiwiaGFuZGxlQ2xpY2siLCJiaW5kIiwia2V5IiwidmFsdWUiLCJidXR0b25FbGVtZW50IiwiZm9jdXMiLCJjbGFzc0xpc3QiLCJhZGQiLCJibHVyIiwicmVtb3ZlIiwibW91bnRQb2ludCIsIl90aGlzIiwiSFRNTEVsZW1lbnQiLCJidXR0b24iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzdHlsZSIsImNvbmNhdCIsInRhYkluZGV4IiwiaW1nIiwic3JjIiwiYWx0Iiwib25lcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiYXBwZW5kQ2hpbGQiLCJzcGFuIiwidGV4dENvbnRlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidW5kZWZpbmVkIiwiUGxheWVyU2Vla2JhciIsInZpZGVvIiwiSFRNTFZpZGVvRWxlbWVudCIsImNvbnRhaW5lciIsInByb2dyZXNzIiwiYnVmZmVyIiwidGh1bWIiLCJ0b29sdGlwIiwidGltZUxhYmVsIiwiZHVyYXRpb25MYWJlbCIsImlzRHJhZ2dpbmciLCJpbml0IiwiZGlzcGxheSIsInVwZGF0ZSIsInVwZGF0ZUJ1ZmZlciIsImUiLCJzZWVrIiwic3RhcnREcmFnIiwic2hvd1Rvb2x0aXAiLCJoaWRlVG9vbHRpcCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiY3VycmVudFRpbWUiLCJNYXRoIiwibWluIiwiZHVyYXRpb24iLCJtYXgiLCJwYXVzZWQiLCJwbGF5Iiwic2Vjb25kcyIsImlzTmFOIiwibSIsImZsb29yIiwicyIsIlN0cmluZyIsInBhZFN0YXJ0IiwicGVyY2VudCIsImxlZnQiLCJmb3JtYXRUaW1lIiwiYnVmZmVyZWQiLCJsZW5ndGgiLCJlbmQiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY2xpZW50WCIsIl90aGlzMiIsIm9uTW92ZSIsIm1vdmVFdmVudCIsIm9uVXAiLCJ1cEV2ZW50IiwidGltZSIsInBhcmVudCIsImtleWRvd25IYW5kbGVyIiwiVGV4dENvbnRlbnQiLCJfdHlwZW9mIiwidGV4dCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsImZvbnRXZWlnaHQiLCJ0ZXh0QWxpZ24iLCJ0ZXh0RGVjb3JhdGlvbiIsInRleHRUcmFuc2Zvcm0iLCJsaW5lSGVpZ2h0IiwibGV0dGVyU3BhY2luZyIsImNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiaW5uZXJUZXh0IiwiU2V0dGluZ3NPcHRpb25PbmVXcmFwcGVyIiwidGl0bGUiLCJjYWxsYmFjayIsIm9wdGlvbldyYXBwZXIiLCJ0aXRsZUVsZW1lbnQiLCJhcnJvd0VsZW1lbnQiLCJpbnN0YW5jZSIsIlNldHRpbmdzT3B0aW9uVHdvV3JhcHBlciIsInNlbGVjdGVkIiwiaWQiLCJzZWxlY3RlZEVsZW1lbnQiLCJTaWRlYmFyIiwiaXRlbXMiLCJpc1NlbGVjdGVkIiwiY3VycmVudEZvY3VzZWRPcHRpb24iLCJsYXN0Rm9jdXNlZEVsZW1lbnQiLCJ0eXBlIiwib25zZWxlY3QiLCJpbmNsdWRlcyIsInNpZGViYXIiLCJsaXN0IiwiZm9yRWFjaCIsIml0ZW0iLCJpZHgiLCJsaXN0SXRlbSIsIm1vdW50Iiwic2lkZWJhckVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVycyIsImZvY3VzTmV4dCIsImZvY3VzUHJldmlvdXMiLCJ1bmZvY3VzIiwidW5tb3VudCIsInNlbGVjdGlvblR5cGVBY3Rpb24iLCJxdWVyeVNlbGVjdG9yIiwicGFyZW50RWxlbWVudCIsIm5leHRTaWJsaW5nIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwicHJldmlvdXNTaWJsaW5nIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsInBsYXlJY29uIiwicGF1c2VJY29uIiwicGxheUljb25Gb2N1cyIsInBhdXNlSWNvbkZvY3VzIiwiVmlkZW9QbGF5ZXJVSSIsIl9yZWYiLCJwbGF5ZXIiLCJjb25maWciLCJ2aWRlb1RpdGxlQ29uZmlnIiwiZHJtRW5hYmxlZCIsInNlbGVjdGVkVmlkZW9RdWFsaXR5Iiwic2VsZWN0ZWRQbGF5YmFja0NhcHRpb24iLCJzZWxlY3RlZEF1ZGlvUXVhbGl0eSIsInJpZ2h0U2lkZUNvbnRhaW5lciIsImxlZnRTaWRlQ29udGFpbmVyIiwiY3JlYXRlQ29udHJvbHMiLCJjcmVhdGVQbGF5UGF1c2VCdG4iLCJjcmVhdGVTZWVrYmFyIiwiY3JlYXRlU2V0dGluZ3NCdG4iLCJjcmVhdGVSZXN0YXJ0VmlkZW9CdG4iLCJjcmVhdGVUZXh0Q29udGVudCIsInBsYXlQYXVzZUJ0biIsInNldEF0dHJpYnV0ZSIsInBhdXNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY3JlYXRlUGxheVBhdXNlQnRuRXZlbnRMaXN0ZW5lcnMiLCJpY29uU3JjIiwic2Vla2JhciIsIl90aGlzMyIsInVwZGF0ZVBsYXlQYXVzZUJ1dHRvbiIsIl90aGlzNCIsInNldHRpbmdzQnRuIiwicmVzdGFydFZpZGVvQnRuIiwic2Vla2JhckVsZW1lbnQiLCJnZXRFbGVtZW50IiwiX3RoaXM1IiwiY3JlYXRlU2lkZUJhciIsIl90aGlzNiIsImJvbGQiLCJzZWxlY3RlZFBsYXliYWNrUXVhbGl0eSIsInZpZGVvTGV2ZWxzIiwidmlkZW9SZXNvbHV0aW9ucyIsInBsYXllckluc3RhbmNlIiwiY3VycmVudExldmVsIiwiaSIsInNldFF1YWxpdHlGb3IiLCJ0ZXh0VHJhY2tzIiwiY2FwdGlvbnNPcHRpb25zIiwidmFsaWRUZXh0VHJhY2tzVHlwZSIsImtpbmQiLCJ0b0xvd2VyQ2FzZSIsImxhbmd1YWdlIiwibW9kZSIsImF1ZGlvVHJhY2tzIiwibGFuZyIsInNldEN1cnJlbnRUcmFjayIsImF1ZGlvVHJhY2siLCJfdGhpczciLCJtYWluU2lkZWJhciIsInJlc29sdXRpb25zIiwiY3VycmVudFF1YWxpdHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJtYXAiLCJyZXNvbHV0aW9uIiwiZGF0YSIsImNoYW5nZVBsYXlCYWNrUXVhbGl0eSIsInZpc2liaWxpdHkiLCJfdGhpczgiLCJjdXJyZW50QXVkaW9RdWFsaXR5IiwiYXVkaW8iLCJuYW1lIiwiZGVmYXVsdCIsImNoYW5nZVBsYXliYWNrQXVkaW8iLCJfdGhpczkiLCJjYXB0aW9ucyIsImN1cnJlbnRDYXB0aW9uIiwic3VidGl0bGUiLCJsYWJlbCIsImNoYW5nZVBsYXliYWNrQ2FwdGlvbnMiLCJfdGhpczAiLCJ2aWRlb1F1YWxpdHlTZWxlY3RvciIsInB1c2giLCJhdWRpb0xhbmd1YWdlU2VsZWN0b3IiLCJzdWJ0aXRsZXNTZWxlY3RvciIsImhhbmRsZVBsYXlQYXVzZUtleWRvd24iLCJwYXJzZV90aW1lc3RhbXAiLCJtYXRjaCIsImhvdXJzIiwicGFyc2VJbnQiLCJtaW51dGVzIiwicGFyc2VGbG9hdCIsInJlcGxhY2UiLCJTbWFydFRWVmlkZW9QbGF5ZXIiLCJwYXJlbnRDb250YWluZXJJZCIsInBsYXllcklkIiwicG9zaXRpb24iLCJ0b3AiLCJwYXJlbnRDb250YWluZXIiLCJnZXRFbGVtZW50QnlJZCIsImJvZHkiLCJobHMiLCJkYXNoanMiLCJjbG9zZWRDYXB0aW9ucyIsImVuYWJsZVRyYWNrIiwiY2FwdGlvbnNPcHRpb25zTGlzdCIsInZpZGVvUmVzb2x1dGlvbnNMaXN0IiwiYXVkaW9MaXN0IiwidHJhY2siLCJpbml0aWFsaXplUGxheWVyIiwic3RyZWFtVXJsIiwiY29udHJvbHMiLCJhZGRQbGF5ZXJFdmVudExpc3RlbmVycyIsIndpbmRvdyIsIk1lZGlhUGxheWVyIiwiY3JlYXRlIiwid2lkZXZpbmUiLCJkcm1NZXRhZGF0YSIsInBsYXlSZWFkeSIsInByb3RlY3Rpb25EYXRhIiwic2VydmVyVVJMIiwibGljZW5zZVVybCIsImh0dHBSZXF1ZXN0SGVhZGVycyIsImxpY2Vuc2VUb2tlbiIsImluaXRpYWxpemUiLCJ1cmwiLCJhdHRhY2hUVE1MUmVuZGVyaW5nRGl2IiwiYXR0YWNoVmlldyIsInNldFByb3RlY3Rpb25EYXRhIiwicHJlbG9hZCIsIkhscyIsImlzU3VwcG9ydGVkIiwiZW5hYmxlV29ya2VyIiwibG93TGF0ZW5jeU1vZGUiLCJiYWNrQnVmZmVyTGVuZ3RoIiwibWF4QnVmZmVyTGVuZ3RoIiwibWF4TWF4QnVmZmVyTGVuZ3RoIiwibWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSIsIm1heExvYWRpbmdEZWxheSIsImxvYWRTb3VyY2UiLCJhdHRhY2hNZWRpYSIsImNhblBsYXlUeXBlIiwib24iLCJldmVudHMiLCJTVFJFQU1fSU5JVElBTElaRUQiLCJnZXRCaXRyYXRlSW5mb0xpc3RGb3IiLCJnZXRUcmFja3NGb3IiLCJjYXB0aW9uc29wdGlvbnNMaXN0IiwiZ2V0Q2FwdGlvbnNPcHRpb25zIiwiZ2V0VmlkZW9SZXNvbHV0aW9ucyIsImdldEF1ZGlvVHJhY2tzIiwidWkiLCJhdHRhY2hUbyIsIkV2ZW50cyIsIkFVRElPX1RSQUNLU19VUERBVEVEIiwiTUFOSUZFU1RfUEFSU0VEIiwibGV2ZWxzIiwib25WaWRlb0xvYWQiLCJjYW5wbGF5dGhyb3VnaCIsIm9uUGxheWViYWNrRW5kZWQiLCJwbGF5YmFja3Byb2dyZXNzIiwib25QbGF5aW5nIiwib25FcnJvciIsIm9uQnVmZmVyaW5nIiwib25QbGF5Iiwib25TZWVrZWQiLCJvblN0YWxsZWQiLCJhZGRBbGxDYXB0aW9uc1RvUGxheWVyIiwiYWxsQ0NUcmFja3MiLCJsb2ciLCJjb3VudGVyVmFyaWFibGUiLCJjdXJyZW50TGFiZWwiLCJmZXRjaCIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJoYXNPd25Qcm9wZXJ0eSIsInZ0dE9iaiIsImFkZENhcHRpb25Ub1BsYXllciIsImNhdGNoIiwiZXJyb3IiLCJfdGhpcyRwbGF5ZXIiLCJhZGRUZXh0VHJhY2siLCJ2dHQiLCJsaW5lcyIsInRyaW0iLCJzcGxpdCIsImxpbmUiLCJtZXNzYWdlIiwiY3VlcyIsInN0YXJ0IiwicGF5bG9hZCIsImluZGV4T2YiLCJjdWUiLCJzcGxpdHRlZCIsIlZUVEN1ZSIsIk51bWJlciIsInZ0dF9vcl9zcnRfcGFyc2VyIiwiYWRkQ3VlIiwiX3RyYWNrJGtpbmQiLCJfdHJhY2skY3VlcyJdLCJtYXBwaW5ncyI6IjBsREFBQSxJQUFhQSxFQUFNLFdBNkJkLE9BQUFDLEVBNUJELFNBQUFELEVBQVlFLEdBQ1IsR0FEZUMsT0FBQUgsSUFDVkUsRUFDRCxNQUFNLElBQUlFLE1BQU0sb0NBYXBCLEdBVkFDLEtBQUtDLE9BQVNKLEVBQU1JLFFBQVUsR0FDOUJELEtBQUtFLFdBQWFMLEVBQU1LLFlBQWMsR0FD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
@@ -0,0 +1,45 @@
1
+ export interface VideoPlayerOptions {
2
+ onPlaybackSuccess?: () => void;
3
+ onPlaybackEnded?: () => void;
4
+ onPlaybackError?: (error?: any) => void;
5
+ src: string;
6
+ autoplay?: boolean;
7
+ controls?: boolean;
8
+ width?: number;
9
+ height?: number;
10
+ }
11
+ type EventHandler = (...args: any[]) => void;
12
+ type VideoPlayerEvent = 'play' | 'pause' | 'ended' | 'timeupdate' | 'error' | 'loadedmetadata' | 'seeking' | 'seeked' | 'volumechange';
13
+ export declare class LightningVideoPlayer {
14
+ /**
15
+ * Reinitialize the current videoElement with a new set of options and handle autoplay.
16
+ */
17
+ reinitialize(options: VideoPlayerOptions): void;
18
+ private videoElement;
19
+ private options;
20
+ private listeners;
21
+ private boundEmitters;
22
+ private boundHandlerMap;
23
+ constructor(options: VideoPlayerOptions);
24
+ attachTo(container: HTMLElement): void;
25
+ play(): void;
26
+ pause(): void;
27
+ stop(): void;
28
+ destroy(): void;
29
+ get element(): HTMLVideoElement;
30
+ onPlay(e: Event): void;
31
+ onPause(e: Event): void;
32
+ onEnded(e: Event): void;
33
+ onTimeupdate(e: Event): void;
34
+ onError(e: Event): void;
35
+ onLoadedmetadata(e: Event): void;
36
+ onSeeking(e: Event): void;
37
+ onSeeked(e: Event): void;
38
+ onVolumechange(e: Event): void;
39
+ on(event: VideoPlayerEvent, handler: EventHandler): void;
40
+ off(event: VideoPlayerEvent, handler: EventHandler): void;
41
+ once(event: VideoPlayerEvent, handler: EventHandler): void;
42
+ private emitEvent;
43
+ private removeAllListeners;
44
+ }
45
+ export {};
@@ -0,0 +1,2 @@
1
+ body{background-color:#000;box-sizing:border-box;margin:0;padding:0}.vl-player-container .seekbar-container{background:#444;border-radius:6px;bottom:50px;cursor:pointer;height:12px;left:50%;margin:0;position:absolute;transform:translateX(-50%);user-select:none;width:90%;z-index:20}.vl-player-container .seekbar-buffer{background:#888;border-radius:6px;height:100%;position:absolute;width:0;z-index:1}.vl-player-container .seekbar-progress{background:#4169e1;border-radius:6px;height:100%;position:absolute;transition:width .1s linear;width:0;z-index:2}.vl-player-container .seekbar-thumb{background:#fff;border:2px solid #4169e1;border-radius:50%;box-shadow:0 2px 8px rgba(0,0,0,.2);cursor:pointer;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);transition:background .2s;width:16px;z-index:3}.vl-player-container .seekbar-thumb:hover{background:#ffeaea}.vl-player-container .seekbar-tooltip{background:#222;border-radius:4px;bottom:24px;color:#fff;font-size:12px;left:0;padding:2px 8px;pointer-events:none;position:absolute;transform:translateX(-50%);white-space:nowrap;z-index:10}.vl-player-container .seekbar-duration-label,.vl-player-container .seekbar-time-label{color:#eee;font-size:13px;margin-right:4px;position:relative;top:18px;z-index:5}.vl-player-container .play-pause-btn{background:hsla(0,0%,100%,.5);border-radius:50%;cursor:pointer;height:70px;left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%);width:70px;z-index:20}.vl-player-container .play-pause-btn img{height:50px;left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.vl-player-container .left-side-container{bottom:77px;display:flex;left:5%;position:absolute!important}.vl-player-container .right-side-container{bottom:77px;display:flex;position:absolute!important;right:5%}.vl-player-container .settings-btn{background:hsla(0,0%,100%,.5);border-radius:5px;bottom:100px;cursor:pointer;height:40px;margin:0 5px;padding:5px;width:50px;z-index:20}.vl-player-container .settings-btn img{height:100%}.vl-player-container .restart-btn{border:2px solid #fff;border-radius:8px;bottom:100px;color:#fff;cursor:pointer;display:flex;flex-direction:column;font-size:16px;font-weight:700;justify-content:center;margin:0 5px;padding:5px;right:2%;z-index:20}.vl-player-container .default-option-wrapper{align-items:center;background:#525760;border-radius:2px;box-shadow:0 10px 15px rgba(0,0,0,.1);color:#fff;cursor:pointer;display:flex;font-size:18px;font-weight:700;height:50px;justify-content:space-between;margin:20px 0;padding:5px 10px;text-transform:capitalize;width:95%}.vl-player-container .default-option-wrapper span{height:40px}.vl-player-container .default-option-wrapper span>img{height:100%}.vl-player-container .default-sidebar{background-color:rgba(30,30,30,.75);color:#fff;display:flex;flex-direction:column;height:100%;min-height:720px;padding:50px 20px 0;position:absolute;right:0;top:0;width:400px;z-index:30}
2
+ /*# sourceMappingURL=index.esm.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.css"],"names":[],"mappings":"AACE,KAIE,qBAAsB,CADtB,qBAAsB,CAFtB,QAAS,CACT,SAGF,CACF,wCAMI,eAAgB,CAGhB,iBAAkB,CALlB,WAAY,CAIZ,cAAe,CAHf,WAAY,CAHZ,QAAS,CAQT,QAAS,CATT,iBAAkB,CAElB,0BAA2B,CAQ3B,gBAAiB,CAJjB,SAAU,CAKV,UACF,CAEF,qCAGI,eAAgB,CAEhB,iBAAkB,CAHlB,WAAY,CADZ,iBAAkB,CAGlB,OAAQ,CAER,SACF,CAEF,uCAGI,kBAAmB,CAEnB,iBAAkB,CAHlB,WAAY,CADZ,iBAAkB,CAMlB,2BAA6B,CAH7B,OAAQ,CAER,SAEF,CAEF,oCAMI,eAAgB,CAEhB,wBAAyB,CADzB,iBAAkB,CAGlB,mCAAqC,CACrC,cAAe,CANf,WAAY,CAJZ,iBAAkB,CAClB,OAAQ,CACR,8BAAgC,CAShC,yBAA2B,CAR3B,UAAW,CAKX,SAIF,CACD,0CACG,kBACF,CAED,sCAKG,eAAgB,CAGhB,iBAAkB,CANlB,WAAY,CAIZ,UAAW,CAGX,cAAe,CANf,MAAO,CAIP,eAAgB,CAIhB,mBAAoB,CAVpB,iBAAkB,CAGlB,0BAA2B,CAM3B,kBAAmB,CAEnB,UACF,CAEF,sFAII,UAAW,CADX,cAAe,CAEf,gBAAiB,CAJjB,iBAAkB,CAClB,QAAS,CAIT,SACF,CAOF,qCASE,6BAAiC,CADjC,iBAAkB,CAElB,cAAe,CAHf,WAAY,CALZ,QAAS,CADT,2BAA6B,CAE7B,OAAQ,CACR,8BAAgC,CAEhC,UAAW,CADX,UAMF,CAEA,yCAKE,WAAY,CAHZ,QAAS,CADT,2BAA6B,CAE7B,OAAQ,CACR,8BAEF,CAGA,0CAIE,WAAY,CAFZ,YAAa,CACb,OAAQ,CAFR,2BAIF,CAEA,2CAIE,WAAY,CAFZ,YAAa,CADb,2BAA6B,CAE7B,QAEF,CAEA,mCAOE,6BAAkC,CANlC,iBAAkB,CAElB,YAAa,CAKb,cAAe,CAHf,WAAY,CACZ,YAAa,CAJb,WAAY,CAEZ,UAAW,CAKX,UACF,CAEA,uCACE,WACF,CAEA,kCAKE,qBAAsB,CAHtB,iBAAkB,CAElB,YAAa,CAEb,UAAW,CAOX,cAAe,CAJf,YAAa,CACb,qBAAsB,CAHtB,cAAe,CACf,eAAgB,CAGhB,sBAAuB,CACvB,YAAa,CATb,WAAY,CAFZ,QAAS,CAaT,UACF,CAIA,6CAGE,kBAAmB,CAGnB,kBAAmB,CAKnB,iBAAkB,CAClB,qCAAyC,CALzC,UAAW,CAQX,cAAe,CAdf,YAAa,CASb,cAAe,CADf,eAAgB,CAJhB,WAAY,CAHZ,6BAA8B,CAW9B,aAAgB,CALhB,gBAAiB,CAMjB,yBAA0B,CAV1B,SAYF,CACA,kDACE,WACF,CAEA,sDACE,WACF,CAGA,sCAME,mCAAuC,CAHvC,UAAW,CACX,YAAa,CACb,qBAAsB,CAEtB,WAAY,CACZ,gBAAiB,CAEjB,mBAAyB,CATzB,iBAAkB,CAUlB,OAAU,CATV,KAAM,CAON,WAAY,CAGZ,UAEF","file":"index.esm.css","sourcesContent":["/*************** playerSeekbar.css ***************/\n body {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n background-color: #000;\n }\n.vl-player-container .seekbar-container {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n bottom: 50px;\n height: 12px;\n background: #444;\n width: 90%;\n cursor: pointer;\n border-radius: 6px;\n margin: 0;\n user-select: none;\n z-index: 20;\n }\n \n.vl-player-container .seekbar-buffer {\n position: absolute;\n height: 100%;\n background: #888;\n width: 0;\n border-radius: 6px;\n z-index: 1;\n }\n \n.vl-player-container .seekbar-progress {\n position: absolute;\n height: 100%;\n background: #4169E1;\n width: 0;\n border-radius: 6px;\n z-index: 2;\n transition: width 0.1s linear;\n }\n \n.vl-player-container .seekbar-thumb {\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n border: 2px solid #4169E1;\n z-index: 3;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n cursor: pointer;\n transition: background 0.2s;\n }\n .vl-player-container .seekbar-thumb:hover {\n background: #ffeaea;\n }\n \n .vl-player-container .seekbar-tooltip {\n position: absolute;\n bottom: 24px;\n left: 0;\n transform: translateX(-50%);\n background: #222;\n color: #fff;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n }\n \n.vl-player-container .seekbar-time-label, .vl-player-container .seekbar-duration-label {\n position: relative;\n top: 18px;\n font-size: 13px;\n color: #eee;\n margin-right: 4px;\n z-index: 5;\n }\n \n\n\n\n/*************** playerButtons.css ***************/\n\n.vl-player-container .play-pause-btn {\n position: absolute !important;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n z-index: 20;\n width: 70px;\n height: 70px;\n border-radius: 50%;\n background: rgba(255,255,255, .5);\n cursor: pointer;\n} \n\n.vl-player-container .play-pause-btn img {\n position: absolute !important;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n height: 50px;\n}\n\n\n.vl-player-container .left-side-container {\n position: absolute !important;\n display: flex;\n left: 5%;\n bottom: 77px;\n}\n\n.vl-player-container .right-side-container {\n position: absolute !important;\n display: flex;\n right: 5%;\n bottom: 77px;\n}\n\n.vl-player-container .settings-btn {\n border-radius: 5px;\n padding: 5px;\n bottom: 100px;\n width: 50px;\n height: 40px;\n margin: 0 5px;\n background: rgba(255,255,255, 0.5);\n cursor: pointer;\n z-index: 20;\n}\n\n.vl-player-container .settings-btn img{\n height: 100%;\n}\n\n.vl-player-container .restart-btn {\n right: 2%;\n border-radius: 8px;\n padding: 5px;\n bottom: 100px;\n border: 2px solid #fff;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin: 0 5px;\n cursor: pointer;\n z-index: 20;\n}\n\n\n/*************** player-setting-option-wrapper ***************/\n.vl-player-container .default-option-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 95%;\n height: 50px;\n background: #525760;\n color: #fff;\n padding: 5px 10px;\n font-weight: 700;\n font-size: 18px;\n border-radius: 2px;\n box-shadow: 0 10px 15px rgba(0, 0, 0, .1);\n margin: 20px 0px;\n text-transform: capitalize;\n cursor: pointer;\n}\n.vl-player-container .default-option-wrapper span {\n height: 40px;\n}\n\n.vl-player-container .default-option-wrapper span > img{\n height: 100%;\n}\n\n\n.vl-player-container .default-sidebar {\n position: absolute;\n top: 0;\n color: #fff;\n display: flex;\n flex-direction: column;\n background-color: rgba(30, 30, 30, .75);\n height: 100%;\n min-height: 720px;\n width: 400px;\n padding: 50px 20px 0 20px;\n right: 0px;\n z-index: 30;\n /* right: -450px; */\n}"]}