coh-content-db 1.4.1 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.editorconfig +25 -0
  2. package/.github/workflows/build.yml +38 -0
  3. package/.github/workflows/pull-request.yml +32 -0
  4. package/.github/workflows/release.yml +52 -0
  5. package/LICENSE +24 -674
  6. package/README.md +74 -17
  7. package/dist/coh-content-db.d.ts +584 -22
  8. package/dist/coh-content-db.js +587 -2
  9. package/dist/coh-content-db.js.map +1 -0
  10. package/dist/coh-content-db.mjs +568 -0
  11. package/dist/coh-content-db.mjs.map +1 -0
  12. package/eslint.config.mjs +30 -0
  13. package/jest.config.mjs +7 -0
  14. package/package.json +31 -23
  15. package/rollup.config.mjs +27 -0
  16. package/src/main/api/alignment.ts +3 -0
  17. package/src/main/api/alternate-data.ts +22 -0
  18. package/src/main/api/archetype-data.ts +5 -0
  19. package/src/main/api/badge-data.ts +109 -0
  20. package/src/main/api/badge-partial-data.ts +65 -0
  21. package/src/main/api/badge-partial-type.ts +8 -0
  22. package/src/main/api/badge-type.ts +19 -0
  23. package/src/main/api/change.ts +14 -0
  24. package/src/main/api/enhancement-category.ts +30 -0
  25. package/src/main/api/game-map-data.ts +26 -0
  26. package/src/main/api/link.ts +4 -0
  27. package/src/main/api/plaque-type.ts +6 -0
  28. package/src/main/api/server-group-data.ts +65 -0
  29. package/src/main/api/sex.ts +3 -0
  30. package/src/main/api/vidiot-map-data.ts +18 -0
  31. package/src/main/api/vidiot-map-point-of-interest-data.ts +30 -0
  32. package/src/main/changelog.ts +20 -0
  33. package/src/main/db/alternates.ts +81 -0
  34. package/src/main/db/archetype.ts +14 -0
  35. package/src/main/db/badge-partial.ts +35 -0
  36. package/src/main/db/badge.ts +141 -0
  37. package/src/main/db/coh-content-database.ts +29 -0
  38. package/src/main/db/game-map.ts +33 -0
  39. package/src/main/db/key.ts +18 -0
  40. package/src/main/db/server-group.ts +112 -0
  41. package/src/main/db/vidiot-map-point-of-interest.ts +40 -0
  42. package/src/main/db/vidiot-map.ts +25 -0
  43. package/src/main/index.ts +33 -0
  44. package/src/main/util.ts +17 -0
  45. package/src/test/api/alignment.test.ts +31 -0
  46. package/src/test/api/archetype-data.fixture.ts +8 -0
  47. package/src/test/api/badge-data.fixture.ts +22 -0
  48. package/src/test/api/badge-data.test.ts +15 -0
  49. package/src/test/api/badge-partial-data.fixture.ts +17 -0
  50. package/src/test/api/badge-partial-type.test.ts +31 -0
  51. package/src/test/api/badge-type.test.ts +35 -0
  52. package/src/test/api/enhancement-category.test.ts +35 -0
  53. package/src/test/api/game-map-data.fixture.ts +10 -0
  54. package/src/test/api/plaque-type.test.ts +31 -0
  55. package/src/test/api/server-group-data.fixture.ts +23 -0
  56. package/src/test/api/server-group-data.test.ts +15 -0
  57. package/src/test/api/sex.test.ts +31 -0
  58. package/src/test/api/vidiot-map-point-of-interest.fixture.ts +10 -0
  59. package/src/test/api/vidiot-map.fixture.ts +9 -0
  60. package/src/test/changelog.test.ts +36 -0
  61. package/src/test/db/alternates.test.ts +223 -0
  62. package/src/test/db/archetype.test.ts +38 -0
  63. package/src/test/db/badge.test.ts +41 -0
  64. package/src/test/db/coh-content-database.test.ts +42 -0
  65. package/src/test/db/key.test.ts +22 -0
  66. package/src/test/db/server-group.test.ts +124 -0
  67. package/src/test/index.test.ts +10 -0
  68. package/src/test/util.test.ts +39 -0
  69. package/tsconfig.json +117 -0
  70. package/dist/_changelog.d.ts +0 -3
  71. package/dist/coh-content-db.nomin.js +0 -635
  72. package/dist/content-refence-utils.d.ts +0 -4
  73. package/dist/index.d.ts +0 -8
  74. package/dist/internal/_common.d.ts +0 -4
  75. package/dist/internal/archetype.d.ts +0 -10
  76. package/dist/internal/badge.d.ts +0 -44
  77. package/dist/internal/game-map.d.ts +0 -33
  78. package/dist/internal/server-group.d.ts +0 -24
  79. package/dist/types/archetype.d.ts +0 -9
  80. package/dist/types/badge.d.ts +0 -192
  81. package/dist/types/enhancement.d.ts +0 -28
  82. package/dist/types/game-map.d.ts +0 -47
  83. package/dist/types/link.d.ts +0 -4
  84. package/dist/types/server-group.d.ts +0 -75
@@ -1,2 +1,587 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("lodash")):"function"==typeof define&&define.amd?define("coh-content-db",["lodash"],t):"object"==typeof exports?exports["coh-content-db"]=t(require("lodash")):e["coh-content-db"]=t(e._)}(window,function(e){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=/[^a-z0-9\-]/;t.validateKey=function(e){if(n.test(e))throw new Error("Bad key: ["+e+"]; Keys can only contain lowercase characters, numbers and dashes.")},t.getOrDefine=function(e,t,n){var i=t[e];return void 0===i&&(i=t[e]=n(e)),i}}.apply(t,[n,t]))||(e.exports=i)},function(t,n){t.exports=e},function(e,t,n){var i,o;i=[n,t,n(3),n(4),n(5),n(6),n(11),n(12)],void 0===(o=function(e,t,n,i,o,r,a,s){"use strict";function u(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),u(n),u(i),u(o),t.CohContentDb=r.CohContentDb,t.Changelog=a.Changelog,u(s)}.apply(t,i))||(e.exports=o)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.EXPLORATION="EXPLORATION",e.HISTORY="HISTORY",e.ACCOMPLISHMENT="ACCOMPLISHMENT",e.ACHIEVEMENT="ACHIEVEMENT",e.ACCOLADE="ACCOLADE",e.GLADIATOR="GLADIATOR",e.VETERAN="VETERAN",e.PVP="PVP",e.INVENTION="INVENTION",e.DEFEAT="DEFEAT",e.EVENT="EVENT",e.OUROBOROS="OUROBOROS",e.CONSIGNMENT="CONSIGNMENT",e.DAY_JOB="DAY_JOB",e.AE="AE"}(t.BadgeType||(t.BadgeType={})),function(e){e.PLAQUE="PLAQUE",e.BADGE="BADGE",e.INVENTION="INVENTION",e.INVENTION_PLUS_ONE="INVENTION_PLUS_ONE"}(t.BadgePartialType||(t.BadgePartialType={})),function(e){e.M="M",e.F="F",e.H="H",e.V="V",e.P="P",e.MH="MH",e.MV="MV",e.MP="MP",e.FH="FH",e.FV="FV",e.FP="FP"}(t.Alternate||(t.Alternate={})),t.ALIGNMENT_HERO={h:!0,v:!1,p:!1},t.ALIGNMENT_VILLAIN={h:!1,v:!0,p:!1},t.ALIGNMENT_PRIMAL={h:!0,v:!0,p:!1},t.ALIGNMENT_PRAETORIAN={h:!1,v:!1,p:!0},t.ALIGNMENT_ANY={h:!0,v:!0,p:!0},function(e){e.WALL_PLAQUE="WALL_PLAQUE",e.MONUMENT="MONUMENT"}(t.PlaqueType||(t.PlaqueType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFENSE_DEBUFF="DEFENSE_DEBUFF",e.TO_HIT_DEBUFF="TO_HIT_DEBUFF",e.TAUNT="TAUNT",e.CONFUSE="CONFUSE",e.HEALING="HEALING",e.DEFENSE_BUFF="DEFENSE_BUFF",e.RESIST_DAMAGE="RESIST_DAMAGE",e.INTANGIBILITY="INTANGIBILITY",e.SLEEP="SLEEP",e.SLOW="SLOW",e.HOLD="HOLD",e.STUN="STUN",e.IMMOBILIZE="IMMOBILIZE",e.FEAR="FEAR",e.ENDURANCE_MODIFICATION="ENDURANCE_MODIFICATION",e.ENDURANCE_REDUCTION="ENDURANCE_REDUCTION",e.RECHARGE_REDUCTION="RECHARGE_REDUCTION",e.INTERRUPT_DURATION="INTERRUPT_DURATION",e.ACCURACY="ACCURACY",e.TO_HIT_BUFF="TO_HIT_BUFF",e.DAMAGE="DAMAGE",e.KNOCKBACK="KNOCKBACK",e.RUN_SPEED="RUN_SPEED",e.JUMP="JUMP",e.FLY_SPEED="FLY_SPEED",e.RANGE="RANGE"}(t.EnhancementCategory||(t.EnhancementCategory={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.WORK_IN_PROGRESS="WORK_IN_PROGRESS",e.SUNSET="SUNSET"}(t.ServerGroupStatus||(t.ServerGroupStatus={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,o;i=[n,t,n(1),n(0),n(7)],void 0===(o=function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){this.serverGroups={}}return e.prototype.load=function(e){i.getOrDefine(e.key,this.serverGroups,function(e){return new o.ServerGroup(e)}).load(e)},e.prototype.getServerGroups=function(){return n.values(this.serverGroups)},e.prototype.getServerGroup=function(e){return this.serverGroups[e]},e}();t.CohContentDb=r}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(1),n(8),n(9),n(10),n(0)],void 0===(o=function(e,t,n,i,o,r,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e){this.archetypes=[],this.maps=[],this.badges=[],this.changelog={},this.archetypeCache={},this.mapCache={},this.badgeCache={},a.validateKey(e),this.key=e}return e.prototype.load=function(e){var t=this;null!=e.name&&(this.name=e.name),null!=e.description&&(this.description=e.description),null!=e.status&&(this.status=e.status),null!=e.repository&&(this.repository=e.repository),null!=e.servers&&(this.servers=e.servers),null!=e.archetypes&&(n.each(e.archetypes,function(e){return a.getOrDefine(e.key,t.archetypeCache,function(e){return new i.Archetype(t,e)}).load(e)}),this.archetypes=n.values(this.archetypeCache)),null!=e.maps&&(n.each(e.maps,function(e){return a.getOrDefine(e.key,t.mapCache,function(e){return new o.GameMap(t,e)}).load(e)}),this.maps=n.values(this.mapCache)),null!=e.badges&&(n.each(e.badges,function(e){return a.getOrDefine(e.key,t.badgeCache,function(e){return new r.Badge(t,e)}).load(e)}),this.badges=n.values(this.badgeCache)),e.changelog&&(this.changelog=e.changelog)},e.prototype.getArchetype=function(e){return this.archetypeCache[e]},e.prototype.getMap=function(e){return this.mapCache[e]},e.prototype.getBadge=function(e){return this.badgeCache[e]},e}();t.ServerGroup=s}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0)],void 0===(o=function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){null!=e.name&&(this.name=e.name),null!=e.description&&(this.description=e.description)},e}();t.Archetype=i}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0),n(1)],void 0===(o=function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){this.vidiotMaps=[],n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){var t=this;null!=e.name&&(this.name=e.name),null!=e.links&&(this.links=(this.links||[]).concat(e.links)),e.vidiotMaps&&i.each(e.vidiotMaps,function(e){return t.vidiotMaps.push(new r(t.serverGroup,t).load(e))})},e}();t.GameMap=o;var r=function(){function e(e,t){this.pointsOfInterest=[],this.serverGroup=e,this.map=t}return e.prototype.load=function(e){var t=this;return null!=e.href&&(this.href=e.href),null!=e.name&&(this.name=e.name),e.pointsOfInterest&&i.each(e.pointsOfInterest,function(e){return t.pointsOfInterest.push(new a(t.serverGroup,t.map,t).load(e))}),this},e}();t.VidiotMap=r;var a=function(){function e(e,t,n){this.serverGroup=e,this.map=t,this.vidiotMap=n}return e.prototype.load=function(e){return null!=e.x&&(this.x=e.x),null!=e.y&&(this.y=e.y),null!=e.notes&&(this.notes=e.notes),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.badgeKey&&(this.badgeKey=e.badgeKey),null!=e.badgePartialKey&&(this.badgePartialKey=e.badgePartialKey),this},e}();t.VidiotMapPoi=a}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0),n(1)],void 0===(o=function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){this.partialCache={},n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){var t=this;null!=e.type&&(this.type=e.type),null!=e.names&&(this.names=(this.names||[]).concat(e.names)),null!=e.alignment&&(this.alignment=e.alignment),null!=e.badgeText&&(this.badgeText=(this.badgeText||[]).concat(e.badgeText)),null!=e.acquisition&&(this.acquisition=e.acquisition),null!=e.icons&&(this.icons=(this.icons||[]).concat(e.icons)),null!=e.notes&&(this.notes=e.notes),null!=e.links&&(this.links=(this.links||[]).concat(e.links)),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.location&&(this.location=e.location),null!=e.effect&&(this.effect=e.effect),null!=e.vidiotMapKey&&(this.vidiotMapKey=e.vidiotMapKey),null!=e.setTitleId&&(this.setTitleId=e.setTitleId),null!=e.setTitleIdPraetorian&&(this.setTitleIdPraetorian=e.setTitleIdPraetorian),null!=e.ignoreInTotals&&(this.ignoreInTotals=e.ignoreInTotals),null!=e.partials&&(i.each(e.partials,function(e){return n.getOrDefine(e.key,t.partialCache,function(e){return new r(t.serverGroup,t,e)}).load(e)}),this.partials=i.values(this.partialCache))},e.prototype.getPartial=function(e){return this.partialCache[e]},e}();t.Badge=o;var r=function(){function e(e,t,i){n.validateKey(i),this.key=i,this.serverGroup=e,this.parent=t}return e.prototype.load=function(e){null!=e.type&&(this.type=e.type),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.location&&(this.location=e.location),null!=e.plaqueType&&(this.plaqueType=e.plaqueType),null!=e.inscription&&(this.inscription=e.inscription),null!=e.vidiotMapKey&&(this.vidiotMapKey=e.vidiotMapKey),null!=e.badgeKey&&(this.badgeKey=e.badgeKey),null!=e.inventionLevel&&(this.inventionLevel=e.inventionLevel),null!=e.inventionTypes&&(this.inventionTypes=e.inventionTypes),null!=e.count&&(this.count=e.count),null!=e.notes&&(this.notes=e.notes)},e}();t.BadgePartial=r}.apply(t,i))||(e.exports=o)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Changelog={"1.0.0":"* Initial release.","1.0.1":"* Type encapsulation for ServerData and Archetype.","1.1.0":"* Badge icons are now urls instead of keys.\n* Badge icons have moved from `badge.imageKeys` to `badge.icons`.\n* Changelog is now just a markdown block instead of a string array.\n","1.1.1":"* `IGameMap.links` is now optional.","1.1.2":"* https://github.com/n15g/coh-content-db/issues/3 - Added `setTitleId` property for badges. Used to store the `settitle` slash command number of the badge.","1.1.3":"* Added some content reference utility functions.","1.2.0":"* https://github.com/n15g/coh-content-db/issues/4 - Added a field `ignoreInTotals` to `Badge`, allowing badges to be ignored in badge total calculations, for badges like [Flames of Prometheus] and [Bug Hunter].","1.3.1":"* https://github.com/n15g/coh-content-db/issues/5 - Added vidiot map data to maps.","1.3.2":"* Added badge partial support for vidiot map POIs.","1.4.0":"* https://github.com/n15g/coh-content-db/issues/7 - Settitle ids for Praetorian badges.","1.4.1":"* https://github.com/n15g/coh-content-db/pull/9 - Added Primal alignment value."}}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.badgeReference=function(e){return"[badge:"+e.key+"]"},t.mapReference=function(e){return"[map:"+e.key+"]"}}.apply(t,[n,t]))||(e.exports=i)}])});
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvX2NvbW1vbi50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwibG9kYXNoXCIsXCJjb21tb25qczJcIjpcImxvZGFzaFwiLFwiYW1kXCI6XCJsb2Rhc2hcIixcInJvb3RcIjpcIl9cIn0iLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvYmFkZ2UudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvZW5oYW5jZW1lbnQudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvc2VydmVyLWdyb3VwLnRzIiwid2VicGFjazovL2NvaC1jb250ZW50LWRiLy4vc3JjL2NvaC1jb250ZW50LWRiLnRzIiwid2VicGFjazovL2NvaC1jb250ZW50LWRiLy4vc3JjL2ludGVybmFsL3NlcnZlci1ncm91cC50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi8uL3NyYy9pbnRlcm5hbC9hcmNoZXR5cGUudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvZ2FtZS1tYXAudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvYmFkZ2UudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvX2NoYW5nZWxvZy50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi8uL3NyYy9jb250ZW50LXJlZmVuY2UtdXRpbHMudHMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzFfXyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJLRVlfRk9STUFUIiwidGVzdCIsIkVycm9yIiwiY2FjaGUiLCJwcm92aWRlciIsImVudHJ5IiwidW5kZWZpbmVkIiwiQ29oQ29udGVudERiIiwiQ2hhbmdlbG9nIiwiQmFkZ2VUeXBlIiwiQmFkZ2VQYXJ0aWFsVHlwZSIsIkFsdGVybmF0ZSIsIkFMSUdOTUVOVF9IRVJPIiwiaCIsInYiLCJBTElHTk1FTlRfVklMTEFJTiIsIkFMSUdOTUVOVF9QUklNQUwiLCJBTElHTk1FTlRfUFJBRVRPUklBTiIsIkFMSUdOTUVOVF9BTlkiLCJQbGFxdWVUeXBlIiwiRW5oYW5jZW1lbnRDYXRlZ29yeSIsIlNlcnZlckdyb3VwU3RhdHVzIiwic2VydmVyR3JvdXBzIiwibG9hZCIsImRhdGEiLCJnZXRPckRlZmluZSIsInRoaXMiLCJTZXJ2ZXJHcm91cCIsImdldFNlcnZlckdyb3VwcyIsIl8iLCJ2YWx1ZXMiLCJnZXRTZXJ2ZXJHcm91cCIsInNlcnZlckdyb3VwS2V5IiwiYXJjaGV0eXBlcyIsIm1hcHMiLCJiYWRnZXMiLCJjaGFuZ2Vsb2ciLCJhcmNoZXR5cGVDYWNoZSIsIm1hcENhY2hlIiwiYmFkZ2VDYWNoZSIsInZhbGlkYXRlS2V5IiwiZGVzY3JpcHRpb24iLCJzdGF0dXMiLCJyZXBvc2l0b3J5Iiwic2VydmVycyIsImVhY2giLCJBcmNoZXR5cGUiLCJHYW1lTWFwIiwiQmFkZ2UiLCJnZXRBcmNoZXR5cGUiLCJnZXRNYXAiLCJnZXRCYWRnZSIsInNlcnZlckdyb3VwIiwidmlkaW90TWFwcyIsImxpbmtzIiwidmlkaW90TWFwRGF0YSIsInB1c2giLCJWaWRpb3RNYXAiLCJtYXAiLCJwb2ludHNPZkludGVyZXN0IiwiaHJlZiIsInBvaURhdGEiLCJWaWRpb3RNYXBQb2kiLCJ2aWRpb3RNYXAiLCJ4IiwieSIsIm5vdGVzIiwibWFwS2V5IiwiYmFkZ2VLZXkiLCJiYWRnZVBhcnRpYWxLZXkiLCJwYXJ0aWFsQ2FjaGUiLCJ0eXBlIiwibmFtZXMiLCJhbGlnbm1lbnQiLCJiYWRnZVRleHQiLCJhY3F1aXNpdGlvbiIsImljb25zIiwibG9jYXRpb24iLCJlZmZlY3QiLCJ2aWRpb3RNYXBLZXkiLCJzZXRUaXRsZUlkIiwic2V0VGl0bGVJZFByYWV0b3JpYW4iLCJpZ25vcmVJblRvdGFscyIsInBhcnRpYWxzIiwiQmFkZ2VQYXJ0aWFsIiwiZ2V0UGFydGlhbCIsInBhcmVudCIsInBsYXF1ZVR5cGUiLCJpbnNjcmlwdGlvbiIsImludmVudGlvbkxldmVsIiwiaW52ZW50aW9uVHlwZXMiLCJjb3VudCIsImJhZGdlIl0sIm1hcHBpbmdzIjoiQ0FBQSxTQUEyQ0EsRUFBTUMsR0FDMUIsaUJBQVpDLFNBQTBDLGlCQUFYQyxPQUN4Q0EsT0FBT0QsUUFBVUQsRUFBUUcsUUFBUSxXQUNSLG1CQUFYQyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8saUJBQWtCLENBQUMsVUFBV0osR0FDWCxpQkFBWkMsUUFDZEEsUUFBUSxrQkFBb0JELEVBQVFHLFFBQVEsV0FFNUNKLEVBQUssa0JBQW9CQyxFQUFRRCxFQUFRLEdBUjNDLENBU0dPLE9BQVEsU0FBU0MsR0FDcEIsTyxZQ1RFLElBQUlDLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixH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QUE2Qi9ELEtBQUsrRCxlQUFpQmpFLEVBQUtpRSxnQkFDdENuRixNQUF2QmtCLEVBQUtrRSxpQkFBNkJoRSxLQUFLZ0UsZUFBaUJsRSxFQUFLa0UsZ0JBQy9DcEYsTUFBZGtCLEVBQUttRSxRQUFvQmpFLEtBQUtpRSxNQUFRbkUsRUFBS21FLE9BQzdCckYsTUFBZGtCLEVBQUswQyxRQUFvQnhDLEtBQUt3QyxNQUFRMUMsRUFBSzBDLFFBRXZELEVBckNBLEdBQWEsRUFBQWtCLGdCLDBJQ2pFQSxFQUFBNUUsVUFBc0MsQ0FDL0MsUUFBUyxxQkFDVCxRQUFTLHFEQUVULFFBQVMsd0xBR1QsUUFBUyxzQ0FDVCxRQUFTLDhKQUNULFFBQVMsb0RBRVQsUUFBUyxxTkFHVCxRQUFTLHFGQUNULFFBQVMscURBRVQsUUFBUywwRkFDVCxRQUFTLG9GLDhJQ2ZiLDBCQUErQm9GLEdBQzNCLE1BQU8sVUFBVUEsRUFBTXJHLElBQUcsS0FHOUIsd0JBQTZCbUUsR0FDekIsTUFBTyxRQUFRQSxFQUFJbkUsSUFBRyxNIiwiZmlsZSI6ImNvaC1jb250ZW50LWRiLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibG9kYXNoXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiY29oLWNvbnRlbnQtZGJcIiwgW1wibG9kYXNoXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImNvaC1jb250ZW50LWRiXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibG9kYXNoXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjb2gtY29udGVudC1kYlwiXSA9IGZhY3Rvcnkocm9vdFtcIl9cIl0pO1xufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xX18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMik7XG4iLCJjb25zdCBLRVlfRk9STUFUID0gL1teYS16MC05XFwtXS87XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgIGlmIChLRVlfRk9STUFULnRlc3Qoa2V5KSkgdGhyb3cgbmV3IEVycm9yKGBCYWQga2V5OiBbJHtrZXl9XTsgS2V5cyBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckRlZmluZTxUPihrZXk6IHN0cmluZywgY2FjaGU6IHsgW2lkOiBzdHJpbmddOiBUIH0sIHByb3ZpZGVyOiAoa2V5OiBzdHJpbmcpID0+IFQpOiBUIHtcbiAgICBsZXQgZW50cnkgPSBjYWNoZVtrZXldO1xuXG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW50cnkgPSBjYWNoZVtrZXldID0gcHJvdmlkZXIoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzFfXzsiLCJleHBvcnQgKiBmcm9tIFwiLi90eXBlcy9iYWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvZW5oYW5jZW1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL2dhbWUtbWFwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9saW5rXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9zZXJ2ZXItZ3JvdXBcIjtcblxuZXhwb3J0IHtDb2hDb250ZW50RGJ9IGZyb20gXCIuL2NvaC1jb250ZW50LWRiXCI7XG5cbmV4cG9ydCB7Q2hhbmdlbG9nfSBmcm9tIFwiLi9fY2hhbmdlbG9nXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRlbnQtcmVmZW5jZS11dGlsc1wiO1xuIiwiaW1wb3J0IHtJTGlua30gZnJvbSBcIi4vbGlua1wiO1xuaW1wb3J0IHtJU2VydmVyR3JvdXB9IGZyb20gXCIuL3NlcnZlci1ncm91cFwiO1xuaW1wb3J0IHtFbmhhbmNlbWVudENhdGVnb3J5fSBmcm9tIFwiLi9lbmhhbmNlbWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElCYWRnZURhdGEge1xuICAgIC8qKlxuICAgICAqIEtleS5cbiAgICAgKi9cbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEJhZGdlIHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IEJhZGdlVHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lcyB0aGlzIGJhZGdlIGlzIGtub3duIGJ5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWVzPzogSUFsdGVybmF0ZVZhbHVlW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxpZ25tZW50cyB0aGlzIGJhZGdlIGNhbiBiZSBvYnRhaW5lZCBieS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGlnbm1lbnQ/OiBJQWxpZ25tZW50RmxhZ3M7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW4tZ2FtZSBiYWRnZSB0ZXh0LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhZGdlVGV4dD86IElBbHRlcm5hdGVWYWx1ZVtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIGFjcXVpcmUgdGhlIGJhZGdlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjcXVpc2l0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQmFkZ2UgaW1hZ2VzLiBVc2UgdGhlIGFic29sdXRlIHVybCBpbWFnZXMgaG9zdGVkIGluIGEgQ0ROIG9yIHNpbWlsYXIgcHVibGljbHktYWNjZXNzaWJsZSBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29ucz86IElBbHRlcm5hdGVWYWx1ZVtdXG5cbiAgICAvKipcbiAgICAgKiBOb3RlcyBvciB0aXBzIGFib3V0IHRoZSBiYWRnZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBub3Rlcz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgbGlua3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxpbmtzPzogSUxpbmtbXTtcblxuICAgIC8qKlxuICAgICAqIEtleSBvZiB0aGUgbWFwIHRoaXMgYmFkZ2UgaXMgZm91bmQgb24gZm9yIGV4cGxvcmF0aW9uIGJhZGdlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAvbG9jIGNvb3JkaW5hdGVzIG9mIHRoZSBiYWRnZSBpbi1nYW1lLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvY2F0aW9uPzogbnVtYmVyW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9yIGxldHRlciB0aGUgYmFkZ2UgYXBwZWFycyBhcyBvbiBWaWRpb3QgTWFwcy5cbiAgICAgKi9cbiAgICByZWFkb25seSB2aWRpb3RNYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgdXNlZCB3aXRoIHRoZSBpbi1nYW1lIGBzZXR0aXRsZWAgc2xhc2ggY29tbWFuZCB0byBhcHBseSB0aGUgYmFkZ2UuXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2V0VGl0bGVJZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNvbWUgcHJhZXRvcmlhbiBiYWRnZXMgaGF2ZSBhIGRpZmZlcmVudCBzZXR0aXRsZSBpZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZXRUaXRsZUlkUHJhZXRvcmlhbj86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVmZmVjdCB0aGUgYmFkZ2Ugd2lsbCBoYXZlLCBzdWNoIGFzIGEgYnVmZiBvciBncmFudGluZyBhIHRlbXBvcmFyeSBwb3dlci5cbiAgICAgKi9cbiAgICByZWFkb25seSBlZmZlY3Q/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGb3IgYmFkZ2VzIHRoYXQgaGF2ZSBwYXJ0aWFsIGZ1bGZpbG1lbnQgcmVxdWlyZW1lbnRzLCBzdWNoIGFzIHBsYXF1ZXMgZm9yIGhpc3RvcnkgYmFkZ2VzLCBvciBvdGhlciBiYWRnZXMgZm9yIG1ldGEtYmFkZ2VzIGxpa2UgYWNjb2xhZGVzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhcnRpYWxzPzogSUJhZGdlUGFydGlhbERhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIFNvbWUgYmFkZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGJhZGdlIHRvdGFsIGNvdW50Li4uIHN1Y2ggYXMgRmxhbWVzIG9mIFByb21ldGhldXMsIHdoaWNoIGNhbiBiZSByZW1vdmVkIGJ5IHJlZGVlbWluZyBpdCBmb3IgYSBOb3RpY2Ugb2YgdGhlIFdlbGwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWdub3JlSW5Ub3RhbHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYWRnZVBhcnRpYWxEYXRhIHtcbiAgICAvKipcbiAgICAgKiBLZXkuXG4gICAgICovXG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHBhcnRpYWwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IEJhZGdlUGFydGlhbFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBNYXAgdGhlIHBhcnRpYWwgaXMgbG9jYXRlZCBvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAvbG9jIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvY2F0aW9uPzogbnVtYmVyW107XG5cbiAgICAvKipcbiAgICAgKiBJcyBpdCBhIHdhbGwgcGxhcXVlIG9yIGEgcGh5c2ljYWwgbW9udW1lbnQ/XG4gICAgICovXG4gICAgcmVhZG9ubHkgcGxhcXVlVHlwZT86IFBsYXF1ZVR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBQbGFxdWUgaW5zY3JpcHRpb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5zY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9yIGxldHRlciB0aGUgcGFydGlhbCBhcHBlYXJzIGFzIG9uIFZpZGlvdCBNYXBzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHZpZGlvdE1hcEtleT86IHN0cmluZztcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhZGdlIHJlcXVpcmVkIGZvciB0aGlzIHBhcnRpYWwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmFkZ2VLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMZXZlbCBvZiB0aGUgaW52ZW50aW9uIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludmVudGlvbkxldmVsPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGVuaGFuY2VtZW50cyByZXF1aXJlZCB0byBiZSBjcmFmdGVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludmVudGlvblR5cGVzPzogRW5oYW5jZW1lbnRDYXRlZ29yeVtdO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGludmVudGlvbiBjcmFmdHMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY291bnQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbnkgYWRkaXRpb25hbCBub3Rlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBub3Rlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQmFkZ2VUeXBlIHtcbiAgICBFWFBMT1JBVElPTiA9IFwiRVhQTE9SQVRJT05cIixcbiAgICBISVNUT1JZID0gXCJISVNUT1JZXCIsXG4gICAgQUNDT01QTElTSE1FTlQgPSBcIkFDQ09NUExJU0hNRU5UXCIsXG4gICAgQUNISUVWRU1FTlQgPSBcIkFDSElFVkVNRU5UXCIsXG4gICAgQUNDT0xBREUgPSBcIkFDQ09MQURFXCIsXG4gICAgR0xBRElBVE9SID0gXCJHTEFESUFUT1JcIixcbiAgICBWRVRFUkFOID0gXCJWRVRFUkFOXCIsXG4gICAgUFZQID0gXCJQVlBcIixcbiAgICBJTlZFTlRJT04gPSBcIklOVkVOVElPTlwiLFxuICAgIERFRkVBVCA9IFwiREVGRUFUXCIsXG4gICAgRVZFTlQgPSBcIkVWRU5UXCIsXG4gICAgT1VST0JPUk9TID0gXCJPVVJPQk9ST1NcIixcbiAgICBDT05TSUdOTUVOVCA9IFwiQ09OU0lHTk1FTlRcIixcbiAgICBEQVlfSk9CID0gXCJEQVlfSk9CXCIsXG4gICAgQUUgPSBcIkFFXCJcbn1cblxuZXhwb3J0IGVudW0gQmFkZ2VQYXJ0aWFsVHlwZSB7XG4gICAgUExBUVVFID0gXCJQTEFRVUVcIixcbiAgICBCQURHRSA9IFwiQkFER0VcIixcbiAgICBJTlZFTlRJT04gPSBcIklOVkVOVElPTlwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgaW52ZW50aW9uIGJhZGdlcyByZXF1aXJlIHlvdSB0byBidWlsZCB4IG9mIHR3byBkaWZmZXJlbnQgaW52ZW50aW9uIGxldmVscywgJ3BsdXMgb25lIG9mIGVpdGhlciBsZXZlbCcuXG4gICAgICovXG4gICAgSU5WRU5USU9OX1BMVVNfT05FID0gXCJJTlZFTlRJT05fUExVU19PTkVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWx0ZXJuYXRlVmFsdWUge1xuICAgIHJlYWRvbmx5IHR5cGU/OiBBbHRlcm5hdGU7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3IgYmFkZ2VzIHRoYXQgaGF2ZSBhbHRlcm5hdGUgdmFsdWVzIGJhc2VkIG9uIHRoZSBhbGlnbm1lbnQgKEgvVi9QKSBvciBzZXggKE0vRikgb2YgdGhlIGNoYXJhY3Rlci5cbiAqL1xuZXhwb3J0IGVudW0gQWx0ZXJuYXRlIHtcbiAgICBNID0gXCJNXCIsXG4gICAgRiA9IFwiRlwiLFxuICAgIEggPSBcIkhcIixcbiAgICBWID0gXCJWXCIsXG4gICAgUCA9IFwiUFwiLFxuICAgIE1IID0gXCJNSFwiLFxuICAgIE1WID0gXCJNVlwiLFxuICAgIE1QID0gXCJNUFwiLFxuICAgIEZIID0gXCJGSFwiLFxuICAgIEZWID0gXCJGVlwiLFxuICAgIEZQID0gXCJGUFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFsaWdubWVudEZsYWdzIHtcbiAgICByZWFkb25seSBoOiBib29sZWFuLFxuICAgIHJlYWRvbmx5IHY6IGJvb2xlYW4sXG4gICAgcmVhZG9ubHkgcDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgQUxJR05NRU5UX0hFUk86IElBbGlnbm1lbnRGbGFncyA9IHtoOiB0cnVlLCB2OiBmYWxzZSwgcDogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IEFMSUdOTUVOVF9WSUxMQUlOOiBJQWxpZ25tZW50RmxhZ3MgPSB7aDogZmFsc2UsIHY6IHRydWUsIHA6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBBTElHTk1FTlRfUFJJTUFMOiBJQWxpZ25tZW50RmxhZ3MgPSB7aDogdHJ1ZSwgdjogdHJ1ZSwgcDogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IEFMSUdOTUVOVF9QUkFFVE9SSUFOOiBJQWxpZ25tZW50RmxhZ3MgPSB7aDogZmFsc2UsIHY6IGZhbHNlLCBwOiB0cnVlfTtcbmV4cG9ydCBjb25zdCBBTElHTk1FTlRfQU5ZOiBJQWxpZ25tZW50RmxhZ3MgPSB7aDogdHJ1ZSwgdjogdHJ1ZSwgcDogdHJ1ZX07XG5cbmV4cG9ydCBlbnVtIFBsYXF1ZVR5cGUge1xuICAgIFdBTExfUExBUVVFID0gXCJXQUxMX1BMQVFVRVwiLFxuICAgIE1PTlVNRU5UID0gXCJNT05VTUVOVFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJhZGdlIGV4dGVuZHMgSUJhZGdlRGF0YSB7XG4gICAgcmVhZG9ubHkgc2VydmVyR3JvdXA6IElTZXJ2ZXJHcm91cDtcbiAgICByZWFkb25seSBwYXJ0aWFscz86IElCYWRnZVBhcnRpYWxbXTtcblxuICAgIGdldFBhcnRpYWwoa2V5OiBzdHJpbmcpOiBJQmFkZ2VQYXJ0aWFsIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQmFkZ2VQYXJ0aWFsIGV4dGVuZHMgSUJhZGdlUGFydGlhbERhdGEge1xuICAgIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBJU2VydmVyR3JvdXA7XG4gICAgcmVhZG9ubHkgcGFyZW50OiBJQmFkZ2U7XG59XG5cbiIsImV4cG9ydCBlbnVtIEVuaGFuY2VtZW50Q2F0ZWdvcnkge1xuICAgIERFRkVOU0VfREVCVUZGID0gXCJERUZFTlNFX0RFQlVGRlwiLFxuICAgIFRPX0hJVF9ERUJVRkYgPSBcIlRPX0hJVF9ERUJVRkZcIixcbiAgICBUQVVOVCA9IFwiVEFVTlRcIixcbiAgICBDT05GVVNFID0gXCJDT05GVVNFXCIsXG4gICAgSEVBTElORyA9IFwiSEVBTElOR1wiLFxuICAgIERFRkVOU0VfQlVGRiA9IFwiREVGRU5TRV9CVUZGXCIsXG4gICAgUkVTSVNUX0RBTUFHRSA9IFwiUkVTSVNUX0RBTUFHRVwiLFxuICAgIElOVEFOR0lCSUxJVFkgPSBcIklOVEFOR0lCSUxJVFlcIixcbiAgICBTTEVFUCA9IFwiU0xFRVBcIixcbiAgICBTTE9XID0gXCJTTE9XXCIsXG4gICAgSE9MRCA9IFwiSE9MRFwiLFxuICAgIFNUVU4gPSBcIlNUVU5cIixcbiAgICBJTU1PQklMSVpFID0gXCJJTU1PQklMSVpFXCIsXG4gICAgRkVBUiA9IFwiRkVBUlwiLFxuICAgIEVORFVSQU5DRV9NT0RJRklDQVRJT04gPSBcIkVORFVSQU5DRV9NT0RJRklDQVRJT05cIixcbiAgICBFTkRVUkFOQ0VfUkVEVUNUSU9OID0gXCJFTkRVUkFOQ0VfUkVEVUNUSU9OXCIsXG4gICAgUkVDSEFSR0VfUkVEVUNUSU9OID0gXCJSRUNIQVJHRV9SRURVQ1RJT05cIixcbiAgICBJTlRFUlJVUFRfRFVSQVRJT04gPSBcIklOVEVSUlVQVF9EVVJBVElPTlwiLFxuICAgIEFDQ1VSQUNZID0gXCJBQ0NVUkFDWVwiLFxuICAgIFRPX0hJVF9CVUZGID0gXCJUT19ISVRfQlVGRlwiLFxuICAgIERBTUFHRSA9IFwiREFNQUdFXCIsXG4gICAgS05PQ0tCQUNLID0gXCJLTk9DS0JBQ0tcIixcbiAgICBSVU5fU1BFRUQgPSBcIlJVTl9TUEVFRFwiLFxuICAgIEpVTVAgPSBcIkpVTVBcIixcbiAgICBGTFlfU1BFRUQgPSBcIkZMWV9TUEVFRFwiLFxuICAgIFJBTkdFID0gXCJSQU5HRVwiXG59XG4iLCJpbXBvcnQge0lCYWRnZSwgSUJhZGdlRGF0YX0gZnJvbSBcIi4vYmFkZ2VcIjtcbmltcG9ydCB7SUdhbWVNYXAsIElHYW1lTWFwRGF0YX0gZnJvbSBcIi4vZ2FtZS1tYXBcIjtcbmltcG9ydCB7SUFyY2hldHlwZSwgSUFyY2hldHlwZURhdGF9IGZyb20gXCIuL2FyY2hldHlwZVwiO1xuXG4vKipcbiAqIEEgc2VydmVyIGdyb3VwIGlzIGEgY29sbGVjdGlvbiBvZiBnYW1lIHNlcnZlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZlckdyb3VwRGF0YSB7XG4gICAgLyoqXG4gICAgICogS2V5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIHNlcnZlciBncm91cC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBzZXJ2ZXIgZ3JvdXAuIE1hcmtkb3duIGFsbG93ZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTdGF0dXMgb2YgdGhlIGNvbnRlbnQgbW9kdWxlLiB7QHNlZSBTZXJ2ZXJHcm91cFN0YXR1c30uXG4gICAgICovXG4gICAgcmVhZG9ubHkgc3RhdHVzPzogU2VydmVyR3JvdXBTdGF0dXNbXTtcblxuICAgIC8qKlxuICAgICAqIFJlcG9zaXRvcnkgd2hlcmUgdGhlIGRiIGNvbnRlbnQgcGFja2FnZSBpcyBtYWludGFpbmVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlcG9zaXRvcnk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgc2VydmVycyBpbiB0aGlzIGdyb3VwLlxuICAgICAqIFRvcmNoYmVhcmVyLCBFeGNlbHNpb3IsIGV0Yy5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZXJ2ZXJzPzogSVNlcnZlckRhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgYXJjaGV0eXBlcyBhdmFpbGFibGUgb24gdGhpcyBncm91cC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhcmNoZXR5cGVzPzogSUFyY2hldHlwZURhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZ2FtZSBtYXBzIHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciBncm91cC5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYXBzPzogSUdhbWVNYXBEYXRhW107XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGJhZGdlcyBhdmFpbGFibGUgb24gdGhpcyBzZXJ2ZXIgZ3JvdXAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmFkZ2VzPzogSUJhZGdlRGF0YVtdO1xuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIGxvZy5cbiAgICAgKi9cbiAgICByZWFkb25seSBjaGFuZ2Vsb2c/OiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZlckRhdGEge1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gU2VydmVyR3JvdXBTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFBhY2thZ2UgaXMgc3RpbGwgYmVpbmcgZGV2ZWxvcGVkLCBhbmQgbWF5IGJlIG1pc3Npbmcgc29tZSBkYXRhIG9yIHNvbWUgZGF0YSBtYXkgYmUgaW5hY2N1cmF0ZS5cbiAgICAgKi9cbiAgICBXT1JLX0lOX1BST0dSRVNTID0gXCJXT1JLX0lOX1BST0dSRVNTXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHNlcnZlciBncm91cCBoYXMgYmVlbiBzdW5zZXQsIGFuZCBpcyBub3QgbG9uZ2VyIGJlaW5nIG1haW50YWluZWQvZGV2ZWxvcGVkLlxuICAgICAqL1xuICAgIFNVTlNFVCA9IFwiU1VOU0VUXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmVyR3JvdXAgZXh0ZW5kcyBJU2VydmVyR3JvdXBEYXRhIHtcbiAgICByZWFkb25seSBzZXJ2ZXJzPzogSVNlcnZlcltdO1xuICAgIHJlYWRvbmx5IGFyY2hldHlwZXM/OiBJQXJjaGV0eXBlW107XG4gICAgcmVhZG9ubHkgbWFwcz86IElHYW1lTWFwW107XG4gICAgcmVhZG9ubHkgYmFkZ2VzPzogSUJhZGdlW107XG5cbiAgICBnZXRBcmNoZXR5cGUoa2V5OiBzdHJpbmcpOiBJQXJjaGV0eXBlIHwgbnVsbDtcblxuICAgIGdldE1hcChrZXk6IHN0cmluZyk6IElHYW1lTWFwIHwgbnVsbDtcblxuICAgIGdldEJhZGdlKGtleTogc3RyaW5nKTogSUJhZGdlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmVyIGV4dGVuZHMgSVNlcnZlckRhdGEge1xuXG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7SVNlcnZlckdyb3VwLCBJU2VydmVyR3JvdXBEYXRhfSBmcm9tIFwiLi90eXBlcy9zZXJ2ZXItZ3JvdXBcIjtcbmltcG9ydCB7Z2V0T3JEZWZpbmV9IGZyb20gXCIuL2ludGVybmFsL19jb21tb25cIjtcbmltcG9ydCB7U2VydmVyR3JvdXB9IGZyb20gXCIuL2ludGVybmFsL3NlcnZlci1ncm91cFwiO1xuXG5pbnRlcmZhY2UgSUNvaENvbnRlbnREYiB7XG4gICAgLyoqXG4gICAgICogTG9hZCBzZXJ2ZXIgZ3JvdXAgZGF0YSBwYWNrYWdlIGludG8gdGhlIGRhdGFiYXNlLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGxvYWQuXG4gICAgICovXG4gICAgbG9hZChkYXRhOiBJU2VydmVyR3JvdXBEYXRhKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdGhlIHNlcnZlciBncm91cHMgY3VycmVudGx5IGxvYWRlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgZ2V0U2VydmVyR3JvdXBzKCk6IElTZXJ2ZXJHcm91cFtdO1xuXG4gICAgLyoqXG4gICAgICogZ2V0IGEgc2VydmVyIGdyb3VwIGJ5IGtleS5cbiAgICAgKiBAcGFyYW0gc2VydmVyR3JvdXBLZXkgVGhlIGtleS5cbiAgICAgKi9cbiAgICBnZXRTZXJ2ZXJHcm91cChzZXJ2ZXJHcm91cEtleTogc3RyaW5nKTogSVNlcnZlckdyb3VwIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIENvaENvbnRlbnREYiBpbXBsZW1lbnRzIElDb2hDb250ZW50RGIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyR3JvdXBzOiB7IFtpZDogc3RyaW5nXTogU2VydmVyR3JvdXAgfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FkKGRhdGE6IElTZXJ2ZXJHcm91cERhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyR3JvdXAgPSBnZXRPckRlZmluZShkYXRhLmtleSwgdGhpcy5zZXJ2ZXJHcm91cHMsIChrZXkpID0+IG5ldyBTZXJ2ZXJHcm91cChrZXkpKTtcbiAgICAgICAgc2VydmVyR3JvdXAubG9hZChkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGdldFNlcnZlckdyb3VwcygpOiBJU2VydmVyR3JvdXBbXSB7XG4gICAgICAgIHJldHVybiBfLnZhbHVlcyh0aGlzLnNlcnZlckdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBnZXRTZXJ2ZXJHcm91cChzZXJ2ZXJHcm91cEtleTogc3RyaW5nKTogSVNlcnZlckdyb3VwIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdyb3Vwc1tzZXJ2ZXJHcm91cEtleV07XG4gICAgfVxufVxuIiwiaW1wb3J0IHtJQmFkZ2UsIElHYW1lTWFwLCBJU2VydmVyLCBJU2VydmVyR3JvdXAsIElTZXJ2ZXJHcm91cERhdGEsIFNlcnZlckdyb3VwU3RhdHVzfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7SUFyY2hldHlwZX0gZnJvbSBcIi4uL3R5cGVzL2FyY2hldHlwZVwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge0FyY2hldHlwZX0gZnJvbSBcIi4vYXJjaGV0eXBlXCI7XG5pbXBvcnQge0dhbWVNYXB9IGZyb20gXCIuL2dhbWUtbWFwXCI7XG5pbXBvcnQge0JhZGdlfSBmcm9tIFwiLi9iYWRnZVwiO1xuaW1wb3J0IHtnZXRPckRlZmluZSwgdmFsaWRhdGVLZXl9IGZyb20gXCIuL19jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNlcnZlckdyb3VwIGltcGxlbWVudHMgSVNlcnZlckdyb3VwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0dXM/OiBTZXJ2ZXJHcm91cFN0YXR1c1tdO1xuICAgIHB1YmxpYyByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBzZXJ2ZXJzPzogSVNlcnZlcltdO1xuICAgIHB1YmxpYyBhcmNoZXR5cGVzOiBJQXJjaGV0eXBlW10gPSBbXTtcbiAgICBwdWJsaWMgbWFwczogSUdhbWVNYXBbXSA9IFtdO1xuICAgIHB1YmxpYyBiYWRnZXM6IElCYWRnZVtdID0gW107XG4gICAgcHVibGljIGNoYW5nZWxvZzogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICBwcml2YXRlIGFyY2hldHlwZUNhY2hlOiB7IFtpZDogc3RyaW5nXTogQXJjaGV0eXBlIH0gPSB7fTtcbiAgICBwcml2YXRlIG1hcENhY2hlOiB7IFtpZDogc3RyaW5nXTogR2FtZU1hcCB9ID0ge307XG4gICAgcHJpdmF0ZSBiYWRnZUNhY2hlOiB7IFtpZDogc3RyaW5nXTogQmFkZ2UgfSA9IHt9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5KGtleSk7XG5cbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSVNlcnZlckdyb3VwRGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5uYW1lICE9IHVuZGVmaW5lZCkgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQpIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgIT0gdW5kZWZpbmVkKSB0aGlzLnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgICAgICBpZiAoZGF0YS5yZXBvc2l0b3J5ICE9IHVuZGVmaW5lZCkgdGhpcy5yZXBvc2l0b3J5ID0gZGF0YS5yZXBvc2l0b3J5O1xuICAgICAgICBpZiAoZGF0YS5zZXJ2ZXJzICE9IHVuZGVmaW5lZCkgdGhpcy5zZXJ2ZXJzID0gZGF0YS5zZXJ2ZXJzO1xuXG4gICAgICAgIGlmIChkYXRhLmFyY2hldHlwZXMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBfLmVhY2goZGF0YS5hcmNoZXR5cGVzLCBkYXRhID0+XG4gICAgICAgICAgICAgICAgZ2V0T3JEZWZpbmUoZGF0YS5rZXksIHRoaXMuYXJjaGV0eXBlQ2FjaGUsIChrZXkpID0+IG5ldyBBcmNoZXR5cGUodGhpcywga2V5KSlcbiAgICAgICAgICAgICAgICAgICAgLmxvYWQoZGF0YSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFyY2hldHlwZXMgPSBfLnZhbHVlcyh0aGlzLmFyY2hldHlwZUNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLm1hcHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBfLmVhY2goZGF0YS5tYXBzLCBkYXRhID0+XG4gICAgICAgICAgICAgICAgZ2V0T3JEZWZpbmUoZGF0YS5rZXksIHRoaXMubWFwQ2FjaGUsIChrZXkpID0+IG5ldyBHYW1lTWFwKHRoaXMsIGtleSkpXG4gICAgICAgICAgICAgICAgICAgIC5sb2FkKGRhdGEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5tYXBzID0gXy52YWx1ZXModGhpcy5tYXBDYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5iYWRnZXMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBfLmVhY2goZGF0YS5iYWRnZXMsIGRhdGEgPT5cbiAgICAgICAgICAgICAgICBnZXRPckRlZmluZShkYXRhLmtleSwgdGhpcy5iYWRnZUNhY2hlLCAoa2V5KSA9PiBuZXcgQmFkZ2UodGhpcywga2V5KSlcbiAgICAgICAgICAgICAgICAgICAgLmxvYWQoZGF0YSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmJhZGdlcyA9IF8udmFsdWVzKHRoaXMuYmFkZ2VDYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5jaGFuZ2Vsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlbG9nID0gZGF0YS5jaGFuZ2Vsb2c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJjaGV0eXBlKGtleTogc3RyaW5nKTogSUFyY2hldHlwZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmNoZXR5cGVDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXAoa2V5OiBzdHJpbmcpOiBJR2FtZU1hcCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCYWRnZShrZXk6IHN0cmluZyk6IElCYWRnZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5iYWRnZUNhY2hlW2tleV07XG4gICAgfVxufVxuIiwiaW1wb3J0IHtJQXJjaGV0eXBlLCBJQXJjaGV0eXBlRGF0YX0gZnJvbSBcIi4uL3R5cGVzL2FyY2hldHlwZVwiO1xuaW1wb3J0IHt2YWxpZGF0ZUtleX0gZnJvbSBcIi4vX2NvbW1vblwiO1xuaW1wb3J0IHtTZXJ2ZXJHcm91cH0gZnJvbSBcIi4vc2VydmVyLWdyb3VwXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmNoZXR5cGUgaW1wbGVtZW50cyBJQXJjaGV0eXBlIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwO1xuICAgIHB1YmxpYyByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXAsIGtleTogc3RyaW5nKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5KGtleSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJHcm91cCA9IHNlcnZlckdyb3VwO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChkYXRhOiBJQXJjaGV0eXBlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5uYW1lICE9IHVuZGVmaW5lZCkgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQpIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsImltcG9ydCB7SUdhbWVNYXAsIElHYW1lTWFwRGF0YSwgSUxpbmssIElWaWRpb3RNYXAsIElWaWRpb3RNYXBEYXRhLCBJVmlkaW90TWFwUG9pLCBJVmlkaW90TWFwUG9pRGF0YX0gZnJvbSBcIi4uXCI7XG5pbXBvcnQge1NlcnZlckdyb3VwfSBmcm9tIFwiLi9zZXJ2ZXItZ3JvdXBcIjtcbmltcG9ydCB7dmFsaWRhdGVLZXl9IGZyb20gXCIuL19jb21tb25cIjtcbmltcG9ydCB7ZWFjaH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgY2xhc3MgR2FtZU1hcCBpbXBsZW1lbnRzIElHYW1lTWFwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwO1xuICAgIHB1YmxpYyByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBsaW5rcz86IElMaW5rW107XG4gICAgcHVibGljIHZpZGlvdE1hcHM/OiBJVmlkaW90TWFwW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXAsIGtleTogc3RyaW5nKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5KGtleSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJHcm91cCA9IHNlcnZlckdyb3VwO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChkYXRhOiBJR2FtZU1hcERhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEubmFtZSAhPSB1bmRlZmluZWQpIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgaWYgKGRhdGEubGlua3MgIT0gdW5kZWZpbmVkKSB0aGlzLmxpbmtzID0gWy4uLnRoaXMubGlua3MgfHwgW10sIC4uLmRhdGEubGlua3NdO1xuXG4gICAgICAgIGlmIChkYXRhLnZpZGlvdE1hcHMpIHtcbiAgICAgICAgICAgIGVhY2goZGF0YS52aWRpb3RNYXBzLCAodmlkaW90TWFwRGF0YSkgPT4gdGhpcy52aWRpb3RNYXBzLnB1c2gobmV3IFZpZGlvdE1hcCh0aGlzLnNlcnZlckdyb3VwLCB0aGlzKS5sb2FkKHZpZGlvdE1hcERhdGEpKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWaWRpb3RNYXAgaW1wbGVtZW50cyBJVmlkaW90TWFwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwO1xuICAgIHB1YmxpYyByZWFkb25seSBtYXA6IElHYW1lTWFwO1xuICAgIHB1YmxpYyBocmVmOiBzdHJpbmc7XG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmc7XG4gICAgcHVibGljIHBvaW50c09mSW50ZXJlc3Q6IFZpZGlvdE1hcFBvaVtdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwLCBtYXA6IElHYW1lTWFwKSB7XG4gICAgICAgIHRoaXMuc2VydmVyR3JvdXAgPSBzZXJ2ZXJHcm91cDtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSVZpZGlvdE1hcERhdGEpOiBWaWRpb3RNYXAge1xuICAgICAgICBpZiAoZGF0YS5ocmVmICE9IHVuZGVmaW5lZCkgdGhpcy5ocmVmID0gZGF0YS5ocmVmO1xuICAgICAgICBpZiAoZGF0YS5uYW1lICE9IHVuZGVmaW5lZCkgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuXG4gICAgICAgIGlmIChkYXRhLnBvaW50c09mSW50ZXJlc3QpIHtcbiAgICAgICAgICAgIGVhY2goZGF0YS5wb2ludHNPZkludGVyZXN0LCAocG9pRGF0YSkgPT4gdGhpcy5wb2ludHNPZkludGVyZXN0LnB1c2gobmV3IFZpZGlvdE1hcFBvaSh0aGlzLnNlcnZlckdyb3VwLCB0aGlzLm1hcCwgdGhpcykubG9hZChwb2lEYXRhKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmlkaW90TWFwUG9pIGltcGxlbWVudHMgSVZpZGlvdE1hcFBvaSB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWFwOiBJR2FtZU1hcDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmlkaW90TWFwOiBJVmlkaW90TWFwO1xuICAgIHB1YmxpYyB4OiBudW1iZXI7XG4gICAgcHVibGljIHk6IG51bWJlcjtcbiAgICBwdWJsaWMgbm90ZXM/OiBzdHJpbmc7XG4gICAgcHVibGljIG1hcEtleT86IHN0cmluZztcbiAgICBwdWJsaWMgYmFkZ2VLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIGJhZGdlUGFydGlhbEtleT86IHN0cmluZztcblxuXG4gICAgY29uc3RydWN0b3Ioc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwLCBtYXA6IElHYW1lTWFwLCB2aWRpb3RNYXA6IElWaWRpb3RNYXApIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJHcm91cCA9IHNlcnZlckdyb3VwO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy52aWRpb3RNYXAgPSB2aWRpb3RNYXA7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSVZpZGlvdE1hcFBvaURhdGEpOiBWaWRpb3RNYXBQb2kge1xuICAgICAgICBpZiAoZGF0YS54ICE9IHVuZGVmaW5lZCkgdGhpcy54ID0gZGF0YS54O1xuICAgICAgICBpZiAoZGF0YS55ICE9IHVuZGVmaW5lZCkgdGhpcy55ID0gZGF0YS55O1xuICAgICAgICBpZiAoZGF0YS5ub3RlcyAhPSB1bmRlZmluZWQpIHRoaXMubm90ZXMgPSBkYXRhLm5vdGVzO1xuICAgICAgICBpZiAoZGF0YS5tYXBLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLm1hcEtleSA9IGRhdGEubWFwS2V5O1xuICAgICAgICBpZiAoZGF0YS5iYWRnZUtleSAhPSB1bmRlZmluZWQpIHRoaXMuYmFkZ2VLZXkgPSBkYXRhLmJhZGdlS2V5O1xuICAgICAgICBpZiAoZGF0YS5iYWRnZVBhcnRpYWxLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLmJhZGdlUGFydGlhbEtleSA9IGRhdGEuYmFkZ2VQYXJ0aWFsS2V5O1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7QmFkZ2VQYXJ0aWFsVHlwZSwgQmFkZ2VUeXBlLCBFbmhhbmNlbWVudENhdGVnb3J5LCBJQWxpZ25tZW50RmxhZ3MsIElBbHRlcm5hdGVWYWx1ZSwgSUJhZGdlLCBJQmFkZ2VEYXRhLCBJQmFkZ2VQYXJ0aWFsLCBJQmFkZ2VQYXJ0aWFsRGF0YSwgSUxpbmssIFBsYXF1ZVR5cGV9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHtTZXJ2ZXJHcm91cH0gZnJvbSBcIi4vc2VydmVyLWdyb3VwXCI7XG5pbXBvcnQge2dldE9yRGVmaW5lLCB2YWxpZGF0ZUtleX0gZnJvbSBcIi4vX2NvbW1vblwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5cbmV4cG9ydCBjbGFzcyBCYWRnZSBpbXBsZW1lbnRzIElCYWRnZSB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU/OiBCYWRnZVR5cGU7XG4gICAgcHVibGljIG5hbWVzPzogSUFsdGVybmF0ZVZhbHVlW107XG4gICAgcHVibGljIGFsaWdubWVudD86IElBbGlnbm1lbnRGbGFncztcbiAgICBwdWJsaWMgYmFkZ2VUZXh0PzogSUFsdGVybmF0ZVZhbHVlW107XG4gICAgcHVibGljIGFjcXVpc2l0aW9uPzogc3RyaW5nO1xuICAgIHB1YmxpYyBpY29ucz86IElBbHRlcm5hdGVWYWx1ZVtdO1xuICAgIHB1YmxpYyBub3Rlcz86IHN0cmluZztcbiAgICBwdWJsaWMgbGlua3M/OiBJTGlua1tdO1xuICAgIHB1YmxpYyBtYXBLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIGxvY2F0aW9uPzogbnVtYmVyW107XG4gICAgcHVibGljIHZpZGlvdE1hcEtleT86IHN0cmluZztcbiAgICBwdWJsaWMgc2V0VGl0bGVJZD86IG51bWJlcjtcbiAgICBwdWJsaWMgc2V0VGl0bGVJZFByYWV0b3JpYW4/OiBudW1iZXI7XG4gICAgcHVibGljIGVmZmVjdD86IHN0cmluZztcbiAgICBwdWJsaWMgcGFydGlhbHM/OiBCYWRnZVBhcnRpYWxbXTtcbiAgICBwdWJsaWMgaWdub3JlSW5Ub3RhbHM/OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBwYXJ0aWFsQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBCYWRnZVBhcnRpYWwgfSA9IHt9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cCwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdmFsaWRhdGVLZXkoa2V5KTtcblxuICAgICAgICB0aGlzLnNlcnZlckdyb3VwID0gc2VydmVyR3JvdXA7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGRhdGE6IElCYWRnZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSAhPSB1bmRlZmluZWQpIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgaWYgKGRhdGEubmFtZXMgIT0gdW5kZWZpbmVkKSB0aGlzLm5hbWVzID0gWy4uLnRoaXMubmFtZXMgfHwgW10sIC4uLmRhdGEubmFtZXNdO1xuICAgICAgICBpZiAoZGF0YS5hbGlnbm1lbnQgIT0gdW5kZWZpbmVkKSB0aGlzLmFsaWdubWVudCA9IGRhdGEuYWxpZ25tZW50O1xuICAgICAgICBpZiAoZGF0YS5iYWRnZVRleHQgIT0gdW5kZWZpbmVkKSB0aGlzLmJhZGdlVGV4dCA9IFsuLi50aGlzLmJhZGdlVGV4dCB8fCBbXSwgLi4uZGF0YS5iYWRnZVRleHRdO1xuICAgICAgICBpZiAoZGF0YS5hY3F1aXNpdGlvbiAhPSB1bmRlZmluZWQpIHRoaXMuYWNxdWlzaXRpb24gPSBkYXRhLmFjcXVpc2l0aW9uO1xuICAgICAgICBpZiAoZGF0YS5pY29ucyAhPSB1bmRlZmluZWQpIHRoaXMuaWNvbnMgPSBbLi4udGhpcy5pY29ucyB8fCBbXSwgLi4uZGF0YS5pY29uc107XG4gICAgICAgIGlmIChkYXRhLm5vdGVzICE9IHVuZGVmaW5lZCkgdGhpcy5ub3RlcyA9IGRhdGEubm90ZXM7XG4gICAgICAgIGlmIChkYXRhLmxpbmtzICE9IHVuZGVmaW5lZCkgdGhpcy5saW5rcyA9IFsuLi50aGlzLmxpbmtzIHx8IFtdLCAuLi5kYXRhLmxpbmtzXTtcbiAgICAgICAgaWYgKGRhdGEubWFwS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy5tYXBLZXkgPSBkYXRhLm1hcEtleTtcbiAgICAgICAgaWYgKGRhdGEubG9jYXRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmxvY2F0aW9uID0gZGF0YS5sb2NhdGlvbjtcbiAgICAgICAgaWYgKGRhdGEuZWZmZWN0ICE9IHVuZGVmaW5lZCkgdGhpcy5lZmZlY3QgPSBkYXRhLmVmZmVjdDtcbiAgICAgICAgaWYgKGRhdGEudmlkaW90TWFwS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy52aWRpb3RNYXBLZXkgPSBkYXRhLnZpZGlvdE1hcEtleTtcbiAgICAgICAgaWYgKGRhdGEuc2V0VGl0bGVJZCAhPSB1bmRlZmluZWQpIHRoaXMuc2V0VGl0bGVJZCA9IGRhdGEuc2V0VGl0bGVJZDtcbiAgICAgICAgaWYgKGRhdGEuc2V0VGl0bGVJZFByYWV0b3JpYW4gIT0gdW5kZWZpbmVkKSB0aGlzLnNldFRpdGxlSWRQcmFldG9yaWFuID0gZGF0YS5zZXRUaXRsZUlkUHJhZXRvcmlhbjtcbiAgICAgICAgaWYgKGRhdGEuaWdub3JlSW5Ub3RhbHMgIT0gdW5kZWZpbmVkKSB0aGlzLmlnbm9yZUluVG90YWxzID0gZGF0YS5pZ25vcmVJblRvdGFscztcblxuICAgICAgICBpZiAoZGF0YS5wYXJ0aWFscyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIF8uZWFjaChkYXRhLnBhcnRpYWxzLCBkYXRhID0+XG4gICAgICAgICAgICAgICAgZ2V0T3JEZWZpbmUoZGF0YS5rZXksIHRoaXMucGFydGlhbENhY2hlLCAoa2V5KSA9PiBuZXcgQmFkZ2VQYXJ0aWFsKHRoaXMuc2VydmVyR3JvdXAsIHRoaXMsIGtleSkpXG4gICAgICAgICAgICAgICAgICAgIC5sb2FkKGRhdGEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFscyA9IF8udmFsdWVzKHRoaXMucGFydGlhbENhY2hlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJ0aWFsKGtleTogc3RyaW5nKTogSUJhZGdlUGFydGlhbCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWFsQ2FjaGVba2V5XTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYWRnZVBhcnRpYWwgaW1wbGVtZW50cyBJQmFkZ2VQYXJ0aWFsIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnQ6IEJhZGdlO1xuICAgIHB1YmxpYyByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZT86IEJhZGdlUGFydGlhbFR5cGU7XG4gICAgcHVibGljIG1hcEtleT86IHN0cmluZztcbiAgICBwdWJsaWMgbG9jYXRpb24/OiBudW1iZXJbXTtcbiAgICBwdWJsaWMgcGxhcXVlVHlwZT86IFBsYXF1ZVR5cGU7XG4gICAgcHVibGljIGluc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHB1YmxpYyB2aWRpb3RNYXBLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIGJhZGdlS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBpbnZlbnRpb25MZXZlbD86IG51bWJlcjtcbiAgICBwdWJsaWMgaW52ZW50aW9uVHlwZXM/OiBFbmhhbmNlbWVudENhdGVnb3J5W107XG4gICAgcHVibGljIGNvdW50PzogbnVtYmVyO1xuICAgIHB1YmxpYyBub3Rlcz86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cCwgcGFyZW50OiBCYWRnZSwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdmFsaWRhdGVLZXkoa2V5KTtcblxuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJHcm91cCA9IHNlcnZlckdyb3VwO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChkYXRhOiBJQmFkZ2VQYXJ0aWFsRGF0YSkge1xuICAgICAgICBpZiAoZGF0YS50eXBlICE9IHVuZGVmaW5lZCkgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuICAgICAgICBpZiAoZGF0YS5tYXBLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLm1hcEtleSA9IGRhdGEubWFwS2V5O1xuICAgICAgICBpZiAoZGF0YS5sb2NhdGlvbiAhPSB1bmRlZmluZWQpIHRoaXMubG9jYXRpb24gPSBkYXRhLmxvY2F0aW9uO1xuICAgICAgICBpZiAoZGF0YS5wbGFxdWVUeXBlICE9IHVuZGVmaW5lZCkgdGhpcy5wbGFxdWVUeXBlID0gZGF0YS5wbGFxdWVUeXBlO1xuICAgICAgICBpZiAoZGF0YS5pbnNjcmlwdGlvbiAhPSB1bmRlZmluZWQpIHRoaXMuaW5zY3JpcHRpb24gPSBkYXRhLmluc2NyaXB0aW9uO1xuICAgICAgICBpZiAoZGF0YS52aWRpb3RNYXBLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLnZpZGlvdE1hcEtleSA9IGRhdGEudmlkaW90TWFwS2V5O1xuICAgICAgICBpZiAoZGF0YS5iYWRnZUtleSAhPSB1bmRlZmluZWQpIHRoaXMuYmFkZ2VLZXkgPSBkYXRhLmJhZGdlS2V5O1xuICAgICAgICBpZiAoZGF0YS5pbnZlbnRpb25MZXZlbCAhPSB1bmRlZmluZWQpIHRoaXMuaW52ZW50aW9uTGV2ZWwgPSBkYXRhLmludmVudGlvbkxldmVsO1xuICAgICAgICBpZiAoZGF0YS5pbnZlbnRpb25UeXBlcyAhPSB1bmRlZmluZWQpIHRoaXMuaW52ZW50aW9uVHlwZXMgPSBkYXRhLmludmVudGlvblR5cGVzO1xuICAgICAgICBpZiAoZGF0YS5jb3VudCAhPSB1bmRlZmluZWQpIHRoaXMuY291bnQgPSBkYXRhLmNvdW50O1xuICAgICAgICBpZiAoZGF0YS5ub3RlcyAhPSB1bmRlZmluZWQpIHRoaXMubm90ZXMgPSBkYXRhLm5vdGVzO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBDaGFuZ2Vsb2c6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIjEuMC4wXCI6IFwiKiBJbml0aWFsIHJlbGVhc2UuXCIsXG4gICAgXCIxLjAuMVwiOiBcIiogVHlwZSBlbmNhcHN1bGF0aW9uIGZvciBTZXJ2ZXJEYXRhIGFuZCBBcmNoZXR5cGUuXCIsXG5cbiAgICBcIjEuMS4wXCI6IFwiKiBCYWRnZSBpY29ucyBhcmUgbm93IHVybHMgaW5zdGVhZCBvZiBrZXlzLlxcblwiICtcbiAgICAgICAgXCIqIEJhZGdlIGljb25zIGhhdmUgbW92ZWQgZnJvbSBgYmFkZ2UuaW1hZ2VLZXlzYCB0byBgYmFkZ2UuaWNvbnNgLlxcblwiICtcbiAgICAgICAgXCIqIENoYW5nZWxvZyBpcyBub3cganVzdCBhIG1hcmtkb3duIGJsb2NrIGluc3RlYWQgb2YgYSBzdHJpbmcgYXJyYXkuXFxuXCIsXG4gICAgXCIxLjEuMVwiOiBcIiogYElHYW1lTWFwLmxpbmtzYCBpcyBub3cgb3B0aW9uYWwuXCIsXG4gICAgXCIxLjEuMlwiOiBcIiogaHR0cHM6Ly9naXRodWIuY29tL24xNWcvY29oLWNvbnRlbnQtZGIvaXNzdWVzLzMgLSBBZGRlZCBgc2V0VGl0bGVJZGAgcHJvcGVydHkgZm9yIGJhZGdlcy4gVXNlZCB0byBzdG9yZSB0aGUgYHNldHRpdGxlYCBzbGFzaCBjb21tYW5kIG51bWJlciBvZiB0aGUgYmFkZ2UuXCIsXG4gICAgXCIxLjEuM1wiOiBcIiogQWRkZWQgc29tZSBjb250ZW50IHJlZmVyZW5jZSB1dGlsaXR5IGZ1bmN0aW9ucy5cIixcblxuICAgIFwiMS4yLjBcIjogXCIqIGh0dHBzOi8vZ2l0aHViLmNvbS9uMTVnL2NvaC1jb250ZW50LWRiL2lzc3Vlcy80IC0gQWRkZWQgYSBmaWVsZCBgaWdub3JlSW5Ub3RhbHNgIHRvIGBCYWRnZWAsIGFsbG93aW5nIGJhZGdlcyB0byBiZSBpZ25vcmVkIGluIGJhZGdlIHRvdGFsIGNhbGN1bGF0aW9ucywgZm9yIGJhZGdlcyBsaWtlXCIgK1xuICAgICAgICBcIiBbRmxhbWVzIG9mIFByb21ldGhldXNdIGFuZCBbQnVnIEh1bnRlcl0uXCIsXG5cbiAgICBcIjEuMy4xXCI6IFwiKiBodHRwczovL2dpdGh1Yi5jb20vbjE1Zy9jb2gtY29udGVudC1kYi9pc3N1ZXMvNSAtIEFkZGVkIHZpZGlvdCBtYXAgZGF0YSB0byBtYXBzLlwiLFxuICAgIFwiMS4zLjJcIjogXCIqIEFkZGVkIGJhZGdlIHBhcnRpYWwgc3VwcG9ydCBmb3IgdmlkaW90IG1hcCBQT0lzLlwiLFxuXG4gICAgXCIxLjQuMFwiOiBcIiogaHR0cHM6Ly9naXRodWIuY29tL24xNWcvY29oLWNvbnRlbnQtZGIvaXNzdWVzLzcgLSBTZXR0aXRsZSBpZHMgZm9yIFByYWV0b3JpYW4gYmFkZ2VzLlwiLFxuICAgIFwiMS40LjFcIjogXCIqIGh0dHBzOi8vZ2l0aHViLmNvbS9uMTVnL2NvaC1jb250ZW50LWRiL3B1bGwvOSAtIEFkZGVkIFByaW1hbCBhbGlnbm1lbnQgdmFsdWUuXCIsXG59O1xuIiwiaW1wb3J0IHtJQmFkZ2VEYXRhfSBmcm9tIFwiLi90eXBlcy9iYWRnZVwiO1xuaW1wb3J0IHtJR2FtZU1hcERhdGF9IGZyb20gXCIuL3R5cGVzL2dhbWUtbWFwXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWRnZVJlZmVyZW5jZShiYWRnZTogSUJhZGdlRGF0YSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbYmFkZ2U6JHtiYWRnZS5rZXl9XWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBSZWZlcmVuY2UobWFwOiBJR2FtZU1hcERhdGEpOiBzdHJpbmcge1xuICAgIHJldHVybiBgW21hcDoke21hcC5rZXl9XWA7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
1
+ 'use strict';
2
+
3
+ const ALIGNMENT = ["H", "V", "P"];
4
+
5
+ const BADGE_PARTIAL_TYPE = [
6
+ "PLAQUE",
7
+ "BADGE",
8
+ "INVENTION",
9
+ "INVENTION_PLUS_ONE"
10
+ // Some invention badges require you to build x of two different invention levels, 'plus one of either level'.
11
+ ];
12
+
13
+ const BADGE_TYPE = [
14
+ "EXPLORATION",
15
+ "HISTORY",
16
+ "ACCOMPLISHMENT",
17
+ "ACHIEVEMENT",
18
+ "ACCOLADE",
19
+ "GLADIATOR",
20
+ "VETERAN",
21
+ "PVP",
22
+ "INVENTION",
23
+ "DEFEAT",
24
+ "EVENT",
25
+ "OUROBOROS",
26
+ "CONSIGNMENT",
27
+ "DAY_JOB",
28
+ "AE"
29
+ ];
30
+
31
+ const ENHANCEMENT_CATEGORY = [
32
+ "DEFENSE_DEBUFF",
33
+ "TO_HIT_DEBUFF",
34
+ "TAUNT",
35
+ "CONFUSE",
36
+ "HEALING",
37
+ "DEFENSE_BUFF",
38
+ "RESIST_DAMAGE",
39
+ "INTANGIBILITY",
40
+ "SLEEP",
41
+ "SLOW",
42
+ "HOLD",
43
+ "STUN",
44
+ "IMMOBILIZE",
45
+ "FEAR",
46
+ "ENDURANCE_MODIFICATION",
47
+ "ENDURANCE_REDUCTION",
48
+ "RECHARGE_REDUCTION",
49
+ "INTERRUPT_DURATION",
50
+ "ACCURACY",
51
+ "TO_HIT_BUFF",
52
+ "DAMAGE",
53
+ "KNOCKBACK",
54
+ "RUN_SPEED",
55
+ "JUMP",
56
+ "FLY_SPEED",
57
+ "RANGE"
58
+ ];
59
+
60
+ const PLAQUE_TYPE = [
61
+ "WALL_PLAQUE",
62
+ "MONUMENT"
63
+ ];
64
+
65
+ const SEX = ["M", "F"];
66
+
67
+ var __typeError$4 = (msg) => {
68
+ throw TypeError(msg);
69
+ };
70
+ var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Cannot " + msg);
71
+ var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
72
+ var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
73
+ var __privateSet$1 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
74
+ var __privateMethod$1 = (obj, member, method) => (__accessCheck$4(obj, member, "access private method"), method);
75
+ var _value, _Key_instances, validateKey_fn;
76
+ const INVALID_KEY_PATTERN = /[^a-z0-9-]/;
77
+ class Key {
78
+ constructor(value) {
79
+ __privateAdd$4(this, _Key_instances);
80
+ __privateAdd$4(this, _value);
81
+ __privateMethod$1(this, _Key_instances, validateKey_fn).call(this, value);
82
+ __privateSet$1(this, _value, value);
83
+ }
84
+ get value() {
85
+ return __privateGet$4(this, _value);
86
+ }
87
+ }
88
+ _value = new WeakMap();
89
+ _Key_instances = new WeakSet();
90
+ validateKey_fn = function(key) {
91
+ if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`);
92
+ };
93
+
94
+ var __defProp$6 = Object.defineProperty;
95
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
96
+ var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
97
+ class Archetype {
98
+ constructor(data) {
99
+ __publicField$6(this, "key");
100
+ __publicField$6(this, "name");
101
+ __publicField$6(this, "description");
102
+ this.key = new Key(data.key).value;
103
+ this.name = data.name;
104
+ this.description = data.description;
105
+ }
106
+ }
107
+
108
+ var __defProp$5 = Object.defineProperty;
109
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
110
+ var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
111
+ class BadgePartial {
112
+ constructor(data) {
113
+ __publicField$5(this, "key");
114
+ __publicField$5(this, "type");
115
+ __publicField$5(this, "mapKey");
116
+ __publicField$5(this, "loc");
117
+ __publicField$5(this, "plaqueType");
118
+ __publicField$5(this, "inscription");
119
+ __publicField$5(this, "vidiotMapKey");
120
+ __publicField$5(this, "badgeKey");
121
+ __publicField$5(this, "inventionLevel");
122
+ __publicField$5(this, "inventionTypes");
123
+ __publicField$5(this, "inventionCount");
124
+ __publicField$5(this, "notes");
125
+ this.key = new Key(data.key).value;
126
+ this.type = data.type;
127
+ this.mapKey = data.mapKey;
128
+ this.loc = data.loc;
129
+ this.plaqueType = data.plaqueType;
130
+ this.inscription = data.inscription;
131
+ this.vidiotMapKey = data.vidiotMapKey;
132
+ this.badgeKey = data.badgeKey;
133
+ this.inventionLevel = data.inventionLevel;
134
+ this.inventionTypes = data.inventionTypes;
135
+ this.inventionCount = data.inventionCount;
136
+ this.notes = data.notes;
137
+ }
138
+ }
139
+
140
+ var __typeError$3 = (msg) => {
141
+ throw TypeError(msg);
142
+ };
143
+ var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
144
+ var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
145
+ var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
146
+ var __privateSet = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
147
+ var __privateMethod = (obj, member, method) => (__accessCheck$3(obj, member, "access private method"), method);
148
+ var _sortedValues, _Alternates_instances, compareAlternates_fn, compareAlignment_fn, compareSex_fn;
149
+ const ALIGNMENT_SORT = { H: 2, V: 1, P: 0 };
150
+ const SEX_SORT = { M: 1, F: 0 };
151
+ class Alternates {
152
+ constructor(values) {
153
+ __privateAdd$3(this, _Alternates_instances);
154
+ __privateAdd$3(this, _sortedValues, []);
155
+ __privateSet(this, _sortedValues, values.sort());
156
+ __privateGet$3(this, _sortedValues).sort((a, b) => __privateMethod(this, _Alternates_instances, compareAlternates_fn).call(this, a, b));
157
+ }
158
+ getValue(alignment, sex) {
159
+ for (let index = __privateGet$3(this, _sortedValues).length; index--; ) {
160
+ const entry = __privateGet$3(this, _sortedValues)[index];
161
+ if ((entry.alignment === void 0 || entry.alignment === alignment) && (entry.sex === void 0 || entry.sex === sex)) return entry.value;
162
+ }
163
+ return void 0;
164
+ }
165
+ /**
166
+ * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.
167
+ */
168
+ get default() {
169
+ return __privateGet$3(this, _sortedValues)[0]?.value;
170
+ }
171
+ /**
172
+ * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).
173
+ */
174
+ get canonical() {
175
+ return __privateGet$3(this, _sortedValues);
176
+ }
177
+ }
178
+ _sortedValues = new WeakMap();
179
+ _Alternates_instances = new WeakSet();
180
+ compareAlternates_fn = function(a, b) {
181
+ const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0);
182
+ const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0);
183
+ if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity;
184
+ const alignmentComparison = __privateMethod(this, _Alternates_instances, compareAlignment_fn).call(this, a.alignment, b.alignment);
185
+ if (alignmentComparison !== 0) return alignmentComparison;
186
+ const sexComparison = __privateMethod(this, _Alternates_instances, compareSex_fn).call(this, a.sex, b.sex);
187
+ if (sexComparison !== 0) return sexComparison;
188
+ return String(a.value).localeCompare(String(b.value));
189
+ };
190
+ compareAlignment_fn = function(a, b) {
191
+ if (a === b) return 0;
192
+ if (a === void 0 && b !== void 0) return -1;
193
+ if (b === void 0 && a !== void 0) return 1;
194
+ const aSort = a === void 0 ? -1 : ALIGNMENT_SORT[a] ?? -1;
195
+ const bSort = b === void 0 ? -1 : ALIGNMENT_SORT[b] ?? -1;
196
+ if (aSort !== bSort) return bSort - aSort;
197
+ return a?.localeCompare(b ?? "") ?? 0;
198
+ };
199
+ compareSex_fn = function(a, b) {
200
+ if (a === b) return 0;
201
+ if (a === void 0 && b !== void 0) return -1;
202
+ if (b === void 0 && a !== void 0) return 1;
203
+ const aSort = SEX_SORT[a ?? -1] ?? -1;
204
+ const bSort = SEX_SORT[b ?? -1] ?? -1;
205
+ if (aSort !== bSort) return bSort - aSort;
206
+ return a?.localeCompare(b ?? "") ?? 0;
207
+ };
208
+
209
+ var __defProp$4 = Object.defineProperty;
210
+ var __typeError$2 = (msg) => {
211
+ throw TypeError(msg);
212
+ };
213
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
214
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
215
+ var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
216
+ var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
217
+ var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
218
+ var _partialsIndex;
219
+ class Badge {
220
+ constructor(data) {
221
+ __privateAdd$2(this, _partialsIndex, {});
222
+ /**
223
+ * The database key for this badge.
224
+ */
225
+ __publicField$4(this, "key");
226
+ /**
227
+ * The type of badge.
228
+ */
229
+ __publicField$4(this, "type");
230
+ /**
231
+ * The name of this badge.
232
+ *
233
+ * May vary by character sex or alignment.
234
+ */
235
+ __publicField$4(this, "name");
236
+ /**
237
+ * The character alignments that this badge is available to.
238
+ */
239
+ __publicField$4(this, "alignment");
240
+ /**
241
+ * The badge text as it appears in-game. May vary by character sex or alignment.
242
+ */
243
+ __publicField$4(this, "badgeText");
244
+ /**
245
+ * Description of how to acquire the badge.
246
+ *
247
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
248
+ */
249
+ __publicField$4(this, "acquisition");
250
+ /**
251
+ * Absolute URL to this badge's icon.
252
+ *
253
+ * May vary by character sex or alignment.
254
+ */
255
+ __publicField$4(this, "icon");
256
+ /**
257
+ * Freeform notes or tips about the badge.
258
+ *
259
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
260
+ */
261
+ __publicField$4(this, "notes");
262
+ /**
263
+ * List of external links for this Badge. Wiki, forums, etc.
264
+ */
265
+ __publicField$4(this, "links");
266
+ /**
267
+ * For exploration badges, the key of the {@link GameMap} that this badge is found on.
268
+ */
269
+ __publicField$4(this, "mapKey");
270
+ /**
271
+ * For exploration badges, the `/loc` coordinates of the badge on the in-game map.
272
+ */
273
+ __publicField$4(this, "loc");
274
+ /**
275
+ * For badges that appear on a Vidiot Map, the number or letter the badge appears as.
276
+ */
277
+ __publicField$4(this, "vidiotMapKey");
278
+ /**
279
+ * ID used with the in-game `/settitle` command to apply the badge.
280
+ */
281
+ __publicField$4(this, "setTitle");
282
+ /**
283
+ * A description of the effect the badge will have, such as a buff or granting a temporary power.
284
+ *
285
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
286
+ */
287
+ __publicField$4(this, "effect");
288
+ /**
289
+ * A list of requirements for badges that have partial fulfilment steps, such as visiting plaques for history badges, or collecting other badges for meta-badges like accolades.
290
+ */
291
+ __publicField$4(this, "partials");
292
+ /**
293
+ * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.
294
+ */
295
+ __publicField$4(this, "ignoreInTotals");
296
+ this.key = new Key(data.key).value;
297
+ this.type = data.type;
298
+ this.name = new Alternates(data.name);
299
+ this.alignment = data.alignment;
300
+ this.badgeText = new Alternates(data.badgeText ?? []);
301
+ this.acquisition = data.acquisition;
302
+ this.icon = new Alternates(data.icon ?? []);
303
+ this.notes = data.notes;
304
+ this.links = data.links;
305
+ this.mapKey = data.mapKey;
306
+ this.loc = data.loc;
307
+ this.effect = data.effect;
308
+ this.vidiotMapKey = data.vidiotMapKey;
309
+ this.setTitle = data.setTitle;
310
+ this.ignoreInTotals = data.ignoreInTotals ?? false;
311
+ this.partials = data.partials?.map((data2) => {
312
+ if (__privateGet$2(this, _partialsIndex)[data2.key] !== void 0) throw new Error(`Duplicate badge partial key [${data2.key}]`);
313
+ const badge = new BadgePartial(data2);
314
+ __privateGet$2(this, _partialsIndex)[badge.key] = badge;
315
+ return badge;
316
+ });
317
+ }
318
+ getPartial(key) {
319
+ const result = __privateGet$2(this, _partialsIndex)[key];
320
+ if (result === void 0) throw new Error(`Unknown badge partial key [${key}]`);
321
+ return result;
322
+ }
323
+ }
324
+ _partialsIndex = new WeakMap();
325
+
326
+ var __defProp$3 = Object.defineProperty;
327
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
328
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
329
+ class VidiotMapPointOfInterest {
330
+ constructor(data) {
331
+ /**
332
+ * The pixel-space position of the PoI on the map graphic.
333
+ *
334
+ * Screen-space, pixels from top-left `[0, 0]`.
335
+ */
336
+ __publicField$3(this, "pos");
337
+ /**
338
+ * Freeform notes about the PoI.
339
+ *
340
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
341
+ */
342
+ __publicField$3(this, "notes");
343
+ /**
344
+ * If the POI is a zone transfer, the map it transfers to.
345
+ */
346
+ __publicField$3(this, "mapKey");
347
+ /**
348
+ * If the POI is a badge, the badge.
349
+ */
350
+ __publicField$3(this, "badgeKey");
351
+ /**
352
+ * If the POI is a partial for a badge, the partial key.
353
+ */
354
+ __publicField$3(this, "badgePartialKey");
355
+ this.pos = data.pos;
356
+ this.notes = data.notes;
357
+ this.mapKey = data.mapKey;
358
+ this.badgeKey = data.badgeKey;
359
+ this.badgePartialKey = data.badgePartialKey;
360
+ }
361
+ }
362
+
363
+ var __defProp$2 = Object.defineProperty;
364
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
365
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
366
+ class VidiotMap {
367
+ constructor(data) {
368
+ /**
369
+ * URL of the map image.
370
+ */
371
+ __publicField$2(this, "imageUrl");
372
+ /**
373
+ * Name to display for the Vidiot map.
374
+ */
375
+ __publicField$2(this, "name");
376
+ /**
377
+ * List of Points of Interest labelled on the image.
378
+ */
379
+ __publicField$2(this, "pointsOfInterest");
380
+ this.imageUrl = data.imageUrl;
381
+ this.name = data.name;
382
+ this.pointsOfInterest = data.pointsOfInterest?.map((data2) => new VidiotMapPointOfInterest(data2));
383
+ }
384
+ }
385
+
386
+ var __defProp$1 = Object.defineProperty;
387
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
388
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
389
+ class GameMap {
390
+ constructor(data) {
391
+ /**
392
+ * The database key for this map.
393
+ */
394
+ __publicField$1(this, "key");
395
+ /**
396
+ * The name of the map as it appears in-game.
397
+ */
398
+ __publicField$1(this, "name");
399
+ /**
400
+ * List of external links for this Map. Wiki, forums, etc.
401
+ */
402
+ __publicField$1(this, "links");
403
+ /**
404
+ * List of Vidiot Map assets for this map.
405
+ */
406
+ __publicField$1(this, "vidiotMaps");
407
+ this.key = new Key(data.key).value;
408
+ this.name = data.name;
409
+ this.links = data.links;
410
+ this.vidiotMaps = data.vidiotMaps?.map((data2) => new VidiotMap(data2));
411
+ }
412
+ }
413
+
414
+ var __defProp = Object.defineProperty;
415
+ var __typeError$1 = (msg) => {
416
+ throw TypeError(msg);
417
+ };
418
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
419
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
420
+ var __accessCheck$1 = (obj, member, msg) => member.has(obj) || __typeError$1("Cannot " + msg);
421
+ var __privateGet$1 = (obj, member, getter) => (__accessCheck$1(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
422
+ var __privateAdd$1 = (obj, member, value) => member.has(obj) ? __typeError$1("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
423
+ var _archetypeIndex, _mapIndex, _badgeIndex;
424
+ class ServerGroup {
425
+ constructor(data) {
426
+ __privateAdd$1(this, _archetypeIndex, {});
427
+ __privateAdd$1(this, _mapIndex, {});
428
+ __privateAdd$1(this, _badgeIndex, {});
429
+ /**
430
+ * The database key for this server group.
431
+ */
432
+ __publicField(this, "key");
433
+ /**
434
+ * Name of the server group.
435
+ */
436
+ __publicField(this, "name");
437
+ /**
438
+ * Description of the server group.
439
+ *
440
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
441
+ */
442
+ __publicField(this, "description");
443
+ /**
444
+ * Repository where the db content package is maintained.
445
+ */
446
+ __publicField(this, "repository");
447
+ /**
448
+ * List of external links for this Server Group. Wiki, forums, etc.
449
+ */
450
+ __publicField(this, "links");
451
+ /**
452
+ * List of the game server names in this server group.
453
+ * Torchbearer, Excelsior, etc.
454
+ */
455
+ __publicField(this, "servers");
456
+ /**
457
+ * List of archetypes available in this server group.
458
+ */
459
+ __publicField(this, "archetypes");
460
+ /**
461
+ * List of game maps supported by this server group.
462
+ */
463
+ __publicField(this, "maps");
464
+ /**
465
+ * List of badges available on this server group.
466
+ */
467
+ __publicField(this, "badges");
468
+ /**
469
+ * Change log for this data package.
470
+ */
471
+ __publicField(this, "changelog");
472
+ this.key = new Key(data.key).value;
473
+ this.name = data.name;
474
+ this.description = data.description;
475
+ this.repository = data.repository;
476
+ this.links = data.links;
477
+ this.servers = data.servers ?? [];
478
+ this.archetypes = data.archetypes?.map((data2) => {
479
+ if (__privateGet$1(this, _archetypeIndex)[data2.key] !== void 0) throw new Error(`Duplicate archetype key [${data2.key}]`);
480
+ const archetype = new Archetype(data2);
481
+ __privateGet$1(this, _archetypeIndex)[archetype.key] = archetype;
482
+ return archetype;
483
+ }) ?? [];
484
+ this.maps = data.maps?.map((data2) => {
485
+ if (__privateGet$1(this, _mapIndex)[data2.key] !== void 0) throw new Error(`Duplicate map key [${data2.key}]`);
486
+ const map = new GameMap(data2);
487
+ __privateGet$1(this, _mapIndex)[map.key] = map;
488
+ return map;
489
+ }) ?? [];
490
+ this.badges = data.badges?.map((data2) => {
491
+ if (__privateGet$1(this, _badgeIndex)[data2.key] !== void 0) throw new Error(`Duplicate badge key [${data2.key}]`);
492
+ const badge = new Badge(data2);
493
+ __privateGet$1(this, _badgeIndex)[badge.key] = badge;
494
+ return badge;
495
+ }) ?? [];
496
+ this.changelog = data.changelog;
497
+ }
498
+ getArchetype(key) {
499
+ const result = __privateGet$1(this, _archetypeIndex)[key];
500
+ if (result === void 0) throw new Error(`Unknown archetype key [${key}]`);
501
+ return result;
502
+ }
503
+ getMap(key) {
504
+ const result = __privateGet$1(this, _mapIndex)[key];
505
+ if (result === void 0) throw new Error(`Unknown map key [${key}]`);
506
+ return result;
507
+ }
508
+ getBadge(key) {
509
+ const result = __privateGet$1(this, _badgeIndex)[key];
510
+ if (result === void 0) throw new Error(`Unknown badge key [${key}]`);
511
+ return result;
512
+ }
513
+ }
514
+ _archetypeIndex = new WeakMap();
515
+ _mapIndex = new WeakMap();
516
+ _badgeIndex = new WeakMap();
517
+
518
+ var __typeError = (msg) => {
519
+ throw TypeError(msg);
520
+ };
521
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
522
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
523
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
524
+ var _serverGroups;
525
+ class CohContentDatabase {
526
+ constructor() {
527
+ __privateAdd(this, _serverGroups, {});
528
+ }
529
+ /**
530
+ * Load a server group data package into the database.
531
+ * @param data The data to load.
532
+ */
533
+ loadServerGroupData(data) {
534
+ __privateGet(this, _serverGroups)[data.key] = new ServerGroup(data);
535
+ }
536
+ /**
537
+ * Get all the server groups currently loaded in the database.
538
+ */
539
+ listServerGroups() {
540
+ return Object.values(__privateGet(this, _serverGroups));
541
+ }
542
+ /**
543
+ * get a server group by key.
544
+ * @param serverGroupKey The key.
545
+ */
546
+ getServerGroup(serverGroupKey) {
547
+ return __privateGet(this, _serverGroups)[serverGroupKey];
548
+ }
549
+ }
550
+ _serverGroups = new WeakMap();
551
+
552
+ const CHANGELOG = [
553
+ {
554
+ version: "2.0.0",
555
+ date: /* @__PURE__ */ new Date("2025-03-12"),
556
+ description: "* Replaced redundant interfaces with their concrete equivalents.\n* Replaced enums with extensible union types; Server groups with new badge types, enhancement types, etc. can now extend them locally.\n* Removed the `serverGroup` property from entities to simplify the object tree; Server group context will need to be managed separately.\n* Standardized pluralization of some field names (name, icon).\n* Combined `settitle` ids into a single tuple field.\n* Change from GNU to The Unlicense.\n* Removed dependency on lodash. There are now no third-party runtime dependencies.\n* Moved from webpack to rollup for packaging.\n* Add eslint for linting.\n* Add jest for unit tests.\n* Added GitHub Actions for CI.\n"
557
+ }
558
+ ];
559
+
560
+ function createBadgeReference(target) {
561
+ const key = typeof target === "string" ? target : target.key;
562
+ return `[badge:${key}]`;
563
+ }
564
+ function createMapReference(target) {
565
+ const key = typeof target === "string" ? target : target.key;
566
+ return `[map:${key}]`;
567
+ }
568
+
569
+ exports.ALIGNMENT = ALIGNMENT;
570
+ exports.Archetype = Archetype;
571
+ exports.BADGE_PARTIAL_TYPE = BADGE_PARTIAL_TYPE;
572
+ exports.BADGE_TYPE = BADGE_TYPE;
573
+ exports.Badge = Badge;
574
+ exports.BadgePartial = BadgePartial;
575
+ exports.CHANGELOG = CHANGELOG;
576
+ exports.CohContentDatabase = CohContentDatabase;
577
+ exports.ENHANCEMENT_CATEGORY = ENHANCEMENT_CATEGORY;
578
+ exports.GameMap = GameMap;
579
+ exports.Key = Key;
580
+ exports.PLAQUE_TYPE = PLAQUE_TYPE;
581
+ exports.SEX = SEX;
582
+ exports.ServerGroup = ServerGroup;
583
+ exports.VidiotMap = VidiotMap;
584
+ exports.VidiotMapPointOfInterest = VidiotMapPointOfInterest;
585
+ exports.createBadgeReference = createBadgeReference;
586
+ exports.createMapReference = createMapReference;
587
+ //# sourceMappingURL=coh-content-db.js.map