@serenityjs/plugins 0.6.3 → 0.6.4-beta-20241210051348
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @serenityjs/plugins
|
|
2
2
|
|
|
3
|
+
## 0.6.4-beta-20241210051348
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`063df63`](https://github.com/SerenityJS/serenity/commit/063df632c6898164db7bacff0106abd2303ace01) Thanks [@PMK744](https://github.com/PMK744)! - init v0.6.4-beta
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`063df63`](https://github.com/SerenityJS/serenity/commit/063df632c6898164db7bacff0106abd2303ace01)]:
|
|
10
|
+
- @serenityjs/protocol@0.6.4-beta-20241210051348
|
|
11
|
+
- @serenityjs/logger@0.6.4-beta-20241210051348
|
|
12
|
+
- @serenityjs/core@0.6.4-beta-20241210051348
|
|
13
|
+
|
|
3
14
|
## 0.6.3
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var y=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var u=(a,e)=>y(a,"name",{value:e,configurable:!0});var L=(a,e)=>{for(var r in e)y(a,r,{get:e[r],enumerable:!0})},q=(a,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of F(e))!C.call(a,t)&&t!==r&&y(a,t,{get:()=>e[t],enumerable:!(n=D(e,t))||n.enumerable});return a};var _=a=>q(y({},"__esModule",{value:!0}),a);var T={};L(T,{DefaultPipelineProperties:()=>I,Pipeline:()=>W,Plugin:()
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIHtcbiAgICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+XG4gICAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgICAgICBpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBcInBhY2thZ2VcIiksXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQU4sR0NDQSxJQUFBTyxFQVFPLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBQ3pDQyxFQUF5Qix5QkFFekJDLEVBQXFDLDhCQUNyQ0MsRUFBa0QsNEJBQ2xEQyxFQUE2QixvQ0NmN0IsSUFBQUMsRUFBcUMsOEJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVEV0wsSUFBTUMsRUFBTixLQUFNQSxDQWJOLE1BYU1BLENBQUFBLEVBQUFBLGVBSVlDLFdBS0FDLFFBS0FDLE9BS0FDLEtBTVRDLEtBTUFDLFVBTUFDLFNBTUFDLFNBUVAsWUFDRVAsRUFDQUMsRUFDQU8sRUFDQSxDQUVBLEtBQUtSLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSE0sR0FBWU4sUUFDWixJQUFJTyxTQUFPLEdBQUdULENBQUFBLElBQWNDLENBQUFBLEdBQVdTLGVBQWFDLElBQUksRUFHMUQsS0FBS1IsS0FBT0ssR0FBWUwsTUFBUVMsRUFBV0MsTUFHdkNMLEdBQVlNLGVBQWMsS0FBS0Es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K0UsTUFBTyxRQUFTLENBQUEsRUFHekQsSUFBTTBCLEtBQVV0RSxlQUFZdUIsRUFBTzFELElBQUksRUFBRTBHLEtBQU1DLEdBQzdDQSxFQUFLbEUsU0FBUyxNQUFBLENBQUEsRUFJaEIsR0FBSSxDQUFDZ0UsRUFBUyxNQUFNLElBQUl2RixNQUFNLDJCQUFBLEVBRzlCLElBQU15QixLQUFTRSxtQkFBYWQsV0FBUTJCLEVBQU8xRCxLQUFNeUcsQ0FBQUEsQ0FBQUEsS0FHakQ1QixpQkFBVzlDLFdBQVEyQixFQUFPMUQsS0FBTXlHLENBQUFBLENBQUFBLEVBR2hDM0QsRUFBT3dELFlBQVkzRCxDQUFBQSxLQUduQmMsb0JBQ0UxQixXQUFRLEtBQUsvQixLQUFNLEdBQUcwRCxFQUFPUyxVQUFVLFNBQVMsS0FDaERvQyxlQUFZekQsRUFBTzBELFVBQVMsQ0FBQSxDQUFBLENBRWhDLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJzcmNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5UeXBlIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3psaWIiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xvZ2dlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAiX3BsdWdpbiIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicGx1Z2luIiwgInJlcXVpcmUiLCAiZGVmYXVsdCIsICJQbHVnaW4iLCAid2FybiIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJoYXMiLCAiaWRlbnRpZmllciIsICJwaXBlbGluZSIsICJpc0J1bmRsZWQiLCAic2V0IiwgIm9uSW5pdGlhbGl6ZSIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAicmVhc29uIiwgImVycm9yIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiaW5mbyIsICJ3cml0ZUJ5dGUiLCAiaW5wdXRQYXRoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJ0YXJiYWxsIiwgImZpbmQiLCAiZmlsZSJdCn0K
|
|
1
|
+
"use strict";var y=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var u=(a,e)=>y(a,"name",{value:e,configurable:!0});var L=(a,e)=>{for(var r in e)y(a,r,{get:e[r],enumerable:!0})},q=(a,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of F(e))!C.call(a,t)&&t!==r&&y(a,t,{get:()=>e[t],enumerable:!(n=D(e,t))||n.enumerable});return a};var _=a=>q(y({},"__esModule",{value:!0}),a);var T={};L(T,{DefaultPipelineProperties:()=>I,Pipeline:()=>W,Plugin:()=>P,PluginType:()=>h});module.exports=_(T);var s=require("fs"),i=require("path"),g=require("zlib"),$=require("child_process"),v=require("@serenityjs/logger"),w=require("@serenityjs/core"),E=require("@serenityjs/binarystream");var S=require("@serenityjs/logger");var h=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(h||{});var P=class{static{u(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,r,n){this.identifier=e,this.version=r,this.logger=n?.logger??new S.Logger(`${e}@${r}`,S.LoggerColors.Blue),this.type=n?.type??h.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};var A=require("path"),U=require("@serenityjs/protocol");var z=require("@serenityjs/core");var m=class extends z.CustomEnum{static{u(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends z.CustomEnum{static{u(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var j=u((a,e)=>{a.commands.register("plugins","Interact with the plugins of the server",r=>{r.permissionLevel=U.CommandPermissionLevel.Operator,r.overload({action:B},({action:n})=>{if(n.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let t=[...e.plugins.values()],o=[];for(let d of t)o.push(`\xA7u${d.identifier} v${d.version}\xA7r`);return{message:`\xA77Active Plugins (${t.length}):\xA7r ${o.join("\xA77,\xA7r ")}`}}),r.overload({action:B,plugin:m},({action:n,plugin:t})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let o=e.plugins.get(t.result);if(!o)throw new Error(`Plugin ${t.result} is not found.`);if(n.result==="reload")return e.reload(o),{message:`\xA7aSuccessfully reloaded \xA72${o.identifier}\xA7a.`};if(o.isBundled)throw new Error(`Plugin ${o.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(o),{message:`\xA7aSuccessfully bundled \xA72${o.identifier}\xA7a, output file was placed at \xA77${(0,A.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),k=j;var I={path:"./plugins",commands:!0,initialize:!0},W=class{static{u(this,"Pipeline")}serenity;properties;logger=new v.Logger("Plugins",v.LoggerColors.CyanBright);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,r){this.serenity=e,this.properties={...I,...r},e.on(w.ServerEvent.Start,this.start.bind(this)),e.on(w.ServerEvent.Stop,this.stop.bind(this)),this.properties.commands&&e.on(w.WorldEvent.WorldInitialize,({world:n})=>k(n,this)),this.properties.initialize&&this.initialize()}initialize(){(0,s.existsSync)((0,i.resolve)(this.path))||(0,s.mkdirSync)((0,i.resolve)(this.path),{recursive:!0});let r=(0,s.readdirSync)((0,i.resolve)(this.path),{withFileTypes:!0}).filter(t=>t.isFile()?t.name.endsWith(".plugin"):!1);for(let t of r)try{let o=(0,i.resolve)(this.path,t.name),d=(0,g.inflateSync)((0,s.readFileSync)(o)),c=new E.BinaryStream(d),b=c.readByte();if(b===h.Addon){let l=c.readRemainingBuffer().toString("utf-8"),f=(0,i.resolve)(this.path,t.name.slice(0,-7));(0,s.writeFileSync)(f,l);let p=require(f).default;if(!(p instanceof P)){this.logger.warn(`Unable to load plugin from \xA78${(0,i.relative)(process.cwd(),o)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=o,p.isBundled=!0,this.plugins.set(p.identifier,p),p.onInitialize(p),m.options.push(p.identifier),this.tempPaths.add(f)}else if(b===h.Api){let l=c.readRemainingBuffer();(0,s.unlinkSync)(o);let f=(0,i.resolve)(this.path,t.name.slice(0,-7));(0,s.writeFileSync)(f,l),(0,$.execSync)(`tar -xzf ${f} -C ${this.path}`,{stdio:"ignore"}),(0,s.unlinkSync)(f);let x=t.name.slice(0,-7);(0,s.renameSync)((0,i.resolve)(this.path,"package"),(0,i.resolve)(this.path,x)),(0,$.execSync)("npm install",{cwd:(0,i.resolve)(this.path,x),stdio:"ignore"})}}catch(o){this.logger.error(`Failed to load plugin from "${(0,i.relative)(process.cwd(),(0,i.resolve)(this.path,t.name))}", skipping the plugin.`,o)}let n=(0,s.readdirSync)((0,i.resolve)(this.path),{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of n)try{let o=(0,i.resolve)(this.path,t.name);if(!(0,s.existsSync)((0,i.resolve)(o,"package.json")))continue;let d=JSON.parse((0,s.readFileSync)((0,i.resolve)(o,"package.json"),"utf-8")),c=(0,i.resolve)(o,d.main);if(!(0,s.existsSync)((0,i.resolve)(o,c))){this.logger.warn(`Unable to load plugin \xA71${d.name}\xA78@\xA71${d.version}\xA7r, the main entry path "\xA78${(0,i.relative)(process.cwd(),(0,i.resolve)(o,c))}\xA7r" was not found in the directory.`);continue}let l=require((0,i.resolve)(o,c)).default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=o,l.isBundled=!1,this.plugins.set(l.identifier,l),m.options.push(l.identifier),l.onInitialize(l)}catch(o){this.logger.error(`Failed to load plugin from "${(0,i.relative)(process.cwd(),(0,i.resolve)(this.path,t.name))}", skipping the plugin.`,o)}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)(0,s.unlinkSync)(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let r=e.path;delete require.cache[require.resolve(r)],this.serenity.removePath(r);try{let t=require(r).default;if(!(t instanceof P)){this.logger.warn(`Unable to reload plugin from \xA78${(0,i.relative)(process.cwd(),r)}\xA7r, the plugin is not an instance of the Plugin class.`);return}t.pipeline=this,t.serenity=this.serenity,t.path=r,this.plugins.set(t.identifier,t),t.onInitialize(t),t.onStartUp(t),this.logger.info(`Successfully reloaded plugin \xA71${t.identifier}\xA7r from \xA78${(0,i.relative)(process.cwd(),r)}\xA7r.`)}catch(n){this.logger.error(`Failed to reload plugin from \xA78${(0,i.relative)(process.cwd(),r)}\xA7r, skipping the plugin.`,n)}}bundle(e){let r=new E.BinaryStream;if(r.writeByte(e.type),e.type===h.Addon){let n=(0,i.resolve)(e.path,"dist"),t=(0,s.readFileSync)((0,i.resolve)(n,"index.js"));r.writeBuffer(t),(0,s.writeFileSync)((0,i.resolve)(this.path,`${e.identifier}.plugin`),(0,g.deflateSync)(r.getBuffer()))}else if(e.type===h.Api){(0,$.execSync)("npm pack",{cwd:e.path,stdio:"ignore"});let n=(0,s.readdirSync)(e.path).find(o=>o.endsWith(".tgz"));if(!n)throw new Error("Packed tarball not found.");let t=(0,s.readFileSync)((0,i.resolve)(e.path,n));(0,s.unlinkSync)((0,i.resolve)(e.path,n)),r.writeBuffer(t),(0,s.writeFileSync)((0,i.resolve)(this.path,`${e.identifier}.plugin`),(0,g.deflateSync)(r.getBuffer()))}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIHtcbiAgICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+XG4gICAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgICAgICBpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLCByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSkpO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQU4sR0NDQSxJQUFBTyxFQVFPLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBQ3pDQyxFQUF5Qix5QkFFekJDLEVBQXFDLDhCQUNyQ0MsRUFBa0QsNEJBQ2xEQyxFQUE2QixvQ0NmN0IsSUFBQUMsRUFBcUMsOEJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVEV0wsSUFBTUMsRUFBTixLQUFNQSxDQWJOLE1BYU1BLENBQUFBLEVBQUFBLGVBSVlDLFdBS0FDLFFBS0FDLE9BS0FDLEtBTVRDLEtBTUFDLFVBTUFDLFNBTUFDLFNBUVAsWUFDRVAsRUFDQUMsRUFDQU8sRUFDQSxDQUVBLEtBQUtSLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSE0sR0FBWU4sUUFDWixJQUFJTyxTQUFPLEdBQUdULENBQUFBLElBQWNDLENBQUFBLEdBQVdTLGVBQWFDLElBQUksRUFHMUQsS0FBS1IsS0FBT0ssR0FBWUwsTUFBUVMsRUFBV0MsTUFHdkNMLEdBQVlNLGVBQWMsS0FBS0EsYUFBZU4sRUFBV00sY0FDekROLEdBQVlPLFlBQVcsS0FBS0EsVUFBWVAsRUFBV08sV0FDbkRQLEdBQVlRLGFBQVksS0FB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LENBQUNnRSxFQUFTLE1BQU0sSUFBSXZGLE1BQU0sMkJBQUEsRUFHOUIsSUFBTXlCLEtBQVNFLG1CQUFhZCxXQUFRMkIsRUFBTzFELEtBQU15RyxDQUFBQSxDQUFBQSxLQUdqRDVCLGlCQUFXOUMsV0FBUTJCLEVBQU8xRCxLQUFNeUcsQ0FBQUEsQ0FBQUEsRUFHaEMzRCxFQUFPd0QsWUFBWTNELENBQUFBLEtBR25CYyxvQkFDRTFCLFdBQVEsS0FBSy9CLEtBQU0sR0FBRzBELEVBQU9TLFVBQVUsU0FBUyxLQUNoRG9DLGVBQVl6RCxFQUFPMEQsVUFBUyxDQUFBLENBQUEsQ0FFaEMsQ0FDRixDQUNGIiwKICAibmFtZXMiOiBbInNyY19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbm9kZV9jaGlsZF9wcm9jZXNzIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfbG9nZ2VyIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfY29yZSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkN5YW5CcmlnaHQiLCAicGx1Z2lucyIsICJNYXAiLCAidGVtcFBhdGhzIiwgIlNldCIsICJlc20iLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiXyIsICJFcnJvciIsICJvbiIsICJTZXJ2ZXJFdmVudCIsICJTdGFydCIsICJzdGFydCIsICJiaW5kIiwgIlN0b3AiLCAic3RvcCIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJ3b3JsZCIsICJDb21tYW5kIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImluZGV4IiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidG9TdHJpbmciLCAidGVtcFBhdGgiLCAic2xpY2UiLCAid3JpdGVGaWxlU3luYyIsICJwbHVnaW4iLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInVubGlua1N5bmMiLCAiZXhlY1N5bmMiLCAic3RkaW8iLCAicmVuYW1lU3luYyIsICJyZWFzb24iLCAiZXJyb3IiLCAiZGlyZWN0b3JpZXMiLCAiaXNEaXJlY3RvcnkiLCAiZGlyZWN0b3J5IiwgIm1hbmlmZXN0IiwgIkpTT04iLCAicGFyc2UiLCAibWFpbiIsICJ2ZXJzaW9uIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var D=Object.defineProperty;var p=(s,e)=>D(s,"name",{value:e,configurable:!0}),m=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});import{existsSync as x,mkdirSync as j,readdirSync as z,readFileSync as w,renameSync as W,unlinkSync as y,writeFileSync as S}from"node:fs";import{relative as f,resolve as o}from"node:path";import{deflateSync as U,inflateSync as T}from"node:zlib";import{execSync as B}from"node:child_process";import{Logger as N,LoggerColors as O}from"@serenityjs/logger";import{ServerEvent as k,WorldEvent as R}from"@serenityjs/core";import{BinaryStream as I}from"@serenityjs/binarystream";import{Logger as F,LoggerColors as C}from"@serenityjs/logger";var h=function(s){return s[s.Addon=0]="Addon",s[s.Api=1]="Api",s}(h||{});var v=class{static{p(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,r,n){this.identifier=e,this.version=r,this.logger=n?.logger??new F(`${e}@${r}`,C.Blue),this.type=n?.type??h.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};import{relative as L}from"path";import{CommandPermissionLevel as q}from"@serenityjs/protocol";import{CustomEnum as E}from"@serenityjs/core";var g=class extends E{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},b=class extends E{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var _=p((s,e)=>{s.commands.register("plugins","Interact with the plugins of the server",r=>{r.permissionLevel=q.Operator,r.overload({action:b},({action:n})=>{if(n.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let t=[...e.plugins.values()],i=[];for(let u of t)i.push(`\xA7u${u.identifier} v${u.version}\xA7r`);return{message:`\xA77Active Plugins (${t.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),r.overload({action:b,plugin:g},({action:n,plugin:t})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let i=e.plugins.get(t.result);if(!i)throw new Error(`Plugin ${t.result} is not found.`);if(n.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${L(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),A=_;var J={path:"./plugins",commands:!0,initialize:!0},be=class{static{p(this,"Pipeline")}serenity;properties;logger=new N("Plugins",O.CyanBright);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,r){this.serenity=e,this.properties={...J,...r},e.on(k.Start,this.start.bind(this)),e.on(k.Stop,this.stop.bind(this)),this.properties.commands&&e.on(R.WorldInitialize,({world:n})=>A(n,this)),this.properties.initialize&&this.initialize()}initialize(){x(o(this.path))||j(o(this.path),{recursive:!0});let r=z(o(this.path),{withFileTypes:!0}).filter(t=>t.isFile()?t.name.endsWith(".plugin"):!1);for(let t of r)try{let i=o(this.path,t.name),u=T(w(i)),d=new I(u)
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIHtcbiAgICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+XG4gICAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgICAgICBpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBcInBhY2thZ2VcIiksXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBQ3pDLE9BQVNDLFlBQUFBLE1BQWdCLHFCQUV6QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQW1CQyxlQUFBQSxFQUFhQyxjQUFBQSxNQUFrQixtQkFDbEQsT0FBU0MsZ0JBQUFBLE1BQW9CLDJCQ2Y3QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVEV0wsSUFBTUMsRUFBTixLQUFNQSxDQWJOLE1BYU1BLENBQUFBLEVBQUFBLGVBSVlDLFdBS0FDLFFBS0FDLE9BS0FDLEtBTVRDLEtBTUFDLFVBTUFDLFNBTUFDLFNBUVAsWUFDRVAsRUFDQUMsRUFDQU8sRUFDQSxDQUVBLEtBQUtSLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSE0sR0FBWU4sUUFDWixJQUFJTyxFQUFPLEdBQUdULENBQUFBLElBQWNDLENBQUFBLEdBQVdTLEVBQWFDLElBQUksRUFHMUQsS0FBS1IsS0FBT0ssR0FBWUwsTUFBUVMsRUFBV0MsTUFHdkNMLEdBQVlN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RWIsSUFBS1AsRUFBTzFELEtBQU0rRSxNQUFPLFFBQVMsQ0FBQSxFQUd6RCxJQUFNMEIsRUFBVXRFLEVBQVl1QixFQUFPMUQsSUFBSSxFQUFFMEcsS0FBTUMsR0FDN0NBLEVBQUtsRSxTQUFTLE1BQUEsQ0FBQSxFQUloQixHQUFJLENBQUNnRSxFQUFTLE1BQU0sSUFBSXZGLE1BQU0sMkJBQUEsRUFHOUIsSUFBTXlCLEVBQVNFLEVBQWFkLEVBQVEyQixFQUFPMUQsS0FBTXlHLENBQUFBLENBQUFBLEVBR2pENUIsRUFBVzlDLEVBQVEyQixFQUFPMUQsS0FBTXlHLENBQUFBLENBQUFBLEVBR2hDM0QsRUFBT3dELFlBQVkzRCxDQUFBQSxFQUduQmMsRUFDRTFCLEVBQVEsS0FBSy9CLEtBQU0sR0FBRzBELEVBQU9TLFVBQVUsU0FBUyxFQUNoRG9DLEVBQVl6RCxFQUFPMEQsVUFBUyxDQUFBLENBQUEsQ0FFaEMsQ0FDRixDQUNGIiwKICAibmFtZXMiOiBbImV4aXN0c1N5bmMiLCAibWtkaXJTeW5jIiwgInJlYWRkaXJTeW5jIiwgInJlYWRGaWxlU3luYyIsICJyZW5hbWVTeW5jIiwgInVubGlua1N5bmMiLCAid3JpdGVGaWxlU3luYyIsICJyZWxhdGl2ZSIsICJyZXNvbHZlIiwgImRlZmxhdGVTeW5jIiwgImluZmxhdGVTeW5jIiwgImV4ZWNTeW5jIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiU2VydmVyRXZlbnQiLCAiV29ybGRFdmVudCIsICJCaW5hcnlTdHJlYW0iLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAiX3BsdWdpbiIsICJyZWxhdGl2ZSIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIkN1c3RvbUVudW0iLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicGx1Z2luIiwgInJlcXVpcmUiLCAiZGVmYXVsdCIsICJQbHVnaW4iLCAid2FybiIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJoYXMiLCAiaWRlbnRpZmllciIsICJwaXBlbGluZSIsICJpc0J1bmRsZWQiLCAic2V0IiwgIm9uSW5pdGlhbGl6ZSIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAicmVhc29uIiwgImVycm9yIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiaW5mbyIsICJ3cml0ZUJ5dGUiLCAiaW5wdXRQYXRoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJ0YXJiYWxsIiwgImZpbmQiLCAiZmlsZSJdCn0K
|
|
1
|
+
var D=Object.defineProperty;var p=(s,e)=>D(s,"name",{value:e,configurable:!0}),m=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});import{existsSync as x,mkdirSync as j,readdirSync as z,readFileSync as w,renameSync as W,unlinkSync as y,writeFileSync as S}from"node:fs";import{relative as f,resolve as o}from"node:path";import{deflateSync as U,inflateSync as T}from"node:zlib";import{execSync as B}from"node:child_process";import{Logger as N,LoggerColors as O}from"@serenityjs/logger";import{ServerEvent as k,WorldEvent as R}from"@serenityjs/core";import{BinaryStream as I}from"@serenityjs/binarystream";import{Logger as F,LoggerColors as C}from"@serenityjs/logger";var h=function(s){return s[s.Addon=0]="Addon",s[s.Api=1]="Api",s}(h||{});var v=class{static{p(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,r,n){this.identifier=e,this.version=r,this.logger=n?.logger??new F(`${e}@${r}`,C.Blue),this.type=n?.type??h.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};import{relative as L}from"path";import{CommandPermissionLevel as q}from"@serenityjs/protocol";import{CustomEnum as E}from"@serenityjs/core";var g=class extends E{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},b=class extends E{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var _=p((s,e)=>{s.commands.register("plugins","Interact with the plugins of the server",r=>{r.permissionLevel=q.Operator,r.overload({action:b},({action:n})=>{if(n.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let t=[...e.plugins.values()],i=[];for(let u of t)i.push(`\xA7u${u.identifier} v${u.version}\xA7r`);return{message:`\xA77Active Plugins (${t.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),r.overload({action:b,plugin:g},({action:n,plugin:t})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let i=e.plugins.get(t.result);if(!i)throw new Error(`Plugin ${t.result} is not found.`);if(n.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${L(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),A=_;var J={path:"./plugins",commands:!0,initialize:!0},be=class{static{p(this,"Pipeline")}serenity;properties;logger=new N("Plugins",O.CyanBright);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,r){this.serenity=e,this.properties={...J,...r},e.on(k.Start,this.start.bind(this)),e.on(k.Stop,this.stop.bind(this)),this.properties.commands&&e.on(R.WorldInitialize,({world:n})=>A(n,this)),this.properties.initialize&&this.initialize()}initialize(){x(o(this.path))||j(o(this.path),{recursive:!0});let r=z(o(this.path),{withFileTypes:!0}).filter(t=>t.isFile()?t.name.endsWith(".plugin"):!1);for(let t of r)try{let i=o(this.path,t.name),u=T(w(i)),d=new I(u),P=d.readByte();if(P===h.Addon){let a=d.readRemainingBuffer().toString("utf-8"),c=o(this.path,t.name.slice(0,-7));S(c,a);let l=m(c).default;if(!(l instanceof v)){this.logger.warn(`Unable to load plugin from \xA78${f(process.cwd(),i)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=i,l.isBundled=!0,this.plugins.set(l.identifier,l),l.onInitialize(l),g.options.push(l.identifier),this.tempPaths.add(c)}else if(P===h.Api){let a=d.readRemainingBuffer();y(i);let c=o(this.path,t.name.slice(0,-7));S(c,a),B(`tar -xzf ${c} -C ${this.path}`,{stdio:"ignore"}),y(c);let $=t.name.slice(0,-7);W(o(this.path,"package"),o(this.path,$)),B("npm install",{cwd:o(this.path,$),stdio:"ignore"})}}catch(i){this.logger.error(`Failed to load plugin from "${f(process.cwd(),o(this.path,t.name))}", skipping the plugin.`,i)}let n=z(o(this.path),{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of n)try{let i=o(this.path,t.name);if(!x(o(i,"package.json")))continue;let u=JSON.parse(w(o(i,"package.json"),"utf-8")),d=o(i,u.main);if(!x(o(i,d))){this.logger.warn(`Unable to load plugin \xA71${u.name}\xA78@\xA71${u.version}\xA7r, the main entry path "\xA78${f(process.cwd(),o(i,d))}\xA7r" was not found in the directory.`);continue}let a=m(o(i,d)).default;if(this.plugins.has(a.identifier)){this.logger.warn(`Unable to load plugin \xA71${a.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}a.pipeline=this,a.serenity=this.serenity,a.path=i,a.isBundled=!1,this.plugins.set(a.identifier,a),g.options.push(a.identifier),a.onInitialize(a)}catch(i){this.logger.error(`Failed to load plugin from "${f(process.cwd(),o(this.path,t.name))}", skipping the plugin.`,i)}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)y(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let r=e.path;delete m.cache[m.resolve(r)],this.serenity.removePath(r);try{let t=m(r).default;if(!(t instanceof v)){this.logger.warn(`Unable to reload plugin from \xA78${f(process.cwd(),r)}\xA7r, the plugin is not an instance of the Plugin class.`);return}t.pipeline=this,t.serenity=this.serenity,t.path=r,this.plugins.set(t.identifier,t),t.onInitialize(t),t.onStartUp(t),this.logger.info(`Successfully reloaded plugin \xA71${t.identifier}\xA7r from \xA78${f(process.cwd(),r)}\xA7r.`)}catch(n){this.logger.error(`Failed to reload plugin from \xA78${f(process.cwd(),r)}\xA7r, skipping the plugin.`,n)}}bundle(e){let r=new I;if(r.writeByte(e.type),e.type===h.Addon){let n=o(e.path,"dist"),t=w(o(n,"index.js"));r.writeBuffer(t),S(o(this.path,`${e.identifier}.plugin`),U(r.getBuffer()))}else if(e.type===h.Api){B("npm pack",{cwd:e.path,stdio:"ignore"});let n=z(e.path).find(i=>i.endsWith(".tgz"));if(!n)throw new Error("Packed tarball not found.");let t=w(o(e.path,n));y(o(e.path,n)),r.writeBuffer(t),S(o(this.path,`${e.identifier}.plugin`),U(r.getBuffer()))}}};export{J as DefaultPipelineProperties,be as Pipeline,v as Plugin,h as PluginType};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIHtcbiAgICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+XG4gICAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgICAgICBpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLCByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSkpO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBQ3pDLE9BQVNDLFlBQUFBLE1BQWdCLHFCQUV6QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQW1CQyxlQUFBQSxFQUFhQyxjQUFBQSxNQUFrQixtQkFDbEQsT0FBU0MsZ0JBQUFBLE1BQW9CLDJCQ2Y3QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVEV0wsSUFBTUMsRUFBTixLQUFNQSxDQWJOLE1BYU1BLENBQUFBLEVBQUFBLGVBSVlDLFdBS0FDLFFBS0FDLE9BS0FDLEtBTVRDLEtBTUFDLFVBTUFDLFNBTUFDLFNBUVAsWUFDRVAsRUFDQUMsRUFDQU8sRUFDQSxDQUVBLEtBQUtSLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSE0sR0FBWU4sUUFDWixJQUFJTyxFQUFPLEdBQUdULENBQUFBLElBQWNDLENBQUFBLEdBQVdTLEVBQWFDLElBQUksRUFHMUQsS0FBS1IsS0FBT0ssR0FBWUwsTUFBUVMsRUFBV0MsTUFHdkNMLEdBQVlNLGVBQWMsS0FBS0EsYUFBZU4sRUFBV00sY0FDekROLEdBQVlPLFlBQVcsS0FBS0EsVUFBWVAsRUFBV08sV0FDbkRQLEdB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TUFBQSxDQUFBLEVBSWhCLEdBQUksQ0FBQ2dFLEVBQVMsTUFBTSxJQUFJdkYsTUFBTSwyQkFBQSxFQUc5QixJQUFNeUIsRUFBU0UsRUFBYWQsRUFBUTJCLEVBQU8xRCxLQUFNeUcsQ0FBQUEsQ0FBQUEsRUFHakQ1QixFQUFXOUMsRUFBUTJCLEVBQU8xRCxLQUFNeUcsQ0FBQUEsQ0FBQUEsRUFHaEMzRCxFQUFPd0QsWUFBWTNELENBQUFBLEVBR25CYyxFQUNFMUIsRUFBUSxLQUFLL0IsS0FBTSxHQUFHMEQsRUFBT1MsVUFBVSxTQUFTLEVBQ2hEb0MsRUFBWXpELEVBQU8wRCxVQUFTLENBQUEsQ0FBQSxDQUVoQyxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsiZXhpc3RzU3luYyIsICJta2RpclN5bmMiLCAicmVhZGRpclN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInJlbmFtZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiZXhlY1N5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiQ3VzdG9tRW51bSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkN5YW5CcmlnaHQiLCAicGx1Z2lucyIsICJNYXAiLCAidGVtcFBhdGhzIiwgIlNldCIsICJlc20iLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiXyIsICJFcnJvciIsICJvbiIsICJTZXJ2ZXJFdmVudCIsICJTdGFydCIsICJzdGFydCIsICJiaW5kIiwgIlN0b3AiLCAic3RvcCIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJ3b3JsZCIsICJDb21tYW5kIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImluZGV4IiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidG9TdHJpbmciLCAidGVtcFBhdGgiLCAic2xpY2UiLCAid3JpdGVGaWxlU3luYyIsICJwbHVnaW4iLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInVubGlua1N5bmMiLCAiZXhlY1N5bmMiLCAic3RkaW8iLCAicmVuYW1lU3luYyIsICJyZWFzb24iLCAiZXJyb3IiLCAiZGlyZWN0b3JpZXMiLCAiaXNEaXJlY3RvcnkiLCAiZGlyZWN0b3J5IiwgIm1hbmlmZXN0IiwgIkpTT04iLCAicGFyc2UiLCAibWFpbiIsICJ2ZXJzaW9uIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@serenityjs/plugins",
|
|
3
3
|
"author": "Serenity",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.4-beta-20241210051348",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"typecheck": "tsc --noEmit"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@serenityjs/internal-config": "
|
|
23
|
+
"@serenityjs/internal-config": "0.6.4-beta-20241210051348",
|
|
24
24
|
"@swc/core": "1.7.42",
|
|
25
25
|
"@types/node": "22.8.6",
|
|
26
26
|
"eslint": "9.13.0",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@serenityjs/binarystream": "^2.6.6",
|
|
32
|
-
"@serenityjs/core": "
|
|
33
|
-
"@serenityjs/logger": "
|
|
34
|
-
"@serenityjs/protocol": "
|
|
32
|
+
"@serenityjs/core": "0.6.4-beta-20241210051348",
|
|
33
|
+
"@serenityjs/logger": "0.6.4-beta-20241210051348",
|
|
34
|
+
"@serenityjs/protocol": "0.6.4-beta-20241210051348"
|
|
35
35
|
}
|
|
36
36
|
}
|